[FFmpeg-trac] #2609(avformat:new): av_seek_frame crashes on .nut file

FFmpeg trac at avcodec.org
Thu May 30 09:51:28 CEST 2013


#2609: av_seek_frame crashes on .nut file
-------------------------------------+------------------------------------
             Reporter:  hxuanyu      |                    Owner:
                 Type:  defect       |                   Status:  new
             Priority:  normal       |                Component:  avformat
              Version:  unspecified  |               Resolution:
             Keywords:               |               Blocked By:
             Blocking:               |  Reproduced by developer:  0
Analyzed by developer:  0            |
-------------------------------------+------------------------------------
Description changed by cehoyos:

Old description:

> I'm building application with ffmpeg 1.1.3
> http://ffmpeg.org/releases/ffmpeg-1.1.3.tar.gz. While opening a .nut
> file, av_seek_frame always crashes. I also wrote a simple test app, it
> also crashes every time.
>
> The file I used is here
> https://dl.dropboxusercontent.com/u/89678527/Akon.nut. And below is the
> test code:
>
> static int open_codec_context(int *stream_idx,
>                               AVFormatContext *fmt_ctx, enum AVMediaType
> type)
> {
>     int ret;
>     AVStream *st;
>     AVCodecContext *dec_ctx = NULL;
>     AVCodec *dec = NULL;
>
>     ret = av_find_best_stream(fmt_ctx, type, -1, -1, NULL, 0);
>     if (ret < 0) {
>         //fprintf(stderr, "Could not find %s stream in input file
> '%s'\n",
>         //        av_get_media_type_string(type), src_filename);
>         return ret;
>     } else {
>         *stream_idx = ret;
>         st = fmt_ctx->streams[*stream_idx];
>
>         /* find decoder for the stream */
>         dec_ctx = st->codec;
>         dec = avcodec_find_decoder(dec_ctx->codec_id);
>         if (!dec) {
>             fprintf(stderr, "Failed to find %s codec\n",
>                     av_get_media_type_string(type));
>             return ret;
>         }
>
>         if ((ret = avcodec_open2(dec_ctx, dec, NULL)) < 0) {
>             fprintf(stderr, "Failed to open %s codec\n",
>                     av_get_media_type_string(type));
>             return ret;
>         }
>     }
>
>     return 0;
> }
>
> int main(int argc, char **argv)
> {
>     int ret;
>
>     if (argc == 1) {
>         printf("no argument provided, exit ************** \n");
>         return 0;
>     }
>     const char *src_filename = argv[1];
>
>     printf("to play %s\n", src_filename);
>
>     avcodec_register_all();
>     av_register_all();
>
>     AVFormatContext *pFormatCtx = NULL;
>     if (avformat_open_input(&pFormatCtx, src_filename, NULL, NULL) < 0) {
>         fprintf(stderr, "Could not open source file %s\n", src_filename);
>         exit(1);
>     }
>
>     if (avformat_find_stream_info(pFormatCtx, NULL) < 0) {
>         fprintf(stderr, "Could not find stream information\n");
>         exit(1);
>     }
>
>     int video_stream_idx = -1, audio_stream_idx = -1;
>     AVStream *video_stream;
>     AVCodecContext *pCodecCtx = NULL;
>     if (open_codec_context(&video_stream_idx, pFormatCtx,
> AVMEDIA_TYPE_VIDEO) >= 0) {
>         video_stream = pFormatCtx->streams[video_stream_idx];
>         pCodecCtx = video_stream->codec;
>         printf("video stream index = %d", video_stream_idx);
>     }
>
>     AVCodec* pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
>     avcodec_open(pCodecCtx, pCodec);
>

>     AVFrame *frame = avcodec_alloc_frame();
>     AVPacket pkt;
>
>     av_init_packet(&pkt);
>     pkt.data = NULL;
>     pkt.size = 0;
>
>     int count = 0;
>     while (av_read_frame(pFormatCtx, &pkt) >= 0) {
>         printf("frame %d\n", count++);
>         if (count == 100) av_seek_frame(pFormatCtx, video_stream_idx, 0,
> 0); // always crashes here.
>     }
> }
>
> I tried to print out some trace, it's pretty much that crash happens in
> read_seek of nutdec.c

