[Libav-user] mpeg4 decoding only decodes 36395 out of 154959 frames
Alex Cohn
alexcohn at netvision.net.il
Sat May 12 07:51:58 CEST 2012
On May 11, 2012 12:12 PM, "Bob Self" <bobslf at gmail.com> wrote:
>
> I finally found an incomplete example that I was able to get sort-of
working
> with non-deprecated functions. The only error (or warning?) that I get is
> "[mpeg4 @ 0x1367c80] Invalid and inefficient vfw-avi packed B frames
detected"
> once. Other than that the program runs without errors, but there is still
> something that I don't understand.
>
> pFormatCtx->streams[videoStream]->nb_frames says that there are 154,959
frames
> But if I count the decoded frames (frame++), I only get 36,395 frames
> before the loop quits. Why does this happen?
>
nb_frames may be not reliable. How many frames does ffmpeg command decide?
BR,
Alex Cohn
> the program output:
> -------------------------------
>
> [avi @ 0x1361920] Format avi probed with size=2048 and score=100
> [AVI demuxer @ 0x1361e60] use odml:1
> st:1 removing common factor 128 from timebase
> [mpeg4 @ 0x1367c80] Invalid and inefficient vfw-avi packed B frames
detected
> [avi @ 0x1361920] All info found
> Input #0, avi, from 'test.avi':
> Metadata:
> encoder : FairUse Wizard - http://fairusewizard.com
> Duration: 01:47:43.08, start: 0.000000, bitrate: 1815 kb/s
> Stream #0:0, 1, 1001/24000: Video: mpeg4 (Advanced Simple Profile)
> (XVID / 0x44495658), yuv420p, 688x368 [SAR 1:1 DAR 43:23], 1001/24000,
> 23.98 tbr, 23.98 tbn, 23.98 tbc
> Stream #0:1, 21, 3/125: Audio: mp3 (U[0][0][0] / 0x0055), 48000
> Hz, stereo, s16, 128 kb/s
>
>
> the test function:
> ----------------------------
>
> int test(void) {
> const char *inputfile = "test.avi";
> int totalFrames = 0;
> int frameLocation = 0;
> AVFormatContext *pFormatCtx;
> unsigned int i, videoStream;
> AVCodecContext *pCodecCtx;
> AVCodec *pCodec;
> AVFrame *pFrame;
> AVFrame *pFrameYUV;
> int numBytes;
> uint8_t *buffer;
> int status;
> unsigned int codec_version;
>
> av_register_all();
>
> codec_version = avcodec_version();
> // avcodec version: 54.10.100
> printf("avcodec version = %d.%d.%d\n",
> (codec_version&0x00ff0000)>>16, (codec_version&0x0000ff00)>>8,
> codec_version&0x000000ff); // version 52.72.2
>
> av_log_set_level(AV_LOG_DEBUG);
>
> pFormatCtx = avformat_alloc_context();
>
> status = avformat_open_input(&pFormatCtx, inputfile, NULL, NULL);
> if (status != 0) {
> return -1;
> }
>
> status = avformat_find_stream_info(pFormatCtx, NULL);
> if (status<0) {
> return -2;
> }
>
> av_dump_format(pFormatCtx, 0, inputfile, false);
>
> 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 -3;
> }
>
> pCodecCtx = pFormatCtx->streams[videoStream]->codec;
>
> double duration = double(pFormatCtx->duration) / AV_TIME_BASE;
>
> pCodec=avcodec_find_decoder(pCodecCtx->codec_id);
> if(pCodec==NULL) {
> return -4;
> }
>
> if(pCodec->capabilities & CODEC_CAP_TRUNCATED) {
> pCodecCtx->flags|=CODEC_FLAG_TRUNCATED;
> }
>
> if(avcodec_open2(pCodecCtx, pCodec, NULL)<0) {
> return -5;
> }
>
> printf("Using codec: %s\n", pCodec->name);
>
> pFrame = avcodec_alloc_frame();
>
> pFrameYUV=avcodec_alloc_frame();
> if(pFrameYUV==NULL) {
> return -6;
> }
>
> numBytes = avpicture_get_size(PIX_FMT_YUV420P, pCodecCtx->width,
> pCodecCtx->height); // 379776
> buffer = (uint8_t *)av_malloc(numBytes*sizeof(uint8_t));
>
> avpicture_fill((AVPicture *)pFrameYUV, buffer, PIX_FMT_YUV420P,
> pCodecCtx->width, pCodecCtx->height);
>
> totalFrames = pFormatCtx->streams[videoStream]->nb_frames;
> // 154959
> printf("Frames: %d\n", totalFrames);
>
> AVPacket packet;
> int isFrameFinished = 0;
> int pixelScanCount = 0;
>
> printf("video width = %d\n", pCodecCtx->width);
> printf("video height = %d\n", pCodecCtx->height);
>
> int frame = 0;
> int loops = 0;
>
> while (av_read_frame(pFormatCtx, &packet) >= 0) {
> status = av_read_frame(pFormatCtx, &packet);
> if (status<0) {
> break;
> }
>
> loops++;
>
> if (packet.stream_index == videoStream) {
> status = avcodec_decode_video2(pCodecCtx, pFrame,
> &isFrameFinished, &packet);
> if (isFrameFinished) {
> frame++;
>
> if ( (frame%1000) == 0) {
> printf("%d\n", frame);
> }
>
> pixelScanCount = 0;
>
> for (int y = 0; y < pCodecCtx->height; y++) {
> uint8_t *p = pFrame->data[0] + y * pFrame->linesize[0];
>
> for (int x = 0; x < pCodecCtx->width; x++) {
> pixelScanCount++;
> }
> }
> av_free_packet(&packet);
>
> }
> else {
> av_free_packet(&packet);
> }
> }
> }
>
>
> printf("frame = %d\n", frame); // frame = 36395
> printf("loops = %d\n", loops); // loops = 212127
> printf("totalFrames = %d\n", totalFrames); // totalFrames = 154959
>
> delete [] buffer;
> av_free(pFrameYUV);
> av_free(pFrame);
> avcodec_close(pCodecCtx);
> avformat_close_input(&pFormatCtx);
>
> return 0;
> }
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/libav-user
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20120512/f50a2f87/attachment.html>
More information about the Libav-user
mailing list