• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            對ffmpeg中的sws_scale的封裝類

            轉載自:http://www.cnblogs.com/acloud/archive/2011/10/29/2228626.html

            直接使用ffmpeg中的sws_scale雖然已經不太復雜,但每次的手動初始化等操作,畢竟不夠方便。我對這部分代碼進行了封裝。平時常見的需要處理的圖像格式無非就是YUV420和RGB24、RGB32等格式,我的封裝僅僅對它們進行。blog好像不能上傳附件,因此我沒法把ffmpeg的scale相關的靜態庫lib(靜態庫攜帶比動態庫方便^_^)等上傳了(發了一份給自己的qq郵箱留作備份了,發現這兒可以上傳附件,全部源碼也上傳一份好了)。

            下面的代碼,可能需要ffmpeg的相關頭文件支持,我對它們進行了一些精簡,只需要一個頭文件"swscale.h"即可。

               

            FFScale.h源碼如下:

            /***************************************************************************//**
            * 版權所有 (C) 

            * 文件名稱: FFScale.h
            * 文件標識: 
            * 內容摘要: 使用ffmpeg中的sws_scale進行圖片格式轉換和resize的封裝類。
            * 其它說明: 本模塊僅僅對常見的圖像格式進行了轉換,更多的圖像格式,請直接使用
            * ffmepg中的sws_scale。
            *
            * 本封裝類使用方法如下:
            * 1、定義一個CFFScale對象;
            * 2、調用該對象的SetAttribut函數,設置輸入輸出圖像的格式和Scale算法;
            * 3、調用該對象的Scale函數,進行Scale操作。
            *
            * 注意:本模塊假定YUV圖像格式采用的連續的內存空間進行的圖像存儲,如
            * 實際情況并非如此,則本模塊不適應這種場合。
            * 當前版本: V1.0
            * 作 者: Cloud
            * 完成日期: 2011-10-28
            ******************************************************************************
            */

            #pragma once


            //Scale算法
            enum SwsAlogrithm
            {
                SWS_SA_FAST_BILINEAR    
            = 0x1,
                SWS_SA_BILINEAR            
            = 0x2,
                SWS_SA_BICUBIC            
            = 0x4,
                SWS_SA_X                
            = 0x8,
                SWS_SA_POINT            
            = 0x10,
                SWS_SA_AREA                
            = 0x20,
                SWS_SA_BICUBLIN            
            = 0x40,
                SWS_SA_GAUSS            
            = 0x80,
                SWS_SA_SINC                
            = 0x100,
                SWS_SA_LANCZOS            
            = 0x200,
                SWS_SA_SPLINE            
            = 0x400,
            }
            ;

            //視頻圖像格式
            enum PicFormat
            {
                SWS_PF_NONE            
            = PIX_FMT_NONE,
                SWS_PF_YUV420P        
            = PIX_FMT_YUV420P,
                SWS_PF_RGB24        
            = PIX_FMT_RGB24,
                SWS_PF_BGR24        
            = PIX_FMT_BGR24,
                SWS_PF_ARGB            
            = PIX_FMT_ARGB,
                SWS_PF_RGBA            
            = PIX_FMT_RGBA,
                SWS_PF_ABGR            
            = PIX_FMT_ABGR,
                SWS_PF_BGRA            
            = PIX_FMT_BGRA,
            }
            ;


            class CFFScale
            {
            public:
                CFFScale(
            void);
                
            ~CFFScale(void);

                
            //設置輸入輸出圖片屬性以及Scale算法
                void SetAttribute(PicFormat srcFormat, PicFormat dstFormat, SwsAlogrithm enAlogrithm = SWS_SA_FAST_BILINEAR);

                
            //Scale
                BOOL Scale(
                    
            byte *pSrc, int nSrcW, int nSrcH, int nSrcPicth,
                    
            byte *pDst, int nDstW, int nDstH, int nDstPicth
                    );

            private:

                
            //初始化
                BOOL Init();

                
            //反初始化
                void DeInit();

                SwsContext
            *    m_pSwsContext;        //SWS對象
                PicFormat m_srcFormat;            //源像素格式
                PicFormat m_dstFormat;            //目標像素格式
                SwsAlogrithm m_enAlogrithm;        //Resize算法

                
            int m_nSrcW, m_nSrcH;            //源圖像寬高
                int m_nSrcPicth;                //源圖像第一行數據的長度
                int m_nSrcSlice[4];                //源圖像各分量數據起始地址偏移
                int m_nSrcStride[4];            //源圖像各分量一行數據的長度

                
            int m_nDstW, m_nDstH;            //目標圖像寬高
                int m_nDstPicth;                //目標圖像第一行數據的長度
                int m_nDstSlice[4];                //目標圖像各分量數據起始地址偏移
                int m_nDstStride[4];            //目標圖像各分量一行數據的長度

            }
            ;


            FFScale.cpp源碼如下:

            #include "StdAfx.h"
            #include 
            "FFScale.h"

            #pragma comment(lib, 
            "Scale/libavutil.lib")
            #pragma comment(lib, 
            "Scale/libswscale.lib")
            #pragma comment(lib, 
            "Scale/libgcc.lib")
            #pragma comment(lib, 
            "Scale/libmingwex.lib")

            //構造
            CFFScale::CFFScale(void)
            {
                m_pSwsContext 
            = NULL;
                m_srcFormat 
            = SWS_PF_NONE;    
                m_dstFormat 
            = SWS_PF_NONE;    
                m_enAlogrithm 
            = SWS_SA_FAST_BILINEAR;

                m_nSrcW 
            = m_nSrcH = 0;            
                m_nSrcPicth 
            = 0;                
                m_nDstW 
            = m_nDstH = 0;
                m_nDstPicth 
            = 0;
                
            for (int i=0; i<4; i++)
                
            {
                    m_nSrcSlice[i] 
            = -1;
                    m_nSrcStride[i] 
            = 0;
                    m_nDstSlice[i] 
            = -1;
                    m_nDstStride[i] 
            = 0
                }

            }


            //析構
            CFFScale::~CFFScale(void)
            {
                DeInit();
            }


            /***************************************************************************//**
            * 函數名稱:    SetAttribute
            * 功能描述:    設置輸入輸出圖片屬性以及Scale算法。
            * 參 數:    srcFormat    >> 源圖像格式;
            * 參 數:    dstFormat    >> 目標圖像格式;
            * 參 數:    enAlogrithm    >> Scale算法;
            * 返回值:    
            * 其它說明:    
            * 修改日期        修改人            修改內容
            * ------------------------------------------------------------------------------
            * 2011-10-28    Cloud         創建
            ******************************************************************************
            */

            void CFFScale::SetAttribute(PicFormat srcFormat, PicFormat dstFormat, SwsAlogrithm enAlogrithm)
            {
                m_srcFormat 
            = srcFormat;
                m_dstFormat 
            = dstFormat;
                m_enAlogrithm 
            = enAlogrithm;
                DeInit();
            }


            /***************************************************************************//**
            * 函數名稱:    Init
            * 功能描述:    初始化。
            * 返回值:    執行成功返回TRUE,否則返回FALSE。
            * 其它說明:    
            * 修改日期        修改人            修改內容
            * ------------------------------------------------------------------------------
            * 2011-10-28    Cloud         創建
            ******************************************************************************
            */

            BOOL CFFScale::Init()
            {
                
            //必須預先設置過輸入輸出格式
                if (SWS_PF_NONE == m_srcFormat || SWS_PF_NONE == m_dstFormat)
                
            {
                    
            return FALSE;
                }


                
            //反初始化
                DeInit();

                
            //創建sws對象
                m_pSwsContext = sws_getContext(
                    m_nSrcW,
                    m_nSrcH,
                    (PixelFormat)m_srcFormat,
                    m_nDstW,
                    m_nDstH,
                    (PixelFormat)m_dstFormat,
                    (
            int)m_enAlogrithm,
                    NULL, 
                    NULL, 
                    NULL);
                
            if (NULL == m_pSwsContext)
                
            {
                    
            return FALSE;
                }


                
            //初始化源Slice和Stride
                if (m_srcFormat == SWS_PF_YUV420P)
                
            {
                    m_nSrcSlice[
            0= 0;
                    m_nSrcSlice[
            1= m_nSrcW * m_nSrcH;
                    m_nSrcSlice[
            2= m_nSrcW * m_nSrcH * 5 / 4;
                    m_nSrcSlice[
            3= -1;

                    m_nSrcStride[
            0= m_nSrcW;
                    m_nSrcStride[
            1= m_nSrcW / 2;
                    m_nSrcStride[
            2= m_nSrcW / 2;
                    m_nSrcStride[
            3= 0;

                }

                
            else
                
            {
                    m_nSrcSlice[
            0= 0;
                    m_nSrcSlice[
            1= -1;
                    m_nSrcSlice[
            2= -1;
                    m_nSrcSlice[
            3= -1;

                    m_nSrcStride[
            0= m_nSrcPicth;
                    m_nSrcStride[
            1= 0;
                    m_nSrcStride[
            2= 0;
                    m_nSrcStride[
            3= 0;
                }


                
            //初始化目標Slice和Stride
                if (m_dstFormat == SWS_PF_YUV420P)
                
            {
                    m_nDstSlice[
            0= 0;
                    m_nDstSlice[
            1= m_nDstW * m_nDstH;
                    m_nDstSlice[
            2= m_nDstW * m_nDstH * 5 / 4;
                    m_nDstSlice[
            3= -1;

                    m_nDstStride[
            0= m_nDstW;
                    m_nDstStride[
            1= m_nDstW / 2;
                    m_nDstStride[
            2= m_nDstW / 2;
                    m_nDstStride[
            3= 0;

                }

                
            else
                
            {
                    m_nDstSlice[
            0= 0;
                    m_nDstSlice[
            1= -1;
                    m_nDstSlice[
            2= -1;
                    m_nDstSlice[
            3= -1;

                    m_nDstStride[
            0= m_nDstPicth;
                    m_nDstStride[
            1= 0;
                    m_nDstStride[
            2= 0;
                    m_nDstStride[
            3= 0;
                }

                
            return TRUE;
            }


            /***************************************************************************//**
            * 函數名稱:    DeInit
            * 功能描述:    反初始化。
            * 返回值:    
            * 其它說明:    
            * 修改日期        修改人            修改內容
            * ------------------------------------------------------------------------------
            * 2011-10-28    Cloud         創建
            ******************************************************************************
            */

            void CFFScale::DeInit()
            {
                
            if (NULL != m_pSwsContext)
                
            {
                    sws_freeContext(m_pSwsContext);
                }

                m_pSwsContext 
            = NULL;
            }


            /***************************************************************************//**
            * 函數名稱:    Scale
            * 功能描述:    Scale
            * 參 數:    pSrc            >> 源圖像內存起始地址;
            * 參 數:    nSrcW            >> 源圖像寬度;
            * 參 數:    nSrcH            >> 源圖像高度;
            * 參 數:    nSrcPicth        >> 源圖像每行數據的長度(YUV格式的該值不被采納);
            * 參 數:    pDst            << 目標圖像內存起始地址;
            * 參 數:    nDstW            >> 目標圖像寬度;
            * 參 數:    nDstH            >> 目標圖像高度;
            * 參 數:    nDstPicth        >> 目標圖像每行數據的長度(YUV格式的該值不被采納);
            * 返回值:    執行成功返回TRUE,否則返回FALSE。
            * 其它說明:    
            * 修改日期        修改人            修改內容
            * ------------------------------------------------------------------------------
            * 2011-10-28    Cloud         創建
            ******************************************************************************
            */

            BOOL CFFScale::Scale(
            byte *pSrc, int nSrcW, int nSrcH, int nSrcPicth, byte *pDst, int nDstW, int nDstH, int nDstPicth)
            {
                
            //如果任何參數發生變化,則需要重新初始化
                if (nSrcW != m_nSrcW || nSrcH != m_nSrcH || m_nSrcPicth != m_nSrcPicth
                    
            || nDstW != m_nDstW || nDstH != m_nDstH || m_nDstPicth != m_nDstPicth)
                
            {
                    m_nSrcW 
            = nSrcW;
                    m_nSrcH 
            = nSrcH;
                    m_nSrcPicth 
            = nSrcPicth;
                    m_nDstW 
            = nDstW;
                    m_nDstH 
            = nDstH;
                    m_nDstPicth 
            = nDstPicth;
                    DeInit();
                }


                
            //如果未能成功初始化,返回失敗
                if (NULL == m_pSwsContext && !Init())
                
            {
                    
            return FALSE;
                }


                
            //真正的Scale操作
                byte *srcSlice[4], *dstSlice[4];
                
            for (int i=0; i<4; i++)
                
            {
                    srcSlice[i] 
            = m_nSrcSlice[i] < 0 ? NULL : (pSrc + m_nSrcSlice[i]);
                    dstSlice[i] 
            = m_nDstSlice[i] < 0 ? NULL : (pDst + m_nDstSlice[i]);
                }

                
            return sws_scale
                    (
                    m_pSwsContext,
                    srcSlice,
                    m_nSrcStride,
                    
            0,
                    m_nSrcH,
                    dstSlice,
                    m_nDstStride
                    ) 
            == m_nSrcH;
            }



            posted on 2013-01-28 18:16 楊粼波 閱讀(2531) 評論(0)  編輯 收藏 引用

            亚洲国产高清精品线久久| 久久精品水蜜桃av综合天堂| 日韩欧美亚洲综合久久影院Ds| 国产精品亚洲综合久久| 日韩精品久久久久久免费| 91亚洲国产成人久久精品| 怡红院日本一道日本久久 | 久久精品国产一区二区电影| 香蕉久久夜色精品国产2020 | 看久久久久久a级毛片| 久久精品无码专区免费青青| 久久精品亚洲精品国产欧美| 久久精品水蜜桃av综合天堂| 亚州日韩精品专区久久久| 99久久精品国产免看国产一区| 无码乱码观看精品久久| 精品久久久久久亚洲| 国产成人久久精品一区二区三区| 国产精品99久久久久久宅男| 精品久久久久久久久午夜福利| 久久久午夜精品| 久久亚洲AV无码西西人体| 久久福利青草精品资源站| 久久综合给合久久狠狠狠97色69| 欧美国产成人久久精品| 免费精品久久久久久中文字幕| 91精品国产色综久久| 69国产成人综合久久精品| 亚洲成色WWW久久网站| 伊人久久无码精品中文字幕| 久久国产精品一区| 久久精品免费网站网| 国产午夜精品久久久久九九电影| 麻豆精品久久精品色综合| 久久精品无码一区二区三区| 精品永久久福利一区二区| 九九精品99久久久香蕉| 精品国产福利久久久| 99久久精品无码一区二区毛片 | 欧洲精品久久久av无码电影| 亚洲精品蜜桃久久久久久|