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播 ...
随机推荐
- bzoj2565
网络流就先告一段落了 在进行其他训练之前,我决定先练一道后缀数组(对这个我还是比较有自信的) 虽然之前没用后缀数组解决过回文问题,但是稍微想想就知道, 要解决最长双倍回文,首先要解决最长回文序列, 要 ...
- 清理Xcode中无用的 Provisioning Profile.
Xcode中如果添加过多个开发者账号, 慢慢就会发现 Provisioning Profile 有很多, 无用的 Provisioning Profile Xcode也不会自动删除, 想要清理的话, ...
- LightOJ 1214 Large Division 水题
java有大数模板 import java.util.Scanner; import java.math.*; public class Main { public static void main( ...
- Frame 处理
# -*- coding:utf-8 -*- """ 通过 id 或 name 识别处理 fram 框架 """ from selenium ...
- HashPasswordForStoringInConfigFile 已过时
在.net 4.5版本下,使用System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile进行MD5加密时,会出 ...
- [POJ3684]Physics Experiment
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1363 Accepted: 476 Special Judge ...
- 【HTML】Advanced5:Accessible Forms
1.label <form> <label for="yourName">Your Name</label> <input name=&q ...
- 输入n,计算并输出n1+n2+n3+……+n10
// 方法1:双重循环 #include <stdio.h> void main() { int i,j,n,s,t; scanf("%d",&n); s=0; ...
- 【Java基础】Java IO流的总结
Java IO流分为输入流和输出流,而输入流和输出流中又分字符流和字节流.顾名思义,输入流则是输入到程序中计算,输出流是把程序的结果输出到文件或者设备.而字符流输入输出以字符为单位,字节流则是以字节为 ...
- [读书笔记]算法(Sedgewick著)·第一章(1)
到家放松放松之后就开始学习算法了,手里拿的是拿的是一本Robert Sedgewick的橙皮书<算法(第四版)>的.这本书与导论那本书的不同之处在于轻数学思想.重实现,也就是说这是一本很不 ...