[Libav-user] Memory allocation and avpicture_fill incorrect?

Stefano Sabatini stefasab at gmail.com
Thu Nov 22 11:37:10 CET 2012


On date Wednesday 2012-11-21 17:12:31 +0530, Navin wrote:
> I was trying out the updated tutorial01 code of
> ffmpeg:https://github.com/mpenkov/ffmpeg-tutorial
> since the program crashed unexpectedly at sws_scale with an "Access
> violation writing location" error, I was trying to figure out what
> went wrong.
> Two questions:

> 1. I looked into the source for avpicture_get_size and saw a lot of
> code that I couldn't understand. Why are such complex operations
> performed in the function with data and linesize, when the width,
> height and pixel format value multiplication should've easily given
> you the number of bytes?

Because that function is generic, and must work with all the supported
pixel formats.

> 2. In avpicture_fill, what exactly are we filling a pFrameRGB with?
> The video isn't yet decoded, so what is getting filled there?
> Looking through the source just left me confused.

That function is used to fill an AVPicture if you have an already
allocated buffer. Alternatively you can use avpicture_alloc() or
av_image_alloc() to allocate *and* fill the data/linesize arrays.

> I'm suspecting that the memory allocation is being done incorrectly,
> which is why sws_scale is crashing. I've written about this in
> another mailing list thread too, titled "get RGB values from ffmpeg
> frame". But this question is specific to understanding the
> allocation and filling.
> 
> The code I'm talking about from tutorial01:
>   pFrameRGB = avcodec_alloc_frame();
>   if (pFrameRGB==NULL)  return -1;
> 
>   // Determine required buffer size and allocate buffer
>   numBytes = avpicture_get_size(PIX_FMT_RGB24, pCodecCtx->width,
> pCodecCtx->height);
>   buffer = (uint8_t *) av_malloc(numBytes * sizeof(uint8_t));
> 
>   sws_ctx = sws_getContext(pCodecCtx->width, pCodecCtx->height,
> pCodecCtx->pix_fmt, pCodecCtx->width, pCodecCtx->height,
> PIX_FMT_RGB24, SWS_BILINEAR, NULL, NULL, NULL );
> 
>   // Assign appropriate parts of buffer to image planes in
> pFrameRGB. Note that pFrameRGB is an AVFrame, but AVFrame is a
> superset of AVPicture
>   avpicture_fill((AVPicture *)pFrameRGB, buffer, PIX_FMT_RGB24,
> pCodecCtx->width, pCodecCtx->height);

You're not showing the crashing code.
-- 
FFmpeg = Freak and Friendly Mean Perfectionist Elastic Governor


More information about the Libav-user mailing list