[Libav-user] How to Convert AV_PIX_FMT_RGB24 to AV_PIX_FMT_YUV420P
Hector Alonso
halonso at vpod.tv
Thu Feb 14 10:38:56 CET 2013
Hi Chris,
You can implement some kind of function like:
// dependencies into C++
extern "C" {
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libavutil/pixdesc.h>
#include <libavutil/samplefmt.h>
#include <libavutil/intreadwrite.h>
}
/**
* This function converts an image (uncompressed buffer) from an input
* specified pixel format to an output specified pixel format and buffer.
* dependencies LibAV.
* @param [in] eInFormat input image Pixel format @see LibaAV
PixelFormat enum type.
* @param [in] iInWidth input image width
* @param [in] iInHeight input image height
* @param [in] ptInData input image buffer
* @param [in] eOutFormat output image Pixel format @see LibaAV
PixelFormat enum type.
* @param [in] iOutWidth output image width
* @param [in] iOutHeight output image height
* @param [out] src output image buffer
* @return true if everything was correct, false otherwise)
**/
bool ConvertImage1(PixelFormat eInFormat, int iInWidth, int iInHeight,
void* ptInData, PixelFormat eOutFormat, int iOutWidth, int iOutHeight,
AVPicture* src)
{
SwsContext* ptImgConvertCtx; // Frame conversion context
AVPicture ptPictureIn;
uint8_t * ptBufferIn;
//Initialize convert context
//------------------
ptImgConvertCtx = sws_getContext(iInWidth, iInHeight, eInFormat,
// (source format)
iOutWidth, iOutHeight,
eOutFormat, // (dest format)
SWS_BICUBIC, NULL, NULL, NULL);
// Init input frame:
//------------------
// Allocate an AVFrame structure
// Determine required buffer size and allocate buffer
// int iNumBytesIn=avpicture_get_size(eInFormat, iInWidth,iInHeight);
ptBufferIn=(uint8_t*)(ptInData);
// Assign appropriate parts of buffer to image planes in pFrameOut
avpicture_fill(&ptPictureIn, ptBufferIn, eInFormat, iInWidth, iInHeight);
// Do conversion:
//------------------
int iRes = sws_scale(ptImgConvertCtx,
ptPictureIn.data, //src
ptPictureIn.linesize,
0,
iInHeight,
src->data,//dst
src->linesize);
//Free memory
sws_freeContext(ptImgConvertCtx);
//Check result:
if (iRes == iOutHeight)
return true;
return false;
}
And use it like this (in this example is used to downscale, but you
can use it for rescaling and or pixel format conversions)
// Downscale
AVPicture src;
int iWidth = m_ptCurrentVideoMode->getWidth() / DL_LOW_DEFINITION_DEN;
int iHeight = (m_ptCurrentVideoMode->getHeight() * iWidth) /
m_ptCurrentVideoMode->getWidth();
iWidth = (floor(iWidth / 2)) * 2;
iHeight = (floor(iHeight / 2)) * 2;
avpicture_alloc(&src, AV_PIX_FMT_UYVY422, iWidth, iHeight);
if(!ConvertImage1(AV_PIX_FMT_UYVY422,
m_ptCurrentVideoMode->getWidth(),
m_ptCurrentVideoMode->getHeight(),
(void *)ptBuffer,
AV_PIX_FMT_UYVY422,
iWidth, iHeight,
&src))
{
avpicture_free(&src);
return;
}
// ... whatever ...
// Free aux frame
avpicture_free(&src);
I hope it helps!
On Thu, Feb 14, 2013 at 10:00 AM, Chris Share <cpsmusic at yahoo.com> wrote:
> Hi,
>
> I'm currently trying to implement file export for the open source
> animation program Pencil2D. This involves converting RGB (0 - 255) image
> data to a suitable movie format.
>
> The examples in the source tree have been very helpful however I still
> have some questions:
>
> The scaling_video.c is close to what I need however the conversion is the
> opposite of what I want. What I'm not clear about is how to change the
> "fill_yuv_image" function to something like "fill_rgb_image". How does the
> RGB data get written into the "uint8_t *data[4]"? Is it written
> consecutively (all R values get written to data[0], all G values to
> data[1], etc.)?
>
> Cheers,
>
> Chris
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/libav-user
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20130214/8f5279c6/attachment.html>
More information about the Libav-user
mailing list