Thanks for the sample code. I have a couple of further questions:
1. If the input data is in a vector of unsigned chars (RGBRGB...), what is the best pixel format to use? 2. The input data is represented by the following method parameter: void* ptInData - I'm not clear as to how the vector is converted to an appropriate type - should it be an array of chars (RGBRGB...) or does the data need to be arranged differently (RRR...GGG...BBB...)? Cheers, Chris ________________________________ From: Hector Alonso <[email protected]> To: "This list is about using libavcodec, libavformat, libavutil, libavdevice and libavfilter." <[email protected]> Sent: Thursday, 14 February 2013 8:38 PM Subject: Re: [Libav-user] How to Convert AV_PIX_FMT_RGB24 to AV_PIX_FMT_YUV420P 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> } /** *Thisfunctionconvertsanimage(uncompressedbuffer)fromaninput *specifiedpixelformattoanoutputspecifiedpixelformatandbuffer. *dependenciesLibAV. *@param[in]eInFormatinputimagePixelformat@seeLibaAVPixelFormatenumtype. *@param[in]iInWidthinputimagewidth *@param[in]iInHeightinputimageheight *@param[in]ptInDatainputimagebuffer *@param[in]eOutFormatoutputimagePixelformat@seeLibaAVPixelFormatenumtype. *@param[in]iOutWidthoutputimagewidth *@param[in]iOutHeightoutputimageheight *@param[out]srcoutputimagebuffer *@returntrueifeverythingwascorrect,falseotherwise) **/ boolConvertImage1(PixelFormateInFormat,intiInWidth,intiInHeight,void*ptInData,PixelFormateOutFormat,intiOutWidth,intiOutHeight,AVPicture*src) { SwsContext*ptImgConvertCtx;// Frame conversion context AVPictureptPictureIn; 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: //------------------ intiRes=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) returntrue; returnfalse; } 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 AVPicturesrc; intiWidth=m_ptCurrentVideoMode->getWidth()/DL_LOW_DEFINITION_DEN; intiHeight=(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 <[email protected]> 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 >[email protected] >http://ffmpeg.org/mailman/listinfo/libav-user > _______________________________________________ Libav-user mailing list [email protected] http://ffmpeg.org/mailman/listinfo/libav-user _______________________________________________ Libav-user mailing list [email protected] http://ffmpeg.org/mailman/listinfo/libav-user
