FFmpeg sws_scale分析1

FFmpeg里面的sws_scale库可以在一个函数里面同时实现:1.图像色彩空间转换;2.分辨率缩放;3.前后图像滤波处理。

其核心函数主要有三个:

// 初始化sws_scale

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);

参数int srcW, int srcH, enum AVPixelFormat srcFormat定义输入图像信息(寬、高、颜色空间)

参数int dstW, int dstH, enum AVPixelFormat dstFormat定义输出图像信息。

参数int flags选择缩放算法(只有当输入输出图像大小不同时有效)

参数SwsFilter *srcFilter, SwsFilter *dstFilter分别定义输入/输出图像滤波器信息,如果不做前后图像滤波,输入NULL

参数const double *param定义特定缩放算法需要的参数(?),默认为NULL

函数返回SwsContext结构体,定义了基本变换信息。

如果是对一个序列的所有帧做相同的处理,函数sws_getContext只需要调用一次就可以了。

sws_getContext(w, h, YV12, w, h, NV12, 0, NULL, NULL, NULL);      // YV12->NV12 色彩空间转换

sws_getContext(w, h, YV12, w/2, h/2, YV12, 0, NULL, NULL, NULL);  // YV12图像缩小到原图1/4

sws_getContext(w, h, YV12, 2w, 2h, YN12, 0, NULL, NULL, NULL);    // YV12图像放大到原图4倍,并转换为NV12结构

// 做转换

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[]);

参数struct SwsContext *c,为上面sws_getContext函数返回值;

参数const uint8_t *const srcSlice[], const int srcStride[]定义输入图像信息(当前处理区域的每个通道数据指针,每个通道行字节数)

stride定义下一行的起始位置。stride和width不一定相同,这是因为:

1.由于数据帧存储的对齐,有可能会向每行后面增加一些填充字节这样 stride = width + N;

2.packet色彩空间下,每个像素几个通道数据混合在一起,例如RGB24,每个像素3字节连续存放,因此下一行的位置需要跳过3*width字节。

srcSlice和srcStride的维数相同,由srcFormat值来。

csp       维数        宽width      跨度stride      高

YUV420     3        w, w/2, w/2    s, s/2, s/2   h, h/2, h/2

YUYV       1        w, w/2, w/2   2s, 0, 0       h, h, h

NV12       2        w, w/2, w/2    s, s, 0       h, h/2

RGB24      1        w, w,   w     3s, 0, 0       h, 0, 0

参数int srcSliceY, int srcSliceH,定义在输入图像上处理区域,srcSliceY是起始位置,srcSliceH是处理多少行。如果srcSliceY=0,srcSliceH=height,表示一次性处理完整个图像。

这种设置是为了多线程并行,例如可以创建两个线程,第一个线程处理 [0, h/2-1]行,第二个线程处理 [h/2, h-1]行。并行处理加快速度。

参数uint8_t *const dst[], const int dstStride[]定义输出图像信息(输出的每个通道数据指针,每个通道行字节数)

// 释放sws_scale

void sws_freeContext(struct SwsContext *swsContext);

时间: 2024-08-06 21:44:10

FFmpeg sws_scale分析1的相关文章

FFmpeg sws_scale分析2

