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

罗索实验室

对ffmpeg中的sws_scale的封装类

落鹤生 发布于 2013-10-29 18:30 点击:次 
直接使用ffmpeg中的sws_scale虽然已 经不太复杂,但每次的手动初始化等操作,毕竟不够方便。我对这部分代码进行了封装。平时常见的需要处理的图像格式无非就是YUV420和RGB24、 RGB32等格式,我的封装仅仅对它们进行。blog好像不能上传附件,因此我没法把ffmpeg的scale
TAG:

直接使用ffmpeg中的sws_scale虽然已 经不太复杂,但每次的手动初始化等操作,毕竟不够方便。我对这部分代码进行了封装。平时常见的需要处理的图像格式无非就是YUV420和RGB24、 RGB32等格式,我的封装仅仅对它们进行。blog好像不能上传附件,因此我没法把ffmpeg的scale相关的静态库lib(静态库携带比动态库方 便^_^)等上传了(发了一份给自己的qq邮箱留作备份了,发现这儿可以上传附件,全部源码也上传一份好了)。

下面的代码,可能需要ffmpeg的相关头文件支持,我对它们进行了一些精简,只需要一个头文件"swscale.h"即可。

FFScale.h源码如下:

  1. /***************************************************************************//** 
  2. * 版权所有 (C) 
  3. * 
  4. * 文件名称: FFScale.h 
  5. * 文件标识: 
  6. * 内容摘要: 使用ffmpeg中的sws_scale进行图片格式转换和resize的封装类。 
  7. * 其它说明: 本模块仅仅对常见的图像格式进行了转换,更多的图像格式,请直接使用 
  8. * ffmepg中的sws_scale。 
  9. * 
  10. * 本封装类使用方法如下: 
  11. * 1、定义一个CFFScale对象; 
  12. * 2、调用该对象的SetAttribut函数,设置输入输出图像的格式和Scale算法; 
  13. * 3、调用该对象的Scale函数,进行Scale操作。 
  14. * 
  15. * 注意:本模块假定YUV图像格式采用的连续的内存空间进行的图像存储,如 
  16. * 实际情况并非如此,则本模块不适应这种场合。 
  17. * 当前版本: V1.0 
  18. * 作 者: Cloud 
  19. * 完成日期: 2011-10-28 
  20. *******************************************************************************/ 
  21. #pragma once 
  22.  
  23.  
  24. //Scale算法 
  25. enum SwsAlogrithm 
  26.     SWS_SA_FAST_BILINEAR    = 0x1, 
  27.     SWS_SA_BILINEAR            = 0x2, 
  28.     SWS_SA_BICUBIC            = 0x4, 
  29.     SWS_SA_X                = 0x8, 
  30.     SWS_SA_POINT            = 0x10, 
  31.     SWS_SA_AREA                = 0x20, 
  32.     SWS_SA_BICUBLIN            = 0x40, 
  33.     SWS_SA_GAUSS            = 0x80, 
  34.     SWS_SA_SINC                = 0x100, 
  35.     SWS_SA_LANCZOS            = 0x200, 
  36.     SWS_SA_SPLINE            = 0x400, 
  37. }; 
  38.  
  39. //视频图像格式 
  40. enum PicFormat 
  41.     SWS_PF_NONE            = PIX_FMT_NONE, 
  42.     SWS_PF_YUV420P        = PIX_FMT_YUV420P, 
  43.     SWS_PF_RGB24        = PIX_FMT_RGB24, 
  44.     SWS_PF_BGR24        = PIX_FMT_BGR24, 
  45.     SWS_PF_ARGB            = PIX_FMT_ARGB, 
  46.     SWS_PF_RGBA            = PIX_FMT_RGBA, 
  47.     SWS_PF_ABGR            = PIX_FMT_ABGR, 
  48.     SWS_PF_BGRA            = PIX_FMT_BGRA, 
  49. }; 
  50.  
  51.  
  52. class CFFScale 
  53. public
  54.     CFFScale(void); 
  55.     ~CFFScale(void); 
  56.  
  57.     //设置输入输出图片属性以及Scale算法 
  58.     void SetAttribute(PicFormat srcFormat, PicFormat dstFormat
  59. , SwsAlogrithm enAlogrithm = SWS_SA_FAST_BILINEAR); 
  60.  
  61.     //Scale 
  62.     BOOL Scale( 
  63.         byte *pSrc, int nSrcW, int nSrcH, int nSrcPicth, 
  64.         byte *pDst, int nDstW, int nDstH, int nDstPicth 
  65.         ); 
  66.  
  67. private
  68.  
  69.     //初始化 
  70.     BOOL Init(); 
  71.  
  72.     //反初始化 
  73.     void DeInit(); 
  74.  
  75.     SwsContext*    m_pSwsContext;        //SWS对象 
  76.     PicFormat m_srcFormat;            //源像素格式 
  77.     PicFormat m_dstFormat;            //目标像素格式 
  78.     SwsAlogrithm m_enAlogrithm;        //Resize算法 
  79.  
  80.     int m_nSrcW, m_nSrcH;            //源图像宽高 
  81.     int m_nSrcPicth;                //源图像第一行数据的长度 
  82.     int m_nSrcSlice[4];                //源图像各分量数据起始地址偏移 
  83.     int m_nSrcStride[4];            //源图像各分量一行数据的长度 
  84.  
  85.     int m_nDstW, m_nDstH;            //目标图像宽高 
  86.     int m_nDstPicth;                //目标图像第一行数据的长度 
  87.     int m_nDstSlice[4];                //目标图像各分量数据起始地址偏移 
  88.     int m_nDstStride[4];            //目标图像各分量一行数据的长度 
  89.  
  90. };  

