ffmpeg之yuv2rgb_c_24_rgb
YUV2RGBFUNC(yuv2rgb_c_24_rgb, uint8_t, )
LOADCHROMA();
PUTRGB24(dst_1, py_1, );
PUTRGB24(dst_2, py_2, ); LOADCHROMA();
PUTRGB24(dst_2, py_2, );
PUTRGB24(dst_1, py_1, ); LOADCHROMA();
PUTRGB24(dst_1, py_1, );
PUTRGB24(dst_2, py_2, ); LOADCHROMA();
PUTRGB24(dst_2, py_2, );
PUTRGB24(dst_1, py_1, );
ENDYUV2RGBLINE(, )
LOADCHROMA();
PUTRGB24(dst_1, py_1, );
PUTRGB24(dst_2, py_2, ); LOADCHROMA();
PUTRGB24(dst_2, py_2, );
PUTRGB24(dst_1, py_1, );
ENDYUV2RGBLINE(, )
LOADCHROMA();
PUTRGB24(dst_1, py_1, );
PUTRGB24(dst_2, py_2, );
ENDYUV2RGBFUNC()
#define PUTRGB24(dst, src, i) \
Y = src[ * i]; \
dst[ * i + ] = r[Y]; \
dst[ * i + ] = g[Y]; \
dst[ * i + ] = b[Y]; \
Y = src[ * i + ]; \
dst[ * i + ] = r[Y]; \
dst[ * i + ] = g[Y]; \
dst[ * i + ] = b[Y];
#define LOADCHROMA(i) \
U = pu[i]; \
V = pv[i]; \
r = (void *)c->table_rV[V+YUVRGB_TABLE_HEADROOM]; \
g = (void *)(c->table_gU[U+YUVRGB_TABLE_HEADROOM] + c->table_gV[V+YUVRGB_TABLE_HEADROOM]); \
b = (void *)c->table_bU[U+YUVRGB_TABLE_HEADROOM];
#define ENDYUV2RGBLINE(dst_delta, ss) \
pu += >> ss; \
pv += >> ss; \
py_1 += >> ss; \
py_2 += >> ss; \
dst_1 += dst_delta >> ss; \
dst_2 += dst_delta >> ss; \
} \
if (c->dstW & ( >> ss)) { \
int av_unused Y, U, V; \
#define ENDYUV2RGBFUNC() \
} \
} \
return srcSliceH; \
}
#define YUV2RGBFUNC(yuv2rgb_c_24_rgb, uint8_t, 0) \
static int yuv2rgb_c_24_rgb(SwsContext *c, const uint8_t *src[], \
int srcStride[], int srcSliceY, int srcSliceH, \
uint8_t *dst[], int dstStride[]) \
{ \
int y; \
\
if (! && c->srcFormat == AV_PIX_FMT_YUV422P) \
{ \
srcStride[] *= ; \
srcStride[] *= ; \
} \
for (y = ; y < srcSliceH; y += )
{ \
uint8_t *dst_1 = \
(uint8_t *)(dst[] + (y + srcSliceY) * dstStride[]); \
uint8_t *dst_2 = \
(uint8_t *)(dst[] + (y + srcSliceY + ) * dstStride[]); \
uint8_t av_unused *r, *g, *b; \
const uint8_t *py_1 = src[] + y * srcStride[]; \
const uint8_t *py_2 = py_1 + srcStride[]; \
const uint8_t *pu = src[] + (y >> ) * srcStride[]; \
const uint8_t *pv = src[] + (y >> ) * srcStride[]; \
const uint8_t av_unused *pa_1, *pa_2; \
unsigned int h_size = c->dstW >> ; \
if () \
{ \
pa_1 = src[] + y * srcStride[]; \
pa_2 = pa_1 + srcStride[]; \
} \
while (h_size--) \
{ \
int av_unused U, V, Y; \
U = pu[]; \
V = pv[]; \
r = (void *)c->table_rV[V+YUVRGB_TABLE_HEADROOM]; \
g = (void *)(c->table_gU[U+YUVRGB_TABLE_HEADROOM] + c->table_gV[V+YUVRGB_TABLE_HEADROOM]); \
b = (void *)c->table_bU[U+YUVRGB_TABLE_HEADROOM]; Y = py_1[ * ]; \
dst_1[ * + ] = r[Y]; \
dst_1[ * + ] = g[Y]; \
dst_1[ * + ] = b[Y]; \
Y = py_1[ * + ]; \
dst_1[ * + ] = r[Y]; \
dst_1[ * + ] = g[Y]; \
dst_1[ * + ] = b[Y]; Y = py_2[ * ]; \
dst_2[ * + ] = r[Y]; \
dst_2[ * + ] = g[Y]; \
dst_2[ * + ] = b[Y]; \
Y = py_2[ * + ]; \
dst_2[ * + ] = r[Y]; \
dst_2[ * + ] = g[Y]; \
dst_2[ * + ] = b[Y]; U = pu[]; \
V = pv[]; \
r = (void *)c->table_rV[V+YUVRGB_TABLE_HEADROOM]; \
g = (void *)(c->table_gU[U+YUVRGB_TABLE_HEADROOM] + c->table_gV[V+YUVRGB_TABLE_HEADROOM]); \
b = (void *)c->table_bU[U+YUVRGB_TABLE_HEADROOM]; Y = py_2[ * ]; \
dst_2[ * + ] = r[Y]; \
dst_2[ * + ] = g[Y]; \
dst_2[ * + ] = b[Y]; \
Y = py_2[ * + ]; \
dst_2[ * + ] = r[Y]; \
dst_2[ * + ] = g[Y]; \
dst_2[ * + ] = b[Y]; Y = py_1[ * ]; \
dst_1[ * + ] = r[Y]; \
dst_1[ * + ] = g[Y]; \
dst_1[ * + ] = b[Y]; \
Y = py_1[ * + ]; \
dst_1[ * + ] = r[Y]; \
dst_1[ * + ] = g[Y]; \
dst_1[ * + ] = b[Y]; U = pu[]; \
V = pv[]; \
r = (void *)c->table_rV[V+YUVRGB_TABLE_HEADROOM]; \
g = (void *)(c->table_gU[U+YUVRGB_TABLE_HEADROOM] + c->table_gV[V+YUVRGB_TABLE_HEADROOM]); \
b = (void *)c->table_bU[U+YUVRGB_TABLE_HEADROOM]; Y = py_1[ * ]; \
dst_1[ * + ] = r[Y]; \
dst_1[ * + ] = g[Y]; \
dst_1[ * + ] = b[Y]; \
Y = py_1[ * + ]; \
dst_1[ * + ] = r[Y]; \
dst_1[ * + ] = g[Y]; \
dst_1[ * + ] = b[Y]; Y = py_2[ * ]; \
dst_2[ * + ] = r[Y]; \
dst_2[ * + ] = g[Y]; \
dst_2[ * + ] = b[Y]; \
Y = py_2[ * + ]; \
dst_2[ * + ] = r[Y]; \
dst_2[ * + ] = g[Y]; \
dst_2[ * + ] = b[Y]; U = pu[]; \
V = pv[]; \
r = (void *)c->table_rV[V+YUVRGB_TABLE_HEADROOM]; \
g = (void *)(c->table_gU[U+YUVRGB_TABLE_HEADROOM] + c->table_gV[V+YUVRGB_TABLE_HEADROOM]); \
b = (void *)c->table_bU[U+YUVRGB_TABLE_HEADROOM]; Y = py_2[ * ]; \
dst_2[ * + ] = r[Y]; \
dst_2[ * + ] = g[Y]; \
dst_2[ * + ] = b[Y]; \
Y = py_2[ * + ]; \
dst_2[ * + ] = r[Y]; \
dst_2[ * + ] = g[Y]; \
dst_2[ * + ] = b[Y]; Y = py_1[ * ]; \
dst_1[ * + ] = r[Y]; \
dst_1[ * + ] = g[Y]; \
dst_1[ * + ] = b[Y]; \
Y = py_1[ * + ]; \
dst_1[ * + ] = r[Y]; \
dst_1[ * + ] = g[Y]; \
dst_1[ * + ] = b[Y]; pu += >> ; \
pv += >> ; \
py_1 += >> ; \
py_2 += >> ; \
dst_1 += >> ; \
dst_2 += >> ; \
} \
if (c->dstW & ( >> )) \
{ \
int av_unused Y, U, V; \ U = pu[]; \
V = pv[]; \
r = (void *)c->table_rV[V+YUVRGB_TABLE_HEADROOM]; \
g = (void *)(c->table_gU[U+YUVRGB_TABLE_HEADROOM] + c->table_gV[V+YUVRGB_TABLE_HEADROOM]); \
b = (void *)c->table_bU[U+YUVRGB_TABLE_HEADROOM]; Y = py_1[ * ]; \
dst_1[ * + ] = r[Y]; \
dst_1[ * + ] = g[Y]; \
dst_1[ * + ] = b[Y]; \
Y = py_1[ * + ]; \
dst_1[ * + ] = r[Y]; \
dst_1[ * + ] = g[Y]; \
dst_1[ * + ] = b[Y]; Y = py_2[ * ]; \
dst_2[ * + ] = r[Y]; \
dst_2[ * + ] = g[Y]; \
dst_2[ * + ] = b[Y]; \
Y = py_2[ * + ]; \
dst_2[ * + ] = r[Y]; \
dst_2[ * + ] = g[Y]; \
dst_2[ * + ] = b[Y]; U = pu[]; \
V = pv[]; \
r = (void *)c->table_rV[V+YUVRGB_TABLE_HEADROOM]; \
g = (void *)(c->table_gU[U+YUVRGB_TABLE_HEADROOM] + c->table_gV[V+YUVRGB_TABLE_HEADROOM]); \
b = (void *)c->table_bU[U+YUVRGB_TABLE_HEADROOM]; \ Y = py_2[ * ]; \
dst_2[ * + ] = r[Y]; \
dst_2[ * + ] = g[Y]; \
dst_2[ * + ] = b[Y]; \
Y = py_2[ * + ]; \
dst_2[ * + ] = r[Y]; \
dst_2[ * + ] = g[Y]; \
dst_2[ * + ] = b[Y]; Y = py_1[ * ]; \
dst_1[ * + ] = r[Y]; \
dst_1[ * + ] = g[Y]; \
dst_1[ * + ] = b[Y]; \
Y = py_1[ * + ]; \
dst_1[ * + ] = r[Y]; \
dst_1[ * + ] = g[Y]; \
dst_1[ * + ] = b[Y]; pu += >> ; \
pv += >> ; \
py_1 += >> ; \
py_2 += >> ; \
dst_1 += >> ; \
dst_2 += >> ; \
} \
if (c->dstW & ( >> ss)) \
{ \
int av_unused Y, U, V; \ U = pu[]; \
V = pv[]; \
r = (void *)c->table_rV[V+YUVRGB_TABLE_HEADROOM]; \
g = (void *)(c->table_gU[U+YUVRGB_TABLE_HEADROOM] + c->table_gV[V+YUVRGB_TABLE_HEADROOM]); \
b = (void *)c->table_bU[U+YUVRGB_TABLE_HEADROOM]; \ Y = py_1[ * ]; \
dst_1[ * + ] = r[Y]; \
dst_1[ * + ] = g[Y]; \
dst_1[ * + ] = b[Y]; \
Y = py_1[ * + ]; \
dst_1[ * + ] = r[Y]; \
dst_1[ * + ] = g[Y]; \
dst_1[ * + ] = b[Y]; Y = py_2[ * ]; \
dst_2[ * + ] = r[Y]; \
dst_2[ * + ] = g[Y]; \
dst_2[ * + ] = b[Y]; \
Y = py_2[ * + ]; \
dst_2[ * + ] = r[Y]; \
dst_2[ * + ] = g[Y]; \
dst_2[ * + ] = b[Y];
} \
} \
return srcSliceH; \
}
ffmpeg之yuv2rgb_c_24_rgb的更多相关文章
- FFmpeg学习6:视音频同步
在上一篇文章中,视频和音频是各自独立播放的,并不同步.本文主要描述了如何以音频的播放时长为基准,将视频同步到音频上以实现视音频的同步播放的.主要有以下几个方面的内容 视音频同步的简单介绍 DTS 和 ...
- FFmpeg 中AVPacket的使用
AVPacket保存的是解码前的数据,也就是压缩后的数据.该结构本身不直接包含数据,其有一个指向数据域的指针,FFmpeg中很多的数据结构都使用这种方法来管理数据. AVPacket的使用通常离不开下 ...
- FFmpeg + SoundTouch实现音频的变调变速
本文使用FFmpeg + SoundTouch实现将音频解码后,进行变调变速处理,并将处理后的结果保存为WAV文件. 主要有以下内容: 实现一个FFmpeg的工具类,保存多媒体文件所需的解码信息 将解 ...
- 用ffmpeg快速剪切和合并视频
如果直接找视频剪切和合并视频的软件,通常出来的都是大的视频编辑软件或者是有图形界面的剪切软件,大型一点的功能太多安装麻烦,小型一点的功能可能不齐全. 只是简单的剪切或者一下合并一下,还是ffmpeg这 ...
- ffmpeg用法及如何使用fluent-ffmpeg
http://ffmpeg.org/ 官网 ffmpeg(命令行工具) 是一个快速的音视频转换工具. 1.分离视频音频流 ffmpeg -i input_file -vcodec copy -an o ...
- FFmpeg学习4:音频格式转换
前段时间,在学习试用FFmpeg播放音频的时候总是有杂音,网上的很多教程是基于之前版本的FFmpeg的,而新的FFmepg3中audio增加了平面(planar)格式,而SDL播放音频是不支持平面格式 ...
- FFmpeg学习5:多线程播放视音频
在前面的学习中,视频和音频的播放是分开进行的.这主要是为了学习的方便,经过一段时间的学习,对FFmpeg的也有了一定的了解,本文就介绍了 如何使用多线程同时播放音频和视频(未实现同步),并对前面的学习 ...
- FFmpeg数据结构:AVPacket解析
本文主要从以下几个方面对AVPacket做解析: AVPacket在FFmpeg中的作用 字段说明 AVPacket中的内存管理 AVPacket相关函数的说明 结合AVPacket队列说明下AVPa ...
- FFmpeg学习3:播放音频
参考dranger tutorial,本文将介绍如何使用FFmpeg解码音频数据,并使用SDL将解码后的数据输出. 本文主要包含以下几方面的内容: 关于播放音频的需要的一些基础知识介绍 使用SDL2播 ...
随机推荐
- poj2187
求最远点对,这是一道经典的旋转卡壳的题目话说由于是前年写的,之后就没怎么研究过计算几何了……感觉都不大记得清了,来稍微回忆一下……首先最远点对一定出现在凸包上显然,然后穷举肯定不行,这时候就需要旋转卡 ...
- c#调用c++动态库的一些理解
调用c++动态库一般我们这样写 [DllImport("UCamer.dll", CallingConvention = CallingConvention.Winapi)] ...
- sql 日期时间格式转换
Sql日期时间格式转换 sql server2000中使用convert来取得datetime数据类型样式(全) 日期数据格式的处理,两个示例: CONVERT(varchar(16), 时间一, ...
- C#调用C++编写的DLL函数, 以及各种类型的参数传递 z
1. 如果函数只有传入参数,比如: C/C++ Code Copy Code To Clipboard //C++中的输出函数 int__declspec(dllexport) test(consti ...
- HDU 3427
DP: According to the meaning of problems,if we check n to m, assume x and y are both solvable,then w ...
- 读取编码为utf-16le的文件并打印
import codecs data = open('test.txt').read()if data[:2] == codecs.BOM_UTF16_LE: data = data[2:] ...
- AABB碰撞盒
矩形边界框(转) 另一种常见的用来界定物体的几何图元是矩形边界框,矩形边界框可以是与轴对齐的或是任意方向的.轴对齐矩形边界框有一个限制,就是它的边必须垂直于坐标轴.缩写AABB常用来表示axially ...
- javascript设计模式1
普通写法 function startAnimation(){ ... } function stopAnimation(){ ... } 对象类 /*Anim class*/ var Anim=fu ...
- Docker系列(五)OVS+Docker网络打通示例
环境说明 两个虚拟机 操作系统Centos7 DOcker版本1.8 脚本内容: 1 4 7 10 19 27 32 33 39 -j ACCEPT 47 48 # R ...
- WPF线程获取UI线程
WPF中只能是UI线程才可以改变UI控件相关,当采用多线程工作时,可用以下代码获取 UI线程进行操作: App.Current.Dispatcher.Invoke((Action)delegate() ...