FFMPEG中sws_scale()函数的作用

       如果想將某个PixelFormat转换至另一個PixelFormat,例如,将YUV420P转换換成YUYV422,或是想变换图的大小,都可以使用swscale完成。
其中,PixelFormat 的列表在 libavutil/pixfmt.h 內定义。
      swscale的用法可以參考libswscale/swscale-example.c的sample code。主要function有三個
      sws_getContext() 
      sws_scale() 
      sws_freeContext() 
      其中,我們可以把sws_getContext() 看成初始化函数,把sws_freeContext()看成結束函数。这两个函数分別在起始及結束各執行一次即可。
真正主要的函數,是sws_scale()。
sws_getContext() 的如下
SwsContext *sws_getContext(int srcW, int srcH, enum PixelFormat srcFormat, int dstW, int dstH, enum PixelFormat dstFormat, int flags, SwsFilter *srcFilter, SwsFilter *dstFilter, const double *param)
总共有十个参数,其中,较重要的是前七个; 
前三个参数分別代表 source 的宽、高及PixelFormat; 
四到六个参数分別代表 destination 的宽、高及PixelFormat; 
第七个参数代表要使用那个scale的方法;此參数可用的方法可在 libswscale/swscale.h 內找到。
最后三个参数,如无使用,可以都填上NULL。
        sws_getContext返回值一个 SwsContext struct,我们可以把这个 struct 看成是个 handler,之后的sws_scale和sws_freeContext皆会用到。
以下是一个sws_getContext的简单例子:
       struct SwsContext *img_convert_ctx; 
       img_convert_ctx = sws_getContext(in_width, in_height, PIX_FMT_YUV420P, out_width, out_height, PIX_FMT_YUV420P, SWS_POINT, NULL, NULL, NULL);

        一开始,我们宣告img_convert_ctx 为指向 SwsContext 的一个 pointer;接着,我们将 sws_getContext 的返回值賦予給img_convert_ctx。
       注意sws_getContext的參数;in_width及in_height分別代表 source 的宽及高,out_width及out_height分別代表转换后的宽和高;input 和 output 的 PixelFormat 皆为 YUV420P;使用SWS_POINT的scale方法。
        初始化完成后,接着就要进行主要的 scale 动作;我们通过 sws_scale() 完成。sws_scale() 的宣告如下
        int sws_scale(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[])
总共有七个參数; 
       第一个参数即是由 sws_getContext 所取得的參数。 
       第二个 src 及第六个dst 分別指向input 和 output 的 buffer。 
       第三个 srcStride 及第七个 dstStride 分別指向 input 及 output 的 stride;如果不知道什么是 stride,姑且可以先把它看成是每一列的 byte 数。 
       第四个 srcSliceY,就注释的意思来看,是指第一列要处理的位置。
       第五个srcSliceH指的是 source slice 的高度。

你可能感兴趣的:(FFMPEG资料)