[FFmpeg-trac] #7152(undetermined:new): avformat_find_stream_info() doesn't work as expected

FFmpeg trac at avcodec.org
Fri Apr 20 23:34:45 EEST 2018


#7152: avformat_find_stream_info() doesn't work as expected
-------------------------------------+-------------------------------------
             Reporter:  whs          |                     Type:  defect
               Status:  new          |                 Priority:  normal
            Component:               |                  Version:
  undetermined                       |  unspecified
             Keywords:               |               Blocked By:
             Blocking:               |  Reproduced by developer:  0
Analyzed by developer:  0            |
-------------------------------------+-------------------------------------
 I downloaded the snapshot of ffmpeg.
 I compiled and installed it.

 Then, I download the example on http://dranger.com/ffmpeg/tutorial01.html
 With some change the code as follow
 {{{
 // tutorial01.c
 // Code based on a tutorial by Martin Bohme (boehme at inb.uni-
 luebeckREMOVETHIS.de)
 // Tested on Gentoo, CVS version 5/01/07 compiled with GCC 4.1.1
 // With updates from https://github.com/chelyaev/ffmpeg-tutorial
 // Updates tested on:
 // LAVC 54.59.100, LAVF 54.29.104, LSWS 2.1.101
 // on GCC 4.7.2 in Debian February 2015

 // A small sample program that shows how to use libavformat and libavcodec
 to
 // read video from a file.
 //
 // Use
 //
 // gcc -o tutorial01 tutorial01.c -lavformat -lavcodec -lswscale -lz
 //
 // to build (assuming libavformat and libavcodec are correctly installed
 // your system).
 //
 // Run using
 //
 // tutorial01 myvideofile.mpg
 //
 // to write the first five frames from "myvideofile.mpg" to disk in PPM
 // format.

 #include <libavcodec/avcodec.h>
 #include <libavformat/avformat.h>
 #include <libswscale/swscale.h>

 #include <stdio.h>

 // compatibility with newer API
 #if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(55,28,1)
 #define av_frame_alloc avcodec_alloc_frame
 #define av_frame_free avcodec_free_frame
 #endif

 void SaveFrame(AVFrame *pFrame, int width, int height, int iFrame) {
   FILE *pFile;
   char szFilename[32];
   int  y;

   // Open file
   sprintf(szFilename, "frame%d.ppm", iFrame);
   pFile=fopen(szFilename, "wb");
   if(pFile==NULL)
     return;

   // Write header
   fprintf(pFile, "P6\n%d %d\n255\n", width, height);

   // Write pixel data
   for(y=0; y<height; y++)
     fwrite(pFrame->data[0]+y*pFrame->linesize[0], 1, width*3, pFile);

   // Close file
   fclose(pFile);
 }

 int main(int argc, char *argv[]) {
   // Initalizing these to NULL prevents segfaults!
   AVFormatContext   *pFormatCtx = NULL;
   int               i, videoStream;
   AVCodecContext    *pCodecCtxOrig = NULL;
   AVCodecContext    *pCodecCtx = NULL;
   AVCodec           *pCodec = NULL;
   AVFrame           *pFrame = NULL;
   AVFrame           *pFrameRGB = NULL;
   AVPacket          packet;
   int               frameFinished;
   int               numBytes;
   uint8_t           *buffer = NULL;
   struct SwsContext *sws_ctx = NULL;

   if(argc < 2) {
     printf("Please provide a movie file\n");
     return -1;
   }
   // Register all formats and codecs
   av_register_all();

   // Open video file
   if(avformat_open_input(&pFormatCtx, argv[1], NULL, NULL)!=0)
     return -1; // Couldn't open file

   // Retrieve stream information
   if(avformat_find_stream_info(pFormatCtx, NULL)<0)
     return -1; // Couldn't find stream information

   // Dump information about file onto standard error
   av_dump_format(pFormatCtx, 0, argv[1], 0);

   // Find the first video stream
   videoStream=-1;
   for(i=0; i<pFormatCtx->nb_streams; i++)
     if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO) {
       videoStream=i;
       break;
     }
   if(videoStream==-1)
     return -1; // Didn't find a video stream

   // Get a pointer to the codec context for the video stream
   pCodecCtxOrig=pFormatCtx->streams[videoStream]->codecpar;
   // Find the decoder for the video stream
   pCodec=avcodec_find_decoder(pCodecCtxOrig->codec_id);
   if(pCodec==NULL) {
     fprintf(stderr, "Unsupported codec!\n");
     return -1; // Codec not found
   }
   // Copy context
   pCodecCtx = avcodec_alloc_context3(pCodec);
   if(avcodec_copy_context(pCodecCtx, pCodecCtxOrig) != 0) {
     fprintf(stderr, "Couldn't copy codec context");
     return -1; // Error copying codec context
   }

   // Open codec
   if(avcodec_open2(pCodecCtx, pCodec, NULL)<0)
     return -1; // Could not open codec

   // Allocate video frame
   pFrame=av_frame_alloc();

   // Allocate an AVFrame structure
   pFrameRGB=av_frame_alloc();
   if(pFrameRGB==NULL)
     return -1;

   // Determine required buffer size and allocate buffer
   numBytes=avpicture_get_size(AV_PIX_FMT_RGB24, pCodecCtx->width,
                               pCodecCtx->height);
   buffer=(uint8_t *)av_malloc(numBytes*sizeof(uint8_t));

   // Assign appropriate parts of buffer to image planes in pFrameRGB
   // Note that pFrameRGB is an AVFrame, but AVFrame is a superset
   // of AVPicture
   avpicture_fill((AVPicture *)pFrameRGB, buffer, AV_PIX_FMT_RGB24,
                  pCodecCtx->width, pCodecCtx->height);

   // initialize SWS context for software scaling
   sws_ctx = sws_getContext(pCodecCtx->width,
                            pCodecCtx->height,
                            pCodecCtx->pix_fmt,
                            pCodecCtx->width,
                            pCodecCtx->height,
                            AV_PIX_FMT_RGB24,
                            SWS_BILINEAR,
                            NULL,
                            NULL,
                            NULL
                            );

   // Read frames and save first five frames to disk
   i=0;
   while(av_read_frame(pFormatCtx, &packet)>=0) {
     // Is this a packet from the video stream?
     if(packet.stream_index==videoStream) {
       // Decode video frame
       avcodec_decode_video2(pCodecCtx, pFrame, &frameFinished, &packet);

       // Did we get a video frame?
       if(frameFinished) {
         // Convert the image from its native format to RGB
         sws_scale(sws_ctx, (uint8_t const * const *)pFrame->data,
                   pFrame->linesize, 0, pCodecCtx->height,
                   pFrameRGB->data, pFrameRGB->linesize);

         // Save the frame to disk
         if(++i<=5)
           SaveFrame(pFrameRGB, pCodecCtx->width, pCodecCtx->height,
                     i);
       }
     }

     // Free the packet that was allocated by av_read_frame
     av_free_packet(&packet);
   }

   // Free the RGB image
   av_free(buffer);
   av_frame_free(&pFrameRGB);

   // Free the YUV frame
   av_frame_free(&pFrame);

   // Close the codecs
   avcodec_close(pCodecCtx);
   avcodec_close(pCodecCtxOrig);

   // Close the video file
   avformat_close_input(&pFormatCtx);

   return 0;
 }
 }}}
 I then compile it with
 {{{
 gcc tutorial01.c -lavformat -lavcodec -lavutil -lswscale
 }}}
 When I run the
 {{{
 ./a.out '/home/whs/Videos/The_Last_Jedi/The_Last_Jedi_t00.mkv'
 }}}
 I got the error

 {{{
 [matroska,webm @ 0xc0aaa0] Could not find codec parameters for stream 4
 (Subtitle: hdmv_pgs_subtitle (pgssub)): unspecified size
 Consider increasing the value for the 'analyzeduration' and 'probesize'
 options
 [matroska,webm @ 0xc0aaa0] Could not find codec parameters for stream 5
 (Subtitle: hdmv_pgs_subtitle (pgssub)): unspecified size
 Consider increasing the value for the 'analyzeduration' and 'probesize'
 options
 [matroska,webm @ 0xc0aaa0] Could not find codec parameters for stream 6
 (Subtitle: hdmv_pgs_subtitle (pgssub)): unspecified size
 Consider increasing the value for the 'analyzeduration' and 'probesize'
 options
 [matroska,webm @ 0xc0aaa0] Could not find codec parameters for stream 7
 (Subtitle: hdmv_pgs_subtitle (pgssub)): unspecified size
 Consider increasing the value for the 'analyzeduration' and 'probesize'
 options
 [matroska,webm @ 0xc0aaa0] Could not find codec parameters for stream 8
 (Subtitle: hdmv_pgs_subtitle (pgssub)): unspecified size
 Consider increasing the value for the 'analyzeduration' and 'probesize'
 options
 [matroska,webm @ 0xc0aaa0] Could not find codec parameters for stream 9
 (Subtitle: hdmv_pgs_subtitle (pgssub)): unspecified size
 Consider increasing the value for the 'analyzeduration' and 'probesize'
 options
 Input #0, matroska,webm, from
 '/home/whs/Videos/The_Last_Jedi/The_Last_Jedi_t00.mkv':
   Metadata:
     title           : The Last Jedi
     encoder         : libmakemkv v1.12.0 (1.3.5/1.4.7) x86_64-linux-gnu
     creation_time   : 2018-04-19 12:36:00
   Duration: 02:31:51.60, start: 0.000000, bitrate: 33756 kb/s
     Chapter #0:0: start 0.000000, end 18.643625
     Metadata:
       title           : Chapter 01
     Chapter #0:1: start 18.643625, end 105.730625
     Metadata:
       title           : Chapter 02
     Chapter #0:2: start 105.730625, end 191.816625
     Metadata:
       title           : Chapter 03
     Chapter #0:3: start 191.816625, end 463.296167
     Metadata:
       title           : Chapter 04
     Chapter #0:4: start 463.296167, end 768.434333
     Metadata:
       title           : Chapter 05
     Chapter #0:5: start 768.434333, end 824.573750
     Metadata:
       title           : Chapter 06
     Chapter #0:6: start 824.573750, end 989.279958
     Metadata:
       title           : Chapter 07
     Chapter #0:7: start 989.279958, end 1199.281417
     Metadata:
       title           : Chapter 08
     Chapter #0:8: start 1199.281417, end 1371.370000
     Metadata:
       title           : Chapter 09
     Chapter #0:9: start 1371.370000, end 1564.980083
     Metadata:
       title           : Chapter 10
     Chapter #0:10: start 1564.980083, end 1642.515875
     Metadata:
       title           : Chapter 11
     Chapter #0:11: start 1642.515875, end 1884.757875
     Metadata:
       title           : Chapter 12
     Chapter #0:12: start 1884.757875, end 1974.681042
     Metadata:
       title           : Chapter 13
     Chapter #0:13: start 1974.681042, end 2127.667208
     Metadata:
       title           : Chapter 14
     Chapter #0:14: start 2127.667208, end 2291.497542
     Metadata:
       title           : Chapter 15
     Chapter #0:15: start 2291.497542, end 2513.427583
     Metadata:
       title           : Chapter 16
     Chapter #0:16: start 2513.427583, end 2669.541875
     Metadata:
       title           : Chapter 17
     Chapter #0:17: start 2669.541875, end 2811.475333
     Metadata:
       title           : Chapter 18
     Chapter #0:18: start 2811.475333, end 3101.932167
     Metadata:
       title           : Chapter 19
     Chapter #0:19: start 3101.932167, end 3230.060167
     Metadata:
       title           : Chapter 20
     Chapter #0:20: start 3230.060167, end 3341.504833
     Metadata:
       title           : Chapter 21
     Chapter #0:21: start 3341.504833, end 3459.581125
     Metadata:
       title           : Chapter 22
     Chapter #0:22: start 3459.581125, end 3556.636417
     Metadata:
       title           : Chapter 23
     Chapter #0:23: start 3556.636417, end 3725.847125
     Metadata:
       title           : Chapter 24
     Chapter #0:24: start 3725.847125, end 3787.700583
     Metadata:
       title           : Chapter 25
     Chapter #0:25: start 3787.700583, end 3941.729458
     Metadata:
       title           : Chapter 26
     Chapter #0:26: start 3941.729458, end 4023.477792
     Metadata:
       title           : Chapter 27
     Chapter #0:27: start 4023.477792, end 4225.721500
     Metadata:
       title           : Chapter 28
     Chapter #0:28: start 4225.721500, end 4410.322583
     Metadata:
       title           : Chapter 29
     Chapter #0:29: start 4410.322583, end 4663.450458
     Metadata:
       title           : Chapter 30
     Chapter #0:30: start 4663.450458, end 4853.056542
     Metadata:
       title           : Chapter 31
     Chapter #0:31: start 4853.056542, end 5057.969583
     Metadata:
       title           : Chapter 32
     Chapter #0:32: start 5057.969583, end 5183.219708
     Metadata:
       title           : Chapter 33
     Chapter #0:33: start 5183.219708, end 5279.524250
     Metadata:
       title           : Chapter 34
     Chapter #0:34: start 5279.524250, end 5449.360583
     Metadata:
       title           : Chapter 35
     Chapter #0:35: start 5449.360583, end 5574.569000
     Metadata:
       title           : Chapter 36
     Chapter #0:36: start 5574.569000, end 5753.706292
     Metadata:
       title           : Chapter 37
     Chapter #0:37: start 5753.706292, end 5830.616458
     Metadata:
       title           : Chapter 38
     Chapter #0:38: start 5830.616458, end 5952.863583
     Metadata:
       title           : Chapter 39
     Chapter #0:39: start 5952.863583, end 6127.663208
     Metadata:
       title           : Chapter 40
     Chapter #0:40: start 6127.663208, end 6303.714083
     Metadata:
       title           : Chapter 41
     Chapter #0:41: start 6303.714083, end 6575.694125
     Metadata:
       title           : Chapter 42
     Chapter #0:42: start 6575.694125, end 6740.608875
     Metadata:
       title           : Chapter 43
     Chapter #0:43: start 6740.608875, end 6964.749458
     Metadata:
       title           : Chapter 44
     Chapter #0:44: start 6964.749458, end 7132.083292
     Metadata:
       title           : Chapter 45
     Chapter #0:45: start 7132.083292, end 7391.133750
     Metadata:
       title           : Chapter 46
     Chapter #0:46: start 7391.133750, end 7599.758833
     Metadata:
       title           : Chapter 47
     Chapter #0:47: start 7599.758833, end 7903.604042
     Metadata:
       title           : Chapter 48
     Chapter #0:48: start 7903.604042, end 8112.104000
     Metadata:
       title           : Chapter 49
     Chapter #0:49: start 8112.104000, end 8416.699958
     Metadata:
       title           : Chapter 50
     Chapter #0:50: start 8416.699958, end 8619.694417
     Metadata:
       title           : Chapter 51
     Chapter #0:51: start 8619.694417, end 9111.602500
     Metadata:
       title           : Chapter 52
     Stream #0:0(eng): Video: h264 (High), yuv420p, 1920x1080 [SAR 1:1 DAR
 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc
     Metadata:
       BPS-eng         : 30705362
       DURATION-eng    : 02:31:51.602500000
       NUMBER_OF_FRAMES-eng: 218460
       NUMBER_OF_BYTES-eng: 34971880054
       SOURCE_ID-eng   : 001011
       _STATISTICS_WRITING_APP-eng: MakeMKV v1.12.0 linux(x64-release)
       _STATISTICS_WRITING_DATE_UTC-eng: 2018-04-19 12:36:00
       _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
 SOURCE_ID
     Stream #0:1(eng): Audio: dts (DTS), 48000 Hz, 5.1(side), fltp, 1536
 kb/s (default)
     Metadata:
       title           : Surround 5.1
       BPS-eng         : 1509000
       DURATION-eng    : 02:31:51.616000000
       NUMBER_OF_FRAMES-eng: 854214
       NUMBER_OF_BYTES-eng: 1718678568
       SOURCE_ID-eng   : 001100
       _STATISTICS_WRITING_APP-eng: MakeMKV v1.12.0 linux(x64-release)
       _STATISTICS_WRITING_DATE_UTC-eng: 2018-04-19 12:36:00
       _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
 SOURCE_ID
     Stream #0:2(fra): Audio: ac3, 48000 Hz, 5.1(side), fltp, 640 kb/s
     Metadata:
       title           : Surround 5.1
       BPS-eng         : 640000
       DURATION-eng    : 02:31:51.616000000
       NUMBER_OF_FRAMES-eng: 284738
       NUMBER_OF_BYTES-eng: 728929280
       SOURCE_ID-eng   : 001102
       _STATISTICS_WRITING_APP-eng: MakeMKV v1.12.0 linux(x64-release)
       _STATISTICS_WRITING_DATE_UTC-eng: 2018-04-19 12:36:00
       _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
 SOURCE_ID
     Stream #0:3(spa): Audio: ac3, 48000 Hz, 5.1(side), fltp, 640 kb/s
     Metadata:
       title           : Surround 5.1
       BPS-eng         : 640000
       DURATION-eng    : 02:31:51.616000000
       NUMBER_OF_FRAMES-eng: 284738
       NUMBER_OF_BYTES-eng: 728929280
       SOURCE_ID-eng   : 001103
       _STATISTICS_WRITING_APP-eng: MakeMKV v1.12.0 linux(x64-release)
       _STATISTICS_WRITING_DATE_UTC-eng: 2018-04-19 12:36:00
       _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
 SOURCE_ID
     Stream #0:4(eng): Subtitle: hdmv_pgs_subtitle
     Metadata:
       BPS-eng         : 31027
       DURATION-eng    : 02:23:23.031937500
       NUMBER_OF_FRAMES-eng: 3796
       NUMBER_OF_BYTES-eng: 33366586
       SOURCE_ID-eng   : 001200
       _STATISTICS_WRITING_APP-eng: MakeMKV v1.12.0 linux(x64-release)
       _STATISTICS_WRITING_DATE_UTC-eng: 2018-04-19 12:36:00
       _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
 SOURCE_ID
     Stream #0:5(fra): Subtitle: hdmv_pgs_subtitle
     Metadata:
       BPS-eng         : 25846
       DURATION-eng    : 02:25:12.266062500
       NUMBER_OF_FRAMES-eng: 3416
       NUMBER_OF_BYTES-eng: 28148178
       SOURCE_ID-eng   : 001201
       _STATISTICS_WRITING_APP-eng: MakeMKV v1.12.0 linux(x64-release)
       _STATISTICS_WRITING_DATE_UTC-eng: 2018-04-19 12:36:00
       _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
 SOURCE_ID
     Stream #0:6(spa): Subtitle: hdmv_pgs_subtitle
     Metadata:
       BPS-eng         : 25710
       DURATION-eng    : 02:22:40.572854166
       NUMBER_OF_FRAMES-eng: 3182
       NUMBER_OF_BYTES-eng: 27511663
       SOURCE_ID-eng   : 001202
       _STATISTICS_WRITING_APP-eng: MakeMKV v1.12.0 linux(x64-release)
       _STATISTICS_WRITING_DATE_UTC-eng: 2018-04-19 12:36:00
       _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
 SOURCE_ID
     Stream #0:7(eng): Subtitle: hdmv_pgs_subtitle
     Metadata:
       BPS-eng         : 70591
       DURATION-eng    : 02:24:13.207062500
       NUMBER_OF_FRAMES-eng: 4798
       NUMBER_OF_BYTES-eng: 76355021
       SOURCE_ID-eng   : 001203
       _STATISTICS_WRITING_APP-eng: MakeMKV v1.12.0 linux(x64-release)
       _STATISTICS_WRITING_DATE_UTC-eng: 2018-04-19 12:36:00
       _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
 SOURCE_ID
     Stream #0:8(fra): Subtitle: hdmv_pgs_subtitle
     Metadata:
       BPS-eng         : 58091
       DURATION-eng    : 02:24:11.121645833
       NUMBER_OF_FRAMES-eng: 4758
       NUMBER_OF_BYTES-eng: 62819211
       SOURCE_ID-eng   : 001204
       _STATISTICS_WRITING_APP-eng: MakeMKV v1.12.0 linux(x64-release)
       _STATISTICS_WRITING_DATE_UTC-eng: 2018-04-19 12:36:00
       _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
 SOURCE_ID
     Stream #0:9(spa): Subtitle: hdmv_pgs_subtitle
     Metadata:
       BPS-eng         : 59683
       DURATION-eng    : 02:24:11.121645833
       NUMBER_OF_FRAMES-eng: 4758
       NUMBER_OF_BYTES-eng: 64541222
       SOURCE_ID-eng   : 001205
       _STATISTICS_WRITING_APP-eng: MakeMKV v1.12.0 linux(x64-release)
       _STATISTICS_WRITING_DATE_UTC-eng: 2018-04-19 12:36:00
       _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
 SOURCE_ID
     Stream #0:10(fra): Subtitle: hdmv_pgs_subtitle, 1920x1080
     Metadata:
       BPS-eng         : 252
       DURATION-eng    : 02:25:22.401187500
       NUMBER_OF_FRAMES-eng: 44
       NUMBER_OF_BYTES-eng: 275272
       SOURCE_ID-eng   : 001206
       _STATISTICS_WRITING_APP-eng: MakeMKV v1.12.0 linux(x64-release)
       _STATISTICS_WRITING_DATE_UTC-eng: 2018-04-19 12:36:00
       _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
 SOURCE_ID
 Segmentation fault (core dumped)
 }}}
 It appear that the
 {{{
 pFormatCtx->streams[0]->codec->codec_id
 }}}
 equals to
 {{{
 0
 }}}
 and
 {{{
 pFormatCtx->streams[0]->codecpar
 }}}
 is
 {{{
 NULL
 }}}
 but according to the header file of libavformat
 https://github.com/FFmpeg/FFmpeg/blob/master/libavformat/avformat.h#L1002

 {{{
 avformat_find_stream_info()
 }}}
 should fill

 {{{
 AVCodecParameters *codecpar;
 }}}

 during demuxing

--
Ticket URL: <https://trac.ffmpeg.org/ticket/7152>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker


More information about the FFmpeg-trac mailing list