[Ffmpeg-devel] Re: img_convert crashes
    Mohnhaupt, Denis 
    Denis.Mohnhaupt
       
    Wed Aug 23 09:10:33 CEST 2006
    
    
  
Hi,
 
this is the code I used to decode the video, where the error occurs
 
global Variables are
 
AVFormatContext *pFormatCtx;
int             i, videoStream;
AVCodecContext  *pCodecCtx;
AVCodec         *pCodec;
AVFrame         *pFrame; 
AVFrame         *pFrameRGB;
int             numBytes;
int             framecounter;
 
 
 
 
 
void get_next_frame(int *success, unsigned char picture[])
{
    int frameFinished;
    static AVPacket packet;
    int line=0;
    int byte=0;
    int lineInv;
    bool bIsVideo;
    int xbuffer, ybuffer; //these contain the dimensions of the video
frame or the texture, whichever are smaller
 
   while((av_read_frame(pFormatCtx, &packet)>=0) )
    {
        bIsVideo = false;
        // Is this a packet from the video stream?
        if(packet.stream_index==videoStream)
        {
                        bIsVideo = true;
            // Decode video frame
            avcodec_decode_video(pCodecCtx, pFrame, &frameFinished, 
                packet.data, packet.size);
    
            // Did we get a video frame?
            if(frameFinished)
            {
 
 
printf("Debug: attempting to convert image to RGB...\n");
              // Convert the image from its native format to RGB
              img_convert((AVPicture *)pFrameRGB, PIX_FMT_RGB24,
                        (AVPicture*)pFrame, pCodecCtx->pix_fmt,
pCodecCtx->width,
                        pCodecCtx->height);
 
printf("Debug: RGB conversion done...\n");
 
                              
              //copy image linewise to the buffer which is used to
update the texture
              for(line = 0; line < ybuffer; line = line +1)
              {
                lineInv = ybuffer - line - 1; //the picture is
y-inverted, so we have to flip lines
                for(byte = 0; byte < (xbuffer*3); byte++)
                {
                  picture[byte + (lineInv*xbuffer*3)] = (unsigned char)
*(pFrameRGB->data[0]+(line*pFrameRGB->linesize[0])+byte);
                }
              }         
    
        // Free the packet that was allocated by av_read_frame
        av_free_packet(&packet);
        if(frameFinished && bIsVideo)
        {
          framecounter++;
            break; //we got our video frame
        }
    }
    
    *success = frameFinished; 
    return;
}
 
 
 
Thanks for your help.
 
Kind regards,
Denis
    
    
More information about the ffmpeg-devel
mailing list