FFScale.cpp源码如下:

  1. #include "StdAfx.h" 
  2. #include "FFScale.h" 
  3.  
  4. #pragma comment(lib, "Scale/libavutil.lib") 
  5. #pragma comment(lib, "Scale/libswscale.lib") 
  6. #pragma comment(lib, "Scale/libgcc.lib") 
  7. #pragma comment(lib, "Scale/libmingwex.lib") 
  8.  
  9. //构造 
  10. CFFScale::CFFScale(void
  11.     m_pSwsContext = NULL; 
  12.     m_srcFormat = SWS_PF_NONE;     
  13.     m_dstFormat = SWS_PF_NONE;     
  14.     m_enAlogrithm = SWS_SA_FAST_BILINEAR; 
  15.  
  16.     m_nSrcW = m_nSrcH = 0;             
  17.     m_nSrcPicth = 0;                 
  18.     m_nDstW = m_nDstH = 0; 
  19.     m_nDstPicth = 0; 
  20.     for (int i=0; i<4; i++) 
  21.     { 
  22.         m_nSrcSlice[i] = -1; 
  23.         m_nSrcStride[i] = 0; 
  24.         m_nDstSlice[i] = -1; 
  25.         m_nDstStride[i] = 0; 
  26.     } 
  27.  
  28. //析构 
  29. CFFScale::~CFFScale(void
  30.     DeInit(); 
  31.  
  32. /****************************//** 
  33. * 函数名称:    SetAttribute 
  34. * 功能描述:    设置输入输出图片属性以及Scale算法。 
  35. * 参 数:    srcFormat    >> 源图像格式; 
  36. * 参 数:    dstFormat    >> 目标图像格式; 
  37. * 参 数:    enAlogrithm    >> Scale算法; 
  38. * 返回值:     
  39. * 其它说明:     
  40. * 修改日期        修改人            修改内容 
  41. * ------------------------------ 
  42. * 2011-10-28    Cloud         创建 
  43. *****************************/ 
  44. void CFFScale::SetAttribute(PicFormat srcFormat, PicFormat dstFormat 
  45. , SwsAlogrithm enAlogrithm) 
  46.     m_srcFormat = srcFormat; 
  47.     m_dstFormat = dstFormat; 
  48.     m_enAlogrithm = enAlogrithm; 
  49.     DeInit(); 
  50.  
  51. /****************//** 
  52. * 函数名称:    Init 
  53. * 功能描述:    初始化。 
  54. * 返回值:    执行成功返回TRUE,否则返回FALSE。 
  55. * 其它说明:     
  56. * 修改日期        修改人            修改内容 
  57. * ------------------ 
  58. * 2011-10-28    Cloud         创建 
  59. ****************/ 
  60. BOOL CFFScale::Init() 
  61.     //必须预先设置过输入输出格式 
  62.     if (SWS_PF_NONE == m_srcFormat || SWS_PF_NONE == m_dstFormat) 
  63.     { 
  64.         return FALSE; 
  65.     } 
  66.  
  67.     //反初始化 
  68.     DeInit(); 
  69.  
  70.     //创建sws对象 
  71.     m_pSwsContext = sws_getContext( 
  72.         m_nSrcW, 
  73.         m_nSrcH, 
  74.         (PixelFormat)m_srcFormat, 
  75.         m_nDstW, 
  76.         m_nDstH, 
  77.         (PixelFormat)m_dstFormat, 
  78.         (int)m_enAlogrithm, 
  79.         NULL, 
  80.         NULL, 
  81.         NULL); 
  82.     if (NULL == m_pSwsContext) 
  83.     { 
  84.         return FALSE; 
  85.     } 
  86.  
  87.     //初始化源Slice和Stride 
  88.     if (m_srcFormat == SWS_PF_YUV420P) 
  89.     { 
  90.         m_nSrcSlice[0] = 0; 
  91.         m_nSrcSlice[1] = m_nSrcW * m_nSrcH; 
  92.         m_nSrcSlice[2] = m_nSrcW * m_nSrcH * 5 / 4; 
  93.         m_nSrcSlice[3] = -1; 
  94.  
  95.         m_nSrcStride[0] = m_nSrcW; 
  96.         m_nSrcStride[1] = m_nSrcW / 2; 
  97.         m_nSrcStride[2] = m_nSrcW / 2; 
  98.         m_nSrcStride[3] = 0; 
  99.  
  100.     } 
  101.     else 
  102.     { 
  103.         m_nSrcSlice[0] = 0; 
  104.         m_nSrcSlice[1] = -1; 
  105.         m_nSrcSlice[2] = -1; 
  106.         m_nSrcSlice[3] = -1; 
  107.  
  108.         m_nSrcStride[0] = m_nSrcPicth; 
  109.         m_nSrcStride[1] = 0; 
  110.         m_nSrcStride[2] = 0; 
  111.         m_nSrcStride[3] = 0; 
  112.     } 
  113.  
  114.     //初始化目标Slice和Stride 
  115.     if (m_dstFormat == SWS_PF_YUV420P) 
  116.     { 
  117.         m_nDstSlice[0] = 0; 
  118.         m_nDstSlice[1] = m_nDstW * m_nDstH; 
  119.         m_nDstSlice[2] = m_nDstW * m_nDstH * 5 / 4; 
  120.         m_nDstSlice[3] = -1; 
  121.  
  122.         m_nDstStride[0] = m_nDstW; 
  123.         m_nDstStride[1] = m_nDstW / 2; 
  124.         m_nDstStride[2] = m_nDstW / 2; 
  125.         m_nDstStride[3] = 0; 
  126.  
  127.     } 
  128.     else 
  129.     { 
  130.         m_nDstSlice[0] = 0; 
  131.         m_nDstSlice[1] = -1; 
  132.         m_nDstSlice[2] = -1; 
  133.         m_nDstSlice[3] = -1; 
  134.  
  135.         m_nDstStride[0] = m_nDstPicth; 
  136.         m_nDstStride[1] = 0; 
  137.         m_nDstStride[2] = 0; 
  138.         m_nDstStride[3] = 0; 
  139.     } 
  140.     return TRUE; 
  141.  
  142. /****************//** 
  143. * 函数名称:    DeInit 
  144. * 功能描述:    反初始化。 
  145. * 返回值:     
  146. * 其它说明:     
  147. * 修改日期        修改人            修改内容 
  148. * ------------------ 
  149. * 2011-10-28    Cloud         创建 
  150. ****************/ 
  151. void CFFScale::DeInit() 
  152.     if (NULL != m_pSwsContext) 
  153.     { 
  154.         sws_freeContext(m_pSwsContext); 
  155.     } 
  156.     m_pSwsContext = NULL; 
  157.  
  158. /****************//** 
  159. * 函数名称:    Scale 
  160. * 功能描述:    Scale 
  161. * 参 数:    pSrc            >> 源图像内存起始地址; 
  162. * 参 数:    nSrcW            >> 源图像宽度; 
  163. * 参 数:    nSrcH            >> 源图像高度; 
  164. * 参 数:    nSrcPicth        >> 源图像每行数据的长度(YUV格式的该值不被采纳); 
  165. * 参 数:    pDst            << 目标图像内存起始地址; 
  166. * 参 数:    nDstW            >> 目标图像宽度; 
  167. * 参 数:    nDstH            >> 目标图像高度; 
  168. * 参 数:    nDstPicth        >> 目标图像每行数据的长度(YUV格式的该值不被采纳); 
  169. * 返回值:    执行成功返回TRUE,否则返回FALSE。 
  170. * 其它说明:     
  171. * 修改日期        修改人            修改内容 
  172. * ------------------ 
  173. * 2011-10-28    Cloud         创建 
  174. ****************/ 
  175. BOOL CFFScale::Scale(byte *pSrc, int nSrcW, int nSrcH, int nSrcPicth
  176. , byte *pDst, int nDstW, int nDstH, int nDstPicth) 
  177.     //如果任何参数发生变化,则需要重新初始化 
  178.     if (nSrcW != m_nSrcW || nSrcH != m_nSrcH || m_nSrcPicth != m_nSrcPicth 
  179.         || nDstW != m_nDstW || nDstH != m_nDstH || m_nDstPicth != m_nDstPicth) 
  180.     { 
  181.         m_nSrcW = nSrcW; 
  182.         m_nSrcH = nSrcH; 
  183.         m_nSrcPicth = nSrcPicth; 
  184.         m_nDstW = nDstW; 
  185.         m_nDstH = nDstH; 
  186.         m_nDstPicth = nDstPicth; 
  187.         DeInit(); 
  188.     } 
  189.  
  190.     //如果未能成功初始化,返回失败 
  191.     if (NULL == m_pSwsContext && !Init()) 
  192.     { 
  193.         return FALSE; 
  194.     } 
  195.  
  196.     //真正的Scale操作 
  197.     byte *srcSlice[4], *dstSlice[4]; 
  198.     for (int i=0; i<4; i++) 
  199.     { 
  200.         srcSlice[i] = m_nSrcSlice[i] < 0 ? NULL : (pSrc + m_nSrcSlice[i]); 
  201.         dstSlice[i] = m_nDstSlice[i] < 0 ? NULL : (pDst + m_nDstSlice[i]); 
  202.     } 
  203.     return sws_scale 
  204.         ( 
  205.         m_pSwsContext, 
  206.         srcSlice, 
  207.         m_nSrcStride, 
  208.         0, 
  209.         m_nSrcH, 
  210.         dstSlice, 
  211.         m_nDstStride 
  212.         ) == m_nSrcH; 

 

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