• <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 楊粼波 閱讀(2532) 評論(0)  編輯 收藏 引用

            久久精品国产久精国产思思| 九九久久99综合一区二区| 欧美亚洲国产精品久久| 无码人妻久久一区二区三区 | 精品久久久久久国产| 2020久久精品国产免费| 久久人人爽人人澡人人高潮AV | 99热热久久这里只有精品68| 一本大道久久香蕉成人网| AAA级久久久精品无码片| 久久久国产一区二区三区| 91精品国产高清91久久久久久| 亚洲午夜精品久久久久久浪潮| 99久久精品毛片免费播放| 精品久久久一二三区| 国内精品伊人久久久久影院对白| 久久无码人妻一区二区三区午夜| 色8激情欧美成人久久综合电| 亚洲一本综合久久| 久久狠狠高潮亚洲精品| 久久国语露脸国产精品电影| 伊人久久大香线焦综合四虎| 人妻无码αv中文字幕久久琪琪布| 精品久久久久久无码中文字幕| 一本一道久久精品综合| 97久久超碰国产精品2021| 久久婷婷五月综合国产尤物app| 欧美伊人久久大香线蕉综合| 亚洲欧美精品一区久久中文字幕| 久久成人18免费网站| 国产99久久久国产精品~~牛| 久久99国产精品久久| 国内精品久久国产大陆| 国产韩国精品一区二区三区久久| 久久国产免费观看精品3| 国内精品久久久久影院日本| 久久不见久久见免费视频7| 久久精品中文无码资源站| 久久国产精品99精品国产| 久久国产高清字幕中文| 精品国产青草久久久久福利|