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,










_______________________________________________
Libav-user mailing list
[email protected]
http://ffmpeg.org/mailman/listinfo/libav-user

Reply via email to