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