[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