dec_cabac.c
上传用户:sunbaby
上传日期:2013-05-31
资源大小:242k
文件大小:41k
源码类别:

mpeg/mp3

开发平台:

Visual C++

  1. /*****************************************************************************
  2. *
  3. *  T264 AVC CODEC
  4. *
  5. *  Copyright(C) 2004-2005 joylife <joylife_video@yahoo.com.cn>
  6. * 2004-2005 tricro <tricro@hotmail.com>
  7. *
  8. *  This program is free software ; you can redistribute it and/or modify
  9. *  it under the terms of the GNU General Public License as published by
  10. *  the Free Software Foundation ; either version 2 of the License, or
  11. *  (at your option) any later version.
  12. *
  13. *  This program is distributed in the hope that it will be useful,
  14. *  but WITHOUT ANY WARRANTY ; without even the implied warranty of
  15. *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. *  GNU General Public License for more details.
  17. *
  18. *  You should have received a copy of the GNU General Public License
  19. *  along with this program ; if not, write to the Free Software
  20. *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  21. *
  22. ****************************************************************************/
  23. /*****************************************************************************
  24. * cabac.c: h264 encoder library
  25. *****************************************************************************
  26. * Copyright (C) 2003 Laurent Aimar
  27. *
  28. * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  29. *
  30. * This program is free software; you can redistribute it and/or modify
  31. * it under the terms of the GNU General Public License as published by
  32. * the Free Software Foundation; either version 2 of the License, or
  33. * (at your option) any later version.
  34. *
  35. * This program is distributed in the hope that it will be useful,
  36. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  37. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  38. * GNU General Public License for more details.
  39. *
  40. * You should have received a copy of the GNU General Public License
  41. * along with this program; if not, write to the Free Software
  42. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  43. *****************************************************************************/
  44. /*Note: the CABAC routine is currently referenced from x264 temporarily, with adaptation to 
  45. *the data structure of T264. It should be modified further in the near future.
  46. *It's can support B slice, but now only the baseline options is tested
  47. */
  48. #include <stdlib.h>
  49. #include <stdio.h>
  50. #include <string.h>
  51. #include <assert.h>
  52. #include "T264.h"
  53. #include "cabac_engine.h"
  54. #include "inter.h"
  55. #include "utility.h"
  56. #include "inter_b.h"
  57. /* From ffmpeg
  58. */
  59. #define T264_SCAN8_SIZE (6*8)
  60. #define T264_SCAN8_0 (4+1*8)
  61. static const int T264_scan8[16+2*4] =
  62. {
  63. /* Luma */
  64. VEC_LUMA + 0, VEC_LUMA + 1, VEC_LUMA + 1*8 + 0, VEC_LUMA + 1*8 + 1,
  65. VEC_LUMA + 2, VEC_LUMA + 3, VEC_LUMA + 1*8 + 2, VEC_LUMA + 1*8 + 3,
  66. VEC_LUMA + 2*8 + 0, VEC_LUMA + 2*8 + 1, VEC_LUMA + 3*8 + 0, VEC_LUMA + 3*8 + 1,
  67. VEC_LUMA + 2*8 + 2, VEC_LUMA + 2*8 + 3, VEC_LUMA + 3*8 + 2, VEC_LUMA + 3*8 + 3,
  68. /* Cb */
  69. NNZ_CHROMA0 + 0, NNZ_CHROMA0 + 1,
  70. NNZ_CHROMA0 + 1*8 + 0, NNZ_CHROMA0 + 1*8 + 1,
  71. /* Cr */
  72. NNZ_CHROMA1 + 0, NNZ_CHROMA1 + 1,
  73. NNZ_CHROMA1 + 1*8 + 0, NNZ_CHROMA1 + 1*8 + 1,
  74. };
  75. static const uint8_t block_idx_xy[4][4] =
  76. {
  77. { 0, 2, 8,  10},
  78. { 1, 3, 9,  11},
  79. { 4, 6, 12, 14},
  80. { 5, 7, 13, 15}
  81. };
  82. #define IS_INTRA(mode) (mode == I_4x4 || mode == I_16x16)
  83. #define IS_SKIP(type)  ( (type) == P_SKIP || (type) == B_SKIP )
  84. enum {
  85. INTRA_4x4           = 0,
  86. INTRA_16x16         = 1,
  87. INTRA_PCM           = 2,
  88. P_L0            = 3,
  89. P_8x81          = 4,
  90. P_SKIP1         = 5,
  91. B_DIRECT        = 6,
  92. B_L0_L0         = 7,
  93. B_L0_L1         = 8,
  94. B_L0_BI         = 9,
  95. B_L1_L0         = 10,
  96. B_L1_L1         = 11,
  97. B_L1_BI         = 12,
  98. B_BI_L0         = 13,
  99. B_BI_L1         = 14,
  100. B_BI_BI         = 15,
  101. B_8x81          = 16,
  102. B_SKIP1         = 17,
  103. };
  104. static const int T264_mb_type_list0_table[18][2] =
  105. {
  106. {0,0}, {0,0}, {0,0},    /* INTRA */
  107. {1,1},                  /* P_L0 */
  108. {0,0},                  /* P_8x8 */
  109. {1,1},                  /* P_SKIP */
  110. {0,0},                  /* B_DIRECT */
  111. {1,1}, {1,0}, {1,1},    /* B_L0_* */
  112. {0,1}, {0,0}, {0,1},    /* B_L1_* */
  113. {1,1}, {1,0}, {1,1},    /* B_BI_* */
  114. {0,0},                  /* B_8x8 */
  115. {0,0}                   /* B_SKIP */
  116. };
  117. static const int T264_mb_type_list1_table[18][2] =
  118. {
  119. {0,0}, {0,0}, {0,0},    /* INTRA */
  120. {0,0},                  /* P_L0 */
  121. {0,0},                  /* P_8x8 */
  122. {0,0},                  /* P_SKIP */
  123. {0,0},                  /* B_DIRECT */
  124. {0,0}, {0,1}, {0,1},    /* B_L0_* */
  125. {1,0}, {1,1}, {1,1},    /* B_L1_* */
  126. {1,0}, {1,1}, {1,1},    /* B_BI_* */
  127. {0,0},                  /* B_8x8 */
  128. {0,0}                   /* B_SKIP */
  129. };
  130. static const int T264_mb_partition_listX_table[][2] = 
  131. {
  132. {0, 0}, //B_DIRECT_8x8 = 100,
  133. {1, 0}, //B_L0_8x8,
  134. {0, 1}, //B_L1_8x8,
  135. {1, 1}, //B_Bi_8x8,
  136. {1, 0}, //B_L0_8x4,
  137. {1, 0}, //B_L0_4x8,
  138. {0, 1}, //B_L1_8x4,
  139. {0, 1}, //B_L1_4x8,
  140. {1, 1}, //B_Bi_8x4,
  141. {1, 1}, //B_Bi_4x8,
  142. {1, 0}, //B_L0_4x4,
  143. {0, 1}, //B_L1_4x4,
  144. {1, 1} //B_Bi_4x4
  145. };
  146. static const int T264_map_btype_mbpart[] = 
  147. {
  148. MB_8x8, //B_DIRECT_8x8 = 100,
  149. MB_8x8, //B_L0_8x8,
  150. MB_8x8, //B_L1_8x8,
  151. MB_8x8, //B_Bi_8x8,
  152. MB_8x4, //B_L0_8x4,
  153. MB_4x8, //B_L0_4x8,
  154. MB_8x4, //B_L1_8x4,
  155. MB_4x8, //B_L1_4x8,
  156. MB_8x4, //B_Bi_8x4,
  157. MB_4x8, //B_Bi_4x8,
  158. MB_4x4, //B_L0_4x4,
  159. MB_4x4, //B_L1_4x4,
  160. MB_4x4 //B_Bi_4x4
  161. };
  162. static void T264_cabac_mb_type( T264_t *t )
  163. {
  164. int act_sym, mode_sym, sym, sym1, sym2;
  165. T264_mb_context_t *mb_ctxs = &(t->rec->mb[0]);
  166. int32_t mb_mode;
  167. if( t->slice_type == SLICE_I )
  168. {
  169. int ctx = 0;
  170. if( t->mb.mb_x > 0 && mb_ctxs[t->mb.mb_xy-1].mb_mode != I_4x4 )
  171. {
  172. ctx++;
  173. }
  174. if( t->mb.mb_y > 0 && mb_ctxs[t->mb.mb_xy - t->mb_stride].mb_mode != I_4x4 )
  175. {
  176. ctx++;
  177. }
  178. act_sym = T264_cabac_decode_decision(&t->cabac, 3+ctx);
  179. if(act_sym == 0)
  180. {
  181. mb_mode = I_4x4;
  182. }
  183. else
  184. {
  185. mode_sym = T264_cabac_decode_terminal(&t->cabac);
  186. if(mode_sym == 0) /*I_16x16*/
  187. {
  188. mb_mode = I_16x16;
  189. t->mb.cbp_y = T264_cabac_decode_decision(&t->cabac, 3+3);
  190. sym = T264_cabac_decode_decision(&t->cabac, 3+4);
  191. if(sym == 0)
  192. {
  193. t->mb.cbp_c = 0;
  194. }
  195. else
  196. {
  197. sym = T264_cabac_decode_decision(&t->cabac, 3+5);
  198. t->mb.cbp_c = (sym==0)?1:2;
  199. }
  200. sym1 = T264_cabac_decode_decision(&t->cabac, 3+6);
  201. sym2 = T264_cabac_decode_decision(&t->cabac, 3+7);
  202. t->mb.mode_i16x16 = (sym1<<1)|sym2;
  203. }
  204. else
  205. {
  206. //I_PCM
  207. }
  208. }
  209. }
  210. else if( t->slice_type == SLICE_P )
  211. {
  212. /* prefix: 14, suffix: 17 */
  213. int ctx = 0;
  214. act_sym = T264_cabac_decode_decision(&t->cabac, 14);
  215. if(act_sym == 0)
  216. {
  217. //P_MODE
  218. static int mb_part_map[] = {MB_16x16, MB_8x8, MB_8x16, MB_16x8};
  219. mb_mode = P_MODE;
  220. sym1 = T264_cabac_decode_decision(&t->cabac, 15);
  221. ctx = (sym1==0)?16:17;
  222. sym2 = T264_cabac_decode_decision(&t->cabac, ctx);
  223. sym = (sym1<<1)|sym2;
  224. t->mb.mb_part = mb_part_map[sym];
  225. }
  226. else
  227. {
  228. mode_sym = T264_cabac_decode_decision(&t->cabac, 17);
  229. if(mode_sym == 0)
  230. {
  231. mb_mode = I_4x4;
  232. }
  233. else
  234. {
  235. sym = T264_cabac_decode_terminal(&t->cabac);
  236. if(sym == 0)
  237. {
  238. //I_16x16
  239. mb_mode = I_16x16;
  240. t->mb.cbp_y = T264_cabac_decode_decision(&t->cabac, 17+1);
  241. sym1 = T264_cabac_decode_decision(&t->cabac, 17+2);
  242. if(sym1 == 0)
  243. {
  244. t->mb.cbp_c = 0;
  245. }
  246. else
  247. {
  248. sym2 = T264_cabac_decode_decision(&t->cabac, 17+2);
  249. t->mb.cbp_c = (sym2==0)?1:2;
  250. }
  251. sym1 = T264_cabac_decode_decision(&t->cabac, 17+3);
  252. sym2 = T264_cabac_decode_decision(&t->cabac, 17+3);
  253. t->mb.mode_i16x16 = (sym1<<1)|sym2;
  254. }
  255. else
  256. {
  257. //I_PCM
  258. }
  259. }
  260. }
  261. }
  262. else if( t->slice_type == SLICE_B )
  263. {
  264. int ctx = 0;
  265. int idx;
  266. if( t->mb.mb_x > 0 && mb_ctxs[t->mb.mb_xy-1].mb_mode != B_SKIP && !mb_ctxs[t->mb.mb_xy-1].is_copy )
  267. {
  268. ctx++;
  269. }
  270. if( t->mb.mb_y > 0 && mb_ctxs[t->mb.mb_xy - t->mb_stride].mb_mode != B_SKIP && ! mb_ctxs[t->mb.mb_xy - t->mb_stride].is_copy)
  271. {
  272. ctx++;
  273. }
  274. sym = T264_cabac_decode_decision(&t->cabac, 27+ctx);
  275. if(sym == 0)
  276. {
  277. t->mb.is_copy = 1;
  278. t->mb.mb_part = MB_16x16;
  279. mb_mode = B_MODE;
  280. }
  281. else
  282. {
  283. t->mb.is_copy = 0;
  284. sym1 = T264_cabac_decode_decision(&t->cabac, 27+3);
  285. if(sym1 == 0)
  286. {
  287. sym2 = T264_cabac_decode_decision(&t->cabac, 27+5);
  288. mb_mode = B_MODE;
  289. t->mb.mb_part = MB_16x16;
  290. t->mb.mb_part2[0] = (sym2==0)?B_L0_16x16:B_L1_16x16;
  291. }
  292. else
  293. {
  294. sym2 = T264_cabac_decode_decision(&t->cabac, 27+4);
  295. if(sym2 == 0)
  296. {
  297. static const int mb_bits_2_part0[] = {
  298. MB_16x16, MB_16x8, MB_8x16, MB_16x8, MB_8x16,
  299. MB_16x8, MB_8x16, MB_16x8
  300. };
  301. static const int mb_bits_2_part20[][2] = {
  302. {B_Bi_16x16, B_Bi_16x16}, 
  303. {B_L0_16x8, B_L0_16x8}, {B_L0_8x16, B_L0_8x16},
  304. {B_L1_16x8, B_L1_16x8}, {B_L1_8x16, B_L1_8x16},
  305. {B_L0_16x8, B_L1_16x8}, {B_L0_8x16, B_L1_8x16},
  306. {B_L1_16x8, B_L0_16x8}
  307. };
  308. sym = T264_cabac_decode_decision(&t->cabac, 27+5);
  309. idx = sym<<2;
  310. sym = T264_cabac_decode_decision(&t->cabac, 27+5);
  311. idx |= sym<<1;
  312. sym = T264_cabac_decode_decision(&t->cabac, 27+5);
  313. idx |= sym;
  314. mb_mode = B_MODE;
  315. t->mb.mb_part = mb_bits_2_part0[idx];
  316. t->mb.mb_part2[0] = mb_bits_2_part20[idx][0];
  317. t->mb.mb_part2[1] = mb_bits_2_part20[idx][1];
  318. }
  319. else
  320. {
  321. sym = T264_cabac_decode_decision(&t->cabac, 27+5);
  322. idx = sym<<2;
  323. sym = T264_cabac_decode_decision(&t->cabac, 27+5);
  324. idx |= sym<<1;
  325. sym = T264_cabac_decode_decision(&t->cabac, 27+5);
  326. idx |= sym;
  327. if(idx == 0x07)
  328. {
  329. mb_mode = B_MODE;
  330. t->mb.mb_part = MB_8x8;
  331. }
  332. else if(idx == 0x05)
  333. {
  334. sym = T264_cabac_decode_decision(&t->cabac, 32);
  335. if(sym == 0)
  336. {
  337. //I_4x4
  338. mb_mode = I_4x4;
  339. }
  340. else
  341. {
  342. sym = T264_cabac_decode_terminal(&t->cabac);
  343. if(sym == 0)
  344. {
  345. //I_16x16
  346. mb_mode = I_16x16;
  347. t->mb.cbp_y = T264_cabac_decode_decision(&t->cabac, 32+1);
  348. sym = T264_cabac_decode_decision(&t->cabac, 32+2);
  349. if(sym == 0)
  350. {
  351. t->mb.cbp_c = 0;
  352. }
  353. else 
  354. {
  355. sym = T264_cabac_decode_decision(&t->cabac, 32+2);
  356. t->mb.cbp_c = (sym==0)?1:2;
  357. }
  358. sym1 = T264_cabac_decode_decision(&t->cabac, 32+3);
  359. sym2 = T264_cabac_decode_decision(&t->cabac, 32+3);
  360. t->mb.mode_i16x16 = (sym1<<1)|sym2;
  361. }
  362. else
  363. {
  364. //I_PCM
  365. }
  366. }
  367. }
  368. else if(idx == 0x06)
  369. {
  370. mb_mode = B_MODE;
  371. t->mb.mb_part = MB_8x16;
  372. t->mb.mb_part2[0] = B_L1_8x16;
  373. t->mb.mb_part2[1] = B_L0_8x16;
  374. }
  375. else
  376. {
  377. static const int i_mb_bits[21][7] =
  378. {
  379. { 1, 0, 0, },            { 1, 1, 0, 0, 0, 1, },    { 1, 1, 0, 0, 1, 0, },   /* L0 L0 */
  380. { 1, 0, 1, },            { 1, 1, 0, 0, 1, 1, },    { 1, 1, 0, 1, 0, 0, },   /* L1 L1 */
  381. { 1, 1, 0, 0, 0, 0 ,},   { 1, 1, 1, 1, 0, 0 , 0 }, { 1, 1, 1, 1, 0, 0 , 1 },/* BI BI */
  382. { 1, 1, 0, 1, 0, 1, },   { 1, 1, 0, 1, 1, 0, },     /* L0 L1 */
  383. { 1, 1, 0, 1, 1, 1, },   { 1, 1, 1, 1, 1, 0, },     /* L1 L0 */
  384. { 1, 1, 1, 0, 0, 0, 0 }, { 1, 1, 1, 0, 0, 0, 1 },   /* L0 BI */
  385. { 1, 1, 1, 0, 0, 1, 0 }, { 1, 1, 1, 0, 0, 1, 1 },   /* L1 BI */
  386. { 1, 1, 1, 0, 1, 0, 0 }, { 1, 1, 1, 0, 1, 0, 1 },   /* BI L0 */
  387. { 1, 1, 1, 0, 1, 1, 0 }, { 1, 1, 1, 0, 1, 1, 1 }    /* BI L1 */
  388. };
  389. static const int mb_bits_2_part1[] = {
  390. MB_16x8, MB_8x16, MB_16x8, MB_8x16, 
  391. MB_16x8, MB_8x16, MB_16x8, MB_8x16,
  392. MB_16x8, MB_8x16, MB_16x8, MB_8x16,
  393. MB_16x8, MB_8x16, MB_16x8, MB_8x16
  394. };
  395. static const int mb_bits_2_part21[][2] = {
  396. {B_L0_16x8, B_Bi_16x8}, {B_L0_8x16, B_Bi_8x16},
  397. {B_L1_16x8, B_Bi_16x8}, {B_L1_8x16, B_Bi_8x16},
  398. {B_Bi_16x8, B_L0_16x8}, {B_Bi_8x16, B_L0_8x16},
  399. {B_Bi_16x8, B_L1_16x8}, {B_Bi_8x16, B_L1_8x16},
  400. {B_Bi_16x8, B_Bi_16x8}, {B_Bi_8x16, B_Bi_8x16},
  401. {B_L0_16x8, B_L0_16x8}, {B_L0_8x16, B_L0_8x16},
  402. {B_L0_16x8, B_L0_16x8}, {B_L0_8x16, B_L0_8x16},
  403. {B_L0_16x8, B_L0_16x8}, {B_L0_8x16, B_L0_8x16}
  404. };
  405. idx <<= 1;
  406. sym = T264_cabac_decode_decision(&t->cabac, 27+5);
  407. idx |= sym;
  408. mb_mode = B_MODE;
  409. t->mb.mb_part = mb_bits_2_part1[idx];
  410. t->mb.mb_part2[0] = mb_bits_2_part21[idx][0];
  411. t->mb.mb_part2[1] = mb_bits_2_part21[idx][1];
  412. }
  413. }
  414. }
  415. }
  416. }
  417. else
  418. {
  419. //dummy here
  420. mb_mode = t->mb.mb_mode;
  421. }
  422. t->mb.mb_mode = mb_mode;
  423. }
  424. static int T264_cabac_mb_intra4x4_pred_mode( T264_t *t, int i_pred)
  425. {
  426. int i_mode, sym;
  427. sym = T264_cabac_decode_decision(&t->cabac, 68);
  428. if(sym == 1)
  429. {
  430. i_mode = i_pred;
  431. }
  432. else
  433. {
  434. i_mode = T264_cabac_decode_decision(&t->cabac, 69);
  435. sym = T264_cabac_decode_decision(&t->cabac, 69);
  436. i_mode |= (sym<<1);
  437. sym = T264_cabac_decode_decision(&t->cabac, 69);
  438. i_mode |= (sym<<2);
  439. if(i_mode >= i_pred)
  440. i_mode ++;
  441. }
  442. return i_mode;
  443. }
  444. static void T264_cabac_mb_intra8x8_pred_mode( T264_t *t )
  445. {
  446. int i_mode, sym;
  447. T264_mb_context_t *mb_ctxs = &(t->rec->mb[0]);
  448. int ctx = 0;
  449. if( t->mb.mb_x > 0 && mb_ctxs[t->mb.mb_xy-1].mb_mode_uv != Intra_8x8_DC)
  450. {
  451. ctx++;
  452. }
  453. if( t->mb.mb_y > 0 && mb_ctxs[t->mb.mb_xy - t->mb_stride].mb_mode_uv != Intra_8x8_DC )
  454. {
  455. ctx++;
  456. }
  457. sym = T264_cabac_decode_decision(&t->cabac, 64+ctx);
  458. if(sym == 0)
  459. {
  460. i_mode = Intra_8x8_DC;
  461. }
  462. else
  463. {
  464. sym = T264_cabac_decode_decision(&t->cabac, 64+3);
  465. if(sym == 0)
  466. {
  467. i_mode = 1;
  468. }
  469. else
  470. {
  471. sym = T264_cabac_decode_decision(&t->cabac, 64+3);
  472. i_mode = (sym==0)?2:3;
  473. }
  474. }
  475. t->mb.mb_mode_uv = i_mode;
  476. }
  477. static void T264_cabac_mb_cbp_luma( T264_t *t )
  478. {
  479. /* TODO: clean up and optimize */
  480. T264_mb_context_t *mb_ctxs = &(t->rec->mb[0]);
  481. int i8x8, sym, cbp_y, cbp_ya, cbp_yb;
  482. cbp_y = 0;
  483. for( i8x8 = 0; i8x8 < 4; i8x8++ )
  484. {
  485. int i_mba_xy = -1;
  486. int i_mbb_xy = -1;
  487. int x = luma_inverse_x[4*i8x8];
  488. int y = luma_inverse_y[4*i8x8];
  489. int ctx = 0;
  490. if( x > 0 )
  491. {
  492. i_mba_xy = t->mb.mb_xy;
  493. cbp_ya = cbp_y;
  494. }
  495. else if( t->mb.mb_x > 0 )
  496. {
  497. i_mba_xy = t->mb.mb_xy - 1;
  498. cbp_ya = mb_ctxs[i_mba_xy].cbp_y;
  499. }
  500. if( y > 0 )
  501. {
  502. i_mbb_xy = t->mb.mb_xy;
  503. cbp_yb = cbp_y;
  504. }
  505. else if( t->mb.mb_y > 0 )
  506. {
  507. i_mbb_xy = t->mb.mb_xy - t->mb_stride;
  508. cbp_yb = mb_ctxs[i_mbb_xy].cbp_y;
  509. }
  510. /* No need to test for PCM and SKIP */
  511. if( i_mba_xy >= 0 )
  512. {
  513. const int i8x8a = block_idx_xy[(x-1)&0x03][y]/4;
  514. if( ((cbp_ya >> i8x8a)&0x01) == 0 )
  515. {
  516. ctx++;
  517. }
  518. }
  519. if( i_mbb_xy >= 0 )
  520. {
  521. const int i8x8b = block_idx_xy[x][(y-1)&0x03]/4;
  522. if( ((cbp_yb >> i8x8b)&0x01) == 0 )
  523. {
  524. ctx += 2;
  525. }
  526. }
  527. sym = T264_cabac_decode_decision(&t->cabac, 73+ctx);
  528. cbp_y |= (sym<<i8x8);
  529. }
  530. t->mb.cbp_y = cbp_y;
  531. }
  532. static void T264_cabac_mb_cbp_chroma( T264_t *t )
  533. {
  534. int cbp_a = -1;
  535. int cbp_b = -1;
  536. int ctx, sym;
  537. T264_mb_context_t *mb_ctxs = &(t->rec->mb[0]);
  538. /* No need to test for SKIP/PCM */
  539. if( t->mb.mb_x > 0 )
  540. {
  541. cbp_a = (mb_ctxs[t->mb.mb_xy - 1].cbp_c)&0x3;
  542. }
  543. if( t->mb.mb_y > 0 )
  544. {
  545. cbp_b = (mb_ctxs[t->mb.mb_xy - t->mb_stride].cbp_c)&0x3;
  546. }
  547. ctx = 0;
  548. if( cbp_a > 0 ) ctx++;
  549. if( cbp_b > 0 ) ctx += 2;
  550. sym = T264_cabac_decode_decision(&t->cabac, 77+ctx);
  551. if(sym == 0)
  552. {
  553. t->mb.cbp_c = 0;
  554. }
  555. else
  556. {
  557. ctx = 4;
  558. if( cbp_a == 2 ) ctx++;
  559. if( cbp_b == 2 ) ctx += 2;
  560. sym = T264_cabac_decode_decision(&t->cabac, 77+ctx);
  561. t->mb.cbp_c = (sym==0)?1:2;
  562. }
  563. }
  564. /* TODO check it with != qp per mb */
  565. static void T264_cabac_mb_qp_delta( T264_t *t )
  566. {
  567. int i_mbn_xy = t->mb.mb_xy - 1;
  568. int i_dqp = t->mb.mb_qp_delta;
  569. int val = i_dqp <= 0 ? (-2*i_dqp) : (2*i_dqp - 1);
  570. int ctx;
  571. T264_mb_context_t *mb_ctxs = &(t->rec->mb[0]);
  572. /* No need to test for PCM / SKIP */
  573. if( i_mbn_xy >= 0 && mb_ctxs[i_mbn_xy].mb_qp_delta != 0 &&
  574. ( mb_ctxs[i_mbn_xy].mb_mode == I_16x16 || mb_ctxs[i_mbn_xy].cbp_y || mb_ctxs[i_mbn_xy].cbp_c) )
  575. ctx = 1;
  576. else
  577. ctx = 0;
  578. val = 0;
  579. while(T264_cabac_decode_decision(&t->cabac, 60+ctx) != 0)
  580. {
  581. val ++;
  582. if(ctx < 2)
  583. ctx = 2;
  584. else
  585. ctx = 3;
  586. }
  587. t->mb.mb_qp_delta = ((val&0x01)==0)?(-(val>>1)):((val+1)>>1);
  588. }
  589. int T264_cabac_dec_mb_skip( T264_t *t)
  590. {
  591. int b_skip;
  592. T264_mb_context_t *mb_ctxs = &(t->rec->mb[0]);
  593. int ctx = 0;
  594. if( t->mb.mb_x > 0 && !IS_SKIP( mb_ctxs[t->mb.mb_xy -1].mb_mode) )
  595. {
  596. ctx++;
  597. }
  598. if( t->mb.mb_y > 0 && !IS_SKIP( mb_ctxs[t->mb.mb_xy - t->mb_stride].mb_mode) )
  599. {
  600. ctx++;
  601. }
  602. if( t->slice_type == SLICE_P )
  603. b_skip = T264_cabac_decode_decision(&t->cabac, 11+ctx);
  604. else /* SLICE_TYPE_B */
  605. b_skip = T264_cabac_decode_decision(&t->cabac, 24+ctx);
  606. return b_skip;
  607. }
  608. static __inline  int T264_cabac_mb_sub_p_partition( T264_t *t)
  609. {
  610. int i_sub, sym;
  611. sym = T264_cabac_decode_decision(&t->cabac, 21);
  612. if(sym == 1)
  613. {
  614. i_sub = MB_8x8;
  615. }
  616. else
  617. {
  618. sym = T264_cabac_decode_decision(&t->cabac, 22);
  619. if(sym == 0)
  620. {
  621. i_sub = MB_8x4;
  622. }
  623. else
  624. {
  625. sym = T264_cabac_decode_decision(&t->cabac, 23);
  626. i_sub = (sym==0)?MB_4x4:MB_4x8;
  627. }
  628. }
  629. return i_sub;
  630. }
  631. static __inline  int T264_cabac_mb_sub_b_partition( T264_t *t)
  632. {
  633. int i_sub, sym, sym1;
  634. sym = T264_cabac_decode_decision(&t->cabac, 36);
  635. if(sym == 0)
  636. {
  637. i_sub = B_DIRECT_8x8;
  638. }
  639. else
  640. {
  641. sym = T264_cabac_decode_decision(&t->cabac, 37);
  642. if(sym == 0)
  643. {
  644. sym1 = T264_cabac_decode_decision(&t->cabac, 39);
  645. i_sub = (sym1==0)?B_L0_8x8:B_L1_8x8;
  646. }
  647. else
  648. {
  649. int idx;
  650. sym = T264_cabac_decode_decision(&t->cabac, 38);
  651. if(sym == 0)
  652. {
  653. static const int idx_2_sub0[] = {B_Bi_8x8, B_L0_8x4, B_L0_4x8, B_L1_8x4};
  654. sym1 = T264_cabac_decode_decision(&t->cabac, 39);
  655. idx = sym1<<1;
  656. idx |= T264_cabac_decode_decision(&t->cabac, 39);
  657. i_sub = idx_2_sub0[idx];
  658. }
  659. else
  660. {
  661. sym = T264_cabac_decode_decision(&t->cabac, 39);
  662. if(sym == 0)
  663. {
  664. static const int idx_2_sub1[] = {B_L1_4x8, B_Bi_8x4, B_Bi_4x8, B_L0_4x4};
  665. sym1 = T264_cabac_decode_decision(&t->cabac, 39);
  666. idx = sym1<<1;
  667. idx |= T264_cabac_decode_decision(&t->cabac, 39);
  668. i_sub = idx_2_sub1[idx];
  669. }
  670. else
  671. {
  672. sym1 = T264_cabac_decode_decision(&t->cabac, 39);
  673. i_sub = (sym1==0)?B_L1_4x4:B_Bi_4x4;
  674. }
  675. }
  676. }
  677. }
  678. return i_sub;
  679. }
  680. static __inline  void T264_cabac_mb_ref( T264_t *t, int i_list, int idx, int width, int height, int i_ref_max )
  681. {
  682. int i8    = T264_scan8[idx];
  683. int i_ref, i, j;
  684. int luma_idx = luma_index[idx];
  685. if( i_ref_max <= 1 )
  686. {
  687. i_ref = 0;
  688. }
  689. else
  690. {
  691. T264_mb_context_t *mb_ctxs = &(t->rec->mb[0]);
  692. const int i_refa = t->mb.vec_ref[i8 - 1].vec[i_list].refno;
  693. const int i_refb = t->mb.vec_ref[i8 - 8].vec[i_list].refno;
  694. int a_direct, b_direct;
  695. int ctx  = 0;
  696. if( t->slice_type==SLICE_B && t->mb.mb_x > 0 && (mb_ctxs[t->mb.mb_xy-1].mb_mode == B_SKIP||mb_ctxs[t->mb.mb_xy-1].is_copy ) && (luma_idx&0x03)==0)
  697. {
  698. a_direct = 1;
  699. }
  700. else
  701. a_direct = 0;
  702. if( t->slice_type==SLICE_B && t->mb.mb_y > 0 && (mb_ctxs[t->mb.mb_xy - t->mb_stride].mb_mode == B_SKIP||mb_ctxs[t->mb.mb_xy - t->mb_stride].is_copy) && luma_idx<4)
  703. {
  704. b_direct = 1;
  705. }
  706. else
  707. b_direct = 0;
  708. if( i_refa>0 && !a_direct)
  709. ctx++;
  710. if( i_refb>0 && !b_direct)
  711. ctx += 2;
  712. i_ref = 0;
  713. while(T264_cabac_decode_decision(&t->cabac, 54+ctx) != 0)
  714. {
  715. i_ref ++;
  716. if(ctx < 4)
  717. ctx = 4;
  718. else
  719. ctx = 5;
  720. }
  721. }
  722. /* save ref value */
  723. for(j=0; j<height; j++)
  724. {
  725. for(i=0; i<width; i++)
  726. {
  727. t->mb.vec_ref[i8+i].vec[i_list].refno = i_ref;
  728. t->mb.vec[i_list][luma_idx+i].refno = i_ref;
  729. }
  730. i8 += 8;
  731. luma_idx += 4;
  732. }
  733. }
  734. static __inline  int  T264_cabac_mb_mvd_cpn( T264_t *t, int i_list, int i8, int l)
  735. {
  736. int i_abs, i_prefix, i_suffix;
  737. const int amvd = abs( t->mb.mvd_ref[i_list][i8 - 1][l] ) +
  738. abs( t->mb.mvd_ref[i_list][i8 - 8][l] );
  739. const int ctxbase = (l == 0 ? 40 : 47);
  740. int ctx;
  741. if( amvd < 3 )
  742. ctx = 0;
  743. else if( amvd > 32 )
  744. ctx = 2;
  745. else
  746. ctx = 1;
  747. i_prefix = 0;
  748. while(i_prefix<9 && T264_cabac_decode_decision(&t->cabac, ctxbase+ctx)!=0)
  749. {
  750. i_prefix ++;
  751. if(ctx < 3)
  752. ctx = 3;
  753. else if(ctx < 6)
  754. ctx ++;
  755. }
  756. if(i_prefix >= 9)
  757. {
  758. int k = 3;
  759. i_suffix = 0;
  760. while(T264_cabac_decode_bypass(&t->cabac) != 0)
  761. {
  762. i_suffix += 1<<k;
  763. k++;
  764. }
  765. while(k--)
  766. {
  767. i_suffix += T264_cabac_decode_bypass(&t->cabac)<<k;
  768. }
  769. i_abs = 9 + i_suffix; 
  770. }
  771. else
  772. i_abs = i_prefix;
  773. /* sign */
  774. if(i_abs != 0)
  775. {
  776. if(T264_cabac_decode_bypass(&t->cabac) != 0)
  777. i_abs = -i_abs;
  778. }
  779. return i_abs;
  780. }
  781. static __inline  void  T264_cabac_mb_mvd( T264_t *t, int i_list, int idx, int width, int height )
  782. {
  783. T264_vector_t mvp;
  784. int mdx, mdy, mvx, mvy;
  785. int i, j;
  786. int i8    = T264_scan8[idx];
  787. int luma_idx = luma_index[idx];
  788. /* Calculate mvd */
  789. mvp.refno = t->mb.vec_ref[i8].vec[i_list].refno;
  790. T264_predict_mv( t, i_list, luma_idx, width, &mvp );
  791. /* decode */
  792. mdx = T264_cabac_mb_mvd_cpn( t, i_list, i8, 0);
  793. mdy = T264_cabac_mb_mvd_cpn( t, i_list, i8, 1);
  794. /* save mvd value */
  795. mvx = mdx + mvp.x;
  796. mvy = mdy + mvp.y;
  797. for(j=0; j<height; j++)
  798. {
  799. for(i=0; i<width; i++)
  800. {
  801. t->mb.mvd_ref[i_list][i8+i][0] = mdx;
  802. t->mb.mvd_ref[i_list][i8+i][1] = mdy;
  803. t->mb.mvd[i_list][luma_idx+i][0] = mdx;
  804. t->mb.mvd[i_list][luma_idx+i][1] = mdy;
  805. t->mb.vec_ref[i8+i].vec[i_list].x = mvx;
  806. t->mb.vec_ref[i8+i].vec[i_list].y = mvy;
  807. t->mb.vec[i_list][luma_idx+i].x = mvx;
  808. t->mb.vec[i_list][luma_idx+i].y = mvy;
  809. }
  810. i8 += 8;
  811. luma_idx += 4;
  812. }
  813. }
  814. static __inline void T264_cabac_mb8x8_mvd( T264_t *t, int i_list )
  815. {
  816. int i;
  817. int sub_part, luma_idx;
  818. for( i = 0; i < 4; i++ )
  819. {
  820. luma_idx = luma_index[i<<2];
  821. sub_part = t->mb.submb_part[luma_idx];
  822. if( T264_mb_partition_listX_table[sub_part-B_DIRECT_8x8][i_list] == 0 )
  823. {
  824. continue;
  825. }
  826. switch( sub_part )
  827. {
  828. case B_L0_8x8:
  829. case B_L1_8x8:
  830. case B_Bi_8x8:
  831. T264_cabac_mb_mvd( t, i_list, 4*i, 2, 2 );
  832. break;
  833. case B_L0_8x4:
  834. case B_L1_8x4:
  835. case B_Bi_8x4:
  836. T264_cabac_mb_mvd( t, i_list, 4*i+0, 2, 1 );
  837. T264_cabac_mb_mvd( t, i_list, 4*i+2, 2, 1 );
  838. break;
  839. case B_L0_4x8:
  840. case B_L1_4x8:
  841. case B_Bi_4x8:
  842. T264_cabac_mb_mvd( t, i_list, 4*i+0, 1, 2 );
  843. T264_cabac_mb_mvd( t, i_list, 4*i+1, 1, 2 );
  844. break;
  845. case B_L0_4x4:
  846. case B_L1_4x4:
  847. case B_Bi_4x4:
  848. T264_cabac_mb_mvd( t, i_list, 4*i+0, 1, 1 );
  849. T264_cabac_mb_mvd( t, i_list, 4*i+1, 1, 1 );
  850. T264_cabac_mb_mvd( t, i_list, 4*i+2, 1, 1 );
  851. T264_cabac_mb_mvd( t, i_list, 4*i+3, 1, 1 );
  852. break;
  853. }
  854. }
  855. }
  856. static int T264_cabac_mb_cbf_ctxidxinc( T264_t *t, int i_cat, int i_idx )
  857. {
  858. /* TODO: clean up/optimize */
  859. T264_mb_context_t *mb_ctxs = &(t->rec->mb[0]);
  860. T264_mb_context_t *mb_ctx;
  861. int i_mba_xy = -1;
  862. int i_mbb_xy = -1;
  863. int i_nza = -1;
  864. int i_nzb = -1;
  865. int ctx = 0;
  866. int cbp;
  867. if( i_cat == 0 )
  868. {
  869. if( t->mb.mb_x > 0 )
  870. {
  871. i_mba_xy = t->mb.mb_xy -1;
  872. mb_ctx = &(mb_ctxs[i_mba_xy]);
  873. if( mb_ctx->mb_mode == I_16x16 )
  874. {
  875. i_nza = (mb_ctx->cbp & 0x100);
  876. }
  877. }
  878. if( t->mb.mb_y > 0 )
  879. {
  880. i_mbb_xy = t->mb.mb_xy - t->mb_stride;
  881. mb_ctx = &(mb_ctxs[i_mbb_xy]);
  882. if( mb_ctx->mb_mode == I_16x16 )
  883. {
  884. i_nzb = (mb_ctx->cbp & 0x100);
  885. }
  886. }
  887. }
  888. else if( i_cat == 1 || i_cat == 2 )
  889. {
  890. int x = luma_inverse_x[i_idx];
  891. int y = luma_inverse_y[i_idx];
  892. int i8 = T264_scan8[i_idx];
  893. int cbp_ya, cbp_yb;
  894. if( x > 0 )
  895. {
  896. i_mba_xy = t->mb.mb_xy;
  897. cbp_ya = t->mb.cbp_y;
  898. }
  899. else if( t->mb.mb_x > 0 )
  900. {
  901. i_mba_xy = t->mb.mb_xy -1;
  902. cbp_ya = mb_ctxs[i_mba_xy].cbp_y;
  903. }
  904. if( y > 0 )
  905. {
  906. i_mbb_xy = t->mb.mb_xy;
  907. cbp_yb = t->mb.cbp_y;
  908. }
  909. else if( t->mb.mb_y > 0 )
  910. {
  911. i_mbb_xy = t->mb.mb_xy - t->mb_stride;
  912. cbp_yb = mb_ctxs[i_mbb_xy].cbp_y;
  913. }
  914. /* no need to test for skip/pcm */
  915. if( i_mba_xy >= 0 )
  916. {
  917. const int i8x8a = block_idx_xy[(x-1)&0x03][y]/4;
  918. if( (cbp_ya&0x0f)>> i8x8a )
  919. {
  920. i_nza = t->mb.nnz_ref[i8-1];
  921. }
  922. }
  923. if( i_mbb_xy >= 0 )
  924. {
  925. const int i8x8b = block_idx_xy[x][(y-1)&0x03]/4;
  926. if( (cbp_yb&0x0f)>> i8x8b )
  927. {
  928. i_nzb = t->mb.nnz_ref[i8 - 8];
  929. }
  930. }
  931. }
  932. else if( i_cat == 3 )
  933. {
  934. /* no need to test skip/pcm */
  935. //only test other MB's cbp, so we do not care about it
  936. if( t->mb.mb_x > 0 )
  937. {
  938. i_mba_xy = t->mb.mb_xy -1;
  939. cbp = mb_ctxs[i_mba_xy].cbp;
  940. if( cbp&0x30 )
  941. {
  942. i_nza = cbp&( 0x02 << ( 8 + i_idx) );
  943. }
  944. }
  945. if( t->mb.mb_y > 0 )
  946. {
  947. i_mbb_xy = t->mb.mb_xy - t->mb_stride;
  948. cbp = mb_ctxs[i_mbb_xy].cbp;
  949. if( cbp&0x30 )
  950. {
  951. i_nzb = cbp&( 0x02 << ( 8 + i_idx) );
  952. }
  953. }
  954. }
  955. else if( i_cat == 4 )
  956. {
  957. int cbp_ca, cbp_cb;
  958. int idxc = i_idx% 4;
  959. if( idxc == 1 || idxc == 3 )
  960. {
  961. cbp_ca = t->mb.cbp_c;
  962. i_mba_xy = t->mb.mb_xy;
  963. }
  964. else if( t->mb.mb_x > 0 )
  965. {
  966. i_mba_xy = t->mb.mb_xy - 1;
  967. cbp_ca = mb_ctxs[i_mba_xy].cbp_c;
  968. }
  969. if( idxc == 2 || idxc == 3 )
  970. {
  971. i_mbb_xy = t->mb.mb_xy;
  972. cbp_cb = t->mb.cbp_c;
  973. }
  974. else if( t->mb.mb_y > 0 )
  975. {
  976. i_mbb_xy = t->mb.mb_xy - t->mb_stride;
  977. cbp_cb = mb_ctxs[i_mbb_xy].cbp_c;
  978. }
  979. /* no need to test skip/pcm */
  980. if( i_mba_xy >= 0 && (cbp_ca&0x03) == 0x02 )
  981. {
  982. i_nza = t->mb.nnz_ref[T264_scan8[16+i_idx] - 1];
  983. }
  984. if( i_mbb_xy >= 0 && (cbp_cb&0x03) == 0x02 )
  985. {
  986. i_nzb = t->mb.nnz_ref[T264_scan8[16+i_idx] - 8];
  987. }
  988. }
  989. if( ( i_mba_xy < 0  && IS_INTRA( t->mb.mb_mode ) ) || i_nza > 0 )
  990. {
  991. ctx++;
  992. }
  993. if( ( i_mbb_xy < 0  && IS_INTRA( t->mb.mb_mode ) ) || i_nzb > 0 )
  994. {
  995. ctx += 2;
  996. }
  997. return 4 * i_cat + ctx;
  998. }
  999. static void block_residual_read_cabac( T264_t *t, int i_ctxBlockCat, int i_idx, int16_t *l, int i_count )
  1000. {
  1001. static const int significant_coeff_flag_offset[5] = { 0, 15, 29, 44, 47 };
  1002. static const int last_significant_coeff_flag_offset[5] = { 0, 15, 29, 44, 47 };
  1003. static const int coeff_abs_level_m1_offset[5] = { 0, 10, 20, 30, 39 };
  1004. int i_coeff_sig_map[16];
  1005. int i_coeff = 0;
  1006. int i_last  = 0;
  1007. int i_abslevel1 = 0;
  1008. int i_abslevelgt1 = 0;
  1009. int i, i1, sym, i_abs, x, y;
  1010. /* i_ctxBlockCat: 0-> DC 16x16  i_idx = 0
  1011. *                1-> AC 16x16  i_idx = luma4x4idx
  1012. *                2-> Luma4x4   i_idx = luma4x4idx
  1013. *                3-> DC Chroma i_idx = iCbCr
  1014. *                4-> AC Chroma i_idx = 4 * iCbCr + chroma4x4idx
  1015. */
  1016. memset(l, 0, sizeof(int16_t)*i_count);
  1017. sym = T264_cabac_decode_decision(&t->cabac, 85 + T264_cabac_mb_cbf_ctxidxinc( t, i_ctxBlockCat, i_idx ));
  1018. if(sym == 0)
  1019. {
  1020. //the block is not coded
  1021. return;
  1022. }
  1023. for(i=0; i<i_count-1; i++)
  1024. {
  1025. int i_ctxIdxInc;
  1026. i_ctxIdxInc = T264_MIN(i, i_count-2);
  1027. sym = T264_cabac_decode_decision(&t->cabac, 105+significant_coeff_flag_offset[i_ctxBlockCat] + i_ctxIdxInc);
  1028. if(sym != 0)
  1029. {
  1030. i_coeff_sig_map[i] = 1;
  1031. i_coeff ++;
  1032. //--- read last coefficient symbol ---
  1033. if(T264_cabac_decode_decision(&t->cabac, 166 + last_significant_coeff_flag_offset[i_ctxBlockCat] + i_ctxIdxInc))
  1034. {
  1035. for(i++; i<i_count; i++)
  1036. i_coeff_sig_map[i] = 0;
  1037. }
  1038. }
  1039. else
  1040. {
  1041. i_coeff_sig_map[i] = 0;
  1042. }
  1043. }
  1044. //--- last coefficient must be significant if no last symbol was received ---
  1045. if (i<i_count)
  1046. {
  1047. i_coeff_sig_map[i] = 1;
  1048. i_coeff ++;
  1049. }
  1050. i1 = i_count - 1;
  1051. for( i = i_coeff - 1; i >= 0; i-- )
  1052. {
  1053. int i_prefix;
  1054. int i_ctxIdxInc;
  1055. i_ctxIdxInc = (i_abslevelgt1 != 0 ? 0 : T264_MIN( 4, i_abslevel1 + 1 )) + coeff_abs_level_m1_offset[i_ctxBlockCat];
  1056. sym = T264_cabac_decode_decision(&t->cabac, 227+i_ctxIdxInc);
  1057. if(sym == 0)
  1058. {
  1059. i_abs = 0;
  1060. }
  1061. else
  1062. {
  1063. i_prefix = 1;
  1064. i_ctxIdxInc = 5 + T264_MIN( 4, i_abslevelgt1 ) + coeff_abs_level_m1_offset[i_ctxBlockCat];
  1065. while(i_prefix<14 && T264_cabac_decode_decision(&t->cabac, 227+i_ctxIdxInc)!=0)
  1066. {
  1067. i_prefix ++;
  1068. }
  1069. /* suffix */
  1070. if(i_prefix >= 14)
  1071. {
  1072. int k = 0;
  1073. int i_suffix = 0;
  1074. while(T264_cabac_decode_bypass(&t->cabac) != 0)
  1075. {
  1076. i_suffix += 1<<k;
  1077. k++;
  1078. }
  1079. while(k--)
  1080. {
  1081. i_suffix += T264_cabac_decode_bypass(&t->cabac)<<k;
  1082. }
  1083. i_abs = i_prefix + i_suffix;
  1084. }
  1085. else
  1086. {
  1087. i_abs = i_prefix;
  1088. }
  1089. }
  1090. /* read the sign */
  1091. sym = T264_cabac_decode_bypass(&t->cabac);
  1092. while(i_coeff_sig_map[i1]==0)
  1093. {
  1094. i1 --;
  1095. }
  1096. l[i1] = (sym==0)?(i_abs+1):(-(i_abs+1));
  1097. i1 --;
  1098. if(i_abs == 0)
  1099. {
  1100. i_abslevel1 ++;
  1101. }
  1102. else
  1103. {
  1104. i_abslevelgt1 ++;
  1105. }
  1106. }
  1107. if (i_ctxBlockCat==1 || i_ctxBlockCat==2)
  1108. {
  1109. x = luma_inverse_x[i_idx];
  1110. y = luma_inverse_y[i_idx];
  1111. t->mb.nnz[luma_index[i_idx]] = i_coeff;
  1112. t->mb.nnz_ref[NNZ_LUMA + y * 8 + x] = i_coeff;
  1113. }
  1114. else if (i_ctxBlockCat==4 && i_idx<4)
  1115. {
  1116. int idx = i_idx + 16;
  1117. t->mb.nnz[idx] = i_coeff;
  1118. x = (idx - 16) % 2;
  1119. y = (idx - 16) / 2;
  1120. t->mb.nnz_ref[NNZ_CHROMA0 + y * 8 + x] = i_coeff;
  1121. }
  1122. else if (i_ctxBlockCat==4 && i_idx<8)
  1123. {
  1124. int idx = i_idx + 16;
  1125. t->mb.nnz[idx] = i_coeff;
  1126. x = (idx - 20) % 2;
  1127. y = (idx - 20) / 2;
  1128. t->mb.nnz_ref[NNZ_CHROMA1 + y * 8 + x] = i_coeff;
  1129. }
  1130. }
  1131. static int8_t
  1132. T264_mb_predict_intra4x4_mode(T264_t *t, int32_t idx)
  1133. {
  1134. int32_t x, y;
  1135. int8_t nA, nB, pred_blk;
  1136. x = luma_inverse_x[idx];
  1137. y = luma_inverse_y[idx];
  1138. nA = t->mb.i4x4_pred_mode_ref[IPM_LUMA + x + y * 8 - 1];
  1139. nB = t->mb.i4x4_pred_mode_ref[IPM_LUMA + x + y * 8 - 8];
  1140. pred_blk  = T264_MIN(nA, nB);
  1141. if( pred_blk < 0 )
  1142. return Intra_4x4_DC;
  1143. return pred_blk;
  1144. }
  1145. static void __inline mb_get_directMB16x16_mv_cabac(T264_t* t)
  1146. {
  1147. int i, j, i8, k;
  1148. //to be revised. This has a problem
  1149. T264_get_direct_mv(t, t->mb.vec);
  1150. for(k=0; k<16; k++)
  1151. {
  1152. i8 = luma_index[k];
  1153. i = luma_inverse_x[k];
  1154. j = luma_inverse_y[k];
  1155. t->mb.vec_ref[VEC_LUMA+(j<<3)+i].vec[0] = t->mb.vec[0][k];
  1156. t->mb.vec_ref[VEC_LUMA+(j<<3)+i].vec[1] = t->mb.vec[1][k];
  1157. }
  1158. i8 = VEC_LUMA;
  1159. for(j=0; j<4; j++)
  1160. {
  1161. for(i=0; i<4; i++)
  1162. {
  1163. t->mb.mvd_ref[0][i8+i][0] = 0;
  1164. t->mb.mvd_ref[0][i8+i][1] = 0;
  1165. t->mb.mvd_ref[1][i8+i][0] = 0;
  1166. t->mb.mvd_ref[1][i8+i][1] = 0;
  1167. }
  1168. i8 += 8;
  1169. }
  1170. memset(&(t->mb.mvd[0][0][0]), 0, sizeof(t->mb.mvd));
  1171. }
  1172. void T264_macroblock_read_cabac( T264_t *t, bs_t *s )
  1173. {
  1174. int i_mb_type;
  1175. const int i_mb_pos_start = BitstreamPos( s );
  1176. int       i_mb_pos_tex;
  1177. int i, j, cbp_dc;
  1178. /* Write the MB type */
  1179. T264_cabac_mb_type( t );
  1180. /* PCM special block type UNTESTED */
  1181. /* no PCM here*/
  1182. i_mb_type = t->mb.mb_mode;
  1183. if( IS_INTRA( i_mb_type ) )
  1184. {
  1185. /* Prediction */
  1186. if( i_mb_type == I_4x4 )
  1187. {
  1188. for( i = 0; i < 16; i++ )
  1189. {
  1190. const int i_pred = T264_mb_predict_intra4x4_mode( t, i );
  1191. const int i_mode = T264_cabac_mb_intra4x4_pred_mode( t, i_pred);
  1192. t->mb.i4x4_pred_mode_ref[T264_scan8[i]] = i_mode;
  1193. t->mb.mode_i4x4[i] = i_mode;
  1194. }
  1195. }
  1196. T264_cabac_mb_intra8x8_pred_mode( t );
  1197. /* save ref */
  1198. memset(t->mb.submb_part, -1, sizeof(t->mb.submb_part));
  1199. t->mb.mb_part = -1;
  1200. #define INITINVALIDVEC(vec) vec.refno = -1; vec.x = vec.y = 0;
  1201. for(i = 0 ; i < 2 ; i ++)
  1202. {
  1203. for(j = 0 ; j < 16 ; j ++)
  1204. {
  1205. INITINVALIDVEC(t->mb.vec[i][j]);
  1206. }
  1207. }
  1208. #undef INITINVALIDVEC
  1209. }
  1210. else if( i_mb_type == P_MODE )
  1211. {
  1212. int i_ref_max = t->refl0_num;
  1213. if( t->mb.mb_part == MB_16x16 )
  1214. {
  1215. T264_cabac_mb_ref( t, 0, 0, 4, 4, i_ref_max);
  1216. T264_cabac_mb_mvd( t, 0, 0, 4, 4 );
  1217. }
  1218. else if( t->mb.mb_part == MB_16x8 )
  1219. {
  1220. T264_cabac_mb_ref( t, 0, 0, 4, 2, i_ref_max );
  1221. T264_cabac_mb_ref( t, 0, 8, 4, 2, i_ref_max );
  1222. T264_cabac_mb_mvd( t, 0, 0, 4, 2 );
  1223. T264_cabac_mb_mvd( t, 0, 8, 4, 2 );
  1224. }
  1225. else if( t->mb.mb_part == MB_8x16 )
  1226. {
  1227. T264_cabac_mb_ref( t, 0, 0, 2, 4, i_ref_max );
  1228. T264_cabac_mb_ref( t, 0, 4, 2, 4, i_ref_max );
  1229. T264_cabac_mb_mvd( t, 0, 0, 2, 4 );
  1230. T264_cabac_mb_mvd( t, 0, 4, 2, 4 );
  1231. }
  1232. else /* 8x8 */
  1233. {
  1234. /* sub mb type */
  1235. t->mb.submb_part[0] = T264_cabac_mb_sub_p_partition( t );
  1236. t->mb.submb_part[2] = T264_cabac_mb_sub_p_partition( t );
  1237. t->mb.submb_part[8] = T264_cabac_mb_sub_p_partition( t );
  1238. t->mb.submb_part[10] = T264_cabac_mb_sub_p_partition( t );
  1239. /* ref 0 */
  1240. T264_cabac_mb_ref( t, 0, 0, 2, 2, i_ref_max );
  1241. T264_cabac_mb_ref( t, 0, 4, 2, 2, i_ref_max );
  1242. T264_cabac_mb_ref( t, 0, 8, 2, 2, i_ref_max );
  1243. T264_cabac_mb_ref( t, 0, 12, 2, 2, i_ref_max);
  1244. for( i = 0; i < 4; i++ )
  1245. {
  1246. switch( t->mb.submb_part[luma_index[i<<2]] )
  1247. {
  1248. case MB_8x8:
  1249. T264_cabac_mb_mvd( t, 0, 4*i, 2, 2 );
  1250. break;
  1251. case MB_8x4:
  1252. T264_cabac_mb_mvd( t, 0, 4*i+0, 2, 1 );
  1253. T264_cabac_mb_mvd( t, 0, 4*i+2, 2, 1 );
  1254. break;
  1255. case MB_4x8:
  1256. T264_cabac_mb_mvd( t, 0, 4*i+0, 1, 2 );
  1257. T264_cabac_mb_mvd( t, 0, 4*i+1, 1, 2 );
  1258. break;
  1259. case MB_4x4:
  1260. T264_cabac_mb_mvd( t, 0, 4*i+0, 1, 1 );
  1261. T264_cabac_mb_mvd( t, 0, 4*i+1, 1, 1 );
  1262. T264_cabac_mb_mvd( t, 0, 4*i+2, 1, 1 );
  1263. T264_cabac_mb_mvd( t, 0, 4*i+3, 1, 1 );
  1264. break;
  1265. }
  1266. }
  1267. }
  1268. }
  1269. else if( i_mb_type == B_MODE )
  1270. {
  1271. if((t->mb.mb_part==MB_16x16&&t->mb.is_copy!=1) || (t->mb.mb_part==MB_16x8) || (t->mb.mb_part==MB_8x16))
  1272. {
  1273. /* to be changed here*/
  1274. /* All B mode */
  1275. int i_list;
  1276. int b_list[2][2];
  1277. const int i_partition = t->mb.mb_part;
  1278. int b_part_mode, part_mode0, part_mode1;
  1279. static const int b_part_mode_map[3][3] = {
  1280. { B_L0_L0, B_L0_L1, B_L0_BI },
  1281. { B_L1_L0, B_L1_L1, B_L1_BI },
  1282. { B_BI_L0, B_BI_L1, B_BI_BI }
  1283. };
  1284. switch(t->mb.mb_part)
  1285. {
  1286. case MB_16x16:
  1287. part_mode0 = t->mb.mb_part2[0] - B_L0_16x16;
  1288. b_part_mode = b_part_mode_map[part_mode0][part_mode0];
  1289. break;
  1290. case MB_16x8:
  1291. part_mode0 = t->mb.mb_part2[0] - B_L0_16x8;
  1292. part_mode1 = t->mb.mb_part2[1] - B_L0_16x8;
  1293. b_part_mode = b_part_mode_map[part_mode0][part_mode1];
  1294. break;
  1295. case MB_8x16:
  1296. part_mode0 = t->mb.mb_part2[0] - B_L0_8x16;
  1297. part_mode1 = t->mb.mb_part2[1] - B_L0_8x16;
  1298. b_part_mode = b_part_mode_map[part_mode0][part_mode1];
  1299. break;
  1300. }
  1301. /* init ref list utilisations */
  1302. for( i = 0; i < 2; i++ )
  1303. {
  1304. b_list[0][i] = T264_mb_type_list0_table[b_part_mode][i];
  1305. b_list[1][i] = T264_mb_type_list1_table[b_part_mode][i];
  1306. }
  1307. #define INITINVALIDVEC(vec) vec.refno = -1; vec.x = vec.y = 0;
  1308. for( i_list = 0; i_list < 2; i_list++ )
  1309. {
  1310. const int i_ref_max = i_list == 0 ? t->refl0_num:t->refl1_num;//t->ps.num_ref_idx_l0_active_minus1+1 : t->ps.num_ref_idx_l1_active_minus1+1;
  1311. if( t->mb.mb_part == MB_16x16 )
  1312. {
  1313. if( b_list[i_list][0] ) 
  1314. T264_cabac_mb_ref( t, i_list, 0, 4, 4, i_ref_max );
  1315. else
  1316. {
  1317. INITINVALIDVEC(t->mb.vec[i_list][0]);
  1318. copy_nvec(&t->mb.vec[i_list][0], &t->mb.vec[i_list][0], 4, 4, 4);
  1319. }
  1320. }
  1321. else if( t->mb.mb_part == MB_16x8 )
  1322. {
  1323. if( b_list[i_list][0] ) 
  1324. T264_cabac_mb_ref( t, i_list, 0, 4, 2, i_ref_max );
  1325. else
  1326. {
  1327. INITINVALIDVEC(t->mb.vec[i_list][0]);
  1328. copy_nvec(&t->mb.vec[i_list][0], &t->mb.vec[i_list][0], 4, 2, 4);
  1329. INITINVALIDVEC(t->mb.vec_ref[VEC_LUMA+8].vec[i_list]);
  1330. }
  1331. if( b_list[i_list][1] ) 
  1332. T264_cabac_mb_ref( t, i_list, 8, 4, 2, i_ref_max );
  1333. else
  1334. {
  1335. INITINVALIDVEC(t->mb.vec[i_list][8]);
  1336. copy_nvec(&t->mb.vec[i_list][8], &t->mb.vec[i_list][8], 4, 2, 4);
  1337. }
  1338. }
  1339. else if( t->mb.mb_part == MB_8x16 )
  1340. {
  1341. if( b_list[i_list][0] )
  1342. T264_cabac_mb_ref( t, i_list, 0, 2, 4, i_ref_max );
  1343. else
  1344. {
  1345. INITINVALIDVEC(t->mb.vec[i_list][0]);
  1346. copy_nvec(&t->mb.vec[i_list][0], &t->mb.vec[i_list][0], 2, 4, 4);
  1347. INITINVALIDVEC(t->mb.vec_ref[VEC_LUMA+1].vec[i_list]);
  1348. }
  1349. if( b_list[i_list][1] )
  1350. T264_cabac_mb_ref( t, i_list, 4, 2, 4, i_ref_max );
  1351. else
  1352. {
  1353. INITINVALIDVEC(t->mb.vec[i_list][2]);
  1354. copy_nvec(&t->mb.vec[i_list][2], &t->mb.vec[i_list][2], 2, 4, 4);
  1355. }
  1356. }
  1357. }
  1358. #undef INITINVALIDVEC
  1359. for( i_list = 0; i_list < 2; i_list++ )
  1360. {
  1361. if( t->mb.mb_part == MB_16x16 )
  1362. {
  1363. if( b_list[i_list][0] ) 
  1364. T264_cabac_mb_mvd( t, i_list, 0, 4, 4 );
  1365. }
  1366. else if( t->mb.mb_part == MB_16x8 )
  1367. {
  1368. if( b_list[i_list][0] )
  1369. T264_cabac_mb_mvd( t, i_list, 0, 4, 2 );
  1370. if( b_list[i_list][1] ) 
  1371. T264_cabac_mb_mvd( t, i_list, 8, 4, 2 );
  1372. }
  1373. else if( t->mb.mb_part == MB_8x16 )
  1374. {
  1375. if( b_list[i_list][0] ) 
  1376. T264_cabac_mb_mvd( t, i_list, 0, 2, 4 );
  1377. if( b_list[i_list][1] ) 
  1378. T264_cabac_mb_mvd( t, i_list, 4, 2, 4 );
  1379. }
  1380. }
  1381. }
  1382. else if(t->mb.mb_part==MB_16x16 && t->mb.is_copy)
  1383. {
  1384. mb_get_directMB16x16_mv_cabac(t);
  1385. }
  1386. else /* B8x8 */
  1387. {
  1388. /* TODO */
  1389. int i_list;
  1390. /* sub mb type */
  1391. t->mb.submb_part[0] = T264_cabac_mb_sub_b_partition( t );
  1392. t->mb.submb_part[2] = T264_cabac_mb_sub_b_partition( t );
  1393. t->mb.submb_part[8] = T264_cabac_mb_sub_b_partition( t );
  1394. t->mb.submb_part[10] = T264_cabac_mb_sub_b_partition( t );
  1395. /* ref */
  1396. for( i_list = 0; i_list < 2; i_list++ )
  1397. {
  1398. int i_ref_max = (i_list==0)?t->refl0_num:t->refl1_num;
  1399. for( i = 0; i < 4; i++ )
  1400. {
  1401. int luma_idx = luma_index[i<<2];
  1402. int sub_part = t->mb.submb_part[luma_idx]-B_DIRECT_8x8;
  1403. if( T264_mb_partition_listX_table[sub_part][i_list] == 1 )
  1404. {
  1405. T264_cabac_mb_ref( t, i_list, 4*i, 2, 2, i_ref_max );
  1406. }
  1407. else
  1408. {
  1409. int i8 = i / 2 * 16 + i % 2 * 2;
  1410. #define INITINVALIDVEC(vec) vec.refno = -1; vec.x = vec.y = 0;
  1411. INITINVALIDVEC(t->mb.vec[i_list][luma_idx]);
  1412. copy_nvec(&t->mb.vec[i_list][luma_idx], &t->mb.vec[i_list][luma_idx], 2, 2, 4);
  1413. t->mb.vec_ref[VEC_LUMA + i8 + 0].vec[i_list] =
  1414. t->mb.vec_ref[VEC_LUMA + i8 + 1].vec[i_list] =
  1415. t->mb.vec_ref[VEC_LUMA + i8 + 8].vec[i_list] =
  1416. t->mb.vec_ref[VEC_LUMA + i8 + 9].vec[i_list] = t->mb.vec[i_list][luma_idx];
  1417. #undef INITINVALIDVEC
  1418. }
  1419. }
  1420. }
  1421. T264_cabac_mb8x8_mvd( t, 0 );
  1422. T264_cabac_mb8x8_mvd( t, 1 );
  1423. for(i=0; i<4; i++)
  1424. {
  1425. int i_part = luma_index[i<<2];
  1426. int sub_part = t->mb.submb_part[i_part] - B_DIRECT_8x8;
  1427. t->mb.submb_part[i_part] = T264_map_btype_mbpart[sub_part];
  1428. }
  1429. }
  1430. }
  1431. i_mb_pos_tex = BitstreamPos( s );
  1432. if( i_mb_type != I_16x16 )
  1433. {
  1434. T264_cabac_mb_cbp_luma( t );
  1435. T264_cabac_mb_cbp_chroma( t );
  1436. }
  1437. cbp_dc = 0;
  1438. if( t->mb.cbp_y > 0 || t->mb.cbp_c > 0 || i_mb_type == I_16x16 )
  1439. {
  1440. T264_cabac_mb_qp_delta( t );
  1441. /* read residual */
  1442. if( i_mb_type == I_16x16 )
  1443. {
  1444. /* DC Luma */
  1445. int dc_nz;
  1446. block_residual_read_cabac( t, 0, 0, t->mb.dc4x4_z, 16 );
  1447. //for CABAC, record the DC non_zero
  1448. dc_nz = array_non_zero_count(&(t->mb.dc4x4_z[0]), 16);
  1449. if(dc_nz != 0)
  1450. {
  1451. cbp_dc = 1;
  1452. }
  1453. if( t->mb.cbp_y != 0 )
  1454. {
  1455. /* AC Luma */
  1456. for( i = 0; i < 16; i++ )
  1457. {
  1458. block_residual_read_cabac( t, 1, i, &(t->mb.dct_y_z[i][1]), 15 );
  1459. t->mb.dct_y_z[i][0] = t->mb.dc4x4_z[i];
  1460. }
  1461. }
  1462. }
  1463. else
  1464. {
  1465. if(t->frame_num == 1)
  1466. t->frame_num = 1;
  1467. for( i = 0; i < 16; i++ )
  1468. {
  1469. if( t->mb.cbp_y & ( 1 << ( i / 4 ) ) )
  1470. {
  1471. block_residual_read_cabac( t, 2, i, &(t->mb.dct_y_z[i][0]), 16 );
  1472. }
  1473. }
  1474. }
  1475. if( t->mb.cbp_c&0x03 )    /* Chroma DC residual present */
  1476. {
  1477. int dc_nz0, dc_nz1;
  1478. block_residual_read_cabac( t, 3, 0, &(t->mb.dc2x2_z[0][0]), 4 );
  1479. block_residual_read_cabac( t, 3, 1, &(t->mb.dc2x2_z[1][0]), 4 );
  1480. //for CABAC, chroma dc pattern
  1481. dc_nz0 = array_non_zero_count(t->mb.dc2x2_z[0], 4) > 0;
  1482. dc_nz1 = array_non_zero_count(t->mb.dc2x2_z[1], 4) > 0;
  1483. if(dc_nz0)
  1484. cbp_dc |= 0x02;
  1485. if(dc_nz1)
  1486. cbp_dc |= 0x04;
  1487. }
  1488. if( t->mb.cbp_c&0x02 ) /* Chroma AC residual present */
  1489. {
  1490. for( i = 0; i < 8; i++ )
  1491. {
  1492. block_residual_read_cabac( t, 4, i, &(t->mb.dct_uv_z[i>>2][i&0x03][1]), 15);
  1493. t->mb.dct_uv_z[i>>2][i&0x03][0] = t->mb.dc2x2_z[i>>2][i&0x03];
  1494. }
  1495. }
  1496. else
  1497. {
  1498. for(i = 0 ; i < 4 ; i ++)
  1499. {
  1500. t->mb.dct_uv_z[0][i][0] = t->mb.dc2x2_z[0][i];
  1501. t->mb.dct_uv_z[1][i][0] = t->mb.dc2x2_z[1][i];
  1502. }
  1503. }
  1504. }
  1505. //for CABAC, cbp
  1506. t->mb.cbp = t->mb.cbp_y | (t->mb.cbp_c<<4) | (cbp_dc << 8);
  1507. /*
  1508. if( IS_INTRA( i_mb_type ) )
  1509. t->stat.frame.i_itex_bits += bs_pos(s) - i_mb_pos_tex;
  1510. else
  1511. t->stat.frame.i_ptex_bits += bs_pos(s) - i_mb_pos_tex;
  1512. */
  1513. }
  1514. int T264dec_mb_read_cabac(T264_t *t)
  1515. {
  1516. int skip;
  1517. //for dec CABAC, set MVD to zero
  1518. memset(&(t->mb.mvd[0][0][0]), 0, sizeof(t->mb.mvd));
  1519. t->mb.cbp = t->mb.cbp_y = t->mb.cbp_c = t->mb.mb_qp_delta = 0;
  1520. if (t->slice_type != SLICE_I)
  1521. skip = T264_cabac_dec_mb_skip(t);
  1522. else
  1523. skip = 0;
  1524. if(skip)
  1525. {
  1526. /* skip mb block */
  1527. if (t->slice_type == SLICE_P)
  1528. {
  1529. T264_predict_mv_skip(t, 0, &t->mb.vec[0][0]);
  1530. copy_nvec(&t->mb.vec[0][0], &t->mb.vec[0][0], 4, 4, 4);
  1531. t->mb.mb_mode = P_MODE;     /* decode as MB_16x16 */
  1532. t->mb.mb_part = MB_16x16;
  1533. }
  1534. else if(t->slice_type == SLICE_B)
  1535. {
  1536. mb_get_directMB16x16_mv_cabac(t);
  1537.             t->mb.is_copy = 1;
  1538. t->mb.mb_mode = B_MODE;     /* decode as MB_16x16 */                
  1539. t->mb.mb_part = MB_16x16;
  1540. }
  1541. else
  1542. {
  1543. assert(0);
  1544. }
  1545. }
  1546. else
  1547. {
  1548. T264_macroblock_read_cabac(t, t->bs);
  1549. }
  1550. return skip;
  1551. }