[Live-devel] FramedFilter Performance & Questions
Julian Lamberty
julian.lamberty at mytum.de
Wed Jun 27 04:01:54 PDT 2007
> No. Assuming that your "afterGettingFrame()" function was passed as
> a parameter to "getNextFrame()", then it will be called by
> "FramedSource::afterGetting()" (which your "doGetNextFrame()"
> implementation should have called once it completed delivery of
> incoming data).
>
So is my code correct? If the frame is not completely decodable, I call
getNextFrame() again (on MPEG1or2VideoRTPSource). As I said, sometimes
(irregular) there are ~10 to 20ms delay between consecutive calls of
afterGettingFrame(). Sometimes the afterGettingFrame() function is
called twice even if the first one has not come to an end. How can that
be? Could you please have a look at the code? Thank you very much!
void Transcoder::doGetNextFrame()
{
fInputSource->getNextFrame(inbuf, INBUF_SIZE, afterGettingFrame,
this, handleClosure, this);
}
void Transcoder::afterGettingFrame(void* clientData, unsigned
numBytesRead, unsigned numTruncatedBytes, struct timeval
presentationTime, unsigned durationInMicroseconds)
{
Transcoder* transcoder = (Transcoder*)clientData;
transcoder->afterGettingFrame1(numBytesRead, numTruncatedBytes,
presentationTime, durationInMicroseconds);
}
void Transcoder::afterGettingFrame1(unsigned numBytesRead, unsigned
numTruncatedBytes, struct timeval presentationTime, unsigned
durationInMicroseconds)
{
//Decoding
dec_bytes = avcodec_decode_video(dec_codec_ctx, dec_frame,
&got_frame, inbuf, size); //decoding inbuf (data chunks) to dec_frame
if(got_frame) //decoded one complete frame
{
//Encoding
gettimeofday(&begin_encoding_frame, NULL);
enc_bytes = avcodec_encode_video(enc_codec_ctx, outbuf,
fMaxSize, dec_frame); //encoding dec_frame to outbuf
if(enc_bytes > fMaxSize) //more bytes encoded than framer can handle
{
fFrameSize = fMaxSize;
fNumTruncatedBytes = enc_bytes - fMaxSize;
}
else
{
fFrameSize = enc_bytes;
fNumTruncatedBytes = 0;
}
//Delivering
memcpy(fTo, outbuf, fFrameSize); //copy outbuf to fTo for framer
fPresentationTime = begin_encoding_frame;
fDurationInMicroseconds = durationInMicroseconds; //just pass
through durationInMicroseconds
frame_ready = true; //frame ready for delivery
}
if(!frame_ready) //get more data
{
fInputSource->getNextFrame(inbuf, INBUF_SIZE, afterGettingFrame,
this, handleClosure, this); //*problems*
}
else //deliver data and return
{
frame_ready = false;
afterGetting(this);
}
}
After that I have the MPEG4VideoStreamDiscreteFramer (without that,
Transcoder::doGetNextFrame() isn't even called... why is that btw?) and
an MPEG4ESVideoRTPSink. The streaming actually works, but I temporarily
exceed 40ms to transcode one frame.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 5198 bytes
Desc: S/MIME Cryptographic Signature
Url : http://lists.live555.com/pipermail/live-devel/attachments/20070627/4db65092/attachment-0001.bin
More information about the live-devel
mailing list