[libav-api] Converting from Webcam/V4l2 capture data format (YUYV or UYVY)

Mark Kenna mark.kenna at sureviewsystems.com
Sun Jun 12 20:04:56 CEST 2011


On 12 Jun 2011, at 18:56, Eric Glaser <eglaser2010 at gmail.com> wrote:

> Hi, I am having some trouble converting from YUYV to RGB format - it
> crashes in sws_scale. I am guessing I am not filling pFrame below
> properly. I use pFrame to fill in the data pointer and strides to pass
> to swscale function.
>
>           AVFrame *pFrameRGB=NULL;
>          AVFrame *pFrame;
>
>
>            pFrame = avcodec_alloc_frame();
>            int size = avpicture_get_size(pMediaInfo->ff_pixFormat,
> ww, hh); //(this is to verify - accurately gets correct size fora
> YUYV frame -
>
>                                   //matches with the number of bytes
> i am passing)
>
>            pFrame->data[0] = pMediaInfo->src;  //src contains the RAW
> image frame read with V4L2 reader function,
>
> //here i am just assigning the pointer to AVFrame variable.
>
>            pFrame->linesize[0]=ww*2;    //src width in bytes
>            pFrame->linesize[1]=0;
>            pFrame->linesize[2]=0;
>            pFrame->linesize[3]=0;
>
>           pFrameRGB = avcodec_alloc_frame();
>
>            int numRGBBytes = ww * hh * 4;   //src width * src height * 4
>            buffer = malloc (sizeof(uint8_t)*numRGBBytes);
>
>
>          if ( avpicture_fill((AVPicture *)pFrameRGB, buffer,
> PIX_FMT_RGB24, ww, hh) <= 0 )  //this essentially assigns allocated
> data pointer to pFrameRGB->data
>          {
>               error = AV_PICFILL;
>               break;
>           }
>
>        if(pOGLContext->img_convert_ctx == NULL)
>        {
>            pOGLContext->img_convert_ctx = sws_getContext(ww, hh,
> pMediaInfo->ff_pixFormat,
>                    ww, hh, PIX_FMT_RGB24, SWS_FAST_BILINEAR, NULL, NULL, NULL);
>            if(pOGLContext->img_convert_ctx == NULL)
>            {
>                error = SWSCALE_INITERR;
>                break;
>            }
>        }
>
>        int ret = sws_scale(pOGLContext->img_convert_ctx,
> (uint8_t**)pFrame->data, pFrame->linesize, 0, hh, pFrameRGB->data,
> pFrameRGB->linesize);
>        if(ret == -1)
>        {
>
>            error = SWSCALE_ERROR;
>            break;
>        }
>
>     If anybody could give me some insight, that would be good. Thanks
> _______________________________________________
> libav-api mailing list
> libav-api at libav.org
> https://lists.libav.org/mailman/listinfo/libav-api

Surely it should be numRgbBytes = width*height*3; because there is no
alpha value in rgb24?

Cheers,
Mark.


More information about the libav-api mailing list