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的更多相关文章

  1. FFmpeg学习6:视音频同步

    在上一篇文章中,视频和音频是各自独立播放的,并不同步.本文主要描述了如何以音频的播放时长为基准,将视频同步到音频上以实现视音频的同步播放的.主要有以下几个方面的内容 视音频同步的简单介绍 DTS 和 ...

  2. FFmpeg 中AVPacket的使用

    AVPacket保存的是解码前的数据,也就是压缩后的数据.该结构本身不直接包含数据,其有一个指向数据域的指针,FFmpeg中很多的数据结构都使用这种方法来管理数据. AVPacket的使用通常离不开下 ...

  3. FFmpeg + SoundTouch实现音频的变调变速

    本文使用FFmpeg + SoundTouch实现将音频解码后,进行变调变速处理,并将处理后的结果保存为WAV文件. 主要有以下内容: 实现一个FFmpeg的工具类,保存多媒体文件所需的解码信息 将解 ...

  4. 用ffmpeg快速剪切和合并视频

    如果直接找视频剪切和合并视频的软件,通常出来的都是大的视频编辑软件或者是有图形界面的剪切软件,大型一点的功能太多安装麻烦,小型一点的功能可能不齐全. 只是简单的剪切或者一下合并一下,还是ffmpeg这 ...

  5. ffmpeg用法及如何使用fluent-ffmpeg

    http://ffmpeg.org/ 官网 ffmpeg(命令行工具) 是一个快速的音视频转换工具. 1.分离视频音频流 ffmpeg -i input_file -vcodec copy -an o ...

  6. FFmpeg学习4:音频格式转换

    前段时间,在学习试用FFmpeg播放音频的时候总是有杂音,网上的很多教程是基于之前版本的FFmpeg的,而新的FFmepg3中audio增加了平面(planar)格式,而SDL播放音频是不支持平面格式 ...

  7. FFmpeg学习5:多线程播放视音频

    在前面的学习中,视频和音频的播放是分开进行的.这主要是为了学习的方便,经过一段时间的学习,对FFmpeg的也有了一定的了解,本文就介绍了 如何使用多线程同时播放音频和视频(未实现同步),并对前面的学习 ...

  8. FFmpeg数据结构:AVPacket解析

    本文主要从以下几个方面对AVPacket做解析: AVPacket在FFmpeg中的作用 字段说明 AVPacket中的内存管理 AVPacket相关函数的说明 结合AVPacket队列说明下AVPa ...

  9. FFmpeg学习3:播放音频

    参考dranger tutorial,本文将介绍如何使用FFmpeg解码音频数据,并使用SDL将解码后的数据输出. 本文主要包含以下几方面的内容: 关于播放音频的需要的一些基础知识介绍 使用SDL2播 ...

随机推荐

  1. 处理.NET中的内存泄露

    Fabrice Marguerie是一位软件架构师和咨询师,他在MSDN发表了如何检测和避免.NET程序内存与资源泄漏的文章.此文章描述了编写.NET程序时可能发生的内存与资源泄漏,以及如何避免这些泄 ...

  2. Oracle 新增表空间文件

    ALTER TABLESPACE users ADD DATAFILE 'D:/oracle/oradata/orcl/users.dbf' SIZE 500M AUTOEXTEND ON NEXT ...

  3. mongodb c++ driver(2.53)windows编译

    编译环境: (1) 下载python2.7, 使用x86_32位,因为scons只有32位安装包可用: (2) 下载scons2.3.0,The current production release ...

  4. iOS开发——GCD多线程详解

    GCD多线程详解 1. 什么是GCD Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,简单来说,GCD就是iOS一套解决多线程的机制,使用GCD能够最大限度简化多线程 ...

  5. jsf服务器端验证用户输入

    服务器端验证用户输入数据步骤 1 html页面上插入要输入数据控件 <h:inputText size="10" value="#{commodityBean.fo ...

  6. HDU4417 - Super Mario(主席树)

    题目大意 给定一个数列,每次要求你查询区间[L,R]内不超过K的数的数量 题解 和静态的区间第K大差不多,这题是<=K,先建立好n颗主席树,然后用第R颗主席树区间[1,K]内数的数量减去第L-1 ...

  7. [网络]关于公网IP的一些事

    家里的每一个路由器配置里,都有一个公网Ip,即下图中的IP地址

  8. 如何生成一副Poker

    import java.util.LinkedList;import java.util.Random;//扑克类class Poker{    String color;//花色    String ...

  9. [Openstack][Grizzly] Mysql删除僵尸实例

    由于某些原因,导致在通过nova delete删除虚拟机后,其task_state 一致处于deleting状态, 但是始终无法删除.由于虚拟机还没有分配到节点等信息,还没有拷贝镜像,所以可以直接从数 ...

  10. windows 文件名太长无法删除的解决方法

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...