sws_scale解出来的RGB图像颠倒问题

本文介绍如何使用FFmpeg库进行视频解码,并通过Swscale实现从YUV到RGB格式的转换过程。详细展示了如何操作AVFrame结构中的data和linesize字段以实现视频帧的上下翻转。
AVFrame* pFrame;                   // Frame 
AVCodecContext* pContext;          // Codec Context
int nUsedBytes = avcodec_decode_video(pContext, pFrame,  &nFrame, pSrcBuffer, nSrcLength);
if(nUsedBytes > 0)
ExpandedBlockStart.gif{
    AVFrame  out_pic;
    SwsContext* img_convert_ctx = sws_getContext(pContext->width, pContext->height, pContext->pix_fmt, nDestW, nDestH,(PixelFormat)PIX_FMT_BGR24,SWS_BICUBIC, NULL, NULL, NULL);
    if(img_convert_ctx != NULL)
ExpandedSubBlockStart.gif    {
        if(avpicture_alloc((AVPicture *)&out_pic, PIX_FMT_RGB24, nDestW, nDestH)>=0)
ExpandedSubBlockStart.gif        {
            pFrame->data[0] = pFrame->data[0]+pFrame->linesize[0]*(pContext->height-1);
            pFrame->data[1] = pFrame->data[1]+pFrame->linesize[0]*pContext->height/4-1;
       pFrame->data[2] = pFrame->data[2]+pFrame->linesize[0]*pContext->height/4-1;
            pFrame->linesize[0] *= -1;
            pFrame->linesize[1] *= -1;
       pFrame->linesize[2] *= -1;
       sws_scale(img_convert_ctx, pFrame->data, pFrame->linesize, 0, pContext->height, out_pic.data, out_pic.linesize);
            avpicture_free((AVPicture *)&out_pic);
        }
        sws_freeContext(img_convert_ctx);
    }
}

AVFrame的data和linesize:

YUV: linesize[0] =  width + padding size(16+16),linesize[1]=linesize[0]/2

        data[0],data[1],data[2]分别代表yuv 

RGB: linesize[0] = width*pixel_size  for RGB
        data[0]为packet rgb


  pFrame->data[0] = pFrame->data[0]+pFrame->linesize[0]*(pContext->height-1);
  pFrame->data[1] = pFrame->data[1]+pFrame->linesize[1]*(pContext->height/2-1);
  pFrame->data[2] = pFrame->data[2]+pFrame->linesize[2]*(pContext->height/2-1); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值