New description:

 I'm building application with ffmpeg 1.1.3
 http://ffmpeg.org/releases/ffmpeg-1.1.3.tar.gz. While opening a .nut file,
 av_seek_frame always crashes. I also wrote a simple test app, it also
 crashes every time.

 The file I used is here
 https://dl.dropboxusercontent.com/u/89678527/Akon.nut. And below is the
 test code:
 {{{
 static int open_codec_context(int *stream_idx,
                               AVFormatContext *fmt_ctx, enum AVMediaType
 type)
 {
     int ret;
     AVStream *st;
     AVCodecContext *dec_ctx = NULL;
     AVCodec *dec = NULL;

     ret = av_find_best_stream(fmt_ctx, type, -1, -1, NULL, 0);
     if (ret < 0) {
         //fprintf(stderr, "Could not find %s stream in input file '%s'\n",
         //        av_get_media_type_string(type), src_filename);
         return ret;
     } else {
         *stream_idx = ret;
         st = fmt_ctx->streams[*stream_idx];

         /* find decoder for the stream */
         dec_ctx = st->codec;
         dec = avcodec_find_decoder(dec_ctx->codec_id);
         if (!dec) {
             fprintf(stderr, "Failed to find %s codec\n",
                     av_get_media_type_string(type));
             return ret;
         }

         if ((ret = avcodec_open2(dec_ctx, dec, NULL)) < 0) {
             fprintf(stderr, "Failed to open %s codec\n",
                     av_get_media_type_string(type));
             return ret;
         }
     }

     return 0;
 }

 int main(int argc, char **argv)
 {
     int ret;

     if (argc == 1) {
         printf("no argument provided, exit ************** \n");
         return 0;
     }
     const char *src_filename = argv[1];

     printf("to play %s\n", src_filename);

     avcodec_register_all();
     av_register_all();

     AVFormatContext *pFormatCtx = NULL;
     if (avformat_open_input(&pFormatCtx, src_filename, NULL, NULL) < 0) {
         fprintf(stderr, "Could not open source file %s\n", src_filename);
         exit(1);
     }

     if (avformat_find_stream_info(pFormatCtx, NULL) < 0) {
         fprintf(stderr, "Could not find stream information\n");
         exit(1);
     }

     int video_stream_idx = -1, audio_stream_idx = -1;
     AVStream *video_stream;
     AVCodecContext *pCodecCtx = NULL;
     if (open_codec_context(&video_stream_idx, pFormatCtx,
 AVMEDIA_TYPE_VIDEO) >= 0) {
         video_stream = pFormatCtx->streams[video_stream_idx];
         pCodecCtx = video_stream->codec;
         printf("video stream index = %d", video_stream_idx);
     }

     AVCodec* pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
     avcodec_open(pCodecCtx, pCodec);


     AVFrame *frame = avcodec_alloc_frame();
     AVPacket pkt;

     av_init_packet(&pkt);
     pkt.data = NULL;
     pkt.size = 0;

     int count = 0;
     while (av_read_frame(pFormatCtx, &pkt) >= 0) {
         printf("frame %d\n", count++);
         if (count == 100) av_seek_frame(pFormatCtx, video_stream_idx, 0,
 0); // always crashes here.
     }
 }
 }}}
 I tried to print out some trace, it's pretty much that crash happens in
 read_seek of nutdec.c

--

-- 
Ticket URL: <https://ffmpeg.org/trac/ffmpeg/ticket/2609#comment:2>
FFmpeg <http://ffmpeg.org>
FFmpeg issue tracker


More information about the FFmpeg-trac mailing list