You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

540 lines
20KB

  1. /*
  2. * H.26L/H.264/AVC/JVT/14496-10/... encoder/decoder
  3. * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
  4. *
  5. * This file is part of FFmpeg.
  6. *
  7. * FFmpeg is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * FFmpeg is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with FFmpeg; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. */
  21. /**
  22. * @file
  23. * H.264 / AVC / MPEG4 part10 prediction functions.
  24. * @author Michael Niedermayer <michaelni@gmx.at>
  25. */
  26. #include "libavutil/avassert.h"
  27. #include "h264pred.h"
  28. #define BIT_DEPTH 8
  29. #include "h264pred_template.c"
  30. #undef BIT_DEPTH
  31. #define BIT_DEPTH 9
  32. #include "h264pred_template.c"
  33. #undef BIT_DEPTH
  34. #define BIT_DEPTH 10
  35. #include "h264pred_template.c"
  36. #undef BIT_DEPTH
  37. static void pred4x4_vertical_vp8_c(uint8_t *src, const uint8_t *topright, int stride){
  38. const unsigned lt = src[-1-1*stride];
  39. LOAD_TOP_EDGE
  40. LOAD_TOP_RIGHT_EDGE
  41. uint32_t v = PACK_4U8((lt + 2*t0 + t1 + 2) >> 2,
  42. (t0 + 2*t1 + t2 + 2) >> 2,
  43. (t1 + 2*t2 + t3 + 2) >> 2,
  44. (t2 + 2*t3 + t4 + 2) >> 2);
  45. AV_WN32A(src+0*stride, v);
  46. AV_WN32A(src+1*stride, v);
  47. AV_WN32A(src+2*stride, v);
  48. AV_WN32A(src+3*stride, v);
  49. }
  50. static void pred4x4_horizontal_vp8_c(uint8_t *src, const uint8_t *topright, int stride){
  51. const unsigned lt = src[-1-1*stride];
  52. LOAD_LEFT_EDGE
  53. AV_WN32A(src+0*stride, ((lt + 2*l0 + l1 + 2) >> 2)*0x01010101);
  54. AV_WN32A(src+1*stride, ((l0 + 2*l1 + l2 + 2) >> 2)*0x01010101);
  55. AV_WN32A(src+2*stride, ((l1 + 2*l2 + l3 + 2) >> 2)*0x01010101);
  56. AV_WN32A(src+3*stride, ((l2 + 2*l3 + l3 + 2) >> 2)*0x01010101);
  57. }
  58. static void pred4x4_down_left_svq3_c(uint8_t *src, const uint8_t *topright, int stride){
  59. LOAD_TOP_EDGE
  60. LOAD_LEFT_EDGE
  61. src[0+0*stride]=(l1 + t1)>>1;
  62. src[1+0*stride]=
  63. src[0+1*stride]=(l2 + t2)>>1;
  64. src[2+0*stride]=
  65. src[1+1*stride]=
  66. src[0+2*stride]=
  67. src[3+0*stride]=
  68. src[2+1*stride]=
  69. src[1+2*stride]=
  70. src[0+3*stride]=
  71. src[3+1*stride]=
  72. src[2+2*stride]=
  73. src[1+3*stride]=
  74. src[3+2*stride]=
  75. src[2+3*stride]=
  76. src[3+3*stride]=(l3 + t3)>>1;
  77. }
  78. static void pred4x4_down_left_rv40_c(uint8_t *src, const uint8_t *topright, int stride){
  79. LOAD_TOP_EDGE
  80. LOAD_TOP_RIGHT_EDGE
  81. LOAD_LEFT_EDGE
  82. LOAD_DOWN_LEFT_EDGE
  83. src[0+0*stride]=(t0 + t2 + 2*t1 + 2 + l0 + l2 + 2*l1 + 2)>>3;
  84. src[1+0*stride]=
  85. src[0+1*stride]=(t1 + t3 + 2*t2 + 2 + l1 + l3 + 2*l2 + 2)>>3;
  86. src[2+0*stride]=
  87. src[1+1*stride]=
  88. src[0+2*stride]=(t2 + t4 + 2*t3 + 2 + l2 + l4 + 2*l3 + 2)>>3;
  89. src[3+0*stride]=
  90. src[2+1*stride]=
  91. src[1+2*stride]=
  92. src[0+3*stride]=(t3 + t5 + 2*t4 + 2 + l3 + l5 + 2*l4 + 2)>>3;
  93. src[3+1*stride]=
  94. src[2+2*stride]=
  95. src[1+3*stride]=(t4 + t6 + 2*t5 + 2 + l4 + l6 + 2*l5 + 2)>>3;
  96. src[3+2*stride]=
  97. src[2+3*stride]=(t5 + t7 + 2*t6 + 2 + l5 + l7 + 2*l6 + 2)>>3;
  98. src[3+3*stride]=(t6 + t7 + 1 + l6 + l7 + 1)>>2;
  99. }
  100. static void pred4x4_down_left_rv40_nodown_c(uint8_t *src, const uint8_t *topright, int stride){
  101. LOAD_TOP_EDGE
  102. LOAD_TOP_RIGHT_EDGE
  103. LOAD_LEFT_EDGE
  104. src[0+0*stride]=(t0 + t2 + 2*t1 + 2 + l0 + l2 + 2*l1 + 2)>>3;
  105. src[1+0*stride]=
  106. src[0+1*stride]=(t1 + t3 + 2*t2 + 2 + l1 + l3 + 2*l2 + 2)>>3;
  107. src[2+0*stride]=
  108. src[1+1*stride]=
  109. src[0+2*stride]=(t2 + t4 + 2*t3 + 2 + l2 + 3*l3 + 2)>>3;
  110. src[3+0*stride]=
  111. src[2+1*stride]=
  112. src[1+2*stride]=
  113. src[0+3*stride]=(t3 + t5 + 2*t4 + 2 + l3*4 + 2)>>3;
  114. src[3+1*stride]=
  115. src[2+2*stride]=
  116. src[1+3*stride]=(t4 + t6 + 2*t5 + 2 + l3*4 + 2)>>3;
  117. src[3+2*stride]=
  118. src[2+3*stride]=(t5 + t7 + 2*t6 + 2 + l3*4 + 2)>>3;
  119. src[3+3*stride]=(t6 + t7 + 1 + 2*l3 + 1)>>2;
  120. }
  121. static void pred4x4_vertical_left_rv40(uint8_t *src, const uint8_t *topright, int stride,
  122. const int l0, const int l1, const int l2, const int l3, const int l4){
  123. LOAD_TOP_EDGE
  124. LOAD_TOP_RIGHT_EDGE
  125. src[0+0*stride]=(2*t0 + 2*t1 + l1 + 2*l2 + l3 + 4)>>3;
  126. src[1+0*stride]=
  127. src[0+2*stride]=(t1 + t2 + 1)>>1;
  128. src[2+0*stride]=
  129. src[1+2*stride]=(t2 + t3 + 1)>>1;
  130. src[3+0*stride]=
  131. src[2+2*stride]=(t3 + t4+ 1)>>1;
  132. src[3+2*stride]=(t4 + t5+ 1)>>1;
  133. src[0+1*stride]=(t0 + 2*t1 + t2 + l2 + 2*l3 + l4 + 4)>>3;
  134. src[1+1*stride]=
  135. src[0+3*stride]=(t1 + 2*t2 + t3 + 2)>>2;
  136. src[2+1*stride]=
  137. src[1+3*stride]=(t2 + 2*t3 + t4 + 2)>>2;
  138. src[3+1*stride]=
  139. src[2+3*stride]=(t3 + 2*t4 + t5 + 2)>>2;
  140. src[3+3*stride]=(t4 + 2*t5 + t6 + 2)>>2;
  141. }
  142. static void pred4x4_vertical_left_rv40_c(uint8_t *src, const uint8_t *topright, int stride){
  143. LOAD_LEFT_EDGE
  144. LOAD_DOWN_LEFT_EDGE
  145. pred4x4_vertical_left_rv40(src, topright, stride, l0, l1, l2, l3, l4);
  146. }
  147. static void pred4x4_vertical_left_rv40_nodown_c(uint8_t *src, const uint8_t *topright, int stride){
  148. LOAD_LEFT_EDGE
  149. pred4x4_vertical_left_rv40(src, topright, stride, l0, l1, l2, l3, l3);
  150. }
  151. static void pred4x4_vertical_left_vp8_c(uint8_t *src, const uint8_t *topright, int stride){
  152. LOAD_TOP_EDGE
  153. LOAD_TOP_RIGHT_EDGE
  154. src[0+0*stride]=(t0 + t1 + 1)>>1;
  155. src[1+0*stride]=
  156. src[0+2*stride]=(t1 + t2 + 1)>>1;
  157. src[2+0*stride]=
  158. src[1+2*stride]=(t2 + t3 + 1)>>1;
  159. src[3+0*stride]=
  160. src[2+2*stride]=(t3 + t4 + 1)>>1;
  161. src[0+1*stride]=(t0 + 2*t1 + t2 + 2)>>2;
  162. src[1+1*stride]=
  163. src[0+3*stride]=(t1 + 2*t2 + t3 + 2)>>2;
  164. src[2+1*stride]=
  165. src[1+3*stride]=(t2 + 2*t3 + t4 + 2)>>2;
  166. src[3+1*stride]=
  167. src[2+3*stride]=(t3 + 2*t4 + t5 + 2)>>2;
  168. src[3+2*stride]=(t4 + 2*t5 + t6 + 2)>>2;
  169. src[3+3*stride]=(t5 + 2*t6 + t7 + 2)>>2;
  170. }
  171. static void pred4x4_horizontal_up_rv40_c(uint8_t *src, const uint8_t *topright, int stride){
  172. LOAD_LEFT_EDGE
  173. LOAD_DOWN_LEFT_EDGE
  174. LOAD_TOP_EDGE
  175. LOAD_TOP_RIGHT_EDGE
  176. src[0+0*stride]=(t1 + 2*t2 + t3 + 2*l0 + 2*l1 + 4)>>3;
  177. src[1+0*stride]=(t2 + 2*t3 + t4 + l0 + 2*l1 + l2 + 4)>>3;
  178. src[2+0*stride]=
  179. src[0+1*stride]=(t3 + 2*t4 + t5 + 2*l1 + 2*l2 + 4)>>3;
  180. src[3+0*stride]=
  181. src[1+1*stride]=(t4 + 2*t5 + t6 + l1 + 2*l2 + l3 + 4)>>3;
  182. src[2+1*stride]=
  183. src[0+2*stride]=(t5 + 2*t6 + t7 + 2*l2 + 2*l3 + 4)>>3;
  184. src[3+1*stride]=
  185. src[1+2*stride]=(t6 + 3*t7 + l2 + 3*l3 + 4)>>3;
  186. src[3+2*stride]=
  187. src[1+3*stride]=(l3 + 2*l4 + l5 + 2)>>2;
  188. src[0+3*stride]=
  189. src[2+2*stride]=(t6 + t7 + l3 + l4 + 2)>>2;
  190. src[2+3*stride]=(l4 + l5 + 1)>>1;
  191. src[3+3*stride]=(l4 + 2*l5 + l6 + 2)>>2;
  192. }
  193. static void pred4x4_horizontal_up_rv40_nodown_c(uint8_t *src, const uint8_t *topright, int stride){
  194. LOAD_LEFT_EDGE
  195. LOAD_TOP_EDGE
  196. LOAD_TOP_RIGHT_EDGE
  197. src[0+0*stride]=(t1 + 2*t2 + t3 + 2*l0 + 2*l1 + 4)>>3;
  198. src[1+0*stride]=(t2 + 2*t3 + t4 + l0 + 2*l1 + l2 + 4)>>3;
  199. src[2+0*stride]=
  200. src[0+1*stride]=(t3 + 2*t4 + t5 + 2*l1 + 2*l2 + 4)>>3;
  201. src[3+0*stride]=
  202. src[1+1*stride]=(t4 + 2*t5 + t6 + l1 + 2*l2 + l3 + 4)>>3;
  203. src[2+1*stride]=
  204. src[0+2*stride]=(t5 + 2*t6 + t7 + 2*l2 + 2*l3 + 4)>>3;
  205. src[3+1*stride]=
  206. src[1+2*stride]=(t6 + 3*t7 + l2 + 3*l3 + 4)>>3;
  207. src[3+2*stride]=
  208. src[1+3*stride]=l3;
  209. src[0+3*stride]=
  210. src[2+2*stride]=(t6 + t7 + 2*l3 + 2)>>2;
  211. src[2+3*stride]=
  212. src[3+3*stride]=l3;
  213. }
  214. static void pred4x4_tm_vp8_c(uint8_t *src, const uint8_t *topright, int stride){
  215. uint8_t *cm = ff_cropTbl + MAX_NEG_CROP - src[-1-stride];
  216. uint8_t *top = src-stride;
  217. int y;
  218. for (y = 0; y < 4; y++) {
  219. uint8_t *cm_in = cm + src[-1];
  220. src[0] = cm_in[top[0]];
  221. src[1] = cm_in[top[1]];
  222. src[2] = cm_in[top[2]];
  223. src[3] = cm_in[top[3]];
  224. src += stride;
  225. }
  226. }
  227. static void pred16x16_plane_svq3_c(uint8_t *src, int stride){
  228. pred16x16_plane_compat_8_c(src, stride, 1, 0);
  229. }
  230. static void pred16x16_plane_rv40_c(uint8_t *src, int stride){
  231. pred16x16_plane_compat_8_c(src, stride, 0, 1);
  232. }
  233. static void pred16x16_tm_vp8_c(uint8_t *src, int stride){
  234. uint8_t *cm = ff_cropTbl + MAX_NEG_CROP - src[-1-stride];
  235. uint8_t *top = src-stride;
  236. int y;
  237. for (y = 0; y < 16; y++) {
  238. uint8_t *cm_in = cm + src[-1];
  239. src[0] = cm_in[top[0]];
  240. src[1] = cm_in[top[1]];
  241. src[2] = cm_in[top[2]];
  242. src[3] = cm_in[top[3]];
  243. src[4] = cm_in[top[4]];
  244. src[5] = cm_in[top[5]];
  245. src[6] = cm_in[top[6]];
  246. src[7] = cm_in[top[7]];
  247. src[8] = cm_in[top[8]];
  248. src[9] = cm_in[top[9]];
  249. src[10] = cm_in[top[10]];
  250. src[11] = cm_in[top[11]];
  251. src[12] = cm_in[top[12]];
  252. src[13] = cm_in[top[13]];
  253. src[14] = cm_in[top[14]];
  254. src[15] = cm_in[top[15]];
  255. src += stride;
  256. }
  257. }
  258. static void pred8x8_left_dc_rv40_c(uint8_t *src, int stride){
  259. int i;
  260. unsigned dc0;
  261. dc0=0;
  262. for(i=0;i<8; i++)
  263. dc0+= src[-1+i*stride];
  264. dc0= 0x01010101*((dc0 + 4)>>3);
  265. for(i=0; i<8; i++){
  266. ((uint32_t*)(src+i*stride))[0]=
  267. ((uint32_t*)(src+i*stride))[1]= dc0;
  268. }
  269. }
  270. static void pred8x8_top_dc_rv40_c(uint8_t *src, int stride){
  271. int i;
  272. unsigned dc0;
  273. dc0=0;
  274. for(i=0;i<8; i++)
  275. dc0+= src[i-stride];
  276. dc0= 0x01010101*((dc0 + 4)>>3);
  277. for(i=0; i<8; i++){
  278. ((uint32_t*)(src+i*stride))[0]=
  279. ((uint32_t*)(src+i*stride))[1]= dc0;
  280. }
  281. }
  282. static void pred8x8_dc_rv40_c(uint8_t *src, int stride){
  283. int i;
  284. unsigned dc0 = 0;
  285. for(i=0;i<4; i++){
  286. dc0+= src[-1+i*stride] + src[i-stride];
  287. dc0+= src[4+i-stride];
  288. dc0+= src[-1+(i+4)*stride];
  289. }
  290. dc0= 0x01010101*((dc0 + 8)>>4);
  291. for(i=0; i<4; i++){
  292. ((uint32_t*)(src+i*stride))[0]= dc0;
  293. ((uint32_t*)(src+i*stride))[1]= dc0;
  294. }
  295. for(i=4; i<8; i++){
  296. ((uint32_t*)(src+i*stride))[0]= dc0;
  297. ((uint32_t*)(src+i*stride))[1]= dc0;
  298. }
  299. }
  300. static void pred8x8_tm_vp8_c(uint8_t *src, int stride){
  301. uint8_t *cm = ff_cropTbl + MAX_NEG_CROP - src[-1-stride];
  302. uint8_t *top = src-stride;
  303. int y;
  304. for (y = 0; y < 8; y++) {
  305. uint8_t *cm_in = cm + src[-1];
  306. src[0] = cm_in[top[0]];
  307. src[1] = cm_in[top[1]];
  308. src[2] = cm_in[top[2]];
  309. src[3] = cm_in[top[3]];
  310. src[4] = cm_in[top[4]];
  311. src[5] = cm_in[top[5]];
  312. src[6] = cm_in[top[6]];
  313. src[7] = cm_in[top[7]];
  314. src += stride;
  315. }
  316. }
  317. /**
  318. * Set the intra prediction function pointers.
  319. */
  320. void ff_h264_pred_init(H264PredContext *h, int codec_id, const int bit_depth, const int chroma_format_idc){
  321. // MpegEncContext * const s = &h->s;
  322. #undef FUNC
  323. #undef FUNCC
  324. #define FUNC(a, depth) a ## _ ## depth
  325. #define FUNCC(a, depth) a ## _ ## depth ## _c
  326. #define FUNCD(a) a ## _c
  327. #define H264_PRED(depth) \
  328. if(codec_id != CODEC_ID_RV40){\
  329. if(codec_id == CODEC_ID_VP8) {\
  330. h->pred4x4[VERT_PRED ]= FUNCD(pred4x4_vertical_vp8);\
  331. h->pred4x4[HOR_PRED ]= FUNCD(pred4x4_horizontal_vp8);\
  332. } else {\
  333. h->pred4x4[VERT_PRED ]= FUNCC(pred4x4_vertical , depth);\
  334. h->pred4x4[HOR_PRED ]= FUNCC(pred4x4_horizontal , depth);\
  335. }\
  336. h->pred4x4[DC_PRED ]= FUNCC(pred4x4_dc , depth);\
  337. if(codec_id == CODEC_ID_SVQ3)\
  338. h->pred4x4[DIAG_DOWN_LEFT_PRED ]= FUNCD(pred4x4_down_left_svq3);\
  339. else\
  340. h->pred4x4[DIAG_DOWN_LEFT_PRED ]= FUNCC(pred4x4_down_left , depth);\
  341. h->pred4x4[DIAG_DOWN_RIGHT_PRED]= FUNCC(pred4x4_down_right , depth);\
  342. h->pred4x4[VERT_RIGHT_PRED ]= FUNCC(pred4x4_vertical_right , depth);\
  343. h->pred4x4[HOR_DOWN_PRED ]= FUNCC(pred4x4_horizontal_down , depth);\
  344. if (codec_id == CODEC_ID_VP8) {\
  345. h->pred4x4[VERT_LEFT_PRED ]= FUNCD(pred4x4_vertical_left_vp8);\
  346. } else\
  347. h->pred4x4[VERT_LEFT_PRED ]= FUNCC(pred4x4_vertical_left , depth);\
  348. h->pred4x4[HOR_UP_PRED ]= FUNCC(pred4x4_horizontal_up , depth);\
  349. if(codec_id != CODEC_ID_VP8) {\
  350. h->pred4x4[LEFT_DC_PRED ]= FUNCC(pred4x4_left_dc , depth);\
  351. h->pred4x4[TOP_DC_PRED ]= FUNCC(pred4x4_top_dc , depth);\
  352. h->pred4x4[DC_128_PRED ]= FUNCC(pred4x4_128_dc , depth);\
  353. } else {\
  354. h->pred4x4[TM_VP8_PRED ]= FUNCD(pred4x4_tm_vp8);\
  355. h->pred4x4[DC_127_PRED ]= FUNCC(pred4x4_127_dc , depth);\
  356. h->pred4x4[DC_129_PRED ]= FUNCC(pred4x4_129_dc , depth);\
  357. h->pred4x4[VERT_VP8_PRED ]= FUNCC(pred4x4_vertical , depth);\
  358. h->pred4x4[HOR_VP8_PRED ]= FUNCC(pred4x4_horizontal , depth);\
  359. }\
  360. }else{\
  361. h->pred4x4[VERT_PRED ]= FUNCC(pred4x4_vertical , depth);\
  362. h->pred4x4[HOR_PRED ]= FUNCC(pred4x4_horizontal , depth);\
  363. h->pred4x4[DC_PRED ]= FUNCC(pred4x4_dc , depth);\
  364. h->pred4x4[DIAG_DOWN_LEFT_PRED ]= FUNCD(pred4x4_down_left_rv40);\
  365. h->pred4x4[DIAG_DOWN_RIGHT_PRED]= FUNCC(pred4x4_down_right , depth);\
  366. h->pred4x4[VERT_RIGHT_PRED ]= FUNCC(pred4x4_vertical_right , depth);\
  367. h->pred4x4[HOR_DOWN_PRED ]= FUNCC(pred4x4_horizontal_down , depth);\
  368. h->pred4x4[VERT_LEFT_PRED ]= FUNCD(pred4x4_vertical_left_rv40);\
  369. h->pred4x4[HOR_UP_PRED ]= FUNCD(pred4x4_horizontal_up_rv40);\
  370. h->pred4x4[LEFT_DC_PRED ]= FUNCC(pred4x4_left_dc , depth);\
  371. h->pred4x4[TOP_DC_PRED ]= FUNCC(pred4x4_top_dc , depth);\
  372. h->pred4x4[DC_128_PRED ]= FUNCC(pred4x4_128_dc , depth);\
  373. h->pred4x4[DIAG_DOWN_LEFT_PRED_RV40_NODOWN]= FUNCD(pred4x4_down_left_rv40_nodown);\
  374. h->pred4x4[HOR_UP_PRED_RV40_NODOWN]= FUNCD(pred4x4_horizontal_up_rv40_nodown);\
  375. h->pred4x4[VERT_LEFT_PRED_RV40_NODOWN]= FUNCD(pred4x4_vertical_left_rv40_nodown);\
  376. }\
  377. \
  378. h->pred8x8l[VERT_PRED ]= FUNCC(pred8x8l_vertical , depth);\
  379. h->pred8x8l[HOR_PRED ]= FUNCC(pred8x8l_horizontal , depth);\
  380. h->pred8x8l[DC_PRED ]= FUNCC(pred8x8l_dc , depth);\
  381. h->pred8x8l[DIAG_DOWN_LEFT_PRED ]= FUNCC(pred8x8l_down_left , depth);\
  382. h->pred8x8l[DIAG_DOWN_RIGHT_PRED]= FUNCC(pred8x8l_down_right , depth);\
  383. h->pred8x8l[VERT_RIGHT_PRED ]= FUNCC(pred8x8l_vertical_right , depth);\
  384. h->pred8x8l[HOR_DOWN_PRED ]= FUNCC(pred8x8l_horizontal_down , depth);\
  385. h->pred8x8l[VERT_LEFT_PRED ]= FUNCC(pred8x8l_vertical_left , depth);\
  386. h->pred8x8l[HOR_UP_PRED ]= FUNCC(pred8x8l_horizontal_up , depth);\
  387. h->pred8x8l[LEFT_DC_PRED ]= FUNCC(pred8x8l_left_dc , depth);\
  388. h->pred8x8l[TOP_DC_PRED ]= FUNCC(pred8x8l_top_dc , depth);\
  389. h->pred8x8l[DC_128_PRED ]= FUNCC(pred8x8l_128_dc , depth);\
  390. \
  391. if (chroma_format_idc == 1) {\
  392. h->pred8x8[VERT_PRED8x8 ]= FUNCC(pred8x8_vertical , depth);\
  393. h->pred8x8[HOR_PRED8x8 ]= FUNCC(pred8x8_horizontal , depth);\
  394. } else {\
  395. h->pred8x8[VERT_PRED8x8 ]= FUNCC(pred8x16_vertical , depth);\
  396. h->pred8x8[HOR_PRED8x8 ]= FUNCC(pred8x16_horizontal , depth);\
  397. }\
  398. if (codec_id != CODEC_ID_VP8) {\
  399. if (chroma_format_idc == 1) {\
  400. h->pred8x8[PLANE_PRED8x8]= FUNCC(pred8x8_plane , depth);\
  401. } else {\
  402. h->pred8x8[PLANE_PRED8x8]= FUNCC(pred8x16_plane , depth);\
  403. }\
  404. } else\
  405. h->pred8x8[PLANE_PRED8x8]= FUNCD(pred8x8_tm_vp8);\
  406. if(codec_id != CODEC_ID_RV40 && codec_id != CODEC_ID_VP8){\
  407. if (chroma_format_idc == 1) {\
  408. h->pred8x8[DC_PRED8x8 ]= FUNCC(pred8x8_dc , depth);\
  409. h->pred8x8[LEFT_DC_PRED8x8]= FUNCC(pred8x8_left_dc , depth);\
  410. h->pred8x8[TOP_DC_PRED8x8 ]= FUNCC(pred8x8_top_dc , depth);\
  411. h->pred8x8[ALZHEIMER_DC_L0T_PRED8x8 ]= FUNC(pred8x8_mad_cow_dc_l0t, depth);\
  412. h->pred8x8[ALZHEIMER_DC_0LT_PRED8x8 ]= FUNC(pred8x8_mad_cow_dc_0lt, depth);\
  413. h->pred8x8[ALZHEIMER_DC_L00_PRED8x8 ]= FUNC(pred8x8_mad_cow_dc_l00, depth);\
  414. h->pred8x8[ALZHEIMER_DC_0L0_PRED8x8 ]= FUNC(pred8x8_mad_cow_dc_0l0, depth);\
  415. } else {\
  416. h->pred8x8[DC_PRED8x8 ]= FUNCC(pred8x16_dc , depth);\
  417. h->pred8x8[LEFT_DC_PRED8x8]= FUNCC(pred8x16_left_dc , depth);\
  418. h->pred8x8[TOP_DC_PRED8x8 ]= FUNCC(pred8x16_top_dc , depth);\
  419. h->pred8x8[ALZHEIMER_DC_L0T_PRED8x8 ]= FUNC(pred8x16_mad_cow_dc_l0t, depth);\
  420. h->pred8x8[ALZHEIMER_DC_0LT_PRED8x8 ]= FUNC(pred8x16_mad_cow_dc_0lt, depth);\
  421. h->pred8x8[ALZHEIMER_DC_L00_PRED8x8 ]= FUNC(pred8x16_mad_cow_dc_l00, depth);\
  422. h->pred8x8[ALZHEIMER_DC_0L0_PRED8x8 ]= FUNC(pred8x16_mad_cow_dc_0l0, depth);\
  423. }\
  424. }else{\
  425. h->pred8x8[DC_PRED8x8 ]= FUNCD(pred8x8_dc_rv40);\
  426. h->pred8x8[LEFT_DC_PRED8x8]= FUNCD(pred8x8_left_dc_rv40);\
  427. h->pred8x8[TOP_DC_PRED8x8 ]= FUNCD(pred8x8_top_dc_rv40);\
  428. if (codec_id == CODEC_ID_VP8) {\
  429. h->pred8x8[DC_127_PRED8x8]= FUNCC(pred8x8_127_dc , depth);\
  430. h->pred8x8[DC_129_PRED8x8]= FUNCC(pred8x8_129_dc , depth);\
  431. }\
  432. }\
  433. if (chroma_format_idc == 1) {\
  434. h->pred8x8[DC_128_PRED8x8 ]= FUNCC(pred8x8_128_dc , depth);\
  435. } else {\
  436. h->pred8x8[DC_128_PRED8x8 ]= FUNCC(pred8x16_128_dc , depth);\
  437. }\
  438. \
  439. h->pred16x16[DC_PRED8x8 ]= FUNCC(pred16x16_dc , depth);\
  440. h->pred16x16[VERT_PRED8x8 ]= FUNCC(pred16x16_vertical , depth);\
  441. h->pred16x16[HOR_PRED8x8 ]= FUNCC(pred16x16_horizontal , depth);\
  442. switch(codec_id){\
  443. case CODEC_ID_SVQ3:\
  444. h->pred16x16[PLANE_PRED8x8 ]= FUNCD(pred16x16_plane_svq3);\
  445. break;\
  446. case CODEC_ID_RV40:\
  447. h->pred16x16[PLANE_PRED8x8 ]= FUNCD(pred16x16_plane_rv40);\
  448. break;\
  449. case CODEC_ID_VP8:\
  450. h->pred16x16[PLANE_PRED8x8 ]= FUNCD(pred16x16_tm_vp8);\
  451. h->pred16x16[DC_127_PRED8x8]= FUNCC(pred16x16_127_dc , depth);\
  452. h->pred16x16[DC_129_PRED8x8]= FUNCC(pred16x16_129_dc , depth);\
  453. break;\
  454. default:\
  455. h->pred16x16[PLANE_PRED8x8 ]= FUNCC(pred16x16_plane , depth);\
  456. break;\
  457. }\
  458. h->pred16x16[LEFT_DC_PRED8x8]= FUNCC(pred16x16_left_dc , depth);\
  459. h->pred16x16[TOP_DC_PRED8x8 ]= FUNCC(pred16x16_top_dc , depth);\
  460. h->pred16x16[DC_128_PRED8x8 ]= FUNCC(pred16x16_128_dc , depth);\
  461. \
  462. /* special lossless h/v prediction for h264 */ \
  463. h->pred4x4_add [VERT_PRED ]= FUNCC(pred4x4_vertical_add , depth);\
  464. h->pred4x4_add [ HOR_PRED ]= FUNCC(pred4x4_horizontal_add , depth);\
  465. h->pred8x8l_add [VERT_PRED ]= FUNCC(pred8x8l_vertical_add , depth);\
  466. h->pred8x8l_add [ HOR_PRED ]= FUNCC(pred8x8l_horizontal_add , depth);\
  467. if (chroma_format_idc == 1) {\
  468. h->pred8x8_add [VERT_PRED8x8]= FUNCC(pred8x8_vertical_add , depth);\
  469. h->pred8x8_add [ HOR_PRED8x8]= FUNCC(pred8x8_horizontal_add , depth);\
  470. } else {\
  471. h->pred8x8_add [VERT_PRED8x8]= FUNCC(pred8x16_vertical_add , depth);\
  472. h->pred8x8_add [ HOR_PRED8x8]= FUNCC(pred8x16_horizontal_add , depth);\
  473. }\
  474. h->pred16x16_add[VERT_PRED8x8]= FUNCC(pred16x16_vertical_add , depth);\
  475. h->pred16x16_add[ HOR_PRED8x8]= FUNCC(pred16x16_horizontal_add , depth);\
  476. switch (bit_depth) {
  477. case 9:
  478. H264_PRED(9)
  479. break;
  480. case 10:
  481. H264_PRED(10)
  482. break;
  483. default:
  484. av_assert0(bit_depth<=8);
  485. H264_PRED(8)
  486. break;
  487. }
  488. if (ARCH_ARM) ff_h264_pred_init_arm(h, codec_id, bit_depth, chroma_format_idc);
  489. if (HAVE_MMX) ff_h264_pred_init_x86(h, codec_id, bit_depth, chroma_format_idc);
  490. }