函数介绍
SwsContext
格式转换的上下文,下面是
初始化函数
struct SwsContext *sws_getContext(int srcW, int srcH, enum AVPixelFormat srcFormat,
int dstW, int dstH, enum AVPixelFormat dstFormat,
int flags, SwsFilter *srcFilter,
SwsFilter *dstFilter, const double *param);
struct SwsContext *sws_getCachedContext(struct SwsContext *context,
int srcW, int srcH, enum AVPixelFormat srcFormat,
int dstW, int dstH, enum AVPixelFormat dstFormat,
int flags, SwsFilter *srcFilter,
SwsFilter *dstFilter, const double *param);
注意
1、区别:第二个会到缓冲区里面去寻找第一个参数传入的SwsContext,若后面的格式参数都一样就返回,不一样则会重新创建,当然如果传入NULL,则和第一个一样重新创建一个新的。建议在单线程单视频解码用第二个,多视频播放用第一个。而且2个函数都会有较大开销,最好只初始化一次。
2、SwsContext 初始化会有一点时间开销。会创建像素格式转化的表。
3、在指定outWidth 时候又一些坑需要注意,参考:SwsContext、sws_scale缩放失败,或者缩放后视频乱码
参数:
flag: 缩放的算法,一般选1 性能高,快速线性插值
srcFilter 过滤器
dstFilter过滤器
param 和flag使用算法相关。传入空,使用默认。
清理函数
void sws_freeContext(struct SwsContext *swsContext);
note:这里是 不是指针的指针,这里可能清理空间,引用计数没有清零,清理的时候注意。
缩放函数sws_scale
int sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[],
const int srcStride[], int srcSliceY, int srcSliceH,
uint8_t *const dst[], const int dstStride[]);
srcSlice 对应具体数据的数组,二维数组,如果是平面存储的则有3个一维数组,如果是rgba交错的,则一个
srcStride 一行的数据大小,srcSlice 可能有三个
srcSliceY 深度,这里用不到
srcSliceH 图像高度
dst[]存储的空间,
dstStride存储的一行的大小