织梦CMS - 轻松建站从此开始!

罗索

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

jackyhwei 发布于 2011-12-17 11:01 点击:次 
落鹤生:用ffmpeg的swscale把解码出来的YUV转换成RGB,默认图像是翻转、颠倒过来的,用以下代码可使其恢复正常。
TAG:

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

  1. AVFrame* pFrame;                   // Frame  
  2. AVCodecContext* pContext;          // Codec Context 
  3. int nUsedBytes = avcodec_decode_video(pContext, pFrame,  &nFrame, pSrcBuffer, nSrcLength); 
  4. if(nUsedBytes > 0) 
  5.     AVFrame  out_pic; 
  6.     SwsContext* img_convert_ctx = sws_getContext(pContext->width, pContext->height
  7. , pContext->pix_fmt, nDestW, nDestH,(PixelFormat)PIX_FMT_BGR24,SWS_BICUBIC, NULL, NULL, NULL); 
  8.     if(img_convert_ctx != NULL) 
  9.     { 
  10.         if(avpicture_alloc((AVPicture *)&out_pic, PIX_FMT_RGB24, nDestW, nDestH)>=0) 
  11.         { 
  12.             pFrame->data[0] = pFrame->data[0]+pFrame->linesize[0]*(pContext->height-1); 
  13.             pFrame->data[1] = pFrame->data[1]+pFrame->linesize[0]*pContext->height/4-1; 
  14.        pFrame->data[2] = pFrame->data[2]+pFrame->linesize[0]*pContext->height/4-1; 
  15.             pFrame->linesize[0] *= -1; 
  16.             pFrame->linesize[1] *= -1; 
  17.        pFrame->linesize[2] *= -1; 
  18.        sws_scale(img_convert_ctx, pFrame->data, pFrame->linesize, 0, pContext->height
  19. , out_pic.data, out_pic.linesize); 
  20.             avpicture_free((AVPicture *)&out_pic); 
  21.         } 
  22.         sws_freeContext(img_convert_ctx); 
  23.     } 

 

(rightorwrong)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201112/15492.html]
本文出处:CSDN博客 作者:rightorwrong 原文
顶一下
(5)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容