]> git.sesse.net Git - ffmpeg/blob - libavcodec/h263dec.c
GetBitContext.size is allways multiplied by 8 -> use size_in_bits to avoid useless...
[ffmpeg] / libavcodec / h263dec.c
1 /*
2  * H263 decoder
3  * Copyright (c) 2001 Fabrice Bellard.
4  *
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.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
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
18  */
19 #include "avcodec.h"
20 #include "dsputil.h"
21 #include "mpegvideo.h"
22
23 #if 1
24 #define PRINT_QP(a, b) {}
25 #else
26 #define PRINT_QP(a, b) printf(a, b)
27 #endif
28
29 //#define DEBUG
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
42
43 int ff_h263_decode_init(AVCodecContext *avctx)
44 {
45     MpegEncContext *s = avctx->priv_data;
46
47     s->avctx = avctx;
48     s->out_format = FMT_H263;
49
50     s->width = avctx->width;
51     s->height = avctx->height;
52     s->workaround_bugs= avctx->workaround_bugs;
53
54     // set defaults
55     s->quant_precision=5;
56     s->progressive_sequence=1;
57     s->decode_mb= ff_h263_decode_mb;
58     s->low_delay= 1;
59     avctx->pix_fmt= PIX_FMT_YUV420P;
60
61     /* select sub codec */
62     switch(avctx->codec->id) {
63     case CODEC_ID_H263:
64         s->gob_number = 0;
65         break;
66     case CODEC_ID_MPEG4:
67         s->time_increment_bits = 4; /* default value for broken headers */
68         s->h263_pred = 1;
69         s->low_delay = 0; //default, might be overriden in the vol header during header parsing
70         break;
71     case CODEC_ID_MSMPEG4V1:
72         s->h263_msmpeg4 = 1;
73         s->h263_pred = 1;
74         s->msmpeg4_version=1;
75         break;
76     case CODEC_ID_MSMPEG4V2:
77         s->h263_msmpeg4 = 1;
78         s->h263_pred = 1;
79         s->msmpeg4_version=2;
80         break;
81     case CODEC_ID_MSMPEG4V3:
82         s->h263_msmpeg4 = 1;
83         s->h263_pred = 1;
84         s->msmpeg4_version=3;
85         break;
86     case CODEC_ID_WMV1:
87         s->h263_msmpeg4 = 1;
88         s->h263_pred = 1;
89         s->msmpeg4_version=4;
90         break;
91     case CODEC_ID_WMV2:
92         s->h263_msmpeg4 = 1;
93         s->h263_pred = 1;
94         s->msmpeg4_version=5;
95         break;
96     case CODEC_ID_H263I:
97         s->h263_intel = 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  * retunrs 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_version>=500){
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     s->last_resync_gb= s->gb;
148     s->first_slice_line= 1;
149         
150     s->resync_mb_x= s->mb_x;
151     s->resync_mb_y= s->mb_y;
152
153     s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
154     s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
155     
156     if(s->partitioned_frame){
157         const int qscale= s->qscale;
158
159         if(s->codec_id==CODEC_ID_MPEG4){
160             if(ff_mpeg4_decode_partitions(s) < 0)
161                 return -1; 
162         }
163         
164         /* restore variables which where modified */
165         s->first_slice_line=1;
166         s->mb_x= s->resync_mb_x;
167         s->mb_y= s->resync_mb_y;
168         s->qscale= qscale;
169         s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
170         s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
171     }
172
173     for(; s->mb_y < s->mb_height; s->mb_y++) {
174         /* per-row end of slice checks */
175         if(s->msmpeg4_version){
176             if(s->resync_mb_y + s->slice_height == s->mb_y){
177                 const int xy= s->mb_x + s->mb_y*s->mb_width;
178                 s->error_status_table[xy-1]|= AC_END|DC_END|MV_END;
179                 return 0;
180             }
181         }
182         
183         if(s->msmpeg4_version==1){
184             s->last_dc[0]=
185             s->last_dc[1]=
186             s->last_dc[2]= 128;
187         }
188     
189         ff_init_block_index(s);
190         for(; s->mb_x < s->mb_width; s->mb_x++) {
191             int ret;
192
193             ff_update_block_index(s);
194
195             if(s->resync_mb_x == s->mb_x && s->resync_mb_y+1 == s->mb_y){
196                 s->first_slice_line=0; 
197             }
198
199             /* DCT & quantize */
200             s->dsp.clear_blocks(s->block[0]);
201             
202             s->mv_dir = MV_DIR_FORWARD;
203             s->mv_type = MV_TYPE_16X16;
204 //            s->mb_skiped = 0;
205 //printf("%d %d %06X\n", ret, get_bits_count(&s->gb), show_bits(&s->gb, 24));
206             ret= s->decode_mb(s, s->block);
207             
208             PRINT_QP("%2d", s->qscale);
209             MPV_decode_mb(s, s->block);
210
211             if(ret<0){
212                 const int xy= s->mb_x + s->mb_y*s->mb_width;
213                 if(ret==SLICE_END){
214 //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));
215                     s->error_status_table[xy]|= AC_END;
216                     if(!s->partitioned_frame)
217                         s->error_status_table[xy]|= MV_END|DC_END;
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);
224                         s->mb_y++;
225                     }
226                     return 0; 
227                 }else if(ret==SLICE_NOEND){
228                     fprintf(stderr,"Slice mismatch at MB: %d\n", xy);
229                     return -1;
230                 }
231                 fprintf(stderr,"Error at MB: %d\n", xy);
232                 s->error_status_table[xy]|= AC_ERROR;
233                 if(!s->partitioned_frame)
234                     s->error_status_table[xy]|= DC_ERROR|MV_ERROR;
235     
236                 return -1;
237             }
238         }
239         
240         ff_draw_horiz_band(s);
241         
242         PRINT_QP("%s", "\n");
243         
244         s->mb_x= 0;
245     }
246     
247     assert(s->mb_x==0 && s->mb_y==s->mb_height);
248
249     /* try to detect the padding bug */
250     if(      s->codec_id==CODEC_ID_MPEG4
251        &&   (s->workaround_bugs&FF_BUG_AUTODETECT) 
252        &&    s->gb.size_in_bits - get_bits_count(&s->gb) >=0
253        &&    s->gb.size_in_bits - get_bits_count(&s->gb) < 48
254 //       &&   !s->resync_marker
255        &&   !s->data_partitioning){
256         
257         const int bits_count= get_bits_count(&s->gb);
258         const int bits_left = s->gb.size_in_bits - bits_count;
259         
260         if(bits_left==0){
261             s->padding_bug_score+=16;
262         }else if(bits_left>8){
263             s->padding_bug_score++;
264         } else if(bits_left != 1){
265             int v= show_bits(&s->gb, 8);
266             v|= 0x7F >> (7-(bits_count&7));
267
268             if(v==0x7F)
269                 s->padding_bug_score--;
270             else
271                 s->padding_bug_score++;            
272         }                          
273     }
274
275     // handle formats which dont have unique end markers
276     if(s->msmpeg4_version || (s->workaround_bugs&FF_BUG_NO_PADDING)){ //FIXME perhaps solve this more cleanly
277         int left= s->gb.size_in_bits - get_bits_count(&s->gb);
278         int max_extra=7;
279         
280         /* no markers in M$ crap */
281         if(s->msmpeg4_version && s->pict_type==I_TYPE)
282             max_extra+= 17;
283         
284         /* buggy padding but the frame should still end approximately at the bitstream end */
285         if((s->workaround_bugs&FF_BUG_NO_PADDING) && s->error_resilience>=3)
286             max_extra+= 48;
287         else if((s->workaround_bugs&FF_BUG_NO_PADDING))
288             max_extra+= 256*256*256*64;
289         
290         if(left>max_extra){
291             fprintf(stderr, "discarding %d junk bits at end, next would be %X\n", left, show_bits(&s->gb, 24));
292         }
293         else if(left<0){
294             fprintf(stderr, "overreading %d bits\n", -left);
295         }else
296             s->error_status_table[s->mb_num-1]|= AC_END|MV_END|DC_END;
297         
298         return 0;
299     }
300
301     fprintf(stderr, "slice end not reached but screenspace end (%d left %06X)\n", 
302             s->gb.size_in_bits - get_bits_count(&s->gb),
303             show_bits(&s->gb, 24));
304     return -1;
305 }
306
307 /**
308  * finds the end of the current frame in the bitstream.
309  * @return the position of the first byte of the next frame, or -1
310  */
311 static int mpeg4_find_frame_end(MpegEncContext *s, UINT8 *buf, int buf_size){
312     ParseContext *pc= &s->parse_context;
313     int vop_found, i;
314     uint32_t state;
315     
316     vop_found= pc->frame_start_found;
317     state= pc->state;
318     
319     i=0;
320     if(!vop_found){
321         for(i=0; i<buf_size; i++){
322             state= (state<<8) | buf[i];
323             if(state == 0x1B6){
324                 i++;
325                 vop_found=1;
326                 break;
327             }
328         }
329     }
330     
331     for(; i<buf_size; i++){
332         state= (state<<8) | buf[i];
333         if((state&0xFFFFFF00) == 0x100){
334             pc->frame_start_found=0;
335             pc->state=-1; 
336             return i-3;
337         }
338     }
339     pc->frame_start_found= vop_found;
340     pc->state= state;
341     return -1;
342 }
343
344 static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h, int stride, int color){
345     int t, x, y, f;
346     
347     ex= clip(ex, 0, w-1);
348     ey= clip(ey, 0, h-1);
349     
350     buf[sy*stride + sx]+= color;
351     
352     if(ABS(ex - sx) > ABS(ey - sy)){
353         if(sx > ex){
354             t=sx; sx=ex; ex=t;
355             t=sy; sy=ey; ey=t;
356         }
357         buf+= sx + sy*stride;
358         ex-= sx;
359         f= ((ey-sy)<<16)/ex;
360         for(x= 0; x <= ex; x++){
361             y= ((x*f) + (1<<15))>>16;
362             buf[y*stride + x]+= color;
363         }
364     }else{
365         if(sy > ey){
366             t=sx; sx=ex; ex=t;
367             t=sy; sy=ey; ey=t;
368         }
369         buf+= sx + sy*stride;
370         ey-= sy;
371         if(ey) f= ((ex-sx)<<16)/ey;
372         else   f= 0;
373         for(y= 0; y <= ey; y++){
374             x= ((y*f) + (1<<15))>>16;
375             buf[y*stride + x]+= color;
376         }
377     }
378 }
379
380 int ff_h263_decode_frame(AVCodecContext *avctx, 
381                              void *data, int *data_size,
382                              UINT8 *buf, int buf_size)
383 {
384     MpegEncContext *s = avctx->priv_data;
385     int ret,i;
386     AVFrame *pict = data; 
387     float new_aspect;
388     
389 #ifdef PRINT_FRAME_TIME
390 uint64_t time= rdtsc();
391 #endif
392 #ifdef DEBUG
393     printf("*****frame %d size=%d\n", avctx->frame_number, buf_size);
394     printf("bytes=%x %x %x %x\n", buf[0], buf[1], buf[2], buf[3]);
395 #endif
396     s->flags= avctx->flags;
397
398     *data_size = 0;
399    
400    /* no supplementary picture */
401     if (buf_size == 0) {
402         return 0;
403     }
404     
405     if(s->flags&CODEC_FLAG_TRUNCATED){
406         int next;
407         ParseContext *pc= &s->parse_context;
408         
409         pc->last_index= pc->index;
410
411         if(s->codec_id==CODEC_ID_MPEG4){
412             next= mpeg4_find_frame_end(s, buf, buf_size);
413         }else{
414             fprintf(stderr, "this codec doesnt support truncated bitstreams\n");
415             return -1;
416         }
417         if(next==-1){
418             if(buf_size + FF_INPUT_BUFFER_PADDING_SIZE + pc->index > pc->buffer_size){
419                 pc->buffer_size= buf_size + pc->index + 10*1024;
420                 pc->buffer= realloc(pc->buffer, pc->buffer_size);
421             }
422
423             memcpy(&pc->buffer[pc->index], buf, buf_size);
424             pc->index += buf_size;
425             return buf_size;
426         }
427
428         if(pc->index){
429             if(next + FF_INPUT_BUFFER_PADDING_SIZE + pc->index > pc->buffer_size){
430                 pc->buffer_size= next + pc->index + 10*1024;
431                 pc->buffer= realloc(pc->buffer, pc->buffer_size);
432             }
433
434             memcpy(&pc->buffer[pc->index], buf, next + FF_INPUT_BUFFER_PADDING_SIZE );
435             pc->index = 0;
436             buf= pc->buffer;
437             buf_size= pc->last_index + next;
438         }
439     }
440
441 retry:
442     
443     if(s->bitstream_buffer_size && buf_size<20){ //divx 5.01+ frame reorder
444         init_get_bits(&s->gb, s->bitstream_buffer, s->bitstream_buffer_size*8);
445     }else
446         init_get_bits(&s->gb, buf, buf_size*8);
447     s->bitstream_buffer_size=0;
448
449     if (!s->context_initialized) {
450         if (MPV_common_init(s) < 0) //we need the idct permutaton for reading a custom matrix
451             return -1;
452     }
453       
454     /* let's go :-) */
455     if (s->msmpeg4_version==5) {
456         ret= ff_wmv2_decode_picture_header(s);
457     } else if (s->msmpeg4_version) {
458         ret = msmpeg4_decode_picture_header(s);
459     } else if (s->h263_pred) {
460         if(s->avctx->extradata_size && s->picture_number==0){
461             GetBitContext gb;
462             
463             init_get_bits(&gb, s->avctx->extradata, s->avctx->extradata_size*8);
464             ret = ff_mpeg4_decode_picture_header(s, &gb);
465         }
466         ret = ff_mpeg4_decode_picture_header(s, &s->gb);
467
468         if(s->flags& CODEC_FLAG_LOW_DELAY)
469             s->low_delay=1;
470     } else if (s->h263_intel) {
471         ret = intel_h263_decode_picture_header(s);
472     } else {
473         ret = h263_decode_picture_header(s);
474     }
475     avctx->has_b_frames= !s->low_delay;
476
477     if(s->workaround_bugs&FF_BUG_AUTODETECT){
478         if(s->padding_bug_score > -2 && !s->data_partitioning)
479             s->workaround_bugs |=  FF_BUG_NO_PADDING;
480         else
481             s->workaround_bugs &= ~FF_BUG_NO_PADDING;
482
483         if(s->avctx->fourcc == ff_get_fourcc("XVIX")) 
484             s->workaround_bugs|= FF_BUG_XVID_ILACE;
485 #if 0
486         if(s->avctx->fourcc == ff_get_fourcc("MP4S")) 
487             s->workaround_bugs|= FF_BUG_AC_VLC;
488         
489         if(s->avctx->fourcc == ff_get_fourcc("M4S2")) 
490             s->workaround_bugs|= FF_BUG_AC_VLC;
491 #endif
492         if(s->avctx->fourcc == ff_get_fourcc("UMP4")){
493             s->workaround_bugs|= FF_BUG_UMP4;
494             s->workaround_bugs|= FF_BUG_AC_VLC;
495         }
496
497         if(s->divx_version){
498             s->workaround_bugs|= FF_BUG_QPEL_CHROMA;
499         }
500
501         if(s->avctx->fourcc == ff_get_fourcc("XVID") && s->xvid_build==0)
502             s->workaround_bugs|= FF_BUG_QPEL_CHROMA;
503         
504         if(s->avctx->fourcc == ff_get_fourcc("XVID") && s->xvid_build==0)
505             s->padding_bug_score= 256*256*256*64;
506         
507         if(s->xvid_build && s->xvid_build<=3)
508             s->padding_bug_score= 256*256*256*64;
509         
510         if(s->xvid_build && s->xvid_build<=1)
511             s->workaround_bugs|= FF_BUG_QPEL_CHROMA;
512
513 #define SET_QPEL_FUNC(postfix1, postfix2) \
514     s->dsp.put_ ## postfix1 = ff_put_ ## postfix2;\
515     s->dsp.put_no_rnd_ ## postfix1 = ff_put_no_rnd_ ## postfix2;\
516     s->dsp.avg_ ## postfix1 = ff_avg_ ## postfix2;
517
518         if(s->lavc_build && s->lavc_build<4653)
519             s->workaround_bugs|= FF_BUG_STD_QPEL;
520         
521 //printf("padding_bug_score: %d\n", s->padding_bug_score);
522 #if 0
523         if(s->divx_version==500)
524             s->workaround_bugs|= FF_BUG_NO_PADDING;
525
526         /* very ugly XVID padding bug detection FIXME/XXX solve this differently
527          * lets hope this at least works
528          */
529         if(   s->resync_marker==0 && s->data_partitioning==0 && s->divx_version==0
530            && s->codec_id==CODEC_ID_MPEG4 && s->vo_type==0)
531             s->workaround_bugs|= FF_BUG_NO_PADDING;
532         
533         if(s->lavc_build && s->lavc_build<4609) //FIXME not sure about the version num but a 4609 file seems ok
534             s->workaround_bugs|= FF_BUG_NO_PADDING;
535 #endif
536     }
537     
538     if(s->workaround_bugs& FF_BUG_STD_QPEL){
539         SET_QPEL_FUNC(qpel_pixels_tab[0][ 5], qpel16_mc11_old_c)
540         SET_QPEL_FUNC(qpel_pixels_tab[0][ 7], qpel16_mc31_old_c)
541         SET_QPEL_FUNC(qpel_pixels_tab[0][ 9], qpel16_mc12_old_c)
542         SET_QPEL_FUNC(qpel_pixels_tab[0][11], qpel16_mc32_old_c)
543         SET_QPEL_FUNC(qpel_pixels_tab[0][13], qpel16_mc13_old_c)
544         SET_QPEL_FUNC(qpel_pixels_tab[0][15], qpel16_mc33_old_c)
545
546         SET_QPEL_FUNC(qpel_pixels_tab[1][ 5], qpel8_mc11_old_c)
547         SET_QPEL_FUNC(qpel_pixels_tab[1][ 7], qpel8_mc31_old_c)
548         SET_QPEL_FUNC(qpel_pixels_tab[1][ 9], qpel8_mc12_old_c)
549         SET_QPEL_FUNC(qpel_pixels_tab[1][11], qpel8_mc32_old_c)
550         SET_QPEL_FUNC(qpel_pixels_tab[1][13], qpel8_mc13_old_c)
551         SET_QPEL_FUNC(qpel_pixels_tab[1][15], qpel8_mc33_old_c)
552     }
553
554 #if 0 // dump bits per frame / qp / complexity
555 {
556     static FILE *f=NULL;
557     if(!f) f=fopen("rate_qp_cplx.txt", "w");
558     fprintf(f, "%d %d %f\n", buf_size, s->qscale, buf_size*(double)s->qscale);
559 }
560 #endif
561        
562         /* After H263 & mpeg4 header decode we have the height, width,*/
563         /* and other parameters. So then we could init the picture   */
564         /* FIXME: By the way H263 decoder is evolving it should have */
565         /* an H263EncContext                                         */
566     if(s->aspected_height)
567         new_aspect= s->aspected_width*s->width / (float)(s->height*s->aspected_height);
568     else
569         new_aspect=0;
570     
571     if (   s->width != avctx->width || s->height != avctx->height 
572         || ABS(new_aspect - avctx->aspect_ratio) > 0.001) {
573         /* H.263 could change picture size any time */
574         MPV_common_end(s);
575         s->context_initialized=0;
576     }
577     if (!s->context_initialized) {
578         avctx->width = s->width;
579         avctx->height = s->height;
580         avctx->aspect_ratio= new_aspect;
581
582         goto retry;
583     }
584
585     if((s->codec_id==CODEC_ID_H263 || s->codec_id==CODEC_ID_H263P))
586         s->gob_index = ff_h263_get_gob_height(s);
587
588     if(ret==FRAME_SKIPED) return get_consumed_bytes(s, buf_size);
589     /* skip if the header was thrashed */
590     if (ret < 0){
591         fprintf(stderr, "header damaged\n");
592         return -1;
593     }
594     
595     // for hurry_up==5
596     s->current_picture.pict_type= s->pict_type;
597     s->current_picture.key_frame= s->pict_type == I_TYPE;
598
599     /* skip b frames if we dont have reference frames */
600     if(s->last_picture.data[0]==NULL && s->pict_type==B_TYPE) return get_consumed_bytes(s, buf_size);
601     /* skip b frames if we are in a hurry */
602     if(avctx->hurry_up && s->pict_type==B_TYPE) return get_consumed_bytes(s, buf_size);
603     /* skip everything if we are in a hurry>=5 */
604     if(avctx->hurry_up>=5) return get_consumed_bytes(s, buf_size);
605     
606     if(s->next_p_frame_damaged){
607         if(s->pict_type==B_TYPE)
608             return get_consumed_bytes(s, buf_size);
609         else
610             s->next_p_frame_damaged=0;
611     }
612
613     if(MPV_frame_start(s, avctx) < 0)
614         return -1;
615
616 #ifdef DEBUG
617     printf("qscale=%d\n", s->qscale);
618 #endif
619
620     if(s->error_resilience)
621         memset(s->error_status_table, MV_ERROR|AC_ERROR|DC_ERROR|VP_START|AC_END|DC_END|MV_END, s->mb_num*sizeof(UINT8));
622     
623     /* decode each macroblock */
624     s->block_wrap[0]=
625     s->block_wrap[1]=
626     s->block_wrap[2]=
627     s->block_wrap[3]= s->mb_width*2 + 2;
628     s->block_wrap[4]=
629     s->block_wrap[5]= s->mb_width + 2;
630     s->mb_x=0; 
631     s->mb_y=0;
632     
633     decode_slice(s);
634     s->error_status_table[0]|= VP_START;
635     while(s->mb_y<s->mb_height && s->gb.size_in_bits - get_bits_count(&s->gb)>16){
636         if(s->msmpeg4_version){
637             if(s->mb_x!=0 || (s->mb_y%s->slice_height)!=0)
638                 break;
639         }else{
640             if(ff_h263_resync(s)<0)
641                 break;
642         }
643         
644         if(s->msmpeg4_version<4 && s->h263_pred)
645             ff_mpeg4_clean_buffers(s);
646
647         decode_slice(s);
648
649         s->error_status_table[s->resync_mb_x + s->resync_mb_y*s->mb_width]|= VP_START;
650     }
651
652     if (s->h263_msmpeg4 && s->msmpeg4_version<4 && s->pict_type==I_TYPE)
653         if(msmpeg4_decode_ext_header(s, buf_size) < 0){
654             s->error_status_table[s->mb_num-1]= AC_ERROR|DC_ERROR|MV_ERROR;
655         }
656     
657     /* divx 5.01+ bistream reorder stuff */
658     if(s->codec_id==CODEC_ID_MPEG4 && s->bitstream_buffer_size==0 && s->divx_version>=500){
659         int current_pos= get_bits_count(&s->gb)>>3;
660
661         if(   buf_size - current_pos > 5 
662            && buf_size - current_pos < BITSTREAM_BUFFER_SIZE){
663             int i;
664             int startcode_found=0;
665             for(i=current_pos; i<buf_size-3; i++){
666                 if(buf[i]==0 && buf[i+1]==0 && buf[i+2]==1 && buf[i+3]==0xB6){
667                     startcode_found=1;
668                     break;
669                 }
670             }
671             if(startcode_found){
672                 memcpy(s->bitstream_buffer, buf + current_pos, buf_size - current_pos);
673                 s->bitstream_buffer_size= buf_size - current_pos;
674             }
675         }
676     }
677
678     if(s->error_resilience){
679         int error=0, num_end_markers=0;
680         for(i=0; i<s->mb_num; i++){
681             int status= s->error_status_table[i];
682 #if 0
683             if(i%s->mb_width == 0) printf("\n");
684             printf("%2X ", status); 
685 #endif
686             if(status==0) continue;
687
688             if(status&(DC_ERROR|AC_ERROR|MV_ERROR))
689                 error=1;
690             if(status&VP_START){
691                 if(num_end_markers) 
692                     error=1;
693                 num_end_markers=3;
694             }
695             if(status&AC_END)
696                 num_end_markers--;
697             if(status&DC_END)
698                 num_end_markers--;
699             if(status&MV_END)
700                 num_end_markers--;
701         }
702         if(num_end_markers || error){
703             fprintf(stderr, "concealing errors\n");
704             ff_error_resilience(s);
705         }
706     }
707
708     MPV_frame_end(s);
709
710     if((avctx->debug&FF_DEBUG_VIS_MV) && s->last_picture.data[0]){
711         const int shift= 1 + s->quarter_sample;
712         int mb_y;
713         uint8_t *ptr= s->last_picture.data[0];
714         s->low_delay=0; //needed to see the vectors without trashing the buffers
715
716         for(mb_y=0; mb_y<s->mb_height; mb_y++){
717             int mb_x;
718             for(mb_x=0; mb_x<s->mb_width; mb_x++){
719                 const int mb_index= mb_x + mb_y*s->mb_width;
720                 if(s->co_located_type_table[mb_index] == MV_TYPE_8X8){
721                     int i;
722                     for(i=0; i<4; i++){
723                         int sx= mb_x*16 + 4 + 8*(i&1);
724                         int sy= mb_y*16 + 4 + 8*(i>>1);
725                         int xy= 1 + mb_x*2 + (i&1) + (mb_y*2 + 1 + (i>>1))*(s->mb_width*2 + 2);
726                         int mx= (s->motion_val[xy][0]>>shift) + sx;
727                         int my= (s->motion_val[xy][1]>>shift) + sy;
728                         draw_line(ptr, sx, sy, mx, my, s->width, s->height, s->linesize, 100);
729                     }
730                 }else{
731                     int sx= mb_x*16 + 8;
732                     int sy= mb_y*16 + 8;
733                     int xy= 1 + mb_x*2 + (mb_y*2 + 1)*(s->mb_width*2 + 2);
734                     int mx= (s->motion_val[xy][0]>>shift) + sx;
735                     int my= (s->motion_val[xy][1]>>shift) + sy;
736                     draw_line(ptr, sx, sy, mx, my, s->width, s->height, s->linesize, 100);
737                 }
738                 s->mbskip_table[mb_index]=0;
739             }
740         }
741     }
742
743
744     if(s->pict_type==B_TYPE || s->low_delay){
745         *pict= *(AVFrame*)&s->current_picture;
746     } else {
747         *pict= *(AVFrame*)&s->last_picture;
748     }
749
750     if(avctx->debug&FF_DEBUG_QP){
751         int8_t *qtab= pict->qscale_table;
752         int x,y;
753         
754         for(y=0; y<s->mb_height; y++){
755             for(x=0; x<s->mb_width; x++){
756                 printf("%2d ", qtab[x + y*s->mb_width]);
757             }
758             printf("\n");
759         }
760         printf("\n");
761     }
762
763     /* Return the Picture timestamp as the frame number */
764     /* we substract 1 because it is added on utils.c    */
765     avctx->frame_number = s->picture_number - 1;
766
767     /* dont output the last pic after seeking */
768     if(s->last_picture.data[0] || s->low_delay)
769         *data_size = sizeof(AVFrame);
770 #ifdef PRINT_FRAME_TIME
771 printf("%Ld\n", rdtsc()-time);
772 #endif
773     return get_consumed_bytes(s, buf_size);
774 }
775
776 AVCodec mpeg4_decoder = {
777     "mpeg4",
778     CODEC_TYPE_VIDEO,
779     CODEC_ID_MPEG4,
780     sizeof(MpegEncContext),
781     ff_h263_decode_init,
782     NULL,
783     ff_h263_decode_end,
784     ff_h263_decode_frame,
785     CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED,
786 };
787
788 AVCodec h263_decoder = {
789     "h263",
790     CODEC_TYPE_VIDEO,
791     CODEC_ID_H263,
792     sizeof(MpegEncContext),
793     ff_h263_decode_init,
794     NULL,
795     ff_h263_decode_end,
796     ff_h263_decode_frame,
797     CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
798 };
799
800 AVCodec msmpeg4v1_decoder = {
801     "msmpeg4v1",
802     CODEC_TYPE_VIDEO,
803     CODEC_ID_MSMPEG4V1,
804     sizeof(MpegEncContext),
805     ff_h263_decode_init,
806     NULL,
807     ff_h263_decode_end,
808     ff_h263_decode_frame,
809     CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
810 };
811
812 AVCodec msmpeg4v2_decoder = {
813     "msmpeg4v2",
814     CODEC_TYPE_VIDEO,
815     CODEC_ID_MSMPEG4V2,
816     sizeof(MpegEncContext),
817     ff_h263_decode_init,
818     NULL,
819     ff_h263_decode_end,
820     ff_h263_decode_frame,
821     CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
822 };
823
824 AVCodec msmpeg4v3_decoder = {
825     "msmpeg4",
826     CODEC_TYPE_VIDEO,
827     CODEC_ID_MSMPEG4V3,
828     sizeof(MpegEncContext),
829     ff_h263_decode_init,
830     NULL,
831     ff_h263_decode_end,
832     ff_h263_decode_frame,
833     CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
834 };
835
836 AVCodec wmv1_decoder = {
837     "wmv1",
838     CODEC_TYPE_VIDEO,
839     CODEC_ID_WMV1,
840     sizeof(MpegEncContext),
841     ff_h263_decode_init,
842     NULL,
843     ff_h263_decode_end,
844     ff_h263_decode_frame,
845     CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
846 };
847
848 AVCodec h263i_decoder = {
849     "h263i",
850     CODEC_TYPE_VIDEO,
851     CODEC_ID_H263I,
852     sizeof(MpegEncContext),
853     ff_h263_decode_init,
854     NULL,
855     ff_h263_decode_end,
856     ff_h263_decode_frame,
857     CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
858 };
859