1 | /*
|
---|
2 | * H.263 decoder
|
---|
3 | * Copyright (c) 2001 Fabrice Bellard.
|
---|
4 | * Copyright (c) 2002-2004 Michael Niedermayer <[email protected]>
|
---|
5 | *
|
---|
6 | * This library is free software; you can redistribute it and/or
|
---|
7 | * modify it under the terms of the GNU Lesser General Public
|
---|
8 | * License as published by the Free Software Foundation; either
|
---|
9 | * version 2 of the License, or (at your option) any later version.
|
---|
10 | *
|
---|
11 | * This library is distributed in the hope that it will be useful,
|
---|
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
---|
14 | * Lesser General Public License for more details.
|
---|
15 | *
|
---|
16 | * You should have received a copy of the GNU Lesser General Public
|
---|
17 | * License along with this library; if not, write to the Free Software
|
---|
18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
---|
19 | */
|
---|
20 |
|
---|
21 | /**
|
---|
22 | * @file h263dec.c
|
---|
23 | * H.263 decoder.
|
---|
24 | */
|
---|
25 |
|
---|
26 | #include "avcodec.h"
|
---|
27 | #include "dsputil.h"
|
---|
28 | #include "mpegvideo.h"
|
---|
29 |
|
---|
30 | //#define DEBUG
|
---|
31 | //#define PRINT_FRAME_TIME
|
---|
32 |
|
---|
33 | int ff_h263_decode_init(AVCodecContext *avctx)
|
---|
34 | {
|
---|
35 | MpegEncContext *s = avctx->priv_data;
|
---|
36 |
|
---|
37 | s->avctx = avctx;
|
---|
38 | s->out_format = FMT_H263;
|
---|
39 |
|
---|
40 | s->width = avctx->coded_width;
|
---|
41 | s->height = avctx->coded_height;
|
---|
42 | s->workaround_bugs= avctx->workaround_bugs;
|
---|
43 |
|
---|
44 | // set defaults
|
---|
45 | MPV_decode_defaults(s);
|
---|
46 | s->quant_precision=5;
|
---|
47 | s->decode_mb= ff_h263_decode_mb;
|
---|
48 | s->low_delay= 1;
|
---|
49 | avctx->pix_fmt= PIX_FMT_YUV420P;
|
---|
50 | s->unrestricted_mv= 1;
|
---|
51 |
|
---|
52 | /* select sub codec */
|
---|
53 | switch(avctx->codec->id) {
|
---|
54 | case CODEC_ID_H263:
|
---|
55 | s->unrestricted_mv= 0;
|
---|
56 | break;
|
---|
57 | case CODEC_ID_MPEG4:
|
---|
58 | s->decode_mb= ff_mpeg4_decode_mb;
|
---|
59 | s->time_increment_bits = 4; /* default value for broken headers */
|
---|
60 | s->h263_pred = 1;
|
---|
61 | s->low_delay = 0; //default, might be overriden in the vol header during header parsing
|
---|
62 | break;
|
---|
63 | case CODEC_ID_MSMPEG4V1:
|
---|
64 | s->h263_msmpeg4 = 1;
|
---|
65 | s->h263_pred = 1;
|
---|
66 | s->msmpeg4_version=1;
|
---|
67 | break;
|
---|
68 | case CODEC_ID_MSMPEG4V2:
|
---|
69 | s->h263_msmpeg4 = 1;
|
---|
70 | s->h263_pred = 1;
|
---|
71 | s->msmpeg4_version=2;
|
---|
72 | break;
|
---|
73 | case CODEC_ID_MSMPEG4V3:
|
---|
74 | s->h263_msmpeg4 = 1;
|
---|
75 | s->h263_pred = 1;
|
---|
76 | s->msmpeg4_version=3;
|
---|
77 | break;
|
---|
78 | case CODEC_ID_WMV1:
|
---|
79 | s->h263_msmpeg4 = 1;
|
---|
80 | s->h263_pred = 1;
|
---|
81 | s->msmpeg4_version=4;
|
---|
82 | break;
|
---|
83 | case CODEC_ID_WMV2:
|
---|
84 | s->h263_msmpeg4 = 1;
|
---|
85 | s->h263_pred = 1;
|
---|
86 | s->msmpeg4_version=5;
|
---|
87 | break;
|
---|
88 | case CODEC_ID_VC1:
|
---|
89 | case CODEC_ID_WMV3:
|
---|
90 | s->h263_msmpeg4 = 1;
|
---|
91 | s->h263_pred = 1;
|
---|
92 | s->msmpeg4_version=6;
|
---|
93 | break;
|
---|
94 | case CODEC_ID_H263I:
|
---|
95 | break;
|
---|
96 | case CODEC_ID_FLV1:
|
---|
97 | s->h263_flv = 1;
|
---|
98 | break;
|
---|
99 | default:
|
---|
100 | return -1;
|
---|
101 | }
|
---|
102 | s->codec_id= avctx->codec->id;
|
---|
103 |
|
---|
104 | /* for h263, we allocate the images after having read the header */
|
---|
105 | if (avctx->codec->id != CODEC_ID_H263 && avctx->codec->id != CODEC_ID_MPEG4)
|
---|
106 | if (MPV_common_init(s) < 0)
|
---|
107 | return -1;
|
---|
108 |
|
---|
109 | if (s->h263_msmpeg4)
|
---|
110 | ff_msmpeg4_decode_init(s);
|
---|
111 | else
|
---|
112 | h263_decode_init_vlc(s);
|
---|
113 |
|
---|
114 | return 0;
|
---|
115 | }
|
---|
116 |
|
---|
117 | int ff_h263_decode_end(AVCodecContext *avctx)
|
---|
118 | {
|
---|
119 | MpegEncContext *s = avctx->priv_data;
|
---|
120 |
|
---|
121 | MPV_common_end(s);
|
---|
122 | return 0;
|
---|
123 | }
|
---|
124 |
|
---|
125 | /**
|
---|
126 | * returns the number of bytes consumed for building the current frame
|
---|
127 | */
|
---|
128 | static int get_consumed_bytes(MpegEncContext *s, int buf_size){
|
---|
129 | int pos= (get_bits_count(&s->gb)+7)>>3;
|
---|
130 |
|
---|
131 | if(s->divx_packed){
|
---|
132 | //we would have to scan through the whole buf to handle the weird reordering ...
|
---|
133 | return buf_size;
|
---|
134 | }else if(s->flags&CODEC_FLAG_TRUNCATED){
|
---|
135 | pos -= s->parse_context.last_index;
|
---|
136 | if(pos<0) pos=0; // padding is not really read so this might be -1
|
---|
137 | return pos;
|
---|
138 | }else{
|
---|
139 | if(pos==0) pos=1; //avoid infinite loops (i doubt thats needed but ...)
|
---|
140 | if(pos+10>buf_size) pos=buf_size; // oops ;)
|
---|
141 |
|
---|
142 | return pos;
|
---|
143 | }
|
---|
144 | }
|
---|
145 |
|
---|
146 | static int decode_slice(MpegEncContext *s){
|
---|
147 | const int part_mask= s->partitioned_frame ? (AC_END|AC_ERROR) : 0x7F;
|
---|
148 | const int mb_size= 16>>s->avctx->lowres;
|
---|
149 | s->last_resync_gb= s->gb;
|
---|
150 | s->first_slice_line= 1;
|
---|
151 |
|
---|
152 | s->resync_mb_x= s->mb_x;
|
---|
153 | s->resync_mb_y= s->mb_y;
|
---|
154 |
|
---|
155 | ff_set_qscale(s, s->qscale);
|
---|
156 |
|
---|
157 | if(s->partitioned_frame){
|
---|
158 | const int qscale= s->qscale;
|
---|
159 |
|
---|
160 | if(s->codec_id==CODEC_ID_MPEG4){
|
---|
161 | if(ff_mpeg4_decode_partitions(s) < 0)
|
---|
162 | return -1;
|
---|
163 | }
|
---|
164 |
|
---|
165 | /* restore variables which were modified */
|
---|
166 | s->first_slice_line=1;
|
---|
167 | s->mb_x= s->resync_mb_x;
|
---|
168 | s->mb_y= s->resync_mb_y;
|
---|
169 | ff_set_qscale(s, qscale);
|
---|
170 | }
|
---|
171 |
|
---|
172 | for(; s->mb_y < s->mb_height; s->mb_y++) {
|
---|
173 | /* per-row end of slice checks */
|
---|
174 | if(s->msmpeg4_version){
|
---|
175 | if(s->resync_mb_y + s->slice_height == s->mb_y){
|
---|
176 | ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, AC_END|DC_END|MV_END);
|
---|
177 |
|
---|
178 | return 0;
|
---|
179 | }
|
---|
180 | }
|
---|
181 |
|
---|
182 | if(s->msmpeg4_version==1){
|
---|
183 | s->last_dc[0]=
|
---|
184 | s->last_dc[1]=
|
---|
185 | s->last_dc[2]= 128;
|
---|
186 | }
|
---|
187 |
|
---|
188 | ff_init_block_index(s);
|
---|
189 | for(; s->mb_x < s->mb_width; s->mb_x++) {
|
---|
190 | int ret;
|
---|
191 |
|
---|
192 | ff_update_block_index(s);
|
---|
193 |
|
---|
194 | if(s->resync_mb_x == s->mb_x && s->resync_mb_y+1 == s->mb_y){
|
---|
195 | s->first_slice_line=0;
|
---|
196 | }
|
---|
197 |
|
---|
198 | /* DCT & quantize */
|
---|
199 |
|
---|
200 | s->mv_dir = MV_DIR_FORWARD;
|
---|
201 | s->mv_type = MV_TYPE_16X16;
|
---|
202 | // s->mb_skipped = 0;
|
---|
203 | //printf("%d %d %06X\n", ret, get_bits_count(&s->gb), show_bits(&s->gb, 24));
|
---|
204 | ret= s->decode_mb(s, s->block);
|
---|
205 |
|
---|
206 | if (s->pict_type!=B_TYPE)
|
---|
207 | ff_h263_update_motion_val(s);
|
---|
208 |
|
---|
209 | if(ret<0){
|
---|
210 | const int xy= s->mb_x + s->mb_y*s->mb_stride;
|
---|
211 | if(ret==SLICE_END){
|
---|
212 | MPV_decode_mb(s, s->block);
|
---|
213 | if(s->loop_filter)
|
---|
214 | ff_h263_loop_filter(s);
|
---|
215 |
|
---|
216 | //printf("%d %d %d %06X\n", s->mb_x, s->mb_y, s->gb.size*8 - get_bits_count(&s->gb), show_bits(&s->gb, 24));
|
---|
217 | ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END)&part_mask);
|
---|
218 |
|
---|
219 | s->padding_bug_score--;
|
---|
220 |
|
---|
221 | if(++s->mb_x >= s->mb_width){
|
---|
222 | s->mb_x=0;
|
---|
223 | ff_draw_horiz_band(s, s->mb_y*mb_size, mb_size);
|
---|
224 | s->mb_y++;
|
---|
225 | }
|
---|
226 | return 0;
|
---|
227 | }else if(ret==SLICE_NOEND){
|
---|
228 | av_log(s->avctx, AV_LOG_ERROR, "Slice mismatch at MB: %d\n", xy);
|
---|
229 | ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x+1, s->mb_y, (AC_END|DC_END|MV_END)&part_mask);
|
---|
230 | return -1;
|
---|
231 | }
|
---|
232 | av_log(s->avctx, AV_LOG_ERROR, "Error at MB: %d\n", xy);
|
---|
233 | ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_ERROR|DC_ERROR|MV_ERROR)&part_mask);
|
---|
234 |
|
---|
235 | return -1;
|
---|
236 | }
|
---|
237 |
|
---|
238 | MPV_decode_mb(s, s->block);
|
---|
239 | if(s->loop_filter)
|
---|
240 | ff_h263_loop_filter(s);
|
---|
241 | }
|
---|
242 |
|
---|
243 | ff_draw_horiz_band(s, s->mb_y*mb_size, mb_size);
|
---|
244 |
|
---|
245 | s->mb_x= 0;
|
---|
246 | }
|
---|
247 |
|
---|
248 | assert(s->mb_x==0 && s->mb_y==s->mb_height);
|
---|
249 |
|
---|
250 | /* try to detect the padding bug */
|
---|
251 | if( s->codec_id==CODEC_ID_MPEG4
|
---|
252 | && (s->workaround_bugs&FF_BUG_AUTODETECT)
|
---|
253 | && s->gb.size_in_bits - get_bits_count(&s->gb) >=0
|
---|
254 | && s->gb.size_in_bits - get_bits_count(&s->gb) < 48
|
---|
255 | // && !s->resync_marker
|
---|
256 | && !s->data_partitioning){
|
---|
257 |
|
---|
258 | const int bits_count= get_bits_count(&s->gb);
|
---|
259 | const int bits_left = s->gb.size_in_bits - bits_count;
|
---|
260 |
|
---|
261 | if(bits_left==0){
|
---|
262 | s->padding_bug_score+=16;
|
---|
263 | } else if(bits_left != 1){
|
---|
264 | int v= show_bits(&s->gb, 8);
|
---|
265 | v|= 0x7F >> (7-(bits_count&7));
|
---|
266 |
|
---|
267 | if(v==0x7F && bits_left<=8)
|
---|
268 | s->padding_bug_score--;
|
---|
269 | else if(v==0x7F && ((get_bits_count(&s->gb)+8)&8) && bits_left<=16)
|
---|
270 | s->padding_bug_score+= 4;
|
---|
271 | else
|
---|
272 | s->padding_bug_score++;
|
---|
273 | }
|
---|
274 | }
|
---|
275 |
|
---|
276 | if(s->workaround_bugs&FF_BUG_AUTODETECT){
|
---|
277 | if(s->padding_bug_score > -2 && !s->data_partitioning /*&& (s->divx_version || !s->resync_marker)*/)
|
---|
278 | s->workaround_bugs |= FF_BUG_NO_PADDING;
|
---|
279 | else
|
---|
280 | s->workaround_bugs &= ~FF_BUG_NO_PADDING;
|
---|
281 | }
|
---|
282 |
|
---|
283 | // handle formats which don't have unique end markers
|
---|
284 | if(s->msmpeg4_version || (s->workaround_bugs&FF_BUG_NO_PADDING)){ //FIXME perhaps solve this more cleanly
|
---|
285 | int left= s->gb.size_in_bits - get_bits_count(&s->gb);
|
---|
286 | int max_extra=7;
|
---|
287 |
|
---|
288 | /* no markers in M$ crap */
|
---|
289 | if(s->msmpeg4_version && s->pict_type==I_TYPE)
|
---|
290 | max_extra+= 17;
|
---|
291 |
|
---|
292 | /* buggy padding but the frame should still end approximately at the bitstream end */
|
---|
293 | if((s->workaround_bugs&FF_BUG_NO_PADDING) && s->error_resilience>=3)
|
---|
294 | max_extra+= 48;
|
---|
295 | else if((s->workaround_bugs&FF_BUG_NO_PADDING))
|
---|
296 | max_extra+= 256*256*256*64;
|
---|
297 |
|
---|
298 | if(left>max_extra){
|
---|
299 | av_log(s->avctx, AV_LOG_ERROR, "discarding %d junk bits at end, next would be %X\n", left, show_bits(&s->gb, 24));
|
---|
300 | }
|
---|
301 | else if(left<0){
|
---|
302 | av_log(s->avctx, AV_LOG_ERROR, "overreading %d bits\n", -left);
|
---|
303 | }else
|
---|
304 | ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, AC_END|DC_END|MV_END);
|
---|
305 |
|
---|
306 | return 0;
|
---|
307 | }
|
---|
308 |
|
---|
309 | av_log(s->avctx, AV_LOG_ERROR, "slice end not reached but screenspace end (%d left %06X, score= %d)\n",
|
---|
310 | s->gb.size_in_bits - get_bits_count(&s->gb),
|
---|
311 | show_bits(&s->gb, 24), s->padding_bug_score);
|
---|
312 |
|
---|
313 | ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END)&part_mask);
|
---|
314 |
|
---|
315 | return -1;
|
---|
316 | }
|
---|
317 |
|
---|
318 | /**
|
---|
319 | * finds the end of the current frame in the bitstream.
|
---|
320 | * @return the position of the first byte of the next frame, or -1
|
---|
321 | */
|
---|
322 | int ff_mpeg4_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size){
|
---|
323 | int vop_found, i;
|
---|
324 | uint32_t state;
|
---|
325 |
|
---|
326 | vop_found= pc->frame_start_found;
|
---|
327 | state= pc->state;
|
---|
328 |
|
---|
329 | i=0;
|
---|
330 | if(!vop_found){
|
---|
331 | for(i=0; i<buf_size; i++){
|
---|
332 | state= (state<<8) | buf[i];
|
---|
333 | if(state == 0x1B6){
|
---|
334 | i++;
|
---|
335 | vop_found=1;
|
---|
336 | break;
|
---|
337 | }
|
---|
338 | }
|
---|
339 | }
|
---|
340 |
|
---|
341 | if(vop_found){
|
---|
342 | /* EOF considered as end of frame */
|
---|
343 | if (buf_size == 0)
|
---|
344 | return 0;
|
---|
345 | for(; i<buf_size; i++){
|
---|
346 | state= (state<<8) | buf[i];
|
---|
347 | if((state&0xFFFFFF00) == 0x100){
|
---|
348 | pc->frame_start_found=0;
|
---|
349 | pc->state=-1;
|
---|
350 | return i-3;
|
---|
351 | }
|
---|
352 | }
|
---|
353 | }
|
---|
354 | pc->frame_start_found= vop_found;
|
---|
355 | pc->state= state;
|
---|
356 | return END_NOT_FOUND;
|
---|
357 | }
|
---|
358 |
|
---|
359 | static int h263_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size){
|
---|
360 | int vop_found, i;
|
---|
361 | uint32_t state;
|
---|
362 |
|
---|
363 | vop_found= pc->frame_start_found;
|
---|
364 | state= pc->state;
|
---|
365 |
|
---|
366 | i=0;
|
---|
367 | if(!vop_found){
|
---|
368 | for(i=0; i<buf_size; i++){
|
---|
369 | state= (state<<8) | buf[i];
|
---|
370 | if(state>>(32-22) == 0x20){
|
---|
371 | i++;
|
---|
372 | vop_found=1;
|
---|
373 | break;
|
---|
374 | }
|
---|
375 | }
|
---|
376 | }
|
---|
377 |
|
---|
378 | if(vop_found){
|
---|
379 | for(; i<buf_size; i++){
|
---|
380 | state= (state<<8) | buf[i];
|
---|
381 | if(state>>(32-22) == 0x20){
|
---|
382 | pc->frame_start_found=0;
|
---|
383 | pc->state=-1;
|
---|
384 | return i-3;
|
---|
385 | }
|
---|
386 | }
|
---|
387 | }
|
---|
388 | pc->frame_start_found= vop_found;
|
---|
389 | pc->state= state;
|
---|
390 |
|
---|
391 | return END_NOT_FOUND;
|
---|
392 | }
|
---|
393 |
|
---|
394 | #ifdef CONFIG_H263_PARSER
|
---|
395 | static int h263_parse(AVCodecParserContext *s,
|
---|
396 | AVCodecContext *avctx,
|
---|
397 | uint8_t **poutbuf, int *poutbuf_size,
|
---|
398 | const uint8_t *buf, int buf_size)
|
---|
399 | {
|
---|
400 | ParseContext *pc = s->priv_data;
|
---|
401 | int next;
|
---|
402 |
|
---|
403 | next= h263_find_frame_end(pc, buf, buf_size);
|
---|
404 |
|
---|
405 | if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) {
|
---|
406 | *poutbuf = NULL;
|
---|
407 | *poutbuf_size = 0;
|
---|
408 | return buf_size;
|
---|
409 | }
|
---|
410 |
|
---|
411 | *poutbuf = (uint8_t *)buf;
|
---|
412 | *poutbuf_size = buf_size;
|
---|
413 | return next;
|
---|
414 | }
|
---|
415 | #endif
|
---|
416 |
|
---|
417 | int ff_h263_decode_frame(AVCodecContext *avctx,
|
---|
418 | void *data, int *data_size,
|
---|
419 | uint8_t *buf, int buf_size)
|
---|
420 | {
|
---|
421 | MpegEncContext *s = avctx->priv_data;
|
---|
422 | int ret;
|
---|
423 | AVFrame *pict = data;
|
---|
424 |
|
---|
425 | #ifdef PRINT_FRAME_TIME
|
---|
426 | uint64_t time= rdtsc();
|
---|
427 | #endif
|
---|
428 | #ifdef DEBUG
|
---|
429 | printf("*****frame %d size=%d\n", avctx->frame_number, buf_size);
|
---|
430 | printf("bytes=%x %x %x %x\n", buf[0], buf[1], buf[2], buf[3]);
|
---|
431 | #endif
|
---|
432 | s->flags= avctx->flags;
|
---|
433 | s->flags2= avctx->flags2;
|
---|
434 |
|
---|
435 | /* no supplementary picture */
|
---|
436 | if (buf_size == 0) {
|
---|
437 | /* special case for last picture */
|
---|
438 | if (s->low_delay==0 && s->next_picture_ptr) {
|
---|
439 | *pict= *(AVFrame*)s->next_picture_ptr;
|
---|
440 | s->next_picture_ptr= NULL;
|
---|
441 |
|
---|
442 | *data_size = sizeof(AVFrame);
|
---|
443 | }
|
---|
444 |
|
---|
445 | return 0;
|
---|
446 | }
|
---|
447 |
|
---|
448 | if(s->flags&CODEC_FLAG_TRUNCATED){
|
---|
449 | int next;
|
---|
450 |
|
---|
451 | if(s->codec_id==CODEC_ID_MPEG4){
|
---|
452 | next= ff_mpeg4_find_frame_end(&s->parse_context, buf, buf_size);
|
---|
453 | }else if(s->codec_id==CODEC_ID_H263){
|
---|
454 | next= h263_find_frame_end(&s->parse_context, buf, buf_size);
|
---|
455 | }else{
|
---|
456 | av_log(s->avctx, AV_LOG_ERROR, "this codec does not support truncated bitstreams\n");
|
---|
457 | return -1;
|
---|
458 | }
|
---|
459 |
|
---|
460 | if( ff_combine_frame(&s->parse_context, next, &buf, &buf_size) < 0 )
|
---|
461 | return buf_size;
|
---|
462 | }
|
---|
463 |
|
---|
464 |
|
---|
465 | retry:
|
---|
466 |
|
---|
467 | if(s->bitstream_buffer_size && (s->divx_packed || buf_size<20)){ //divx 5.01+/xvid frame reorder
|
---|
468 | init_get_bits(&s->gb, s->bitstream_buffer, s->bitstream_buffer_size*8);
|
---|
469 | }else
|
---|
470 | init_get_bits(&s->gb, buf, buf_size*8);
|
---|
471 | s->bitstream_buffer_size=0;
|
---|
472 |
|
---|
473 | if (!s->context_initialized) {
|
---|
474 | if (MPV_common_init(s) < 0) //we need the idct permutaton for reading a custom matrix
|
---|
475 | return -1;
|
---|
476 | }
|
---|
477 |
|
---|
478 | //we need to set current_picture_ptr before reading the header, otherwise we cant store anyting im there
|
---|
479 | if(s->current_picture_ptr==NULL || s->current_picture_ptr->data[0]){
|
---|
480 | int i= ff_find_unused_picture(s, 0);
|
---|
481 | s->current_picture_ptr= &s->picture[i];
|
---|
482 | }
|
---|
483 |
|
---|
484 | /* let's go :-) */
|
---|
485 | if (s->msmpeg4_version==5) {
|
---|
486 | ret= ff_wmv2_decode_picture_header(s);
|
---|
487 | } else if (s->msmpeg4_version) {
|
---|
488 | ret = msmpeg4_decode_picture_header(s);
|
---|
489 | } else if (s->h263_pred) {
|
---|
490 | if(s->avctx->extradata_size && s->picture_number==0){
|
---|
491 | GetBitContext gb;
|
---|
492 |
|
---|
493 | init_get_bits(&gb, s->avctx->extradata, s->avctx->extradata_size*8);
|
---|
494 | ret = ff_mpeg4_decode_picture_header(s, &gb);
|
---|
495 | }
|
---|
496 | ret = ff_mpeg4_decode_picture_header(s, &s->gb);
|
---|
497 |
|
---|
498 | if(s->flags& CODEC_FLAG_LOW_DELAY)
|
---|
499 | s->low_delay=1;
|
---|
500 | } else if (s->codec_id == CODEC_ID_H263I) {
|
---|
501 | ret = intel_h263_decode_picture_header(s);
|
---|
502 | } else if (s->h263_flv) {
|
---|
503 | ret = flv_h263_decode_picture_header(s);
|
---|
504 | } else {
|
---|
505 | ret = h263_decode_picture_header(s);
|
---|
506 | }
|
---|
507 |
|
---|
508 | if(ret==FRAME_SKIPPED) return get_consumed_bytes(s, buf_size);
|
---|
509 |
|
---|
510 | /* skip if the header was thrashed */
|
---|
511 | if (ret < 0){
|
---|
512 | av_log(s->avctx, AV_LOG_ERROR, "header damaged\n");
|
---|
513 | return -1;
|
---|
514 | }
|
---|
515 |
|
---|
516 | avctx->has_b_frames= !s->low_delay;
|
---|
517 |
|
---|
518 | if(s->xvid_build==0 && s->divx_version==0 && s->lavc_build==0){
|
---|
519 | if(s->avctx->stream_codec_tag == ff_get_fourcc("XVID") ||
|
---|
520 | s->avctx->codec_tag == ff_get_fourcc("XVID") || s->avctx->codec_tag == ff_get_fourcc("XVIX") ||
|
---|
521 | s->avctx->codec_tag == ff_get_fourcc("RMP4"))
|
---|
522 | s->xvid_build= -1;
|
---|
523 | #if 0
|
---|
524 | if(s->avctx->codec_tag == ff_get_fourcc("DIVX") && s->vo_type==0 && s->vol_control_parameters==1
|
---|
525 | && s->padding_bug_score > 0 && s->low_delay) // XVID with modified fourcc
|
---|
526 | s->xvid_build= -1;
|
---|
527 | #endif
|
---|
528 | }
|
---|
529 |
|
---|
530 | if(s->xvid_build==0 && s->divx_version==0 && s->lavc_build==0){
|
---|
531 | if(s->avctx->codec_tag == ff_get_fourcc("DIVX") && s->vo_type==0 && s->vol_control_parameters==0)
|
---|
532 | s->divx_version= 400; //divx 4
|
---|
533 | }
|
---|
534 |
|
---|
535 | if(s->xvid_build && s->divx_version){
|
---|
536 | s->divx_version=
|
---|
537 | s->divx_build= 0;
|
---|
538 | }
|
---|
539 |
|
---|
540 | if(s->workaround_bugs&FF_BUG_AUTODETECT){
|
---|
541 | if(s->avctx->codec_tag == ff_get_fourcc("XVIX"))
|
---|
542 | s->workaround_bugs|= FF_BUG_XVID_ILACE;
|
---|
543 |
|
---|
544 | if(s->avctx->codec_tag == ff_get_fourcc("UMP4")){
|
---|
545 | s->workaround_bugs|= FF_BUG_UMP4;
|
---|
546 | }
|
---|
547 |
|
---|
548 | if(s->divx_version>=500){
|
---|
549 | s->workaround_bugs|= FF_BUG_QPEL_CHROMA;
|
---|
550 | }
|
---|
551 |
|
---|
552 | if(s->divx_version>502){
|
---|
553 | s->workaround_bugs|= FF_BUG_QPEL_CHROMA2;
|
---|
554 | }
|
---|
555 |
|
---|
556 | if(s->xvid_build && s->xvid_build<=3)
|
---|
557 | s->padding_bug_score= 256*256*256*64;
|
---|
558 |
|
---|
559 | if(s->xvid_build && s->xvid_build<=1)
|
---|
560 | s->workaround_bugs|= FF_BUG_QPEL_CHROMA;
|
---|
561 |
|
---|
562 | if(s->xvid_build && s->xvid_build<=12)
|
---|
563 | s->workaround_bugs|= FF_BUG_EDGE;
|
---|
564 |
|
---|
565 | if(s->xvid_build && s->xvid_build<=32)
|
---|
566 | s->workaround_bugs|= FF_BUG_DC_CLIP;
|
---|
567 |
|
---|
568 | #define SET_QPEL_FUNC(postfix1, postfix2) \
|
---|
569 | s->dsp.put_ ## postfix1 = ff_put_ ## postfix2;\
|
---|
570 | s->dsp.put_no_rnd_ ## postfix1 = ff_put_no_rnd_ ## postfix2;\
|
---|
571 | s->dsp.avg_ ## postfix1 = ff_avg_ ## postfix2;
|
---|
572 |
|
---|
573 | if(s->lavc_build && s->lavc_build<4653)
|
---|
574 | s->workaround_bugs|= FF_BUG_STD_QPEL;
|
---|
575 |
|
---|
576 | if(s->lavc_build && s->lavc_build<4655)
|
---|
577 | s->workaround_bugs|= FF_BUG_DIRECT_BLOCKSIZE;
|
---|
578 |
|
---|
579 | if(s->lavc_build && s->lavc_build<4670){
|
---|
580 | s->workaround_bugs|= FF_BUG_EDGE;
|
---|
581 | }
|
---|
582 |
|
---|
583 | if(s->lavc_build && s->lavc_build<=4712)
|
---|
584 | s->workaround_bugs|= FF_BUG_DC_CLIP;
|
---|
585 |
|
---|
586 | if(s->divx_version)
|
---|
587 | s->workaround_bugs|= FF_BUG_DIRECT_BLOCKSIZE;
|
---|
588 | //printf("padding_bug_score: %d\n", s->padding_bug_score);
|
---|
589 | if(s->divx_version==501 && s->divx_build==20020416)
|
---|
590 | s->padding_bug_score= 256*256*256*64;
|
---|
591 |
|
---|
592 | if(s->divx_version && s->divx_version<500){
|
---|
593 | s->workaround_bugs|= FF_BUG_EDGE;
|
---|
594 | }
|
---|
595 |
|
---|
596 | if(s->divx_version)
|
---|
597 | s->workaround_bugs|= FF_BUG_HPEL_CHROMA;
|
---|
598 | #if 0
|
---|
599 | if(s->divx_version==500)
|
---|
600 | s->padding_bug_score= 256*256*256*64;
|
---|
601 |
|
---|
602 | /* very ugly XVID padding bug detection FIXME/XXX solve this differently
|
---|
603 | * lets hope this at least works
|
---|
604 | */
|
---|
605 | if( s->resync_marker==0 && s->data_partitioning==0 && s->divx_version==0
|
---|
606 | && s->codec_id==CODEC_ID_MPEG4 && s->vo_type==0)
|
---|
607 | s->workaround_bugs|= FF_BUG_NO_PADDING;
|
---|
608 |
|
---|
609 | if(s->lavc_build && s->lavc_build<4609) //FIXME not sure about the version num but a 4609 file seems ok
|
---|
610 | s->workaround_bugs|= FF_BUG_NO_PADDING;
|
---|
611 | #endif
|
---|
612 | }
|
---|
613 |
|
---|
614 | if(s->workaround_bugs& FF_BUG_STD_QPEL){
|
---|
615 | SET_QPEL_FUNC(qpel_pixels_tab[0][ 5], qpel16_mc11_old_c)
|
---|
616 | SET_QPEL_FUNC(qpel_pixels_tab[0][ 7], qpel16_mc31_old_c)
|
---|
617 | SET_QPEL_FUNC(qpel_pixels_tab[0][ 9], qpel16_mc12_old_c)
|
---|
618 | SET_QPEL_FUNC(qpel_pixels_tab[0][11], qpel16_mc32_old_c)
|
---|
619 | SET_QPEL_FUNC(qpel_pixels_tab[0][13], qpel16_mc13_old_c)
|
---|
620 | SET_QPEL_FUNC(qpel_pixels_tab[0][15], qpel16_mc33_old_c)
|
---|
621 |
|
---|
622 | SET_QPEL_FUNC(qpel_pixels_tab[1][ 5], qpel8_mc11_old_c)
|
---|
623 | SET_QPEL_FUNC(qpel_pixels_tab[1][ 7], qpel8_mc31_old_c)
|
---|
624 | SET_QPEL_FUNC(qpel_pixels_tab[1][ 9], qpel8_mc12_old_c)
|
---|
625 | SET_QPEL_FUNC(qpel_pixels_tab[1][11], qpel8_mc32_old_c)
|
---|
626 | SET_QPEL_FUNC(qpel_pixels_tab[1][13], qpel8_mc13_old_c)
|
---|
627 | SET_QPEL_FUNC(qpel_pixels_tab[1][15], qpel8_mc33_old_c)
|
---|
628 | }
|
---|
629 |
|
---|
630 | if(avctx->debug & FF_DEBUG_BUGS)
|
---|
631 | av_log(s->avctx, AV_LOG_DEBUG, "bugs: %X lavc_build:%d xvid_build:%d divx_version:%d divx_build:%d %s\n",
|
---|
632 | s->workaround_bugs, s->lavc_build, s->xvid_build, s->divx_version, s->divx_build,
|
---|
633 | s->divx_packed ? "p" : "");
|
---|
634 |
|
---|
635 | #if 0 // dump bits per frame / qp / complexity
|
---|
636 | {
|
---|
637 | static FILE *f=NULL;
|
---|
638 | if(!f) f=fopen("rate_qp_cplx.txt", "w");
|
---|
639 | fprintf(f, "%d %d %f\n", buf_size, s->qscale, buf_size*(double)s->qscale);
|
---|
640 | }
|
---|
641 | #endif
|
---|
642 |
|
---|
643 | /* After H263 & mpeg4 header decode we have the height, width,*/
|
---|
644 | /* and other parameters. So then we could init the picture */
|
---|
645 | /* FIXME: By the way H263 decoder is evolving it should have */
|
---|
646 | /* an H263EncContext */
|
---|
647 |
|
---|
648 | if ( s->width != avctx->coded_width
|
---|
649 | || s->height != avctx->coded_height) {
|
---|
650 | /* H.263 could change picture size any time */
|
---|
651 | ParseContext pc= s->parse_context; //FIXME move these demuxng hack to avformat
|
---|
652 | s->parse_context.buffer=0;
|
---|
653 | MPV_common_end(s);
|
---|
654 | s->parse_context= pc;
|
---|
655 | }
|
---|
656 | if (!s->context_initialized) {
|
---|
657 | avcodec_set_dimensions(avctx, s->width, s->height);
|
---|
658 |
|
---|
659 | goto retry;
|
---|
660 | }
|
---|
661 |
|
---|
662 | if((s->codec_id==CODEC_ID_H263 || s->codec_id==CODEC_ID_H263P))
|
---|
663 | s->gob_index = ff_h263_get_gob_height(s);
|
---|
664 |
|
---|
665 | // for hurry_up==5
|
---|
666 | s->current_picture.pict_type= s->pict_type;
|
---|
667 | s->current_picture.key_frame= s->pict_type == I_TYPE;
|
---|
668 |
|
---|
669 | /* skip B-frames if we don't have reference frames */
|
---|
670 | if(s->last_picture_ptr==NULL && (s->pict_type==B_TYPE || s->dropable)) return get_consumed_bytes(s, buf_size);
|
---|
671 | /* skip b frames if we are in a hurry */
|
---|
672 | if(avctx->hurry_up && s->pict_type==B_TYPE) return get_consumed_bytes(s, buf_size);
|
---|
673 | if( (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type==B_TYPE)
|
---|
674 | || (avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type!=I_TYPE)
|
---|
675 | || avctx->skip_frame >= AVDISCARD_ALL)
|
---|
676 | return get_consumed_bytes(s, buf_size);
|
---|
677 | /* skip everything if we are in a hurry>=5 */
|
---|
678 | if(avctx->hurry_up>=5) return get_consumed_bytes(s, buf_size);
|
---|
679 |
|
---|
680 | if(s->next_p_frame_damaged){
|
---|
681 | if(s->pict_type==B_TYPE)
|
---|
682 | return get_consumed_bytes(s, buf_size);
|
---|
683 | else
|
---|
684 | s->next_p_frame_damaged=0;
|
---|
685 | }
|
---|
686 |
|
---|
687 | if(MPV_frame_start(s, avctx) < 0)
|
---|
688 | return -1;
|
---|
689 |
|
---|
690 | #ifdef DEBUG
|
---|
691 | av_log(avctx, AV_LOG_DEBUG, "qscale=%d\n", s->qscale);
|
---|
692 | #endif
|
---|
693 |
|
---|
694 | ff_er_frame_start(s);
|
---|
695 |
|
---|
696 | //the second part of the wmv2 header contains the MB skip bits which are stored in current_picture->mb_type
|
---|
697 | //which isnt available before MPV_frame_start()
|
---|
698 | if (s->msmpeg4_version==5){
|
---|
699 | if(ff_wmv2_decode_secondary_picture_header(s) < 0)
|
---|
700 | return -1;
|
---|
701 | }
|
---|
702 |
|
---|
703 | /* decode each macroblock */
|
---|
704 | s->mb_x=0;
|
---|
705 | s->mb_y=0;
|
---|
706 |
|
---|
707 | decode_slice(s);
|
---|
708 | while(s->mb_y<s->mb_height){
|
---|
709 | if(s->msmpeg4_version){
|
---|
710 | if(s->mb_x!=0 || (s->mb_y%s->slice_height)!=0 || get_bits_count(&s->gb) > s->gb.size_in_bits)
|
---|
711 | break;
|
---|
712 | }else{
|
---|
713 | if(ff_h263_resync(s)<0)
|
---|
714 | break;
|
---|
715 | }
|
---|
716 |
|
---|
717 | if(s->msmpeg4_version<4 && s->h263_pred)
|
---|
718 | ff_mpeg4_clean_buffers(s);
|
---|
719 |
|
---|
720 | decode_slice(s);
|
---|
721 | }
|
---|
722 |
|
---|
723 | if (s->h263_msmpeg4 && s->msmpeg4_version<4 && s->pict_type==I_TYPE)
|
---|
724 | if(msmpeg4_decode_ext_header(s, buf_size) < 0){
|
---|
725 | s->error_status_table[s->mb_num-1]= AC_ERROR|DC_ERROR|MV_ERROR;
|
---|
726 | }
|
---|
727 |
|
---|
728 | /* divx 5.01+ bistream reorder stuff */
|
---|
729 | if(s->codec_id==CODEC_ID_MPEG4 && s->bitstream_buffer_size==0 && s->divx_packed){
|
---|
730 | int current_pos= get_bits_count(&s->gb)>>3;
|
---|
731 | int startcode_found=0;
|
---|
732 |
|
---|
733 | if(buf_size - current_pos > 5){
|
---|
734 | int i;
|
---|
735 | for(i=current_pos; i<buf_size-3; i++){
|
---|
736 | if(buf[i]==0 && buf[i+1]==0 && buf[i+2]==1 && buf[i+3]==0xB6){
|
---|
737 | startcode_found=1;
|
---|
738 | break;
|
---|
739 | }
|
---|
740 | }
|
---|
741 | }
|
---|
742 | if(s->gb.buffer == s->bitstream_buffer && buf_size>20){ //xvid style
|
---|
743 | startcode_found=1;
|
---|
744 | current_pos=0;
|
---|
745 | }
|
---|
746 |
|
---|
747 | if(startcode_found){
|
---|
748 | s->bitstream_buffer= av_fast_realloc(
|
---|
749 | s->bitstream_buffer,
|
---|
750 | &s->allocated_bitstream_buffer_size,
|
---|
751 | buf_size - current_pos + FF_INPUT_BUFFER_PADDING_SIZE);
|
---|
752 | memcpy(s->bitstream_buffer, buf + current_pos, buf_size - current_pos);
|
---|
753 | s->bitstream_buffer_size= buf_size - current_pos;
|
---|
754 | }
|
---|
755 | }
|
---|
756 |
|
---|
757 | ff_er_frame_end(s);
|
---|
758 |
|
---|
759 | MPV_frame_end(s);
|
---|
760 |
|
---|
761 | assert(s->current_picture.pict_type == s->current_picture_ptr->pict_type);
|
---|
762 | assert(s->current_picture.pict_type == s->pict_type);
|
---|
763 | if (s->pict_type == B_TYPE || s->low_delay) {
|
---|
764 | *pict= *(AVFrame*)s->current_picture_ptr;
|
---|
765 | } else if (s->last_picture_ptr != NULL) {
|
---|
766 | *pict= *(AVFrame*)s->last_picture_ptr;
|
---|
767 | }
|
---|
768 |
|
---|
769 | if(s->last_picture_ptr || s->low_delay){
|
---|
770 | *data_size = sizeof(AVFrame);
|
---|
771 | ff_print_debug_info(s, pict);
|
---|
772 | }
|
---|
773 |
|
---|
774 | /* Return the Picture timestamp as the frame number */
|
---|
775 | /* we substract 1 because it is added on utils.c */
|
---|
776 | avctx->frame_number = s->picture_number - 1;
|
---|
777 |
|
---|
778 | #ifdef PRINT_FRAME_TIME
|
---|
779 | av_log(avctx, AV_LOG_DEBUG, "%Ld\n", rdtsc()-time);
|
---|
780 | #endif
|
---|
781 |
|
---|
782 | return get_consumed_bytes(s, buf_size);
|
---|
783 | }
|
---|
784 |
|
---|
785 | AVCodec mpeg4_decoder = {
|
---|
786 | "mpeg4",
|
---|
787 | CODEC_TYPE_VIDEO,
|
---|
788 | CODEC_ID_MPEG4,
|
---|
789 | sizeof(MpegEncContext),
|
---|
790 | ff_h263_decode_init,
|
---|
791 | NULL,
|
---|
792 | ff_h263_decode_end,
|
---|
793 | ff_h263_decode_frame,
|
---|
794 | CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY,
|
---|
795 | .flush= ff_mpeg_flush,
|
---|
796 | };
|
---|
797 |
|
---|
798 | AVCodec h263_decoder = {
|
---|
799 | "h263",
|
---|
800 | CODEC_TYPE_VIDEO,
|
---|
801 | CODEC_ID_H263,
|
---|
802 | sizeof(MpegEncContext),
|
---|
803 | ff_h263_decode_init,
|
---|
804 | NULL,
|
---|
805 | ff_h263_decode_end,
|
---|
806 | ff_h263_decode_frame,
|
---|
807 | CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY,
|
---|
808 | .flush= ff_mpeg_flush,
|
---|
809 | };
|
---|
810 |
|
---|
811 | AVCodec msmpeg4v1_decoder = {
|
---|
812 | "msmpeg4v1",
|
---|
813 | CODEC_TYPE_VIDEO,
|
---|
814 | CODEC_ID_MSMPEG4V1,
|
---|
815 | sizeof(MpegEncContext),
|
---|
816 | ff_h263_decode_init,
|
---|
817 | NULL,
|
---|
818 | ff_h263_decode_end,
|
---|
819 | ff_h263_decode_frame,
|
---|
820 | CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
|
---|
821 | };
|
---|
822 |
|
---|
823 | AVCodec msmpeg4v2_decoder = {
|
---|
824 | "msmpeg4v2",
|
---|
825 | CODEC_TYPE_VIDEO,
|
---|
826 | CODEC_ID_MSMPEG4V2,
|
---|
827 | sizeof(MpegEncContext),
|
---|
828 | ff_h263_decode_init,
|
---|
829 | NULL,
|
---|
830 | ff_h263_decode_end,
|
---|
831 | ff_h263_decode_frame,
|
---|
832 | CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
|
---|
833 | };
|
---|
834 |
|
---|
835 | AVCodec msmpeg4v3_decoder = {
|
---|
836 | "msmpeg4",
|
---|
837 | CODEC_TYPE_VIDEO,
|
---|
838 | CODEC_ID_MSMPEG4V3,
|
---|
839 | sizeof(MpegEncContext),
|
---|
840 | ff_h263_decode_init,
|
---|
841 | NULL,
|
---|
842 | ff_h263_decode_end,
|
---|
843 | ff_h263_decode_frame,
|
---|
844 | CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
|
---|
845 | };
|
---|
846 |
|
---|
847 | AVCodec wmv1_decoder = {
|
---|
848 | "wmv1",
|
---|
849 | CODEC_TYPE_VIDEO,
|
---|
850 | CODEC_ID_WMV1,
|
---|
851 | sizeof(MpegEncContext),
|
---|
852 | ff_h263_decode_init,
|
---|
853 | NULL,
|
---|
854 | ff_h263_decode_end,
|
---|
855 | ff_h263_decode_frame,
|
---|
856 | CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
|
---|
857 | };
|
---|
858 |
|
---|
859 | AVCodec h263i_decoder = {
|
---|
860 | "h263i",
|
---|
861 | CODEC_TYPE_VIDEO,
|
---|
862 | CODEC_ID_H263I,
|
---|
863 | sizeof(MpegEncContext),
|
---|
864 | ff_h263_decode_init,
|
---|
865 | NULL,
|
---|
866 | ff_h263_decode_end,
|
---|
867 | ff_h263_decode_frame,
|
---|
868 | CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
|
---|
869 | };
|
---|
870 |
|
---|
871 | AVCodec flv_decoder = {
|
---|
872 | "flv",
|
---|
873 | CODEC_TYPE_VIDEO,
|
---|
874 | CODEC_ID_FLV1,
|
---|
875 | sizeof(MpegEncContext),
|
---|
876 | ff_h263_decode_init,
|
---|
877 | NULL,
|
---|
878 | ff_h263_decode_end,
|
---|
879 | ff_h263_decode_frame,
|
---|
880 | CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1
|
---|
881 | };
|
---|
882 |
|
---|
883 | #ifdef CONFIG_H263_PARSER
|
---|
884 | AVCodecParser h263_parser = {
|
---|
885 | { CODEC_ID_H263 },
|
---|
886 | sizeof(ParseContext),
|
---|
887 | NULL,
|
---|
888 | h263_parse,
|
---|
889 | ff_parse_close,
|
---|
890 | };
|
---|
891 | #endif
|
---|