[Libav-user] Newbie help with C Library and error message while reading video

David martin vilanew at gmail.com
Tue Jan 10 14:07:04 CET 2012


Hi,
I'm trying to build a basic program to read in  a video and display it. 
So far i'm blocked in the reading part. Here is the code and at the end 
you will find the program output

/*
  * streamvideo.c
  *
  *  Created on: Jan 6, 2012
  *      Author:
  */


#include <stdlib.h>
#include <stdio.h>
#include <inttypes.h>
#include <stdio.h>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <SFML/Graphics/RenderWindow.h>
#include <SFML/Audio.h>
#include <SFML/Graphics.h>

#define INBUF_SIZE 512



int main( int argc, char* argv[] )
{

	sfWindowSettings Settings = {24, 8, 0};
	     sfVideoMode Mode = {800, 600, 32};
	     sfRenderWindow* App;
	     sfImage* Image;
	     sfSprite* Sprite;
	     sfFont* Font;
	     sfString* Text;
	     sfMusic* Music;
	     sfEvent Event;

     AVFormatContext *pFormatCtx = NULL;
     AVCodecContext *pCodecCtx = NULL;
     AVCodec *pCodec = NULL;
     AVPacket        packet ;

     AVFrame         *pFrame;
     AVFrame         *pFrameYUV;

     int             iFrameSize;
     struct SwsContext *img_convert_ctx;
     int frameCount=0;
     int             frameFinished;
     int i, numBytes;
     uint8_t *buffer;

     //char* input_filename = "rtsp://wm-live.sr.se/SR-P3-High/";
     char* input_filename = "video.mpeg";

     // Initialize the library by registering all file formats and codecs so
     // they can be used automatically.
     av_register_all();
     avcodec_register_all();
     //avformat_network_init();

     printf("Registered file formats and codecs\n");

     /*
      * Getting ready to read the input.
      */
     // Open the video file. The last three arguments to open() are 
fileformat,
     // buffer size, and format options, we let libavformat to select these.

     printf("Input name: %s\n", input_filename);

     if(avformat_open_input(&pFormatCtx, input_filename,NULL,NULL) != 0)
     {
         fprintf(stderr, "could not open input: %s!\n", input_filename);
         return -1;
     }

     printf("opened input\n");


         // Get stream information and dump it
         if (avformat_find_stream_info(pFormatCtx,NULL) <0)
         {
         		fprintf(stderr, "could not find stream information\n");
             return -1;
         }


     av_dump_format(pFormatCtx, 0, input_filename, 0 );

     printf("dump format done\n");

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

     // Get a pointer to the codec context for the video stream
     pCodecCtx=pFormatCtx->streams[videoStream]->codec;

      // Find the decoder for the video stream
    pCodec=avcodec_find_decoder(pCodecCtx->codec_id);
     if(pCodec==NULL) {
       fprintf(stderr, "Unsupported codec!\n");
       return -1; // Codec not found
     }
CodecCtx->height);
     int height = pCodecCtx->height;
     int width = pCodecCtx->width;


     printf("video width: %d\n", pCodecCtx->width);
     printf("video height: %d\n", pCodecCtx->height);

     iFrameSize = pCodecCtx->width * pCodecCtx->height * 3;

     pCodecCtx = avcodec_alloc_context3(pCodec);
   //     if(pCodec->capabilities & CODEC_CAP_TRUNCATED) 
pCodecCtx->flags|=CODEC_FLAG_TRUNCATED;


     printf("Frame size %d\n",iFrameSize);


     // Open codec

       if(avcodec_open2(pCodecCtx, pCodec,NULL)<0)
       {
       printf("Could not open Codec");
       return -1; // Could not open codec
       }
       numBytes=avpicture_get_size(PIX_FMT_YUV420P, width, height);
       //numBytes=avpicture_get_size(PIX_FMT_RGB24, pCodecCtx->width, 
pCodecCtx->height);
       buffer=(uint8_t *)av_malloc(numBytes*sizeof(uint8_t));

        avpicture_fill((AVPicture *)pFrameYUV, buffer, PIX_FMT_YUV420P, 
pCodecCtx->width, pCodecCtx->height);



//One more thing left to do: Allocate a video frame to store the decoded 
images in:


       // Allocate video frame
       pFrame=avcodec_alloc_frame();

       // Allocate an AVFrame structure
       pFrameYUV=avcodec_alloc_frame();
       if(pFrameYUV==NULL)
         return -1;


       // Determine required buffer size and allocate buffer

            numBytes=avpicture_get_size(PIX_FMT_YUV420P, 
pCodecCtx->width, pCodecCtx->height);
              buffer=(uint8_t *)av_malloc(numBytes*sizeof(uint8_t));

              avpicture_fill((AVPicture *)pFrameYUV, buffer, 
PIX_FMT_YUV420P,
                            pCodecCtx->width, pCodecCtx->height);

             // Data = new sf::Uint8[pCodecCtx->width * 
pCodecCtx->height * 4];

              printf("Done\n");

         //end video initialization


/****************
* Display video *
*****************/

              i=0;
              int len =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.data, packet.size);

                  //len = avcodec_decode_video2(pCodecCtx, pFrame, 
pFrameRGB, &packet);
                  len = avcodec_decode_video2(pCodecCtx, pFrame, 
&frameFinished, &packet);
                  // Convert the image from its native format to RGB
                  avpicture_fill((AVPicture *)pFrameYUV, buffer, 
PIX_FMT_YUV420P,
                                            pCodecCtx->width, 
pCodecCtx->height);
                  printf("len:%d\n",len);
                  //sleep(1);
                              if (len < 0) {
                                  fprintf(stderr, "Error while decoding\n");
                              }
                }
              }



     return 0;
}

#Program execution

 > ./videostreaming
Registered file formats and codecs
Input name: video.mpeg
opened input
[mpeg @ 0x9972040] max_analyze_duration 5000000 reached at 5000000
Input #0, mpeg, from 'video.mpeg':
   Duration: 00:02:15.23, start: 1.000000, bitrate: 632 kb/s
     Stream #0:0[0x1e0]: Video: mpeg1video, yuv420p, 640x360 [SAR 1:1 
DAR 16:9], 104857 kb/s, 25 fps, 25 tbr, 90k tbn, 25 tbc
     Stream #0:1[0x1c0]: Audio: mp2, 44100 Hz, stereo, s16, 128 kb/s
dump format done
Found a video stream
video width: 640
video height: 360
Frame size 691200
[IMGUTILS @ 0xbfd09a24] Picture size 0x0 is invalid
[IMGUTILS @ 0xbfd09a14] Picture size 0x0 is invalid
[IMGUTILS @ 0xbfd09a24] Picture size 0x0 is invalid
Done
len:3508
[mpeg1video @ 0x9cc45e0] Warning MVs not available
......

What is the Picture size message about ?? can you help me ?

thanks,












More information about the Libav-user mailing list