[Libav-user] Seeking causes the demuxer to skip some packets (after the seek)... why? Bug?
Steve Hart
steve.hart at rtsw.co.uk
Fri Oct 26 12:23:46 CEST 2012
On 25 October 2012 21:10, Michael Bradshaw <mbradshaw at sorensonmedia.com>wrote:
> On Thu, Oct 25, 2012 at 2:02 PM, Michael Bradshaw <
> mbradshaw at sorensonmedia.com> wrote:
> > I've also included
>
> Sorry, I meant to say that should you be interested, the source video file
> can be found at:
> https://docs.google.com/uc?export=download&id=0BxWx_dIBnyRoSnMyTFNGOHR1c2c
>
> The source I'm using, should you also be interested, is (remove the
> 'extern "C"' part to compile as C):
>
> #include <stdio.h>
>
> extern "C"
> {
> #include <libavcodec/avcodec.h>
> #include <libavformat/avformat.h>
> #include <libswresample/swresample.h>
> }
>
> int main(int argc, char** argv)
> {
> AVFrame* frame;
> AVFormatContext* formatContext;
> AVStream* videoStream;
> AVCodecContext* codecContext;
> AVPacket packet;
> int frameFinished;
> int result;
>
> av_register_all();
>
> frame = avcodec_alloc_frame();
> if (!frame)
> {
> printf("Error allocating the frame\n");
> return 1;
> }
>
> formatContext = NULL;
> if (avformat_open_input(&formatContext,
> "C:/Users/mbradshaw/Desktop/b/c/SIMPSONS_D2-CallOfTheSimpsons.m4v", NULL,
> NULL) != 0)
> {
> av_free(frame);
> printf("Error opening the file\n");
> return 1;
> }
>
> if (avformat_find_stream_info(formatContext, NULL) < 0)
> {
> av_free(frame);
> avformat_close_input(&formatContext);
> printf("Error finding the stream info\n");
> return 1;
> }
>
> videoStream = NULL;
> for (unsigned int i = 0; i < formatContext->nb_streams; ++i)
> {
> if (formatContext->streams[i]->codec->codec_type ==
> AVMEDIA_TYPE_VIDEO)
> {
> videoStream = formatContext->streams[i];
> break;
> }
> }
>
> if (videoStream == NULL)
> {
> av_free(frame);
> avformat_close_input(&formatContext);
> printf("Could not find any video stream in the file\n");
> return 1;
> }
>
> codecContext = videoStream->codec;
> codecContext->codec = avcodec_find_decoder(codecContext->codec_id);
> if (codecContext->codec == NULL)
> {
> av_free(frame);
> avformat_close_input(&formatContext);
> printf("Couldn't find a proper decoder\n");
> return 1;
> }
> else if (avcodec_open2(codecContext, codecContext->codec, NULL) != 0)
> {
> av_free(frame);
> avformat_close_input(&formatContext);
> printf("Couldn't open the context with the decoder\n");
> return 1;
> }
>
> av_init_packet(&packet);
> while (av_read_frame(formatContext, &packet) == 0)
> {
> if (packet.stream_index == videoStream->index)
> {
> printf("packet.dts = %d\n", packet.dts);
>
> frameFinished = 0;
> result = avcodec_decode_video2(codecContext, frame,
> &frameFinished, &packet);
>
> if (result >= 0 && frameFinished)
> {
> break;
> av_free_packet(&packet);
> }
> }
>
> av_free_packet(&packet);
> }
>
> avcodec_flush_buffers(codecContext);
> printf("seek result: %d\n",
> av_seek_frame(formatContext, 1, -2000000000,
> AVSEEK_FLAG_BACKWARD | AVSEEK_FLAG_ANY));
>
> while (av_read_frame(formatContext, &packet) == 0)
> {
> if (packet.stream_index == videoStream->index)
> {
> printf("packet.dts = %d\n", packet.dts);
>
> frameFinished = 0;
> result = avcodec_decode_video2(codecContext, frame,
> &frameFinished, &packet);
>
> if (result >= 0 && frameFinished)
> {
> break;
> av_free_packet(&packet);
> }
> }
>
> av_free_packet(&packet);
> }
>
> av_free(frame);
> avcodec_close(codecContext);
> avformat_close_input(&formatContext);
> return 0;
> }
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/libav-user
>
>
I too have seen this behaviour. If the timestamp is negative the seek
ignores
it and always starts at first 0/positive timestamp.
This happens regardless of whether I use -1 or 1
I cannot check audio seeking in my case since I have no audio streams.
I would be very interested to know why this is.
Steve
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20121026/dc78cb3f/attachment.html>
More information about the Libav-user
mailing list