yading@10
|
1 /*
|
yading@10
|
2 * MSMPEG4 backend for encoder and decoder
|
yading@10
|
3 * Copyright (c) 2001 Fabrice Bellard
|
yading@10
|
4 * Copyright (c) 2002-2013 Michael Niedermayer <michaelni@gmx.at>
|
yading@10
|
5 *
|
yading@10
|
6 * msmpeg4v1 & v2 stuff by Michael Niedermayer <michaelni@gmx.at>
|
yading@10
|
7 *
|
yading@10
|
8 * This file is part of FFmpeg.
|
yading@10
|
9 *
|
yading@10
|
10 * FFmpeg is free software; you can redistribute it and/or
|
yading@10
|
11 * modify it under the terms of the GNU Lesser General Public
|
yading@10
|
12 * License as published by the Free Software Foundation; either
|
yading@10
|
13 * version 2.1 of the License, or (at your option) any later version.
|
yading@10
|
14 *
|
yading@10
|
15 * FFmpeg is distributed in the hope that it will be useful,
|
yading@10
|
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@10
|
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@10
|
18 * Lesser General Public License for more details.
|
yading@10
|
19 *
|
yading@10
|
20 * You should have received a copy of the GNU Lesser General Public
|
yading@10
|
21 * License along with FFmpeg; if not, write to the Free Software
|
yading@10
|
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@10
|
23 */
|
yading@10
|
24
|
yading@10
|
25 #include "avcodec.h"
|
yading@10
|
26 #include "dsputil.h"
|
yading@10
|
27 #include "mpegvideo.h"
|
yading@10
|
28 #include "msmpeg4.h"
|
yading@10
|
29 #include "libavutil/imgutils.h"
|
yading@10
|
30 #include "libavutil/x86/asm.h"
|
yading@10
|
31 #include "h263.h"
|
yading@10
|
32 #include "mpeg4video.h"
|
yading@10
|
33 #include "msmpeg4data.h"
|
yading@10
|
34 #include "vc1data.h"
|
yading@10
|
35
|
yading@10
|
36 #define DC_VLC_BITS 9
|
yading@10
|
37 #define V2_INTRA_CBPC_VLC_BITS 3
|
yading@10
|
38 #define V2_MB_TYPE_VLC_BITS 7
|
yading@10
|
39 #define MV_VLC_BITS 9
|
yading@10
|
40 #define V2_MV_VLC_BITS 9
|
yading@10
|
41 #define TEX_VLC_BITS 9
|
yading@10
|
42
|
yading@10
|
43 #define DEFAULT_INTER_INDEX 3
|
yading@10
|
44
|
yading@10
|
45 static inline int msmpeg4v1_pred_dc(MpegEncContext * s, int n,
|
yading@10
|
46 int32_t **dc_val_ptr)
|
yading@10
|
47 {
|
yading@10
|
48 int i;
|
yading@10
|
49
|
yading@10
|
50 if (n < 4) {
|
yading@10
|
51 i= 0;
|
yading@10
|
52 } else {
|
yading@10
|
53 i= n-3;
|
yading@10
|
54 }
|
yading@10
|
55
|
yading@10
|
56 *dc_val_ptr= &s->last_dc[i];
|
yading@10
|
57 return s->last_dc[i];
|
yading@10
|
58 }
|
yading@10
|
59
|
yading@10
|
60 /****************************************/
|
yading@10
|
61 /* decoding stuff */
|
yading@10
|
62
|
yading@10
|
63 VLC ff_mb_non_intra_vlc[4];
|
yading@10
|
64 static VLC v2_dc_lum_vlc;
|
yading@10
|
65 static VLC v2_dc_chroma_vlc;
|
yading@10
|
66 static VLC v2_intra_cbpc_vlc;
|
yading@10
|
67 static VLC v2_mb_type_vlc;
|
yading@10
|
68 static VLC v2_mv_vlc;
|
yading@10
|
69 VLC ff_inter_intra_vlc;
|
yading@10
|
70
|
yading@10
|
71 /* This is identical to h263 except that its range is multiplied by 2. */
|
yading@10
|
72 static int msmpeg4v2_decode_motion(MpegEncContext * s, int pred, int f_code)
|
yading@10
|
73 {
|
yading@10
|
74 int code, val, sign, shift;
|
yading@10
|
75
|
yading@10
|
76 code = get_vlc2(&s->gb, v2_mv_vlc.table, V2_MV_VLC_BITS, 2);
|
yading@10
|
77 av_dlog(s, "MV code %d at %d %d pred: %d\n", code, s->mb_x,s->mb_y, pred);
|
yading@10
|
78 if (code < 0)
|
yading@10
|
79 return 0xffff;
|
yading@10
|
80
|
yading@10
|
81 if (code == 0)
|
yading@10
|
82 return pred;
|
yading@10
|
83 sign = get_bits1(&s->gb);
|
yading@10
|
84 shift = f_code - 1;
|
yading@10
|
85 val = code;
|
yading@10
|
86 if (shift) {
|
yading@10
|
87 val = (val - 1) << shift;
|
yading@10
|
88 val |= get_bits(&s->gb, shift);
|
yading@10
|
89 val++;
|
yading@10
|
90 }
|
yading@10
|
91 if (sign)
|
yading@10
|
92 val = -val;
|
yading@10
|
93
|
yading@10
|
94 val += pred;
|
yading@10
|
95 if (val <= -64)
|
yading@10
|
96 val += 64;
|
yading@10
|
97 else if (val >= 64)
|
yading@10
|
98 val -= 64;
|
yading@10
|
99
|
yading@10
|
100 return val;
|
yading@10
|
101 }
|
yading@10
|
102
|
yading@10
|
103 static int msmpeg4v12_decode_mb(MpegEncContext *s, int16_t block[6][64])
|
yading@10
|
104 {
|
yading@10
|
105 int cbp, code, i;
|
yading@10
|
106 uint32_t * const mb_type_ptr = &s->current_picture.mb_type[s->mb_x + s->mb_y*s->mb_stride];
|
yading@10
|
107
|
yading@10
|
108 if (s->pict_type == AV_PICTURE_TYPE_P) {
|
yading@10
|
109 if (s->use_skip_mb_code) {
|
yading@10
|
110 if (get_bits1(&s->gb)) {
|
yading@10
|
111 /* skip mb */
|
yading@10
|
112 s->mb_intra = 0;
|
yading@10
|
113 for(i=0;i<6;i++)
|
yading@10
|
114 s->block_last_index[i] = -1;
|
yading@10
|
115 s->mv_dir = MV_DIR_FORWARD;
|
yading@10
|
116 s->mv_type = MV_TYPE_16X16;
|
yading@10
|
117 s->mv[0][0][0] = 0;
|
yading@10
|
118 s->mv[0][0][1] = 0;
|
yading@10
|
119 s->mb_skipped = 1;
|
yading@10
|
120 *mb_type_ptr = MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16;
|
yading@10
|
121 return 0;
|
yading@10
|
122 }
|
yading@10
|
123 }
|
yading@10
|
124
|
yading@10
|
125 if(s->msmpeg4_version==2)
|
yading@10
|
126 code = get_vlc2(&s->gb, v2_mb_type_vlc.table, V2_MB_TYPE_VLC_BITS, 1);
|
yading@10
|
127 else
|
yading@10
|
128 code = get_vlc2(&s->gb, ff_h263_inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
|
yading@10
|
129 if(code<0 || code>7){
|
yading@10
|
130 av_log(s->avctx, AV_LOG_ERROR, "cbpc %d invalid at %d %d\n", code, s->mb_x, s->mb_y);
|
yading@10
|
131 return -1;
|
yading@10
|
132 }
|
yading@10
|
133
|
yading@10
|
134 s->mb_intra = code >>2;
|
yading@10
|
135
|
yading@10
|
136 cbp = code & 0x3;
|
yading@10
|
137 } else {
|
yading@10
|
138 s->mb_intra = 1;
|
yading@10
|
139 if(s->msmpeg4_version==2)
|
yading@10
|
140 cbp= get_vlc2(&s->gb, v2_intra_cbpc_vlc.table, V2_INTRA_CBPC_VLC_BITS, 1);
|
yading@10
|
141 else
|
yading@10
|
142 cbp= get_vlc2(&s->gb, ff_h263_intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 1);
|
yading@10
|
143 if(cbp<0 || cbp>3){
|
yading@10
|
144 av_log(s->avctx, AV_LOG_ERROR, "cbpc %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
|
yading@10
|
145 return -1;
|
yading@10
|
146 }
|
yading@10
|
147 }
|
yading@10
|
148
|
yading@10
|
149 if (!s->mb_intra) {
|
yading@10
|
150 int mx, my, cbpy;
|
yading@10
|
151
|
yading@10
|
152 cbpy= get_vlc2(&s->gb, ff_h263_cbpy_vlc.table, CBPY_VLC_BITS, 1);
|
yading@10
|
153 if(cbpy<0){
|
yading@10
|
154 av_log(s->avctx, AV_LOG_ERROR, "cbpy %d invalid at %d %d\n", cbp, s->mb_x, s->mb_y);
|
yading@10
|
155 return -1;
|
yading@10
|
156 }
|
yading@10
|
157
|
yading@10
|
158 cbp|= cbpy<<2;
|
yading@10
|
159 if(s->msmpeg4_version==1 || (cbp&3) != 3) cbp^= 0x3C;
|
yading@10
|
160
|
yading@10
|
161 ff_h263_pred_motion(s, 0, 0, &mx, &my);
|
yading@10
|
162 mx= msmpeg4v2_decode_motion(s, mx, 1);
|
yading@10
|
163 my= msmpeg4v2_decode_motion(s, my, 1);
|
yading@10
|
164
|
yading@10
|
165 s->mv_dir = MV_DIR_FORWARD;
|
yading@10
|
166 s->mv_type = MV_TYPE_16X16;
|
yading@10
|
167 s->mv[0][0][0] = mx;
|
yading@10
|
168 s->mv[0][0][1] = my;
|
yading@10
|
169 *mb_type_ptr = MB_TYPE_L0 | MB_TYPE_16x16;
|
yading@10
|
170 } else {
|
yading@10
|
171 if(s->msmpeg4_version==2){
|
yading@10
|
172 s->ac_pred = get_bits1(&s->gb);
|
yading@10
|
173 cbp|= get_vlc2(&s->gb, ff_h263_cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors
|
yading@10
|
174 } else{
|
yading@10
|
175 s->ac_pred = 0;
|
yading@10
|
176 cbp|= get_vlc2(&s->gb, ff_h263_cbpy_vlc.table, CBPY_VLC_BITS, 1)<<2; //FIXME check errors
|
yading@10
|
177 if(s->pict_type==AV_PICTURE_TYPE_P) cbp^=0x3C;
|
yading@10
|
178 }
|
yading@10
|
179 *mb_type_ptr = MB_TYPE_INTRA;
|
yading@10
|
180 }
|
yading@10
|
181
|
yading@10
|
182 s->dsp.clear_blocks(s->block[0]);
|
yading@10
|
183 for (i = 0; i < 6; i++) {
|
yading@10
|
184 if (ff_msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
|
yading@10
|
185 {
|
yading@10
|
186 av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
|
yading@10
|
187 return -1;
|
yading@10
|
188 }
|
yading@10
|
189 }
|
yading@10
|
190 return 0;
|
yading@10
|
191 }
|
yading@10
|
192
|
yading@10
|
193 static int msmpeg4v34_decode_mb(MpegEncContext *s, int16_t block[6][64])
|
yading@10
|
194 {
|
yading@10
|
195 int cbp, code, i;
|
yading@10
|
196 uint8_t *coded_val;
|
yading@10
|
197 uint32_t * const mb_type_ptr = &s->current_picture.mb_type[s->mb_x + s->mb_y*s->mb_stride];
|
yading@10
|
198
|
yading@10
|
199 if (s->pict_type == AV_PICTURE_TYPE_P) {
|
yading@10
|
200 if (s->use_skip_mb_code) {
|
yading@10
|
201 if (get_bits1(&s->gb)) {
|
yading@10
|
202 /* skip mb */
|
yading@10
|
203 s->mb_intra = 0;
|
yading@10
|
204 for(i=0;i<6;i++)
|
yading@10
|
205 s->block_last_index[i] = -1;
|
yading@10
|
206 s->mv_dir = MV_DIR_FORWARD;
|
yading@10
|
207 s->mv_type = MV_TYPE_16X16;
|
yading@10
|
208 s->mv[0][0][0] = 0;
|
yading@10
|
209 s->mv[0][0][1] = 0;
|
yading@10
|
210 s->mb_skipped = 1;
|
yading@10
|
211 *mb_type_ptr = MB_TYPE_SKIP | MB_TYPE_L0 | MB_TYPE_16x16;
|
yading@10
|
212
|
yading@10
|
213 return 0;
|
yading@10
|
214 }
|
yading@10
|
215 }
|
yading@10
|
216
|
yading@10
|
217 code = get_vlc2(&s->gb, ff_mb_non_intra_vlc[DEFAULT_INTER_INDEX].table, MB_NON_INTRA_VLC_BITS, 3);
|
yading@10
|
218 if (code < 0)
|
yading@10
|
219 return -1;
|
yading@10
|
220 //s->mb_intra = (code & 0x40) ? 0 : 1;
|
yading@10
|
221 s->mb_intra = (~code & 0x40) >> 6;
|
yading@10
|
222
|
yading@10
|
223 cbp = code & 0x3f;
|
yading@10
|
224 } else {
|
yading@10
|
225 s->mb_intra = 1;
|
yading@10
|
226 code = get_vlc2(&s->gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
|
yading@10
|
227 if (code < 0)
|
yading@10
|
228 return -1;
|
yading@10
|
229 /* predict coded block pattern */
|
yading@10
|
230 cbp = 0;
|
yading@10
|
231 for(i=0;i<6;i++) {
|
yading@10
|
232 int val = ((code >> (5 - i)) & 1);
|
yading@10
|
233 if (i < 4) {
|
yading@10
|
234 int pred = ff_msmpeg4_coded_block_pred(s, i, &coded_val);
|
yading@10
|
235 val = val ^ pred;
|
yading@10
|
236 *coded_val = val;
|
yading@10
|
237 }
|
yading@10
|
238 cbp |= val << (5 - i);
|
yading@10
|
239 }
|
yading@10
|
240 }
|
yading@10
|
241
|
yading@10
|
242 if (!s->mb_intra) {
|
yading@10
|
243 int mx, my;
|
yading@10
|
244 if(s->per_mb_rl_table && cbp){
|
yading@10
|
245 s->rl_table_index = decode012(&s->gb);
|
yading@10
|
246 s->rl_chroma_table_index = s->rl_table_index;
|
yading@10
|
247 }
|
yading@10
|
248 ff_h263_pred_motion(s, 0, 0, &mx, &my);
|
yading@10
|
249 if (ff_msmpeg4_decode_motion(s, &mx, &my) < 0)
|
yading@10
|
250 return -1;
|
yading@10
|
251 s->mv_dir = MV_DIR_FORWARD;
|
yading@10
|
252 s->mv_type = MV_TYPE_16X16;
|
yading@10
|
253 s->mv[0][0][0] = mx;
|
yading@10
|
254 s->mv[0][0][1] = my;
|
yading@10
|
255 *mb_type_ptr = MB_TYPE_L0 | MB_TYPE_16x16;
|
yading@10
|
256 } else {
|
yading@10
|
257 av_dlog(s, "I at %d %d %d %06X\n", s->mb_x, s->mb_y,
|
yading@10
|
258 ((cbp & 3) ? 1 : 0) +((cbp & 0x3C)? 2 : 0),
|
yading@10
|
259 show_bits(&s->gb, 24));
|
yading@10
|
260 s->ac_pred = get_bits1(&s->gb);
|
yading@10
|
261 *mb_type_ptr = MB_TYPE_INTRA;
|
yading@10
|
262 if(s->inter_intra_pred){
|
yading@10
|
263 s->h263_aic_dir= get_vlc2(&s->gb, ff_inter_intra_vlc.table, INTER_INTRA_VLC_BITS, 1);
|
yading@10
|
264 av_dlog(s, "%d%d %d %d/",
|
yading@10
|
265 s->ac_pred, s->h263_aic_dir, s->mb_x, s->mb_y);
|
yading@10
|
266 }
|
yading@10
|
267 if(s->per_mb_rl_table && cbp){
|
yading@10
|
268 s->rl_table_index = decode012(&s->gb);
|
yading@10
|
269 s->rl_chroma_table_index = s->rl_table_index;
|
yading@10
|
270 }
|
yading@10
|
271 }
|
yading@10
|
272
|
yading@10
|
273 s->dsp.clear_blocks(s->block[0]);
|
yading@10
|
274 for (i = 0; i < 6; i++) {
|
yading@10
|
275 if (ff_msmpeg4_decode_block(s, block[i], i, (cbp >> (5 - i)) & 1, NULL) < 0)
|
yading@10
|
276 {
|
yading@10
|
277 av_log(s->avctx, AV_LOG_ERROR, "\nerror while decoding block: %d x %d (%d)\n", s->mb_x, s->mb_y, i);
|
yading@10
|
278 return -1;
|
yading@10
|
279 }
|
yading@10
|
280 }
|
yading@10
|
281
|
yading@10
|
282 return 0;
|
yading@10
|
283 }
|
yading@10
|
284
|
yading@10
|
285 /* init all vlc decoding tables */
|
yading@10
|
286 av_cold int ff_msmpeg4_decode_init(AVCodecContext *avctx)
|
yading@10
|
287 {
|
yading@10
|
288 MpegEncContext *s = avctx->priv_data;
|
yading@10
|
289 static volatile int done = 0;
|
yading@10
|
290 int i, ret;
|
yading@10
|
291 MVTable *mv;
|
yading@10
|
292
|
yading@10
|
293 if ((ret = av_image_check_size(avctx->width, avctx->height, 0, avctx)) < 0)
|
yading@10
|
294 return ret;
|
yading@10
|
295
|
yading@10
|
296 if (ff_h263_decode_init(avctx) < 0)
|
yading@10
|
297 return -1;
|
yading@10
|
298
|
yading@10
|
299 ff_msmpeg4_common_init(s);
|
yading@10
|
300
|
yading@10
|
301 if (!done) {
|
yading@10
|
302 for(i=0;i<NB_RL_TABLES;i++) {
|
yading@10
|
303 ff_init_rl(&ff_rl_table[i], ff_static_rl_table_store[i]);
|
yading@10
|
304 }
|
yading@10
|
305 INIT_VLC_RL(ff_rl_table[0], 642);
|
yading@10
|
306 INIT_VLC_RL(ff_rl_table[1], 1104);
|
yading@10
|
307 INIT_VLC_RL(ff_rl_table[2], 554);
|
yading@10
|
308 INIT_VLC_RL(ff_rl_table[3], 940);
|
yading@10
|
309 INIT_VLC_RL(ff_rl_table[4], 962);
|
yading@10
|
310 INIT_VLC_RL(ff_rl_table[5], 554);
|
yading@10
|
311
|
yading@10
|
312 mv = &ff_mv_tables[0];
|
yading@10
|
313 INIT_VLC_STATIC(&mv->vlc, MV_VLC_BITS, mv->n + 1,
|
yading@10
|
314 mv->table_mv_bits, 1, 1,
|
yading@10
|
315 mv->table_mv_code, 2, 2, 3714);
|
yading@10
|
316 mv = &ff_mv_tables[1];
|
yading@10
|
317 INIT_VLC_STATIC(&mv->vlc, MV_VLC_BITS, mv->n + 1,
|
yading@10
|
318 mv->table_mv_bits, 1, 1,
|
yading@10
|
319 mv->table_mv_code, 2, 2, 2694);
|
yading@10
|
320
|
yading@10
|
321 INIT_VLC_STATIC(&ff_msmp4_dc_luma_vlc[0], DC_VLC_BITS, 120,
|
yading@10
|
322 &ff_table0_dc_lum[0][1], 8, 4,
|
yading@10
|
323 &ff_table0_dc_lum[0][0], 8, 4, 1158);
|
yading@10
|
324 INIT_VLC_STATIC(&ff_msmp4_dc_chroma_vlc[0], DC_VLC_BITS, 120,
|
yading@10
|
325 &ff_table0_dc_chroma[0][1], 8, 4,
|
yading@10
|
326 &ff_table0_dc_chroma[0][0], 8, 4, 1118);
|
yading@10
|
327 INIT_VLC_STATIC(&ff_msmp4_dc_luma_vlc[1], DC_VLC_BITS, 120,
|
yading@10
|
328 &ff_table1_dc_lum[0][1], 8, 4,
|
yading@10
|
329 &ff_table1_dc_lum[0][0], 8, 4, 1476);
|
yading@10
|
330 INIT_VLC_STATIC(&ff_msmp4_dc_chroma_vlc[1], DC_VLC_BITS, 120,
|
yading@10
|
331 &ff_table1_dc_chroma[0][1], 8, 4,
|
yading@10
|
332 &ff_table1_dc_chroma[0][0], 8, 4, 1216);
|
yading@10
|
333
|
yading@10
|
334 INIT_VLC_STATIC(&v2_dc_lum_vlc, DC_VLC_BITS, 512,
|
yading@10
|
335 &ff_v2_dc_lum_table[0][1], 8, 4,
|
yading@10
|
336 &ff_v2_dc_lum_table[0][0], 8, 4, 1472);
|
yading@10
|
337 INIT_VLC_STATIC(&v2_dc_chroma_vlc, DC_VLC_BITS, 512,
|
yading@10
|
338 &ff_v2_dc_chroma_table[0][1], 8, 4,
|
yading@10
|
339 &ff_v2_dc_chroma_table[0][0], 8, 4, 1506);
|
yading@10
|
340
|
yading@10
|
341 INIT_VLC_STATIC(&v2_intra_cbpc_vlc, V2_INTRA_CBPC_VLC_BITS, 4,
|
yading@10
|
342 &ff_v2_intra_cbpc[0][1], 2, 1,
|
yading@10
|
343 &ff_v2_intra_cbpc[0][0], 2, 1, 8);
|
yading@10
|
344 INIT_VLC_STATIC(&v2_mb_type_vlc, V2_MB_TYPE_VLC_BITS, 8,
|
yading@10
|
345 &ff_v2_mb_type[0][1], 2, 1,
|
yading@10
|
346 &ff_v2_mb_type[0][0], 2, 1, 128);
|
yading@10
|
347 INIT_VLC_STATIC(&v2_mv_vlc, V2_MV_VLC_BITS, 33,
|
yading@10
|
348 &ff_mvtab[0][1], 2, 1,
|
yading@10
|
349 &ff_mvtab[0][0], 2, 1, 538);
|
yading@10
|
350
|
yading@10
|
351 INIT_VLC_STATIC(&ff_mb_non_intra_vlc[0], MB_NON_INTRA_VLC_BITS, 128,
|
yading@10
|
352 &ff_wmv2_inter_table[0][0][1], 8, 4,
|
yading@10
|
353 &ff_wmv2_inter_table[0][0][0], 8, 4, 1636);
|
yading@10
|
354 INIT_VLC_STATIC(&ff_mb_non_intra_vlc[1], MB_NON_INTRA_VLC_BITS, 128,
|
yading@10
|
355 &ff_wmv2_inter_table[1][0][1], 8, 4,
|
yading@10
|
356 &ff_wmv2_inter_table[1][0][0], 8, 4, 2648);
|
yading@10
|
357 INIT_VLC_STATIC(&ff_mb_non_intra_vlc[2], MB_NON_INTRA_VLC_BITS, 128,
|
yading@10
|
358 &ff_wmv2_inter_table[2][0][1], 8, 4,
|
yading@10
|
359 &ff_wmv2_inter_table[2][0][0], 8, 4, 1532);
|
yading@10
|
360 INIT_VLC_STATIC(&ff_mb_non_intra_vlc[3], MB_NON_INTRA_VLC_BITS, 128,
|
yading@10
|
361 &ff_wmv2_inter_table[3][0][1], 8, 4,
|
yading@10
|
362 &ff_wmv2_inter_table[3][0][0], 8, 4, 2488);
|
yading@10
|
363
|
yading@10
|
364 INIT_VLC_STATIC(&ff_msmp4_mb_i_vlc, MB_INTRA_VLC_BITS, 64,
|
yading@10
|
365 &ff_msmp4_mb_i_table[0][1], 4, 2,
|
yading@10
|
366 &ff_msmp4_mb_i_table[0][0], 4, 2, 536);
|
yading@10
|
367
|
yading@10
|
368 INIT_VLC_STATIC(&ff_inter_intra_vlc, INTER_INTRA_VLC_BITS, 4,
|
yading@10
|
369 &ff_table_inter_intra[0][1], 2, 1,
|
yading@10
|
370 &ff_table_inter_intra[0][0], 2, 1, 8);
|
yading@10
|
371 done = 1;
|
yading@10
|
372 }
|
yading@10
|
373
|
yading@10
|
374 switch(s->msmpeg4_version){
|
yading@10
|
375 case 1:
|
yading@10
|
376 case 2:
|
yading@10
|
377 s->decode_mb= msmpeg4v12_decode_mb;
|
yading@10
|
378 break;
|
yading@10
|
379 case 3:
|
yading@10
|
380 case 4:
|
yading@10
|
381 s->decode_mb= msmpeg4v34_decode_mb;
|
yading@10
|
382 break;
|
yading@10
|
383 case 5:
|
yading@10
|
384 if (CONFIG_WMV2_DECODER)
|
yading@10
|
385 s->decode_mb= ff_wmv2_decode_mb;
|
yading@10
|
386 case 6:
|
yading@10
|
387 //FIXME + TODO VC1 decode mb
|
yading@10
|
388 break;
|
yading@10
|
389 }
|
yading@10
|
390
|
yading@10
|
391 s->slice_height= s->mb_height; //to avoid 1/0 if the first frame is not a keyframe
|
yading@10
|
392
|
yading@10
|
393 return 0;
|
yading@10
|
394 }
|
yading@10
|
395
|
yading@10
|
396 int ff_msmpeg4_decode_picture_header(MpegEncContext * s)
|
yading@10
|
397 {
|
yading@10
|
398 int code;
|
yading@10
|
399
|
yading@10
|
400 if(s->msmpeg4_version==1){
|
yading@10
|
401 int start_code = get_bits_long(&s->gb, 32);
|
yading@10
|
402 if(start_code!=0x00000100){
|
yading@10
|
403 av_log(s->avctx, AV_LOG_ERROR, "invalid startcode\n");
|
yading@10
|
404 return -1;
|
yading@10
|
405 }
|
yading@10
|
406
|
yading@10
|
407 skip_bits(&s->gb, 5); // frame number */
|
yading@10
|
408 }
|
yading@10
|
409
|
yading@10
|
410 s->pict_type = get_bits(&s->gb, 2) + 1;
|
yading@10
|
411 if (s->pict_type != AV_PICTURE_TYPE_I &&
|
yading@10
|
412 s->pict_type != AV_PICTURE_TYPE_P){
|
yading@10
|
413 av_log(s->avctx, AV_LOG_ERROR, "invalid picture type\n");
|
yading@10
|
414 return -1;
|
yading@10
|
415 }
|
yading@10
|
416 #if 0
|
yading@10
|
417 {
|
yading@10
|
418 static int had_i=0;
|
yading@10
|
419 if(s->pict_type == AV_PICTURE_TYPE_I) had_i=1;
|
yading@10
|
420 if(!had_i) return -1;
|
yading@10
|
421 }
|
yading@10
|
422 #endif
|
yading@10
|
423 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
|
yading@10
|
424 if(s->qscale==0){
|
yading@10
|
425 av_log(s->avctx, AV_LOG_ERROR, "invalid qscale\n");
|
yading@10
|
426 return -1;
|
yading@10
|
427 }
|
yading@10
|
428
|
yading@10
|
429 if (s->pict_type == AV_PICTURE_TYPE_I) {
|
yading@10
|
430 code = get_bits(&s->gb, 5);
|
yading@10
|
431 if(s->msmpeg4_version==1){
|
yading@10
|
432 if(code==0 || code>s->mb_height){
|
yading@10
|
433 av_log(s->avctx, AV_LOG_ERROR, "invalid slice height %d\n", code);
|
yading@10
|
434 return -1;
|
yading@10
|
435 }
|
yading@10
|
436
|
yading@10
|
437 s->slice_height = code;
|
yading@10
|
438 }else{
|
yading@10
|
439 /* 0x17: one slice, 0x18: two slices, ... */
|
yading@10
|
440 if (code < 0x17){
|
yading@10
|
441 av_log(s->avctx, AV_LOG_ERROR, "error, slice code was %X\n", code);
|
yading@10
|
442 return -1;
|
yading@10
|
443 }
|
yading@10
|
444
|
yading@10
|
445 s->slice_height = s->mb_height / (code - 0x16);
|
yading@10
|
446 }
|
yading@10
|
447
|
yading@10
|
448 switch(s->msmpeg4_version){
|
yading@10
|
449 case 1:
|
yading@10
|
450 case 2:
|
yading@10
|
451 s->rl_chroma_table_index = 2;
|
yading@10
|
452 s->rl_table_index = 2;
|
yading@10
|
453
|
yading@10
|
454 s->dc_table_index = 0; //not used
|
yading@10
|
455 break;
|
yading@10
|
456 case 3:
|
yading@10
|
457 s->rl_chroma_table_index = decode012(&s->gb);
|
yading@10
|
458 s->rl_table_index = decode012(&s->gb);
|
yading@10
|
459
|
yading@10
|
460 s->dc_table_index = get_bits1(&s->gb);
|
yading@10
|
461 break;
|
yading@10
|
462 case 4:
|
yading@10
|
463 ff_msmpeg4_decode_ext_header(s, (2+5+5+17+7)/8);
|
yading@10
|
464
|
yading@10
|
465 if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);
|
yading@10
|
466 else s->per_mb_rl_table= 0;
|
yading@10
|
467
|
yading@10
|
468 if(!s->per_mb_rl_table){
|
yading@10
|
469 s->rl_chroma_table_index = decode012(&s->gb);
|
yading@10
|
470 s->rl_table_index = decode012(&s->gb);
|
yading@10
|
471 }
|
yading@10
|
472
|
yading@10
|
473 s->dc_table_index = get_bits1(&s->gb);
|
yading@10
|
474 s->inter_intra_pred= 0;
|
yading@10
|
475 break;
|
yading@10
|
476 }
|
yading@10
|
477 s->no_rounding = 1;
|
yading@10
|
478 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
|
yading@10
|
479 av_log(s->avctx, AV_LOG_DEBUG, "qscale:%d rlc:%d rl:%d dc:%d mbrl:%d slice:%d \n",
|
yading@10
|
480 s->qscale,
|
yading@10
|
481 s->rl_chroma_table_index,
|
yading@10
|
482 s->rl_table_index,
|
yading@10
|
483 s->dc_table_index,
|
yading@10
|
484 s->per_mb_rl_table,
|
yading@10
|
485 s->slice_height);
|
yading@10
|
486 } else {
|
yading@10
|
487 switch(s->msmpeg4_version){
|
yading@10
|
488 case 1:
|
yading@10
|
489 case 2:
|
yading@10
|
490 if(s->msmpeg4_version==1)
|
yading@10
|
491 s->use_skip_mb_code = 1;
|
yading@10
|
492 else
|
yading@10
|
493 s->use_skip_mb_code = get_bits1(&s->gb);
|
yading@10
|
494 s->rl_table_index = 2;
|
yading@10
|
495 s->rl_chroma_table_index = s->rl_table_index;
|
yading@10
|
496 s->dc_table_index = 0; //not used
|
yading@10
|
497 s->mv_table_index = 0;
|
yading@10
|
498 break;
|
yading@10
|
499 case 3:
|
yading@10
|
500 s->use_skip_mb_code = get_bits1(&s->gb);
|
yading@10
|
501 s->rl_table_index = decode012(&s->gb);
|
yading@10
|
502 s->rl_chroma_table_index = s->rl_table_index;
|
yading@10
|
503
|
yading@10
|
504 s->dc_table_index = get_bits1(&s->gb);
|
yading@10
|
505
|
yading@10
|
506 s->mv_table_index = get_bits1(&s->gb);
|
yading@10
|
507 break;
|
yading@10
|
508 case 4:
|
yading@10
|
509 s->use_skip_mb_code = get_bits1(&s->gb);
|
yading@10
|
510
|
yading@10
|
511 if(s->bit_rate > MBAC_BITRATE) s->per_mb_rl_table= get_bits1(&s->gb);
|
yading@10
|
512 else s->per_mb_rl_table= 0;
|
yading@10
|
513
|
yading@10
|
514 if(!s->per_mb_rl_table){
|
yading@10
|
515 s->rl_table_index = decode012(&s->gb);
|
yading@10
|
516 s->rl_chroma_table_index = s->rl_table_index;
|
yading@10
|
517 }
|
yading@10
|
518
|
yading@10
|
519 s->dc_table_index = get_bits1(&s->gb);
|
yading@10
|
520
|
yading@10
|
521 s->mv_table_index = get_bits1(&s->gb);
|
yading@10
|
522 s->inter_intra_pred= (s->width*s->height < 320*240 && s->bit_rate<=II_BITRATE);
|
yading@10
|
523 break;
|
yading@10
|
524 }
|
yading@10
|
525
|
yading@10
|
526 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
|
yading@10
|
527 av_log(s->avctx, AV_LOG_DEBUG, "skip:%d rl:%d rlc:%d dc:%d mv:%d mbrl:%d qp:%d \n",
|
yading@10
|
528 s->use_skip_mb_code,
|
yading@10
|
529 s->rl_table_index,
|
yading@10
|
530 s->rl_chroma_table_index,
|
yading@10
|
531 s->dc_table_index,
|
yading@10
|
532 s->mv_table_index,
|
yading@10
|
533 s->per_mb_rl_table,
|
yading@10
|
534 s->qscale);
|
yading@10
|
535
|
yading@10
|
536 if(s->flipflop_rounding){
|
yading@10
|
537 s->no_rounding ^= 1;
|
yading@10
|
538 }else{
|
yading@10
|
539 s->no_rounding = 0;
|
yading@10
|
540 }
|
yading@10
|
541 }
|
yading@10
|
542 av_dlog(s->avctx, "%d %d %d %d %d\n", s->pict_type, s->bit_rate,
|
yading@10
|
543 s->inter_intra_pred, s->width, s->height);
|
yading@10
|
544
|
yading@10
|
545 s->esc3_level_length= 0;
|
yading@10
|
546 s->esc3_run_length= 0;
|
yading@10
|
547
|
yading@10
|
548 return 0;
|
yading@10
|
549 }
|
yading@10
|
550
|
yading@10
|
551 int ff_msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size)
|
yading@10
|
552 {
|
yading@10
|
553 int left= buf_size*8 - get_bits_count(&s->gb);
|
yading@10
|
554 int length= s->msmpeg4_version>=3 ? 17 : 16;
|
yading@10
|
555 /* the alt_bitstream reader could read over the end so we need to check it */
|
yading@10
|
556 if(left>=length && left<length+8)
|
yading@10
|
557 {
|
yading@10
|
558 skip_bits(&s->gb, 5); /* fps */
|
yading@10
|
559 s->bit_rate= get_bits(&s->gb, 11)*1024;
|
yading@10
|
560 if(s->msmpeg4_version>=3)
|
yading@10
|
561 s->flipflop_rounding= get_bits1(&s->gb);
|
yading@10
|
562 else
|
yading@10
|
563 s->flipflop_rounding= 0;
|
yading@10
|
564 }
|
yading@10
|
565 else if(left<length+8)
|
yading@10
|
566 {
|
yading@10
|
567 s->flipflop_rounding= 0;
|
yading@10
|
568 if(s->msmpeg4_version != 2)
|
yading@10
|
569 av_log(s->avctx, AV_LOG_ERROR, "ext header missing, %d left\n", left);
|
yading@10
|
570 }
|
yading@10
|
571 else
|
yading@10
|
572 {
|
yading@10
|
573 av_log(s->avctx, AV_LOG_ERROR, "I frame too long, ignoring ext header\n");
|
yading@10
|
574 }
|
yading@10
|
575
|
yading@10
|
576 return 0;
|
yading@10
|
577 }
|
yading@10
|
578
|
yading@10
|
579 static int msmpeg4_decode_dc(MpegEncContext * s, int n, int *dir_ptr)
|
yading@10
|
580 {
|
yading@10
|
581 int level, pred;
|
yading@10
|
582
|
yading@10
|
583 if(s->msmpeg4_version<=2){
|
yading@10
|
584 if (n < 4) {
|
yading@10
|
585 level = get_vlc2(&s->gb, v2_dc_lum_vlc.table, DC_VLC_BITS, 3);
|
yading@10
|
586 } else {
|
yading@10
|
587 level = get_vlc2(&s->gb, v2_dc_chroma_vlc.table, DC_VLC_BITS, 3);
|
yading@10
|
588 }
|
yading@10
|
589 if (level < 0)
|
yading@10
|
590 return -1;
|
yading@10
|
591 level-=256;
|
yading@10
|
592 }else{ //FIXME optimize use unified tables & index
|
yading@10
|
593 if (n < 4) {
|
yading@10
|
594 level = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
|
yading@10
|
595 } else {
|
yading@10
|
596 level = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
|
yading@10
|
597 }
|
yading@10
|
598 if (level < 0){
|
yading@10
|
599 av_log(s->avctx, AV_LOG_ERROR, "illegal dc vlc\n");
|
yading@10
|
600 return -1;
|
yading@10
|
601 }
|
yading@10
|
602
|
yading@10
|
603 if (level == DC_MAX) {
|
yading@10
|
604 level = get_bits(&s->gb, 8);
|
yading@10
|
605 if (get_bits1(&s->gb))
|
yading@10
|
606 level = -level;
|
yading@10
|
607 } else if (level != 0) {
|
yading@10
|
608 if (get_bits1(&s->gb))
|
yading@10
|
609 level = -level;
|
yading@10
|
610 }
|
yading@10
|
611 }
|
yading@10
|
612
|
yading@10
|
613 if(s->msmpeg4_version==1){
|
yading@10
|
614 int32_t *dc_val;
|
yading@10
|
615 pred = msmpeg4v1_pred_dc(s, n, &dc_val);
|
yading@10
|
616 level += pred;
|
yading@10
|
617
|
yading@10
|
618 /* update predictor */
|
yading@10
|
619 *dc_val= level;
|
yading@10
|
620 }else{
|
yading@10
|
621 int16_t *dc_val;
|
yading@10
|
622 pred = ff_msmpeg4_pred_dc(s, n, &dc_val, dir_ptr);
|
yading@10
|
623 level += pred;
|
yading@10
|
624
|
yading@10
|
625 /* update predictor */
|
yading@10
|
626 if (n < 4) {
|
yading@10
|
627 *dc_val = level * s->y_dc_scale;
|
yading@10
|
628 } else {
|
yading@10
|
629 *dc_val = level * s->c_dc_scale;
|
yading@10
|
630 }
|
yading@10
|
631 }
|
yading@10
|
632
|
yading@10
|
633 return level;
|
yading@10
|
634 }
|
yading@10
|
635
|
yading@10
|
636 //#define ERROR_DETAILS
|
yading@10
|
637 int ff_msmpeg4_decode_block(MpegEncContext * s, int16_t * block,
|
yading@10
|
638 int n, int coded, const uint8_t *scan_table)
|
yading@10
|
639 {
|
yading@10
|
640 int level, i, last, run, run_diff;
|
yading@10
|
641 int av_uninit(dc_pred_dir);
|
yading@10
|
642 RLTable *rl;
|
yading@10
|
643 RL_VLC_ELEM *rl_vlc;
|
yading@10
|
644 int qmul, qadd;
|
yading@10
|
645
|
yading@10
|
646 if (s->mb_intra) {
|
yading@10
|
647 qmul=1;
|
yading@10
|
648 qadd=0;
|
yading@10
|
649
|
yading@10
|
650 /* DC coef */
|
yading@10
|
651 level = msmpeg4_decode_dc(s, n, &dc_pred_dir);
|
yading@10
|
652
|
yading@10
|
653 if (level < 0){
|
yading@10
|
654 av_log(s->avctx, AV_LOG_ERROR, "dc overflow- block: %d qscale: %d//\n", n, s->qscale);
|
yading@10
|
655 if(s->inter_intra_pred) level=0;
|
yading@10
|
656 }
|
yading@10
|
657 if (n < 4) {
|
yading@10
|
658 rl = &ff_rl_table[s->rl_table_index];
|
yading@10
|
659 if(level > 256*s->y_dc_scale){
|
yading@10
|
660 av_log(s->avctx, AV_LOG_ERROR, "dc overflow+ L qscale: %d//\n", s->qscale);
|
yading@10
|
661 if(!s->inter_intra_pred) return -1;
|
yading@10
|
662 }
|
yading@10
|
663 } else {
|
yading@10
|
664 rl = &ff_rl_table[3 + s->rl_chroma_table_index];
|
yading@10
|
665 if(level > 256*s->c_dc_scale){
|
yading@10
|
666 av_log(s->avctx, AV_LOG_ERROR, "dc overflow+ C qscale: %d//\n", s->qscale);
|
yading@10
|
667 if(!s->inter_intra_pred) return -1;
|
yading@10
|
668 }
|
yading@10
|
669 }
|
yading@10
|
670 block[0] = level;
|
yading@10
|
671
|
yading@10
|
672 run_diff = s->msmpeg4_version >= 4;
|
yading@10
|
673 i = 0;
|
yading@10
|
674 if (!coded) {
|
yading@10
|
675 goto not_coded;
|
yading@10
|
676 }
|
yading@10
|
677 if (s->ac_pred) {
|
yading@10
|
678 if (dc_pred_dir == 0)
|
yading@10
|
679 scan_table = s->intra_v_scantable.permutated; /* left */
|
yading@10
|
680 else
|
yading@10
|
681 scan_table = s->intra_h_scantable.permutated; /* top */
|
yading@10
|
682 } else {
|
yading@10
|
683 scan_table = s->intra_scantable.permutated;
|
yading@10
|
684 }
|
yading@10
|
685 rl_vlc= rl->rl_vlc[0];
|
yading@10
|
686 } else {
|
yading@10
|
687 qmul = s->qscale << 1;
|
yading@10
|
688 qadd = (s->qscale - 1) | 1;
|
yading@10
|
689 i = -1;
|
yading@10
|
690 rl = &ff_rl_table[3 + s->rl_table_index];
|
yading@10
|
691
|
yading@10
|
692 if(s->msmpeg4_version==2)
|
yading@10
|
693 run_diff = 0;
|
yading@10
|
694 else
|
yading@10
|
695 run_diff = 1;
|
yading@10
|
696
|
yading@10
|
697 if (!coded) {
|
yading@10
|
698 s->block_last_index[n] = i;
|
yading@10
|
699 return 0;
|
yading@10
|
700 }
|
yading@10
|
701 if(!scan_table)
|
yading@10
|
702 scan_table = s->inter_scantable.permutated;
|
yading@10
|
703 rl_vlc= rl->rl_vlc[s->qscale];
|
yading@10
|
704 }
|
yading@10
|
705 {
|
yading@10
|
706 OPEN_READER(re, &s->gb);
|
yading@10
|
707 for(;;) {
|
yading@10
|
708 UPDATE_CACHE(re, &s->gb);
|
yading@10
|
709 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 0);
|
yading@10
|
710 if (level==0) {
|
yading@10
|
711 int cache;
|
yading@10
|
712 cache= GET_CACHE(re, &s->gb);
|
yading@10
|
713 /* escape */
|
yading@10
|
714 if (s->msmpeg4_version==1 || (cache&0x80000000)==0) {
|
yading@10
|
715 if (s->msmpeg4_version==1 || (cache&0x40000000)==0) {
|
yading@10
|
716 /* third escape */
|
yading@10
|
717 if(s->msmpeg4_version!=1) LAST_SKIP_BITS(re, &s->gb, 2);
|
yading@10
|
718 UPDATE_CACHE(re, &s->gb);
|
yading@10
|
719 if(s->msmpeg4_version<=3){
|
yading@10
|
720 last= SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
|
yading@10
|
721 run= SHOW_UBITS(re, &s->gb, 6); SKIP_CACHE(re, &s->gb, 6);
|
yading@10
|
722 level= SHOW_SBITS(re, &s->gb, 8);
|
yading@10
|
723 SKIP_COUNTER(re, &s->gb, 1+6+8);
|
yading@10
|
724 }else{
|
yading@10
|
725 int sign;
|
yading@10
|
726 last= SHOW_UBITS(re, &s->gb, 1); SKIP_BITS(re, &s->gb, 1);
|
yading@10
|
727 if(!s->esc3_level_length){
|
yading@10
|
728 int ll;
|
yading@10
|
729 av_dlog(s->avctx, "ESC-3 %X at %d %d\n",
|
yading@10
|
730 show_bits(&s->gb, 24), s->mb_x, s->mb_y);
|
yading@10
|
731 if(s->qscale<8){
|
yading@10
|
732 ll= SHOW_UBITS(re, &s->gb, 3); SKIP_BITS(re, &s->gb, 3);
|
yading@10
|
733 if(ll==0){
|
yading@10
|
734 ll= 8+SHOW_UBITS(re, &s->gb, 1); SKIP_BITS(re, &s->gb, 1);
|
yading@10
|
735 }
|
yading@10
|
736 }else{
|
yading@10
|
737 ll=2;
|
yading@10
|
738 while(ll<8 && SHOW_UBITS(re, &s->gb, 1)==0){
|
yading@10
|
739 ll++;
|
yading@10
|
740 SKIP_BITS(re, &s->gb, 1);
|
yading@10
|
741 }
|
yading@10
|
742 if(ll<8) SKIP_BITS(re, &s->gb, 1);
|
yading@10
|
743 }
|
yading@10
|
744
|
yading@10
|
745 s->esc3_level_length= ll;
|
yading@10
|
746 s->esc3_run_length= SHOW_UBITS(re, &s->gb, 2) + 3; SKIP_BITS(re, &s->gb, 2);
|
yading@10
|
747 UPDATE_CACHE(re, &s->gb);
|
yading@10
|
748 }
|
yading@10
|
749 run= SHOW_UBITS(re, &s->gb, s->esc3_run_length);
|
yading@10
|
750 SKIP_BITS(re, &s->gb, s->esc3_run_length);
|
yading@10
|
751
|
yading@10
|
752 sign= SHOW_UBITS(re, &s->gb, 1);
|
yading@10
|
753 SKIP_BITS(re, &s->gb, 1);
|
yading@10
|
754
|
yading@10
|
755 level= SHOW_UBITS(re, &s->gb, s->esc3_level_length);
|
yading@10
|
756 SKIP_BITS(re, &s->gb, s->esc3_level_length);
|
yading@10
|
757 if(sign) level= -level;
|
yading@10
|
758 }
|
yading@10
|
759
|
yading@10
|
760 #if 0 // waste of time / this will detect very few errors
|
yading@10
|
761 {
|
yading@10
|
762 const int abs_level= FFABS(level);
|
yading@10
|
763 const int run1= run - rl->max_run[last][abs_level] - run_diff;
|
yading@10
|
764 if(abs_level<=MAX_LEVEL && run<=MAX_RUN){
|
yading@10
|
765 if(abs_level <= rl->max_level[last][run]){
|
yading@10
|
766 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, vlc encoding possible\n");
|
yading@10
|
767 return DECODING_AC_LOST;
|
yading@10
|
768 }
|
yading@10
|
769 if(abs_level <= rl->max_level[last][run]*2){
|
yading@10
|
770 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 1 encoding possible\n");
|
yading@10
|
771 return DECODING_AC_LOST;
|
yading@10
|
772 }
|
yading@10
|
773 if(run1>=0 && abs_level <= rl->max_level[last][run1]){
|
yading@10
|
774 av_log(s->avctx, AV_LOG_ERROR, "illegal 3. esc, esc 2 encoding possible\n");
|
yading@10
|
775 return DECODING_AC_LOST;
|
yading@10
|
776 }
|
yading@10
|
777 }
|
yading@10
|
778 }
|
yading@10
|
779 #endif
|
yading@10
|
780 //level = level * qmul + (level>0) * qadd - (level<=0) * qadd ;
|
yading@10
|
781 if (level>0) level= level * qmul + qadd;
|
yading@10
|
782 else level= level * qmul - qadd;
|
yading@10
|
783 #if 0 // waste of time too :(
|
yading@10
|
784 if(level>2048 || level<-2048){
|
yading@10
|
785 av_log(s->avctx, AV_LOG_ERROR, "|level| overflow in 3. esc\n");
|
yading@10
|
786 return DECODING_AC_LOST;
|
yading@10
|
787 }
|
yading@10
|
788 #endif
|
yading@10
|
789 i+= run + 1;
|
yading@10
|
790 if(last) i+=192;
|
yading@10
|
791 #ifdef ERROR_DETAILS
|
yading@10
|
792 if(run==66)
|
yading@10
|
793 av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code in ESC3 level=%d\n", level);
|
yading@10
|
794 else if((i>62 && i<192) || i>192+63)
|
yading@10
|
795 av_log(s->avctx, AV_LOG_ERROR, "run overflow in ESC3 i=%d run=%d level=%d\n", i, run, level);
|
yading@10
|
796 #endif
|
yading@10
|
797 } else {
|
yading@10
|
798 /* second escape */
|
yading@10
|
799 SKIP_BITS(re, &s->gb, 2);
|
yading@10
|
800 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
|
yading@10
|
801 i+= run + rl->max_run[run>>7][level/qmul] + run_diff; //FIXME opt indexing
|
yading@10
|
802 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
|
yading@10
|
803 LAST_SKIP_BITS(re, &s->gb, 1);
|
yading@10
|
804 #ifdef ERROR_DETAILS
|
yading@10
|
805 if(run==66)
|
yading@10
|
806 av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code in ESC2 level=%d\n", level);
|
yading@10
|
807 else if((i>62 && i<192) || i>192+63)
|
yading@10
|
808 av_log(s->avctx, AV_LOG_ERROR, "run overflow in ESC2 i=%d run=%d level=%d\n", i, run, level);
|
yading@10
|
809 #endif
|
yading@10
|
810 }
|
yading@10
|
811 } else {
|
yading@10
|
812 /* first escape */
|
yading@10
|
813 SKIP_BITS(re, &s->gb, 1);
|
yading@10
|
814 GET_RL_VLC(level, run, re, &s->gb, rl_vlc, TEX_VLC_BITS, 2, 1);
|
yading@10
|
815 i+= run;
|
yading@10
|
816 level = level + rl->max_level[run>>7][(run-1)&63] * qmul;//FIXME opt indexing
|
yading@10
|
817 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
|
yading@10
|
818 LAST_SKIP_BITS(re, &s->gb, 1);
|
yading@10
|
819 #ifdef ERROR_DETAILS
|
yading@10
|
820 if(run==66)
|
yading@10
|
821 av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code in ESC1 level=%d\n", level);
|
yading@10
|
822 else if((i>62 && i<192) || i>192+63)
|
yading@10
|
823 av_log(s->avctx, AV_LOG_ERROR, "run overflow in ESC1 i=%d run=%d level=%d\n", i, run, level);
|
yading@10
|
824 #endif
|
yading@10
|
825 }
|
yading@10
|
826 } else {
|
yading@10
|
827 i+= run;
|
yading@10
|
828 level = (level ^ SHOW_SBITS(re, &s->gb, 1)) - SHOW_SBITS(re, &s->gb, 1);
|
yading@10
|
829 LAST_SKIP_BITS(re, &s->gb, 1);
|
yading@10
|
830 #ifdef ERROR_DETAILS
|
yading@10
|
831 if(run==66)
|
yading@10
|
832 av_log(s->avctx, AV_LOG_ERROR, "illegal vlc code level=%d\n", level);
|
yading@10
|
833 else if((i>62 && i<192) || i>192+63)
|
yading@10
|
834 av_log(s->avctx, AV_LOG_ERROR, "run overflow i=%d run=%d level=%d\n", i, run, level);
|
yading@10
|
835 #endif
|
yading@10
|
836 }
|
yading@10
|
837 if (i > 62){
|
yading@10
|
838 i-= 192;
|
yading@10
|
839 if(i&(~63)){
|
yading@10
|
840 const int left= get_bits_left(&s->gb);
|
yading@10
|
841 if(((i+192 == 64 && level/qmul==-1) || !(s->err_recognition&(AV_EF_BITSTREAM|AV_EF_COMPLIANT))) && left>=0){
|
yading@10
|
842 av_log(s->avctx, AV_LOG_ERROR, "ignoring overflow at %d %d\n", s->mb_x, s->mb_y);
|
yading@10
|
843 i = 63;
|
yading@10
|
844 break;
|
yading@10
|
845 }else{
|
yading@10
|
846 av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
|
yading@10
|
847 return -1;
|
yading@10
|
848 }
|
yading@10
|
849 }
|
yading@10
|
850
|
yading@10
|
851 block[scan_table[i]] = level;
|
yading@10
|
852 break;
|
yading@10
|
853 }
|
yading@10
|
854
|
yading@10
|
855 block[scan_table[i]] = level;
|
yading@10
|
856 }
|
yading@10
|
857 CLOSE_READER(re, &s->gb);
|
yading@10
|
858 }
|
yading@10
|
859 not_coded:
|
yading@10
|
860 if (s->mb_intra) {
|
yading@10
|
861 ff_mpeg4_pred_ac(s, block, n, dc_pred_dir);
|
yading@10
|
862 if (s->ac_pred) {
|
yading@10
|
863 i = 63; /* XXX: not optimal */
|
yading@10
|
864 }
|
yading@10
|
865 }
|
yading@10
|
866 if(s->msmpeg4_version>=4 && i>0) i=63; //FIXME/XXX optimize
|
yading@10
|
867 s->block_last_index[n] = i;
|
yading@10
|
868
|
yading@10
|
869 return 0;
|
yading@10
|
870 }
|
yading@10
|
871
|
yading@10
|
872 int ff_msmpeg4_decode_motion(MpegEncContext * s,
|
yading@10
|
873 int *mx_ptr, int *my_ptr)
|
yading@10
|
874 {
|
yading@10
|
875 MVTable *mv;
|
yading@10
|
876 int code, mx, my;
|
yading@10
|
877
|
yading@10
|
878 mv = &ff_mv_tables[s->mv_table_index];
|
yading@10
|
879
|
yading@10
|
880 code = get_vlc2(&s->gb, mv->vlc.table, MV_VLC_BITS, 2);
|
yading@10
|
881 if (code < 0){
|
yading@10
|
882 av_log(s->avctx, AV_LOG_ERROR, "illegal MV code at %d %d\n", s->mb_x, s->mb_y);
|
yading@10
|
883 return -1;
|
yading@10
|
884 }
|
yading@10
|
885 if (code == mv->n) {
|
yading@10
|
886 mx = get_bits(&s->gb, 6);
|
yading@10
|
887 my = get_bits(&s->gb, 6);
|
yading@10
|
888 } else {
|
yading@10
|
889 mx = mv->table_mvx[code];
|
yading@10
|
890 my = mv->table_mvy[code];
|
yading@10
|
891 }
|
yading@10
|
892
|
yading@10
|
893 mx += *mx_ptr - 32;
|
yading@10
|
894 my += *my_ptr - 32;
|
yading@10
|
895 /* WARNING : they do not do exactly modulo encoding */
|
yading@10
|
896 if (mx <= -64)
|
yading@10
|
897 mx += 64;
|
yading@10
|
898 else if (mx >= 64)
|
yading@10
|
899 mx -= 64;
|
yading@10
|
900
|
yading@10
|
901 if (my <= -64)
|
yading@10
|
902 my += 64;
|
yading@10
|
903 else if (my >= 64)
|
yading@10
|
904 my -= 64;
|
yading@10
|
905 *mx_ptr = mx;
|
yading@10
|
906 *my_ptr = my;
|
yading@10
|
907 return 0;
|
yading@10
|
908 }
|
yading@10
|
909
|
yading@10
|
910 AVCodec ff_msmpeg4v1_decoder = {
|
yading@10
|
911 .name = "msmpeg4v1",
|
yading@10
|
912 .type = AVMEDIA_TYPE_VIDEO,
|
yading@10
|
913 .id = AV_CODEC_ID_MSMPEG4V1,
|
yading@10
|
914 .priv_data_size = sizeof(MpegEncContext),
|
yading@10
|
915 .init = ff_msmpeg4_decode_init,
|
yading@10
|
916 .close = ff_h263_decode_end,
|
yading@10
|
917 .decode = ff_h263_decode_frame,
|
yading@10
|
918 .capabilities = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
|
yading@10
|
919 .max_lowres = 3,
|
yading@10
|
920 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 1"),
|
yading@10
|
921 .pix_fmts = ff_pixfmt_list_420,
|
yading@10
|
922 };
|
yading@10
|
923
|
yading@10
|
924 AVCodec ff_msmpeg4v2_decoder = {
|
yading@10
|
925 .name = "msmpeg4v2",
|
yading@10
|
926 .type = AVMEDIA_TYPE_VIDEO,
|
yading@10
|
927 .id = AV_CODEC_ID_MSMPEG4V2,
|
yading@10
|
928 .priv_data_size = sizeof(MpegEncContext),
|
yading@10
|
929 .init = ff_msmpeg4_decode_init,
|
yading@10
|
930 .close = ff_h263_decode_end,
|
yading@10
|
931 .decode = ff_h263_decode_frame,
|
yading@10
|
932 .capabilities = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
|
yading@10
|
933 .max_lowres = 3,
|
yading@10
|
934 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
|
yading@10
|
935 .pix_fmts = ff_pixfmt_list_420,
|
yading@10
|
936 };
|
yading@10
|
937
|
yading@10
|
938 AVCodec ff_msmpeg4v3_decoder = {
|
yading@10
|
939 .name = "msmpeg4",
|
yading@10
|
940 .type = AVMEDIA_TYPE_VIDEO,
|
yading@10
|
941 .id = AV_CODEC_ID_MSMPEG4V3,
|
yading@10
|
942 .priv_data_size = sizeof(MpegEncContext),
|
yading@10
|
943 .init = ff_msmpeg4_decode_init,
|
yading@10
|
944 .close = ff_h263_decode_end,
|
yading@10
|
945 .decode = ff_h263_decode_frame,
|
yading@10
|
946 .capabilities = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
|
yading@10
|
947 .max_lowres = 3,
|
yading@10
|
948 .long_name = NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
|
yading@10
|
949 .pix_fmts = ff_pixfmt_list_420,
|
yading@10
|
950 };
|
yading@10
|
951
|
yading@10
|
952 AVCodec ff_wmv1_decoder = {
|
yading@10
|
953 .name = "wmv1",
|
yading@10
|
954 .type = AVMEDIA_TYPE_VIDEO,
|
yading@10
|
955 .id = AV_CODEC_ID_WMV1,
|
yading@10
|
956 .priv_data_size = sizeof(MpegEncContext),
|
yading@10
|
957 .init = ff_msmpeg4_decode_init,
|
yading@10
|
958 .close = ff_h263_decode_end,
|
yading@10
|
959 .decode = ff_h263_decode_frame,
|
yading@10
|
960 .capabilities = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
|
yading@10
|
961 .max_lowres = 3,
|
yading@10
|
962 .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
|
yading@10
|
963 .pix_fmts = ff_pixfmt_list_420,
|
yading@10
|
964 };
|