yading@10
|
1 /*
|
yading@10
|
2 * ITU H263 bitstream decoder
|
yading@10
|
3 * Copyright (c) 2000,2001 Fabrice Bellard
|
yading@10
|
4 * H263+ support.
|
yading@10
|
5 * Copyright (c) 2001 Juan J. Sierralta P
|
yading@10
|
6 * Copyright (c) 2002-2004 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 /**
|
yading@10
|
26 * @file
|
yading@10
|
27 * h263 decoder.
|
yading@10
|
28 */
|
yading@10
|
29
|
yading@10
|
30 #define UNCHECKED_BITSTREAM_READER 1
|
yading@10
|
31
|
yading@10
|
32 //#define DEBUG
|
yading@10
|
33 #include <limits.h>
|
yading@10
|
34
|
yading@10
|
35 #include "libavutil/internal.h"
|
yading@10
|
36 #include "libavutil/mathematics.h"
|
yading@10
|
37 #include "avcodec.h"
|
yading@10
|
38 #include "mpegvideo.h"
|
yading@10
|
39 #include "h263.h"
|
yading@10
|
40 #include "mathops.h"
|
yading@10
|
41 #include "unary.h"
|
yading@10
|
42 #include "flv.h"
|
yading@10
|
43 #include "mpeg4video.h"
|
yading@10
|
44
|
yading@10
|
45 // The defines below define the number of bits that are read at once for
|
yading@10
|
46 // reading vlc values. Changing these may improve speed and data cache needs
|
yading@10
|
47 // be aware though that decreasing them may need the number of stages that is
|
yading@10
|
48 // passed to get_vlc* to be increased.
|
yading@10
|
49 #define MV_VLC_BITS 9
|
yading@10
|
50 #define H263_MBTYPE_B_VLC_BITS 6
|
yading@10
|
51 #define CBPC_B_VLC_BITS 3
|
yading@10
|
52
|
yading@10
|
53 static const int h263_mb_type_b_map[15]= {
|
yading@10
|
54 MB_TYPE_DIRECT2 | MB_TYPE_L0L1,
|
yading@10
|
55 MB_TYPE_DIRECT2 | MB_TYPE_L0L1 | MB_TYPE_CBP,
|
yading@10
|
56 MB_TYPE_DIRECT2 | MB_TYPE_L0L1 | MB_TYPE_CBP | MB_TYPE_QUANT,
|
yading@10
|
57 MB_TYPE_L0 | MB_TYPE_16x16,
|
yading@10
|
58 MB_TYPE_L0 | MB_TYPE_CBP | MB_TYPE_16x16,
|
yading@10
|
59 MB_TYPE_L0 | MB_TYPE_CBP | MB_TYPE_QUANT | MB_TYPE_16x16,
|
yading@10
|
60 MB_TYPE_L1 | MB_TYPE_16x16,
|
yading@10
|
61 MB_TYPE_L1 | MB_TYPE_CBP | MB_TYPE_16x16,
|
yading@10
|
62 MB_TYPE_L1 | MB_TYPE_CBP | MB_TYPE_QUANT | MB_TYPE_16x16,
|
yading@10
|
63 MB_TYPE_L0L1 | MB_TYPE_16x16,
|
yading@10
|
64 MB_TYPE_L0L1 | MB_TYPE_CBP | MB_TYPE_16x16,
|
yading@10
|
65 MB_TYPE_L0L1 | MB_TYPE_CBP | MB_TYPE_QUANT | MB_TYPE_16x16,
|
yading@10
|
66 0, //stuffing
|
yading@10
|
67 MB_TYPE_INTRA4x4 | MB_TYPE_CBP,
|
yading@10
|
68 MB_TYPE_INTRA4x4 | MB_TYPE_CBP | MB_TYPE_QUANT,
|
yading@10
|
69 };
|
yading@10
|
70
|
yading@10
|
71 void ff_h263_show_pict_info(MpegEncContext *s){
|
yading@10
|
72 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
|
yading@10
|
73 av_log(s->avctx, AV_LOG_DEBUG, "qp:%d %c size:%d rnd:%d%s%s%s%s%s%s%s%s%s %d/%d\n",
|
yading@10
|
74 s->qscale, av_get_picture_type_char(s->pict_type),
|
yading@10
|
75 s->gb.size_in_bits, 1-s->no_rounding,
|
yading@10
|
76 s->obmc ? " AP" : "",
|
yading@10
|
77 s->umvplus ? " UMV" : "",
|
yading@10
|
78 s->h263_long_vectors ? " LONG" : "",
|
yading@10
|
79 s->h263_plus ? " +" : "",
|
yading@10
|
80 s->h263_aic ? " AIC" : "",
|
yading@10
|
81 s->alt_inter_vlc ? " AIV" : "",
|
yading@10
|
82 s->modified_quant ? " MQ" : "",
|
yading@10
|
83 s->loop_filter ? " LOOP" : "",
|
yading@10
|
84 s->h263_slice_structured ? " SS" : "",
|
yading@10
|
85 s->avctx->time_base.den, s->avctx->time_base.num
|
yading@10
|
86 );
|
yading@10
|
87 }
|
yading@10
|
88 }
|
yading@10
|
89
|
yading@10
|
90 /***********************************************/
|
yading@10
|
91 /* decoding */
|
yading@10
|
92
|
yading@10
|
93 VLC ff_h263_intra_MCBPC_vlc;
|
yading@10
|
94 VLC ff_h263_inter_MCBPC_vlc;
|
yading@10
|
95 VLC ff_h263_cbpy_vlc;
|
yading@10
|
96 static VLC mv_vlc;
|
yading@10
|
97 static VLC h263_mbtype_b_vlc;
|
yading@10
|
98 static VLC cbpc_b_vlc;
|
yading@10
|
99
|
yading@10
|
100 /* init vlcs */
|
yading@10
|
101
|
yading@10
|
102 /* XXX: find a better solution to handle static init */
|
yading@10
|
103 void ff_h263_decode_init_vlc(void)
|
yading@10
|
104 {
|
yading@10
|
105 static volatile int done = 0;
|
yading@10
|
106
|
yading@10
|
107 if (!done) {
|
yading@10
|
108 INIT_VLC_STATIC(&ff_h263_intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 9,
|
yading@10
|
109 ff_h263_intra_MCBPC_bits, 1, 1,
|
yading@10
|
110 ff_h263_intra_MCBPC_code, 1, 1, 72);
|
yading@10
|
111 INIT_VLC_STATIC(&ff_h263_inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 28,
|
yading@10
|
112 ff_h263_inter_MCBPC_bits, 1, 1,
|
yading@10
|
113 ff_h263_inter_MCBPC_code, 1, 1, 198);
|
yading@10
|
114 INIT_VLC_STATIC(&ff_h263_cbpy_vlc, CBPY_VLC_BITS, 16,
|
yading@10
|
115 &ff_h263_cbpy_tab[0][1], 2, 1,
|
yading@10
|
116 &ff_h263_cbpy_tab[0][0], 2, 1, 64);
|
yading@10
|
117 INIT_VLC_STATIC(&mv_vlc, MV_VLC_BITS, 33,
|
yading@10
|
118 &ff_mvtab[0][1], 2, 1,
|
yading@10
|
119 &ff_mvtab[0][0], 2, 1, 538);
|
yading@10
|
120 ff_init_rl(&ff_h263_rl_inter, ff_h263_static_rl_table_store[0]);
|
yading@10
|
121 ff_init_rl(&ff_rl_intra_aic, ff_h263_static_rl_table_store[1]);
|
yading@10
|
122 INIT_VLC_RL(ff_h263_rl_inter, 554);
|
yading@10
|
123 INIT_VLC_RL(ff_rl_intra_aic, 554);
|
yading@10
|
124 INIT_VLC_STATIC(&h263_mbtype_b_vlc, H263_MBTYPE_B_VLC_BITS, 15,
|
yading@10
|
125 &ff_h263_mbtype_b_tab[0][1], 2, 1,
|
yading@10
|
126 &ff_h263_mbtype_b_tab[0][0], 2, 1, 80);
|
yading@10
|
127 INIT_VLC_STATIC(&cbpc_b_vlc, CBPC_B_VLC_BITS, 4,
|
yading@10
|
128 &ff_cbpc_b_tab[0][1], 2, 1,
|
yading@10
|
129 &ff_cbpc_b_tab[0][0], 2, 1, 8);
|
yading@10
|
130 done = 1;
|
yading@10
|
131 }
|
yading@10
|
132 }
|
yading@10
|
133
|
yading@10
|
134 int ff_h263_decode_mba(MpegEncContext *s)
|
yading@10
|
135 {
|
yading@10
|
136 int i, mb_pos;
|
yading@10
|
137
|
yading@10
|
138 for(i=0; i<6; i++){
|
yading@10
|
139 if(s->mb_num-1 <= ff_mba_max[i]) break;
|
yading@10
|
140 }
|
yading@10
|
141 mb_pos= get_bits(&s->gb, ff_mba_length[i]);
|
yading@10
|
142 s->mb_x= mb_pos % s->mb_width;
|
yading@10
|
143 s->mb_y= mb_pos / s->mb_width;
|
yading@10
|
144
|
yading@10
|
145 return mb_pos;
|
yading@10
|
146 }
|
yading@10
|
147
|
yading@10
|
148 /**
|
yading@10
|
149 * Decode the group of blocks header or slice header.
|
yading@10
|
150 * @return <0 if an error occurred
|
yading@10
|
151 */
|
yading@10
|
152 static int h263_decode_gob_header(MpegEncContext *s)
|
yading@10
|
153 {
|
yading@10
|
154 unsigned int val, gob_number;
|
yading@10
|
155 int left;
|
yading@10
|
156
|
yading@10
|
157 /* Check for GOB Start Code */
|
yading@10
|
158 val = show_bits(&s->gb, 16);
|
yading@10
|
159 if(val)
|
yading@10
|
160 return -1;
|
yading@10
|
161
|
yading@10
|
162 /* We have a GBSC probably with GSTUFF */
|
yading@10
|
163 skip_bits(&s->gb, 16); /* Drop the zeros */
|
yading@10
|
164 left= get_bits_left(&s->gb);
|
yading@10
|
165 //MN: we must check the bits left or we might end in a infinite loop (or segfault)
|
yading@10
|
166 for(;left>13; left--){
|
yading@10
|
167 if(get_bits1(&s->gb)) break; /* Seek the '1' bit */
|
yading@10
|
168 }
|
yading@10
|
169 if(left<=13)
|
yading@10
|
170 return -1;
|
yading@10
|
171
|
yading@10
|
172 if(s->h263_slice_structured){
|
yading@10
|
173 if(get_bits1(&s->gb)==0)
|
yading@10
|
174 return -1;
|
yading@10
|
175
|
yading@10
|
176 ff_h263_decode_mba(s);
|
yading@10
|
177
|
yading@10
|
178 if(s->mb_num > 1583)
|
yading@10
|
179 if(get_bits1(&s->gb)==0)
|
yading@10
|
180 return -1;
|
yading@10
|
181
|
yading@10
|
182 s->qscale = get_bits(&s->gb, 5); /* SQUANT */
|
yading@10
|
183 if(get_bits1(&s->gb)==0)
|
yading@10
|
184 return -1;
|
yading@10
|
185 skip_bits(&s->gb, 2); /* GFID */
|
yading@10
|
186 }else{
|
yading@10
|
187 gob_number = get_bits(&s->gb, 5); /* GN */
|
yading@10
|
188 s->mb_x= 0;
|
yading@10
|
189 s->mb_y= s->gob_index* gob_number;
|
yading@10
|
190 skip_bits(&s->gb, 2); /* GFID */
|
yading@10
|
191 s->qscale = get_bits(&s->gb, 5); /* GQUANT */
|
yading@10
|
192 }
|
yading@10
|
193
|
yading@10
|
194 if(s->mb_y >= s->mb_height)
|
yading@10
|
195 return -1;
|
yading@10
|
196
|
yading@10
|
197 if(s->qscale==0)
|
yading@10
|
198 return -1;
|
yading@10
|
199
|
yading@10
|
200 return 0;
|
yading@10
|
201 }
|
yading@10
|
202
|
yading@10
|
203 /**
|
yading@10
|
204 * Find the next resync_marker.
|
yading@10
|
205 * @param p pointer to buffer to scan
|
yading@10
|
206 * @param end pointer to the end of the buffer
|
yading@10
|
207 * @return pointer to the next resync_marker, or end if none was found
|
yading@10
|
208 */
|
yading@10
|
209 const uint8_t *ff_h263_find_resync_marker(MpegEncContext *s, const uint8_t *av_restrict p, const uint8_t *av_restrict end)
|
yading@10
|
210 {
|
yading@10
|
211 av_assert2(p < end);
|
yading@10
|
212
|
yading@10
|
213 end-=2;
|
yading@10
|
214 p++;
|
yading@10
|
215 if(s->resync_marker){
|
yading@10
|
216 int prefix_len = ff_mpeg4_get_video_packet_prefix_length(s);
|
yading@10
|
217 for(;p<end; p+=2){
|
yading@10
|
218 if(!*p){
|
yading@10
|
219 if (!p[-1] && ((p[1] >> (23-prefix_len)) == 1)) return p - 1;
|
yading@10
|
220 else if (!p[ 1] && ((p[2] >> (23-prefix_len)) == 1)) return p;
|
yading@10
|
221 }
|
yading@10
|
222 }
|
yading@10
|
223 }
|
yading@10
|
224 return end+2;
|
yading@10
|
225 }
|
yading@10
|
226
|
yading@10
|
227 /**
|
yading@10
|
228 * Decode the group of blocks / video packet header.
|
yading@10
|
229 * @return bit position of the resync_marker, or <0 if none was found
|
yading@10
|
230 */
|
yading@10
|
231 int ff_h263_resync(MpegEncContext *s){
|
yading@10
|
232 int left, pos, ret;
|
yading@10
|
233
|
yading@10
|
234 if(s->codec_id==AV_CODEC_ID_MPEG4){
|
yading@10
|
235 skip_bits1(&s->gb);
|
yading@10
|
236 align_get_bits(&s->gb);
|
yading@10
|
237 }
|
yading@10
|
238
|
yading@10
|
239 if(show_bits(&s->gb, 16)==0){
|
yading@10
|
240 pos= get_bits_count(&s->gb);
|
yading@10
|
241 if(CONFIG_MPEG4_DECODER && s->codec_id==AV_CODEC_ID_MPEG4)
|
yading@10
|
242 ret= ff_mpeg4_decode_video_packet_header(s);
|
yading@10
|
243 else
|
yading@10
|
244 ret= h263_decode_gob_header(s);
|
yading@10
|
245 if(ret>=0)
|
yading@10
|
246 return pos;
|
yading@10
|
247 }
|
yading@10
|
248 //OK, it's not where it is supposed to be ...
|
yading@10
|
249 s->gb= s->last_resync_gb;
|
yading@10
|
250 align_get_bits(&s->gb);
|
yading@10
|
251 left= get_bits_left(&s->gb);
|
yading@10
|
252
|
yading@10
|
253 for(;left>16+1+5+5; left-=8){
|
yading@10
|
254 if(show_bits(&s->gb, 16)==0){
|
yading@10
|
255 GetBitContext bak= s->gb;
|
yading@10
|
256
|
yading@10
|
257 pos= get_bits_count(&s->gb);
|
yading@10
|
258 if(CONFIG_MPEG4_DECODER && s->codec_id==AV_CODEC_ID_MPEG4)
|
yading@10
|
259 ret= ff_mpeg4_decode_video_packet_header(s);
|
yading@10
|
260 else
|
yading@10
|
261 ret= h263_decode_gob_header(s);
|
yading@10
|
262 if(ret>=0)
|
yading@10
|
263 return pos;
|
yading@10
|
264
|
yading@10
|
265 s->gb= bak;
|
yading@10
|
266 }
|
yading@10
|
267 skip_bits(&s->gb, 8);
|
yading@10
|
268 }
|
yading@10
|
269
|
yading@10
|
270 return -1;
|
yading@10
|
271 }
|
yading@10
|
272
|
yading@10
|
273 int ff_h263_decode_motion(MpegEncContext * s, int pred, int f_code)
|
yading@10
|
274 {
|
yading@10
|
275 int code, val, sign, shift;
|
yading@10
|
276 code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2);
|
yading@10
|
277
|
yading@10
|
278 if (code == 0)
|
yading@10
|
279 return pred;
|
yading@10
|
280 if (code < 0)
|
yading@10
|
281 return 0xffff;
|
yading@10
|
282
|
yading@10
|
283 sign = get_bits1(&s->gb);
|
yading@10
|
284 shift = f_code - 1;
|
yading@10
|
285 val = code;
|
yading@10
|
286 if (shift) {
|
yading@10
|
287 val = (val - 1) << shift;
|
yading@10
|
288 val |= get_bits(&s->gb, shift);
|
yading@10
|
289 val++;
|
yading@10
|
290 }
|
yading@10
|
291 if (sign)
|
yading@10
|
292 val = -val;
|
yading@10
|
293 val += pred;
|
yading@10
|
294
|
yading@10
|
295 /* modulo decoding */
|
yading@10
|
296 if (!s->h263_long_vectors) {
|
yading@10
|
297 val = sign_extend(val, 5 + f_code);
|
yading@10
|
298 } else {
|
yading@10
|
299 /* horrible h263 long vector mode */
|
yading@10
|
300 if (pred < -31 && val < -63)
|
yading@10
|
301 val += 64;
|
yading@10
|
302 if (pred > 32 && val > 63)
|
yading@10
|
303 val -= 64;
|
yading@10
|
304
|
yading@10
|
305 }
|
yading@10
|
306 return val;
|
yading@10
|
307 }
|
yading@10
|
308
|
yading@10
|
309
|
yading@10
|
310 /* Decode RVLC of H.263+ UMV */
|
yading@10
|
311 static int h263p_decode_umotion(MpegEncContext * s, int pred)
|
yading@10
|
312 {
|
yading@10
|
313 int code = 0, sign;
|
yading@10
|
314
|
yading@10
|
315 if (get_bits1(&s->gb)) /* Motion difference = 0 */
|
yading@10
|
316 return pred;
|
yading@10
|
317
|
yading@10
|
318 code = 2 + get_bits1(&s->gb);
|
yading@10
|
319
|
yading@10
|
320 while (get_bits1(&s->gb))
|
yading@10
|
321 {
|
yading@10
|
322 code <<= 1;
|
yading@10
|
323 code += get_bits1(&s->gb);
|
yading@10
|
324 }
|
yading@10
|
325 sign = code & 1;
|
yading@10
|
326 code >>= 1;
|
yading@10
|
327
|
yading@10
|
328 code = (sign) ? (pred - code) : (pred + code);
|
yading@10
|
329 av_dlog(s->avctx,"H.263+ UMV Motion = %d\n", code);
|
yading@10
|
330 return code;
|
yading@10
|
331
|
yading@10
|
332 }
|
yading@10
|
333
|
yading@10
|
334 /**
|
yading@10
|
335 * read the next MVs for OBMC. yes this is a ugly hack, feel free to send a patch :)
|
yading@10
|
336 */
|
yading@10
|
337 static void preview_obmc(MpegEncContext *s){
|
yading@10
|
338 GetBitContext gb= s->gb;
|
yading@10
|
339
|
yading@10
|
340 int cbpc, i, pred_x, pred_y, mx, my;
|
yading@10
|
341 int16_t *mot_val;
|
yading@10
|
342 const int xy= s->mb_x + 1 + s->mb_y * s->mb_stride;
|
yading@10
|
343 const int stride= s->b8_stride*2;
|
yading@10
|
344
|
yading@10
|
345 for(i=0; i<4; i++)
|
yading@10
|
346 s->block_index[i]+= 2;
|
yading@10
|
347 for(i=4; i<6; i++)
|
yading@10
|
348 s->block_index[i]+= 1;
|
yading@10
|
349 s->mb_x++;
|
yading@10
|
350
|
yading@10
|
351 av_assert2(s->pict_type == AV_PICTURE_TYPE_P);
|
yading@10
|
352
|
yading@10
|
353 do{
|
yading@10
|
354 if (get_bits1(&s->gb)) {
|
yading@10
|
355 /* skip mb */
|
yading@10
|
356 mot_val = s->current_picture.motion_val[0][s->block_index[0]];
|
yading@10
|
357 mot_val[0 ]= mot_val[2 ]=
|
yading@10
|
358 mot_val[0+stride]= mot_val[2+stride]= 0;
|
yading@10
|
359 mot_val[1 ]= mot_val[3 ]=
|
yading@10
|
360 mot_val[1+stride]= mot_val[3+stride]= 0;
|
yading@10
|
361
|
yading@10
|
362 s->current_picture.mb_type[xy] = MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
|
yading@10
|
363 goto end;
|
yading@10
|
364 }
|
yading@10
|
365 cbpc = get_vlc2(&s->gb, ff_h263_inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
|
yading@10
|
366 }while(cbpc == 20);
|
yading@10
|
367
|
yading@10
|
368 if(cbpc & 4){
|
yading@10
|
369 s->current_picture.mb_type[xy] = MB_TYPE_INTRA;
|
yading@10
|
370 }else{
|
yading@10
|
371 get_vlc2(&s->gb, ff_h263_cbpy_vlc.table, CBPY_VLC_BITS, 1);
|
yading@10
|
372 if (cbpc & 8) {
|
yading@10
|
373 if(s->modified_quant){
|
yading@10
|
374 if(get_bits1(&s->gb)) skip_bits(&s->gb, 1);
|
yading@10
|
375 else skip_bits(&s->gb, 5);
|
yading@10
|
376 }else
|
yading@10
|
377 skip_bits(&s->gb, 2);
|
yading@10
|
378 }
|
yading@10
|
379
|
yading@10
|
380 if ((cbpc & 16) == 0) {
|
yading@10
|
381 s->current_picture.mb_type[xy] = MB_TYPE_16x16 | MB_TYPE_L0;
|
yading@10
|
382 /* 16x16 motion prediction */
|
yading@10
|
383 mot_val= ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
|
yading@10
|
384 if (s->umvplus)
|
yading@10
|
385 mx = h263p_decode_umotion(s, pred_x);
|
yading@10
|
386 else
|
yading@10
|
387 mx = ff_h263_decode_motion(s, pred_x, 1);
|
yading@10
|
388
|
yading@10
|
389 if (s->umvplus)
|
yading@10
|
390 my = h263p_decode_umotion(s, pred_y);
|
yading@10
|
391 else
|
yading@10
|
392 my = ff_h263_decode_motion(s, pred_y, 1);
|
yading@10
|
393
|
yading@10
|
394 mot_val[0 ]= mot_val[2 ]=
|
yading@10
|
395 mot_val[0+stride]= mot_val[2+stride]= mx;
|
yading@10
|
396 mot_val[1 ]= mot_val[3 ]=
|
yading@10
|
397 mot_val[1+stride]= mot_val[3+stride]= my;
|
yading@10
|
398 } else {
|
yading@10
|
399 s->current_picture.mb_type[xy] = MB_TYPE_8x8 | MB_TYPE_L0;
|
yading@10
|
400 for(i=0;i<4;i++) {
|
yading@10
|
401 mot_val = ff_h263_pred_motion(s, i, 0, &pred_x, &pred_y);
|
yading@10
|
402 if (s->umvplus)
|
yading@10
|
403 mx = h263p_decode_umotion(s, pred_x);
|
yading@10
|
404 else
|
yading@10
|
405 mx = ff_h263_decode_motion(s, pred_x, 1);
|
yading@10
|
406
|
yading@10
|
407 if (s->umvplus)
|
yading@10
|
408 my = h263p_decode_umotion(s, pred_y);
|
yading@10
|
409 else
|
yading@10
|
410 my = ff_h263_decode_motion(s, pred_y, 1);
|
yading@10
|
411 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
|
yading@10
|
412 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
|
yading@10
|
413 mot_val[0] = mx;
|
yading@10
|
414 mot_val[1] = my;
|
yading@10
|
415 }
|
yading@10
|
416 }
|
yading@10
|
417 }
|
yading@10
|
418 end:
|
yading@10
|
419
|
yading@10
|
420 for(i=0; i<4; i++)
|
yading@10
|
421 s->block_index[i]-= 2;
|
yading@10
|
422 for(i=4; i<6; i++)
|
yading@10
|
423 s->block_index[i]-= 1;
|
yading@10
|
424 s->mb_x--;
|
yading@10
|
425
|
yading@10
|
426 s->gb= gb;
|
yading@10
|
427 }
|
yading@10
|
428
|
yading@10
|
429 static void h263_decode_dquant(MpegEncContext *s){
|
yading@10
|
430 static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
|
yading@10
|
431
|
yading@10
|
432 if(s->modified_quant){
|
yading@10
|
433 if(get_bits1(&s->gb))
|
yading@10
|
434 s->qscale= ff_modified_quant_tab[get_bits1(&s->gb)][ s->qscale ];
|
yading@10
|
435 else
|
yading@10
|
436 s->qscale= get_bits(&s->gb, 5);
|
yading@10
|
437 }else
|
yading@10
|
438 s->qscale += quant_tab[get_bits(&s->gb, 2)];
|
yading@10
|
439 ff_set_qscale(s, s->qscale);
|
yading@10
|
440 }
|
yading@10
|
441
|
yading@10
|
442 static int h263_decode_block(MpegEncContext * s, int16_t * block,
|
yading@10
|
443 int n, int coded)
|
yading@10
|
444 {
|
yading@10
|
445 int code, level, i, j, last, run;
|
yading@10
|
446 RLTable *rl = &ff_h263_rl_inter;
|
yading@10
|
447 const uint8_t *scan_table;
|
yading@10
|
448 GetBitContext gb= s->gb;
|
yading@10
|
449
|
yading@10
|
450 scan_table = s->intra_scantable.permutated;
|
yading@10
|
451 if (s->h263_aic && s->mb_intra) {
|
yading@10
|
452 rl = &ff_rl_intra_aic;
|
yading@10
|
453 i = 0;
|
yading@10
|
454 if (s->ac_pred) {
|
yading@10
|
455 if (s->h263_aic_dir)
|
yading@10
|
456 scan_table = s->intra_v_scantable.permutated; /* left */
|
yading@10
|
457 else
|
yading@10
|
458 scan_table = s->intra_h_scantable.permutated; /* top */
|
yading@10
|
459 }
|
yading@10
|
460 } else if (s->mb_intra) {
|
yading@10
|
461 /* DC coef */
|
yading@10
|
462 if(s->codec_id == AV_CODEC_ID_RV10){
|
yading@10
|
463 #if CONFIG_RV10_DECODER
|
yading@10
|
464 if (s->rv10_version == 3 && s->pict_type == AV_PICTURE_TYPE_I) {
|
yading@10
|
465 int component, diff;
|
yading@10
|
466 component = (n <= 3 ? 0 : n - 4 + 1);
|
yading@10
|
467 level = s->last_dc[component];
|
yading@10
|
468 if (s->rv10_first_dc_coded[component]) {
|
yading@10
|
469 diff = ff_rv_decode_dc(s, n);
|
yading@10
|
470 if (diff == 0xffff)
|
yading@10
|
471 return -1;
|
yading@10
|
472 level += diff;
|
yading@10
|
473 level = level & 0xff; /* handle wrap round */
|
yading@10
|
474 s->last_dc[component] = level;
|
yading@10
|
475 } else {
|
yading@10
|
476 s->rv10_first_dc_coded[component] = 1;
|
yading@10
|
477 }
|
yading@10
|
478 } else {
|
yading@10
|
479 level = get_bits(&s->gb, 8);
|
yading@10
|
480 if (level == 255)
|
yading@10
|
481 level = 128;
|
yading@10
|
482 }
|
yading@10
|
483 #endif
|
yading@10
|
484 }else{
|
yading@10
|
485 level = get_bits(&s->gb, 8);
|
yading@10
|
486 if((level&0x7F) == 0){
|
yading@10
|
487 av_log(s->avctx, AV_LOG_ERROR, "illegal dc %d at %d %d\n", level, s->mb_x, s->mb_y);
|
yading@10
|
488 if(s->err_recognition & (AV_EF_BITSTREAM|AV_EF_COMPLIANT))
|
yading@10
|
489 return -1;
|
yading@10
|
490 }
|
yading@10
|
491 if (level == 255)
|
yading@10
|
492 level = 128;
|
yading@10
|
493 }
|
yading@10
|
494 block[0] = level;
|
yading@10
|
495 i = 1;
|
yading@10
|
496 } else {
|
yading@10
|
497 i = 0;
|
yading@10
|
498 }
|
yading@10
|
499 if (!coded) {
|
yading@10
|
500 if (s->mb_intra && s->h263_aic)
|
yading@10
|
501 goto not_coded;
|
yading@10
|
502 s->block_last_index[n] = i - 1;
|
yading@10
|
503 return 0;
|
yading@10
|
504 }
|
yading@10
|
505 retry:
|
yading@10
|
506 for(;;) {
|
yading@10
|
507 code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2);
|
yading@10
|
508 if (code < 0){
|
yading@10
|
509 av_log(s->avctx, AV_LOG_ERROR, "illegal ac vlc code at %dx%d\n", s->mb_x, s->mb_y);
|
yading@10
|
510 return -1;
|
yading@10
|
511 }
|
yading@10
|
512 if (code == rl->n) {
|
yading@10
|
513 /* escape */
|
yading@10
|
514 if (CONFIG_FLV_DECODER && s->h263_flv > 1) {
|
yading@10
|
515 ff_flv2_decode_ac_esc(&s->gb, &level, &run, &last);
|
yading@10
|
516 } else {
|
yading@10
|
517 last = get_bits1(&s->gb);
|
yading@10
|
518 run = get_bits(&s->gb, 6);
|
yading@10
|
519 level = (int8_t)get_bits(&s->gb, 8);
|
yading@10
|
520 if(level == -128){
|
yading@10
|
521 if (s->codec_id == AV_CODEC_ID_RV10) {
|
yading@10
|
522 /* XXX: should patch encoder too */
|
yading@10
|
523 level = get_sbits(&s->gb, 12);
|
yading@10
|
524 }else{
|
yading@10
|
525 level = get_bits(&s->gb, 5);
|
yading@10
|
526 level |= get_sbits(&s->gb, 6)<<5;
|
yading@10
|
527 }
|
yading@10
|
528 }
|
yading@10
|
529 }
|
yading@10
|
530 } else {
|
yading@10
|
531 run = rl->table_run[code];
|
yading@10
|
532 level = rl->table_level[code];
|
yading@10
|
533 last = code >= rl->last;
|
yading@10
|
534 if (get_bits1(&s->gb))
|
yading@10
|
535 level = -level;
|
yading@10
|
536 }
|
yading@10
|
537 i += run;
|
yading@10
|
538 if (i >= 64){
|
yading@10
|
539 if(s->alt_inter_vlc && rl == &ff_h263_rl_inter && !s->mb_intra){
|
yading@10
|
540 //Looks like a hack but no, it's the way it is supposed to work ...
|
yading@10
|
541 rl = &ff_rl_intra_aic;
|
yading@10
|
542 i = 0;
|
yading@10
|
543 s->gb= gb;
|
yading@10
|
544 s->dsp.clear_block(block);
|
yading@10
|
545 goto retry;
|
yading@10
|
546 }
|
yading@10
|
547 av_log(s->avctx, AV_LOG_ERROR, "run overflow at %dx%d i:%d\n", s->mb_x, s->mb_y, s->mb_intra);
|
yading@10
|
548 return -1;
|
yading@10
|
549 }
|
yading@10
|
550 j = scan_table[i];
|
yading@10
|
551 block[j] = level;
|
yading@10
|
552 if (last)
|
yading@10
|
553 break;
|
yading@10
|
554 i++;
|
yading@10
|
555 }
|
yading@10
|
556 not_coded:
|
yading@10
|
557 if (s->mb_intra && s->h263_aic) {
|
yading@10
|
558 ff_h263_pred_acdc(s, block, n);
|
yading@10
|
559 i = 63;
|
yading@10
|
560 }
|
yading@10
|
561 s->block_last_index[n] = i;
|
yading@10
|
562 return 0;
|
yading@10
|
563 }
|
yading@10
|
564
|
yading@10
|
565 static int h263_skip_b_part(MpegEncContext *s, int cbp)
|
yading@10
|
566 {
|
yading@10
|
567 LOCAL_ALIGNED_16(int16_t, dblock, [64]);
|
yading@10
|
568 int i, mbi;
|
yading@10
|
569 int bli[6];
|
yading@10
|
570
|
yading@10
|
571 /* we have to set s->mb_intra to zero to decode B-part of PB-frame correctly
|
yading@10
|
572 * but real value should be restored in order to be used later (in OBMC condition)
|
yading@10
|
573 */
|
yading@10
|
574 mbi = s->mb_intra;
|
yading@10
|
575 memcpy(bli, s->block_last_index, sizeof(bli));
|
yading@10
|
576 s->mb_intra = 0;
|
yading@10
|
577 for (i = 0; i < 6; i++) {
|
yading@10
|
578 if (h263_decode_block(s, dblock, i, cbp&32) < 0)
|
yading@10
|
579 return -1;
|
yading@10
|
580 cbp+=cbp;
|
yading@10
|
581 }
|
yading@10
|
582 s->mb_intra = mbi;
|
yading@10
|
583 memcpy(s->block_last_index, bli, sizeof(bli));
|
yading@10
|
584 return 0;
|
yading@10
|
585 }
|
yading@10
|
586
|
yading@10
|
587 static int h263_get_modb(GetBitContext *gb, int pb_frame, int *cbpb)
|
yading@10
|
588 {
|
yading@10
|
589 int c, mv = 1;
|
yading@10
|
590
|
yading@10
|
591 if (pb_frame < 3) { // h.263 Annex G and i263 PB-frame
|
yading@10
|
592 c = get_bits1(gb);
|
yading@10
|
593 if (pb_frame == 2 && c)
|
yading@10
|
594 mv = !get_bits1(gb);
|
yading@10
|
595 } else { // h.263 Annex M improved PB-frame
|
yading@10
|
596 mv = get_unary(gb, 0, 4) + 1;
|
yading@10
|
597 c = mv & 1;
|
yading@10
|
598 mv = !!(mv & 2);
|
yading@10
|
599 }
|
yading@10
|
600 if(c)
|
yading@10
|
601 *cbpb = get_bits(gb, 6);
|
yading@10
|
602 return mv;
|
yading@10
|
603 }
|
yading@10
|
604
|
yading@10
|
605 int ff_h263_decode_mb(MpegEncContext *s,
|
yading@10
|
606 int16_t block[6][64])
|
yading@10
|
607 {
|
yading@10
|
608 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
|
yading@10
|
609 int16_t *mot_val;
|
yading@10
|
610 const int xy= s->mb_x + s->mb_y * s->mb_stride;
|
yading@10
|
611 int cbpb = 0, pb_mv_count = 0;
|
yading@10
|
612
|
yading@10
|
613 av_assert2(!s->h263_pred);
|
yading@10
|
614
|
yading@10
|
615 if (s->pict_type == AV_PICTURE_TYPE_P) {
|
yading@10
|
616 do{
|
yading@10
|
617 if (get_bits1(&s->gb)) {
|
yading@10
|
618 /* skip mb */
|
yading@10
|
619 s->mb_intra = 0;
|
yading@10
|
620 for(i=0;i<6;i++)
|
yading@10
|
621 s->block_last_index[i] = -1;
|
yading@10
|
622 s->mv_dir = MV_DIR_FORWARD;
|
yading@10
|
623 s->mv_type = MV_TYPE_16X16;
|
yading@10
|
624 s->current_picture.mb_type[xy] = MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
|
yading@10
|
625 s->mv[0][0][0] = 0;
|
yading@10
|
626 s->mv[0][0][1] = 0;
|
yading@10
|
627 s->mb_skipped = !(s->obmc | s->loop_filter);
|
yading@10
|
628 goto end;
|
yading@10
|
629 }
|
yading@10
|
630 cbpc = get_vlc2(&s->gb, ff_h263_inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
|
yading@10
|
631 if (cbpc < 0){
|
yading@10
|
632 av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
|
yading@10
|
633 return -1;
|
yading@10
|
634 }
|
yading@10
|
635 }while(cbpc == 20);
|
yading@10
|
636
|
yading@10
|
637 s->dsp.clear_blocks(s->block[0]);
|
yading@10
|
638
|
yading@10
|
639 dquant = cbpc & 8;
|
yading@10
|
640 s->mb_intra = ((cbpc & 4) != 0);
|
yading@10
|
641 if (s->mb_intra) goto intra;
|
yading@10
|
642
|
yading@10
|
643 if(s->pb_frame && get_bits1(&s->gb))
|
yading@10
|
644 pb_mv_count = h263_get_modb(&s->gb, s->pb_frame, &cbpb);
|
yading@10
|
645 cbpy = get_vlc2(&s->gb, ff_h263_cbpy_vlc.table, CBPY_VLC_BITS, 1);
|
yading@10
|
646
|
yading@10
|
647 if(s->alt_inter_vlc==0 || (cbpc & 3)!=3)
|
yading@10
|
648 cbpy ^= 0xF;
|
yading@10
|
649
|
yading@10
|
650 cbp = (cbpc & 3) | (cbpy << 2);
|
yading@10
|
651 if (dquant) {
|
yading@10
|
652 h263_decode_dquant(s);
|
yading@10
|
653 }
|
yading@10
|
654
|
yading@10
|
655 s->mv_dir = MV_DIR_FORWARD;
|
yading@10
|
656 if ((cbpc & 16) == 0) {
|
yading@10
|
657 s->current_picture.mb_type[xy] = MB_TYPE_16x16 | MB_TYPE_L0;
|
yading@10
|
658 /* 16x16 motion prediction */
|
yading@10
|
659 s->mv_type = MV_TYPE_16X16;
|
yading@10
|
660 ff_h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
|
yading@10
|
661 if (s->umvplus)
|
yading@10
|
662 mx = h263p_decode_umotion(s, pred_x);
|
yading@10
|
663 else
|
yading@10
|
664 mx = ff_h263_decode_motion(s, pred_x, 1);
|
yading@10
|
665
|
yading@10
|
666 if (mx >= 0xffff)
|
yading@10
|
667 return -1;
|
yading@10
|
668
|
yading@10
|
669 if (s->umvplus)
|
yading@10
|
670 my = h263p_decode_umotion(s, pred_y);
|
yading@10
|
671 else
|
yading@10
|
672 my = ff_h263_decode_motion(s, pred_y, 1);
|
yading@10
|
673
|
yading@10
|
674 if (my >= 0xffff)
|
yading@10
|
675 return -1;
|
yading@10
|
676 s->mv[0][0][0] = mx;
|
yading@10
|
677 s->mv[0][0][1] = my;
|
yading@10
|
678
|
yading@10
|
679 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
|
yading@10
|
680 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
|
yading@10
|
681 } else {
|
yading@10
|
682 s->current_picture.mb_type[xy] = MB_TYPE_8x8 | MB_TYPE_L0;
|
yading@10
|
683 s->mv_type = MV_TYPE_8X8;
|
yading@10
|
684 for(i=0;i<4;i++) {
|
yading@10
|
685 mot_val = ff_h263_pred_motion(s, i, 0, &pred_x, &pred_y);
|
yading@10
|
686 if (s->umvplus)
|
yading@10
|
687 mx = h263p_decode_umotion(s, pred_x);
|
yading@10
|
688 else
|
yading@10
|
689 mx = ff_h263_decode_motion(s, pred_x, 1);
|
yading@10
|
690 if (mx >= 0xffff)
|
yading@10
|
691 return -1;
|
yading@10
|
692
|
yading@10
|
693 if (s->umvplus)
|
yading@10
|
694 my = h263p_decode_umotion(s, pred_y);
|
yading@10
|
695 else
|
yading@10
|
696 my = ff_h263_decode_motion(s, pred_y, 1);
|
yading@10
|
697 if (my >= 0xffff)
|
yading@10
|
698 return -1;
|
yading@10
|
699 s->mv[0][i][0] = mx;
|
yading@10
|
700 s->mv[0][i][1] = my;
|
yading@10
|
701 if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
|
yading@10
|
702 skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
|
yading@10
|
703 mot_val[0] = mx;
|
yading@10
|
704 mot_val[1] = my;
|
yading@10
|
705 }
|
yading@10
|
706 }
|
yading@10
|
707 } else if(s->pict_type==AV_PICTURE_TYPE_B) {
|
yading@10
|
708 int mb_type;
|
yading@10
|
709 const int stride= s->b8_stride;
|
yading@10
|
710 int16_t *mot_val0 = s->current_picture.motion_val[0][2 * (s->mb_x + s->mb_y * stride)];
|
yading@10
|
711 int16_t *mot_val1 = s->current_picture.motion_val[1][2 * (s->mb_x + s->mb_y * stride)];
|
yading@10
|
712 // const int mv_xy= s->mb_x + 1 + s->mb_y * s->mb_stride;
|
yading@10
|
713
|
yading@10
|
714 //FIXME ugly
|
yading@10
|
715 mot_val0[0 ]= mot_val0[2 ]= mot_val0[0+2*stride]= mot_val0[2+2*stride]=
|
yading@10
|
716 mot_val0[1 ]= mot_val0[3 ]= mot_val0[1+2*stride]= mot_val0[3+2*stride]=
|
yading@10
|
717 mot_val1[0 ]= mot_val1[2 ]= mot_val1[0+2*stride]= mot_val1[2+2*stride]=
|
yading@10
|
718 mot_val1[1 ]= mot_val1[3 ]= mot_val1[1+2*stride]= mot_val1[3+2*stride]= 0;
|
yading@10
|
719
|
yading@10
|
720 do{
|
yading@10
|
721 mb_type= get_vlc2(&s->gb, h263_mbtype_b_vlc.table, H263_MBTYPE_B_VLC_BITS, 2);
|
yading@10
|
722 if (mb_type < 0){
|
yading@10
|
723 av_log(s->avctx, AV_LOG_ERROR, "b mb_type damaged at %d %d\n", s->mb_x, s->mb_y);
|
yading@10
|
724 return -1;
|
yading@10
|
725 }
|
yading@10
|
726
|
yading@10
|
727 mb_type= h263_mb_type_b_map[ mb_type ];
|
yading@10
|
728 }while(!mb_type);
|
yading@10
|
729
|
yading@10
|
730 s->mb_intra = IS_INTRA(mb_type);
|
yading@10
|
731 if(HAS_CBP(mb_type)){
|
yading@10
|
732 s->dsp.clear_blocks(s->block[0]);
|
yading@10
|
733 cbpc = get_vlc2(&s->gb, cbpc_b_vlc.table, CBPC_B_VLC_BITS, 1);
|
yading@10
|
734 if(s->mb_intra){
|
yading@10
|
735 dquant = IS_QUANT(mb_type);
|
yading@10
|
736 goto intra;
|
yading@10
|
737 }
|
yading@10
|
738
|
yading@10
|
739 cbpy = get_vlc2(&s->gb, ff_h263_cbpy_vlc.table, CBPY_VLC_BITS, 1);
|
yading@10
|
740
|
yading@10
|
741 if (cbpy < 0){
|
yading@10
|
742 av_log(s->avctx, AV_LOG_ERROR, "b cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
|
yading@10
|
743 return -1;
|
yading@10
|
744 }
|
yading@10
|
745
|
yading@10
|
746 if(s->alt_inter_vlc==0 || (cbpc & 3)!=3)
|
yading@10
|
747 cbpy ^= 0xF;
|
yading@10
|
748
|
yading@10
|
749 cbp = (cbpc & 3) | (cbpy << 2);
|
yading@10
|
750 }else
|
yading@10
|
751 cbp=0;
|
yading@10
|
752
|
yading@10
|
753 av_assert2(!s->mb_intra);
|
yading@10
|
754
|
yading@10
|
755 if(IS_QUANT(mb_type)){
|
yading@10
|
756 h263_decode_dquant(s);
|
yading@10
|
757 }
|
yading@10
|
758
|
yading@10
|
759 if(IS_DIRECT(mb_type)){
|
yading@10
|
760 s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
|
yading@10
|
761 mb_type |= ff_mpeg4_set_direct_mv(s, 0, 0);
|
yading@10
|
762 }else{
|
yading@10
|
763 s->mv_dir = 0;
|
yading@10
|
764 s->mv_type= MV_TYPE_16X16;
|
yading@10
|
765 //FIXME UMV
|
yading@10
|
766
|
yading@10
|
767 if(USES_LIST(mb_type, 0)){
|
yading@10
|
768 int16_t *mot_val= ff_h263_pred_motion(s, 0, 0, &mx, &my);
|
yading@10
|
769 s->mv_dir = MV_DIR_FORWARD;
|
yading@10
|
770
|
yading@10
|
771 mx = ff_h263_decode_motion(s, mx, 1);
|
yading@10
|
772 my = ff_h263_decode_motion(s, my, 1);
|
yading@10
|
773
|
yading@10
|
774 s->mv[0][0][0] = mx;
|
yading@10
|
775 s->mv[0][0][1] = my;
|
yading@10
|
776 mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx;
|
yading@10
|
777 mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my;
|
yading@10
|
778 }
|
yading@10
|
779
|
yading@10
|
780 if(USES_LIST(mb_type, 1)){
|
yading@10
|
781 int16_t *mot_val= ff_h263_pred_motion(s, 0, 1, &mx, &my);
|
yading@10
|
782 s->mv_dir |= MV_DIR_BACKWARD;
|
yading@10
|
783
|
yading@10
|
784 mx = ff_h263_decode_motion(s, mx, 1);
|
yading@10
|
785 my = ff_h263_decode_motion(s, my, 1);
|
yading@10
|
786
|
yading@10
|
787 s->mv[1][0][0] = mx;
|
yading@10
|
788 s->mv[1][0][1] = my;
|
yading@10
|
789 mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx;
|
yading@10
|
790 mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my;
|
yading@10
|
791 }
|
yading@10
|
792 }
|
yading@10
|
793
|
yading@10
|
794 s->current_picture.mb_type[xy] = mb_type;
|
yading@10
|
795 } else { /* I-Frame */
|
yading@10
|
796 do{
|
yading@10
|
797 cbpc = get_vlc2(&s->gb, ff_h263_intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
|
yading@10
|
798 if (cbpc < 0){
|
yading@10
|
799 av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
|
yading@10
|
800 return -1;
|
yading@10
|
801 }
|
yading@10
|
802 }while(cbpc == 8);
|
yading@10
|
803
|
yading@10
|
804 s->dsp.clear_blocks(s->block[0]);
|
yading@10
|
805
|
yading@10
|
806 dquant = cbpc & 4;
|
yading@10
|
807 s->mb_intra = 1;
|
yading@10
|
808 intra:
|
yading@10
|
809 s->current_picture.mb_type[xy] = MB_TYPE_INTRA;
|
yading@10
|
810 if (s->h263_aic) {
|
yading@10
|
811 s->ac_pred = get_bits1(&s->gb);
|
yading@10
|
812 if(s->ac_pred){
|
yading@10
|
813 s->current_picture.mb_type[xy] = MB_TYPE_INTRA | MB_TYPE_ACPRED;
|
yading@10
|
814
|
yading@10
|
815 s->h263_aic_dir = get_bits1(&s->gb);
|
yading@10
|
816 }
|
yading@10
|
817 }else
|
yading@10
|
818 s->ac_pred = 0;
|
yading@10
|
819
|
yading@10
|
820 if(s->pb_frame && get_bits1(&s->gb))
|
yading@10
|
821 pb_mv_count = h263_get_modb(&s->gb, s->pb_frame, &cbpb);
|
yading@10
|
822 cbpy = get_vlc2(&s->gb, ff_h263_cbpy_vlc.table, CBPY_VLC_BITS, 1);
|
yading@10
|
823 if(cbpy<0){
|
yading@10
|
824 av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
|
yading@10
|
825 return -1;
|
yading@10
|
826 }
|
yading@10
|
827 cbp = (cbpc & 3) | (cbpy << 2);
|
yading@10
|
828 if (dquant) {
|
yading@10
|
829 h263_decode_dquant(s);
|
yading@10
|
830 }
|
yading@10
|
831
|
yading@10
|
832 pb_mv_count += !!s->pb_frame;
|
yading@10
|
833 }
|
yading@10
|
834
|
yading@10
|
835 while(pb_mv_count--){
|
yading@10
|
836 ff_h263_decode_motion(s, 0, 1);
|
yading@10
|
837 ff_h263_decode_motion(s, 0, 1);
|
yading@10
|
838 }
|
yading@10
|
839
|
yading@10
|
840 /* decode each block */
|
yading@10
|
841 for (i = 0; i < 6; i++) {
|
yading@10
|
842 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
|
yading@10
|
843 return -1;
|
yading@10
|
844 cbp+=cbp;
|
yading@10
|
845 }
|
yading@10
|
846
|
yading@10
|
847 if(s->pb_frame && h263_skip_b_part(s, cbpb) < 0)
|
yading@10
|
848 return -1;
|
yading@10
|
849 if(s->obmc && !s->mb_intra){
|
yading@10
|
850 if(s->pict_type == AV_PICTURE_TYPE_P && s->mb_x+1<s->mb_width && s->mb_num_left != 1)
|
yading@10
|
851 preview_obmc(s);
|
yading@10
|
852 }
|
yading@10
|
853 end:
|
yading@10
|
854
|
yading@10
|
855 /* per-MB end of slice check */
|
yading@10
|
856 {
|
yading@10
|
857 int v= show_bits(&s->gb, 16);
|
yading@10
|
858
|
yading@10
|
859 if (get_bits_left(&s->gb) < 16) {
|
yading@10
|
860 v >>= 16 - get_bits_left(&s->gb);
|
yading@10
|
861 }
|
yading@10
|
862
|
yading@10
|
863 if(v==0)
|
yading@10
|
864 return SLICE_END;
|
yading@10
|
865 }
|
yading@10
|
866
|
yading@10
|
867 return SLICE_OK;
|
yading@10
|
868 }
|
yading@10
|
869
|
yading@10
|
870 /* most is hardcoded. should extend to handle all h263 streams */
|
yading@10
|
871 int ff_h263_decode_picture_header(MpegEncContext *s)
|
yading@10
|
872 {
|
yading@10
|
873 int format, width, height, i;
|
yading@10
|
874 uint32_t startcode;
|
yading@10
|
875
|
yading@10
|
876 align_get_bits(&s->gb);
|
yading@10
|
877
|
yading@10
|
878 startcode= get_bits(&s->gb, 22-8);
|
yading@10
|
879
|
yading@10
|
880 for(i= get_bits_left(&s->gb); i>24; i-=8) {
|
yading@10
|
881 startcode = ((startcode << 8) | get_bits(&s->gb, 8)) & 0x003FFFFF;
|
yading@10
|
882
|
yading@10
|
883 if(startcode == 0x20)
|
yading@10
|
884 break;
|
yading@10
|
885 }
|
yading@10
|
886
|
yading@10
|
887 if (startcode != 0x20) {
|
yading@10
|
888 av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
|
yading@10
|
889 return -1;
|
yading@10
|
890 }
|
yading@10
|
891 /* temporal reference */
|
yading@10
|
892 i = get_bits(&s->gb, 8); /* picture timestamp */
|
yading@10
|
893 if( (s->picture_number&~0xFF)+i < s->picture_number)
|
yading@10
|
894 i+= 256;
|
yading@10
|
895 s->current_picture_ptr->f.pts =
|
yading@10
|
896 s->picture_number= (s->picture_number&~0xFF) + i;
|
yading@10
|
897
|
yading@10
|
898 /* PTYPE starts here */
|
yading@10
|
899 if (get_bits1(&s->gb) != 1) {
|
yading@10
|
900 /* marker */
|
yading@10
|
901 av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n");
|
yading@10
|
902 return -1;
|
yading@10
|
903 }
|
yading@10
|
904 if (get_bits1(&s->gb) != 0) {
|
yading@10
|
905 av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n");
|
yading@10
|
906 return -1; /* h263 id */
|
yading@10
|
907 }
|
yading@10
|
908 skip_bits1(&s->gb); /* split screen off */
|
yading@10
|
909 skip_bits1(&s->gb); /* camera off */
|
yading@10
|
910 skip_bits1(&s->gb); /* freeze picture release off */
|
yading@10
|
911
|
yading@10
|
912 format = get_bits(&s->gb, 3);
|
yading@10
|
913 /*
|
yading@10
|
914 0 forbidden
|
yading@10
|
915 1 sub-QCIF
|
yading@10
|
916 10 QCIF
|
yading@10
|
917 7 extended PTYPE (PLUSPTYPE)
|
yading@10
|
918 */
|
yading@10
|
919
|
yading@10
|
920 if (format != 7 && format != 6) {
|
yading@10
|
921 s->h263_plus = 0;
|
yading@10
|
922 /* H.263v1 */
|
yading@10
|
923 width = ff_h263_format[format][0];
|
yading@10
|
924 height = ff_h263_format[format][1];
|
yading@10
|
925 if (!width)
|
yading@10
|
926 return -1;
|
yading@10
|
927
|
yading@10
|
928 s->pict_type = AV_PICTURE_TYPE_I + get_bits1(&s->gb);
|
yading@10
|
929
|
yading@10
|
930 s->h263_long_vectors = get_bits1(&s->gb);
|
yading@10
|
931
|
yading@10
|
932 if (get_bits1(&s->gb) != 0) {
|
yading@10
|
933 av_log(s->avctx, AV_LOG_ERROR, "H263 SAC not supported\n");
|
yading@10
|
934 return -1; /* SAC: off */
|
yading@10
|
935 }
|
yading@10
|
936 s->obmc= get_bits1(&s->gb); /* Advanced prediction mode */
|
yading@10
|
937 s->unrestricted_mv = s->h263_long_vectors || s->obmc;
|
yading@10
|
938
|
yading@10
|
939 s->pb_frame = get_bits1(&s->gb);
|
yading@10
|
940 s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
|
yading@10
|
941 skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
|
yading@10
|
942
|
yading@10
|
943 s->width = width;
|
yading@10
|
944 s->height = height;
|
yading@10
|
945 s->avctx->sample_aspect_ratio= (AVRational){12,11};
|
yading@10
|
946 s->avctx->time_base= (AVRational){1001, 30000};
|
yading@10
|
947 } else {
|
yading@10
|
948 int ufep;
|
yading@10
|
949
|
yading@10
|
950 /* H.263v2 */
|
yading@10
|
951 s->h263_plus = 1;
|
yading@10
|
952 ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */
|
yading@10
|
953
|
yading@10
|
954 /* ufep other than 0 and 1 are reserved */
|
yading@10
|
955 if (ufep == 1) {
|
yading@10
|
956 /* OPPTYPE */
|
yading@10
|
957 format = get_bits(&s->gb, 3);
|
yading@10
|
958 av_dlog(s->avctx, "ufep=1, format: %d\n", format);
|
yading@10
|
959 s->custom_pcf= get_bits1(&s->gb);
|
yading@10
|
960 s->umvplus = get_bits1(&s->gb); /* Unrestricted Motion Vector */
|
yading@10
|
961 if (get_bits1(&s->gb) != 0) {
|
yading@10
|
962 av_log(s->avctx, AV_LOG_ERROR, "Syntax-based Arithmetic Coding (SAC) not supported\n");
|
yading@10
|
963 }
|
yading@10
|
964 s->obmc= get_bits1(&s->gb); /* Advanced prediction mode */
|
yading@10
|
965 s->h263_aic = get_bits1(&s->gb); /* Advanced Intra Coding (AIC) */
|
yading@10
|
966 s->loop_filter= get_bits1(&s->gb);
|
yading@10
|
967 s->unrestricted_mv = s->umvplus || s->obmc || s->loop_filter;
|
yading@10
|
968 if(s->avctx->lowres)
|
yading@10
|
969 s->loop_filter = 0;
|
yading@10
|
970
|
yading@10
|
971 s->h263_slice_structured= get_bits1(&s->gb);
|
yading@10
|
972 if (get_bits1(&s->gb) != 0) {
|
yading@10
|
973 av_log(s->avctx, AV_LOG_ERROR, "Reference Picture Selection not supported\n");
|
yading@10
|
974 }
|
yading@10
|
975 if (get_bits1(&s->gb) != 0) {
|
yading@10
|
976 av_log(s->avctx, AV_LOG_ERROR, "Independent Segment Decoding not supported\n");
|
yading@10
|
977 }
|
yading@10
|
978 s->alt_inter_vlc= get_bits1(&s->gb);
|
yading@10
|
979 s->modified_quant= get_bits1(&s->gb);
|
yading@10
|
980 if(s->modified_quant)
|
yading@10
|
981 s->chroma_qscale_table= ff_h263_chroma_qscale_table;
|
yading@10
|
982
|
yading@10
|
983 skip_bits(&s->gb, 1); /* Prevent start code emulation */
|
yading@10
|
984
|
yading@10
|
985 skip_bits(&s->gb, 3); /* Reserved */
|
yading@10
|
986 } else if (ufep != 0) {
|
yading@10
|
987 av_log(s->avctx, AV_LOG_ERROR, "Bad UFEP type (%d)\n", ufep);
|
yading@10
|
988 return -1;
|
yading@10
|
989 }
|
yading@10
|
990
|
yading@10
|
991 /* MPPTYPE */
|
yading@10
|
992 s->pict_type = get_bits(&s->gb, 3);
|
yading@10
|
993 switch(s->pict_type){
|
yading@10
|
994 case 0: s->pict_type= AV_PICTURE_TYPE_I;break;
|
yading@10
|
995 case 1: s->pict_type= AV_PICTURE_TYPE_P;break;
|
yading@10
|
996 case 2: s->pict_type= AV_PICTURE_TYPE_P;s->pb_frame = 3;break;
|
yading@10
|
997 case 3: s->pict_type= AV_PICTURE_TYPE_B;break;
|
yading@10
|
998 case 7: s->pict_type= AV_PICTURE_TYPE_I;break; //ZYGO
|
yading@10
|
999 default:
|
yading@10
|
1000 return -1;
|
yading@10
|
1001 }
|
yading@10
|
1002 skip_bits(&s->gb, 2);
|
yading@10
|
1003 s->no_rounding = get_bits1(&s->gb);
|
yading@10
|
1004 skip_bits(&s->gb, 4);
|
yading@10
|
1005
|
yading@10
|
1006 /* Get the picture dimensions */
|
yading@10
|
1007 if (ufep) {
|
yading@10
|
1008 if (format == 6) {
|
yading@10
|
1009 /* Custom Picture Format (CPFMT) */
|
yading@10
|
1010 s->aspect_ratio_info = get_bits(&s->gb, 4);
|
yading@10
|
1011 av_dlog(s->avctx, "aspect: %d\n", s->aspect_ratio_info);
|
yading@10
|
1012 /* aspect ratios:
|
yading@10
|
1013 0 - forbidden
|
yading@10
|
1014 1 - 1:1
|
yading@10
|
1015 2 - 12:11 (CIF 4:3)
|
yading@10
|
1016 3 - 10:11 (525-type 4:3)
|
yading@10
|
1017 4 - 16:11 (CIF 16:9)
|
yading@10
|
1018 5 - 40:33 (525-type 16:9)
|
yading@10
|
1019 6-14 - reserved
|
yading@10
|
1020 */
|
yading@10
|
1021 width = (get_bits(&s->gb, 9) + 1) * 4;
|
yading@10
|
1022 skip_bits1(&s->gb);
|
yading@10
|
1023 height = get_bits(&s->gb, 9) * 4;
|
yading@10
|
1024 av_dlog(s->avctx, "\nH.263+ Custom picture: %dx%d\n",width,height);
|
yading@10
|
1025 if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) {
|
yading@10
|
1026 /* aspected dimensions */
|
yading@10
|
1027 s->avctx->sample_aspect_ratio.num= get_bits(&s->gb, 8);
|
yading@10
|
1028 s->avctx->sample_aspect_ratio.den= get_bits(&s->gb, 8);
|
yading@10
|
1029 }else{
|
yading@10
|
1030 s->avctx->sample_aspect_ratio= ff_h263_pixel_aspect[s->aspect_ratio_info];
|
yading@10
|
1031 }
|
yading@10
|
1032 } else {
|
yading@10
|
1033 width = ff_h263_format[format][0];
|
yading@10
|
1034 height = ff_h263_format[format][1];
|
yading@10
|
1035 s->avctx->sample_aspect_ratio= (AVRational){12,11};
|
yading@10
|
1036 }
|
yading@10
|
1037 if ((width == 0) || (height == 0))
|
yading@10
|
1038 return -1;
|
yading@10
|
1039 s->width = width;
|
yading@10
|
1040 s->height = height;
|
yading@10
|
1041
|
yading@10
|
1042 if(s->custom_pcf){
|
yading@10
|
1043 int gcd;
|
yading@10
|
1044 s->avctx->time_base.den= 1800000;
|
yading@10
|
1045 s->avctx->time_base.num= 1000 + get_bits1(&s->gb);
|
yading@10
|
1046 s->avctx->time_base.num*= get_bits(&s->gb, 7);
|
yading@10
|
1047 if(s->avctx->time_base.num == 0){
|
yading@10
|
1048 av_log(s, AV_LOG_ERROR, "zero framerate\n");
|
yading@10
|
1049 return -1;
|
yading@10
|
1050 }
|
yading@10
|
1051 gcd= av_gcd(s->avctx->time_base.den, s->avctx->time_base.num);
|
yading@10
|
1052 s->avctx->time_base.den /= gcd;
|
yading@10
|
1053 s->avctx->time_base.num /= gcd;
|
yading@10
|
1054 }else{
|
yading@10
|
1055 s->avctx->time_base= (AVRational){1001, 30000};
|
yading@10
|
1056 }
|
yading@10
|
1057 }
|
yading@10
|
1058
|
yading@10
|
1059 if(s->custom_pcf){
|
yading@10
|
1060 skip_bits(&s->gb, 2); //extended Temporal reference
|
yading@10
|
1061 }
|
yading@10
|
1062
|
yading@10
|
1063 if (ufep) {
|
yading@10
|
1064 if (s->umvplus) {
|
yading@10
|
1065 if(get_bits1(&s->gb)==0) /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
|
yading@10
|
1066 skip_bits1(&s->gb);
|
yading@10
|
1067 }
|
yading@10
|
1068 if(s->h263_slice_structured){
|
yading@10
|
1069 if (get_bits1(&s->gb) != 0) {
|
yading@10
|
1070 av_log(s->avctx, AV_LOG_ERROR, "rectangular slices not supported\n");
|
yading@10
|
1071 }
|
yading@10
|
1072 if (get_bits1(&s->gb) != 0) {
|
yading@10
|
1073 av_log(s->avctx, AV_LOG_ERROR, "unordered slices not supported\n");
|
yading@10
|
1074 }
|
yading@10
|
1075 }
|
yading@10
|
1076 }
|
yading@10
|
1077
|
yading@10
|
1078 s->qscale = get_bits(&s->gb, 5);
|
yading@10
|
1079 }
|
yading@10
|
1080
|
yading@10
|
1081 if (s->width == 0 || s->height == 0) {
|
yading@10
|
1082 av_log(s->avctx, AV_LOG_ERROR, "dimensions 0\n");
|
yading@10
|
1083 return -1;
|
yading@10
|
1084 }
|
yading@10
|
1085 s->mb_width = (s->width + 15) / 16;
|
yading@10
|
1086 s->mb_height = (s->height + 15) / 16;
|
yading@10
|
1087 s->mb_num = s->mb_width * s->mb_height;
|
yading@10
|
1088
|
yading@10
|
1089 if (s->pb_frame) {
|
yading@10
|
1090 skip_bits(&s->gb, 3); /* Temporal reference for B-pictures */
|
yading@10
|
1091 if (s->custom_pcf)
|
yading@10
|
1092 skip_bits(&s->gb, 2); //extended Temporal reference
|
yading@10
|
1093 skip_bits(&s->gb, 2); /* Quantization information for B-pictures */
|
yading@10
|
1094 }
|
yading@10
|
1095
|
yading@10
|
1096 if (s->pict_type!=AV_PICTURE_TYPE_B) {
|
yading@10
|
1097 s->time = s->picture_number;
|
yading@10
|
1098 s->pp_time = s->time - s->last_non_b_time;
|
yading@10
|
1099 s->last_non_b_time = s->time;
|
yading@10
|
1100 }else{
|
yading@10
|
1101 s->time = s->picture_number;
|
yading@10
|
1102 s->pb_time = s->pp_time - (s->last_non_b_time - s->time);
|
yading@10
|
1103 if (s->pp_time <=s->pb_time ||
|
yading@10
|
1104 s->pp_time <= s->pp_time - s->pb_time ||
|
yading@10
|
1105 s->pp_time <= 0){
|
yading@10
|
1106 s->pp_time = 2;
|
yading@10
|
1107 s->pb_time = 1;
|
yading@10
|
1108 }
|
yading@10
|
1109 ff_mpeg4_init_direct_mv(s);
|
yading@10
|
1110 }
|
yading@10
|
1111
|
yading@10
|
1112 /* PEI */
|
yading@10
|
1113 while (get_bits1(&s->gb) != 0) {
|
yading@10
|
1114 skip_bits(&s->gb, 8);
|
yading@10
|
1115 }
|
yading@10
|
1116
|
yading@10
|
1117 if(s->h263_slice_structured){
|
yading@10
|
1118 if (get_bits1(&s->gb) != 1) {
|
yading@10
|
1119 av_log(s->avctx, AV_LOG_ERROR, "SEPB1 marker missing\n");
|
yading@10
|
1120 return -1;
|
yading@10
|
1121 }
|
yading@10
|
1122
|
yading@10
|
1123 ff_h263_decode_mba(s);
|
yading@10
|
1124
|
yading@10
|
1125 if (get_bits1(&s->gb) != 1) {
|
yading@10
|
1126 av_log(s->avctx, AV_LOG_ERROR, "SEPB2 marker missing\n");
|
yading@10
|
1127 return -1;
|
yading@10
|
1128 }
|
yading@10
|
1129 }
|
yading@10
|
1130 s->f_code = 1;
|
yading@10
|
1131
|
yading@10
|
1132 if(s->h263_aic){
|
yading@10
|
1133 s->y_dc_scale_table=
|
yading@10
|
1134 s->c_dc_scale_table= ff_aic_dc_scale_table;
|
yading@10
|
1135 }else{
|
yading@10
|
1136 s->y_dc_scale_table=
|
yading@10
|
1137 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
|
yading@10
|
1138 }
|
yading@10
|
1139
|
yading@10
|
1140 ff_h263_show_pict_info(s);
|
yading@10
|
1141 if (s->pict_type == AV_PICTURE_TYPE_I && s->codec_tag == AV_RL32("ZYGO") && get_bits_left(&s->gb) >= 85 + 13*3*16 + 50){
|
yading@10
|
1142 int i,j;
|
yading@10
|
1143 for(i=0; i<85; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
|
yading@10
|
1144 av_log(s->avctx, AV_LOG_DEBUG, "\n");
|
yading@10
|
1145 for(i=0; i<13; i++){
|
yading@10
|
1146 for(j=0; j<3; j++){
|
yading@10
|
1147 int v= get_bits(&s->gb, 8);
|
yading@10
|
1148 v |= get_sbits(&s->gb, 8)<<8;
|
yading@10
|
1149 av_log(s->avctx, AV_LOG_DEBUG, " %5d", v);
|
yading@10
|
1150 }
|
yading@10
|
1151 av_log(s->avctx, AV_LOG_DEBUG, "\n");
|
yading@10
|
1152 }
|
yading@10
|
1153 for(i=0; i<50; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
|
yading@10
|
1154 }
|
yading@10
|
1155
|
yading@10
|
1156 return 0;
|
yading@10
|
1157 }
|