www.pudn.com > t264-src-0.14.rar > dec_cavlc.c
/***************************************************************************** * * T264 AVC CODEC * * Copyright(C) 2004-2005 llcc* 2004-2005 visionany * 2005.3.2 CloudWu added support for B-frame MB16x8 and MB8x16,MB8x8 support * * This program is free software ; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation ; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY ; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program ; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * ****************************************************************************/ #include "stdio.h" #include "T264.h" #include "bitstream.h" #include "utility.h" #ifndef CHIP_DM642 #include "memory.h" #endif #include "assert.h" #include "cavlc.h" #include "inter.h" #include "inter_b.h" #define BLOCK_INDEX_CHROMA_DC (-1) #define BLOCK_INDEX_LUMA_DC (-2) #define INITINVALIDVEC(vec) vec.refno = -1; vec.x = vec.y = 0; typedef struct { uint8_t len; uint8_t trailing_ones; uint8_t total_coeff; } vlc_coeff_token_t; #define VLC(a, b, c) {a, b, c} #define VLC2(a, b, c) VLC(a, b, c), VLC(a, b, c) #define VLC4(a, b, c) VLC2(a, b, c), VLC2(a, b, c) static const uint8_t i16x16_eg_to_cbp[26][3] = { 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 3, 0, 0, 0, 1, 0, 1, 1, 0, 2, 1, 0, 3, 1, 0, 0, 2, 0, 1, 2, 0, 2, 2, 0, 3, 2, 0, 0, 0, 15, 1, 0, 15, 2, 0, 15, 3, 0, 15, 0, 1, 15, 1, 1, 15, 2, 1, 15, 3, 1, 15, 0, 2, 15, 1, 2, 15, 2, 2, 15, 3, 2, 15 }; static const uint8_t i4x4_eg_to_cbp[48] = { 47, 31, 15, 0, 23, 27, 29, 30, 7, 11, 13, 14, 39, 43, 45, 46, 16, 3, 5, 10, 12, 19, 21, 26, 28, 35, 37, 42, 44, 1, 2, 4, 8, 17, 18, 20, 24, 6, 9, 22, 25, 32, 33, 34, 36, 40, 38, 41 }; static const uint8_t inter_eg_to_cbp[48] = { 0, 16, 1, 2, 4, 8, 32, 3, 5, 10, 12, 15, 47, 7, 11, 13, 14, 6, 9, 31, 35, 37, 42, 44, 33, 34, 36, 40, 39, 43, 45, 46, 17, 18, 20, 24, 19, 21, 26, 28, 23, 27, 29, 30, 22, 25, 38, 41 }; /* ++ cavlc tables ++ */ static const vlc_coeff_token_t coeff4_0[] = { VLC(6, 0, 2), /* 0001 00 */ VLC(6, 3, 3), /* 0001 01 */ VLC(6, 1, 2), /* 0001 10 */ VLC(6, 0, 1), /* 0001 11 */ }; static const vlc_coeff_token_t coeff4_1[] = { VLC2(7, 3, 4), /* 0000 000(0) */ VLC(8, 2, 4), /* 0000 0010 */ VLC(8, 1, 4), /* 0000 0011 */ VLC2(7, 2, 3), /* 0000 010(0) */ VLC2(7, 1, 3), /* 0000 011(0) */ VLC4(6, 0, 4), /* 0000 10(00) */ VLC4(6, 0, 3), /* 0000 11(00) */ }; static const vlc_coeff_token_t coeff3_0[] = { VLC(6, 0, 1), /* 0000 00 */ VLC(6, 1, 1), /* 0000 01 */ VLC(-1, -1, -1), /* 0000 10 */ VLC(6, 0, 0), /* 0000 11 */ VLC(6, 0, 2), /* 0001 00 */ VLC(6, 1, 2), /* 0001 01 */ VLC(6, 2, 2), /* 0001 10 */ VLC(-1, -1, -1), /* 0001 11 */ VLC(6, 0, 3), /* 0010 00 */ VLC(6, 1, 3), /* 0010 01 */ VLC(6, 2, 3), /* 0010 10 */ VLC(6, 3, 3), /* 0010 11 */ VLC(6, 0, 4), /* 0011 00 */ VLC(6, 1, 4), /* 0011 01 */ VLC(6, 2, 4), /* 0011 10 */ VLC(6, 3, 4), /* 0011 11 */ VLC(6, 0, 5), /* 0100 00 */ VLC(6, 1, 5), /* 0100 01 */ VLC(6, 2, 5), /* 0100 10 */ VLC(6, 3, 5), /* 0100 11 */ VLC(6, 0, 6), /* 0101 00 */ VLC(6, 1, 6), /* 0101 01 */ VLC(6, 2, 6), /* 0101 10 */ VLC(6, 3, 6), /* 0101 11 */ VLC(6, 0, 7), /* 0110 00 */ VLC(6, 1, 7), /* 0110 01 */ VLC(6, 2, 7), /* 0110 10 */ VLC(6, 3, 7), /* 0110 11 */ VLC(6, 0, 8), VLC(6, 1, 8), VLC(6, 2, 8), VLC(6, 3, 8), VLC(6, 0, 9), VLC(6, 1, 9), VLC(6, 2, 9), VLC(6, 3, 9), VLC(6, 0, 10), VLC(6, 1, 10), VLC(6, 2, 10), VLC(6, 3, 10), VLC(6, 0, 11), VLC(6, 1, 11), VLC(6, 2, 11), VLC(6, 3, 11), VLC(6, 0, 12), VLC(6, 1, 12), VLC(6, 2, 12), VLC(6, 3, 12), VLC(6, 0, 13), VLC(6, 1, 13), VLC(6, 2, 13), VLC(6, 3, 13), VLC(6, 0, 14), VLC(6, 1, 14), VLC(6, 2, 14), VLC(6, 3, 14), VLC(6, 0, 15), VLC(6, 1, 15), VLC(6, 2, 15), VLC(6, 3, 15), VLC(6, 0, 16), VLC(6, 1, 16), VLC(6, 2, 16), VLC(6, 3, 16) }; static const vlc_coeff_token_t coeff2_0[] = { VLC(4, 3, 7), /* 1000 */ VLC(4, 3, 6), /* 1001 */ VLC(4, 3, 5), /* 1010 */ VLC(4, 3, 4), /* 1011 */ VLC(4, 3, 3), /* 1100 */ VLC(4, 2, 2), /* 1101 */ VLC(4, 1, 1), /* 1110 */ VLC(4, 0, 0), /* 1111 */ }; static const vlc_coeff_token_t coeff2_1[] = { VLC(5, 1, 5), /* 0100 0 */ VLC(5, 2, 5), VLC(5, 1, 4), VLC(5, 2, 4), VLC(5, 1, 3), VLC(5, 3, 8), VLC(5, 2, 3), VLC(5, 1, 2), }; static const vlc_coeff_token_t coeff2_2[] = { VLC(6, 0, 3), /* 0010 00 */ VLC(6, 2, 7), VLC(6, 1, 7), VLC(6, 0, 2), VLC(6, 3, 9), VLC(6, 2, 6), VLC(6, 1, 6), VLC(6, 0, 1), }; static const vlc_coeff_token_t coeff2_3[] = { VLC(7, 0, 7), /* 0001 000 */ VLC(7, 0, 6), VLC(7, 2, 9), VLC(7, 0, 5), VLC(7, 3, 10), VLC(7, 2, 8), VLC(7, 1, 8), VLC(7, 0, 4), }; static const vlc_coeff_token_t coeff2_4[] = { VLC(8, 3, 12), /* 0000 1000 */ VLC(8, 2, 11), VLC(8, 1, 10), VLC(8, 0, 9), VLC(8, 3, 11), VLC(8, 2, 10), VLC(8, 1, 9), VLC(8, 0, 8), }; static const vlc_coeff_token_t coeff2_5[] = { VLC(9, 0, 12), /* 0000 0100 0 */ VLC(9, 2, 13), VLC(9, 1, 12), VLC(9, 0, 11), VLC(9, 3, 13), VLC(9, 2, 12), VLC(9, 1, 11), VLC(9, 0, 10), }; static const vlc_coeff_token_t coeff2_6[] = { VLC(-1, -1, -1), /* 0000 0000 00 */ VLC(10, 0, 16), /* 0000 0000 01 */ VLC(10, 3, 16), /* 0000 0000 10 */ VLC(10, 2, 16), /* 0000 0000 11 */ VLC(10, 1, 16), /* 0000 0001 00 */ VLC(10, 0, 15), /* 0000 0001 01 */ VLC(10, 3, 15), /* 0000 0001 10 */ VLC(10, 2, 15), /* 0000 0001 11 */ VLC(10, 1, 15), /* 0000 0010 00 */ VLC(10, 0, 14), VLC(10, 3, 14), VLC(10, 2, 14), VLC(10, 1, 14), VLC(10, 0, 13), VLC2(9, 1, 13), /* 0000 0011 1(0) */ }; static const vlc_coeff_token_t coeff1_0[] = { VLC(4, 3, 4), /* 0100 */ VLC(4, 3, 3), /* 0101 */ VLC2(3, 2, 2), /* 011(0) */ VLC4(2, 1, 1), /* 10 */ VLC4(2, 0, 0), /* 11 */ }; static const vlc_coeff_token_t coeff1_1[] = { VLC(6, 3, 7), /* 0001 00 */ VLC(6, 2, 4), /* 0001 01 */ VLC(6, 1, 4), /* 0001 10 */ VLC(6, 0, 2), /* 0001 11 */ VLC(6, 3, 6), /* 0010 00 */ VLC(6, 2, 3), /* 0010 01 */ VLC(6, 1, 3), /* 0010 10 */ VLC(6, 0, 1), /* 0010 11*/ VLC2(5, 3, 5), /* 0011 0(0)*/ VLC2(5, 1, 2), /* 0011 1(0)*/ }; static const vlc_coeff_token_t coeff1_2[] = { VLC(9, 3, 9), /* 0000 0010 0 */ VLC(9, 2, 7), /* 0000 0010 1 */ VLC(9, 1, 7), /* 0000 0011 0 */ VLC(9, 0, 6), /* 0000 0011 1 */ VLC2(8, 0, 5), /* 0000 0100 */ VLC2(8, 2, 6), /* 0000 0101 */ VLC2(8, 1, 6), /* 0000 0110 */ VLC2(8, 0, 4), /* 0000 0111 */ VLC4(7, 3, 8), /* 0000 100 */ VLC4(7, 2, 5), /* 0000 101 */ VLC4(7, 1, 5), /* 0000 110 */ VLC4(7, 0, 3), /* 0000 111 */ }; static const vlc_coeff_token_t coeff1_3[] = { VLC(11, 3, 11), /* 0000 0001 000 */ VLC(11, 2, 9), /* 0000 0001 001 */ VLC(11, 1, 9), /* 0000 0001 010 */ VLC(11, 0, 8), /* 0000 0001 011 */ VLC(11, 3, 10), /* 0000 0001 100 */ VLC(11, 2, 8), /* 0000 0001 101 */ VLC(11, 1, 8), /* 0000 0001 110 */ VLC(11, 0, 7), /* 0000 0001 111 */ }; static const vlc_coeff_token_t coeff1_4[] = { VLC(12, 0, 11), /* 0000 0000 1000 */ VLC(12, 2, 11), /* 0000 0000 1001 */ VLC(12, 1, 11), /* 0000 0000 1010 */ VLC(12, 0, 10), /* 0000 0000 1011 */ VLC(12, 3, 12), /* 0000 0000 1100 */ VLC(12, 2, 10), /* 0000 0000 1101 */ VLC(12, 1, 10), /* 0000 0000 1110 */ VLC(12, 0, 9), /* 0000 0000 1111 */ }; static const vlc_coeff_token_t coeff1_5[] = { VLC(13, 3, 14), /* 0000 0000 0100 0 */ VLC(13, 2, 13), /* 0000 0000 0100 1 */ VLC(13, 1, 13), /* 0000 0000 0101 0 */ VLC(13, 0, 13), /* 0000 0000 0101 1 */ VLC(13, 3, 13), /* 0000 0000 0110 0 */ VLC(13, 2, 12), /* 0000 0000 0110 1 */ VLC(13, 1, 12), /* 0000 0000 0111 0 */ VLC(13, 0, 12), /* 0000 0000 0111 1 */ }; static const vlc_coeff_token_t coeff1_6[] = { VLC2(-1, -1, -1), /* 0000 0000 0000 00 */ VLC2(13, 3, 15), /* 0000 0000 0000 1(0) */ VLC(14, 3, 16), /* 0000 0000 0001 00 */ VLC(14, 2, 16), /* 0000 0000 0001 01 */ VLC(14, 1, 16), /* 0000 0000 0001 10 */ VLC(14, 0, 16), /* 0000 0000 0001 11 */ VLC(14, 1, 15), /* 0000 0000 0010 00 */ VLC(14, 0, 15), /* 0000 0000 0010 01 */ VLC(14, 2, 15), /* 0000 0000 0010 10 */ VLC(14, 1, 14), /* 0000 0000 0010 11 */ VLC2(13, 2, 14), /* 0000 0000 0011 0(0) */ VLC2(13, 0, 14), /* 0000 0000 0011 1(0) */ }; static const vlc_coeff_token_t coeff0_0[] = { VLC2(-1, -1, -1), /* 0000 0000 0000 000(0) */ VLC2(15, 1, 13), /* 0000 0000 0000 001(0) */ VLC(16, 0, 16), /* 0000 0000 0000 0100 */ VLC(16, 2, 16), VLC(16, 1, 16), VLC(16, 0, 15), VLC(16, 3, 16), VLC(16, 2, 15), VLC(16, 1, 15), VLC(16, 0, 14), VLC(16, 3, 15), VLC(16, 2, 14), VLC(16, 1, 14), VLC(16, 0, 13), /* 0000 0000 0000 1111 */ VLC2(15, 3, 14), /* 0000 0000 0001 000(0) */ VLC2(15, 2, 13), VLC2(15, 1, 12), VLC2(15, 0, 12), VLC2(15, 3, 13), VLC2(15, 2, 12), VLC2(15, 1, 11), VLC2(15, 0, 11), /* 0000 0000 0001 111(0) */ VLC4(14, 3, 12), /* 0000 0000 0010 00(00) */ VLC4(14, 2, 11), VLC4(14, 1, 10), VLC4(14, 0, 10), VLC4(14, 3, 11), VLC4(14, 2, 10), VLC4(14, 1, 9), VLC4(14, 0, 9), /* 0000 0000 0011 11(00) */ }; static const vlc_coeff_token_t coeff0_1[] = { VLC(13, 0, 8), /* 0000 0000 0100 0 */ VLC(13, 2, 9), VLC(13, 1, 8), VLC(13, 0, 7), VLC(13, 3, 10), VLC(13, 2, 8), VLC(13, 1, 7), VLC(13, 0, 6), /* 0000 0000 0111 1 */ }; static const vlc_coeff_token_t coeff0_2[] = { VLC(11, 3, 9), /* 0000 0000 100 */ VLC(11, 2, 7), VLC(11, 1, 6), VLC(11, 0, 5), /* 0000 0000 111 */ VLC2(10, 3, 8), /* 0000 0001 00(0) */ VLC2(10, 2, 6), VLC2(10, 1, 5), VLC2(10, 0, 4), /* 0000 0001 11(0) */ VLC4(9, 3, 7), /* 0000 0010 0(0) */ VLC4(9, 2, 5), VLC4(9, 1, 4), VLC4(9, 0, 3), /* 0000 0011 1(0) */ }; static const vlc_coeff_token_t coeff0_3[] = { VLC(8, 3, 6), /* 0000 0100 */ VLC(8, 2, 4), VLC(8, 1, 3), VLC(8, 0, 2), VLC2(7, 3, 5), /* 0000 100 */ VLC2(7, 2, 3), VLC4(6, 3, 4), /* 0000 11 */ }; static const vlc_coeff_token_t coeff0_4[] = { VLC(6, 1, 2), /* 0001 00 */ VLC(6, 0, 1), /* 0001 01 */ VLC2(5, 3, 3) /* 0001 1 */ }; static const vlc_coeff_token_t coeff0_5[] = { VLC(-1, -1, -1), /* 000 */ VLC(3, 2, 2), /* 001 */ VLC2(2, 1, 1), /* 01 */ VLC4(1, 0, 0) /* 1 */ }; static const uint8_t prefix_table0[] = { -1, 3, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; static const uint8_t prefix_table1[] = { -1, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4 }; static const uint8_t prefix_table2[] = { -1, 11, 10, 10, 9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8 }; static const uint8_t prefix_table3[] = { -1, 15, 14, 14, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 12 }; #undef VLC #undef VLC2 #undef VLC4 #define VLC(a, b) {a, b} #define VLC2(a, b) VLC(a, b), VLC(a, b) #define VLC4(a, b) VLC2(a, b), VLC2(a, b) #define VLC8(a, b) VLC4(a, b), VLC4(a, b) typedef struct { uint8_t num; uint8_t len; } zero_count_t; static const zero_count_t total_zero_table1_0[] = { VLC(-1, -1), VLC(15, 9), /* 0000 0000 1 */ VLC(14, 9), VLC(13, 9), /* 0000 0001 1 */ VLC2(12, 8),/* 0000 0010 */ VLC2(11, 8),/* 0000 0011 */ VLC4(10, 7),/* 0000 010 */ VLC4(9, 7), /* 0000 011 */ VLC8(8, 6), /* 0000 10 */ VLC8(7, 6), /* 0000 11 */ }; static const zero_count_t total_zero_table1_1[] = { VLC2(-1, -1), VLC(6, 5), /* 0001 0 */ VLC(5, 5), /* 0001 1 */ VLC2(4, 4),/* 0010 */ VLC2(3, 4),/* 0011 */ VLC4(2, 3),/* 010 */ VLC4(1, 3),/* 011 */ VLC8(0, 1), /*1 */ VLC8(0, 1), /*1 */ }; static const zero_count_t total_zero_table2_0[] = { VLC(14, 6), /* 0000 00 */ VLC(13, 6), VLC(12, 6), VLC(11, 6), VLC2(10, 5),/* 0001 0 */ VLC2(9, 5), }; static const zero_count_t total_zero_table2_1[] = { VLC2(-1, -1), VLC(8, 4), /* 0010 */ VLC(7, 4), /* 0011 */ VLC(6, 4), VLC(5, 4), VLC2(4, 3),/* 011 */ VLC2(3, 3),/* 100 */ VLC2(2, 3), /*101 */ VLC2(1, 3), /*110 */ VLC2(0, 3), /*111 */ }; static const zero_count_t total_zero_table3_0[] = { VLC(13, 6), /* 0000 00 */ VLC(11, 6), VLC2(12, 5),/* 0000 1 */ VLC2(10, 5),/* 0001 0 */ VLC2(9, 5), /* 0001 1 */ }; static const zero_count_t total_zero_table3_1[] = { VLC2(-1, -1), VLC(8, 4), /* 0010 */ VLC(5, 4), /* 0011 */ VLC(4, 4), VLC(0, 4), VLC2(7, 3),/* 011 */ VLC2(6, 3),/* 100 */ VLC2(3, 3), /*101 */ VLC2(2, 3), /*110 */ VLC2(1, 3), /*111 */ }; static const zero_count_t total_zero_table6_0[] = { VLC(10, 6), /* 0000 00 */ VLC(0, 6), VLC2(1, 5),/* 0000 1 */ VLC4(8, 4),/* 0000 1 */ }; static const zero_count_t total_zero_table6_1[] = { VLC(-1, -1), VLC(9, 3), /* 001 */ VLC(7, 3), /* 010 */ VLC(6, 3), VLC(5, 3), VLC(4, 3), VLC(3, 3), VLC(2, 3) }; static const zero_count_t total_zero_table7_0[] = { VLC(9, 6), /* 0000 00 */ VLC(0, 6), VLC2(1, 5),/* 0000 1 */ VLC4(7, 4),/* 0001 */ }; static const zero_count_t total_zero_table7_1[] = { VLC(-1, -1), VLC(8, 3), /* 001 */ VLC(6, 3), /* 010 */ VLC(4, 3), VLC(3, 3), VLC(2, 3), VLC2(5, 2) }; static const zero_count_t total_zero_table8_0[] = { VLC(8, 6), /* 0000 00 */ VLC(0, 6), VLC2(2, 5),/* 0000 1 */ VLC4(1, 4),/* 0001 */ }; static const zero_count_t total_zero_table8_1[] = { VLC(-1, -1), VLC(7, 3), /* 001 */ VLC(6, 3), /* 010 */ VLC(3, 3), VLC2(5, 2), VLC2(4, 2) }; static const zero_count_t total_zero_table9_0[] = { VLC(1, 6), /* 0000 00 */ VLC(0, 6), VLC2(7, 5),/* 0000 1 */ VLC4(2, 4),/* 0001 */ }; static const zero_count_t total_zero_table9_1[] = { VLC(-1, -1), VLC(5, 3), /* 001 */ VLC2(6, 2), /* 01 */ VLC2(4, 2), VLC2(3, 2), }; static const zero_count_t total_zero_table4_0[] = { VLC(12, 5), /* 0000 0 */ VLC(11, 5), VLC(10, 5), /* 0000 1 */ VLC(0, 5), /* 0001 1 */ VLC2(9, 4), /* 0010 */ VLC2(7, 4), VLC2(3, 4), VLC2(2, 4), /* 0101 */ VLC4(8, 3), /* 011 */ }; static const zero_count_t total_zero_table4_1[] = { VLC(6, 3), /* 100 */ VLC(5, 3), /* 101 */ VLC(4, 3), /* 110 */ VLC(1, 3) /* 111 */ }; static const zero_count_t total_zero_table5_0[] = { VLC(11, 5), /* 0000 0 */ VLC(9, 5), VLC2(10, 4), /* 0000 1 */ VLC2(8, 4), /* 0010 */ VLC2(2, 4), VLC2(1, 4), VLC2(0, 4), VLC4(7, 3) }; static const zero_count_t total_zero_table5_1[] = { VLC(6, 3), /* 100 */ VLC(5, 3), VLC(4, 3), VLC(3, 3) }; static const zero_count_t total_zero_table10_0[] = { VLC(1, 5), /* 0000 0 */ VLC(0, 5), VLC2(6, 4), /* 0000 1 */ }; static const zero_count_t total_zero_table10_1[] = { VLC(-1, -1), VLC(2, 3), /* 001 */ VLC2(5, 2), /* 01 */ VLC2(4, 2), VLC2(3, 2), }; static const zero_count_t total_zero_table11_0[] = { VLC(0, 4), /* 0000 */ VLC(1, 4), VLC2(2, 3), /* 010 */ VLC2(3, 3), VLC2(5, 3), VLC8(4, 1) }; static const zero_count_t total_zero_table12_0[] = { VLC(0, 4), /* 0000 */ VLC(1, 4), VLC2(4, 3), /* 010 */ VLC4(2, 2), VLC8(3, 1) }; static const zero_count_t total_zero_table13_0[] = { VLC(0, 3), /* 000 */ VLC(1, 3), VLC2(3, 2), /* 01 */ VLC4(2, 1), }; static const zero_count_t total_zero_table14_0[] = { VLC(0, 2), VLC(1, 2), VLC2(2, 1), }; static const zero_count_t total_zero_table_chroma[3][8] = { { VLC(3, 3), VLC(2, 3), VLC2(1, 2), VLC4(0, 1) }, { VLC2(2, 2), VLC2(1, 2), VLC4(0, 1) }, { VLC4(1, 1), VLC4(0, 1) } }; static const zero_count_t run_before_table_0[7][8] = { { VLC4(1, 1), VLC4(0, 1) }, { VLC2(2, 2), VLC2(1, 2), VLC4(0, 1) }, { VLC2(3, 2), VLC2(2, 2), VLC2(1, 2), VLC2(0, 2) }, { VLC(4, 3), VLC(3, 3), VLC2(2, 2), VLC2(1, 2), VLC2(0, 2) }, { VLC(5, 3), VLC(4, 3), VLC(3, 3), VLC(2, 3), VLC2(1, 2), VLC2(0, 2), }, { VLC(1, 3), VLC(2, 3), VLC(4, 3), VLC(3, 3), VLC(6, 3), VLC(5, 3), VLC2(0, 2) }, { VLC(-1, -1), VLC(6, 3), VLC(5, 3), VLC(4, 3), VLC(3, 3), VLC(2, 3), VLC(1, 3), VLC(0, 3) } }; static const uint8_t run_before_table_1[] = { -1, 10, 9, 9, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7 }; static const uint8_t run_before_table_2[] = { -1, 14, 13, 13, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11 }; /* -- cavlc tables -- */ static void __inline T264_mb_read_cavlc_i4x4_mode(T264_t* t) { int32_t i, j; int32_t x, y; int8_t* p = t->mb.i4x4_pred_mode_ref; for(i = 0 ; i < 16 ; i ++) { int8_t pred; j = luma_index[i]; pred = T264_mb_predict_intra4x4_mode(t, i); /* prev_intra4x4_pred_mode_flag */ if (eg_read_direct1(t->bs)) { t->mb.mode_i4x4[i] = pred; } else { int32_t mode = eg_read_direct(t->bs, 3); if (mode < pred) { t->mb.mode_i4x4[i] = mode; } else { t->mb.mode_i4x4[i] = mode + 1; } } x = j % 4; y = j / 4; p[IPM_LUMA + y * 8 + x] = t->mb.mode_i4x4[i]; } } /* nC == -1 */ void T264dec_mb_read_coff_token_t4(T264_t* t, uint8_t* trailing_ones, uint8_t* total_coff) { int32_t code; code = eg_show(t->bs, 8); if (code >= 16) { if (code >= 128) { /* 1 */ *trailing_ones = 1; *total_coff = 1; eg_read_skip(t->bs, 1); } else if (code >= 64) { /* 01 */ *trailing_ones = 0; *total_coff = 0; eg_read_skip(t->bs, 2); } else if (code >= 32) { /* 001 */ *trailing_ones = 2; *total_coff = 2; eg_read_skip(t->bs, 3); } else { code = (code >> 2) - 4; *trailing_ones = coeff4_0[code].trailing_ones; *total_coff = coeff4_0[code].total_coeff; eg_read_skip(t->bs, 6); } } else { *trailing_ones = coeff4_1[code].trailing_ones; *total_coff = coeff4_1[code].total_coeff; eg_read_skip(t->bs, coeff4_1[code].len); } } /* nC >= 8 */ void T264dec_mb_read_coff_token_t3(T264_t* t, uint8_t* trailing_ones, uint8_t* total_coff) { int32_t code; code = eg_read_direct(t->bs, 6); *trailing_ones = coeff3_0[code].trailing_ones; *total_coff = coeff3_0[code].total_coeff; } /* 8 > nC >= 4 */ void T264dec_mb_read_coff_token_t2(T264_t* t, uint8_t* trailing_ones, uint8_t* total_coff) { int32_t code; const vlc_coeff_token_t* table; code = eg_show(t->bs, 10); if (code >= 512) { table = coeff2_0; code = (code >> 6) - 8; } else if (code >= 256) { table = coeff2_1; code = (code >> 5) - 8; } else if (code >= 128) { table = coeff2_2; code = (code >> 4) - 8; } else if (code >= 64) { table = coeff2_3; code = (code >> 3) - 8; } else if (code >= 32) { table = coeff2_4; code = (code >> 2) - 8; } else if (code >= 16) { table = coeff2_5; code = (code >> 1) - 8; } else { table = coeff2_6; } *trailing_ones = table[code].trailing_ones; *total_coff = table[code].total_coeff; eg_read_skip(t->bs, table[code].len); } /* 4 > nC >= 2 */ void T264dec_mb_read_coff_token_t1(T264_t* t, uint8_t* trailing_ones, uint8_t* total_coff) { int32_t code; const vlc_coeff_token_t* table; code = eg_show(t->bs, 14); if (code >= 4096) { table = coeff1_0; code = (code >> 10) - 4; } else if (code >= 1024) { table = coeff1_1; code = (code >> 8) - 4; } else if (code >= 128) { table = coeff1_2; code = (code >> 5) - 4; } else if (code >= 64) { table = coeff1_3; code = (code >> 3) - 8; } else if (code >= 32) { table = coeff1_4; code = (code >> 2) - 8; } else if (code >= 16) { table = coeff1_5; code = (code >> 1) - 8; } else { table = coeff1_6; } *trailing_ones = table[code].trailing_ones; *total_coff = table[code].total_coeff; eg_read_skip(t->bs, table[code].len); } /* 2 > nC >= 0 */ void T264dec_mb_read_coff_token_t0(T264_t* t, uint8_t* trailing_ones, uint8_t* total_coff) { int32_t code; const vlc_coeff_token_t* table; code = eg_show(t->bs, 16); if (code >= 8192) { table = coeff0_5; code >>= 13; } else if (code >= 4096) { table = coeff0_4; code = (code >> 10) - 4; } else if (code >= 1024) { table = coeff0_3; code = (code >> 8) - 4; } else if (code >= 128) { table = coeff0_2; code = (code >> 5) - 4; } else if (code >= 64) { table = coeff0_1; code = (code >> 3) - 8; } else { table = coeff0_0; } *trailing_ones = table[code].trailing_ones; *total_coff = table[code].total_coeff; eg_read_skip(t->bs, table[code].len); } uint8_t T264dec_mb_read_level_prefix(T264_t* t) { uint8_t prefix; int32_t code; code = eg_show(t->bs, 16); if (code >= 4096) { prefix = prefix_table0[code >> 12]; } else if (code >= 256) { prefix = prefix_table1[code >> 8]; } else if (code >= 16) { prefix = prefix_table2[code >> 4]; } else { prefix = prefix_table3[code]; } eg_read_skip(t->bs, prefix + 1); return prefix; } uint8_t T264dec_mb_read_total_zero1(T264_t* t) { uint8_t total_zero; int32_t code; code = eg_show(t->bs, 9); if (code >= 32) { code >>= 4; total_zero = total_zero_table1_1[code].num; eg_read_skip(t->bs, total_zero_table1_1[code].len); } else { total_zero = total_zero_table1_0[code].num; eg_read_skip(t->bs, total_zero_table1_0[code].len); } assert(total_zero != 255); return total_zero; } uint8_t T264dec_mb_read_total_zero2(T264_t* t) { uint8_t total_zero; int32_t code; code = eg_show(t->bs, 6); if (code >= 8) { code >>= 2; total_zero = total_zero_table2_1[code].num; eg_read_skip(t->bs, total_zero_table2_1[code].len); } else { total_zero = total_zero_table2_0[code].num; eg_read_skip(t->bs, total_zero_table2_0[code].len); } assert(total_zero != 255); return total_zero; } uint8_t T264dec_mb_read_total_zero3(T264_t* t) { uint8_t total_zero; int32_t code; code = eg_show(t->bs, 6); if (code >= 8) { code >>= 2; total_zero = total_zero_table3_1[code].num; eg_read_skip(t->bs, total_zero_table3_1[code].len); } else { total_zero = total_zero_table3_0[code].num; eg_read_skip(t->bs, total_zero_table3_0[code].len); } assert(total_zero != 255); return total_zero; } uint8_t T264dec_mb_read_total_zero6(T264_t* t) { uint8_t total_zero; int32_t code; code = eg_show(t->bs, 6); if (code >= 8) { code >>= 3; total_zero = total_zero_table6_1[code].num; eg_read_skip(t->bs, total_zero_table6_1[code].len); } else { total_zero = total_zero_table6_0[code].num; eg_read_skip(t->bs, total_zero_table6_0[code].len); } assert(total_zero != 255); return total_zero; } uint8_t T264dec_mb_read_total_zero7(T264_t* t) { uint8_t total_zero; int32_t code; code = eg_show(t->bs, 6); if (code >= 8) { code >>= 3; total_zero = total_zero_table7_1[code].num; eg_read_skip(t->bs, total_zero_table7_1[code].len); } else { total_zero = total_zero_table7_0[code].num; eg_read_skip(t->bs, total_zero_table7_0[code].len); } assert(total_zero != 255); return total_zero; } uint8_t T264dec_mb_read_total_zero8(T264_t* t) { uint8_t total_zero; int32_t code; code = eg_show(t->bs, 6); if (code >= 8) { code >>= 3; total_zero = total_zero_table8_1[code].num; eg_read_skip(t->bs, total_zero_table8_1[code].len); } else { total_zero = total_zero_table8_0[code].num; eg_read_skip(t->bs, total_zero_table8_0[code].len); } assert(total_zero != 255); return total_zero; } uint8_t T264dec_mb_read_total_zero9(T264_t* t) { uint8_t total_zero; int32_t code; code = eg_show(t->bs, 6); if (code >= 8) { code >>= 3; total_zero = total_zero_table9_1[code].num; eg_read_skip(t->bs, total_zero_table9_1[code].len); } else { total_zero = total_zero_table9_0[code].num; eg_read_skip(t->bs, total_zero_table9_0[code].len); } assert(total_zero != 255); return total_zero; } uint8_t T264dec_mb_read_total_zero4(T264_t* t) { uint8_t total_zero; int32_t code; code = eg_show(t->bs, 5); if (code >= 16) { code = (code >> 2) - 4; total_zero = total_zero_table4_1[code].num; eg_read_skip(t->bs, total_zero_table4_1[code].len); } else { total_zero = total_zero_table4_0[code].num; eg_read_skip(t->bs, total_zero_table4_0[code].len); } assert(total_zero != 255); return total_zero; } uint8_t T264dec_mb_read_total_zero5(T264_t* t) { uint8_t total_zero; int32_t code; code = eg_show(t->bs, 5); if (code >= 16) { code = (code >> 2) - 4; total_zero = total_zero_table5_1[code].num; eg_read_skip(t->bs, total_zero_table5_1[code].len); } else { total_zero = total_zero_table5_0[code].num; eg_read_skip(t->bs, total_zero_table5_0[code].len); } assert(total_zero != 255); return total_zero; } uint8_t T264dec_mb_read_total_zero10(T264_t* t) { uint8_t total_zero; int32_t code; code = eg_show(t->bs, 5); if (code >= 4) { code >>= 2; total_zero = total_zero_table10_1[code].num; eg_read_skip(t->bs, total_zero_table10_1[code].len); } else { total_zero = total_zero_table10_0[code].num; eg_read_skip(t->bs, total_zero_table10_0[code].len); } assert(total_zero != 255); return total_zero; } uint8_t T264dec_mb_read_total_zero11(T264_t* t) { uint8_t total_zero; int32_t code; code = eg_show(t->bs, 4); total_zero = total_zero_table11_0[code].num; eg_read_skip(t->bs, total_zero_table11_0[code].len); assert(total_zero != 255); return total_zero; } uint8_t T264dec_mb_read_total_zero12(T264_t* t) { uint8_t total_zero; int32_t code; code = eg_show(t->bs, 4); total_zero = total_zero_table12_0[code].num; eg_read_skip(t->bs, total_zero_table12_0[code].len); return total_zero; } uint8_t T264dec_mb_read_total_zero13(T264_t* t) { uint8_t total_zero; int32_t code; code = eg_show(t->bs, 3); total_zero = total_zero_table13_0[code].num; eg_read_skip(t->bs, total_zero_table13_0[code].len); return total_zero; } uint8_t T264dec_mb_read_total_zero14(T264_t* t) { uint8_t total_zero; int32_t code; code = eg_show(t->bs, 2); total_zero = total_zero_table14_0[code].num; eg_read_skip(t->bs, total_zero_table14_0[code].len); return total_zero; } uint8_t T264dec_mb_read_total_zero15(T264_t* t) { return eg_read_direct1(t->bs); } uint8_t T264dec_mb_read_total_zero_chroma(T264_t* t, uint8_t total_coeff) { uint8_t total_zero; int32_t code; code = eg_show(t->bs, 3); total_zero = total_zero_table_chroma[total_coeff - 1][code].num; eg_read_skip(t->bs, total_zero_table_chroma[total_coeff - 1][code].len); assert(total_zero != 255); return total_zero; } uint8_t T264dec_mb_read_run_before(T264_t* t, uint8_t zero_left) { int32_t code; uint8_t run_before; assert(zero_left != 255); code = eg_show(t->bs, 3); if (zero_left <= 6) { run_before = run_before_table_0[zero_left - 1][code].num; eg_read_skip(t->bs, run_before_table_0[zero_left - 1][code].len); } else { eg_read_skip(t->bs, 3); if (code > 0) { run_before = run_before_table_0[6][code].num; } else { code = eg_show(t->bs, 4); if (code > 0) { run_before = run_before_table_1[code]; eg_read_skip(t->bs, run_before - 6); } else { eg_read_skip(t->bs, 4); code = eg_show(t->bs, 4); run_before = run_before_table_2[code]; eg_read_skip(t->bs, run_before - 10); } } } assert(run_before >= 0 && run_before <= 14); return run_before; } void T264dec_mb_read_cavlc_residual(T264_t* t, int32_t idx, int16_t* z, int32_t count) { uint8_t trailing_ones, total_coeff; int32_t i, j; int32_t zero_left = 0; int16_t level[16]; uint8_t run[16]; int32_t x, y; if(idx == BLOCK_INDEX_CHROMA_DC) { T264dec_mb_read_coff_token_t4(t, &trailing_ones, &total_coeff); } else { /* T264_mb_predict_non_zero_code return 0 <-> (16+16+1)>>1 = 16 */ int32_t nC = 0; typedef void (*T264dec_mb_read_coff_token_t)(T264_t* t, uint8_t* trailing_ones, uint8_t* total_coff); static const T264dec_mb_read_coff_token_t read_coeff[17] = { T264dec_mb_read_coff_token_t0, T264dec_mb_read_coff_token_t0, T264dec_mb_read_coff_token_t1, T264dec_mb_read_coff_token_t1, T264dec_mb_read_coff_token_t2, T264dec_mb_read_coff_token_t2, T264dec_mb_read_coff_token_t2, T264dec_mb_read_coff_token_t2, T264dec_mb_read_coff_token_t3, T264dec_mb_read_coff_token_t3, T264dec_mb_read_coff_token_t3, T264dec_mb_read_coff_token_t3, T264dec_mb_read_coff_token_t3, T264dec_mb_read_coff_token_t3, T264dec_mb_read_coff_token_t3, T264dec_mb_read_coff_token_t3, T264dec_mb_read_coff_token_t3 }; if(idx == BLOCK_INDEX_LUMA_DC) { // predict nC = (nA + nB) / 2; nC = T264_mb_predict_non_zero_code(t, 0); read_coeff[nC](t, &trailing_ones, &total_coeff); } else { // predict nC = (nA + nB) / 2; nC = T264_mb_predict_non_zero_code(t, idx); read_coeff[nC](t, &trailing_ones, &total_coeff); assert(total_coeff != 255); assert(trailing_ones != 255); if (idx < 16) { x = luma_inverse_x[idx]; y = luma_inverse_y[idx]; t->mb.nnz[luma_index[idx]] = total_coeff; t->mb.nnz_ref[NNZ_LUMA + y * 8 + x] = total_coeff; } else if (idx < 20) { t->mb.nnz[idx] = total_coeff; x = (idx - 16) % 2; y = (idx - 16) / 2; t->mb.nnz_ref[NNZ_CHROMA0 + y * 8 + x] = total_coeff; } else { t->mb.nnz[idx] = total_coeff; x = (idx - 20) % 2; y = (idx - 20) / 2; t->mb.nnz_ref[NNZ_CHROMA1 + y * 8 + x] = total_coeff; } } } if (total_coeff > 0) { uint8_t suffix_length = 0; int32_t level_code; if (total_coeff > 10 && trailing_ones < 3) suffix_length = 1; for(i = 0 ; i < trailing_ones ; i ++) { level[i] = 1 - 2 * eg_read_direct1(t->bs); } for( ; i < total_coeff ; i ++) { uint32_t level_suffixsize; uint32_t level_suffix; uint8_t level_prefix = T264dec_mb_read_level_prefix(t); level_suffixsize = suffix_length; if (suffix_length == 0 && level_prefix == 14) level_suffixsize = 4; else if (level_prefix == 15) level_suffixsize = 12; if (level_suffixsize > 0) level_suffix = eg_read_direct(t->bs, level_suffixsize); else level_suffix = 0; level_code = (level_prefix << suffix_length) + level_suffix; if (level_prefix == 15 && suffix_length == 0) { level_code += 15; } if (i == trailing_ones && trailing_ones < 3) { level_code += 2; } if (level_code % 2 == 0) { level[i] = (level_code + 2) >> 1; } else { level[i] = (-level_code - 1) >> 1; } if (suffix_length == 0) suffix_length = 1; if (ABS(level[i]) > (3 << (suffix_length - 1)) && suffix_length < 6) { suffix_length ++; } } if (total_coeff < count) { typedef uint8_t (*T264dec_mb_read_total_zero_t)(T264_t* t); static T264dec_mb_read_total_zero_t total_zero_f[] = { T264dec_mb_read_total_zero1, T264dec_mb_read_total_zero2, T264dec_mb_read_total_zero3, T264dec_mb_read_total_zero4, T264dec_mb_read_total_zero5, T264dec_mb_read_total_zero6, T264dec_mb_read_total_zero7, T264dec_mb_read_total_zero8, T264dec_mb_read_total_zero9, T264dec_mb_read_total_zero10, T264dec_mb_read_total_zero11, T264dec_mb_read_total_zero12, T264dec_mb_read_total_zero13, T264dec_mb_read_total_zero14, T264dec_mb_read_total_zero15 }; if(idx != BLOCK_INDEX_CHROMA_DC) zero_left = total_zero_f[total_coeff - 1](t); else zero_left = T264dec_mb_read_total_zero_chroma(t, total_coeff); } for(i = 0 ; i < total_coeff - 1 ; i ++) { if (zero_left > 0) { run[i] = T264dec_mb_read_run_before(t, zero_left); } else { run[i] = 0; } zero_left -= run[i]; } run[total_coeff - 1] = zero_left; j = -1; for(i = total_coeff - 1 ; i >= 0 ; i --) { j +=run[i] + 1; z[j] = level[i]; } } } static void __inline T264dec_mb_read_intra_cavlc(T264_t* t) { int32_t i; if (t->mb.mb_part == I_4x4) { int32_t cbp; T264_mb_read_cavlc_i4x4_mode(t); t->mb.mb_mode_uv = eg_read_ue(t->bs); assert(t->mb.mb_mode_uv <= Intra_8x8_DC128); cbp = i4x4_eg_to_cbp[eg_read_ue(t->bs)]; t->mb.cbp_y = cbp % 16; t->mb.cbp_c = cbp / 16; if (cbp > 0) { t->mb.mb_qp_delta = eg_read_se(t->bs); for(i = 0 ; i < 16 ; i ++) { if (t->mb.cbp_y & (1 << (i / 4))) { T264dec_mb_read_cavlc_residual(t, i, t->mb.dct_y_z[i], 16); } } } t->mb.mb_mode = I_4x4; } else { t->mb.mode_i16x16 = i16x16_eg_to_cbp[t->mb.mb_part][0]; t->mb.cbp_y = i16x16_eg_to_cbp[t->mb.mb_part][2]; t->mb.cbp_c = i16x16_eg_to_cbp[t->mb.mb_part][1]; t->mb.mb_mode_uv = eg_read_ue(t->bs); assert(t->mb.mb_mode_uv <= Intra_8x8_DC128); t->mb.mb_qp_delta = eg_read_se(t->bs); // dc luma T264dec_mb_read_cavlc_residual(t, BLOCK_INDEX_LUMA_DC, t->mb.dc4x4_z, 16); if (t->mb.cbp_y != 0) { for(i = 0 ; i < 16 ; i ++) { if (t->mb.cbp_y & (1 << (i / 4))) { T264dec_mb_read_cavlc_residual(t, i, &(t->mb.dct_y_z[i][1]), 15); } t->mb.dct_y_z[i][0] = t->mb.dc4x4_z[i]; } } t->mb.mb_mode = I_16x16; } } void __inline mb_get_directMB16x16_mv(T264_t* t) { T264_get_direct_mv(t, t->mb.vec); } void T264dec_mb_read_cavlc(T264_t* t) { int32_t mb_type; int32_t i, j; if (t->slice_type != SLICE_I) { if (t->skip == -1) { t->skip = eg_read_ue(t->bs); } if (t->skip -- > 0) { /* skip mb block, return */ if (t->slice_type == SLICE_P) { T264_predict_mv_skip(t, 0, &t->mb.vec[0][0]); copy_nvec(&t->mb.vec[0][0], &t->mb.vec[0][0], 4, 4, 4); t->mb.mb_mode = P_MODE; /* decode as MB_16x16 */ t->mb.mb_part = MB_16x16; return; } else if (t->slice_type == SLICE_B) { T264_get_direct_mv(t,t->mb.vec); t->mb.mb_mode = B_MODE; /* decode as MB_16x16 */ t->mb.mb_part = MB_16x16; t->mb.is_copy = 1; return; } else { assert(0); } } } mb_type = eg_read_ue(t->bs); if (t->slice_type == SLICE_P) { T264_vector_t vec, vec1; t->mb.mb_part = mb_type; mb_type = -1; /* ugly way: prevent break to i slice code */ vec.refno = 0; vec1.refno = 0; t->mb.mb_mode = P_MODE; switch (t->mb.mb_part) { case MB_16x16: if (t->refl0_num - 1 > 0) { vec.refno = eg_read_te(t->bs, t->refl0_num - 1); } T264_predict_mv(t, 0, 0, 4, &vec); t->mb.vec[0][0].x = eg_read_se(t->bs) + vec.x; t->mb.vec[0][0].y = eg_read_se(t->bs) + vec.y; t->mb.vec[0][0].refno = vec.refno; copy_nvec(&t->mb.vec[0][0], &t->mb.vec[0][0], 4, 4, 4); break; case MB_16x8: if (t->refl0_num - 1 > 0) { vec.refno = eg_read_te(t->bs, t->refl0_num - 1); vec1.refno = eg_read_te(t->bs, t->refl0_num - 1); } T264_predict_mv(t, 0, 0, 4, &vec); t->mb.vec[0][0].x = eg_read_se(t->bs) + vec.x; t->mb.vec[0][0].y = eg_read_se(t->bs) + vec.y; t->mb.vec[0][0].refno = vec.refno; copy_nvec(&t->mb.vec[0][0], &t->mb.vec[0][0], 4, 2, 4); t->mb.vec_ref[VEC_LUMA + 8].vec[0] = t->mb.vec[0][0]; T264_predict_mv(t, 0, 8, 4, &vec1); t->mb.vec[0][8].x = eg_read_se(t->bs) + vec1.x; t->mb.vec[0][8].y = eg_read_se(t->bs) + vec1.y; t->mb.vec[0][8].refno = vec1.refno; copy_nvec(&t->mb.vec[0][8], &t->mb.vec[0][8], 4, 2, 4); break; case MB_8x16: if (t->refl0_num - 1 > 0) { vec.refno = eg_read_te(t->bs, t->refl0_num - 1); vec1.refno = eg_read_te(t->bs, t->refl0_num - 1); } T264_predict_mv(t, 0, 0, 2, &vec); t->mb.vec[0][0].x = eg_read_se(t->bs) + vec.x; t->mb.vec[0][0].y = eg_read_se(t->bs) + vec.y; t->mb.vec[0][0].refno = vec.refno; copy_nvec(&t->mb.vec[0][0], &t->mb.vec[0][0], 2, 4, 4); t->mb.vec_ref[VEC_LUMA + 1].vec[0] = t->mb.vec[0][0]; T264_predict_mv(t, 0, luma_index[4], 2, &vec1); t->mb.vec[0][luma_index[4]].x = eg_read_se(t->bs) + vec1.x; t->mb.vec[0][luma_index[4]].y = eg_read_se(t->bs) + vec1.y; t->mb.vec[0][luma_index[4]].refno = vec1.refno; copy_nvec(&t->mb.vec[0][2], &t->mb.vec[0][2], 2, 4, 4); break; case MB_8x8: case MB_8x8ref0: t->mb.submb_part[luma_index[4 * 0]] = eg_read_ue(t->bs); t->mb.submb_part[luma_index[4 * 1]] = eg_read_ue(t->bs); t->mb.submb_part[luma_index[4 * 2]] = eg_read_ue(t->bs); t->mb.submb_part[luma_index[4 * 3]] = eg_read_ue(t->bs); if (t->mb.mb_part != MB_8x8ref0 && t->refl0_num - 1 > 0) { t->mb.vec[0][0].refno = eg_read_te(t->bs, t->refl0_num - 1); t->mb.vec[0][luma_index[4]].refno = eg_read_te(t->bs, t->refl0_num - 1); t->mb.vec[0][luma_index[8]].refno = eg_read_te(t->bs, t->refl0_num - 1); t->mb.vec[0][luma_index[12]].refno = eg_read_te(t->bs, t->refl0_num - 1); } else { t->mb.vec[0][0].refno = 0; t->mb.vec[0][luma_index[4]].refno = 0; t->mb.vec[0][luma_index[8]].refno = 0; t->mb.vec[0][luma_index[12]].refno = 0; } for(i = 0 ; i < 4 ; i ++) { switch(t->mb.submb_part[luma_index[4 * i]]) { case 0: /* P_L0_8x8 */ t->mb.submb_part[luma_index[4 * i]] = MB_8x8; vec = t->mb.vec[0][luma_index[4 * i]]; T264_predict_mv(t, 0, luma_index[4 * i], 2, &vec); t->mb.vec[0][luma_index[4 * i]].x = eg_read_se(t->bs) + vec.x; t->mb.vec[0][luma_index[4 * i]].y = eg_read_se(t->bs) + vec.y; t->mb.vec[0][i / 2 * 8 + i % 2 * 2 + 1] = t->mb.vec[0][i / 2 * 8 + i % 2 * 2 + 4] = t->mb.vec[0][i / 2 * 8 + i % 2 * 2 + 5] = t->mb.vec[0][i / 2 * 8 + i % 2 * 2 + 0]; t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 0].vec[0] = t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 1].vec[0] = t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 8].vec[0] = t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 9].vec[0] = t->mb.vec[0][i / 2 * 8 + i % 2 * 2 + 0]; break; case MB_8x4 - 4: /* P_L0_8x4 */ t->mb.submb_part[luma_index[4 * i]] = MB_8x4; vec.refno = t->mb.vec[0][luma_index[4 * i]].refno; T264_predict_mv(t, 0, luma_index[4 * i], 2, &vec); t->mb.vec[0][luma_index[4 * i]].x = eg_read_se(t->bs) + vec.x; t->mb.vec[0][luma_index[4 * i]].y = eg_read_se(t->bs) + vec.y; t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 0].vec[0] = t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 1].vec[0] = t->mb.vec[0][i / 2 * 8 + i % 2 * 2 + 1] = t->mb.vec[0][i / 2 * 8 + i % 2 * 2 + 0]; T264_predict_mv(t, 0, luma_index[4 * i + 2], 2, &vec); t->mb.vec[0][luma_index[4 * i + 2]].x = eg_read_se(t->bs) + vec.x; t->mb.vec[0][luma_index[4 * i + 2]].y = eg_read_se(t->bs) + vec.y; t->mb.vec[0][luma_index[4 * i + 2]].refno = vec.refno; t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 8].vec[0] = t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 9].vec[0] = t->mb.vec[0][i / 2 * 8 + i % 2 * 2 + 5] = t->mb.vec[0][i / 2 * 8 + i % 2 * 2 + 4]; break; case MB_4x8 - 4: /* P_L0_4x8 */ t->mb.submb_part[luma_index[4 * i]] = MB_4x8; vec.refno = t->mb.vec[0][luma_index[4 * i]].refno; T264_predict_mv(t, 0, luma_index[4 * i], 1, &vec); t->mb.vec[0][luma_index[4 * i]].x = eg_read_se(t->bs) + vec.x; t->mb.vec[0][luma_index[4 * i]].y = eg_read_se(t->bs) + vec.y; t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 0].vec[0] = t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 8].vec[0] = t->mb.vec[0][i / 2 * 8 + i % 2 * 2 + 4] = t->mb.vec[0][i / 2 * 8 + i % 2 * 2 + 0]; T264_predict_mv(t, 0, luma_index[4 * i + 1], 1, &vec); t->mb.vec[0][luma_index[4 * i + 1]].x = eg_read_se(t->bs) + vec.x; t->mb.vec[0][luma_index[4 * i + 1]].y = eg_read_se(t->bs) + vec.y; t->mb.vec[0][luma_index[4 * i + 1]].refno = vec.refno; t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 1].vec[0] = t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 9].vec[0] = t->mb.vec[0][i / 2 * 8 + i % 2 * 2 + 5] = t->mb.vec[0][i / 2 * 8 + i % 2 * 2 + 1]; break; case MB_4x4 - 4: /* P_L0_4x4 */ t->mb.submb_part[luma_index[4 * i]] = MB_4x4; vec = t->mb.vec[0][luma_index[4 * i]]; T264_predict_mv(t, 0, luma_index[4 * i], 1, &vec); t->mb.vec[0][luma_index[4 * i]].x = eg_read_se(t->bs) + vec.x; t->mb.vec[0][luma_index[4 * i]].y = eg_read_se(t->bs) + vec.y; t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 0].vec[0] = t->mb.vec[0][luma_index[4 * i]]; T264_predict_mv(t, 0, luma_index[4 * i + 1], 1, &vec); t->mb.vec[0][luma_index[4 * i + 1]].x = eg_read_se(t->bs) + vec.x; t->mb.vec[0][luma_index[4 * i + 1]].y = eg_read_se(t->bs) + vec.y; t->mb.vec[0][luma_index[4 * i + 1]].refno = vec.refno; t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 1].vec[0] = t->mb.vec[0][luma_index[4 * i + 1]]; T264_predict_mv(t, 0, luma_index[4 * i + 2], 1, &vec); t->mb.vec[0][luma_index[4 * i + 2]].x = eg_read_se(t->bs) + vec.x; t->mb.vec[0][luma_index[4 * i + 2]].y = eg_read_se(t->bs) + vec.y; t->mb.vec[0][luma_index[4 * i + 2]].refno = vec.refno; t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 8].vec[0] = t->mb.vec[0][luma_index[4 * i + 2]]; T264_predict_mv(t, 0, luma_index[4 * i + 3], 1, &vec); t->mb.vec[0][luma_index[4 * i + 3]].x = eg_read_se(t->bs) + vec.x; t->mb.vec[0][luma_index[4 * i + 3]].y = eg_read_se(t->bs) + vec.y; t->mb.vec[0][luma_index[4 * i + 3]].refno = vec.refno; t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 9].vec[0] = t->mb.vec[0][luma_index[4 * i + 3]]; break; } } break; default: t->mb.mb_part -= 5; T264dec_mb_read_intra_cavlc(t); /* save ref */ memset(t->mb.submb_part, -1, sizeof(t->mb.submb_part)); t->mb.mb_part = -1; for(i = 0 ; i < 2 ; i ++) { for(j = 0 ; j < 16 ; j ++) { INITINVALIDVEC(t->mb.vec[i][j]); } } break; } INITINVALIDVEC(t->mb.vec[1][0]); copy_nvec(&t->mb.vec[1][0], &t->mb.vec[1][0], 4, 4, 4); } else if (t->slice_type == SLICE_B) { T264_vector_t vecPred0, vecPred1; T264_vector_t vec1[2]; //save the mv info of second Partition vecPred0.refno = 0; //default reference index vecPred1.refno = 0; vec1[0].refno = vec1[1].refno = 0; t->mb.mb_part = mb_type; t->mb.mb_mode = B_MODE; t->mb.mb_part2[0] = mb_type; t->mb.mb_part2[1] = mb_type; switch (mb_type) { case 0: //B_Direct_16x16 mb_get_directMB16x16_mv(t); t->mb.mb_part = MB_16x16; t->mb.is_copy = 1; break; case 1: //B_L0_16x16 t->mb.mb_part = MB_16x16; if (t->refl0_num - 1 > 0) { vecPred0.refno = eg_read_te(t->bs, t->refl0_num - 1); } T264_predict_mv(t, 0, 0, 4, &vecPred0); t->mb.vec[0][0].x = eg_read_se(t->bs) + vecPred0.x; t->mb.vec[0][0].y = eg_read_se(t->bs) + vecPred0.y; t->mb.vec[0][0].refno = vecPred0.refno; copy_nvec(&t->mb.vec[0][0], &t->mb.vec[0][0], 4, 4, 4); INITINVALIDVEC(t->mb.vec[1][0]); copy_nvec(&t->mb.vec[1][0], &t->mb.vec[1][0], 4, 4, 4); break; case 2: //B_L1_16x16 t->mb.mb_part = MB_16x16; if (t->refl1_num - 1 > 0) { vecPred1.refno = eg_read_te(t->bs, t->refl1_num - 1); } T264_predict_mv(t, 1, 0, 4, &vecPred1); t->mb.vec[1][0].x = eg_read_se(t->bs) + vecPred1.x; t->mb.vec[1][0].y = eg_read_se(t->bs) + vecPred1.y; t->mb.vec[1][0].refno = vecPred1.refno; copy_nvec(&t->mb.vec[1][0], &t->mb.vec[1][0], 4, 4, 4); INITINVALIDVEC(t->mb.vec[0][0]); copy_nvec(&t->mb.vec[0][0], &t->mb.vec[0][0], 4, 4, 4); break; case 3: //B_Bi_16x16 t->mb.mb_part = MB_16x16; if (t->refl0_num - 1 > 0) { vecPred0.refno = eg_read_te(t->bs, t->refl0_num - 1); } if (t->refl1_num - 1 > 0) { vecPred1.refno = eg_read_te(t->bs, t->refl1_num - 1); } T264_predict_mv(t, 0, 0, 4, &vecPred0); T264_predict_mv(t, 1, 0, 4, &vecPred1); t->mb.vec[0][0].x = eg_read_se(t->bs) + vecPred0.x; t->mb.vec[0][0].y = eg_read_se(t->bs) + vecPred0.y; t->mb.vec[0][0].refno = vecPred0.refno; t->mb.vec[1][0].x = eg_read_se(t->bs) + vecPred1.x; t->mb.vec[1][0].y = eg_read_se(t->bs) + vecPred1.y; t->mb.vec[1][0].refno = vecPred1.refno; copy_nvec(&t->mb.vec[0][0], &t->mb.vec[0][0], 4, 4, 4); copy_nvec(&t->mb.vec[1][0], &t->mb.vec[1][0], 4, 4, 4); break; case 4: //B_L0_L0_16x8 t->mb.mb_part = MB_16x8; if (t->refl0_num - 1 > 0) { vecPred0.refno = eg_read_te(t->bs, t->refl0_num - 1); vec1[0].refno = eg_read_te(t->bs, t->refl0_num - 1); } T264_predict_mv(t, 0, 0, 4, &vecPred0); t->mb.vec[0][0].x = eg_read_se(t->bs) + vecPred0.x; t->mb.vec[0][0].y = eg_read_se(t->bs) + vecPred0.y; t->mb.vec[0][0].refno = vecPred0.refno; copy_nvec(&t->mb.vec[0][0], &t->mb.vec[0][0], 4, 2, 4); t->mb.vec_ref[VEC_LUMA + 8].vec[0] = t->mb.vec[0][0]; T264_predict_mv(t, 0, 8, 4, &vec1[0]); t->mb.vec[0][8].x = eg_read_se(t->bs) + vec1[0].x; t->mb.vec[0][8].y = eg_read_se(t->bs) + vec1[0].y; t->mb.vec[0][8].refno = vec1[0].refno; copy_nvec(&t->mb.vec[0][8], &t->mb.vec[0][8], 4, 2, 4); INITINVALIDVEC(t->mb.vec[1][0]); copy_nvec(&t->mb.vec[1][0], &t->mb.vec[1][0], 4, 4, 4); break; case 5: //B_L0_L0_8x16 t->mb.mb_part = MB_8x16; if (t->refl0_num - 1 > 0) { vecPred0.refno = eg_read_te(t->bs, t->refl0_num - 1); vec1[0].refno = eg_read_te(t->bs, t->refl0_num - 1); } T264_predict_mv(t, 0, 0, 2, &vecPred0); t->mb.vec[0][0].x = eg_read_se(t->bs) + vecPred0.x; t->mb.vec[0][0].y = eg_read_se(t->bs) + vecPred0.y; t->mb.vec[0][0].refno = vecPred0.refno; copy_nvec(&t->mb.vec[0][0], &t->mb.vec[0][0], 2, 4, 4); t->mb.vec_ref[VEC_LUMA + 1].vec[0] = t->mb.vec[0][0]; T264_predict_mv(t, 0, luma_index[4], 2, &vec1[0]); t->mb.vec[0][luma_index[4]].x = eg_read_se(t->bs) + vec1[0].x; t->mb.vec[0][luma_index[4]].y = eg_read_se(t->bs) + vec1[0].y; t->mb.vec[0][luma_index[4]].refno = vec1[0].refno; copy_nvec(&t->mb.vec[0][2], &t->mb.vec[0][2], 2, 4, 4); INITINVALIDVEC(t->mb.vec[1][0]); copy_nvec(&t->mb.vec[1][0], &t->mb.vec[1][0], 4, 4, 4); break; case 6: //B_L1_L1_16x8 t->mb.mb_part = MB_16x8; if (t->refl1_num - 1 > 0) { vecPred1.refno = eg_read_te(t->bs, t->refl1_num - 1); vec1[1].refno = eg_read_te(t->bs, t->refl1_num - 1); } T264_predict_mv(t, 1, 0, 4, &vecPred1); t->mb.vec[1][0].x = eg_read_se(t->bs) + vecPred1.x; t->mb.vec[1][0].y = eg_read_se(t->bs) + vecPred1.y; t->mb.vec[1][0].refno = vecPred1.refno; copy_nvec(&t->mb.vec[1][0], &t->mb.vec[1][0], 4, 2, 4); t->mb.vec_ref[VEC_LUMA + 8].vec[1] = t->mb.vec[1][0]; T264_predict_mv(t, 1, 8, 4, &vec1[1]); t->mb.vec[1][8].x = eg_read_se(t->bs) + vec1[1].x; t->mb.vec[1][8].y = eg_read_se(t->bs) + vec1[1].y; t->mb.vec[1][8].refno = vec1[1].refno; copy_nvec(&t->mb.vec[1][8], &t->mb.vec[1][8], 4, 2, 4); INITINVALIDVEC(t->mb.vec[0][0]); copy_nvec(&t->mb.vec[0][0], &t->mb.vec[0][0], 4, 4, 4); break; case 7: //B_L1_L1_8x16 t->mb.mb_part = MB_8x16; if (t->refl1_num - 1 > 0) { vecPred1.refno = eg_read_te(t->bs, t->refl1_num - 1); vec1[1].refno = eg_read_te(t->bs, t->refl1_num - 1); } T264_predict_mv(t, 1, 0, 2, &vecPred1); t->mb.vec[1][0].x = eg_read_se(t->bs) + vecPred1.x; t->mb.vec[1][0].y = eg_read_se(t->bs) + vecPred1.y; t->mb.vec[1][0].refno = vecPred1.refno; copy_nvec(&t->mb.vec[1][0], &t->mb.vec[1][0], 2, 4, 4); t->mb.vec_ref[VEC_LUMA + 1].vec[1] = t->mb.vec[1][0]; T264_predict_mv(t, 1, luma_index[4], 2, &vec1[1]); t->mb.vec[1][luma_index[4]].x = eg_read_se(t->bs) + vec1[1].x; t->mb.vec[1][luma_index[4]].y = eg_read_se(t->bs) + vec1[1].y; t->mb.vec[1][luma_index[4]].refno = vec1[1].refno; copy_nvec(&t->mb.vec[1][2], &t->mb.vec[1][2], 2, 4, 4); INITINVALIDVEC(t->mb.vec[0][0]); copy_nvec(&t->mb.vec[0][0], &t->mb.vec[0][0], 4, 4, 4); break; case 8://B_L0_L1_16x8 t->mb.mb_part = MB_16x8; if (t->refl0_num - 1 > 0) { vecPred0.refno = eg_read_te(t->bs, t->refl0_num - 1); } if (t->refl1_num - 1 > 0) { vecPred1.refno = eg_read_te(t->bs, t->refl1_num - 1); } T264_predict_mv(t, 0, 0, 4, &vecPred0); t->mb.vec[0][0].x = eg_read_se(t->bs) + vecPred0.x; t->mb.vec[0][0].y = eg_read_se(t->bs) + vecPred0.y; t->mb.vec[0][0].refno = vecPred0.refno; copy_nvec(&t->mb.vec[0][0], &t->mb.vec[0][0], 4, 2, 4); INITINVALIDVEC(t->mb.vec[0][8]); copy_nvec(&t->mb.vec[0][8], &t->mb.vec[0][8], 4, 2, 4); INITINVALIDVEC(t->mb.vec_ref[VEC_LUMA + 8].vec[1]); INITINVALIDVEC(t->mb.vec[1][0]); copy_nvec(&t->mb.vec[1][0], &t->mb.vec[1][0], 4, 2, 4); T264_predict_mv(t, 1, 8, 4, &vecPred1); t->mb.vec[1][8].x = eg_read_se(t->bs) + vecPred1.x; t->mb.vec[1][8].y = eg_read_se(t->bs) + vecPred1.y; t->mb.vec[1][8].refno = vecPred1.refno; copy_nvec(&t->mb.vec[1][8], &t->mb.vec[1][8], 4, 2, 4); break; case 9: //B_L0_L1_8x16 t->mb.mb_part = MB_8x16; if (t->refl0_num - 1 > 0) { vecPred0.refno = eg_read_te(t->bs, t->refl0_num - 1); } if (t->refl1_num - 1 > 0) { vecPred1.refno = eg_read_te(t->bs, t->refl1_num - 1); } T264_predict_mv(t, 0, 0, 2, &vecPred0); t->mb.vec[0][0].x = eg_read_se(t->bs) + vecPred0.x; t->mb.vec[0][0].y = eg_read_se(t->bs) + vecPred0.y; t->mb.vec[0][0].refno = vecPred0.refno; copy_nvec(&t->mb.vec[0][0], &t->mb.vec[0][0], 2, 4, 4); INITINVALIDVEC(t->mb.vec[0][2]); copy_nvec(&t->mb.vec[0][2], &t->mb.vec[0][2], 2, 4, 4); INITINVALIDVEC(t->mb.vec[1][0]); copy_nvec(&t->mb.vec[1][0], &t->mb.vec[1][0], 2, 4, 4); INITINVALIDVEC(t->mb.vec_ref[VEC_LUMA + 1].vec[1]); T264_predict_mv(t, 1, luma_index[4], 2, &vecPred1); t->mb.vec[1][luma_index[4]].x = eg_read_se(t->bs) + vecPred1.x; t->mb.vec[1][luma_index[4]].y = eg_read_se(t->bs) + vecPred1.y; t->mb.vec[1][luma_index[4]].refno = vecPred1.refno; copy_nvec(&t->mb.vec[1][2], &t->mb.vec[1][2], 2, 4, 4); break; case 10: //B_L1_L0_16x8: t->mb.mb_part = MB_16x8; if (t->refl0_num - 1 > 0) { vec1[0].refno = eg_read_te(t->bs, t->refl0_num - 1); } if (t->refl1_num - 1 > 0) { vecPred1.refno = eg_read_te(t->bs, t->refl1_num - 1); } INITINVALIDVEC(t->mb.vec[0][0]); copy_nvec(&t->mb.vec[0][0], &t->mb.vec[0][0], 4, 2, 4); INITINVALIDVEC(t->mb.vec_ref[VEC_LUMA + 8].vec[0]); T264_predict_mv(t, 0, 8, 4, &vec1[0]); t->mb.vec[0][8].x = eg_read_se(t->bs) + vec1[0].x; t->mb.vec[0][8].y = eg_read_se(t->bs) + vec1[0].y; t->mb.vec[0][8].refno = vecPred1.refno; copy_nvec(&t->mb.vec[0][8], &t->mb.vec[0][8], 4, 2, 4); T264_predict_mv(t, 1, 0, 4, &vecPred1); t->mb.vec[1][0].x = eg_read_se(t->bs) + vecPred1.x; t->mb.vec[1][0].y = eg_read_se(t->bs) + vecPred1.y; t->mb.vec[1][0].refno = vecPred1.refno; copy_nvec(&t->mb.vec[1][0], &t->mb.vec[1][0], 4, 2, 4); INITINVALIDVEC(t->mb.vec[1][8]); copy_nvec(&t->mb.vec[1][8], &t->mb.vec[1][8], 4, 2, 4); break; case 11://B_L1_L0_8x16 t->mb.mb_part = MB_8x16; if (t->refl0_num - 1 > 0) { vec1[0].refno = eg_read_te(t->bs, t->refl0_num - 1); } if (t->refl1_num - 1 > 0) { vecPred1.refno = eg_read_te(t->bs, t->refl1_num - 1); } INITINVALIDVEC(t->mb.vec[0][0]); copy_nvec(&t->mb.vec[0][0], &t->mb.vec[0][0], 2, 4, 4); INITINVALIDVEC(t->mb.vec_ref[VEC_LUMA + 1].vec[0]); T264_predict_mv(t, 0, luma_index[4], 2, &vec1[0]); t->mb.vec[0][luma_index[4]].x = eg_read_se(t->bs) + vec1[0].x; t->mb.vec[0][luma_index[4]].y = eg_read_se(t->bs) + vec1[0].y; t->mb.vec[0][luma_index[4]].refno = vec1[0].refno; copy_nvec(&t->mb.vec[0][2], &t->mb.vec[0][2], 2, 4, 4); T264_predict_mv(t, 1, 0, 2, &vecPred1); t->mb.vec[1][0].x = eg_read_se(t->bs) + vecPred1.x; t->mb.vec[1][0].y = eg_read_se(t->bs) + vecPred1.y; t->mb.vec[1][0].refno = vecPred1.refno; copy_nvec(&t->mb.vec[1][0], &t->mb.vec[1][0], 2, 4, 4); INITINVALIDVEC(t->mb.vec[1][2]); copy_nvec(&t->mb.vec[1][2], &t->mb.vec[1][2], 2, 4, 4); break; case 12: //B_L0_Bi_16x8 t->mb.mb_part = MB_16x8; if (t->refl0_num - 1 > 0) { vecPred0.refno = eg_read_te(t->bs, t->refl0_num - 1); vec1[0].refno = eg_read_te(t->bs, t->refl0_num - 1); } if (t->refl1_num - 1 > 0) { vecPred1.refno = eg_read_te(t->bs, t->refl1_num - 1); } T264_predict_mv(t, 0, 0, 4, &vecPred0); t->mb.vec[0][0].x = eg_read_se(t->bs) + vecPred0.x; t->mb.vec[0][0].y = eg_read_se(t->bs) + vecPred0.y; t->mb.vec[0][0].refno = vecPred0.refno; copy_nvec(&t->mb.vec[0][0], &t->mb.vec[0][0], 4, 2, 4); t->mb.vec_ref[VEC_LUMA + 8].vec[0] = t->mb.vec[0][0]; T264_predict_mv(t, 0, 8, 4, &vec1[0]); t->mb.vec[0][8].x = eg_read_se(t->bs) + vec1[0].x; t->mb.vec[0][8].y = eg_read_se(t->bs) + vec1[0].y; t->mb.vec[0][8].refno = vec1[0].refno; copy_nvec(&t->mb.vec[0][8], &t->mb.vec[0][8], 4, 2, 4); INITINVALIDVEC(t->mb.vec[1][0]); copy_nvec(&t->mb.vec[1][0], &t->mb.vec[1][0], 4, 2, 4); INITINVALIDVEC(t->mb.vec_ref[VEC_LUMA + 8].vec[1]); T264_predict_mv(t, 1, 8, 4, &vecPred1); t->mb.vec[1][8].x = eg_read_se(t->bs) + vecPred1.x; t->mb.vec[1][8].y = eg_read_se(t->bs) + vecPred1.y; t->mb.vec[1][8].refno = vecPred1.refno; copy_nvec(&t->mb.vec[1][8], &t->mb.vec[1][8], 4, 2, 4); break; case 13://B_L0_Bi_8x16 t->mb.mb_part = MB_8x16; if (t->refl0_num - 1 > 0) { vecPred0.refno = eg_read_te(t->bs, t->refl0_num - 1); vec1[0].refno = eg_read_te(t->bs, t->refl0_num - 1); } if (t->refl1_num - 1 > 0) { vec1[1].refno = eg_read_te(t->bs, t->refl1_num - 1); } T264_predict_mv(t, 0, 0, 2, &vecPred0); t->mb.vec[0][0].x = eg_read_se(t->bs) + vecPred0.x; t->mb.vec[0][0].y = eg_read_se(t->bs) + vecPred0.y; t->mb.vec[0][0].refno = vecPred0.refno; copy_nvec(&t->mb.vec[0][0], &t->mb.vec[0][0], 2, 4, 4); t->mb.vec_ref[VEC_LUMA + 1].vec[0] = t->mb.vec[0][0]; T264_predict_mv(t, 0, luma_index[4], 2, &vec1[0]); t->mb.vec[0][luma_index[4]].x = eg_read_se(t->bs) + vec1[0].x; t->mb.vec[0][luma_index[4]].y = eg_read_se(t->bs) + vec1[0].y; t->mb.vec[0][luma_index[4]].refno = vec1[0].refno; copy_nvec(&t->mb.vec[0][2], &t->mb.vec[0][2], 2, 4, 4); INITINVALIDVEC(t->mb.vec[1][0]); copy_nvec(&t->mb.vec[1][0], &t->mb.vec[1][0], 2, 4, 4); INITINVALIDVEC(t->mb.vec_ref[VEC_LUMA + 1].vec[1]); T264_predict_mv(t, 1, luma_index[4], 2, &vec1[1]); t->mb.vec[1][luma_index[4]].x = eg_read_se(t->bs) + vec1[1].x; t->mb.vec[1][luma_index[4]].y = eg_read_se(t->bs) + vec1[1].y; t->mb.vec[1][luma_index[4]].refno = vec1[1].refno; copy_nvec(&t->mb.vec[1][2], &t->mb.vec[1][2], 2, 4, 4); break; case 14://B_L1_Bi_16x8 t->mb.mb_part = MB_16x8; if (t->refl0_num - 1 > 0) { vec1[0].refno = eg_read_te(t->bs, t->refl0_num - 1); } if (t->refl1_num - 1 > 0) { vecPred1.refno = eg_read_te(t->bs, t->refl0_num - 1); vec1[1].refno = eg_read_te(t->bs, t->refl1_num - 1); } INITINVALIDVEC(t->mb.vec[0][0]); copy_nvec(&t->mb.vec[0][0], &t->mb.vec[0][0], 4, 2, 4); INITINVALIDVEC(t->mb.vec_ref[VEC_LUMA + 8].vec[0]); T264_predict_mv(t, 0, 8, 4, &vec1[0]); t->mb.vec[0][8].x = eg_read_se(t->bs) + vec1[0].x; t->mb.vec[0][8].y = eg_read_se(t->bs) + vec1[0].y; t->mb.vec[0][8].refno = vec1[0].refno; copy_nvec(&t->mb.vec[0][8], &t->mb.vec[0][8], 4, 2, 4); T264_predict_mv(t, 1, 0, 4, &vecPred1); t->mb.vec[1][0].x = eg_read_se(t->bs) + vecPred1.x; t->mb.vec[1][0].y = eg_read_se(t->bs) + vecPred1.y; t->mb.vec[1][0].refno = vecPred1.refno; copy_nvec(&t->mb.vec[1][0], &t->mb.vec[1][0], 4, 2, 4); t->mb.vec_ref[VEC_LUMA + 8].vec[1] = t->mb.vec[1][0]; T264_predict_mv(t, 1, 8, 4, &vec1[1]); t->mb.vec[1][8].x = eg_read_se(t->bs) + vec1[1].x; t->mb.vec[1][8].y = eg_read_se(t->bs) + vec1[1].y; t->mb.vec[1][8].refno = vec1[1].refno; copy_nvec(&t->mb.vec[1][8], &t->mb.vec[1][8], 4, 2, 4); break; case 15: //B_L1_Bi_8x16 t->mb.mb_part = MB_8x16; if (t->refl0_num - 1 > 0) { vec1[0].refno = eg_read_te(t->bs, t->refl0_num - 1); } if (t->refl1_num - 1 > 0) { vecPred1.refno = eg_read_te(t->bs, t->refl1_num - 1); vec1[1].refno = eg_read_te(t->bs, t->refl0_num - 1); } INITINVALIDVEC(t->mb.vec_ref[VEC_LUMA + 1].vec[0]); INITINVALIDVEC(t->mb.vec[0][0]); copy_nvec(&t->mb.vec[0][0], &t->mb.vec[0][0], 2, 4, 4); T264_predict_mv(t, 0, luma_index[4], 2, &vec1[0]); t->mb.vec[0][luma_index[4]].x = eg_read_se(t->bs) + vec1[0].x; t->mb.vec[0][luma_index[4]].y = eg_read_se(t->bs) + vec1[0].y; t->mb.vec[0][luma_index[4]].refno = vec1[0].refno; copy_nvec(&t->mb.vec[0][2], &t->mb.vec[0][2], 2, 4, 4); T264_predict_mv(t, 1, 0, 2, &vecPred1); t->mb.vec[1][0].x = eg_read_se(t->bs) + vecPred1.x; t->mb.vec[1][0].y = eg_read_se(t->bs) + vecPred1.y; t->mb.vec[1][0].refno = vecPred1.refno; copy_nvec(&t->mb.vec[1][0], &t->mb.vec[1][0], 2, 4, 4); t->mb.vec_ref[VEC_LUMA + 1].vec[1] = t->mb.vec[1][0]; T264_predict_mv(t, 1, luma_index[4], 2, &vec1[1]); t->mb.vec[1][luma_index[4]].x = eg_read_se(t->bs) + vec1[1].x; t->mb.vec[1][luma_index[4]].y = eg_read_se(t->bs) + vec1[1].y; t->mb.vec[1][luma_index[4]].refno = vec1[1].refno; copy_nvec(&t->mb.vec[1][2], &t->mb.vec[1][2], 2, 4, 4); break; case 16: //B_Bi_L0_16x8 t->mb.mb_part = MB_16x8; if (t->refl0_num - 1 > 0) { vecPred0.refno = eg_read_te(t->bs, t->refl1_num - 1); vec1[0].refno = eg_read_te(t->bs, t->refl0_num - 1); } if (t->refl1_num - 1 > 0) { vecPred1.refno = eg_read_te(t->bs, t->refl1_num - 1); } T264_predict_mv(t, 0, 0, 4, &vecPred0); t->mb.vec[0][0].x = eg_read_se(t->bs) + vecPred0.x; t->mb.vec[0][0].y = eg_read_se(t->bs) + vecPred0.y; t->mb.vec[0][0].refno = vecPred0.refno; copy_nvec(&t->mb.vec[0][0], &t->mb.vec[0][0], 4, 2, 4); t->mb.vec_ref[VEC_LUMA + 8].vec[0] = t->mb.vec[0][0]; T264_predict_mv(t, 0, 8, 4, &vec1[0]); t->mb.vec[0][8].x = eg_read_se(t->bs) + vec1[0].x; t->mb.vec[0][8].y = eg_read_se(t->bs) + vec1[0].y; t->mb.vec[0][8].refno = vecPred1.refno; copy_nvec(&t->mb.vec[0][8], &t->mb.vec[0][8], 4, 2, 4); T264_predict_mv(t, 1, 0, 4, &vecPred1); t->mb.vec[1][0].x = eg_read_se(t->bs) + vecPred1.x; t->mb.vec[1][0].y = eg_read_se(t->bs) + vecPred1.y; t->mb.vec[1][0].refno = vecPred1.refno; copy_nvec(&t->mb.vec[1][0], &t->mb.vec[1][0], 4, 2, 4); t->mb.vec_ref[VEC_LUMA + 8].vec[1] = t->mb.vec[1][0]; INITINVALIDVEC(t->mb.vec[1][8]); copy_nvec(&t->mb.vec[1][8], &t->mb.vec[1][8], 4, 2, 4); break; case 17: //B_Bi_L0_8x16 t->mb.mb_part = MB_8x16; if (t->refl0_num - 1 > 0) { vecPred0.refno = eg_read_te(t->bs, t->refl1_num - 1); vec1[0].refno = eg_read_te(t->bs, t->refl0_num - 1); } if (t->refl1_num - 1 > 0) { vecPred1.refno = eg_read_te(t->bs, t->refl1_num - 1); } T264_predict_mv(t, 0, 0, 2, &vecPred0); t->mb.vec[0][0].x = eg_read_se(t->bs) + vecPred0.x; t->mb.vec[0][0].y = eg_read_se(t->bs) + vecPred0.y; t->mb.vec[0][0].refno = vecPred0.refno; copy_nvec(&t->mb.vec[0][0], &t->mb.vec[0][0], 2, 4, 4); t->mb.vec_ref[VEC_LUMA + 1].vec[0] = t->mb.vec[0][0]; T264_predict_mv(t, 0, 2, 2, &vec1[0]); t->mb.vec[0][2].x = eg_read_se(t->bs) + vec1[0].x; t->mb.vec[0][2].y = eg_read_se(t->bs) + vec1[0].y; t->mb.vec[0][2].refno = vecPred1.refno; copy_nvec(&t->mb.vec[0][2], &t->mb.vec[0][2], 2, 4, 4); T264_predict_mv(t, 1, 0, 2, &vecPred1); t->mb.vec[1][0].x = eg_read_se(t->bs) + vecPred1.x; t->mb.vec[1][0].y = eg_read_se(t->bs) + vecPred1.y; t->mb.vec[1][0].refno = vecPred1.refno; copy_nvec(&t->mb.vec[1][0], &t->mb.vec[1][0], 2, 4, 4); t->mb.vec_ref[VEC_LUMA + 1].vec[1] = t->mb.vec[1][0]; INITINVALIDVEC(t->mb.vec[1][2]); copy_nvec(&t->mb.vec[1][2], &t->mb.vec[1][2], 2, 4, 4); break; case 18://B_Bi_L1_16x8 t->mb.mb_part = MB_16x8; if (t->refl0_num - 1 > 0) { vecPred0.refno = eg_read_te(t->bs, t->refl1_num - 1); } if (t->refl1_num - 1 > 0) { vecPred1.refno = eg_read_te(t->bs, t->refl1_num - 1); vec1[1].refno = eg_read_te(t->bs, t->refl0_num - 1); } T264_predict_mv(t, 0, 0, 4, &vecPred0); t->mb.vec[0][0].x = eg_read_se(t->bs) + vecPred0.x; t->mb.vec[0][0].y = eg_read_se(t->bs) + vecPred0.y; t->mb.vec[0][0].refno = vecPred0.refno; copy_nvec(&t->mb.vec[0][0], &t->mb.vec[0][0], 4, 2, 4); t->mb.vec_ref[VEC_LUMA + 8].vec[0] = t->mb.vec[0][0]; T264_predict_mv(t, 1, 0, 4, &vecPred1); t->mb.vec[1][0].x = eg_read_se(t->bs) + vecPred1.x; t->mb.vec[1][0].y = eg_read_se(t->bs) + vecPred1.y; t->mb.vec[1][0].refno = vecPred1.refno; copy_nvec(&t->mb.vec[1][0], &t->mb.vec[1][0], 4, 2, 4); t->mb.vec_ref[VEC_LUMA + 8].vec[1] = t->mb.vec[1][0]; T264_predict_mv(t, 1, 8, 4, &vec1[1]); t->mb.vec[1][8].x = eg_read_se(t->bs) + vec1[1].x; t->mb.vec[1][8].y = eg_read_se(t->bs) + vec1[1].y; t->mb.vec[1][8].refno = vecPred1.refno; copy_nvec(&t->mb.vec[1][8], &t->mb.vec[1][8], 4, 2, 4); INITINVALIDVEC(t->mb.vec[0][8]); copy_nvec(&t->mb.vec[0][8], &t->mb.vec[0][8], 4, 2, 4); break; case 19://B_Bi_L1_8x16 t->mb.mb_part = MB_8x16; if (t->refl0_num - 1 > 0) { vecPred0.refno = eg_read_te(t->bs, t->refl1_num - 1); } if (t->refl1_num - 1 > 0) { vecPred1.refno = eg_read_te(t->bs, t->refl1_num - 1); vec1[1].refno = eg_read_te(t->bs, t->refl0_num - 1); } T264_predict_mv(t, 0, 0, 2, &vecPred0); t->mb.vec[0][0].x = eg_read_se(t->bs) + vecPred0.x; t->mb.vec[0][0].y = eg_read_se(t->bs) + vecPred0.y; t->mb.vec[0][0].refno = vecPred0.refno; copy_nvec(&t->mb.vec[0][0], &t->mb.vec[0][0], 2, 4, 4); t->mb.vec_ref[VEC_LUMA + 1].vec[0] = t->mb.vec[0][0]; T264_predict_mv(t, 1, 0, 2, &vecPred1); t->mb.vec[1][0].x = eg_read_se(t->bs) + vecPred1.x; t->mb.vec[1][0].y = eg_read_se(t->bs) + vecPred1.y; t->mb.vec[1][0].refno = vecPred1.refno; copy_nvec(&t->mb.vec[1][0], &t->mb.vec[1][0], 2, 4, 4); t->mb.vec_ref[VEC_LUMA + 1].vec[1] = t->mb.vec[1][0]; T264_predict_mv(t, 1, luma_index[4], 2, &vec1[1]); t->mb.vec[1][2].x = eg_read_se(t->bs) + vec1[1].x; t->mb.vec[1][2].y = eg_read_se(t->bs) + vec1[1].y; t->mb.vec[1][2].refno = vec1[1].refno; copy_nvec(&t->mb.vec[1][2], &t->mb.vec[1][2], 2, 4, 4); INITINVALIDVEC(t->mb.vec[0][2]); copy_nvec(&t->mb.vec[0][2], &t->mb.vec[0][2], 2, 4, 4); break; case 20: //B_Bi_Bi_16x8 t->mb.mb_part = MB_16x8; if (t->refl0_num - 1 > 0) { vecPred0.refno = eg_read_te(t->bs, t->refl1_num - 1); vec1[0].refno = eg_read_te(t->bs, t->refl0_num - 1); } if (t->refl1_num - 1 > 0) { vecPred1.refno = eg_read_te(t->bs, t->refl1_num - 1); vec1[1].refno = eg_read_te(t->bs, t->refl0_num - 1); } T264_predict_mv(t, 0, 0, 4, &vecPred0); t->mb.vec[0][0].x = eg_read_se(t->bs) + vecPred0.x; t->mb.vec[0][0].y = eg_read_se(t->bs) + vecPred0.y; t->mb.vec[0][0].refno = vecPred0.refno; copy_nvec(&t->mb.vec[0][0], &t->mb.vec[0][0], 4, 2, 4); t->mb.vec_ref[VEC_LUMA + 8].vec[0] = t->mb.vec[0][0]; T264_predict_mv(t, 0, 8, 4, &vec1[0]); t->mb.vec[0][8].x = eg_read_se(t->bs) + vec1[0].x; t->mb.vec[0][8].y = eg_read_se(t->bs) + vec1[0].y; t->mb.vec[0][8].refno = vec1[0].refno; copy_nvec(&t->mb.vec[0][8], &t->mb.vec[0][8], 4, 2, 4); T264_predict_mv(t, 1, 0, 4, &vecPred1); t->mb.vec[1][0].x = eg_read_se(t->bs) + vecPred1.x; t->mb.vec[1][0].y = eg_read_se(t->bs) + vecPred1.y; t->mb.vec[1][0].refno = vecPred1.refno; copy_nvec(&t->mb.vec[1][0], &t->mb.vec[1][0], 4, 2, 4); t->mb.vec_ref[VEC_LUMA + 8].vec[1] = t->mb.vec[1][0]; T264_predict_mv(t, 1, 8, 4, &vec1[1]); t->mb.vec[1][8].x = eg_read_se(t->bs) + vec1[1].x; t->mb.vec[1][8].y = eg_read_se(t->bs) + vec1[1].y; t->mb.vec[1][8].refno = vecPred1.refno; copy_nvec(&t->mb.vec[1][8], &t->mb.vec[1][8], 4, 2, 4); break; case 21://B_Bi_Bi_8x16 t->mb.mb_part = MB_8x16; if (t->refl0_num - 1 > 0) { vecPred0.refno = eg_read_te(t->bs, t->refl1_num - 1); vec1[0].refno = eg_read_te(t->bs, t->refl0_num - 1); } if (t->refl1_num - 1 > 0) { vecPred1.refno = eg_read_te(t->bs, t->refl1_num - 1); vec1[1].refno = eg_read_te(t->bs, t->refl0_num - 1); } T264_predict_mv(t, 0, 0, 2, &vecPred0); t->mb.vec[0][0].x = eg_read_se(t->bs) + vecPred0.x; t->mb.vec[0][0].y = eg_read_se(t->bs) + vecPred0.y; t->mb.vec[0][0].refno = vecPred0.refno; copy_nvec(&t->mb.vec[0][0], &t->mb.vec[0][0], 2, 4, 4); t->mb.vec_ref[VEC_LUMA + 1].vec[0] = t->mb.vec[0][0]; T264_predict_mv(t, 0, 2, 2, &vec1[0]); t->mb.vec[0][2].x = eg_read_se(t->bs) + vec1[0].x; t->mb.vec[0][2].y = eg_read_se(t->bs) + vec1[0].y; t->mb.vec[0][2].refno = vec1[1].refno; copy_nvec(&t->mb.vec[0][2], &t->mb.vec[0][2], 2, 4, 4); T264_predict_mv(t, 1, 0, 2, &vecPred1); t->mb.vec[1][0].x = eg_read_se(t->bs) + vecPred1.x; t->mb.vec[1][0].y = eg_read_se(t->bs) + vecPred1.y; t->mb.vec[1][0].refno = vecPred1.refno; copy_nvec(&t->mb.vec[1][0], &t->mb.vec[1][0], 2, 4, 4); t->mb.vec_ref[VEC_LUMA + 1].vec[1] = t->mb.vec[1][0]; T264_predict_mv(t, 1, 2, 2, &vec1[1]); t->mb.vec[1][2].x = eg_read_se(t->bs) + vec1[1].x; t->mb.vec[1][2].y = eg_read_se(t->bs) + vec1[1].y; t->mb.vec[1][2].refno = vec1[1].refno; copy_nvec(&t->mb.vec[1][2], &t->mb.vec[1][2], 2, 4, 4); break; case 22: //B_8x8 t->mb.submb_part[luma_index[4 * 0]] = eg_read_ue(t->bs); t->mb.submb_part[luma_index[4 * 1]] = eg_read_ue(t->bs); t->mb.submb_part[luma_index[4 * 2]] = eg_read_ue(t->bs); t->mb.submb_part[luma_index[4 * 3]] = eg_read_ue(t->bs); t->mb.mb_part = MB_8x8; if (t->refl0_num - 1 > 0) { for(i = 0;i < 4; ++i) if(t->mb.submb_part[luma_index[4 * i]] != B_DIRECT_8x8 - 100) { if (t->mb.submb_part[luma_index[4 * i]] != B_L1_8x8) { t->mb.vec[0][luma_index[4 * i]].refno = eg_read_te(t->bs, t->refl0_num - 1); } } }else { t->mb.vec[0][luma_index[0]].refno = 0; t->mb.vec[0][luma_index[4]].refno = 0; t->mb.vec[0][luma_index[8]].refno = 0; t->mb.vec[0][luma_index[12]].refno = 0; } if (t->refl1_num - 1 > 0) { for(i = 0;i < 4; ++i) if(t->mb.submb_part[luma_index[4 * i]] != B_DIRECT_8x8 - 100) { if (t->mb.submb_part[luma_index[4 * i]] != B_L0_8x8) { t->mb.vec[1][luma_index[4 * i]].refno = eg_read_te(t->bs, t->refl1_num - 1); } } }else { t->mb.vec[1][luma_index[0]].refno = 0; t->mb.vec[1][luma_index[4]].refno = 0; t->mb.vec[1][luma_index[8]].refno = 0; t->mb.vec[1][luma_index[12]].refno = 0; } for(i = 0 ; i < 4 ; i ++) { switch(t->mb.submb_part[luma_index[4 * i]]) { case B_DIRECT_8x8 - 100: // submb_get_direct8x8_mv(t,i); assert(0); break; case B_L1_8x8 - 100: INITINVALIDVEC(t->mb.vec[0][luma_index[4 * i]]); copy_nvec(&t->mb.vec[0][luma_index[4 * i]], &t->mb.vec[0][luma_index[4 * i]], 2, 2, 4); t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 0].vec[0] = t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 1].vec[0] = t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 8].vec[0] = t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 9].vec[0] = t->mb.vec[0][luma_index[4 * i]]; break; case B_L0_8x8 - 100: case B_Bi_8x8 - 100: vec1[0] = t->mb.vec[0][luma_index[4 * i]]; T264_predict_mv(t, 0, luma_index[4 * i], 2, &vec1[0]); t->mb.vec[0][luma_index[4 * i]].x = eg_read_se(t->bs) + vec1[0].x; t->mb.vec[0][luma_index[4 * i]].y = eg_read_se(t->bs) + vec1[0].y; t->mb.vec[0][i / 2 * 8 + i % 2 * 2 + 1] = t->mb.vec[0][i / 2 * 8 + i % 2 * 2 + 4] = t->mb.vec[0][i / 2 * 8 + i % 2 * 2 + 5] = t->mb.vec[0][i / 2 * 8 + i % 2 * 2 + 0]; t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 0].vec[0] = t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 1].vec[0] = t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 8].vec[0] = t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 9].vec[0] = t->mb.vec[0][i / 2 * 8 + i % 2 * 2 + 0]; break; default : //other mode are not supported assert(0); break; } } //for list1 mvd for(i = 0 ; i < 4 ; i ++) { switch(t->mb.submb_part[luma_index[4 * i]]) { case B_DIRECT_8x8 - 100: //will do at list0 t->mb.submb_part[luma_index[4 * i]] = MB_8x8; break; case B_L0_8x8 - 100: t->mb.submb_part[luma_index[4 * i]] = MB_8x8; INITINVALIDVEC(t->mb.vec[1][luma_index[4 * i]]); copy_nvec(&t->mb.vec[1][luma_index[4 * i]], &t->mb.vec[1][luma_index[4 * i]], 2, 2, 4); t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 0].vec[1] = t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 1].vec[1] = t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 8].vec[1] = t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 9].vec[1] = t->mb.vec[1][luma_index[4 * i]]; break; case B_L1_8x8 - 100: case B_Bi_8x8 - 100: t->mb.submb_part[luma_index[4 * i]] = MB_8x8; vec1[1] = t->mb.vec[1][luma_index[4 * i]]; T264_predict_mv(t, 1, luma_index[4 * i], 2, &vec1[1]); t->mb.vec[1][luma_index[4 * i]].x = eg_read_se(t->bs) + vec1[1].x; t->mb.vec[1][luma_index[4 * i]].y = eg_read_se(t->bs) + vec1[1].y; t->mb.vec[1][i / 2 * 8 + i % 2 * 2 + 1] = t->mb.vec[1][i / 2 * 8 + i % 2 * 2 + 4] = t->mb.vec[1][i / 2 * 8 + i % 2 * 2 + 5] = t->mb.vec[1][i / 2 * 8 + i % 2 * 2 + 0]; t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 0].vec[1] = t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 1].vec[1] = t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 8].vec[1] = t->mb.vec_ref[VEC_LUMA + i / 2 * 16 + i % 2 * 2 + 9].vec[1] = t->mb.vec[1][i / 2 * 8 + i % 2 * 2 + 0]; break; default : //other mode are not supported assert(0); break; } } break; default: t->mb.mb_part = mb_type - 23; T264dec_mb_read_intra_cavlc(t); /* save ref */ memset(t->mb.submb_part, -1, sizeof(t->mb.submb_part)); t->mb.mb_part = -1; for(i = 0 ; i < 2 ; i ++) { for(j = 0 ; j < 16 ; j ++) { INITINVALIDVEC(t->mb.vec[i][j]); } } break; } } else { t->mb.mb_part = mb_type; T264dec_mb_read_intra_cavlc(t); } if (t->mb.mb_mode != I_16x16 && t->mb.mb_mode != I_4x4) { int32_t cbp; cbp = inter_eg_to_cbp[eg_read_ue(t->bs)]; t->mb.cbp_y = cbp % 16; t->mb.cbp_c = cbp / 16; if (cbp > 0) { t->mb.mb_qp_delta = eg_read_se(t->bs); for(i = 0 ; i < 16 ; i ++) { if (t->mb.cbp_y & (1 << (i / 4))) { T264dec_mb_read_cavlc_residual(t, i, t->mb.dct_y_z[i], 16); } } } } if (t->mb.cbp_c != 0) { T264dec_mb_read_cavlc_residual(t, BLOCK_INDEX_CHROMA_DC, t->mb.dc2x2_z[0], 4); T264dec_mb_read_cavlc_residual(t, BLOCK_INDEX_CHROMA_DC, t->mb.dc2x2_z[1], 4); if (t->mb.cbp_c & 0x2) { for(i = 0 ; i < 4 ; i ++) { T264dec_mb_read_cavlc_residual(t, 16 + i, &(t->mb.dct_uv_z[0][i % 4][1]), 15); t->mb.dct_uv_z[0][i][0] = t->mb.dc2x2_z[0][i]; } for(i = 0 ; i < 4 ; i ++) { T264dec_mb_read_cavlc_residual(t, 20 + i, &(t->mb.dct_uv_z[1][i % 4][1]), 15); t->mb.dct_uv_z[1][i][0] = t->mb.dc2x2_z[1][i]; } } else { for(i = 0 ; i < 4 ; i ++) { t->mb.dct_uv_z[0][i][0] = t->mb.dc2x2_z[0][i]; t->mb.dct_uv_z[1][i][0] = t->mb.dc2x2_z[1][i]; } } } }