annotate h264_cabac.c @ 10893:2aafcafbe1f0 libavcodec

Replace cabac checks in inline functions from h264.h with constants. No benchmark because its just replacing variables with litteral constants (so no risk for slowdown outside gcc silliness) and i need sleep.
author michael
date Sat, 16 Jan 2010 05:41:33 +0000
parents 7101061bfa0f
children 1b5fba731e24
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10869
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1 /*
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
2 * H.26L/H.264/AVC/JVT/14496-10/... cabac decoding
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
4 *
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
5 * This file is part of FFmpeg.
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
6 *
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
11 *
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
15 * Lesser General Public License for more details.
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
16 *
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
20 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
21
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
22 /**
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
23 * @file libavcodec/h264_cabac.c
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
24 * H.264 / AVC / MPEG4 part10 cabac decoding.
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
25 * @author Michael Niedermayer <michaelni@gmx.at>
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
26 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
27
10893
2aafcafbe1f0 Replace cabac checks in inline functions from h264.h with constants.
michael
parents: 10869
diff changeset
28 #define CABAC 1
2aafcafbe1f0 Replace cabac checks in inline functions from h264.h with constants.
michael
parents: 10869
diff changeset
29
10869
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
30 #include "internal.h"
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
31 #include "dsputil.h"
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
32 #include "avcodec.h"
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
33 #include "h264.h"
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
34 #include "h264data.h"
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
35 #include "h264_mvpred.h"
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
36 #include "golomb.h"
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
37
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
38 #include "cabac.h"
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
39 #if ARCH_X86
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
40 #include "x86/h264_i386.h"
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
41 #endif
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
42
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
43 //#undef NDEBUG
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
44 #include <assert.h>
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
45
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
46 /* Cabac pre state table */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
47
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
48 static const int8_t cabac_context_init_I[460][2] =
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
49 {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
50 /* 0 - 10 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
51 { 20, -15 }, { 2, 54 }, { 3, 74 }, { 20, -15 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
52 { 2, 54 }, { 3, 74 }, { -28,127 }, { -23, 104 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
53 { -6, 53 }, { -1, 54 }, { 7, 51 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
54
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
55 /* 11 - 23 unsused for I */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
56 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
57 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
58 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
59 { 0, 0 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
60
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
61 /* 24- 39 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
62 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
63 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
64 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
65 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
66
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
67 /* 40 - 53 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
68 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
69 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
70 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
71 { 0, 0 }, { 0, 0 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
72
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
73 /* 54 - 59 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
74 { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
75 { 0, 0 }, { 0, 0 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
76
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
77 /* 60 - 69 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
78 { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
79 { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
80 { 13, 41 }, { 3, 62 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
81
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
82 /* 70 -> 87 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
83 { 0, 11 }, { 1, 55 }, { 0, 69 }, { -17, 127 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
84 { -13, 102 },{ 0, 82 }, { -7, 74 }, { -21, 107 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
85 { -27, 127 },{ -31, 127 },{ -24, 127 }, { -18, 95 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
86 { -27, 127 },{ -21, 114 },{ -30, 127 }, { -17, 123 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
87 { -12, 115 },{ -16, 122 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
88
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
89 /* 88 -> 104 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
90 { -11, 115 },{ -12, 63 }, { -2, 68 }, { -15, 84 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
91 { -13, 104 },{ -3, 70 }, { -8, 93 }, { -10, 90 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
92 { -30, 127 },{ -1, 74 }, { -6, 97 }, { -7, 91 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
93 { -20, 127 },{ -4, 56 }, { -5, 82 }, { -7, 76 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
94 { -22, 125 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
95
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
96 /* 105 -> 135 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
97 { -7, 93 }, { -11, 87 }, { -3, 77 }, { -5, 71 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
98 { -4, 63 }, { -4, 68 }, { -12, 84 }, { -7, 62 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
99 { -7, 65 }, { 8, 61 }, { 5, 56 }, { -2, 66 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
100 { 1, 64 }, { 0, 61 }, { -2, 78 }, { 1, 50 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
101 { 7, 52 }, { 10, 35 }, { 0, 44 }, { 11, 38 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
102 { 1, 45 }, { 0, 46 }, { 5, 44 }, { 31, 17 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
103 { 1, 51 }, { 7, 50 }, { 28, 19 }, { 16, 33 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
104 { 14, 62 }, { -13, 108 },{ -15, 100 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
105
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
106 /* 136 -> 165 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
107 { -13, 101 },{ -13, 91 }, { -12, 94 }, { -10, 88 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
108 { -16, 84 }, { -10, 86 }, { -7, 83 }, { -13, 87 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
109 { -19, 94 }, { 1, 70 }, { 0, 72 }, { -5, 74 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
110 { 18, 59 }, { -8, 102 }, { -15, 100 }, { 0, 95 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
111 { -4, 75 }, { 2, 72 }, { -11, 75 }, { -3, 71 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
112 { 15, 46 }, { -13, 69 }, { 0, 62 }, { 0, 65 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
113 { 21, 37 }, { -15, 72 }, { 9, 57 }, { 16, 54 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
114 { 0, 62 }, { 12, 72 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
115
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
116 /* 166 -> 196 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
117 { 24, 0 }, { 15, 9 }, { 8, 25 }, { 13, 18 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
118 { 15, 9 }, { 13, 19 }, { 10, 37 }, { 12, 18 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
119 { 6, 29 }, { 20, 33 }, { 15, 30 }, { 4, 45 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
120 { 1, 58 }, { 0, 62 }, { 7, 61 }, { 12, 38 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
121 { 11, 45 }, { 15, 39 }, { 11, 42 }, { 13, 44 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
122 { 16, 45 }, { 12, 41 }, { 10, 49 }, { 30, 34 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
123 { 18, 42 }, { 10, 55 }, { 17, 51 }, { 17, 46 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
124 { 0, 89 }, { 26, -19 }, { 22, -17 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
125
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
126 /* 197 -> 226 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
127 { 26, -17 }, { 30, -25 }, { 28, -20 }, { 33, -23 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
128 { 37, -27 }, { 33, -23 }, { 40, -28 }, { 38, -17 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
129 { 33, -11 }, { 40, -15 }, { 41, -6 }, { 38, 1 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
130 { 41, 17 }, { 30, -6 }, { 27, 3 }, { 26, 22 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
131 { 37, -16 }, { 35, -4 }, { 38, -8 }, { 38, -3 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
132 { 37, 3 }, { 38, 5 }, { 42, 0 }, { 35, 16 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
133 { 39, 22 }, { 14, 48 }, { 27, 37 }, { 21, 60 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
134 { 12, 68 }, { 2, 97 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
135
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
136 /* 227 -> 251 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
137 { -3, 71 }, { -6, 42 }, { -5, 50 }, { -3, 54 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
138 { -2, 62 }, { 0, 58 }, { 1, 63 }, { -2, 72 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
139 { -1, 74 }, { -9, 91 }, { -5, 67 }, { -5, 27 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
140 { -3, 39 }, { -2, 44 }, { 0, 46 }, { -16, 64 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
141 { -8, 68 }, { -10, 78 }, { -6, 77 }, { -10, 86 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
142 { -12, 92 }, { -15, 55 }, { -10, 60 }, { -6, 62 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
143 { -4, 65 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
144
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
145 /* 252 -> 275 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
146 { -12, 73 }, { -8, 76 }, { -7, 80 }, { -9, 88 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
147 { -17, 110 },{ -11, 97 }, { -20, 84 }, { -11, 79 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
148 { -6, 73 }, { -4, 74 }, { -13, 86 }, { -13, 96 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
149 { -11, 97 }, { -19, 117 },{ -8, 78 }, { -5, 33 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
150 { -4, 48 }, { -2, 53 }, { -3, 62 }, { -13, 71 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
151 { -10, 79 }, { -12, 86 }, { -13, 90 }, { -14, 97 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
152
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
153 /* 276 a bit special (not used, bypass is used instead) */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
154 { 0, 0 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
155
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
156 /* 277 -> 307 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
157 { -6, 93 }, { -6, 84 }, { -8, 79 }, { 0, 66 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
158 { -1, 71 }, { 0, 62 }, { -2, 60 }, { -2, 59 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
159 { -5, 75 }, { -3, 62 }, { -4, 58 }, { -9, 66 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
160 { -1, 79 }, { 0, 71 }, { 3, 68 }, { 10, 44 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
161 { -7, 62 }, { 15, 36 }, { 14, 40 }, { 16, 27 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
162 { 12, 29 }, { 1, 44 }, { 20, 36 }, { 18, 32 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
163 { 5, 42 }, { 1, 48 }, { 10, 62 }, { 17, 46 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
164 { 9, 64 }, { -12, 104 },{ -11, 97 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
165
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
166 /* 308 -> 337 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
167 { -16, 96 }, { -7, 88 }, { -8, 85 }, { -7, 85 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
168 { -9, 85 }, { -13, 88 }, { 4, 66 }, { -3, 77 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
169 { -3, 76 }, { -6, 76 }, { 10, 58 }, { -1, 76 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
170 { -1, 83 }, { -7, 99 }, { -14, 95 }, { 2, 95 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
171 { 0, 76 }, { -5, 74 }, { 0, 70 }, { -11, 75 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
172 { 1, 68 }, { 0, 65 }, { -14, 73 }, { 3, 62 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
173 { 4, 62 }, { -1, 68 }, { -13, 75 }, { 11, 55 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
174 { 5, 64 }, { 12, 70 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
175
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
176 /* 338 -> 368 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
177 { 15, 6 }, { 6, 19 }, { 7, 16 }, { 12, 14 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
178 { 18, 13 }, { 13, 11 }, { 13, 15 }, { 15, 16 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
179 { 12, 23 }, { 13, 23 }, { 15, 20 }, { 14, 26 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
180 { 14, 44 }, { 17, 40 }, { 17, 47 }, { 24, 17 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
181 { 21, 21 }, { 25, 22 }, { 31, 27 }, { 22, 29 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
182 { 19, 35 }, { 14, 50 }, { 10, 57 }, { 7, 63 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
183 { -2, 77 }, { -4, 82 }, { -3, 94 }, { 9, 69 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
184 { -12, 109 },{ 36, -35 }, { 36, -34 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
185
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
186 /* 369 -> 398 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
187 { 32, -26 }, { 37, -30 }, { 44, -32 }, { 34, -18 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
188 { 34, -15 }, { 40, -15 }, { 33, -7 }, { 35, -5 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
189 { 33, 0 }, { 38, 2 }, { 33, 13 }, { 23, 35 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
190 { 13, 58 }, { 29, -3 }, { 26, 0 }, { 22, 30 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
191 { 31, -7 }, { 35, -15 }, { 34, -3 }, { 34, 3 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
192 { 36, -1 }, { 34, 5 }, { 32, 11 }, { 35, 5 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
193 { 34, 12 }, { 39, 11 }, { 30, 29 }, { 34, 26 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
194 { 29, 39 }, { 19, 66 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
195
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
196 /* 399 -> 435 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
197 { 31, 21 }, { 31, 31 }, { 25, 50 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
198 { -17, 120 }, { -20, 112 }, { -18, 114 }, { -11, 85 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
199 { -15, 92 }, { -14, 89 }, { -26, 71 }, { -15, 81 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
200 { -14, 80 }, { 0, 68 }, { -14, 70 }, { -24, 56 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
201 { -23, 68 }, { -24, 50 }, { -11, 74 }, { 23, -13 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
202 { 26, -13 }, { 40, -15 }, { 49, -14 }, { 44, 3 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
203 { 45, 6 }, { 44, 34 }, { 33, 54 }, { 19, 82 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
204 { -3, 75 }, { -1, 23 }, { 1, 34 }, { 1, 43 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
205 { 0, 54 }, { -2, 55 }, { 0, 61 }, { 1, 64 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
206 { 0, 68 }, { -9, 92 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
207
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
208 /* 436 -> 459 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
209 { -14, 106 }, { -13, 97 }, { -15, 90 }, { -12, 90 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
210 { -18, 88 }, { -10, 73 }, { -9, 79 }, { -14, 86 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
211 { -10, 73 }, { -10, 70 }, { -10, 69 }, { -5, 66 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
212 { -9, 64 }, { -5, 58 }, { 2, 59 }, { 21, -10 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
213 { 24, -11 }, { 28, -8 }, { 28, -1 }, { 29, 3 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
214 { 29, 9 }, { 35, 20 }, { 29, 36 }, { 14, 67 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
215 };
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
216
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
217 static const int8_t cabac_context_init_PB[3][460][2] =
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
218 {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
219 /* i_cabac_init_idc == 0 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
220 {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
221 /* 0 - 10 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
222 { 20, -15 }, { 2, 54 }, { 3, 74 }, { 20, -15 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
223 { 2, 54 }, { 3, 74 }, { -28, 127 }, { -23, 104 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
224 { -6, 53 }, { -1, 54 }, { 7, 51 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
225
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
226 /* 11 - 23 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
227 { 23, 33 }, { 23, 2 }, { 21, 0 }, { 1, 9 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
228 { 0, 49 }, { -37, 118 }, { 5, 57 }, { -13, 78 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
229 { -11, 65 }, { 1, 62 }, { 12, 49 }, { -4, 73 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
230 { 17, 50 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
231
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
232 /* 24 - 39 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
233 { 18, 64 }, { 9, 43 }, { 29, 0 }, { 26, 67 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
234 { 16, 90 }, { 9, 104 }, { -46, 127 }, { -20, 104 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
235 { 1, 67 }, { -13, 78 }, { -11, 65 }, { 1, 62 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
236 { -6, 86 }, { -17, 95 }, { -6, 61 }, { 9, 45 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
237
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
238 /* 40 - 53 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
239 { -3, 69 }, { -6, 81 }, { -11, 96 }, { 6, 55 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
240 { 7, 67 }, { -5, 86 }, { 2, 88 }, { 0, 58 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
241 { -3, 76 }, { -10, 94 }, { 5, 54 }, { 4, 69 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
242 { -3, 81 }, { 0, 88 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
243
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
244 /* 54 - 59 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
245 { -7, 67 }, { -5, 74 }, { -4, 74 }, { -5, 80 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
246 { -7, 72 }, { 1, 58 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
247
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
248 /* 60 - 69 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
249 { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
250 { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
251 { 13, 41 }, { 3, 62 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
252
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
253 /* 70 - 87 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
254 { 0, 45 }, { -4, 78 }, { -3, 96 }, { -27, 126 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
255 { -28, 98 }, { -25, 101 }, { -23, 67 }, { -28, 82 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
256 { -20, 94 }, { -16, 83 }, { -22, 110 }, { -21, 91 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
257 { -18, 102 }, { -13, 93 }, { -29, 127 }, { -7, 92 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
258 { -5, 89 }, { -7, 96 }, { -13, 108 }, { -3, 46 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
259 { -1, 65 }, { -1, 57 }, { -9, 93 }, { -3, 74 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
260 { -9, 92 }, { -8, 87 }, { -23, 126 }, { 5, 54 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
261 { 6, 60 }, { 6, 59 }, { 6, 69 }, { -1, 48 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
262 { 0, 68 }, { -4, 69 }, { -8, 88 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
263
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
264 /* 105 -> 165 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
265 { -2, 85 }, { -6, 78 }, { -1, 75 }, { -7, 77 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
266 { 2, 54 }, { 5, 50 }, { -3, 68 }, { 1, 50 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
267 { 6, 42 }, { -4, 81 }, { 1, 63 }, { -4, 70 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
268 { 0, 67 }, { 2, 57 }, { -2, 76 }, { 11, 35 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
269 { 4, 64 }, { 1, 61 }, { 11, 35 }, { 18, 25 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
270 { 12, 24 }, { 13, 29 }, { 13, 36 }, { -10, 93 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
271 { -7, 73 }, { -2, 73 }, { 13, 46 }, { 9, 49 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
272 { -7, 100 }, { 9, 53 }, { 2, 53 }, { 5, 53 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
273 { -2, 61 }, { 0, 56 }, { 0, 56 }, { -13, 63 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
274 { -5, 60 }, { -1, 62 }, { 4, 57 }, { -6, 69 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
275 { 4, 57 }, { 14, 39 }, { 4, 51 }, { 13, 68 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
276 { 3, 64 }, { 1, 61 }, { 9, 63 }, { 7, 50 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
277 { 16, 39 }, { 5, 44 }, { 4, 52 }, { 11, 48 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
278 { -5, 60 }, { -1, 59 }, { 0, 59 }, { 22, 33 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
279 { 5, 44 }, { 14, 43 }, { -1, 78 }, { 0, 60 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
280 { 9, 69 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
281
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
282 /* 166 - 226 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
283 { 11, 28 }, { 2, 40 }, { 3, 44 }, { 0, 49 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
284 { 0, 46 }, { 2, 44 }, { 2, 51 }, { 0, 47 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
285 { 4, 39 }, { 2, 62 }, { 6, 46 }, { 0, 54 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
286 { 3, 54 }, { 2, 58 }, { 4, 63 }, { 6, 51 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
287 { 6, 57 }, { 7, 53 }, { 6, 52 }, { 6, 55 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
288 { 11, 45 }, { 14, 36 }, { 8, 53 }, { -1, 82 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
289 { 7, 55 }, { -3, 78 }, { 15, 46 }, { 22, 31 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
290 { -1, 84 }, { 25, 7 }, { 30, -7 }, { 28, 3 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
291 { 28, 4 }, { 32, 0 }, { 34, -1 }, { 30, 6 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
292 { 30, 6 }, { 32, 9 }, { 31, 19 }, { 26, 27 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
293 { 26, 30 }, { 37, 20 }, { 28, 34 }, { 17, 70 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
294 { 1, 67 }, { 5, 59 }, { 9, 67 }, { 16, 30 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
295 { 18, 32 }, { 18, 35 }, { 22, 29 }, { 24, 31 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
296 { 23, 38 }, { 18, 43 }, { 20, 41 }, { 11, 63 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
297 { 9, 59 }, { 9, 64 }, { -1, 94 }, { -2, 89 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
298 { -9, 108 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
299
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
300 /* 227 - 275 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
301 { -6, 76 }, { -2, 44 }, { 0, 45 }, { 0, 52 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
302 { -3, 64 }, { -2, 59 }, { -4, 70 }, { -4, 75 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
303 { -8, 82 }, { -17, 102 }, { -9, 77 }, { 3, 24 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
304 { 0, 42 }, { 0, 48 }, { 0, 55 }, { -6, 59 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
305 { -7, 71 }, { -12, 83 }, { -11, 87 }, { -30, 119 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
306 { 1, 58 }, { -3, 29 }, { -1, 36 }, { 1, 38 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
307 { 2, 43 }, { -6, 55 }, { 0, 58 }, { 0, 64 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
308 { -3, 74 }, { -10, 90 }, { 0, 70 }, { -4, 29 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
309 { 5, 31 }, { 7, 42 }, { 1, 59 }, { -2, 58 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
310 { -3, 72 }, { -3, 81 }, { -11, 97 }, { 0, 58 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
311 { 8, 5 }, { 10, 14 }, { 14, 18 }, { 13, 27 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
312 { 2, 40 }, { 0, 58 }, { -3, 70 }, { -6, 79 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
313 { -8, 85 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
314
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
315 /* 276 a bit special (not used, bypass is used instead) */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
316 { 0, 0 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
317
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
318 /* 277 - 337 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
319 { -13, 106 }, { -16, 106 }, { -10, 87 }, { -21, 114 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
320 { -18, 110 }, { -14, 98 }, { -22, 110 }, { -21, 106 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
321 { -18, 103 }, { -21, 107 }, { -23, 108 }, { -26, 112 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
322 { -10, 96 }, { -12, 95 }, { -5, 91 }, { -9, 93 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
323 { -22, 94 }, { -5, 86 }, { 9, 67 }, { -4, 80 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
324 { -10, 85 }, { -1, 70 }, { 7, 60 }, { 9, 58 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
325 { 5, 61 }, { 12, 50 }, { 15, 50 }, { 18, 49 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
326 { 17, 54 }, { 10, 41 }, { 7, 46 }, { -1, 51 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
327 { 7, 49 }, { 8, 52 }, { 9, 41 }, { 6, 47 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
328 { 2, 55 }, { 13, 41 }, { 10, 44 }, { 6, 50 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
329 { 5, 53 }, { 13, 49 }, { 4, 63 }, { 6, 64 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
330 { -2, 69 }, { -2, 59 }, { 6, 70 }, { 10, 44 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
331 { 9, 31 }, { 12, 43 }, { 3, 53 }, { 14, 34 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
332 { 10, 38 }, { -3, 52 }, { 13, 40 }, { 17, 32 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
333 { 7, 44 }, { 7, 38 }, { 13, 50 }, { 10, 57 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
334 { 26, 43 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
335
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
336 /* 338 - 398 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
337 { 14, 11 }, { 11, 14 }, { 9, 11 }, { 18, 11 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
338 { 21, 9 }, { 23, -2 }, { 32, -15 }, { 32, -15 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
339 { 34, -21 }, { 39, -23 }, { 42, -33 }, { 41, -31 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
340 { 46, -28 }, { 38, -12 }, { 21, 29 }, { 45, -24 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
341 { 53, -45 }, { 48, -26 }, { 65, -43 }, { 43, -19 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
342 { 39, -10 }, { 30, 9 }, { 18, 26 }, { 20, 27 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
343 { 0, 57 }, { -14, 82 }, { -5, 75 }, { -19, 97 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
344 { -35, 125 }, { 27, 0 }, { 28, 0 }, { 31, -4 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
345 { 27, 6 }, { 34, 8 }, { 30, 10 }, { 24, 22 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
346 { 33, 19 }, { 22, 32 }, { 26, 31 }, { 21, 41 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
347 { 26, 44 }, { 23, 47 }, { 16, 65 }, { 14, 71 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
348 { 8, 60 }, { 6, 63 }, { 17, 65 }, { 21, 24 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
349 { 23, 20 }, { 26, 23 }, { 27, 32 }, { 28, 23 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
350 { 28, 24 }, { 23, 40 }, { 24, 32 }, { 28, 29 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
351 { 23, 42 }, { 19, 57 }, { 22, 53 }, { 22, 61 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
352 { 11, 86 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
353
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
354 /* 399 - 435 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
355 { 12, 40 }, { 11, 51 }, { 14, 59 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
356 { -4, 79 }, { -7, 71 }, { -5, 69 }, { -9, 70 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
357 { -8, 66 }, { -10, 68 }, { -19, 73 }, { -12, 69 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
358 { -16, 70 }, { -15, 67 }, { -20, 62 }, { -19, 70 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
359 { -16, 66 }, { -22, 65 }, { -20, 63 }, { 9, -2 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
360 { 26, -9 }, { 33, -9 }, { 39, -7 }, { 41, -2 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
361 { 45, 3 }, { 49, 9 }, { 45, 27 }, { 36, 59 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
362 { -6, 66 }, { -7, 35 }, { -7, 42 }, { -8, 45 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
363 { -5, 48 }, { -12, 56 }, { -6, 60 }, { -5, 62 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
364 { -8, 66 }, { -8, 76 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
365
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
366 /* 436 - 459 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
367 { -5, 85 }, { -6, 81 }, { -10, 77 }, { -7, 81 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
368 { -17, 80 }, { -18, 73 }, { -4, 74 }, { -10, 83 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
369 { -9, 71 }, { -9, 67 }, { -1, 61 }, { -8, 66 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
370 { -14, 66 }, { 0, 59 }, { 2, 59 }, { 21, -13 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
371 { 33, -14 }, { 39, -7 }, { 46, -2 }, { 51, 2 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
372 { 60, 6 }, { 61, 17 }, { 55, 34 }, { 42, 62 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
373 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
374
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
375 /* i_cabac_init_idc == 1 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
376 {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
377 /* 0 - 10 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
378 { 20, -15 }, { 2, 54 }, { 3, 74 }, { 20, -15 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
379 { 2, 54 }, { 3, 74 }, { -28, 127 }, { -23, 104 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
380 { -6, 53 }, { -1, 54 }, { 7, 51 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
381
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
382 /* 11 - 23 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
383 { 22, 25 }, { 34, 0 }, { 16, 0 }, { -2, 9 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
384 { 4, 41 }, { -29, 118 }, { 2, 65 }, { -6, 71 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
385 { -13, 79 }, { 5, 52 }, { 9, 50 }, { -3, 70 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
386 { 10, 54 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
387
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
388 /* 24 - 39 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
389 { 26, 34 }, { 19, 22 }, { 40, 0 }, { 57, 2 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
390 { 41, 36 }, { 26, 69 }, { -45, 127 }, { -15, 101 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
391 { -4, 76 }, { -6, 71 }, { -13, 79 }, { 5, 52 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
392 { 6, 69 }, { -13, 90 }, { 0, 52 }, { 8, 43 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
393
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
394 /* 40 - 53 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
395 { -2, 69 },{ -5, 82 },{ -10, 96 },{ 2, 59 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
396 { 2, 75 },{ -3, 87 },{ -3, 100 },{ 1, 56 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
397 { -3, 74 },{ -6, 85 },{ 0, 59 },{ -3, 81 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
398 { -7, 86 },{ -5, 95 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
399
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
400 /* 54 - 59 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
401 { -1, 66 },{ -1, 77 },{ 1, 70 },{ -2, 86 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
402 { -5, 72 },{ 0, 61 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
403
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
404 /* 60 - 69 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
405 { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
406 { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
407 { 13, 41 }, { 3, 62 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
408
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
409 /* 70 - 104 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
410 { 13, 15 }, { 7, 51 }, { 2, 80 }, { -39, 127 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
411 { -18, 91 }, { -17, 96 }, { -26, 81 }, { -35, 98 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
412 { -24, 102 }, { -23, 97 }, { -27, 119 }, { -24, 99 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
413 { -21, 110 }, { -18, 102 }, { -36, 127 }, { 0, 80 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
414 { -5, 89 }, { -7, 94 }, { -4, 92 }, { 0, 39 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
415 { 0, 65 }, { -15, 84 }, { -35, 127 }, { -2, 73 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
416 { -12, 104 }, { -9, 91 }, { -31, 127 }, { 3, 55 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
417 { 7, 56 }, { 7, 55 }, { 8, 61 }, { -3, 53 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
418 { 0, 68 }, { -7, 74 }, { -9, 88 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
419
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
420 /* 105 -> 165 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
421 { -13, 103 }, { -13, 91 }, { -9, 89 }, { -14, 92 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
422 { -8, 76 }, { -12, 87 }, { -23, 110 }, { -24, 105 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
423 { -10, 78 }, { -20, 112 }, { -17, 99 }, { -78, 127 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
424 { -70, 127 }, { -50, 127 }, { -46, 127 }, { -4, 66 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
425 { -5, 78 }, { -4, 71 }, { -8, 72 }, { 2, 59 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
426 { -1, 55 }, { -7, 70 }, { -6, 75 }, { -8, 89 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
427 { -34, 119 }, { -3, 75 }, { 32, 20 }, { 30, 22 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
428 { -44, 127 }, { 0, 54 }, { -5, 61 }, { 0, 58 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
429 { -1, 60 }, { -3, 61 }, { -8, 67 }, { -25, 84 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
430 { -14, 74 }, { -5, 65 }, { 5, 52 }, { 2, 57 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
431 { 0, 61 }, { -9, 69 }, { -11, 70 }, { 18, 55 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
432 { -4, 71 }, { 0, 58 }, { 7, 61 }, { 9, 41 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
433 { 18, 25 }, { 9, 32 }, { 5, 43 }, { 9, 47 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
434 { 0, 44 }, { 0, 51 }, { 2, 46 }, { 19, 38 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
435 { -4, 66 }, { 15, 38 }, { 12, 42 }, { 9, 34 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
436 { 0, 89 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
437
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
438 /* 166 - 226 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
439 { 4, 45 }, { 10, 28 }, { 10, 31 }, { 33, -11 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
440 { 52, -43 }, { 18, 15 }, { 28, 0 }, { 35, -22 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
441 { 38, -25 }, { 34, 0 }, { 39, -18 }, { 32, -12 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
442 { 102, -94 }, { 0, 0 }, { 56, -15 }, { 33, -4 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
443 { 29, 10 }, { 37, -5 }, { 51, -29 }, { 39, -9 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
444 { 52, -34 }, { 69, -58 }, { 67, -63 }, { 44, -5 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
445 { 32, 7 }, { 55, -29 }, { 32, 1 }, { 0, 0 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
446 { 27, 36 }, { 33, -25 }, { 34, -30 }, { 36, -28 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
447 { 38, -28 }, { 38, -27 }, { 34, -18 }, { 35, -16 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
448 { 34, -14 }, { 32, -8 }, { 37, -6 }, { 35, 0 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
449 { 30, 10 }, { 28, 18 }, { 26, 25 }, { 29, 41 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
450 { 0, 75 }, { 2, 72 }, { 8, 77 }, { 14, 35 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
451 { 18, 31 }, { 17, 35 }, { 21, 30 }, { 17, 45 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
452 { 20, 42 }, { 18, 45 }, { 27, 26 }, { 16, 54 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
453 { 7, 66 }, { 16, 56 }, { 11, 73 }, { 10, 67 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
454 { -10, 116 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
455
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
456 /* 227 - 275 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
457 { -23, 112 }, { -15, 71 }, { -7, 61 }, { 0, 53 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
458 { -5, 66 }, { -11, 77 }, { -9, 80 }, { -9, 84 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
459 { -10, 87 }, { -34, 127 }, { -21, 101 }, { -3, 39 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
460 { -5, 53 }, { -7, 61 }, { -11, 75 }, { -15, 77 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
461 { -17, 91 }, { -25, 107 }, { -25, 111 }, { -28, 122 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
462 { -11, 76 }, { -10, 44 }, { -10, 52 }, { -10, 57 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
463 { -9, 58 }, { -16, 72 }, { -7, 69 }, { -4, 69 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
464 { -5, 74 }, { -9, 86 }, { 2, 66 }, { -9, 34 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
465 { 1, 32 }, { 11, 31 }, { 5, 52 }, { -2, 55 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
466 { -2, 67 }, { 0, 73 }, { -8, 89 }, { 3, 52 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
467 { 7, 4 }, { 10, 8 }, { 17, 8 }, { 16, 19 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
468 { 3, 37 }, { -1, 61 }, { -5, 73 }, { -1, 70 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
469 { -4, 78 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
470
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
471 /* 276 a bit special (not used, bypass is used instead) */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
472 { 0, 0 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
473
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
474 /* 277 - 337 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
475 { -21, 126 }, { -23, 124 }, { -20, 110 }, { -26, 126 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
476 { -25, 124 }, { -17, 105 }, { -27, 121 }, { -27, 117 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
477 { -17, 102 }, { -26, 117 }, { -27, 116 }, { -33, 122 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
478 { -10, 95 }, { -14, 100 }, { -8, 95 }, { -17, 111 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
479 { -28, 114 }, { -6, 89 }, { -2, 80 }, { -4, 82 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
480 { -9, 85 }, { -8, 81 }, { -1, 72 }, { 5, 64 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
481 { 1, 67 }, { 9, 56 }, { 0, 69 }, { 1, 69 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
482 { 7, 69 }, { -7, 69 }, { -6, 67 }, { -16, 77 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
483 { -2, 64 }, { 2, 61 }, { -6, 67 }, { -3, 64 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
484 { 2, 57 }, { -3, 65 }, { -3, 66 }, { 0, 62 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
485 { 9, 51 }, { -1, 66 }, { -2, 71 }, { -2, 75 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
486 { -1, 70 }, { -9, 72 }, { 14, 60 }, { 16, 37 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
487 { 0, 47 }, { 18, 35 }, { 11, 37 }, { 12, 41 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
488 { 10, 41 }, { 2, 48 }, { 12, 41 }, { 13, 41 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
489 { 0, 59 }, { 3, 50 }, { 19, 40 }, { 3, 66 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
490 { 18, 50 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
491
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
492 /* 338 - 398 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
493 { 19, -6 }, { 18, -6 }, { 14, 0 }, { 26, -12 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
494 { 31, -16 }, { 33, -25 }, { 33, -22 }, { 37, -28 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
495 { 39, -30 }, { 42, -30 }, { 47, -42 }, { 45, -36 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
496 { 49, -34 }, { 41, -17 }, { 32, 9 }, { 69, -71 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
497 { 63, -63 }, { 66, -64 }, { 77, -74 }, { 54, -39 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
498 { 52, -35 }, { 41, -10 }, { 36, 0 }, { 40, -1 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
499 { 30, 14 }, { 28, 26 }, { 23, 37 }, { 12, 55 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
500 { 11, 65 }, { 37, -33 }, { 39, -36 }, { 40, -37 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
501 { 38, -30 }, { 46, -33 }, { 42, -30 }, { 40, -24 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
502 { 49, -29 }, { 38, -12 }, { 40, -10 }, { 38, -3 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
503 { 46, -5 }, { 31, 20 }, { 29, 30 }, { 25, 44 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
504 { 12, 48 }, { 11, 49 }, { 26, 45 }, { 22, 22 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
505 { 23, 22 }, { 27, 21 }, { 33, 20 }, { 26, 28 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
506 { 30, 24 }, { 27, 34 }, { 18, 42 }, { 25, 39 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
507 { 18, 50 }, { 12, 70 }, { 21, 54 }, { 14, 71 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
508 { 11, 83 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
509
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
510 /* 399 - 435 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
511 { 25, 32 }, { 21, 49 }, { 21, 54 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
512 { -5, 85 }, { -6, 81 }, { -10, 77 }, { -7, 81 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
513 { -17, 80 }, { -18, 73 }, { -4, 74 }, { -10, 83 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
514 { -9, 71 }, { -9, 67 }, { -1, 61 }, { -8, 66 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
515 { -14, 66 }, { 0, 59 }, { 2, 59 }, { 17, -10 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
516 { 32, -13 }, { 42, -9 }, { 49, -5 }, { 53, 0 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
517 { 64, 3 }, { 68, 10 }, { 66, 27 }, { 47, 57 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
518 { -5, 71 }, { 0, 24 }, { -1, 36 }, { -2, 42 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
519 { -2, 52 }, { -9, 57 }, { -6, 63 }, { -4, 65 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
520 { -4, 67 }, { -7, 82 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
521
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
522 /* 436 - 459 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
523 { -3, 81 }, { -3, 76 }, { -7, 72 }, { -6, 78 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
524 { -12, 72 }, { -14, 68 }, { -3, 70 }, { -6, 76 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
525 { -5, 66 }, { -5, 62 }, { 0, 57 }, { -4, 61 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
526 { -9, 60 }, { 1, 54 }, { 2, 58 }, { 17, -10 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
527 { 32, -13 }, { 42, -9 }, { 49, -5 }, { 53, 0 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
528 { 64, 3 }, { 68, 10 }, { 66, 27 }, { 47, 57 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
529 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
530
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
531 /* i_cabac_init_idc == 2 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
532 {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
533 /* 0 - 10 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
534 { 20, -15 }, { 2, 54 }, { 3, 74 }, { 20, -15 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
535 { 2, 54 }, { 3, 74 }, { -28, 127 }, { -23, 104 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
536 { -6, 53 }, { -1, 54 }, { 7, 51 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
537
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
538 /* 11 - 23 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
539 { 29, 16 }, { 25, 0 }, { 14, 0 }, { -10, 51 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
540 { -3, 62 }, { -27, 99 }, { 26, 16 }, { -4, 85 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
541 { -24, 102 }, { 5, 57 }, { 6, 57 }, { -17, 73 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
542 { 14, 57 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
543
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
544 /* 24 - 39 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
545 { 20, 40 }, { 20, 10 }, { 29, 0 }, { 54, 0 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
546 { 37, 42 }, { 12, 97 }, { -32, 127 }, { -22, 117 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
547 { -2, 74 }, { -4, 85 }, { -24, 102 }, { 5, 57 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
548 { -6, 93 }, { -14, 88 }, { -6, 44 }, { 4, 55 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
549
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
550 /* 40 - 53 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
551 { -11, 89 },{ -15, 103 },{ -21, 116 },{ 19, 57 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
552 { 20, 58 },{ 4, 84 },{ 6, 96 },{ 1, 63 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
553 { -5, 85 },{ -13, 106 },{ 5, 63 },{ 6, 75 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
554 { -3, 90 },{ -1, 101 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
555
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
556 /* 54 - 59 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
557 { 3, 55 },{ -4, 79 },{ -2, 75 },{ -12, 97 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
558 { -7, 50 },{ 1, 60 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
559
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
560 /* 60 - 69 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
561 { 0, 41 }, { 0, 63 }, { 0, 63 }, { 0, 63 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
562 { -9, 83 }, { 4, 86 }, { 0, 97 }, { -7, 72 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
563 { 13, 41 }, { 3, 62 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
564
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
565 /* 70 - 104 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
566 { 7, 34 }, { -9, 88 }, { -20, 127 }, { -36, 127 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
567 { -17, 91 }, { -14, 95 }, { -25, 84 }, { -25, 86 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
568 { -12, 89 }, { -17, 91 }, { -31, 127 }, { -14, 76 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
569 { -18, 103 }, { -13, 90 }, { -37, 127 }, { 11, 80 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
570 { 5, 76 }, { 2, 84 }, { 5, 78 }, { -6, 55 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
571 { 4, 61 }, { -14, 83 }, { -37, 127 }, { -5, 79 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
572 { -11, 104 }, { -11, 91 }, { -30, 127 }, { 0, 65 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
573 { -2, 79 }, { 0, 72 }, { -4, 92 }, { -6, 56 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
574 { 3, 68 }, { -8, 71 }, { -13, 98 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
575
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
576 /* 105 -> 165 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
577 { -4, 86 }, { -12, 88 }, { -5, 82 }, { -3, 72 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
578 { -4, 67 }, { -8, 72 }, { -16, 89 }, { -9, 69 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
579 { -1, 59 }, { 5, 66 }, { 4, 57 }, { -4, 71 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
580 { -2, 71 }, { 2, 58 }, { -1, 74 }, { -4, 44 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
581 { -1, 69 }, { 0, 62 }, { -7, 51 }, { -4, 47 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
582 { -6, 42 }, { -3, 41 }, { -6, 53 }, { 8, 76 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
583 { -9, 78 }, { -11, 83 }, { 9, 52 }, { 0, 67 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
584 { -5, 90 }, { 1, 67 }, { -15, 72 }, { -5, 75 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
585 { -8, 80 }, { -21, 83 }, { -21, 64 }, { -13, 31 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
586 { -25, 64 }, { -29, 94 }, { 9, 75 }, { 17, 63 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
587 { -8, 74 }, { -5, 35 }, { -2, 27 }, { 13, 91 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
588 { 3, 65 }, { -7, 69 }, { 8, 77 }, { -10, 66 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
589 { 3, 62 }, { -3, 68 }, { -20, 81 }, { 0, 30 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
590 { 1, 7 }, { -3, 23 }, { -21, 74 }, { 16, 66 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
591 { -23, 124 }, { 17, 37 }, { 44, -18 }, { 50, -34 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
592 { -22, 127 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
593
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
594 /* 166 - 226 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
595 { 4, 39 }, { 0, 42 }, { 7, 34 }, { 11, 29 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
596 { 8, 31 }, { 6, 37 }, { 7, 42 }, { 3, 40 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
597 { 8, 33 }, { 13, 43 }, { 13, 36 }, { 4, 47 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
598 { 3, 55 }, { 2, 58 }, { 6, 60 }, { 8, 44 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
599 { 11, 44 }, { 14, 42 }, { 7, 48 }, { 4, 56 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
600 { 4, 52 }, { 13, 37 }, { 9, 49 }, { 19, 58 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
601 { 10, 48 }, { 12, 45 }, { 0, 69 }, { 20, 33 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
602 { 8, 63 }, { 35, -18 }, { 33, -25 }, { 28, -3 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
603 { 24, 10 }, { 27, 0 }, { 34, -14 }, { 52, -44 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
604 { 39, -24 }, { 19, 17 }, { 31, 25 }, { 36, 29 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
605 { 24, 33 }, { 34, 15 }, { 30, 20 }, { 22, 73 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
606 { 20, 34 }, { 19, 31 }, { 27, 44 }, { 19, 16 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
607 { 15, 36 }, { 15, 36 }, { 21, 28 }, { 25, 21 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
608 { 30, 20 }, { 31, 12 }, { 27, 16 }, { 24, 42 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
609 { 0, 93 }, { 14, 56 }, { 15, 57 }, { 26, 38 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
610 { -24, 127 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
611
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
612 /* 227 - 275 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
613 { -24, 115 }, { -22, 82 }, { -9, 62 }, { 0, 53 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
614 { 0, 59 }, { -14, 85 }, { -13, 89 }, { -13, 94 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
615 { -11, 92 }, { -29, 127 }, { -21, 100 }, { -14, 57 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
616 { -12, 67 }, { -11, 71 }, { -10, 77 }, { -21, 85 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
617 { -16, 88 }, { -23, 104 }, { -15, 98 }, { -37, 127 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
618 { -10, 82 }, { -8, 48 }, { -8, 61 }, { -8, 66 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
619 { -7, 70 }, { -14, 75 }, { -10, 79 }, { -9, 83 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
620 { -12, 92 }, { -18, 108 }, { -4, 79 }, { -22, 69 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
621 { -16, 75 }, { -2, 58 }, { 1, 58 }, { -13, 78 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
622 { -9, 83 }, { -4, 81 }, { -13, 99 }, { -13, 81 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
623 { -6, 38 }, { -13, 62 }, { -6, 58 }, { -2, 59 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
624 { -16, 73 }, { -10, 76 }, { -13, 86 }, { -9, 83 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
625 { -10, 87 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
626
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
627 /* 276 a bit special (not used, bypass is used instead) */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
628 { 0, 0 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
629
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
630 /* 277 - 337 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
631 { -22, 127 }, { -25, 127 }, { -25, 120 }, { -27, 127 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
632 { -19, 114 }, { -23, 117 }, { -25, 118 }, { -26, 117 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
633 { -24, 113 }, { -28, 118 }, { -31, 120 }, { -37, 124 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
634 { -10, 94 }, { -15, 102 }, { -10, 99 }, { -13, 106 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
635 { -50, 127 }, { -5, 92 }, { 17, 57 }, { -5, 86 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
636 { -13, 94 }, { -12, 91 }, { -2, 77 }, { 0, 71 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
637 { -1, 73 }, { 4, 64 }, { -7, 81 }, { 5, 64 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
638 { 15, 57 }, { 1, 67 }, { 0, 68 }, { -10, 67 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
639 { 1, 68 }, { 0, 77 }, { 2, 64 }, { 0, 68 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
640 { -5, 78 }, { 7, 55 }, { 5, 59 }, { 2, 65 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
641 { 14, 54 }, { 15, 44 }, { 5, 60 }, { 2, 70 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
642 { -2, 76 }, { -18, 86 }, { 12, 70 }, { 5, 64 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
643 { -12, 70 }, { 11, 55 }, { 5, 56 }, { 0, 69 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
644 { 2, 65 }, { -6, 74 }, { 5, 54 }, { 7, 54 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
645 { -6, 76 }, { -11, 82 }, { -2, 77 }, { -2, 77 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
646 { 25, 42 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
647
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
648 /* 338 - 398 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
649 { 17, -13 }, { 16, -9 }, { 17, -12 }, { 27, -21 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
650 { 37, -30 }, { 41, -40 }, { 42, -41 }, { 48, -47 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
651 { 39, -32 }, { 46, -40 }, { 52, -51 }, { 46, -41 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
652 { 52, -39 }, { 43, -19 }, { 32, 11 }, { 61, -55 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
653 { 56, -46 }, { 62, -50 }, { 81, -67 }, { 45, -20 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
654 { 35, -2 }, { 28, 15 }, { 34, 1 }, { 39, 1 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
655 { 30, 17 }, { 20, 38 }, { 18, 45 }, { 15, 54 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
656 { 0, 79 }, { 36, -16 }, { 37, -14 }, { 37, -17 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
657 { 32, 1 }, { 34, 15 }, { 29, 15 }, { 24, 25 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
658 { 34, 22 }, { 31, 16 }, { 35, 18 }, { 31, 28 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
659 { 33, 41 }, { 36, 28 }, { 27, 47 }, { 21, 62 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
660 { 18, 31 }, { 19, 26 }, { 36, 24 }, { 24, 23 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
661 { 27, 16 }, { 24, 30 }, { 31, 29 }, { 22, 41 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
662 { 22, 42 }, { 16, 60 }, { 15, 52 }, { 14, 60 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
663 { 3, 78 }, { -16, 123 }, { 21, 53 }, { 22, 56 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
664 { 25, 61 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
665
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
666 /* 399 - 435 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
667 { 21, 33 }, { 19, 50 }, { 17, 61 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
668 { -3, 78 }, { -8, 74 }, { -9, 72 }, { -10, 72 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
669 { -18, 75 }, { -12, 71 }, { -11, 63 }, { -5, 70 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
670 { -17, 75 }, { -14, 72 }, { -16, 67 }, { -8, 53 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
671 { -14, 59 }, { -9, 52 }, { -11, 68 }, { 9, -2 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
672 { 30, -10 }, { 31, -4 }, { 33, -1 }, { 33, 7 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
673 { 31, 12 }, { 37, 23 }, { 31, 38 }, { 20, 64 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
674 { -9, 71 }, { -7, 37 }, { -8, 44 }, { -11, 49 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
675 { -10, 56 }, { -12, 59 }, { -8, 63 }, { -9, 67 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
676 { -6, 68 }, { -10, 79 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
677
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
678 /* 436 - 459 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
679 { -3, 78 }, { -8, 74 }, { -9, 72 }, { -10, 72 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
680 { -18, 75 }, { -12, 71 }, { -11, 63 }, { -5, 70 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
681 { -17, 75 }, { -14, 72 }, { -16, 67 }, { -8, 53 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
682 { -14, 59 }, { -9, 52 }, { -11, 68 }, { 9, -2 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
683 { 30, -10 }, { 31, -4 }, { 33, -1 }, { 33, 7 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
684 { 31, 12 }, { 37, 23 }, { 31, 38 }, { 20, 64 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
685 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
686 };
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
687
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
688 void ff_h264_init_cabac_states(H264Context *h) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
689 MpegEncContext * const s = &h->s;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
690 int i;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
691
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
692 /* calculate pre-state */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
693 for( i= 0; i < 460; i++ ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
694 int pre;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
695 if( h->slice_type_nos == FF_I_TYPE )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
696 pre = av_clip( ((cabac_context_init_I[i][0] * s->qscale) >>4 ) + cabac_context_init_I[i][1], 1, 126 );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
697 else
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
698 pre = av_clip( ((cabac_context_init_PB[h->cabac_init_idc][i][0] * s->qscale) >>4 ) + cabac_context_init_PB[h->cabac_init_idc][i][1], 1, 126 );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
699
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
700 if( pre <= 63 )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
701 h->cabac_state[i] = 2 * ( 63 - pre ) + 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
702 else
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
703 h->cabac_state[i] = 2 * ( pre - 64 ) + 1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
704 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
705 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
706
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
707 static int decode_cabac_field_decoding_flag(H264Context *h) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
708 MpegEncContext * const s = &h->s;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
709 const int mb_x = s->mb_x;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
710 const int mb_y = s->mb_y & ~1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
711 const int mba_xy = mb_x - 1 + mb_y *s->mb_stride;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
712 const int mbb_xy = mb_x + (mb_y-2)*s->mb_stride;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
713
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
714 unsigned int ctx = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
715
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
716 if( h->slice_table[mba_xy] == h->slice_num && IS_INTERLACED( s->current_picture.mb_type[mba_xy] ) ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
717 ctx += 1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
718 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
719 if( h->slice_table[mbb_xy] == h->slice_num && IS_INTERLACED( s->current_picture.mb_type[mbb_xy] ) ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
720 ctx += 1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
721 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
722
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
723 return get_cabac_noinline( &h->cabac, &h->cabac_state[70 + ctx] );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
724 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
725
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
726 static int decode_cabac_intra_mb_type(H264Context *h, int ctx_base, int intra_slice) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
727 uint8_t *state= &h->cabac_state[ctx_base];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
728 int mb_type;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
729
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
730 if(intra_slice){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
731 MpegEncContext * const s = &h->s;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
732 const int mba_xy = h->left_mb_xy[0];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
733 const int mbb_xy = h->top_mb_xy;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
734 int ctx=0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
735 if( h->slice_table[mba_xy] == h->slice_num && !IS_INTRA4x4( s->current_picture.mb_type[mba_xy] ) )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
736 ctx++;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
737 if( h->slice_table[mbb_xy] == h->slice_num && !IS_INTRA4x4( s->current_picture.mb_type[mbb_xy] ) )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
738 ctx++;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
739 if( get_cabac_noinline( &h->cabac, &state[ctx] ) == 0 )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
740 return 0; /* I4x4 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
741 state += 2;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
742 }else{
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
743 if( get_cabac_noinline( &h->cabac, &state[0] ) == 0 )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
744 return 0; /* I4x4 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
745 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
746
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
747 if( get_cabac_terminate( &h->cabac ) )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
748 return 25; /* PCM */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
749
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
750 mb_type = 1; /* I16x16 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
751 mb_type += 12 * get_cabac_noinline( &h->cabac, &state[1] ); /* cbp_luma != 0 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
752 if( get_cabac_noinline( &h->cabac, &state[2] ) ) /* cbp_chroma */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
753 mb_type += 4 + 4 * get_cabac_noinline( &h->cabac, &state[2+intra_slice] );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
754 mb_type += 2 * get_cabac_noinline( &h->cabac, &state[3+intra_slice] );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
755 mb_type += 1 * get_cabac_noinline( &h->cabac, &state[3+2*intra_slice] );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
756 return mb_type;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
757 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
758
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
759 static int decode_cabac_mb_type_b( H264Context *h ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
760 MpegEncContext * const s = &h->s;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
761
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
762 const int mba_xy = h->left_mb_xy[0];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
763 const int mbb_xy = h->top_mb_xy;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
764 int ctx = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
765 int bits;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
766 assert(h->slice_type_nos == FF_B_TYPE);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
767
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
768 if( h->slice_table[mba_xy] == h->slice_num && !IS_DIRECT( s->current_picture.mb_type[mba_xy] ) )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
769 ctx++;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
770 if( h->slice_table[mbb_xy] == h->slice_num && !IS_DIRECT( s->current_picture.mb_type[mbb_xy] ) )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
771 ctx++;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
772
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
773 if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+ctx] ) )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
774 return 0; /* B_Direct_16x16 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
775
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
776 if( !get_cabac_noinline( &h->cabac, &h->cabac_state[27+3] ) ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
777 return 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ); /* B_L[01]_16x16 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
778 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
779
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
780 bits = get_cabac_noinline( &h->cabac, &h->cabac_state[27+4] ) << 3;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
781 bits|= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 2;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
782 bits|= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] ) << 1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
783 bits|= get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
784 if( bits < 8 )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
785 return bits + 3; /* B_Bi_16x16 through B_L1_L0_16x8 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
786 else if( bits == 13 ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
787 return decode_cabac_intra_mb_type(h, 32, 0) + 23;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
788 } else if( bits == 14 )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
789 return 11; /* B_L1_L0_8x16 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
790 else if( bits == 15 )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
791 return 22; /* B_8x8 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
792
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
793 bits= ( bits<<1 ) | get_cabac_noinline( &h->cabac, &h->cabac_state[27+5] );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
794 return bits - 4; /* B_L0_Bi_* through B_Bi_Bi_* */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
795 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
796
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
797 static int decode_cabac_mb_skip( H264Context *h, int mb_x, int mb_y ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
798 MpegEncContext * const s = &h->s;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
799 int mba_xy, mbb_xy;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
800 int ctx = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
801
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
802 if(FRAME_MBAFF){ //FIXME merge with the stuff in fill_caches?
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
803 int mb_xy = mb_x + (mb_y&~1)*s->mb_stride;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
804 mba_xy = mb_xy - 1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
805 if( (mb_y&1)
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
806 && h->slice_table[mba_xy] == h->slice_num
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
807 && MB_FIELD == !!IS_INTERLACED( s->current_picture.mb_type[mba_xy] ) )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
808 mba_xy += s->mb_stride;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
809 if( MB_FIELD ){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
810 mbb_xy = mb_xy - s->mb_stride;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
811 if( !(mb_y&1)
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
812 && h->slice_table[mbb_xy] == h->slice_num
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
813 && IS_INTERLACED( s->current_picture.mb_type[mbb_xy] ) )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
814 mbb_xy -= s->mb_stride;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
815 }else
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
816 mbb_xy = mb_x + (mb_y-1)*s->mb_stride;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
817 }else{
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
818 int mb_xy = h->mb_xy;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
819 mba_xy = mb_xy - 1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
820 mbb_xy = mb_xy - (s->mb_stride << FIELD_PICTURE);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
821 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
822
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
823 if( h->slice_table[mba_xy] == h->slice_num && !IS_SKIP( s->current_picture.mb_type[mba_xy] ))
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
824 ctx++;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
825 if( h->slice_table[mbb_xy] == h->slice_num && !IS_SKIP( s->current_picture.mb_type[mbb_xy] ))
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
826 ctx++;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
827
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
828 if( h->slice_type_nos == FF_B_TYPE )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
829 ctx += 13;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
830 return get_cabac_noinline( &h->cabac, &h->cabac_state[11+ctx] );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
831 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
832
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
833 static int decode_cabac_mb_intra4x4_pred_mode( H264Context *h, int pred_mode ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
834 int mode = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
835
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
836 if( get_cabac( &h->cabac, &h->cabac_state[68] ) )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
837 return pred_mode;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
838
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
839 mode += 1 * get_cabac( &h->cabac, &h->cabac_state[69] );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
840 mode += 2 * get_cabac( &h->cabac, &h->cabac_state[69] );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
841 mode += 4 * get_cabac( &h->cabac, &h->cabac_state[69] );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
842
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
843 if( mode >= pred_mode )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
844 return mode + 1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
845 else
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
846 return mode;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
847 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
848
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
849 static int decode_cabac_mb_chroma_pre_mode( H264Context *h) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
850 const int mba_xy = h->left_mb_xy[0];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
851 const int mbb_xy = h->top_mb_xy;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
852
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
853 int ctx = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
854
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
855 /* No need to test for IS_INTRA4x4 and IS_INTRA16x16, as we set chroma_pred_mode_table to 0 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
856 if( h->slice_table[mba_xy] == h->slice_num && h->chroma_pred_mode_table[mba_xy] != 0 )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
857 ctx++;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
858
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
859 if( h->slice_table[mbb_xy] == h->slice_num && h->chroma_pred_mode_table[mbb_xy] != 0 )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
860 ctx++;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
861
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
862 if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+ctx] ) == 0 )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
863 return 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
864
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
865 if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+3] ) == 0 )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
866 return 1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
867 if( get_cabac_noinline( &h->cabac, &h->cabac_state[64+3] ) == 0 )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
868 return 2;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
869 else
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
870 return 3;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
871 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
872
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
873 static int decode_cabac_mb_cbp_luma( H264Context *h) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
874 int cbp_b, cbp_a, ctx, cbp = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
875
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
876 cbp_a = h->slice_table[h->left_mb_xy[0]] == h->slice_num ? h->left_cbp : -1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
877 cbp_b = h->slice_table[h->top_mb_xy] == h->slice_num ? h->top_cbp : -1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
878
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
879 ctx = !(cbp_a & 0x02) + 2 * !(cbp_b & 0x04);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
880 cbp |= get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
881 ctx = !(cbp & 0x01) + 2 * !(cbp_b & 0x08);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
882 cbp |= get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
883 ctx = !(cbp_a & 0x08) + 2 * !(cbp & 0x01);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
884 cbp |= get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 2;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
885 ctx = !(cbp & 0x04) + 2 * !(cbp & 0x02);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
886 cbp |= get_cabac_noinline(&h->cabac, &h->cabac_state[73 + ctx]) << 3;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
887 return cbp;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
888 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
889 static int decode_cabac_mb_cbp_chroma( H264Context *h) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
890 int ctx;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
891 int cbp_a, cbp_b;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
892
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
893 cbp_a = (h->left_cbp>>4)&0x03;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
894 cbp_b = (h-> top_cbp>>4)&0x03;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
895
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
896 ctx = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
897 if( cbp_a > 0 ) ctx++;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
898 if( cbp_b > 0 ) ctx += 2;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
899 if( get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] ) == 0 )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
900 return 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
901
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
902 ctx = 4;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
903 if( cbp_a == 2 ) ctx++;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
904 if( cbp_b == 2 ) ctx += 2;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
905 return 1 + get_cabac_noinline( &h->cabac, &h->cabac_state[77 + ctx] );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
906 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
907 static int decode_cabac_mb_dqp( H264Context *h) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
908 int ctx= h->last_qscale_diff != 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
909 int val = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
910
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
911 while( get_cabac_noinline( &h->cabac, &h->cabac_state[60 + ctx] ) ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
912 ctx= 2+(ctx>>1);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
913 val++;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
914 if(val > 102) //prevent infinite loop
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
915 return INT_MIN;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
916 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
917
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
918 if( val&0x01 )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
919 return (val + 1)>>1 ;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
920 else
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
921 return -((val + 1)>>1);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
922 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
923 static int decode_cabac_p_mb_sub_type( H264Context *h ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
924 if( get_cabac( &h->cabac, &h->cabac_state[21] ) )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
925 return 0; /* 8x8 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
926 if( !get_cabac( &h->cabac, &h->cabac_state[22] ) )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
927 return 1; /* 8x4 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
928 if( get_cabac( &h->cabac, &h->cabac_state[23] ) )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
929 return 2; /* 4x8 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
930 return 3; /* 4x4 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
931 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
932 static int decode_cabac_b_mb_sub_type( H264Context *h ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
933 int type;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
934 if( !get_cabac( &h->cabac, &h->cabac_state[36] ) )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
935 return 0; /* B_Direct_8x8 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
936 if( !get_cabac( &h->cabac, &h->cabac_state[37] ) )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
937 return 1 + get_cabac( &h->cabac, &h->cabac_state[39] ); /* B_L0_8x8, B_L1_8x8 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
938 type = 3;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
939 if( get_cabac( &h->cabac, &h->cabac_state[38] ) ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
940 if( get_cabac( &h->cabac, &h->cabac_state[39] ) )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
941 return 11 + get_cabac( &h->cabac, &h->cabac_state[39] ); /* B_L1_4x4, B_Bi_4x4 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
942 type += 4;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
943 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
944 type += 2*get_cabac( &h->cabac, &h->cabac_state[39] );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
945 type += get_cabac( &h->cabac, &h->cabac_state[39] );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
946 return type;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
947 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
948
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
949 static inline int decode_cabac_mb_transform_size( H264Context *h ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
950 return get_cabac_noinline( &h->cabac, &h->cabac_state[399 + h->neighbor_transform_size] );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
951 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
952
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
953 static int decode_cabac_mb_ref( H264Context *h, int list, int n ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
954 int refa = h->ref_cache[list][scan8[n] - 1];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
955 int refb = h->ref_cache[list][scan8[n] - 8];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
956 int ref = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
957 int ctx = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
958
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
959 if( h->slice_type_nos == FF_B_TYPE) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
960 if( refa > 0 && !h->direct_cache[scan8[n] - 1] )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
961 ctx++;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
962 if( refb > 0 && !h->direct_cache[scan8[n] - 8] )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
963 ctx += 2;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
964 } else {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
965 if( refa > 0 )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
966 ctx++;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
967 if( refb > 0 )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
968 ctx += 2;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
969 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
970
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
971 while( get_cabac( &h->cabac, &h->cabac_state[54+ctx] ) ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
972 ref++;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
973 ctx = (ctx>>2)+4;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
974 if(ref >= 32 /*h->ref_list[list]*/){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
975 return -1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
976 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
977 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
978 return ref;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
979 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
980
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
981 static int decode_cabac_mb_mvd( H264Context *h, int list, int n, int l ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
982 int amvd = abs( h->mvd_cache[list][scan8[n] - 1][l] ) +
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
983 abs( h->mvd_cache[list][scan8[n] - 8][l] );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
984 int ctxbase = (l == 0) ? 40 : 47;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
985 int mvd;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
986 int ctx = (amvd>2) + (amvd>32);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
987
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
988 if(!get_cabac(&h->cabac, &h->cabac_state[ctxbase+ctx]))
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
989 return 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
990
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
991 mvd= 1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
992 ctx= 3;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
993 while( mvd < 9 && get_cabac( &h->cabac, &h->cabac_state[ctxbase+ctx] ) ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
994 mvd++;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
995 if( ctx < 6 )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
996 ctx++;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
997 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
998
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
999 if( mvd >= 9 ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1000 int k = 3;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1001 while( get_cabac_bypass( &h->cabac ) ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1002 mvd += 1 << k;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1003 k++;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1004 if(k>24){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1005 av_log(h->s.avctx, AV_LOG_ERROR, "overflow in decode_cabac_mb_mvd\n");
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1006 return INT_MIN;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1007 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1008 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1009 while( k-- ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1010 if( get_cabac_bypass( &h->cabac ) )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1011 mvd += 1 << k;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1012 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1013 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1014 return get_cabac_bypass_sign( &h->cabac, -mvd );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1015 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1016
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1017 static av_always_inline int get_cabac_cbf_ctx( H264Context *h, int cat, int idx, int is_dc ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1018 int nza, nzb;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1019 int ctx = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1020
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1021 if( is_dc ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1022 if( cat == 0 ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1023 nza = h->left_cbp&0x100;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1024 nzb = h-> top_cbp&0x100;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1025 } else {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1026 nza = (h->left_cbp>>(6+idx))&0x01;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1027 nzb = (h-> top_cbp>>(6+idx))&0x01;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1028 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1029 } else {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1030 assert(cat == 1 || cat == 2 || cat == 4);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1031 nza = h->non_zero_count_cache[scan8[idx] - 1];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1032 nzb = h->non_zero_count_cache[scan8[idx] - 8];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1033 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1034
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1035 if( nza > 0 )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1036 ctx++;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1037
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1038 if( nzb > 0 )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1039 ctx += 2;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1040
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1041 return ctx + 4 * cat;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1042 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1043
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1044 DECLARE_ASM_CONST(1, uint8_t, last_coeff_flag_offset_8x8[63]) = {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1045 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1046 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1047 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1048 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1049 };
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1050
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1051 static av_always_inline void decode_cabac_residual_internal( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff, int is_dc ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1052 static const int significant_coeff_flag_offset[2][6] = {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1053 { 105+0, 105+15, 105+29, 105+44, 105+47, 402 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1054 { 277+0, 277+15, 277+29, 277+44, 277+47, 436 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1055 };
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1056 static const int last_coeff_flag_offset[2][6] = {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1057 { 166+0, 166+15, 166+29, 166+44, 166+47, 417 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1058 { 338+0, 338+15, 338+29, 338+44, 338+47, 451 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1059 };
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1060 static const int coeff_abs_level_m1_offset[6] = {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1061 227+0, 227+10, 227+20, 227+30, 227+39, 426
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1062 };
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1063 static const uint8_t significant_coeff_flag_offset_8x8[2][63] = {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1064 { 0, 1, 2, 3, 4, 5, 5, 4, 4, 3, 3, 4, 4, 4, 5, 5,
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1065 4, 4, 4, 4, 3, 3, 6, 7, 7, 7, 8, 9,10, 9, 8, 7,
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1066 7, 6,11,12,13,11, 6, 7, 8, 9,14,10, 9, 8, 6,11,
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1067 12,13,11, 6, 9,14,10, 9,11,12,13,11,14,10,12 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1068 { 0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 7, 8, 4, 5,
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1069 6, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,11,12,11,
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1070 9, 9,10,10, 8,11,12,11, 9, 9,10,10, 8,13,13, 9,
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1071 9,10,10, 8,13,13, 9, 9,10,10,14,14,14,14,14 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1072 };
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1073 /* node ctx: 0..3: abslevel1 (with abslevelgt1 == 0).
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1074 * 4..7: abslevelgt1 + 3 (and abslevel1 doesn't matter).
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1075 * map node ctx => cabac ctx for level=1 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1076 static const uint8_t coeff_abs_level1_ctx[8] = { 1, 2, 3, 4, 0, 0, 0, 0 };
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1077 /* map node ctx => cabac ctx for level>1 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1078 static const uint8_t coeff_abs_levelgt1_ctx[8] = { 5, 5, 5, 5, 6, 7, 8, 9 };
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1079 static const uint8_t coeff_abs_level_transition[2][8] = {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1080 /* update node ctx after decoding a level=1 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1081 { 1, 2, 3, 3, 4, 5, 6, 7 },
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1082 /* update node ctx after decoding a level>1 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1083 { 4, 4, 4, 4, 5, 6, 7, 7 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1084 };
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1085
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1086 int index[64];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1087
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1088 int av_unused last;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1089 int coeff_count = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1090 int node_ctx = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1091
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1092 uint8_t *significant_coeff_ctx_base;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1093 uint8_t *last_coeff_ctx_base;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1094 uint8_t *abs_level_m1_ctx_base;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1095
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1096 #if !ARCH_X86
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1097 #define CABAC_ON_STACK
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1098 #endif
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1099 #ifdef CABAC_ON_STACK
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1100 #define CC &cc
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1101 CABACContext cc;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1102 cc.range = h->cabac.range;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1103 cc.low = h->cabac.low;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1104 cc.bytestream= h->cabac.bytestream;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1105 #else
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1106 #define CC &h->cabac
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1107 #endif
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1108
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1109
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1110 /* cat: 0-> DC 16x16 n = 0
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1111 * 1-> AC 16x16 n = luma4x4idx
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1112 * 2-> Luma4x4 n = luma4x4idx
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1113 * 3-> DC Chroma n = iCbCr
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1114 * 4-> AC Chroma n = 16 + 4 * iCbCr + chroma4x4idx
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1115 * 5-> Luma8x8 n = 4 * luma8x8idx
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1116 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1117
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1118 /* read coded block flag */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1119 if( is_dc || cat != 5 ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1120 if( get_cabac( CC, &h->cabac_state[85 + get_cabac_cbf_ctx( h, cat, n, is_dc ) ] ) == 0 ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1121 if( !is_dc )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1122 h->non_zero_count_cache[scan8[n]] = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1123
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1124 #ifdef CABAC_ON_STACK
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1125 h->cabac.range = cc.range ;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1126 h->cabac.low = cc.low ;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1127 h->cabac.bytestream= cc.bytestream;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1128 #endif
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1129 return;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1130 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1131 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1132
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1133 significant_coeff_ctx_base = h->cabac_state
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1134 + significant_coeff_flag_offset[MB_FIELD][cat];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1135 last_coeff_ctx_base = h->cabac_state
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1136 + last_coeff_flag_offset[MB_FIELD][cat];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1137 abs_level_m1_ctx_base = h->cabac_state
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1138 + coeff_abs_level_m1_offset[cat];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1139
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1140 if( !is_dc && cat == 5 ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1141 #define DECODE_SIGNIFICANCE( coefs, sig_off, last_off ) \
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1142 for(last= 0; last < coefs; last++) { \
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1143 uint8_t *sig_ctx = significant_coeff_ctx_base + sig_off; \
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1144 if( get_cabac( CC, sig_ctx )) { \
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1145 uint8_t *last_ctx = last_coeff_ctx_base + last_off; \
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1146 index[coeff_count++] = last; \
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1147 if( get_cabac( CC, last_ctx ) ) { \
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1148 last= max_coeff; \
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1149 break; \
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1150 } \
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1151 } \
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1152 }\
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1153 if( last == max_coeff -1 ) {\
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1154 index[coeff_count++] = last;\
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1155 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1156 const uint8_t *sig_off = significant_coeff_flag_offset_8x8[MB_FIELD];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1157 #if ARCH_X86 && HAVE_7REGS && HAVE_EBX_AVAILABLE && !defined(BROKEN_RELOCATIONS)
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1158 coeff_count= decode_significance_8x8_x86(CC, significant_coeff_ctx_base, index, sig_off);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1159 } else {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1160 coeff_count= decode_significance_x86(CC, max_coeff, significant_coeff_ctx_base, index);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1161 #else
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1162 DECODE_SIGNIFICANCE( 63, sig_off[last], last_coeff_flag_offset_8x8[last] );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1163 } else {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1164 DECODE_SIGNIFICANCE( max_coeff - 1, last, last );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1165 #endif
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1166 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1167 assert(coeff_count > 0);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1168
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1169 if( is_dc ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1170 if( cat == 0 )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1171 h->cbp_table[h->mb_xy] |= 0x100;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1172 else
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1173 h->cbp_table[h->mb_xy] |= 0x40 << n;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1174 } else {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1175 if( cat == 5 )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1176 fill_rectangle(&h->non_zero_count_cache[scan8[n]], 2, 2, 8, coeff_count, 1);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1177 else {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1178 assert( cat == 1 || cat == 2 || cat == 4 );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1179 h->non_zero_count_cache[scan8[n]] = coeff_count;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1180 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1181 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1182
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1183 do {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1184 uint8_t *ctx = coeff_abs_level1_ctx[node_ctx] + abs_level_m1_ctx_base;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1185
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1186 int j= scantable[index[--coeff_count]];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1187
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1188 if( get_cabac( CC, ctx ) == 0 ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1189 node_ctx = coeff_abs_level_transition[0][node_ctx];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1190 if( is_dc ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1191 block[j] = get_cabac_bypass_sign( CC, -1);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1192 }else{
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1193 block[j] = (get_cabac_bypass_sign( CC, -qmul[j]) + 32) >> 6;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1194 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1195 } else {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1196 int coeff_abs = 2;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1197 ctx = coeff_abs_levelgt1_ctx[node_ctx] + abs_level_m1_ctx_base;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1198 node_ctx = coeff_abs_level_transition[1][node_ctx];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1199
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1200 while( coeff_abs < 15 && get_cabac( CC, ctx ) ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1201 coeff_abs++;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1202 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1203
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1204 if( coeff_abs >= 15 ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1205 int j = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1206 while( get_cabac_bypass( CC ) ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1207 j++;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1208 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1209
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1210 coeff_abs=1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1211 while( j-- ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1212 coeff_abs += coeff_abs + get_cabac_bypass( CC );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1213 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1214 coeff_abs+= 14;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1215 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1216
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1217 if( is_dc ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1218 block[j] = get_cabac_bypass_sign( CC, -coeff_abs );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1219 }else{
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1220 block[j] = (get_cabac_bypass_sign( CC, -coeff_abs ) * qmul[j] + 32) >> 6;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1221 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1222 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1223 } while( coeff_count );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1224 #ifdef CABAC_ON_STACK
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1225 h->cabac.range = cc.range ;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1226 h->cabac.low = cc.low ;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1227 h->cabac.bytestream= cc.bytestream;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1228 #endif
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1229
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1230 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1231
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1232 #if !CONFIG_SMALL
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1233 static void decode_cabac_residual_dc( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1234 decode_cabac_residual_internal(h, block, cat, n, scantable, qmul, max_coeff, 1);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1235 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1236
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1237 static void decode_cabac_residual_nondc( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1238 decode_cabac_residual_internal(h, block, cat, n, scantable, qmul, max_coeff, 0);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1239 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1240 #endif
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1241
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1242 static void decode_cabac_residual( H264Context *h, DCTELEM *block, int cat, int n, const uint8_t *scantable, const uint32_t *qmul, int max_coeff ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1243 #if CONFIG_SMALL
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1244 decode_cabac_residual_internal(h, block, cat, n, scantable, qmul, max_coeff, cat == 0 || cat == 3);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1245 #else
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1246 if( cat == 0 || cat == 3 ) decode_cabac_residual_dc(h, block, cat, n, scantable, qmul, max_coeff);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1247 else decode_cabac_residual_nondc(h, block, cat, n, scantable, qmul, max_coeff);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1248 #endif
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1249 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1250
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1251 static inline void compute_mb_neighbors(H264Context *h)
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1252 {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1253 MpegEncContext * const s = &h->s;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1254 const int mb_xy = h->mb_xy;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1255 h->top_mb_xy = mb_xy - s->mb_stride;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1256 h->left_mb_xy[0] = mb_xy - 1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1257 if(FRAME_MBAFF){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1258 const int pair_xy = s->mb_x + (s->mb_y & ~1)*s->mb_stride;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1259 const int top_pair_xy = pair_xy - s->mb_stride;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1260 const int top_mb_field_flag = IS_INTERLACED(s->current_picture.mb_type[top_pair_xy]);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1261 const int left_mb_field_flag = IS_INTERLACED(s->current_picture.mb_type[pair_xy-1]);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1262 const int curr_mb_field_flag = MB_FIELD;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1263 const int bottom = (s->mb_y & 1);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1264
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1265 if (curr_mb_field_flag && (bottom || top_mb_field_flag)){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1266 h->top_mb_xy -= s->mb_stride;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1267 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1268 if (!left_mb_field_flag == curr_mb_field_flag) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1269 h->left_mb_xy[0] = pair_xy - 1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1270 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1271 } else if (FIELD_PICTURE) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1272 h->top_mb_xy -= s->mb_stride;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1273 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1274 return;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1275 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1276
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1277 /**
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1278 * decodes a macroblock
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1279 * @returns 0 if OK, AC_ERROR / DC_ERROR / MV_ERROR if an error is noticed
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1280 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1281 int ff_h264_decode_mb_cabac(H264Context *h) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1282 MpegEncContext * const s = &h->s;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1283 int mb_xy;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1284 int mb_type, partition_count, cbp = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1285 int dct8x8_allowed= h->pps.transform_8x8_mode;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1286
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1287 mb_xy = h->mb_xy = s->mb_x + s->mb_y*s->mb_stride;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1288
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1289 tprintf(s->avctx, "pic:%d mb:%d/%d\n", h->frame_num, s->mb_x, s->mb_y);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1290 if( h->slice_type_nos != FF_I_TYPE ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1291 int skip;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1292 /* a skipped mb needs the aff flag from the following mb */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1293 if( FRAME_MBAFF && s->mb_x==0 && (s->mb_y&1)==0 )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1294 predict_field_decoding_flag(h);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1295 if( FRAME_MBAFF && (s->mb_y&1)==1 && h->prev_mb_skipped )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1296 skip = h->next_mb_skipped;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1297 else
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1298 skip = decode_cabac_mb_skip( h, s->mb_x, s->mb_y );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1299 /* read skip flags */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1300 if( skip ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1301 if( FRAME_MBAFF && (s->mb_y&1)==0 ){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1302 s->current_picture.mb_type[mb_xy] = MB_TYPE_SKIP;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1303 h->next_mb_skipped = decode_cabac_mb_skip( h, s->mb_x, s->mb_y+1 );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1304 if(!h->next_mb_skipped)
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1305 h->mb_mbaff = h->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1306 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1307
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1308 decode_mb_skip(h);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1309
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1310 h->cbp_table[mb_xy] = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1311 h->chroma_pred_mode_table[mb_xy] = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1312 h->last_qscale_diff = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1313
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1314 return 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1315
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1316 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1317 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1318 if(FRAME_MBAFF){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1319 if( (s->mb_y&1) == 0 )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1320 h->mb_mbaff =
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1321 h->mb_field_decoding_flag = decode_cabac_field_decoding_flag(h);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1322 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1323
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1324 h->prev_mb_skipped = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1325
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1326 compute_mb_neighbors(h);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1327
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1328 if( h->slice_type_nos == FF_B_TYPE ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1329 mb_type = decode_cabac_mb_type_b( h );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1330 if( mb_type < 23 ){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1331 partition_count= b_mb_type_info[mb_type].partition_count;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1332 mb_type= b_mb_type_info[mb_type].type;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1333 }else{
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1334 mb_type -= 23;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1335 goto decode_intra_mb;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1336 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1337 } else if( h->slice_type_nos == FF_P_TYPE ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1338 if( get_cabac_noinline( &h->cabac, &h->cabac_state[14] ) == 0 ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1339 /* P-type */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1340 if( get_cabac_noinline( &h->cabac, &h->cabac_state[15] ) == 0 ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1341 /* P_L0_D16x16, P_8x8 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1342 mb_type= 3 * get_cabac_noinline( &h->cabac, &h->cabac_state[16] );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1343 } else {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1344 /* P_L0_D8x16, P_L0_D16x8 */
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1345 mb_type= 2 - get_cabac_noinline( &h->cabac, &h->cabac_state[17] );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1346 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1347 partition_count= p_mb_type_info[mb_type].partition_count;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1348 mb_type= p_mb_type_info[mb_type].type;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1349 } else {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1350 mb_type= decode_cabac_intra_mb_type(h, 17, 0);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1351 goto decode_intra_mb;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1352 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1353 } else {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1354 mb_type= decode_cabac_intra_mb_type(h, 3, 1);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1355 if(h->slice_type == FF_SI_TYPE && mb_type)
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1356 mb_type--;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1357 assert(h->slice_type_nos == FF_I_TYPE);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1358 decode_intra_mb:
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1359 partition_count = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1360 cbp= i_mb_type_info[mb_type].cbp;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1361 h->intra16x16_pred_mode= i_mb_type_info[mb_type].pred_mode;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1362 mb_type= i_mb_type_info[mb_type].type;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1363 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1364 if(MB_FIELD)
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1365 mb_type |= MB_TYPE_INTERLACED;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1366
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1367 h->slice_table[ mb_xy ]= h->slice_num;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1368
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1369 if(IS_INTRA_PCM(mb_type)) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1370 const uint8_t *ptr;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1371
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1372 // We assume these blocks are very rare so we do not optimize it.
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1373 // FIXME The two following lines get the bitstream position in the cabac
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1374 // decode, I think it should be done by a function in cabac.h (or cabac.c).
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1375 ptr= h->cabac.bytestream;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1376 if(h->cabac.low&0x1) ptr--;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1377 if(CABAC_BITS==16){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1378 if(h->cabac.low&0x1FF) ptr--;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1379 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1380
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1381 // The pixels are stored in the same order as levels in h->mb array.
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1382 memcpy(h->mb, ptr, 256); ptr+=256;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1383 if(CHROMA){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1384 memcpy(h->mb+128, ptr, 128); ptr+=128;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1385 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1386
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1387 ff_init_cabac_decoder(&h->cabac, ptr, h->cabac.bytestream_end - ptr);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1388
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1389 // All blocks are present
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1390 h->cbp_table[mb_xy] = 0x1ef;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1391 h->chroma_pred_mode_table[mb_xy] = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1392 // In deblocking, the quantizer is 0
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1393 s->current_picture.qscale_table[mb_xy]= 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1394 // All coeffs are present
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1395 memset(h->non_zero_count[mb_xy], 16, 16);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1396 s->current_picture.mb_type[mb_xy]= mb_type;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1397 h->last_qscale_diff = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1398 return 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1399 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1400
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1401 if(MB_MBAFF){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1402 h->ref_count[0] <<= 1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1403 h->ref_count[1] <<= 1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1404 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1405
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1406 fill_caches(h, mb_type, 0);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1407
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1408 if( IS_INTRA( mb_type ) ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1409 int i, pred_mode;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1410 if( IS_INTRA4x4( mb_type ) ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1411 if( dct8x8_allowed && decode_cabac_mb_transform_size( h ) ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1412 mb_type |= MB_TYPE_8x8DCT;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1413 for( i = 0; i < 16; i+=4 ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1414 int pred = pred_intra_mode( h, i );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1415 int mode = decode_cabac_mb_intra4x4_pred_mode( h, pred );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1416 fill_rectangle( &h->intra4x4_pred_mode_cache[ scan8[i] ], 2, 2, 8, mode, 1 );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1417 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1418 } else {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1419 for( i = 0; i < 16; i++ ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1420 int pred = pred_intra_mode( h, i );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1421 h->intra4x4_pred_mode_cache[ scan8[i] ] = decode_cabac_mb_intra4x4_pred_mode( h, pred );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1422
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1423 //av_log( s->avctx, AV_LOG_ERROR, "i4x4 pred=%d mode=%d\n", pred, h->intra4x4_pred_mode_cache[ scan8[i] ] );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1424 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1425 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1426 ff_h264_write_back_intra_pred_mode(h);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1427 if( ff_h264_check_intra4x4_pred_mode(h) < 0 ) return -1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1428 } else {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1429 h->intra16x16_pred_mode= ff_h264_check_intra_pred_mode( h, h->intra16x16_pred_mode );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1430 if( h->intra16x16_pred_mode < 0 ) return -1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1431 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1432 if(CHROMA){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1433 h->chroma_pred_mode_table[mb_xy] =
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1434 pred_mode = decode_cabac_mb_chroma_pre_mode( h );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1435
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1436 pred_mode= ff_h264_check_intra_pred_mode( h, pred_mode );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1437 if( pred_mode < 0 ) return -1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1438 h->chroma_pred_mode= pred_mode;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1439 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1440 } else if( partition_count == 4 ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1441 int i, j, sub_partition_count[4], list, ref[2][4];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1442
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1443 if( h->slice_type_nos == FF_B_TYPE ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1444 for( i = 0; i < 4; i++ ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1445 h->sub_mb_type[i] = decode_cabac_b_mb_sub_type( h );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1446 sub_partition_count[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1447 h->sub_mb_type[i]= b_sub_mb_type_info[ h->sub_mb_type[i] ].type;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1448 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1449 if( IS_DIRECT(h->sub_mb_type[0] | h->sub_mb_type[1] |
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1450 h->sub_mb_type[2] | h->sub_mb_type[3]) ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1451 ff_h264_pred_direct_motion(h, &mb_type);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1452 h->ref_cache[0][scan8[4]] =
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1453 h->ref_cache[1][scan8[4]] =
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1454 h->ref_cache[0][scan8[12]] =
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1455 h->ref_cache[1][scan8[12]] = PART_NOT_AVAILABLE;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1456 if( h->ref_count[0] > 1 || h->ref_count[1] > 1 ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1457 for( i = 0; i < 4; i++ )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1458 if( IS_DIRECT(h->sub_mb_type[i]) )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1459 fill_rectangle( &h->direct_cache[scan8[4*i]], 2, 2, 8, 1, 1 );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1460 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1461 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1462 } else {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1463 for( i = 0; i < 4; i++ ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1464 h->sub_mb_type[i] = decode_cabac_p_mb_sub_type( h );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1465 sub_partition_count[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].partition_count;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1466 h->sub_mb_type[i]= p_sub_mb_type_info[ h->sub_mb_type[i] ].type;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1467 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1468 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1469
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1470 for( list = 0; list < h->list_count; list++ ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1471 for( i = 0; i < 4; i++ ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1472 if(IS_DIRECT(h->sub_mb_type[i])) continue;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1473 if(IS_DIR(h->sub_mb_type[i], 0, list)){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1474 if( h->ref_count[list] > 1 ){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1475 ref[list][i] = decode_cabac_mb_ref( h, list, 4*i );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1476 if(ref[list][i] >= (unsigned)h->ref_count[list]){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1477 av_log(s->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref[list][i], h->ref_count[list]);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1478 return -1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1479 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1480 }else
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1481 ref[list][i] = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1482 } else {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1483 ref[list][i] = -1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1484 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1485 h->ref_cache[list][ scan8[4*i]+1 ]=
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1486 h->ref_cache[list][ scan8[4*i]+8 ]=h->ref_cache[list][ scan8[4*i]+9 ]= ref[list][i];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1487 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1488 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1489
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1490 if(dct8x8_allowed)
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1491 dct8x8_allowed = get_dct8x8_allowed(h);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1492
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1493 for(list=0; list<h->list_count; list++){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1494 for(i=0; i<4; i++){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1495 h->ref_cache[list][ scan8[4*i] ]=h->ref_cache[list][ scan8[4*i]+1 ];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1496 if(IS_DIRECT(h->sub_mb_type[i])){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1497 fill_rectangle(h->mvd_cache[list][scan8[4*i]], 2, 2, 8, 0, 4);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1498 continue;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1499 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1500
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1501 if(IS_DIR(h->sub_mb_type[i], 0, list) && !IS_DIRECT(h->sub_mb_type[i])){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1502 const int sub_mb_type= h->sub_mb_type[i];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1503 const int block_width= (sub_mb_type & (MB_TYPE_16x16|MB_TYPE_16x8)) ? 2 : 1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1504 for(j=0; j<sub_partition_count[i]; j++){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1505 int mpx, mpy;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1506 int mx, my;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1507 const int index= 4*i + block_width*j;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1508 int16_t (* mv_cache)[2]= &h->mv_cache[list][ scan8[index] ];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1509 int16_t (* mvd_cache)[2]= &h->mvd_cache[list][ scan8[index] ];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1510 pred_motion(h, index, block_width, list, h->ref_cache[list][ scan8[index] ], &mpx, &mpy);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1511
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1512 mx = mpx + decode_cabac_mb_mvd( h, list, index, 0 );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1513 my = mpy + decode_cabac_mb_mvd( h, list, index, 1 );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1514 tprintf(s->avctx, "final mv:%d %d\n", mx, my);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1515
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1516 if(IS_SUB_8X8(sub_mb_type)){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1517 mv_cache[ 1 ][0]=
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1518 mv_cache[ 8 ][0]= mv_cache[ 9 ][0]= mx;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1519 mv_cache[ 1 ][1]=
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1520 mv_cache[ 8 ][1]= mv_cache[ 9 ][1]= my;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1521
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1522 mvd_cache[ 1 ][0]=
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1523 mvd_cache[ 8 ][0]= mvd_cache[ 9 ][0]= mx - mpx;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1524 mvd_cache[ 1 ][1]=
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1525 mvd_cache[ 8 ][1]= mvd_cache[ 9 ][1]= my - mpy;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1526 }else if(IS_SUB_8X4(sub_mb_type)){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1527 mv_cache[ 1 ][0]= mx;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1528 mv_cache[ 1 ][1]= my;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1529
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1530 mvd_cache[ 1 ][0]= mx - mpx;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1531 mvd_cache[ 1 ][1]= my - mpy;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1532 }else if(IS_SUB_4X8(sub_mb_type)){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1533 mv_cache[ 8 ][0]= mx;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1534 mv_cache[ 8 ][1]= my;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1535
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1536 mvd_cache[ 8 ][0]= mx - mpx;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1537 mvd_cache[ 8 ][1]= my - mpy;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1538 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1539 mv_cache[ 0 ][0]= mx;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1540 mv_cache[ 0 ][1]= my;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1541
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1542 mvd_cache[ 0 ][0]= mx - mpx;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1543 mvd_cache[ 0 ][1]= my - mpy;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1544 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1545 }else{
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1546 uint32_t *p= (uint32_t *)&h->mv_cache[list][ scan8[4*i] ][0];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1547 uint32_t *pd= (uint32_t *)&h->mvd_cache[list][ scan8[4*i] ][0];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1548 p[0] = p[1] = p[8] = p[9] = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1549 pd[0]= pd[1]= pd[8]= pd[9]= 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1550 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1551 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1552 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1553 } else if( IS_DIRECT(mb_type) ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1554 ff_h264_pred_direct_motion(h, &mb_type);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1555 fill_rectangle(h->mvd_cache[0][scan8[0]], 4, 4, 8, 0, 4);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1556 fill_rectangle(h->mvd_cache[1][scan8[0]], 4, 4, 8, 0, 4);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1557 dct8x8_allowed &= h->sps.direct_8x8_inference_flag;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1558 } else {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1559 int list, mx, my, i, mpx, mpy;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1560 if(IS_16X16(mb_type)){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1561 for(list=0; list<h->list_count; list++){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1562 if(IS_DIR(mb_type, 0, list)){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1563 int ref;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1564 if(h->ref_count[list] > 1){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1565 ref= decode_cabac_mb_ref(h, list, 0);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1566 if(ref >= (unsigned)h->ref_count[list]){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1567 av_log(s->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, h->ref_count[list]);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1568 return -1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1569 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1570 }else
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1571 ref=0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1572 fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, ref, 1);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1573 }else
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1574 fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, (uint8_t)LIST_NOT_USED, 1); //FIXME factorize and the other fill_rect below too
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1575 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1576 for(list=0; list<h->list_count; list++){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1577 if(IS_DIR(mb_type, 0, list)){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1578 pred_motion(h, 0, 4, list, h->ref_cache[list][ scan8[0] ], &mpx, &mpy);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1579
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1580 mx = mpx + decode_cabac_mb_mvd( h, list, 0, 0 );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1581 my = mpy + decode_cabac_mb_mvd( h, list, 0, 1 );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1582 tprintf(s->avctx, "final mv:%d %d\n", mx, my);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1583
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1584 fill_rectangle(h->mvd_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx-mpx,my-mpy), 4);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1585 fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, pack16to32(mx,my), 4);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1586 }else
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1587 fill_rectangle(h->mv_cache[list][ scan8[0] ], 4, 4, 8, 0, 4);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1588 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1589 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1590 else if(IS_16X8(mb_type)){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1591 for(list=0; list<h->list_count; list++){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1592 for(i=0; i<2; i++){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1593 if(IS_DIR(mb_type, i, list)){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1594 int ref;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1595 if(h->ref_count[list] > 1){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1596 ref= decode_cabac_mb_ref( h, list, 8*i );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1597 if(ref >= (unsigned)h->ref_count[list]){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1598 av_log(s->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, h->ref_count[list]);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1599 return -1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1600 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1601 }else
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1602 ref=0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1603 fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, ref, 1);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1604 }else
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1605 fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, (LIST_NOT_USED&0xFF), 1);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1606 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1607 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1608 for(list=0; list<h->list_count; list++){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1609 for(i=0; i<2; i++){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1610 if(IS_DIR(mb_type, i, list)){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1611 pred_16x8_motion(h, 8*i, list, h->ref_cache[list][scan8[0] + 16*i], &mpx, &mpy);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1612 mx = mpx + decode_cabac_mb_mvd( h, list, 8*i, 0 );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1613 my = mpy + decode_cabac_mb_mvd( h, list, 8*i, 1 );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1614 tprintf(s->avctx, "final mv:%d %d\n", mx, my);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1615
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1616 fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx-mpx,my-mpy), 4);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1617 fill_rectangle(h->mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, pack16to32(mx,my), 4);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1618 }else{
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1619 fill_rectangle(h->mvd_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1620 fill_rectangle(h-> mv_cache[list][ scan8[0] + 16*i ], 4, 2, 8, 0, 4);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1621 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1622 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1623 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1624 }else{
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1625 assert(IS_8X16(mb_type));
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1626 for(list=0; list<h->list_count; list++){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1627 for(i=0; i<2; i++){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1628 if(IS_DIR(mb_type, i, list)){ //FIXME optimize
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1629 int ref;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1630 if(h->ref_count[list] > 1){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1631 ref= decode_cabac_mb_ref( h, list, 4*i );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1632 if(ref >= (unsigned)h->ref_count[list]){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1633 av_log(s->avctx, AV_LOG_ERROR, "Reference %d >= %d\n", ref, h->ref_count[list]);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1634 return -1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1635 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1636 }else
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1637 ref=0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1638 fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, ref, 1);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1639 }else
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1640 fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, (LIST_NOT_USED&0xFF), 1);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1641 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1642 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1643 for(list=0; list<h->list_count; list++){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1644 for(i=0; i<2; i++){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1645 if(IS_DIR(mb_type, i, list)){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1646 pred_8x16_motion(h, i*4, list, h->ref_cache[list][ scan8[0] + 2*i ], &mpx, &mpy);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1647 mx = mpx + decode_cabac_mb_mvd( h, list, 4*i, 0 );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1648 my = mpy + decode_cabac_mb_mvd( h, list, 4*i, 1 );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1649
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1650 tprintf(s->avctx, "final mv:%d %d\n", mx, my);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1651 fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx-mpx,my-mpy), 4);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1652 fill_rectangle(h->mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, pack16to32(mx,my), 4);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1653 }else{
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1654 fill_rectangle(h->mvd_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1655 fill_rectangle(h-> mv_cache[list][ scan8[0] + 2*i ], 2, 4, 8, 0, 4);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1656 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1657 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1658 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1659 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1660 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1661
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1662 if( IS_INTER( mb_type ) ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1663 h->chroma_pred_mode_table[mb_xy] = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1664 write_back_motion( h, mb_type );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1665 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1666
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1667 if( !IS_INTRA16x16( mb_type ) ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1668 cbp = decode_cabac_mb_cbp_luma( h );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1669 if(CHROMA)
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1670 cbp |= decode_cabac_mb_cbp_chroma( h ) << 4;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1671 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1672
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1673 h->cbp_table[mb_xy] = h->cbp = cbp;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1674
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1675 if( dct8x8_allowed && (cbp&15) && !IS_INTRA( mb_type ) ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1676 if( decode_cabac_mb_transform_size( h ) )
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1677 mb_type |= MB_TYPE_8x8DCT;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1678 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1679 s->current_picture.mb_type[mb_xy]= mb_type;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1680
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1681 if( cbp || IS_INTRA16x16( mb_type ) ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1682 const uint8_t *scan, *scan8x8, *dc_scan;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1683 const uint32_t *qmul;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1684 int dqp;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1685
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1686 if(IS_INTERLACED(mb_type)){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1687 scan8x8= s->qscale ? h->field_scan8x8 : h->field_scan8x8_q0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1688 scan= s->qscale ? h->field_scan : h->field_scan_q0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1689 dc_scan= luma_dc_field_scan;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1690 }else{
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1691 scan8x8= s->qscale ? h->zigzag_scan8x8 : h->zigzag_scan8x8_q0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1692 scan= s->qscale ? h->zigzag_scan : h->zigzag_scan_q0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1693 dc_scan= luma_dc_zigzag_scan;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1694 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1695
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1696 h->last_qscale_diff = dqp = decode_cabac_mb_dqp( h );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1697 if( dqp == INT_MIN ){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1698 av_log(h->s.avctx, AV_LOG_ERROR, "cabac decode of qscale diff failed at %d %d\n", s->mb_x, s->mb_y);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1699 return -1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1700 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1701 s->qscale += dqp;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1702 if(((unsigned)s->qscale) > 51){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1703 if(s->qscale<0) s->qscale+= 52;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1704 else s->qscale-= 52;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1705 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1706 h->chroma_qp[0] = get_chroma_qp(h, 0, s->qscale);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1707 h->chroma_qp[1] = get_chroma_qp(h, 1, s->qscale);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1708
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1709 if( IS_INTRA16x16( mb_type ) ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1710 int i;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1711 //av_log( s->avctx, AV_LOG_ERROR, "INTRA16x16 DC\n" );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1712 decode_cabac_residual( h, h->mb, 0, 0, dc_scan, NULL, 16);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1713
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1714 if( cbp&15 ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1715 qmul = h->dequant4_coeff[0][s->qscale];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1716 for( i = 0; i < 16; i++ ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1717 //av_log( s->avctx, AV_LOG_ERROR, "INTRA16x16 AC:%d\n", i );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1718 decode_cabac_residual(h, h->mb + 16*i, 1, i, scan + 1, qmul, 15);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1719 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1720 } else {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1721 fill_rectangle(&h->non_zero_count_cache[scan8[0]], 4, 4, 8, 0, 1);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1722 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1723 } else {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1724 int i8x8, i4x4;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1725 for( i8x8 = 0; i8x8 < 4; i8x8++ ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1726 if( cbp & (1<<i8x8) ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1727 if( IS_8x8DCT(mb_type) ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1728 decode_cabac_residual(h, h->mb + 64*i8x8, 5, 4*i8x8,
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1729 scan8x8, h->dequant8_coeff[IS_INTRA( mb_type ) ? 0:1][s->qscale], 64);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1730 } else {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1731 qmul = h->dequant4_coeff[IS_INTRA( mb_type ) ? 0:3][s->qscale];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1732 for( i4x4 = 0; i4x4 < 4; i4x4++ ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1733 const int index = 4*i8x8 + i4x4;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1734 //av_log( s->avctx, AV_LOG_ERROR, "Luma4x4: %d\n", index );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1735 //START_TIMER
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1736 decode_cabac_residual(h, h->mb + 16*index, 2, index, scan, qmul, 16);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1737 //STOP_TIMER("decode_residual")
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1738 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1739 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1740 } else {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1741 uint8_t * const nnz= &h->non_zero_count_cache[ scan8[4*i8x8] ];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1742 nnz[0] = nnz[1] = nnz[8] = nnz[9] = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1743 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1744 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1745 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1746
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1747 if( cbp&0x30 ){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1748 int c;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1749 for( c = 0; c < 2; c++ ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1750 //av_log( s->avctx, AV_LOG_ERROR, "INTRA C%d-DC\n",c );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1751 decode_cabac_residual(h, h->mb + 256 + 16*4*c, 3, c, chroma_dc_scan, NULL, 4);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1752 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1753 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1754
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1755 if( cbp&0x20 ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1756 int c, i;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1757 for( c = 0; c < 2; c++ ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1758 qmul = h->dequant4_coeff[c+1+(IS_INTRA( mb_type ) ? 0:3)][h->chroma_qp[c]];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1759 for( i = 0; i < 4; i++ ) {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1760 const int index = 16 + 4 * c + i;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1761 //av_log( s->avctx, AV_LOG_ERROR, "INTRA C%d-AC %d\n",c, index - 16 );
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1762 decode_cabac_residual(h, h->mb + 16*index, 4, index, scan + 1, qmul, 15);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1763 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1764 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1765 } else {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1766 uint8_t * const nnz= &h->non_zero_count_cache[0];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1767 nnz[ scan8[16]+0 ] = nnz[ scan8[16]+1 ] =nnz[ scan8[16]+8 ] =nnz[ scan8[16]+9 ] =
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1768 nnz[ scan8[20]+0 ] = nnz[ scan8[20]+1 ] =nnz[ scan8[20]+8 ] =nnz[ scan8[20]+9 ] = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1769 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1770 } else {
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1771 uint8_t * const nnz= &h->non_zero_count_cache[0];
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1772 fill_rectangle(&nnz[scan8[0]], 4, 4, 8, 0, 1);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1773 nnz[ scan8[16]+0 ] = nnz[ scan8[16]+1 ] =nnz[ scan8[16]+8 ] =nnz[ scan8[16]+9 ] =
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1774 nnz[ scan8[20]+0 ] = nnz[ scan8[20]+1 ] =nnz[ scan8[20]+8 ] =nnz[ scan8[20]+9 ] = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1775 h->last_qscale_diff = 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1776 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1777
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1778 s->current_picture.qscale_table[mb_xy]= s->qscale;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1779 write_back_non_zero_count(h);
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1780
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1781 if(MB_MBAFF){
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1782 h->ref_count[0] >>= 1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1783 h->ref_count[1] >>= 1;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1784 }
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1785
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1786 return 0;
7101061bfa0f Split cabac decoding code out of h264.c.
michael
parents:
diff changeset
1787 }