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播 ...
随机推荐
- [light oj 1013] Love Calculator
1013 - Love Calculator Yes, you are developing a 'Love calculator'. The software would be quite comp ...
- SharePoint 2010 PowerShell 系列 之 备份、还原、部署 .WSP
转:http://www.cnblogs.com/Fengger/archive/2012/08/24/2654093.html PowerShell系列目录 最近在部署测试环境,就顺便把PowerS ...
- 如何在VS 2010中使用 VS2013的解决方案
今天要用VS2010打开VS2013,一直觉得VS2010到VS2012只是界面上扁平化的改变,平台工具集有改变但很大程度上可能向上兼容.在网上搜了一些文章,其中有一篇说到一个观点: 从 ...
- 万科北京区域V-learn发布 系V-LINK产品系中首批产品
继今年4月发布了V-LINK万科社区服务商2.0升级版本后,万科北京区域再次迎来了品牌大动作.近日,北京万科正式发布“V-LINK”产品系中的首批产品“V-learn”相关战略. 全品类教育模式 据介 ...
- mac os 常用终端软件工具
1. homebrew 安装 网上很多版本返回400错误,以下为最新版本地址(2015/02/09) ruby -e "$(curl -fsSL https://raw.githubuser ...
- 【原】Scala学习资料
Scala是基于JVM的一种通用函数式也是面向对象编程语言,能和Java.C#等主流的编程语言无缝融合. 下面给大家推荐一些Scala的学习资料,序号靠前的重要性比较高. 1.Scala初学指南 (1 ...
- 【原创】关于hashcode和equals的不同实现对HashMap和HashSet集合类的影响的探究
这篇文章做了一个很好的测试:http://blog.csdn.net/afgasdg/article/details/6889383,判断往HashSet(不允许元素重复)里塞对象时,是如何判定set ...
- CentOS设置在同一窗口打开文件夹
默认情况下,CentOS双击文件夹会打开一个新窗口.这对于习惯Windows的用户会感觉非常别扭.其实,如果用鼠标中键双击文件夹,就不会打开新窗口了.当然,也可以按照如下设置: 1. 打开任意一个文 ...
- CentOS的Redis内存分配策略配置
安装了一主两从节点,启动之后发现有一个警告: 大概是说overcommit_memory设置成了0,在低内存环境下后台保存可能会失败,设置成1重启可解决. 然后,不太懂这个配置的含义,google一把 ...
- 前景还是“钱景”——MM应用引擎的自我博弈
纵观当前的移动互联网发展态势,巨大的商机已经展露无遗,各个领域的企业及个人对于APP的开发如火如荼,许多APP从诞生伊始,就面临着软件开发的专业性,商业模式的模糊性,以及市场推广的艰巨性三个巨大难题, ...