在网上没有看到有关SwsFilter的讨论,看FFMpeg代码,总结下面的分析结果. sws_scale前后图像滤波都定义为归一化的2维或者1维图像卷积处理.每个滤波器有四个分量 typedef struct SwsFilter { SwsVector *lumH; // 亮度水平处理 SwsVector *lumV; // 亮度垂直处理 SwsVector *chrH; // 色度水平处理 SwsVector *chrV; // 色度垂直处理 } SwsFilter; 一般都是2维水平和垂直按

FFmpeg源代码分析:libswscale的sws_scale()

本文继续上一篇文章<FFmpeg源代码分析:sws_getContext()>的内容,简单分析FFmpeg的图像处理(缩放,YUV/RGB格式转换)类库libswsscale中的sws_scale()函数.libswscale是一个主要用于处理图片像素数据的类库.可以完成图片像素格式的转换,图片的拉伸等工作.有关libswscale的使用可以参考文章:<最简单的基于FFmpeg的libswscale的示例(YUV转RGB)> 该类库常用的函数数量很少,一般情况下就3个: sws_g

FFmpeg源代码分析:结构体成员管理系统-AVOption

本文继续上篇文章<FFmpeg源代码分析:结构体成员管理系统-AVClass>中的内容,记录FFmpeg中和AVOption相关的源代码.AVOption用于在FFmpeg中描述结构体中的成员变量.一个AVOption可以包含名称,简短的帮助信息,取值等等. 上篇文章简单回顾 上篇文章中概括了AVClass,AVOption和目标结构体之间的关系.以AVFormatContext为例,可以表示为下图. 有关上篇文章的内容,这里不再重复.总体来说,上篇文章主要概括了AVClass,AVOptio

FFmpeg源代码分析:sws_getContext()

打算写两篇文章记录FFmpeg中的图像处理(缩放,YUV/RGB格式转换)类库libswsscale的源代码.libswscale是一个主要用于处理图片像素数据的类库.可以完成图片像素格式的转换,图片的拉伸等工作.有关libswscale的使用可以参考文章: <最简单的基于FFmpeg的libswscale的示例(YUV转RGB)> libswscale常用的函数数量很少,一般情况下就3个: sws_getContext():初始化一个SwsContext. sws_scale():处理图像数

自己写的一个ffmpeg时间戳分析工具

代码托管 https://github.com/gitgjogh/ffmpeg_debug_ts 使用环境 FFMPEG 用于获取视频时间戳. 可以从 zeranoe 上下载事先编译的版本.(注意把ffempg所在路径加入系统或用户的环境变量$PATH) zeranoe: http://ffmpeg.zeranoe.com/builds/ python + numpy + matplotlib 用于数据分析和画图显示. 懒得折腾numpy和matplotlib,可以安装 python-xy 或 

FFmpeg源代码分析:结构体成员管理系统-AVClass

打算写两篇文章记录FFmpeg中和AVOption有关的源代码.AVOption用于在FFmpeg中描述结构体中的成员变量.它最主要的作用可以概括为两个字:"赋值".一个AVOption结构体包含了变量名称,简短的帮助,取值等等信息. 所有和AVOption有关的数据都存储在AVClass结构体中.如果一个结构体(例如AVFormatContext或者AVCodecContext)想要支持AVOption的话,它的第一个成员变量必须是一个指向AVClass结构体的指针.该AVClass

FFmpeg源代码分析:日志输出系统(av_log()等)

本文我们看一下FFmpeg的日志(Log)输出系统的源代码.日志输出部分的核心函数只有一个:av_log().使用av_log()在控制台输出日志的效果如下图所示. 函数调用结构图 FFmpeg日志输出系统的函数调用结构图如图所示. av_log() av_log()是FFmpeg中输出日志的函数.随便打开一个FFmpeg的源代码文件,就会发现其中遍布着av_log()函数.一般情况下FFmpeg类库的源代码中是不允许使用printf()这种的函数的,所有的输出一律使用av_log().av_l

FFmpeg源代码简单分析——sws_getContext()

FFmpeg源代码简单分析——sws_getContext() 转载地址:http://www.ithtw.com/2032.html FFmpeg sws_scale分析1 转载地址:http://www.w2bc.com/Article/19701

FFMPEG视音频编解码零基础学习方法-b

感谢大神分享,虽然现在还看不懂,留着大家一起看啦 PS:有不少人不清楚“FFmpeg”应该怎么读.它读作“ef ef em peg” 0. 背景知识 本章主要介绍一下FFMPEG都用在了哪里(在这里仅列几个我所知的,其实远比这个多).说白了就是为了说明:FFMPEG是非常重要的. 使用FFMPEG作为内核视频播放器: Mplayer,ffplay,射手播放器,暴风影音,KMPlayer,QQ影音... 使用FFMPEG作为内核的Directshow Filter: ffdshow,lav fil