1. YUV2RGBFUNC(yuv2rgb_c_24_rgb, uint8_t, )
  2. LOADCHROMA();
  3. PUTRGB24(dst_1, py_1, );
  4. PUTRGB24(dst_2, py_2, );
  5.  
  6. LOADCHROMA();
  7. PUTRGB24(dst_2, py_2, );
  8. PUTRGB24(dst_1, py_1, );
  9.  
  10. LOADCHROMA();
  11. PUTRGB24(dst_1, py_1, );
  12. PUTRGB24(dst_2, py_2, );
  13.  
  14. LOADCHROMA();
  15. PUTRGB24(dst_2, py_2, );
  16. PUTRGB24(dst_1, py_1, );
  17. ENDYUV2RGBLINE(, )
  18. LOADCHROMA();
  19. PUTRGB24(dst_1, py_1, );
  20. PUTRGB24(dst_2, py_2, );
  21.  
  22. LOADCHROMA();
  23. PUTRGB24(dst_2, py_2, );
  24. PUTRGB24(dst_1, py_1, );
  25. ENDYUV2RGBLINE(, )
  26. LOADCHROMA();
  27. PUTRGB24(dst_1, py_1, );
  28. PUTRGB24(dst_2, py_2, );
  29. ENDYUV2RGBFUNC()
  1. #define PUTRGB24(dst, src, i) \
  2. Y = src[ * i]; \
  3. dst[ * i + ] = r[Y]; \
  4. dst[ * i + ] = g[Y]; \
  5. dst[ * i + ] = b[Y]; \
  6. Y = src[ * i + ]; \
  7. dst[ * i + ] = r[Y]; \
  8. dst[ * i + ] = g[Y]; \
  9. dst[ * i + ] = b[Y];
  1. #define LOADCHROMA(i) \
  2. U = pu[i]; \
  3. V = pv[i]; \
  4. r = (void *)c->table_rV[V+YUVRGB_TABLE_HEADROOM]; \
  5. g = (void *)(c->table_gU[U+YUVRGB_TABLE_HEADROOM] + c->table_gV[V+YUVRGB_TABLE_HEADROOM]); \
  6. b = (void *)c->table_bU[U+YUVRGB_TABLE_HEADROOM];
  1. #define ENDYUV2RGBLINE(dst_delta, ss) \
  2. pu += >> ss; \
  3. pv += >> ss; \
  4. py_1 += >> ss; \
  5. py_2 += >> ss; \
  6. dst_1 += dst_delta >> ss; \
  7. dst_2 += dst_delta >> ss; \
  8. } \
  9. if (c->dstW & ( >> ss)) { \
  10. int av_unused Y, U, V; \
  1. #define ENDYUV2RGBFUNC() \
  2. } \
  3. } \
  4. return srcSliceH; \
  5. }
  1. #define YUV2RGBFUNC(yuv2rgb_c_24_rgb, uint8_t, 0) \
  2. static int yuv2rgb_c_24_rgb(SwsContext *c, const uint8_t *src[], \
  3. int srcStride[], int srcSliceY, int srcSliceH, \
  4. uint8_t *dst[], int dstStride[]) \
  5. { \
  6. int y; \
  7. \
  8. if (! && c->srcFormat == AV_PIX_FMT_YUV422P) \
  9. { \
  10. srcStride[] *= ; \
  11. srcStride[] *= ; \
  12. } \
  13. for (y = ; y < srcSliceH; y += )
  14. { \
  15. uint8_t *dst_1 = \
  16. (uint8_t *)(dst[] + (y + srcSliceY) * dstStride[]); \
  17. uint8_t *dst_2 = \
  18. (uint8_t *)(dst[] + (y + srcSliceY + ) * dstStride[]); \
  19. uint8_t av_unused *r, *g, *b; \
  20. const uint8_t *py_1 = src[] + y * srcStride[]; \
  21. const uint8_t *py_2 = py_1 + srcStride[]; \
  22. const uint8_t *pu = src[] + (y >> ) * srcStride[]; \
  23. const uint8_t *pv = src[] + (y >> ) * srcStride[]; \
  24. const uint8_t av_unused *pa_1, *pa_2; \
  25. unsigned int h_size = c->dstW >> ; \
  26. if () \
  27. { \
  28. pa_1 = src[] + y * srcStride[]; \
  29. pa_2 = pa_1 + srcStride[]; \
  30. } \
  31. while (h_size--) \
  32. { \
  33. int av_unused U, V, Y; \
  34. U = pu[]; \
  35. V = pv[]; \
  36. r = (void *)c->table_rV[V+YUVRGB_TABLE_HEADROOM]; \
  37. g = (void *)(c->table_gU[U+YUVRGB_TABLE_HEADROOM] + c->table_gV[V+YUVRGB_TABLE_HEADROOM]); \
  38. b = (void *)c->table_bU[U+YUVRGB_TABLE_HEADROOM];
  39.  
  40. Y = py_1[ * ]; \
  41. dst_1[ * + ] = r[Y]; \
  42. dst_1[ * + ] = g[Y]; \
  43. dst_1[ * + ] = b[Y]; \
  44. Y = py_1[ * + ]; \
  45. dst_1[ * + ] = r[Y]; \
  46. dst_1[ * + ] = g[Y]; \
  47. dst_1[ * + ] = b[Y];
  48.  
  49. Y = py_2[ * ]; \
  50. dst_2[ * + ] = r[Y]; \
  51. dst_2[ * + ] = g[Y]; \
  52. dst_2[ * + ] = b[Y]; \
  53. Y = py_2[ * + ]; \
  54. dst_2[ * + ] = r[Y]; \
  55. dst_2[ * + ] = g[Y]; \
  56. dst_2[ * + ] = b[Y];
  57.  
  58. U = pu[]; \
  59. V = pv[]; \
  60. r = (void *)c->table_rV[V+YUVRGB_TABLE_HEADROOM]; \
  61. g = (void *)(c->table_gU[U+YUVRGB_TABLE_HEADROOM] + c->table_gV[V+YUVRGB_TABLE_HEADROOM]); \
  62. b = (void *)c->table_bU[U+YUVRGB_TABLE_HEADROOM];
  63.  
  64. Y = py_2[ * ]; \
  65. dst_2[ * + ] = r[Y]; \
  66. dst_2[ * + ] = g[Y]; \
  67. dst_2[ * + ] = b[Y]; \
  68. Y = py_2[ * + ]; \
  69. dst_2[ * + ] = r[Y]; \
  70. dst_2[ * + ] = g[Y]; \
  71. dst_2[ * + ] = b[Y];
  72.  
  73. Y = py_1[ * ]; \
  74. dst_1[ * + ] = r[Y]; \
  75. dst_1[ * + ] = g[Y]; \
  76. dst_1[ * + ] = b[Y]; \
  77. Y = py_1[ * + ]; \
  78. dst_1[ * + ] = r[Y]; \
  79. dst_1[ * + ] = g[Y]; \
  80. dst_1[ * + ] = b[Y];
  81.  
  82. U = pu[]; \
  83. V = pv[]; \
  84. r = (void *)c->table_rV[V+YUVRGB_TABLE_HEADROOM]; \
  85. g = (void *)(c->table_gU[U+YUVRGB_TABLE_HEADROOM] + c->table_gV[V+YUVRGB_TABLE_HEADROOM]); \
  86. b = (void *)c->table_bU[U+YUVRGB_TABLE_HEADROOM];
  87.  
  88. Y = py_1[ * ]; \
  89. dst_1[ * + ] = r[Y]; \
  90. dst_1[ * + ] = g[Y]; \
  91. dst_1[ * + ] = b[Y]; \
  92. Y = py_1[ * + ]; \
  93. dst_1[ * + ] = r[Y]; \
  94. dst_1[ * + ] = g[Y]; \
  95. dst_1[ * + ] = b[Y];
  96.  
  97. Y = py_2[ * ]; \
  98. dst_2[ * + ] = r[Y]; \
  99. dst_2[ * + ] = g[Y]; \
  100. dst_2[ * + ] = b[Y]; \
  101. Y = py_2[ * + ]; \
  102. dst_2[ * + ] = r[Y]; \
  103. dst_2[ * + ] = g[Y]; \
  104. dst_2[ * + ] = b[Y];
  105.  
  106. U = pu[]; \
  107. V = pv[]; \
  108. r = (void *)c->table_rV[V+YUVRGB_TABLE_HEADROOM]; \
  109. g = (void *)(c->table_gU[U+YUVRGB_TABLE_HEADROOM] + c->table_gV[V+YUVRGB_TABLE_HEADROOM]); \
  110. b = (void *)c->table_bU[U+YUVRGB_TABLE_HEADROOM];
  111.  
  112. Y = py_2[ * ]; \
  113. dst_2[ * + ] = r[Y]; \
  114. dst_2[ * + ] = g[Y]; \
  115. dst_2[ * + ] = b[Y]; \
  116. Y = py_2[ * + ]; \
  117. dst_2[ * + ] = r[Y]; \
  118. dst_2[ * + ] = g[Y]; \
  119. dst_2[ * + ] = b[Y];
  120.  
  121. Y = py_1[ * ]; \
  122. dst_1[ * + ] = r[Y]; \
  123. dst_1[ * + ] = g[Y]; \
  124. dst_1[ * + ] = b[Y]; \
  125. Y = py_1[ * + ]; \
  126. dst_1[ * + ] = r[Y]; \
  127. dst_1[ * + ] = g[Y]; \
  128. dst_1[ * + ] = b[Y];
  129.  
  130. pu += >> ; \
  131. pv += >> ; \
  132. py_1 += >> ; \
  133. py_2 += >> ; \
  134. dst_1 += >> ; \
  135. dst_2 += >> ; \
  136. } \
  137. if (c->dstW & ( >> )) \
  138. { \
  139. int av_unused Y, U, V; \
  140.  
  141. U = pu[]; \
  142. V = pv[]; \
  143. r = (void *)c->table_rV[V+YUVRGB_TABLE_HEADROOM]; \
  144. g = (void *)(c->table_gU[U+YUVRGB_TABLE_HEADROOM] + c->table_gV[V+YUVRGB_TABLE_HEADROOM]); \
  145. b = (void *)c->table_bU[U+YUVRGB_TABLE_HEADROOM];
  146.  
  147. Y = py_1[ * ]; \
  148. dst_1[ * + ] = r[Y]; \
  149. dst_1[ * + ] = g[Y]; \
  150. dst_1[ * + ] = b[Y]; \
  151. Y = py_1[ * + ]; \
  152. dst_1[ * + ] = r[Y]; \
  153. dst_1[ * + ] = g[Y]; \
  154. dst_1[ * + ] = b[Y];
  155.  
  156. Y = py_2[ * ]; \
  157. dst_2[ * + ] = r[Y]; \
  158. dst_2[ * + ] = g[Y]; \
  159. dst_2[ * + ] = b[Y]; \
  160. Y = py_2[ * + ]; \
  161. dst_2[ * + ] = r[Y]; \
  162. dst_2[ * + ] = g[Y]; \
  163. dst_2[ * + ] = b[Y];
  164.  
  165. U = pu[]; \
  166. V = pv[]; \
  167. r = (void *)c->table_rV[V+YUVRGB_TABLE_HEADROOM]; \
  168. g = (void *)(c->table_gU[U+YUVRGB_TABLE_HEADROOM] + c->table_gV[V+YUVRGB_TABLE_HEADROOM]); \
  169. b = (void *)c->table_bU[U+YUVRGB_TABLE_HEADROOM]; \
  170.  
  171. Y = py_2[ * ]; \
  172. dst_2[ * + ] = r[Y]; \
  173. dst_2[ * + ] = g[Y]; \
  174. dst_2[ * + ] = b[Y]; \
  175. Y = py_2[ * + ]; \
  176. dst_2[ * + ] = r[Y]; \
  177. dst_2[ * + ] = g[Y]; \
  178. dst_2[ * + ] = b[Y];
  179.  
  180. Y = py_1[ * ]; \
  181. dst_1[ * + ] = r[Y]; \
  182. dst_1[ * + ] = g[Y]; \
  183. dst_1[ * + ] = b[Y]; \
  184. Y = py_1[ * + ]; \
  185. dst_1[ * + ] = r[Y]; \
  186. dst_1[ * + ] = g[Y]; \
  187. dst_1[ * + ] = b[Y];
  188.  
  189. pu += >> ; \
  190. pv += >> ; \
  191. py_1 += >> ; \
  192. py_2 += >> ; \
  193. dst_1 += >> ; \
  194. dst_2 += >> ; \
  195. } \
  196. if (c->dstW & ( >> ss)) \
  197. { \
  198. int av_unused Y, U, V; \
  199.  
  200. U = pu[]; \
  201. V = pv[]; \
  202. r = (void *)c->table_rV[V+YUVRGB_TABLE_HEADROOM]; \
  203. g = (void *)(c->table_gU[U+YUVRGB_TABLE_HEADROOM] + c->table_gV[V+YUVRGB_TABLE_HEADROOM]); \
  204. b = (void *)c->table_bU[U+YUVRGB_TABLE_HEADROOM]; \
  205.  
  206. Y = py_1[ * ]; \
  207. dst_1[ * + ] = r[Y]; \
  208. dst_1[ * + ] = g[Y]; \
  209. dst_1[ * + ] = b[Y]; \
  210. Y = py_1[ * + ]; \
  211. dst_1[ * + ] = r[Y]; \
  212. dst_1[ * + ] = g[Y]; \
  213. dst_1[ * + ] = b[Y];
  214.  
  215. Y = py_2[ * ]; \
  216. dst_2[ * + ] = r[Y]; \
  217. dst_2[ * + ] = g[Y]; \
  218. dst_2[ * + ] = b[Y]; \
  219. Y = py_2[ * + ]; \
  220. dst_2[ * + ] = r[Y]; \
  221. dst_2[ * + ] = g[Y]; \
  222. dst_2[ * + ] = b[Y];
  223. } \
  224. } \
  225. return srcSliceH; \
  226. }

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. WPF——绑定数据库数据(Listview)

    一.首先先画一个窗体,放进一个Listview 然后给每列起好名字,并且绑定的数据是临时表的列名 二.造一个临时表用来存储数据,并且将扔进去的Listview绑定到这个临时表DataTable上面 p ...

  2. Lombok 安装、入门 - 消除冗长的 java 代码(转)

    前言:    逛开源社区的时候无意发现的,用了一段时间,觉得还可以,特此推荐一下.    lombok 提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码.特别是相对于 ...

  3. .NET平台上的Memcached客户端介绍(Memcached Providers)

    早上接到一个任务,需要对Linux服务器的Memcached的update操作进行性能测试,我发现我是一个典型的“手里拿着锤子,就把所有问题都当成钉子”的人.我第一个念头就是,上Memcached的官 ...

  4. (转载)腾讯CMEM的PHP扩展

    (转载)http://blog.renren.com/share/223341289/7693783476 题外话 最近公司在做相关的业务,由于Memcached协议缺少返回码,为了保证业务数据的安全 ...

  5. @DataProvider ITestContext 参数

    package roger.testng; import java.util.Random; import org.testng.ITestContext; import org.testng.ann ...

  6. Html笔记(三)列表

    列表标签: <dl> <dt>:上层标签 <dd>:下层标签 例: <dl> <dt>上层项目</dt> <dd>下 ...

  7. linux获取目录下文件

    查看当前目录下的文件: find . -type f 查看当前目录下的文件夹: find . -type d 如果文件file1不为空: if [ -s file1 ];then      echo  ...

  8. linux select 与 阻塞( blocking ) 及非阻塞 (non blocking)实现io多路复用的示例

    除了自己实现之外,还有个c语言写的基于事件的开源网络库:libevent http://www.cnblogs.com/Anker/p/3265058.html 最简单的select示例: #incl ...

  9. 实用Yii扩展

    可以去官方搜索Yii扩展:Extensions | Yii PHP Framework http://www.yiiframework.com/extensions/?tag=tree Yii che ...

  10. poj 1144 Network【双连通分量求割点总数】

    Network Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11042   Accepted: 5100 Descript ...