2 * Chinese AVS video (AVS1-P2, JiZhun profile) decoder.
3 * Copyright (c) 2006 Stefan Gehrer <stefan.gehrer@gmx.de>
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 * Chinese AVS video (AVS1-P2, JiZhun profile) decoder
25 * @author Stefan Gehrer <stefan.gehrer@gmx.de>
28 #include "libavutil/avassert.h"
29 #include "libavutil/emms.h"
30 #include "libavutil/mem.h"
35 #include "codec_internal.h"
38 #include "mpeg12data.h"
39 #include "startcode.h"
41 static const uint8_t mv_scan
[4] = {
46 static const uint8_t cbp_tab
[64][2] = {
47 { 63, 0 }, { 15, 15 }, { 31, 63 }, { 47, 31 }, { 0, 16 }, { 14, 32 }, { 13, 47 }, { 11, 13 },
48 { 7, 14 }, { 5, 11 }, { 10, 12 }, { 8, 5 }, { 12, 10 }, { 61, 7 }, { 4, 48 }, { 55, 3 },
49 { 1, 2 }, { 2, 8 }, { 59, 4 }, { 3, 1 }, { 62, 61 }, { 9, 55 }, { 6, 59 }, { 29, 62 },
50 { 45, 29 }, { 51, 27 }, { 23, 23 }, { 39, 19 }, { 27, 30 }, { 46, 28 }, { 53, 9 }, { 30, 6 },
51 { 43, 60 }, { 37, 21 }, { 60, 44 }, { 16, 26 }, { 21, 51 }, { 28, 35 }, { 19, 18 }, { 35, 20 },
52 { 42, 24 }, { 26, 53 }, { 44, 17 }, { 32, 37 }, { 58, 39 }, { 24, 45 }, { 20, 58 }, { 17, 43 },
53 { 18, 42 }, { 48, 46 }, { 22, 36 }, { 33, 33 }, { 25, 34 }, { 49, 40 }, { 40, 52 }, { 36, 49 },
54 { 34, 50 }, { 50, 56 }, { 52, 25 }, { 54, 22 }, { 41, 54 }, { 56, 57 }, { 38, 41 }, { 57, 38 }
57 static const uint8_t scan3x3
[4] = { 4, 5, 7, 8 };
59 static const uint8_t dequant_shift
[64] = {
60 14, 14, 14, 14, 14, 14, 14, 14,
61 13, 13, 13, 13, 13, 13, 13, 13,
62 13, 12, 12, 12, 12, 12, 12, 12,
63 11, 11, 11, 11, 11, 11, 11, 11,
64 11, 10, 10, 10, 10, 10, 10, 10,
65 10, 9, 9, 9, 9, 9, 9, 9,
66 9, 8, 8, 8, 8, 8, 8, 8,
67 7, 7, 7, 7, 7, 7, 7, 7
70 static const uint16_t dequant_mul
[64] = {
71 32768, 36061, 38968, 42495, 46341, 50535, 55437, 60424,
72 32932, 35734, 38968, 42495, 46177, 50535, 55109, 59933,
73 65535, 35734, 38968, 42577, 46341, 50617, 55027, 60097,
74 32809, 35734, 38968, 42454, 46382, 50576, 55109, 60056,
75 65535, 35734, 38968, 42495, 46320, 50515, 55109, 60076,
76 65535, 35744, 38968, 42495, 46341, 50535, 55099, 60087,
77 65535, 35734, 38973, 42500, 46341, 50535, 55109, 60097,
78 32771, 35734, 38965, 42497, 46341, 50535, 55109, 60099
83 static const struct dec_2dvlc intra_dec
[7] = {
85 { //level / run / table_inc
86 { 1, 1, 1 }, { -1, 1, 1 }, { 1, 2, 1 }, { -1, 2, 1 }, { 1, 3, 1 }, { -1, 3, 1 },
87 { 1, 4, 1 }, { -1, 4, 1 }, { 1, 5, 1 }, { -1, 5, 1 }, { 1, 6, 1 }, { -1, 6, 1 },
88 { 1, 7, 1 }, { -1, 7, 1 }, { 1, 8, 1 }, { -1, 8, 1 }, { 1, 9, 1 }, { -1, 9, 1 },
89 { 1, 10, 1 }, { -1, 10, 1 }, { 1, 11, 1 }, { -1, 11, 1 }, { 2, 1, 2 }, { -2, 1, 2 },
90 { 1, 12, 1 }, { -1, 12, 1 }, { 1, 13, 1 }, { -1, 13, 1 }, { 1, 14, 1 }, { -1, 14, 1 },
91 { 1, 15, 1 }, { -1, 15, 1 }, { 2, 2, 2 }, { -2, 2, 2 }, { 1, 16, 1 }, { -1, 16, 1 },
92 { 1, 17, 1 }, { -1, 17, 1 }, { 3, 1, 3 }, { -3, 1, 3 }, { 1, 18, 1 }, { -1, 18, 1 },
93 { 1, 19, 1 }, { -1, 19, 1 }, { 2, 3, 2 }, { -2, 3, 2 }, { 1, 20, 1 }, { -1, 20, 1 },
94 { 1, 21, 1 }, { -1, 21, 1 }, { 2, 4, 2 }, { -2, 4, 2 }, { 1, 22, 1 }, { -1, 22, 1 },
95 { 2, 5, 2 }, { -2, 5, 2 }, { 1, 23, 1 }, { -1, 23, 1 }, { EOB
}
98 { 0, 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -1, -1, -1 },
105 { 1, 1, 0 }, { -1, 1, 0 }, { 1, 2, 0 }, { -1, 2, 0 }, { 2, 1, 1 }, { -2, 1, 1 },
106 { 1, 3, 0 }, { -1, 3, 0 }, { EOB
}, { 1, 4, 0 }, { -1, 4, 0 }, { 1, 5, 0 },
107 { -1, 5, 0 }, { 1, 6, 0 }, { -1, 6, 0 }, { 3, 1, 2 }, { -3, 1, 2 }, { 2, 2, 1 },
108 { -2, 2, 1 }, { 1, 7, 0 }, { -1, 7, 0 }, { 1, 8, 0 }, { -1, 8, 0 }, { 1, 9, 0 },
109 { -1, 9, 0 }, { 2, 3, 1 }, { -2, 3, 1 }, { 4, 1, 2 }, { -4, 1, 2 }, { 1, 10, 0 },
110 { -1, 10, 0 }, { 1, 11, 0 }, { -1, 11, 0 }, { 2, 4, 1 }, { -2, 4, 1 }, { 3, 2, 2 },
111 { -3, 2, 2 }, { 1, 12, 0 }, { -1, 12, 0 }, { 2, 5, 1 }, { -2, 5, 1 }, { 5, 1, 3 },
112 { -5, 1, 3 }, { 1, 13, 0 }, { -1, 13, 0 }, { 2, 6, 1 }, { -2, 6, 1 }, { 1, 14, 0 },
113 { -1, 14, 0 }, { 2, 7, 1 }, { -2, 7, 1 }, { 2, 8, 1 }, { -2, 8, 1 }, { 3, 3, 2 },
114 { -3, 3, 2 }, { 6, 1, 3 }, { -6, 1, 3 }, { 1, 15, 0 }, { -1, 15, 0 }
117 { 0, 7, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
124 { 1, 1, 0 }, { -1, 1, 0 }, { 2, 1, 0 }, { -2, 1, 0 }, { 1, 2, 0 }, { -1, 2, 0 },
125 { 3, 1, 1 }, { -3, 1, 1 }, { EOB
}, { 1, 3, 0 }, { -1, 3, 0 }, { 2, 2, 0 },
126 { -2, 2, 0 }, { 4, 1, 1 }, { -4, 1, 1 }, { 1, 4, 0 }, { -1, 4, 0 }, { 5, 1, 2 },
127 { -5, 1, 2 }, { 1, 5, 0 }, { -1, 5, 0 }, { 3, 2, 1 }, { -3, 2, 1 }, { 2, 3, 0 },
128 { -2, 3, 0 }, { 1, 6, 0 }, { -1, 6, 0 }, { 6, 1, 2 }, { -6, 1, 2 }, { 2, 4, 0 },
129 { -2, 4, 0 }, { 1, 7, 0 }, { -1, 7, 0 }, { 4, 2, 1 }, { -4, 2, 1 }, { 7, 1, 2 },
130 { -7, 1, 2 }, { 3, 3, 1 }, { -3, 3, 1 }, { 2, 5, 0 }, { -2, 5, 0 }, { 1, 8, 0 },
131 { -1, 8, 0 }, { 2, 6, 0 }, { -2, 6, 0 }, { 8, 1, 3 }, { -8, 1, 3 }, { 1, 9, 0 },
132 { -1, 9, 0 }, { 5, 2, 2 }, { -5, 2, 2 }, { 3, 4, 1 }, { -3, 4, 1 }, { 2, 7, 0 },
133 { -2, 7, 0 }, { 9, 1, 3 }, { -9, 1, 3 }, { 1, 10, 0 }, { -1, 10, 0 }
136 { 0, 10, 6, 4, 4, 3, 3, 3, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
143 { 1, 1, 0 }, { -1, 1, 0 }, { 2, 1, 0 }, { -2, 1, 0 }, { 3, 1, 0 }, { -3, 1, 0 },
144 { 1, 2, 0 }, { -1, 2, 0 }, { EOB
}, { 4, 1, 0 }, { -4, 1, 0 }, { 5, 1, 1 },
145 { -5, 1, 1 }, { 2, 2, 0 }, { -2, 2, 0 }, { 1, 3, 0 }, { -1, 3, 0 }, { 6, 1, 1 },
146 { -6, 1, 1 }, { 3, 2, 0 }, { -3, 2, 0 }, { 7, 1, 1 }, { -7, 1, 1 }, { 1, 4, 0 },
147 { -1, 4, 0 }, { 8, 1, 2 }, { -8, 1, 2 }, { 2, 3, 0 }, { -2, 3, 0 }, { 4, 2, 0 },
148 { -4, 2, 0 }, { 1, 5, 0 }, { -1, 5, 0 }, { 9, 1, 2 }, { -9, 1, 2 }, { 5, 2, 1 },
149 { -5, 2, 1 }, { 2, 4, 0 }, { -2, 4, 0 }, { 10, 1, 2 }, {-10, 1, 2 }, { 3, 3, 0 },
150 { -3, 3, 0 }, { 1, 6, 0 }, { -1, 6, 0 }, { 11, 1, 3 }, {-11, 1, 3 }, { 6, 2, 1 },
151 { -6, 2, 1 }, { 1, 7, 0 }, { -1, 7, 0 }, { 2, 5, 0 }, { -2, 5, 0 }, { 3, 4, 0 },
152 { -3, 4, 0 }, { 12, 1, 3 }, {-12, 1, 3 }, { 4, 3, 0 }, { -4, 3, 0 }
155 { 0, 13, 7, 5, 4, 3, 2, 2, -1, -1, -1 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
162 { 1, 1, 0 }, { -1, 1, 0 }, { 2, 1, 0 }, { -2, 1, 0 }, { 3, 1, 0 }, { -3, 1, 0 },
163 { EOB
}, { 4, 1, 0 }, { -4, 1, 0 }, { 5, 1, 0 }, { -5, 1, 0 }, { 6, 1, 0 },
164 { -6, 1, 0 }, { 1, 2, 0 }, { -1, 2, 0 }, { 7, 1, 0 }, { -7, 1, 0 }, { 8, 1, 1 },
165 { -8, 1, 1 }, { 2, 2, 0 }, { -2, 2, 0 }, { 9, 1, 1 }, { -9, 1, 1 }, { 10, 1, 1 },
166 {-10, 1, 1 }, { 1, 3, 0 }, { -1, 3, 0 }, { 3, 2, 0 }, { -3, 2, 0 }, { 11, 1, 2 },
167 {-11, 1, 2 }, { 4, 2, 0 }, { -4, 2, 0 }, { 12, 1, 2 }, {-12, 1, 2 }, { 13, 1, 2 },
168 {-13, 1, 2 }, { 5, 2, 0 }, { -5, 2, 0 }, { 1, 4, 0 }, { -1, 4, 0 }, { 2, 3, 0 },
169 { -2, 3, 0 }, { 14, 1, 2 }, {-14, 1, 2 }, { 6, 2, 0 }, { -6, 2, 0 }, { 15, 1, 2 },
170 {-15, 1, 2 }, { 16, 1, 2 }, {-16, 1, 2 }, { 3, 3, 0 }, { -3, 3, 0 }, { 1, 5, 0 },
171 { -1, 5, 0 }, { 7, 2, 0 }, { -7, 2, 0 }, { 17, 1, 2 }, {-17, 1, 2 }
174 { 0,18, 8, 4, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
181 { EOB
}, { 1, 1, 0 }, { -1, 1, 0 }, { 2, 1, 0 }, { -2, 1, 0 }, { 3, 1, 0 },
182 { -3, 1, 0 }, { 4, 1, 0 }, { -4, 1, 0 }, { 5, 1, 0 }, { -5, 1, 0 }, { 6, 1, 0 },
183 { -6, 1, 0 }, { 7, 1, 0 }, { -7, 1, 0 }, { 8, 1, 0 }, { -8, 1, 0 }, { 9, 1, 0 },
184 { -9, 1, 0 }, { 10, 1, 0 }, {-10, 1, 0 }, { 1, 2, 0 }, { -1, 2, 0 }, { 11, 1, 1 },
185 {-11, 1, 1 }, { 12, 1, 1 }, {-12, 1, 1 }, { 13, 1, 1 }, {-13, 1, 1 }, { 2, 2, 0 },
186 { -2, 2, 0 }, { 14, 1, 1 }, {-14, 1, 1 }, { 15, 1, 1 }, {-15, 1, 1 }, { 3, 2, 0 },
187 { -3, 2, 0 }, { 16, 1, 1 }, {-16, 1, 1 }, { 1, 3, 0 }, { -1, 3, 0 }, { 17, 1, 1 },
188 {-17, 1, 1 }, { 4, 2, 0 }, { -4, 2, 0 }, { 18, 1, 1 }, {-18, 1, 1 }, { 5, 2, 0 },
189 { -5, 2, 0 }, { 19, 1, 1 }, {-19, 1, 1 }, { 20, 1, 1 }, {-20, 1, 1 }, { 6, 2, 0 },
190 { -6, 2, 0 }, { 21, 1, 1 }, {-21, 1, 1 }, { 2, 3, 0 }, { -2, 3, 0 }
193 { 0, 22, 7, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
200 { EOB
}, { 1, 1, 0 }, { -1, 1, 0 }, { 2, 1, 0 }, { -2, 1, 0 }, { 3, 1, 0 },
201 { -3, 1, 0 }, { 4, 1, 0 }, { -4, 1, 0 }, { 5, 1, 0 }, { -5, 1, 0 }, { 6, 1, 0 },
202 { -6, 1, 0 }, { 7, 1, 0 }, { -7, 1, 0 }, { 8, 1, 0 }, { -8, 1, 0 }, { 9, 1, 0 },
203 { -9, 1, 0 }, { 10, 1, 0 }, {-10, 1, 0 }, { 11, 1, 0 }, {-11, 1, 0 }, { 12, 1, 0 },
204 {-12, 1, 0 }, { 13, 1, 0 }, {-13, 1, 0 }, { 14, 1, 0 }, {-14, 1, 0 }, { 15, 1, 0 },
205 {-15, 1, 0 }, { 16, 1, 0 }, {-16, 1, 0 }, { 1, 2, 0 }, { -1, 2, 0 }, { 17, 1, 0 },
206 {-17, 1, 0 }, { 18, 1, 0 }, {-18, 1, 0 }, { 19, 1, 0 }, {-19, 1, 0 }, { 20, 1, 0 },
207 {-20, 1, 0 }, { 21, 1, 0 }, {-21, 1, 0 }, { 2, 2, 0 }, { -2, 2, 0 }, { 22, 1, 0 },
208 {-22, 1, 0 }, { 23, 1, 0 }, {-23, 1, 0 }, { 24, 1, 0 }, {-24, 1, 0 }, { 25, 1, 0 },
209 {-25, 1, 0 }, { 3, 2, 0 }, { -3, 2, 0 }, { 26, 1, 0 }, {-26, 1, 0 }
212 { 0, 27, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
219 static const struct dec_2dvlc inter_dec
[7] = {
222 { 1, 1, 1 }, { -1, 1, 1 }, { 1, 2, 1 }, { -1, 2, 1 }, { 1, 3, 1 }, { -1, 3, 1 },
223 { 1, 4, 1 }, { -1, 4, 1 }, { 1, 5, 1 }, { -1, 5, 1 }, { 1, 6, 1 }, { -1, 6, 1 },
224 { 1, 7, 1 }, { -1, 7, 1 }, { 1, 8, 1 }, { -1, 8, 1 }, { 1, 9, 1 }, { -1, 9, 1 },
225 { 1, 10, 1 }, { -1, 10, 1 }, { 1, 11, 1 }, { -1, 11, 1 }, { 1, 12, 1 }, { -1, 12, 1 },
226 { 1, 13, 1 }, { -1, 13, 1 }, { 2, 1, 2 }, { -2, 1, 2 }, { 1, 14, 1 }, { -1, 14, 1 },
227 { 1, 15, 1 }, { -1, 15, 1 }, { 1, 16, 1 }, { -1, 16, 1 }, { 1, 17, 1 }, { -1, 17, 1 },
228 { 1, 18, 1 }, { -1, 18, 1 }, { 1, 19, 1 }, { -1, 19, 1 }, { 3, 1, 3 }, { -3, 1, 3 },
229 { 1, 20, 1 }, { -1, 20, 1 }, { 1, 21, 1 }, { -1, 21, 1 }, { 2, 2, 2 }, { -2, 2, 2 },
230 { 1, 22, 1 }, { -1, 22, 1 }, { 1, 23, 1 }, { -1, 23, 1 }, { 1, 24, 1 }, { -1, 24, 1 },
231 { 1, 25, 1 }, { -1, 25, 1 }, { 1, 26, 1 }, { -1, 26, 1 }, { EOB
}
234 { 0, 4, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 },
241 { 1, 1, 0 }, { -1, 1, 0 }, { EOB
}, { 1, 2, 0 }, { -1, 2, 0 }, { 1, 3, 0 },
242 { -1, 3, 0 }, { 1, 4, 0 }, { -1, 4, 0 }, { 1, 5, 0 }, { -1, 5, 0 }, { 1, 6, 0 },
243 { -1, 6, 0 }, { 2, 1, 1 }, { -2, 1, 1 }, { 1, 7, 0 }, { -1, 7, 0 }, { 1, 8, 0 },
244 { -1, 8, 0 }, { 1, 9, 0 }, { -1, 9, 0 }, { 1, 10, 0 }, { -1, 10, 0 }, { 2, 2, 1 },
245 { -2, 2, 1 }, { 1, 11, 0 }, { -1, 11, 0 }, { 1, 12, 0 }, { -1, 12, 0 }, { 3, 1, 2 },
246 { -3, 1, 2 }, { 1, 13, 0 }, { -1, 13, 0 }, { 1, 14, 0 }, { -1, 14, 0 }, { 2, 3, 1 },
247 { -2, 3, 1 }, { 1, 15, 0 }, { -1, 15, 0 }, { 2, 4, 1 }, { -2, 4, 1 }, { 1, 16, 0 },
248 { -1, 16, 0 }, { 2, 5, 1 }, { -2, 5, 1 }, { 1, 17, 0 }, { -1, 17, 0 }, { 4, 1, 3 },
249 { -4, 1, 3 }, { 2, 6, 1 }, { -2, 6, 1 }, { 1, 18, 0 }, { -1, 18, 0 }, { 1, 19, 0 },
250 { -1, 19, 0 }, { 2, 7, 1 }, { -2, 7, 1 }, { 3, 2, 2 }, { -3, 2, 2 }
253 { 0, 5, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1 },
260 { 1, 1, 0 }, { -1, 1, 0 }, { EOB
}, { 1, 2, 0 }, { -1, 2, 0 }, { 2, 1, 0 },
261 { -2, 1, 0 }, { 1, 3, 0 }, { -1, 3, 0 }, { 1, 4, 0 }, { -1, 4, 0 }, { 3, 1, 1 },
262 { -3, 1, 1 }, { 2, 2, 0 }, { -2, 2, 0 }, { 1, 5, 0 }, { -1, 5, 0 }, { 1, 6, 0 },
263 { -1, 6, 0 }, { 1, 7, 0 }, { -1, 7, 0 }, { 2, 3, 0 }, { -2, 3, 0 }, { 4, 1, 2 },
264 { -4, 1, 2 }, { 1, 8, 0 }, { -1, 8, 0 }, { 3, 2, 1 }, { -3, 2, 1 }, { 2, 4, 0 },
265 { -2, 4, 0 }, { 1, 9, 0 }, { -1, 9, 0 }, { 1, 10, 0 }, { -1, 10, 0 }, { 5, 1, 2 },
266 { -5, 1, 2 }, { 2, 5, 0 }, { -2, 5, 0 }, { 1, 11, 0 }, { -1, 11, 0 }, { 2, 6, 0 },
267 { -2, 6, 0 }, { 1, 12, 0 }, { -1, 12, 0 }, { 3, 3, 1 }, { -3, 3, 1 }, { 6, 1, 2 },
268 { -6, 1, 2 }, { 4, 2, 2 }, { -4, 2, 2 }, { 1, 13, 0 }, { -1, 13, 0 }, { 2, 7, 0 },
269 { -2, 7, 0 }, { 3, 4, 1 }, { -3, 4, 1 }, { 1, 14, 0 }, { -1, 14, 0 }
272 { 0, 7, 5, 4, 4, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
279 { 1, 1, 0 }, { -1, 1, 0 }, { EOB
}, { 2, 1, 0 }, { -2, 1, 0 }, { 1, 2, 0 },
280 { -1, 2, 0 }, { 3, 1, 0 }, { -3, 1, 0 }, { 1, 3, 0 }, { -1, 3, 0 }, { 2, 2, 0 },
281 { -2, 2, 0 }, { 4, 1, 1 }, { -4, 1, 1 }, { 1, 4, 0 }, { -1, 4, 0 }, { 5, 1, 1 },
282 { -5, 1, 1 }, { 1, 5, 0 }, { -1, 5, 0 }, { 3, 2, 0 }, { -3, 2, 0 }, { 2, 3, 0 },
283 { -2, 3, 0 }, { 1, 6, 0 }, { -1, 6, 0 }, { 6, 1, 1 }, { -6, 1, 1 }, { 2, 4, 0 },
284 { -2, 4, 0 }, { 1, 7, 0 }, { -1, 7, 0 }, { 4, 2, 1 }, { -4, 2, 1 }, { 7, 1, 2 },
285 { -7, 1, 2 }, { 3, 3, 0 }, { -3, 3, 0 }, { 1, 8, 0 }, { -1, 8, 0 }, { 2, 5, 0 },
286 { -2, 5, 0 }, { 8, 1, 2 }, { -8, 1, 2 }, { 1, 9, 0 }, { -1, 9, 0 }, { 3, 4, 0 },
287 { -3, 4, 0 }, { 2, 6, 0 }, { -2, 6, 0 }, { 5, 2, 1 }, { -5, 2, 1 }, { 1, 10, 0 },
288 { -1, 10, 0 }, { 9, 1, 2 }, { -9, 1, 2 }, { 4, 3, 1 }, { -4, 3, 1 }
291 { 0,10, 6, 5, 4, 3, 3, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
298 { 1, 1, 0 }, { -1, 1, 0 }, { EOB
}, { 2, 1, 0 }, { -2, 1, 0 }, { 3, 1, 0 },
299 { -3, 1, 0 }, { 1, 2, 0 }, { -1, 2, 0 }, { 4, 1, 0 }, { -4, 1, 0 }, { 5, 1, 0 },
300 { -5, 1, 0 }, { 2, 2, 0 }, { -2, 2, 0 }, { 1, 3, 0 }, { -1, 3, 0 }, { 6, 1, 0 },
301 { -6, 1, 0 }, { 3, 2, 0 }, { -3, 2, 0 }, { 7, 1, 1 }, { -7, 1, 1 }, { 1, 4, 0 },
302 { -1, 4, 0 }, { 8, 1, 1 }, { -8, 1, 1 }, { 2, 3, 0 }, { -2, 3, 0 }, { 4, 2, 0 },
303 { -4, 2, 0 }, { 1, 5, 0 }, { -1, 5, 0 }, { 9, 1, 1 }, { -9, 1, 1 }, { 5, 2, 0 },
304 { -5, 2, 0 }, { 2, 4, 0 }, { -2, 4, 0 }, { 1, 6, 0 }, { -1, 6, 0 }, { 10, 1, 2 },
305 {-10, 1, 2 }, { 3, 3, 0 }, { -3, 3, 0 }, { 11, 1, 2 }, {-11, 1, 2 }, { 1, 7, 0 },
306 { -1, 7, 0 }, { 6, 2, 0 }, { -6, 2, 0 }, { 3, 4, 0 }, { -3, 4, 0 }, { 2, 5, 0 },
307 { -2, 5, 0 }, { 12, 1, 2 }, {-12, 1, 2 }, { 4, 3, 0 }, { -4, 3, 0 }
310 { 0, 13, 7, 5, 4, 3, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
317 { EOB
}, { 1, 1, 0 }, { -1, 1, 0 }, { 2, 1, 0 }, { -2, 1, 0 }, { 3, 1, 0 },
318 { -3, 1, 0 }, { 4, 1, 0 }, { -4, 1, 0 }, { 5, 1, 0 }, { -5, 1, 0 }, { 1, 2, 0 },
319 { -1, 2, 0 }, { 6, 1, 0 }, { -6, 1, 0 }, { 7, 1, 0 }, { -7, 1, 0 }, { 8, 1, 0 },
320 { -8, 1, 0 }, { 2, 2, 0 }, { -2, 2, 0 }, { 9, 1, 0 }, { -9, 1, 0 }, { 1, 3, 0 },
321 { -1, 3, 0 }, { 10, 1, 1 }, { -10, 1, 1 }, { 3, 2, 0 }, { -3, 2, 0 }, { 11, 1, 1 },
322 { -11, 1, 1 }, { 4, 2, 0 }, { -4, 2, 0 }, { 12, 1, 1 }, { -12, 1, 1 }, { 1, 4, 0 },
323 { -1, 4, 0 }, { 2, 3, 0 }, { -2, 3, 0 }, { 13, 1, 1 }, { -13, 1, 1 }, { 5, 2, 0 },
324 { -5, 2, 0 }, { 14, 1, 1 }, { -14, 1, 1 }, { 6, 2, 0 }, { -6, 2, 0 }, { 1, 5, 0 },
325 { -1, 5, 0 }, { 15, 1, 1 }, { -15, 1, 1 }, { 3, 3, 0 }, { -3, 3, 0 }, { 16, 1, 1 },
326 { -16, 1, 1 }, { 2, 4, 0 }, { -2, 4, 0 }, { 7, 2, 0 }, { -7, 2, 0 }
329 { 0, 17, 8, 4, 3, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
336 { EOB
}, { 1, 1, 0 }, { -1, 1, 0 }, { 2, 1, 0 }, { -2, 1, 0 }, { 3, 1, 0 },
337 { -3, 1, 0 }, { 4, 1, 0 }, { -4, 1, 0 }, { 5, 1, 0 }, { -5, 1, 0 }, { 6, 1, 0 },
338 { -6, 1, 0 }, { 7, 1, 0 }, { -7, 1, 0 }, { 1, 2, 0 }, { -1, 2, 0 }, { 8, 1, 0 },
339 { -8, 1, 0 }, { 9, 1, 0 }, { -9, 1, 0 }, { 10, 1, 0 }, { -10, 1, 0 }, { 11, 1, 0 },
340 { -11, 1, 0 }, { 12, 1, 0 }, { -12, 1, 0 }, { 2, 2, 0 }, { -2, 2, 0 }, { 13, 1, 0 },
341 { -13, 1, 0 }, { 1, 3, 0 }, { -1, 3, 0 }, { 14, 1, 0 }, { -14, 1, 0 }, { 15, 1, 0 },
342 { -15, 1, 0 }, { 3, 2, 0 }, { -3, 2, 0 }, { 16, 1, 0 }, { -16, 1, 0 }, { 17, 1, 0 },
343 { -17, 1, 0 }, { 18, 1, 0 }, { -18, 1, 0 }, { 4, 2, 0 }, { -4, 2, 0 }, { 19, 1, 0 },
344 { -19, 1, 0 }, { 20, 1, 0 }, { -20, 1, 0 }, { 2, 3, 0 }, { -2, 3, 0 }, { 1, 4, 0 },
345 { -1, 4, 0 }, { 5, 2, 0 }, { -5, 2, 0 }, { 21, 1, 0 }, { -21, 1, 0 }
348 { 0, 22, 6, 3, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
355 static const struct dec_2dvlc chroma_dec
[5] = {
358 { 1, 1, 1 }, { -1, 1, 1 }, { 1, 2, 1 }, { -1, 2, 1 }, { 1, 3, 1 }, { -1, 3, 1 },
359 { 1, 4, 1 }, { -1, 4, 1 }, { 1, 5, 1 }, { -1, 5, 1 }, { 1, 6, 1 }, { -1, 6, 1 },
360 { 1, 7, 1 }, { -1, 7, 1 }, { 2, 1, 2 }, { -2, 1, 2 }, { 1, 8, 1 }, { -1, 8, 1 },
361 { 1, 9, 1 }, { -1, 9, 1 }, { 1, 10, 1 }, { -1, 10, 1 }, { 1, 11, 1 }, { -1, 11, 1 },
362 { 1, 12, 1 }, { -1, 12, 1 }, { 1, 13, 1 }, { -1, 13, 1 }, { 1, 14, 1 }, { -1, 14, 1 },
363 { 1, 15, 1 }, { -1, 15, 1 }, { 3, 1, 3 }, { -3, 1, 3 }, { 1, 16, 1 }, { -1, 16, 1 },
364 { 1, 17, 1 }, { -1, 17, 1 }, { 1, 18, 1 }, { -1, 18, 1 }, { 1, 19, 1 }, { -1, 19, 1 },
365 { 1, 20, 1 }, { -1, 20, 1 }, { 1, 21, 1 }, { -1, 21, 1 }, { 1, 22, 1 }, { -1, 22, 1 },
366 { 2, 2, 2 }, { -2, 2, 2 }, { 1, 23, 1 }, { -1, 23, 1 }, { 1, 24, 1 }, { -1, 24, 1 },
367 { 1, 25, 1 }, { -1, 25, 1 }, { 4, 1, 3 }, { -4, 1, 3 }, { EOB
}
370 { 0, 5, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -1 },
377 { EOB
}, { 1, 1, 0 }, { -1, 1, 0 }, { 1, 2, 0 }, { -1, 2, 0 }, { 2, 1, 1 },
378 { -2, 1, 1 }, { 1, 3, 0 }, { -1, 3, 0 }, { 1, 4, 0 }, { -1, 4, 0 }, { 1, 5, 0 },
379 { -1, 5, 0 }, { 1, 6, 0 }, { -1, 6, 0 }, { 3, 1, 2 }, { -3, 1, 2 }, { 1, 7, 0 },
380 { -1, 7, 0 }, { 1, 8, 0 }, { -1, 8, 0 }, { 2, 2, 1 }, { -2, 2, 1 }, { 1, 9, 0 },
381 { -1, 9, 0 }, { 1, 10, 0 }, { -1, 10, 0 }, { 1, 11, 0 }, { -1, 11, 0 }, { 4, 1, 2 },
382 { -4, 1, 2 }, { 1, 12, 0 }, { -1, 12, 0 }, { 1, 13, 0 }, { -1, 13, 0 }, { 1, 14, 0 },
383 { -1, 14, 0 }, { 2, 3, 1 }, { -2, 3, 1 }, { 1, 15, 0 }, { -1, 15, 0 }, { 2, 4, 1 },
384 { -2, 4, 1 }, { 5, 1, 3 }, { -5, 1, 3 }, { 3, 2, 2 }, { -3, 2, 2 }, { 1, 16, 0 },
385 { -1, 16, 0 }, { 1, 17, 0 }, { -1, 17, 0 }, { 1, 18, 0 }, { -1, 18, 0 }, { 2, 5, 1 },
386 { -2, 5, 1 }, { 1, 19, 0 }, { -1, 19, 0 }, { 1, 20, 0 }, { -1, 20, 0 }
389 { 0, 6, 4, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1 },
396 { 1, 1, 0 }, { -1, 1, 0 }, { EOB
}, { 2, 1, 0 }, { -2, 1, 0 }, { 1, 2, 0 },
397 { -1, 2, 0 }, { 3, 1, 1 }, { -3, 1, 1 }, { 1, 3, 0 }, { -1, 3, 0 }, { 4, 1, 1 },
398 { -4, 1, 1 }, { 2, 2, 0 }, { -2, 2, 0 }, { 1, 4, 0 }, { -1, 4, 0 }, { 5, 1, 2 },
399 { -5, 1, 2 }, { 1, 5, 0 }, { -1, 5, 0 }, { 3, 2, 1 }, { -3, 2, 1 }, { 2, 3, 0 },
400 { -2, 3, 0 }, { 1, 6, 0 }, { -1, 6, 0 }, { 6, 1, 2 }, { -6, 1, 2 }, { 1, 7, 0 },
401 { -1, 7, 0 }, { 2, 4, 0 }, { -2, 4, 0 }, { 7, 1, 2 }, { -7, 1, 2 }, { 1, 8, 0 },
402 { -1, 8, 0 }, { 4, 2, 1 }, { -4, 2, 1 }, { 1, 9, 0 }, { -1, 9, 0 }, { 3, 3, 1 },
403 { -3, 3, 1 }, { 2, 5, 0 }, { -2, 5, 0 }, { 2, 6, 0 }, { -2, 6, 0 }, { 8, 1, 2 },
404 { -8, 1, 2 }, { 1, 10, 0 }, { -1, 10, 0 }, { 1, 11, 0 }, { -1, 11, 0 }, { 9, 1, 2 },
405 { -9, 1, 2 }, { 5, 2, 2 }, { -5, 2, 2 }, { 3, 4, 1 }, { -3, 4, 1 },
408 { 0,10, 6, 4, 4, 3, 3, 2, 2, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
415 { EOB
}, { 1, 1, 0 }, { -1, 1, 0 }, { 2, 1, 0 }, { -2, 1, 0 }, { 3, 1, 0 },
416 { -3, 1, 0 }, { 4, 1, 0 }, { -4, 1, 0 }, { 1, 2, 0 }, { -1, 2, 0 }, { 5, 1, 1 },
417 { -5, 1, 1 }, { 2, 2, 0 }, { -2, 2, 0 }, { 6, 1, 1 }, { -6, 1, 1 }, { 1, 3, 0 },
418 { -1, 3, 0 }, { 7, 1, 1 }, { -7, 1, 1 }, { 3, 2, 0 }, { -3, 2, 0 }, { 8, 1, 1 },
419 { -8, 1, 1 }, { 1, 4, 0 }, { -1, 4, 0 }, { 2, 3, 0 }, { -2, 3, 0 }, { 9, 1, 1 },
420 { -9, 1, 1 }, { 4, 2, 0 }, { -4, 2, 0 }, { 1, 5, 0 }, { -1, 5, 0 }, { 10, 1, 1 },
421 {-10, 1, 1 }, { 3, 3, 0 }, { -3, 3, 0 }, { 5, 2, 1 }, { -5, 2, 1 }, { 2, 4, 0 },
422 { -2, 4, 0 }, { 11, 1, 1 }, {-11, 1, 1 }, { 1, 6, 0 }, { -1, 6, 0 }, { 12, 1, 1 },
423 {-12, 1, 1 }, { 1, 7, 0 }, { -1, 7, 0 }, { 6, 2, 1 }, { -6, 2, 1 }, { 13, 1, 1 },
424 {-13, 1, 1 }, { 2, 5, 0 }, { -2, 5, 0 }, { 1, 8, 0 }, { -1, 8, 0 },
427 { 0, 14, 7, 4, 3, 3, 2, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
434 { EOB
}, { 1, 1, 0 }, { -1, 1, 0 }, { 2, 1, 0 }, { -2, 1, 0 }, { 3, 1, 0 },
435 { -3, 1, 0 }, { 4, 1, 0 }, { -4, 1, 0 }, { 5, 1, 0 }, { -5, 1, 0 }, { 6, 1, 0 },
436 { -6, 1, 0 }, { 7, 1, 0 }, { -7, 1, 0 }, { 8, 1, 0 }, { -8, 1, 0 }, { 1, 2, 0 },
437 { -1, 2, 0 }, { 9, 1, 0 }, { -9, 1, 0 }, { 10, 1, 0 }, { -10, 1, 0 }, { 11, 1, 0 },
438 { -11, 1, 0 }, { 2, 2, 0 }, { -2, 2, 0 }, { 12, 1, 0 }, { -12, 1, 0 }, { 13, 1, 0 },
439 { -13, 1, 0 }, { 3, 2, 0 }, { -3, 2, 0 }, { 14, 1, 0 }, { -14, 1, 0 }, { 1, 3, 0 },
440 { -1, 3, 0 }, { 15, 1, 0 }, { -15, 1, 0 }, { 4, 2, 0 }, { -4, 2, 0 }, { 16, 1, 0 },
441 { -16, 1, 0 }, { 17, 1, 0 }, { -17, 1, 0 }, { 5, 2, 0 }, { -5, 2, 0 }, { 1, 4, 0 },
442 { -1, 4, 0 }, { 2, 3, 0 }, { -2, 3, 0 }, { 18, 1, 0 }, { -18, 1, 0 }, { 6, 2, 0 },
443 { -6, 2, 0 }, { 19, 1, 0 }, { -19, 1, 0 }, { 1, 5, 0 }, { -1, 5, 0 },
446 { 0, 20, 7, 3, 2, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
455 /*****************************************************************************
457 * motion vector prediction
459 ****************************************************************************/
461 static inline void store_mvs(AVSContext
*h
)
463 h
->col_mv
[h
->mbidx
* 4 + 0] = h
->mv
[MV_FWD_X0
];
464 h
->col_mv
[h
->mbidx
* 4 + 1] = h
->mv
[MV_FWD_X1
];
465 h
->col_mv
[h
->mbidx
* 4 + 2] = h
->mv
[MV_FWD_X2
];
466 h
->col_mv
[h
->mbidx
* 4 + 3] = h
->mv
[MV_FWD_X3
];
469 static inline void mv_pred_direct(AVSContext
*h
, cavs_vector
*pmv_fw
,
472 cavs_vector
*pmv_bw
= pmv_fw
+ MV_BWD_OFFS
;
473 unsigned den
= h
->direct_den
[col_mv
->ref
];
474 int m
= FF_SIGNBIT(col_mv
->x
);
476 pmv_fw
->dist
= h
->dist
[1];
477 pmv_bw
->dist
= h
->dist
[0];
480 /* scale the co-located motion vector according to its temporal span */
481 pmv_fw
->x
= (((den
+ (den
* col_mv
->x
* pmv_fw
->dist
^ m
) - m
- 1) >> 14) ^ m
) - m
;
482 pmv_bw
->x
= m
- (((den
+ (den
* col_mv
->x
* pmv_bw
->dist
^ m
) - m
- 1) >> 14) ^ m
);
483 m
= FF_SIGNBIT(col_mv
->y
);
484 pmv_fw
->y
= (((den
+ (den
* col_mv
->y
* pmv_fw
->dist
^ m
) - m
- 1) >> 14) ^ m
) - m
;
485 pmv_bw
->y
= m
- (((den
+ (den
* col_mv
->y
* pmv_bw
->dist
^ m
) - m
- 1) >> 14) ^ m
);
488 static inline void mv_pred_sym(AVSContext
*h
, cavs_vector
*src
,
489 enum cavs_block size
)
491 cavs_vector
*dst
= src
+ MV_BWD_OFFS
;
493 /* backward mv is the scaled and negated forward mv */
494 dst
->x
= -((src
->x
* h
->sym_factor
+ 256) >> 9);
495 dst
->y
= -((src
->y
* h
->sym_factor
+ 256) >> 9);
497 dst
->dist
= h
->dist
[0];
501 /*****************************************************************************
503 * residual data decoding
505 ****************************************************************************/
507 /** kth-order exponential golomb code */
508 static inline int get_ue_code(GetBitContext
*gb
, int order
)
510 unsigned ret
= get_ue_golomb(gb
);
511 if (ret
>= ((1U<<31)>>order
)) {
512 av_log(NULL
, AV_LOG_ERROR
, "get_ue_code: value too large\n");
513 return AVERROR_INVALIDDATA
;
516 return (ret
<<order
) + get_bits(gb
, order
);
521 static inline int dequant(AVSContext
*h
, int16_t *level_buf
, uint8_t *run_buf
,
522 int16_t *dst
, int mul
, int shift
, int coeff_num
)
524 int round
= 1 << (shift
- 1);
526 const uint8_t *scantab
= h
->permutated_scantable
;
528 /* inverse scan and dequantization */
529 while (--coeff_num
>= 0) {
530 pos
+= run_buf
[coeff_num
];
532 av_log(h
->avctx
, AV_LOG_ERROR
,
533 "position out of block bounds at pic %d MB(%d,%d)\n",
534 h
->cur
.poc
, h
->mbx
, h
->mby
);
535 return AVERROR_INVALIDDATA
;
537 dst
[scantab
[pos
]] = (level_buf
[coeff_num
] * mul
+ round
) >> shift
;
543 * decode coefficients from one 8x8 block, dequantize, inverse transform
544 * and add them to sample block
545 * @param r pointer to 2D VLC table
546 * @param esc_golomb_order escape codes are k-golomb with this order k
547 * @param qp quantizer
548 * @param dst location of sample block
549 * @param stride line stride in frame buffer
551 static int decode_residual_block(AVSContext
*h
, GetBitContext
*gb
,
552 const struct dec_2dvlc
*r
, int esc_golomb_order
,
553 int qp
, uint8_t *dst
, ptrdiff_t stride
)
555 int i
, esc_code
, level
, mask
, ret
;
556 unsigned int level_code
, run
;
557 int16_t level_buf
[65];
559 int16_t *block
= h
->block
;
561 for (i
= 0; i
< 65; i
++) {
562 level_code
= get_ue_code(gb
, r
->golomb_order
);
563 if (level_code
>= ESCAPE_CODE
) {
564 run
= ((level_code
- ESCAPE_CODE
) >> 1) + 1;
566 av_log(h
->avctx
, AV_LOG_ERROR
, "run %d is too large\n", run
);
567 return AVERROR_INVALIDDATA
;
569 esc_code
= get_ue_code(gb
, esc_golomb_order
);
570 if (esc_code
< 0 || esc_code
> 32767) {
571 av_log(h
->avctx
, AV_LOG_ERROR
, "esc_code invalid\n");
572 return AVERROR_INVALIDDATA
;
575 level
= esc_code
+ (run
> r
->max_run
? 1 : r
->level_add
[run
]);
576 while (level
> r
->inc_limit
)
578 mask
= -(level_code
& 1);
579 level
= (level
^ mask
) - mask
;
581 level
= r
->rltab
[level_code
][0];
582 if (!level
) //end of block signal
584 run
= r
->rltab
[level_code
][1];
585 r
+= r
->rltab
[level_code
][2];
587 level_buf
[i
] = level
;
590 if ((ret
= dequant(h
, level_buf
, run_buf
, block
, dequant_mul
[qp
],
591 dequant_shift
[qp
], i
)) < 0)
593 h
->cdsp
.cavs_idct8_add(dst
, block
, stride
);
594 h
->bdsp
.clear_block(block
);
599 static inline int decode_residual_chroma(AVSContext
*h
)
601 if (h
->cbp
& (1 << 4)) {
602 int ret
= decode_residual_block(h
, &h
->gb
, chroma_dec
, 0,
603 ff_cavs_chroma_qp
[h
->qp
], h
->cu
, h
->c_stride
);
607 if (h
->cbp
& (1 << 5)) {
608 int ret
= decode_residual_block(h
, &h
->gb
, chroma_dec
, 0,
609 ff_cavs_chroma_qp
[h
->qp
], h
->cv
, h
->c_stride
);
616 static inline int decode_residual_inter(AVSContext
*h
)
620 /* get coded block pattern */
621 int cbp
= get_ue_golomb(&h
->gb
);
623 av_log(h
->avctx
, AV_LOG_ERROR
, "illegal inter cbp %d\n", cbp
);
624 return AVERROR_INVALIDDATA
;
626 h
->cbp
= cbp_tab
[cbp
][1];
629 if (h
->cbp
&& !h
->qp_fixed
)
630 h
->qp
= (h
->qp
+ (unsigned)get_se_golomb(&h
->gb
)) & 63;
631 for (block
= 0; block
< 4; block
++)
632 if (h
->cbp
& (1 << block
))
633 decode_residual_block(h
, &h
->gb
, inter_dec
, 0, h
->qp
,
634 h
->cy
+ h
->luma_scan
[block
], h
->l_stride
);
635 decode_residual_chroma(h
);
640 /*****************************************************************************
644 ****************************************************************************/
646 static inline void set_mv_intra(AVSContext
*h
)
648 h
->mv
[MV_FWD_X0
] = ff_cavs_intra_mv
;
649 set_mvs(&h
->mv
[MV_FWD_X0
], BLK_16X16
);
650 h
->mv
[MV_BWD_X0
] = ff_cavs_intra_mv
;
651 set_mvs(&h
->mv
[MV_BWD_X0
], BLK_16X16
);
652 if (h
->cur
.f
->pict_type
!= AV_PICTURE_TYPE_B
)
653 h
->col_type_base
[h
->mbidx
] = I_8X8
;
656 static int decode_mb_i(AVSContext
*h
, int cbp_code
)
658 GetBitContext
*gb
= &h
->gb
;
659 unsigned pred_mode_uv
;
662 uint8_t *left
= NULL
;
668 /* get intra prediction modes from stream */
669 for (block
= 0; block
< 4; block
++) {
670 int nA
, nB
, predpred
;
671 int pos
= scan3x3
[block
];
673 nA
= h
->pred_mode_Y
[pos
- 1];
674 nB
= h
->pred_mode_Y
[pos
- 3];
675 predpred
= FFMIN(nA
, nB
);
676 if (predpred
== NOT_AVAIL
) // if either is not available
677 predpred
= INTRA_L_LP
;
678 if (!get_bits1(gb
)) {
679 int rem_mode
= get_bits(gb
, 2);
680 predpred
= rem_mode
+ (rem_mode
>= predpred
);
682 h
->pred_mode_Y
[pos
] = predpred
;
684 pred_mode_uv
= get_ue_golomb_31(gb
);
685 if (pred_mode_uv
> 6) {
686 av_log(h
->avctx
, AV_LOG_ERROR
, "illegal intra chroma pred mode\n");
687 return AVERROR_INVALIDDATA
;
689 ff_cavs_modify_mb_i(h
, &pred_mode_uv
);
691 /* get coded block pattern */
692 if (h
->cur
.f
->pict_type
== AV_PICTURE_TYPE_I
)
693 cbp_code
= get_ue_golomb(gb
);
694 if (cbp_code
> 63U) {
695 av_log(h
->avctx
, AV_LOG_ERROR
, "illegal intra cbp\n");
696 return AVERROR_INVALIDDATA
;
698 h
->cbp
= cbp_tab
[cbp_code
][0];
699 if (h
->cbp
&& !h
->qp_fixed
)
700 h
->qp
= (h
->qp
+ (unsigned)get_se_golomb(gb
)) & 63; //qp_delta
702 /* luma intra prediction interleaved with residual decode/transform/add */
703 for (block
= 0; block
< 4; block
++) {
704 d
= h
->cy
+ h
->luma_scan
[block
];
705 ff_cavs_load_intra_pred_luma(h
, top
, &left
, block
);
706 h
->intra_pred_l
[h
->pred_mode_Y
[scan3x3
[block
]]]
707 (d
, top
, left
, h
->l_stride
);
708 if (h
->cbp
& (1<<block
)) {
709 ret
= decode_residual_block(h
, gb
, intra_dec
, 1, h
->qp
, d
, h
->l_stride
);
715 /* chroma intra prediction */
716 ff_cavs_load_intra_pred_chroma(h
);
717 h
->intra_pred_c
[pred_mode_uv
](h
->cu
, &h
->top_border_u
[h
->mbx
* 10],
718 h
->left_border_u
, h
->c_stride
);
719 h
->intra_pred_c
[pred_mode_uv
](h
->cv
, &h
->top_border_v
[h
->mbx
* 10],
720 h
->left_border_v
, h
->c_stride
);
722 ret
= decode_residual_chroma(h
);
725 ff_cavs_filter(h
, I_8X8
);
730 static inline void set_intra_mode_default(AVSContext
*h
)
732 if (h
->stream_revision
> 0) {
733 h
->pred_mode_Y
[3] = h
->pred_mode_Y
[6] = NOT_AVAIL
;
734 h
->top_pred_Y
[h
->mbx
* 2 + 0] = h
->top_pred_Y
[h
->mbx
* 2 + 1] = NOT_AVAIL
;
736 h
->pred_mode_Y
[3] = h
->pred_mode_Y
[6] = INTRA_L_LP
;
737 h
->top_pred_Y
[h
->mbx
* 2 + 0] = h
->top_pred_Y
[h
->mbx
* 2 + 1] = INTRA_L_LP
;
741 static void decode_mb_p(AVSContext
*h
, enum cavs_mb mb_type
)
743 GetBitContext
*gb
= &h
->gb
;
749 ff_cavs_mv(h
, MV_FWD_X0
, MV_FWD_C2
, MV_PRED_PSKIP
, BLK_16X16
, 0);
752 ref
[0] = h
->ref_flag
? 0 : get_bits1(gb
);
753 ff_cavs_mv(h
, MV_FWD_X0
, MV_FWD_C2
, MV_PRED_MEDIAN
, BLK_16X16
, ref
[0]);
756 ref
[0] = h
->ref_flag
? 0 : get_bits1(gb
);
757 ref
[2] = h
->ref_flag
? 0 : get_bits1(gb
);
758 ff_cavs_mv(h
, MV_FWD_X0
, MV_FWD_C2
, MV_PRED_TOP
, BLK_16X8
, ref
[0]);
759 ff_cavs_mv(h
, MV_FWD_X2
, MV_FWD_A1
, MV_PRED_LEFT
, BLK_16X8
, ref
[2]);
762 ref
[0] = h
->ref_flag
? 0 : get_bits1(gb
);
763 ref
[1] = h
->ref_flag
? 0 : get_bits1(gb
);
764 ff_cavs_mv(h
, MV_FWD_X0
, MV_FWD_B3
, MV_PRED_LEFT
, BLK_8X16
, ref
[0]);
765 ff_cavs_mv(h
, MV_FWD_X1
, MV_FWD_C2
, MV_PRED_TOPRIGHT
, BLK_8X16
, ref
[1]);
768 ref
[0] = h
->ref_flag
? 0 : get_bits1(gb
);
769 ref
[1] = h
->ref_flag
? 0 : get_bits1(gb
);
770 ref
[2] = h
->ref_flag
? 0 : get_bits1(gb
);
771 ref
[3] = h
->ref_flag
? 0 : get_bits1(gb
);
772 ff_cavs_mv(h
, MV_FWD_X0
, MV_FWD_B3
, MV_PRED_MEDIAN
, BLK_8X8
, ref
[0]);
773 ff_cavs_mv(h
, MV_FWD_X1
, MV_FWD_C2
, MV_PRED_MEDIAN
, BLK_8X8
, ref
[1]);
774 ff_cavs_mv(h
, MV_FWD_X2
, MV_FWD_X1
, MV_PRED_MEDIAN
, BLK_8X8
, ref
[2]);
775 ff_cavs_mv(h
, MV_FWD_X3
, MV_FWD_X0
, MV_PRED_MEDIAN
, BLK_8X8
, ref
[3]);
777 ff_cavs_inter(h
, mb_type
);
778 set_intra_mode_default(h
);
780 if (mb_type
!= P_SKIP
)
781 decode_residual_inter(h
);
782 ff_cavs_filter(h
, mb_type
);
783 h
->col_type_base
[h
->mbidx
] = mb_type
;
786 static int decode_mb_b(AVSContext
*h
, enum cavs_mb mb_type
)
789 enum cavs_sub_mb sub_type
[4];
795 h
->mv
[MV_FWD_X0
] = ff_cavs_dir_mv
;
796 set_mvs(&h
->mv
[MV_FWD_X0
], BLK_16X16
);
797 h
->mv
[MV_BWD_X0
] = ff_cavs_dir_mv
;
798 set_mvs(&h
->mv
[MV_BWD_X0
], BLK_16X16
);
802 if (!h
->col_type_base
[h
->mbidx
]) {
803 /* intra MB at co-location, do in-plane prediction */
804 ff_cavs_mv(h
, MV_FWD_X0
, MV_FWD_C2
, MV_PRED_BSKIP
, BLK_16X16
, 1);
805 ff_cavs_mv(h
, MV_BWD_X0
, MV_BWD_C2
, MV_PRED_BSKIP
, BLK_16X16
, 0);
807 /* direct prediction from co-located P MB, block-wise */
808 for (block
= 0; block
< 4; block
++)
809 mv_pred_direct(h
, &h
->mv
[mv_scan
[block
]],
810 &h
->col_mv
[h
->mbidx
* 4 + block
]);
813 ff_cavs_mv(h
, MV_FWD_X0
, MV_FWD_C2
, MV_PRED_MEDIAN
, BLK_16X16
, 1);
816 ff_cavs_mv(h
, MV_FWD_X0
, MV_FWD_C2
, MV_PRED_MEDIAN
, BLK_16X16
, 1);
817 mv_pred_sym(h
, &h
->mv
[MV_FWD_X0
], BLK_16X16
);
820 ff_cavs_mv(h
, MV_BWD_X0
, MV_BWD_C2
, MV_PRED_MEDIAN
, BLK_16X16
, 0);
823 #define TMP_UNUSED_INX 7
825 for (block
= 0; block
< 4; block
++)
826 sub_type
[block
] = get_bits(&h
->gb
, 2);
827 for (block
= 0; block
< 4; block
++) {
828 switch (sub_type
[block
]) {
830 if (!h
->col_type_base
[h
->mbidx
]) {
831 /* intra MB at co-location, do in-plane prediction */
833 // if col-MB is a Intra MB, current Block size is 16x16.
834 // AVS standard section 9.9.1
836 h
->mv
[TMP_UNUSED_INX
] = h
->mv
[MV_FWD_X0
];
837 h
->mv
[TMP_UNUSED_INX
+ MV_BWD_OFFS
] = h
->mv
[MV_FWD_X0
+ MV_BWD_OFFS
];
839 ff_cavs_mv(h
, MV_FWD_X0
, MV_FWD_C2
,
840 MV_PRED_BSKIP
, BLK_8X8
, 1);
841 ff_cavs_mv(h
, MV_FWD_X0
+MV_BWD_OFFS
,
842 MV_FWD_C2
+MV_BWD_OFFS
,
843 MV_PRED_BSKIP
, BLK_8X8
, 0);
845 flags
= mv_scan
[block
];
846 h
->mv
[flags
] = h
->mv
[MV_FWD_X0
];
847 h
->mv
[flags
+ MV_BWD_OFFS
] = h
->mv
[MV_FWD_X0
+ MV_BWD_OFFS
];
848 h
->mv
[MV_FWD_X0
] = h
->mv
[TMP_UNUSED_INX
];
849 h
->mv
[MV_FWD_X0
+ MV_BWD_OFFS
] = h
->mv
[TMP_UNUSED_INX
+ MV_BWD_OFFS
];
853 h
->mv
[mv_scan
[block
] ] = h
->mv
[flags
];
854 h
->mv
[mv_scan
[block
] + MV_BWD_OFFS
] = h
->mv
[flags
+ MV_BWD_OFFS
];
857 mv_pred_direct(h
, &h
->mv
[mv_scan
[block
]],
858 &h
->col_mv
[h
->mbidx
* 4 + block
]);
861 ff_cavs_mv(h
, mv_scan
[block
], mv_scan
[block
] - 3,
862 MV_PRED_MEDIAN
, BLK_8X8
, 1);
865 ff_cavs_mv(h
, mv_scan
[block
], mv_scan
[block
] - 3,
866 MV_PRED_MEDIAN
, BLK_8X8
, 1);
867 mv_pred_sym(h
, &h
->mv
[mv_scan
[block
]], BLK_8X8
);
871 #undef TMP_UNUSED_INX
872 for (block
= 0; block
< 4; block
++) {
873 if (sub_type
[block
] == B_SUB_BWD
)
874 ff_cavs_mv(h
, mv_scan
[block
] + MV_BWD_OFFS
,
875 mv_scan
[block
] + MV_BWD_OFFS
- 3,
876 MV_PRED_MEDIAN
, BLK_8X8
, 0);
880 if (mb_type
<= B_SYM_16X16
) {
881 av_log(h
->avctx
, AV_LOG_ERROR
, "Invalid mb_type %d in B frame\n", mb_type
);
882 return AVERROR_INVALIDDATA
;
884 av_assert2(mb_type
< B_8X8
);
885 flags
= ff_cavs_partition_flags
[mb_type
];
886 if (mb_type
& 1) { /* 16x8 macroblock types */
888 ff_cavs_mv(h
, MV_FWD_X0
, MV_FWD_C2
, MV_PRED_TOP
, BLK_16X8
, 1);
890 mv_pred_sym(h
, &h
->mv
[MV_FWD_X0
], BLK_16X8
);
892 ff_cavs_mv(h
, MV_FWD_X2
, MV_FWD_A1
, MV_PRED_LEFT
, BLK_16X8
, 1);
894 mv_pred_sym(h
, &h
->mv
[MV_FWD_X2
], BLK_16X8
);
896 ff_cavs_mv(h
, MV_BWD_X0
, MV_BWD_C2
, MV_PRED_TOP
, BLK_16X8
, 0);
898 ff_cavs_mv(h
, MV_BWD_X2
, MV_BWD_A1
, MV_PRED_LEFT
, BLK_16X8
, 0);
899 } else { /* 8x16 macroblock types */
901 ff_cavs_mv(h
, MV_FWD_X0
, MV_FWD_B3
, MV_PRED_LEFT
, BLK_8X16
, 1);
903 mv_pred_sym(h
, &h
->mv
[MV_FWD_X0
], BLK_8X16
);
905 ff_cavs_mv(h
, MV_FWD_X1
, MV_FWD_C2
, MV_PRED_TOPRIGHT
, BLK_8X16
, 1);
907 mv_pred_sym(h
, &h
->mv
[MV_FWD_X1
], BLK_8X16
);
909 ff_cavs_mv(h
, MV_BWD_X0
, MV_BWD_B3
, MV_PRED_LEFT
, BLK_8X16
, 0);
911 ff_cavs_mv(h
, MV_BWD_X1
, MV_BWD_C2
, MV_PRED_TOPRIGHT
, BLK_8X16
, 0);
914 ff_cavs_inter(h
, mb_type
);
915 set_intra_mode_default(h
);
916 if (mb_type
!= B_SKIP
)
917 decode_residual_inter(h
);
918 ff_cavs_filter(h
, mb_type
);
923 /*****************************************************************************
927 ****************************************************************************/
929 static inline int decode_slice_header(AVSContext
*h
, GetBitContext
*gb
)
932 av_log(h
->avctx
, AV_LOG_ERROR
, "unexpected start code 0x%02x\n", h
->stc
);
934 if (h
->stc
>= h
->mb_height
) {
935 av_log(h
->avctx
, AV_LOG_ERROR
, "stc 0x%02x is too large\n", h
->stc
);
936 return AVERROR_INVALIDDATA
;
940 h
->mbidx
= h
->mby
* h
->mb_width
;
942 /* mark top macroblocks as unavailable */
943 h
->flags
&= ~(B_AVAIL
| C_AVAIL
);
944 if (!h
->pic_qp_fixed
) {
945 h
->qp_fixed
= get_bits1(gb
);
946 h
->qp
= get_bits(gb
, 6);
948 /* inter frame or second slice can have weighting params */
949 if ((h
->cur
.f
->pict_type
!= AV_PICTURE_TYPE_I
) ||
950 (!h
->pic_structure
&& h
->mby
>= h
->mb_width
/ 2))
951 if (get_bits1(gb
)) { //slice_weighting_flag
952 av_log(h
->avctx
, AV_LOG_ERROR
,
953 "weighted prediction not yet supported\n");
958 static inline int check_for_slice(AVSContext
*h
)
960 GetBitContext
*gb
= &h
->gb
;
965 align
= (-get_bits_count(gb
)) & 7;
966 /* check for stuffing byte */
967 if (!align
&& (show_bits(gb
, 8) == 0x80))
969 if ((show_bits_long(gb
, 24 + align
) & 0xFFFFFF) == 0x000001) {
970 skip_bits_long(gb
, 24 + align
);
971 h
->stc
= get_bits(gb
, 8);
972 if (h
->stc
>= h
->mb_height
)
974 decode_slice_header(h
, gb
);
980 /*****************************************************************************
984 ****************************************************************************/
986 static int decode_pic(AVSContext
*h
)
990 enum cavs_mb mb_type
;
993 av_log(h
->avctx
, AV_LOG_ERROR
, "No sequence header decoded yet\n");
994 return AVERROR_INVALIDDATA
;
997 av_frame_unref(h
->cur
.f
);
999 skip_bits(&h
->gb
, 16);//bbv_dwlay
1000 if (h
->stc
== PIC_PB_START_CODE
) {
1001 h
->cur
.f
->pict_type
= get_bits(&h
->gb
, 2) + AV_PICTURE_TYPE_I
;
1002 if (h
->cur
.f
->pict_type
> AV_PICTURE_TYPE_B
) {
1003 av_log(h
->avctx
, AV_LOG_ERROR
, "illegal picture type\n");
1004 return AVERROR_INVALIDDATA
;
1006 /* make sure we have the reference frames we need */
1007 if (!h
->DPB
[0].f
->data
[0] ||
1008 (!h
->DPB
[1].f
->data
[0] && h
->cur
.f
->pict_type
== AV_PICTURE_TYPE_B
))
1009 return AVERROR_INVALIDDATA
;
1011 h
->cur
.f
->pict_type
= AV_PICTURE_TYPE_I
;
1012 if (get_bits1(&h
->gb
))
1013 skip_bits(&h
->gb
, 24);//time_code
1014 /* old sample clips were all progressive and no low_delay,
1015 bump stream revision if detected otherwise */
1016 if (h
->low_delay
|| !(show_bits(&h
->gb
, 9) & 1))
1017 h
->stream_revision
= 1;
1018 /* similarly test top_field_first and repeat_first_field */
1019 else if (show_bits(&h
->gb
, 11) & 3)
1020 h
->stream_revision
= 1;
1021 if (h
->stream_revision
> 0)
1022 skip_bits(&h
->gb
, 1); //marker_bit
1025 if (get_bits_left(&h
->gb
) < 23)
1026 return AVERROR_INVALIDDATA
;
1028 ret
= ff_get_buffer(h
->avctx
, h
->cur
.f
, h
->cur
.f
->pict_type
== AV_PICTURE_TYPE_B
?
1029 0 : AV_GET_BUFFER_FLAG_REF
);
1033 if (!h
->edge_emu_buffer
) {
1034 int alloc_size
= FFALIGN(FFABS(h
->cur
.f
->linesize
[0]) + 32, 32);
1035 h
->edge_emu_buffer
= av_mallocz(alloc_size
* 2 * 24);
1036 if (!h
->edge_emu_buffer
)
1037 return AVERROR(ENOMEM
);
1040 if ((ret
= ff_cavs_init_pic(h
)) < 0)
1042 h
->cur
.poc
= get_bits(&h
->gb
, 8) * 2;
1044 /* get temporal distances and MV scaling factors */
1045 if (h
->cur
.f
->pict_type
!= AV_PICTURE_TYPE_B
) {
1046 h
->dist
[0] = (h
->cur
.poc
- h
->DPB
[0].poc
) & 511;
1048 h
->dist
[0] = (h
->DPB
[0].poc
- h
->cur
.poc
) & 511;
1050 h
->dist
[1] = (h
->cur
.poc
- h
->DPB
[1].poc
) & 511;
1051 h
->scale_den
[0] = h
->dist
[0] ? 512/h
->dist
[0] : 0;
1052 h
->scale_den
[1] = h
->dist
[1] ? 512/h
->dist
[1] : 0;
1053 if (h
->cur
.f
->pict_type
== AV_PICTURE_TYPE_B
) {
1054 h
->sym_factor
= h
->dist
[0] * h
->scale_den
[1];
1055 if (FFABS(h
->sym_factor
) > 32768) {
1056 av_log(h
->avctx
, AV_LOG_ERROR
, "sym_factor %d too large\n", h
->sym_factor
);
1057 return AVERROR_INVALIDDATA
;
1060 h
->direct_den
[0] = h
->dist
[0] ? 16384 / h
->dist
[0] : 0;
1061 h
->direct_den
[1] = h
->dist
[1] ? 16384 / h
->dist
[1] : 0;
1065 get_ue_golomb(&h
->gb
); //bbv_check_times
1066 h
->progressive
= get_bits1(&h
->gb
);
1067 h
->pic_structure
= 1;
1068 if (!h
->progressive
)
1069 h
->pic_structure
= get_bits1(&h
->gb
);
1070 if (!h
->pic_structure
&& h
->stc
== PIC_PB_START_CODE
)
1071 skip_bits1(&h
->gb
); //advanced_pred_mode_disable
1072 skip_bits1(&h
->gb
); //top_field_first
1073 skip_bits1(&h
->gb
); //repeat_first_field
1075 h
->qp_fixed
= get_bits1(&h
->gb
);
1076 h
->qp
= get_bits(&h
->gb
, 6);
1077 if (h
->cur
.f
->pict_type
== AV_PICTURE_TYPE_I
) {
1078 if (!h
->progressive
&& !h
->pic_structure
)
1079 skip_bits1(&h
->gb
);//what is this?
1080 skip_bits(&h
->gb
, 4); //reserved bits
1082 if (!(h
->cur
.f
->pict_type
== AV_PICTURE_TYPE_B
&& h
->pic_structure
== 1))
1083 h
->ref_flag
= get_bits1(&h
->gb
);
1084 skip_bits(&h
->gb
, 4); //reserved bits
1085 h
->skip_mode_flag
= get_bits1(&h
->gb
);
1087 h
->loop_filter_disable
= get_bits1(&h
->gb
);
1088 if (!h
->loop_filter_disable
&& get_bits1(&h
->gb
)) {
1089 h
->alpha_offset
= get_se_golomb(&h
->gb
);
1090 h
->beta_offset
= get_se_golomb(&h
->gb
);
1091 if ( h
->alpha_offset
< -64 || h
->alpha_offset
> 64
1092 || h
-> beta_offset
< -64 || h
-> beta_offset
> 64) {
1093 h
->alpha_offset
= h
->beta_offset
= 0;
1094 return AVERROR_INVALIDDATA
;
1097 h
->alpha_offset
= h
->beta_offset
= 0;
1101 if (h
->cur
.f
->pict_type
== AV_PICTURE_TYPE_I
) {
1104 ret
= decode_mb_i(h
, 0);
1107 } while (ff_cavs_next_mb(h
));
1108 } else if (h
->cur
.f
->pict_type
== AV_PICTURE_TYPE_P
) {
1110 if (check_for_slice(h
))
1112 if (h
->skip_mode_flag
&& (skip_count
< 0)) {
1113 if (get_bits_left(&h
->gb
) < 1) {
1114 ret
= AVERROR_INVALIDDATA
;
1117 skip_count
= get_ue_golomb(&h
->gb
);
1119 if (h
->skip_mode_flag
&& skip_count
--) {
1120 decode_mb_p(h
, P_SKIP
);
1122 if (get_bits_left(&h
->gb
) < 1) {
1123 ret
= AVERROR_INVALIDDATA
;
1126 mb_type
= get_ue_golomb(&h
->gb
) + P_SKIP
+ h
->skip_mode_flag
;
1127 if (mb_type
> P_8X8
)
1128 ret
= decode_mb_i(h
, mb_type
- P_8X8
- 1);
1130 decode_mb_p(h
, mb_type
);
1134 } while (ff_cavs_next_mb(h
));
1135 } else { /* AV_PICTURE_TYPE_B */
1137 if (check_for_slice(h
))
1139 if (h
->skip_mode_flag
&& (skip_count
< 0)) {
1140 if (get_bits_left(&h
->gb
) < 1) {
1141 ret
= AVERROR_INVALIDDATA
;
1144 skip_count
= get_ue_golomb(&h
->gb
);
1146 if (h
->skip_mode_flag
&& skip_count
--) {
1147 ret
= decode_mb_b(h
, B_SKIP
);
1149 if (get_bits_left(&h
->gb
) < 1) {
1150 ret
= AVERROR_INVALIDDATA
;
1153 mb_type
= get_ue_golomb(&h
->gb
) + B_SKIP
+ h
->skip_mode_flag
;
1154 if (mb_type
> B_8X8
)
1155 ret
= decode_mb_i(h
, mb_type
- B_8X8
- 1);
1157 ret
= decode_mb_b(h
, mb_type
);
1161 } while (ff_cavs_next_mb(h
));
1164 if (ret
>= 0 && h
->cur
.f
->pict_type
!= AV_PICTURE_TYPE_B
) {
1165 av_frame_unref(h
->DPB
[1].f
);
1166 FFSWAP(AVSFrame
, h
->cur
, h
->DPB
[1]);
1167 FFSWAP(AVSFrame
, h
->DPB
[0], h
->DPB
[1]);
1172 /*****************************************************************************
1174 * headers and interface
1176 ****************************************************************************/
1178 static int decode_seq_header(AVSContext
*h
)
1180 int frame_rate_code
;
1184 h
->profile
= get_bits(&h
->gb
, 8);
1185 if (h
->profile
!= 0x20) {
1186 avpriv_report_missing_feature(h
->avctx
,
1187 "only supprt JiZhun profile");
1188 return AVERROR_PATCHWELCOME
;
1190 h
->level
= get_bits(&h
->gb
, 8);
1191 skip_bits1(&h
->gb
); //progressive sequence
1193 width
= get_bits(&h
->gb
, 14);
1194 height
= get_bits(&h
->gb
, 14);
1195 if ((h
->width
|| h
->height
) && (h
->width
!= width
|| h
->height
!= height
)) {
1196 avpriv_report_missing_feature(h
->avctx
,
1197 "Width/height changing in CAVS");
1198 return AVERROR_PATCHWELCOME
;
1200 if (width
<= 0 || height
<= 0) {
1201 av_log(h
->avctx
, AV_LOG_ERROR
, "Dimensions invalid\n");
1202 return AVERROR_INVALIDDATA
;
1204 skip_bits(&h
->gb
, 2); //chroma format
1205 skip_bits(&h
->gb
, 3); //sample_precision
1206 h
->aspect_ratio
= get_bits(&h
->gb
, 4);
1207 frame_rate_code
= get_bits(&h
->gb
, 4);
1208 if (frame_rate_code
== 0 || frame_rate_code
> 13) {
1209 av_log(h
->avctx
, AV_LOG_WARNING
,
1210 "frame_rate_code %d is invalid\n", frame_rate_code
);
1211 frame_rate_code
= 1;
1214 skip_bits(&h
->gb
, 18); //bit_rate_lower
1215 skip_bits1(&h
->gb
); //marker_bit
1216 skip_bits(&h
->gb
, 12); //bit_rate_upper
1217 h
->low_delay
= get_bits1(&h
->gb
);
1219 ret
= ff_set_dimensions(h
->avctx
, width
, height
);
1225 h
->mb_width
= (h
->width
+ 15) >> 4;
1226 h
->mb_height
= (h
->height
+ 15) >> 4;
1227 h
->avctx
->framerate
= ff_mpeg12_frame_rate_tab
[frame_rate_code
];
1229 return ff_cavs_init_top_lines(h
);
1233 static void cavs_flush(AVCodecContext
* avctx
)
1235 AVSContext
*h
= avctx
->priv_data
;
1236 h
->got_keyframe
= 0;
1239 static int cavs_decode_frame(AVCodecContext
*avctx
, AVFrame
*rframe
,
1240 int *got_frame
, AVPacket
*avpkt
)
1242 AVSContext
*h
= avctx
->priv_data
;
1243 const uint8_t *buf
= avpkt
->data
;
1244 int buf_size
= avpkt
->size
;
1246 int input_size
, ret
;
1247 const uint8_t *buf_end
;
1248 const uint8_t *buf_ptr
;
1249 int frame_start
= 0;
1251 if (buf_size
== 0) {
1252 if (!h
->low_delay
&& h
->DPB
[0].f
->data
[0]) {
1254 av_frame_move_ref(rframe
, h
->DPB
[0].f
);
1262 buf_end
= buf
+ buf_size
;
1264 buf_ptr
= avpriv_find_start_code(buf_ptr
, buf_end
, &stc
);
1265 if ((stc
& 0xFFFFFE00) || buf_ptr
== buf_end
) {
1267 av_log(h
->avctx
, AV_LOG_WARNING
, "no frame decoded\n");
1268 return FFMAX(0, buf_ptr
- buf
);
1270 input_size
= (buf_end
- buf_ptr
) * 8;
1272 case CAVS_START_CODE
:
1273 init_get_bits(&h
->gb
, buf_ptr
, input_size
);
1274 decode_seq_header(h
);
1276 case PIC_I_START_CODE
:
1277 if (!h
->got_keyframe
) {
1278 av_frame_unref(h
->DPB
[0].f
);
1279 av_frame_unref(h
->DPB
[1].f
);
1280 h
->got_keyframe
= 1;
1282 case PIC_PB_START_CODE
:
1283 if (frame_start
> 1)
1284 return AVERROR_INVALIDDATA
;
1287 av_frame_unref(rframe
);
1289 if (!h
->got_keyframe
)
1291 init_get_bits(&h
->gb
, buf_ptr
, input_size
);
1296 if (h
->cur
.f
->pict_type
!= AV_PICTURE_TYPE_B
) {
1297 if (h
->DPB
[!h
->low_delay
].f
->data
[0]) {
1298 if ((ret
= av_frame_ref(rframe
, h
->DPB
[!h
->low_delay
].f
)) < 0)
1304 av_frame_move_ref(rframe
, h
->cur
.f
);
1307 case EXT_START_CODE
:
1308 //mpeg_decode_extension(avctx, buf_ptr, input_size);
1310 case USER_START_CODE
:
1311 //mpeg_decode_user_data(avctx, buf_ptr, input_size);
1314 if (stc
<= SLICE_MAX_START_CODE
) {
1315 init_get_bits(&h
->gb
, buf_ptr
, input_size
);
1316 decode_slice_header(h
, &h
->gb
);
1323 const FFCodec ff_cavs_decoder
= {
1325 CODEC_LONG_NAME("Chinese AVS (Audio Video Standard) (AVS1-P2, JiZhun profile)"),
1326 .p
.type
= AVMEDIA_TYPE_VIDEO
,
1327 .p
.id
= AV_CODEC_ID_CAVS
,
1328 .priv_data_size
= sizeof(AVSContext
),
1329 .init
= ff_cavs_init
,
1330 .close
= ff_cavs_end
,
1331 FF_CODEC_DECODE_CB(cavs_decode_frame
),
1332 .p
.capabilities
= AV_CODEC_CAP_DR1
| AV_CODEC_CAP_DELAY
,
1333 .flush
= cavs_flush
,
1334 .caps_internal
= FF_CODEC_CAP_INIT_CLEANUP
,