[FFmpeg-user] SDL and Video device - swscaler - 640x360 - 0x0 is invalid scaling dimension

Chau Pham chaupv79 at hotmail.com
Fri Jul 20 12:59:38 CEST 2012


Hi Everybody, 



Thank Nicolas,

it's old example but I have modified it to suitable ffmpeg version,



c code:

====================================

#include "libavcodec/avcodec.h"

#include "libavformat/avformat.h"

#include "libswscale/swscale.h"



#include <SDL/SDL.h>

#include <SDL/SDL_thread.h>



#include <stdio.h>



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

  

  AVFormatContext *pFormatCtx;

  int             i, videoStream;

  AVCodecContext  *pCodecCtx;

  AVCodec         *pCodec;

  AVFrame         *pFrame; 

  AVPacket        packet;

  int             frameFinished;

  float           aspect_ratio;



  static struct SwsContext *img_convert_ctx;

    

  SDL_Overlay     *bmp;

  SDL_Surface     *screen;

  SDL_Rect        rect;

  SDL_Event       event;

 

  pFormatCtx = NULL;

  pCodecCtx = NULL;

  pFrame = NULL;



  if(argc < 2) {

    fprintf(stderr, "Usage: test <file>\n");

    exit(1);

  }

 //Register all formats and codecs

  av_register_all();

  

  if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) {

    fprintf(stderr, "Could not initialize SDL - %s\n", SDL_GetError());

    exit(1);

  }

  

  // Open video file

  if(avformat_open_input(&pFormatCtx, argv[1], NULL, NULL)!=0)

    return -1; // Couldn't open file

        

  // Retrieve stream information

  if(av_find_stream_info(pFormatCtx)<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

  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

  }

  

  // Open codec

  if(avcodec_open(pCodecCtx, pCodec)<0)

    return -1; // Could not open codec

  

  // Allocate video frame

  pFrame=avcodec_alloc_frame();

  

  // Make a screen to put our video

#ifndef __DARWIN__

        screen = SDL_SetVideoMode(pCodecCtx->width, pCodecCtx->height, 0, 0);

#else

        screen = SDL_SetVideoMode(pCodecCtx->width, pCodecCtx->height, 24, 0);

#endif

  if(!screen) {

    fprintf(stderr, "SDL: could not set video mode - exiting\n");

    exit(1);

  }

  

  // Allocate a place to put our YUV image on that screen

  bmp = SDL_CreateYUVOverlay(pCodecCtx->width,

                 pCodecCtx->height,

                 SDL_YV12_OVERLAY,

                 screen);



  // Read frames and save first five frames to disk

  

  //*****************************

  AVFrame *pFrameRGB = avcodec_alloc_frame();

  uint8_t *buffer;

  int numBytes = avpicture_get_size(PIX_FMT_YUV420P, pCodecCtx->width, pCodecCtx->height);

  buffer = (uint8_t *) av_malloc(numBytes*sizeof(uint8_t));

  avpicture_fill((AVPicture*) pFrameRGB, buffer, PIX_FMT_YUVJ420P, pCodecCtx->width, pCodecCtx->height);

  //***************************



  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 to RGB

    img_convert_ctx = sws_getContext(pFrame->width, pFrame->height, pCodecCtx->pix_fmt, 

        pFrameRGB->width, pFrameRGB->height, PIX_FMT_YUVJ420P, SWS_BICUBIC, NULL, NULL, NULL);



    if(img_convert_ctx == NULL){

        fprintf(stderr, "Cannot initialize the conversion context!\n");

        return -1;

    }



    SDL_LockYUVOverlay(bmp);



    AVPicture pict;

    pict.data[0] = bmp->pixels[0];

    pict.data[1] = bmp->pixels[2];

    pict.data[2] = bmp->pixels[1];



    pict.linesize[0] = bmp->pitches[0];

    pict.linesize[1] = bmp->pitches[2];

    pict.linesize[2] = bmp->pitches[1];



    // Convert the image into YUV format that SDL uses

    //sws_scale(&pict, 
PIX_FMT_YUV420P,(AVPicture *)pFrame, 0, pCodecCtx->pix_fmt, 
pCodecCtx->width, pCodecCtx->height);

    sws_scale(img_convert_ctx, 
pFrame->data, pFrame->linesize, 0, pCodecCtx->height, 
pFrameRGB->data, pFrameRGB->linesize);

    SDL_UnlockYUVOverlay(bmp);

    

    rect.x = 0;

    rect.y = 0;

    rect.w = pCodecCtx->width;

    rect.h = pCodecCtx->height;

    SDL_DisplayYUVOverlay(bmp, &rect);

      

      }

      printf("7-4\n");

    }

      

    // Free the packet that was allocated by av_read_frame

    av_free_packet(&packet);

    SDL_PollEvent(&event);

    switch(event.type) {

    case SDL_QUIT:

      SDL_Quit();

      exit(0);

      break;

    default:

      break;

    }



  }

      

  // Free the YUV frame

  av_free(pFrame);

  

  // Close the codec

  avcodec_close(pCodecCtx);

  

  // Close the video file

  av_close_input_file(pFormatCtx);

  

  return 0;

}



====================================







I created new user and repeated the work, however the error occurs as same as before



[swscaler @ 0x147b480] 727x480 -> 0x0 is invalid scaling dimension





=> I think, the error is in ffmpeg's sws_getContext function in libswscale mudule.



 img_convert_ctx = sws_getContext(pFrame->width, pFrame->height, pCodecCtx->pix_fmt, 

        pFrameRGB->width, pFrameRGB->height, PIX_FMT_YUVJ420P, SWS_BICUBIC, NULL, NULL, NULL);



Thank You,

Chau Pham.

Date: Wed, 18 Jul 2012 10:43:23 +0200
From: nicolas.george at normalesup.org
To: ffmpeg-user at ffmpeg.org
Subject: Re: [FFmpeg-user] SDL and Video device - swscaler - 640x360 - 0x0 is invalid scaling dimension

Le primidi 1er thermidor, an CCXX, Chau Pham a écrit :
> 
> Hi Everybody,
> 
> I compiled and use ffmpeg for tutorial02 in Dranger guideline:
> http://dranger.com/ffmpeg/tutorial02.html
 
This tutorial is grossly obsolete with regard to ffmpeg API. It uses
img_convert, which has been completely removed more than three years ago and
was already deprecated three years before that. It also uses
avcodec_decode_video, that was also deprecated three years ago.
 
> it requires SDL, then I installed SDL and set display: 
> 
> export DISPLAY=:0.0
> 
> but when I play mpeg file:
> 
> [root at CENT6 working]# ./tutorial02 advertisement.mpg
 
This is not related to your problem, but you should know that working like
that with the root account is usually a very bad idea. That is also the
reason you need to set the display.
 
Regards,
 
-- 
  Nicolas George

_______________________________________________
ffmpeg-user mailing list
ffmpeg-user at ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-user 		 	   		  


More information about the ffmpeg-user mailing list