[Libav-user] flushing internal buffers using custom I/O
Hung Nguyen
Hung.Nguyen at ambientdigitalgroup.com
Fri Apr 10 12:00:20 CEST 2015
Hello,
How do you know they’re ‘incomplete-frame’?
From my experience with ffmpeg, these frame can be buffered frame because of thread model of ffmpeg. If it’s is, what you should do is:
1. Count how many frame was buffered.
2. decode and encode these frame again.
Hung Nguyen
hung.nguyen at ambientdigitalgroup.com
> On Apr 10, 2015, at 4:42 PM, Selmeci, Tamás <tselmeci at open-st.eu> wrote:
>
> Hello all!
>
> I'm writing an application which receives MPEG-TS and decodes it, both
> steps are performed with ffmpeg (works great!).
>
> MPEG-TS data is received in a non-conventional way, so I'm using a
> custom I/O context; the callback function in the custom I/O makes sure
> the MPEG-TS data is available and passes it to ffmpeg for processing
> (demultiplexing). This is needed since the MPEG-TS data we receive needs
> some preparation (decryption) before ffmpeg would be able to process it.
> This also works great.
>
> As I've observed ffmpeg works somehow like this (when it comes to
> demultiplexing):
> - requests raw data from I/O context (from my custom I/O);
> - stores raw packets internally;
> - parses raw packets and puts them into a parsed-packet buffer;
> - av_read_frame(...) takes a complete frame from the parsed-packet
> buffer and returns it to the caller;
>
> It definitely happens that ffmpeg stores some incomplete frames in any
> of its buffers, e.g. a video frame almost always occupies more MPEG-TS
> packets and until all packets are received there are incomplete internal
> frames.
>
> In this case if I feed ffmpeg (through its custom I/O) with another
> MPEG-TS stream, which has all the same parameters of the previous one,
> begins with a video keyframe and is in all aspects a perfect MPEG-TS
> stream, the consecutive few av_read_frame(...) calls return with some
> broken frames (the size is not okay) from the old MPEG-TS data (from
> internal buffers). Broken flag is not set, I have to get rid of these
> frames somehow.
>
> I mean:
> - feeding old MPEG-TS;
> - there are some 'incomplete' frames inside;
> - flush (how)?
> - feeding new MPEG-TS;
> - the first av_read_frame(...) returns with the first complete frame
> from the new MPEG-TS;
>
> Is there any way to force ffmpeg flush all of its internal caches so I
> can get rid of these incomplete frames? Reopening the stream is not
> preferred, since quite slow. I've tried many things, all of them failed.
>
> Thanks, regards,
> --
> Selmeci Tamás
> http://www.open-st.eu/
>
>
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/libav-user
More information about the Libav-user
mailing list