[Libav-user] Memory allocation and avpicture_fill incorrect?
Navin
nkipe at tatapowersed.com
Wed Nov 21 12:42:31 CET 2012
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?
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.
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);
--
Navin
More information about the Libav-user
mailing list