]> git.sesse.net Git - ffmpeg/blob - libavcodec/h263dec.c
workaround old xvid bug
[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 static int 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
59     /* select sub codec */
60     switch(avctx->codec->id) {
61     case CODEC_ID_H263:
62         s->gob_number = 0;
63         break;
64     case CODEC_ID_MPEG4:
65         s->time_increment_bits = 4; /* default value for broken headers */
66         s->h263_pred = 1;
67         s->has_b_frames = 1; //default, might be overriden in the vol header during header parsing
68         break;
69     case CODEC_ID_MSMPEG4V1:
70         s->h263_msmpeg4 = 1;
71         s->h263_pred = 1;
72         s->msmpeg4_version=1;
73         break;
74     case CODEC_ID_MSMPEG4V2:
75         s->h263_msmpeg4 = 1;
76         s->h263_pred = 1;
77         s->msmpeg4_version=2;
78         break;
79     case CODEC_ID_MSMPEG4V3:
80         s->h263_msmpeg4 = 1;
81         s->h263_pred = 1;
82         s->msmpeg4_version=3;
83         break;
84     case CODEC_ID_WMV1:
85         s->h263_msmpeg4 = 1;
86         s->h263_pred = 1;
87         s->msmpeg4_version=4;
88         break;
89     case CODEC_ID_WMV2:
90         s->h263_msmpeg4 = 1;
91         s->h263_pred = 1;
92         s->msmpeg4_version=5;
93         break;
94     case CODEC_ID_H263I:
95         s->h263_intel = 1;
96         break;
97     default:
98         return -1;
99     }
100     s->codec_id= avctx->codec->id;
101
102     /* for h263, we allocate the images after having read the header */
103     if (avctx->codec->id != CODEC_ID_H263 && avctx->codec->id != CODEC_ID_MPEG4)
104         if (MPV_common_init(s) < 0)
105             return -1;
106
107     if (s->h263_msmpeg4)
108         ff_msmpeg4_decode_init(s);
109     else
110         h263_decode_init_vlc(s);
111     
112     return 0;
113 }
114
115 static int h263_decode_end(AVCodecContext *avctx)
116 {
117     MpegEncContext *s = avctx->priv_data;
118
119     MPV_common_end(s);
120     return 0;
121 }
122
123 /**
124  * retunrs the number of bytes consumed for building the current frame
125  */
126 static int get_consumed_bytes(MpegEncContext *s, int buf_size){
127     int pos= (get_bits_count(&s->gb)+7)>>3;
128     
129     if(s->divx_version>=500){
130         //we would have to scan through the whole buf to handle the weird reordering ...
131         return buf_size; 
132     }else if(s->flags&CODEC_FLAG_TRUNCATED){
133         pos -= s->parse_context.last_index;
134         if(pos<0) pos=0; // padding is not really read so this might be -1
135         return pos;
136     }else{
137         if(pos==0) pos=1; //avoid infinite loops (i doubt thats needed but ...)
138         if(pos+10>buf_size) pos=buf_size; // oops ;)
139
140         return pos;
141     }
142 }
143
144 static int decode_slice(MpegEncContext *s){
145     s->last_resync_gb= s->gb;
146     s->first_slice_line= 1;
147         
148     s->resync_mb_x= s->mb_x;
149     s->resync_mb_y= s->mb_y;
150
151     s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
152     s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
153     
154     if(s->partitioned_frame){
155         const int qscale= s->qscale;
156
157         if(s->codec_id==CODEC_ID_MPEG4){
158             if(ff_mpeg4_decode_partitions(s) < 0)
159                 return -1; 
160         }
161         
162         /* restore variables which where modified */
163         s->first_slice_line=1;
164         s->mb_x= s->resync_mb_x;
165         s->mb_y= s->resync_mb_y;
166         s->qscale= qscale;
167         s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
168         s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
169     }
170
171     for(; s->mb_y < s->mb_height; s->mb_y++) {
172         /* per-row end of slice checks */
173         if(s->msmpeg4_version){
174             if(s->resync_mb_y + s->slice_height == s->mb_y){
175                 const int xy= s->mb_x + s->mb_y*s->mb_width;
176                 s->error_status_table[xy-1]|= AC_END|DC_END|MV_END;
177                 return 0;
178             }
179         }
180         
181         if(s->msmpeg4_version==1){
182             s->last_dc[0]=
183             s->last_dc[1]=
184             s->last_dc[2]= 128;
185         }
186     
187         ff_init_block_index(s);
188         for(; s->mb_x < s->mb_width; s->mb_x++) {
189             int ret;
190
191             ff_update_block_index(s);
192
193             if(s->resync_mb_x == s->mb_x && s->resync_mb_y+1 == s->mb_y){
194                 s->first_slice_line=0; 
195             }
196
197             /* DCT & quantize */
198             s->dsp.clear_blocks(s->block[0]);
199             
200             s->mv_dir = MV_DIR_FORWARD;
201             s->mv_type = MV_TYPE_16X16;
202 //            s->mb_skiped = 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             PRINT_QP("%2d", s->qscale);
207             MPV_decode_mb(s, s->block);
208
209             if(ret<0){
210                 const int xy= s->mb_x + s->mb_y*s->mb_width;
211                 if(ret==SLICE_END){
212 //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));
213                     s->error_status_table[xy]|= AC_END;
214                     if(!s->partitioned_frame)
215                         s->error_status_table[xy]|= MV_END|DC_END;
216
217                     s->padding_bug_score--;
218                         
219                     if(++s->mb_x >= s->mb_width){
220                         s->mb_x=0;
221                         ff_draw_horiz_band(s);
222                         s->mb_y++;
223                     }
224                     return 0; 
225                 }else if(ret==SLICE_NOEND){
226                     fprintf(stderr,"Slice mismatch at MB: %d\n", xy);
227                     return -1;
228                 }
229                 fprintf(stderr,"Error at MB: %d\n", xy);
230                 s->error_status_table[xy]|= AC_ERROR;
231                 if(!s->partitioned_frame)
232                     s->error_status_table[xy]|= DC_ERROR|MV_ERROR;
233     
234                 return -1;
235             }
236         }
237         
238         ff_draw_horiz_band(s);
239         
240         PRINT_QP("%s", "\n");
241         
242         s->mb_x= 0;
243     }
244     
245     assert(s->mb_x==0 && s->mb_y==s->mb_height);
246
247     /* try to detect the padding bug */
248     if(      s->codec_id==CODEC_ID_MPEG4
249        &&   (s->workaround_bugs&FF_BUG_AUTODETECT) 
250        &&    s->gb.size*8 - get_bits_count(&s->gb) >=0
251        &&    s->gb.size*8 - get_bits_count(&s->gb) < 48
252        &&   !s->resync_marker
253        &&   !s->data_partitioning){
254         
255         const int bits_count= get_bits_count(&s->gb);
256         const int bits_left = s->gb.size*8 - bits_count;
257         
258         if(bits_left==0 || bits_left>8){
259             s->padding_bug_score++;
260         } else if(bits_left != 1){
261             int v= show_bits(&s->gb, 8);
262             v|= 0x7F >> (7-(bits_count&7));
263
264             if(v==0x7F)
265                 s->padding_bug_score--;
266             else
267                 s->padding_bug_score++;            
268         }
269         
270         if(s->padding_bug_score > -2)
271             s->workaround_bugs |=  FF_BUG_NO_PADDING;
272         else
273             s->workaround_bugs &= ~FF_BUG_NO_PADDING;
274     }
275
276     // handle formats which dont have unique end markers
277     if(s->msmpeg4_version || (s->workaround_bugs&FF_BUG_NO_PADDING)){ //FIXME perhaps solve this more cleanly
278         int left= s->gb.size*8 - get_bits_count(&s->gb);
279         int max_extra=7;
280         
281         /* no markers in M$ crap */
282         if(s->msmpeg4_version && s->pict_type==I_TYPE)
283             max_extra+= 17;
284         
285         /* buggy padding but the frame should still end approximately at the bitstream end */
286         if((s->workaround_bugs&FF_BUG_NO_PADDING) && s->error_resilience>=3)
287             max_extra+= 48;
288         else if((s->workaround_bugs&FF_BUG_NO_PADDING))
289             max_extra+= 256*256*256*64;
290         
291         if(left>max_extra){
292             fprintf(stderr, "discarding %d junk bits at end, next would be %X\n", left, show_bits(&s->gb, 24));
293         }
294         else if(left<0){
295             fprintf(stderr, "overreading %d bits\n", -left);
296         }else
297             s->error_status_table[s->mb_num-1]|= AC_END|MV_END|DC_END;
298         
299         return 0;
300     }
301
302     fprintf(stderr, "slice end not reached but screenspace end (%d left %06X)\n", 
303             s->gb.size*8 - get_bits_count(&s->gb),
304             show_bits(&s->gb, 24));
305     return -1;
306 }
307
308 /**
309  * finds the end of the current frame in the bitstream.
310  * @return the position of the first byte of the next frame, or -1
311  */
312 static int mpeg4_find_frame_end(MpegEncContext *s, UINT8 *buf, int buf_size){
313     ParseContext *pc= &s->parse_context;
314     int vop_found, i;
315     uint32_t state;
316     
317     vop_found= pc->frame_start_found;
318     state= pc->state;
319     
320     i=0;
321     if(!vop_found){
322         for(i=0; i<buf_size; i++){
323             state= (state<<8) | buf[i];
324             if(state == 0x1B6){
325                 i++;
326                 vop_found=1;
327                 break;
328             }
329         }
330     }
331     
332     for(; i<buf_size; i++){
333         state= (state<<8) | buf[i];
334         if((state&0xFFFFFF00) == 0x100){
335             pc->frame_start_found=0;
336             pc->state=-1; 
337             return i-3;
338         }
339     }
340     pc->frame_start_found= vop_found;
341     pc->state= state;
342     return -1;
343 }
344
345 static int h263_decode_frame(AVCodecContext *avctx, 
346                              void *data, int *data_size,
347                              UINT8 *buf, int buf_size)
348 {
349     MpegEncContext *s = avctx->priv_data;
350     int ret,i;
351     AVVideoFrame *pict = data; 
352     float new_aspect;
353     
354 #ifdef PRINT_FRAME_TIME
355 uint64_t time= rdtsc();
356 #endif
357 #ifdef DEBUG
358     printf("*****frame %d size=%d\n", avctx->frame_number, buf_size);
359     printf("bytes=%x %x %x %x\n", buf[0], buf[1], buf[2], buf[3]);
360 #endif
361     s->flags= avctx->flags;
362
363     *data_size = 0;
364    
365    /* no supplementary picture */
366     if (buf_size == 0) {
367         return 0;
368     }
369     
370     if(s->flags&CODEC_FLAG_TRUNCATED){
371         int next;
372         ParseContext *pc= &s->parse_context;
373         
374         pc->last_index= pc->index;
375
376         if(s->codec_id==CODEC_ID_MPEG4){
377             next= mpeg4_find_frame_end(s, buf, buf_size);
378         }else{
379             fprintf(stderr, "this codec doesnt support truncated bitstreams\n");
380             return -1;
381         }
382         if(next==-1){
383             if(buf_size + FF_INPUT_BUFFER_PADDING_SIZE + pc->index > pc->buffer_size){
384                 pc->buffer_size= buf_size + pc->index + 10*1024;
385                 pc->buffer= realloc(pc->buffer, pc->buffer_size);
386             }
387
388             memcpy(&pc->buffer[pc->index], buf, buf_size);
389             pc->index += buf_size;
390             return buf_size;
391         }
392
393         if(pc->index){
394             if(next + FF_INPUT_BUFFER_PADDING_SIZE + pc->index > pc->buffer_size){
395                 pc->buffer_size= next + pc->index + 10*1024;
396                 pc->buffer= realloc(pc->buffer, pc->buffer_size);
397             }
398
399             memcpy(&pc->buffer[pc->index], buf, next + FF_INPUT_BUFFER_PADDING_SIZE );
400             pc->index = 0;
401             buf= pc->buffer;
402             buf_size= pc->last_index + next;
403         }
404     }
405
406 retry:
407     
408     if(s->bitstream_buffer_size && buf_size<20){ //divx 5.01+ frame reorder
409         init_get_bits(&s->gb, s->bitstream_buffer, s->bitstream_buffer_size);
410     }else
411         init_get_bits(&s->gb, buf, buf_size);
412     s->bitstream_buffer_size=0;
413
414     if (!s->context_initialized) {
415         if (MPV_common_init(s) < 0) //we need the idct permutaton for reading a custom matrix
416             return -1;
417     }
418         
419     /* let's go :-) */
420     if (s->h263_msmpeg4) {
421         ret = msmpeg4_decode_picture_header(s);
422     } else if (s->h263_pred) {
423         if(s->avctx->extradata_size && s->picture_number==0){
424             GetBitContext gb;
425             
426             init_get_bits(&gb, s->avctx->extradata, s->avctx->extradata_size);
427             ret = ff_mpeg4_decode_picture_header(s, &gb);
428         }
429         ret = ff_mpeg4_decode_picture_header(s, &s->gb);
430
431         if(s->flags& CODEC_FLAG_LOW_DELAY)
432             s->low_delay=1;
433
434         s->has_b_frames= !s->low_delay;
435     } else if (s->h263_intel) {
436         ret = intel_h263_decode_picture_header(s);
437     } else {
438         ret = h263_decode_picture_header(s);
439     }
440     avctx->has_b_frames= s->has_b_frames;
441
442     if(s->workaround_bugs&FF_BUG_AUTODETECT){
443         if(s->avctx->fourcc == ff_get_fourcc("XVIX")) 
444             s->workaround_bugs|= FF_BUG_XVID_ILACE;
445
446         if(s->avctx->fourcc == ff_get_fourcc("MP4S")) 
447             s->workaround_bugs|= FF_BUG_AC_VLC;
448         
449         if(s->avctx->fourcc == ff_get_fourcc("M4S2")) 
450             s->workaround_bugs|= FF_BUG_AC_VLC;
451                 
452         if(s->avctx->fourcc == ff_get_fourcc("UMP4")){
453             s->workaround_bugs|= FF_BUG_UMP4;
454             s->workaround_bugs|= FF_BUG_AC_VLC;
455         }
456
457         if(s->divx_version){
458             s->workaround_bugs|= FF_BUG_QPEL_CHROMA;
459         }
460
461         if(s->avctx->fourcc == ff_get_fourcc("XVID") && s->xvid_build==0)
462             s->workaround_bugs|= FF_BUG_QPEL_CHROMA;
463         
464         if(s->avctx->fourcc == ff_get_fourcc("XVID") && s->xvid_build==0)
465             s->padding_bug_score= 256*256*256*64;
466         
467         if(s->xvid_build && s->xvid_build<=1)
468             s->workaround_bugs|= FF_BUG_QPEL_CHROMA;
469
470 //printf("padding_bug_score: %d\n", s->padding_bug_score);
471 #if 0
472         if(s->divx_version==500)
473             s->workaround_bugs|= FF_BUG_NO_PADDING;
474
475         /* very ugly XVID padding bug detection FIXME/XXX solve this differently
476          * lets hope this at least works
477          */
478         if(   s->resync_marker==0 && s->data_partitioning==0 && s->divx_version==0
479            && s->codec_id==CODEC_ID_MPEG4 && s->vo_type==0)
480             s->workaround_bugs|= FF_BUG_NO_PADDING;
481         
482         if(s->lavc_build && s->lavc_build<4609) //FIXME not sure about the version num but a 4609 file seems ok
483             s->workaround_bugs|= FF_BUG_NO_PADDING;
484 #endif
485     }
486     
487
488 #if 0 // dump bits per frame / qp / complexity
489 {
490     static FILE *f=NULL;
491     if(!f) f=fopen("rate_qp_cplx.txt", "w");
492     fprintf(f, "%d %d %f\n", buf_size, s->qscale, buf_size*(double)s->qscale);
493 }
494 #endif
495        
496         /* After H263 & mpeg4 header decode we have the height, width,*/
497         /* and other parameters. So then we could init the picture   */
498         /* FIXME: By the way H263 decoder is evolving it should have */
499         /* an H263EncContext                                         */
500     if(s->aspected_height)
501         new_aspect= s->aspected_width*s->width / (float)(s->height*s->aspected_height);
502     else
503         new_aspect=0;
504     
505     if (   s->width != avctx->width || s->height != avctx->height 
506         || ABS(new_aspect - avctx->aspect_ratio) > 0.001) {
507         /* H.263 could change picture size any time */
508         MPV_common_end(s);
509         s->context_initialized=0;
510     }
511     if (!s->context_initialized) {
512         avctx->width = s->width;
513         avctx->height = s->height;
514         avctx->aspect_ratio= new_aspect;
515
516         goto retry;
517     }
518
519     if((s->codec_id==CODEC_ID_H263 || s->codec_id==CODEC_ID_H263P))
520         s->gob_index = ff_h263_get_gob_height(s);
521
522     if(ret==FRAME_SKIPED) return get_consumed_bytes(s, buf_size);
523     /* skip if the header was thrashed */
524     if (ret < 0){
525         fprintf(stderr, "header damaged\n");
526         return -1;
527     }
528     
529     // for hurry_up==5
530     s->current_picture.pict_type= s->pict_type;
531     s->current_picture.key_frame= s->pict_type == I_TYPE;
532
533     /* skip b frames if we dont have reference frames */
534     if(s->num_available_buffers<2 && s->pict_type==B_TYPE) return get_consumed_bytes(s, buf_size);
535     /* skip b frames if we are in a hurry */
536     if(avctx->hurry_up && s->pict_type==B_TYPE) return get_consumed_bytes(s, buf_size);
537     /* skip everything if we are in a hurry>=5 */
538     if(avctx->hurry_up>=5) return get_consumed_bytes(s, buf_size);
539     
540     if(s->next_p_frame_damaged){
541         if(s->pict_type==B_TYPE)
542             return get_consumed_bytes(s, buf_size);
543         else
544             s->next_p_frame_damaged=0;
545     }
546
547     if(MPV_frame_start(s, avctx) < 0)
548         return -1;
549
550 #ifdef DEBUG
551     printf("qscale=%d\n", s->qscale);
552 #endif
553
554     if(s->error_resilience)
555         memset(s->error_status_table, MV_ERROR|AC_ERROR|DC_ERROR|VP_START|AC_END|DC_END|MV_END, s->mb_num*sizeof(UINT8));
556     
557     /* decode each macroblock */
558     s->block_wrap[0]=
559     s->block_wrap[1]=
560     s->block_wrap[2]=
561     s->block_wrap[3]= s->mb_width*2 + 2;
562     s->block_wrap[4]=
563     s->block_wrap[5]= s->mb_width + 2;
564     s->mb_x=0; 
565     s->mb_y=0;
566     
567     decode_slice(s);
568     s->error_status_table[0]|= VP_START;
569     while(s->mb_y<s->mb_height && s->gb.size*8 - get_bits_count(&s->gb)>16){
570         if(s->msmpeg4_version){
571             if(s->mb_x!=0 || (s->mb_y%s->slice_height)!=0)
572                 break;
573         }else{
574             if(ff_h263_resync(s)<0)
575                 break;
576         }
577         
578         if(s->msmpeg4_version!=4 && s->h263_pred)
579             ff_mpeg4_clean_buffers(s);
580
581         decode_slice(s);
582
583         s->error_status_table[s->resync_mb_x + s->resync_mb_y*s->mb_width]|= VP_START;
584     }
585
586     if (s->h263_msmpeg4 && s->msmpeg4_version<4 && s->pict_type==I_TYPE)
587         if(msmpeg4_decode_ext_header(s, buf_size) < 0){
588             s->error_status_table[s->mb_num-1]= AC_ERROR|DC_ERROR|MV_ERROR;
589         }
590     
591     /* divx 5.01+ bistream reorder stuff */
592     if(s->codec_id==CODEC_ID_MPEG4 && s->bitstream_buffer_size==0 && s->divx_version>=500){
593         int current_pos= get_bits_count(&s->gb)>>3;
594
595         if(   buf_size - current_pos > 5 
596            && buf_size - current_pos < BITSTREAM_BUFFER_SIZE){
597             int i;
598             int startcode_found=0;
599             for(i=current_pos; i<buf_size-3; i++){
600                 if(buf[i]==0 && buf[i+1]==0 && buf[i+2]==1 && buf[i+3]==0xB6){
601                     startcode_found=1;
602                     break;
603                 }
604             }
605             if(startcode_found){
606                 memcpy(s->bitstream_buffer, buf + current_pos, buf_size - current_pos);
607                 s->bitstream_buffer_size= buf_size - current_pos;
608             }
609         }
610     }
611
612     if(s->error_resilience){
613         int error=0, num_end_markers=0;
614         for(i=0; i<s->mb_num; i++){
615             int status= s->error_status_table[i];
616 #if 0
617             if(i%s->mb_width == 0) printf("\n");
618             printf("%2X ", status); 
619 #endif
620             if(status==0) continue;
621
622             if(status&(DC_ERROR|AC_ERROR|MV_ERROR))
623                 error=1;
624             if(status&VP_START){
625                 if(num_end_markers) 
626                     error=1;
627                 num_end_markers=3;
628             }
629             if(status&AC_END)
630                 num_end_markers--;
631             if(status&DC_END)
632                 num_end_markers--;
633             if(status&MV_END)
634                 num_end_markers--;
635         }
636         if(num_end_markers || error){
637             fprintf(stderr, "concealing errors\n");
638 //printf("type:%d\n", s->pict_type);
639             ff_error_resilience(s);
640         }
641     }
642
643     MPV_frame_end(s);
644 #if 0 //dirty show MVs, we should export the MV tables and write a filter to show them
645 {
646   int mb_y;
647   s->has_b_frames=1;
648   for(mb_y=0; mb_y<s->mb_height; mb_y++){
649     int mb_x;
650     int y= mb_y*16 + 8;
651     for(mb_x=0; mb_x<s->mb_width; mb_x++){
652       int x= mb_x*16 + 8;
653       uint8_t *ptr= s->last_picture.data[0];
654       int xy= 1 + mb_x*2 + (mb_y*2 + 1)*(s->mb_width*2 + 2);
655       int mx= (s->motion_val[xy][0]>>1) + x;
656       int my= (s->motion_val[xy][1]>>1) + y;
657       int i;
658       int max;
659
660       if(mx<0) mx=0;
661       if(my<0) my=0;
662       if(mx>=s->width)  mx= s->width -1;
663       if(my>=s->height) my= s->height-1;
664       max= ABS(mx-x);
665       if(ABS(my-y) > max) max= ABS(my-y);
666       /* the ugliest linedrawing routine ... */
667       for(i=0; i<max; i++){
668         int x1= x + (mx-x)*i/max;
669         int y1= y + (my-y)*i/max;
670         ptr[y1*s->linesize + x1]+=100;
671       }
672       ptr[y*s->linesize + x]+=100;
673       s->mbskip_table[mb_x + mb_y*s->mb_width]=0;
674     }
675   }
676
677 }
678 #endif
679     if(s->pict_type==B_TYPE || (!s->has_b_frames)){
680         *pict= *(AVVideoFrame*)&s->current_picture;
681     } else {
682         *pict= *(AVVideoFrame*)&s->last_picture;
683     }
684
685     /* Return the Picture timestamp as the frame number */
686     /* we substract 1 because it is added on utils.c    */
687     avctx->frame_number = s->picture_number - 1;
688
689     /* dont output the last pic after seeking 
690        note we allready added +1 for the current pix in MPV_frame_end(s) */
691     if(s->num_available_buffers>=2 || (!s->has_b_frames))
692         *data_size = sizeof(AVVideoFrame);
693 #ifdef PRINT_FRAME_TIME
694 printf("%Ld\n", rdtsc()-time);
695 #endif
696     return get_consumed_bytes(s, buf_size);
697 }
698
699 AVCodec mpeg4_decoder = {
700     "mpeg4",
701     CODEC_TYPE_VIDEO,
702     CODEC_ID_MPEG4,
703     sizeof(MpegEncContext),
704     h263_decode_init,
705     NULL,
706     h263_decode_end,
707     h263_decode_frame,
708     CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED,
709 };
710
711 AVCodec h263_decoder = {
712     "h263",
713     CODEC_TYPE_VIDEO,
714     CODEC_ID_H263,
715     sizeof(MpegEncContext),
716     h263_decode_init,
717     NULL,
718     h263_decode_end,
719     h263_decode_frame,
720     CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
721 };
722
723 AVCodec msmpeg4v1_decoder = {
724     "msmpeg4v1",
725     CODEC_TYPE_VIDEO,
726     CODEC_ID_MSMPEG4V1,
727     sizeof(MpegEncContext),
728     h263_decode_init,
729     NULL,
730     h263_decode_end,
731     h263_decode_frame,
732     CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
733 };
734
735 AVCodec msmpeg4v2_decoder = {
736     "msmpeg4v2",
737     CODEC_TYPE_VIDEO,
738     CODEC_ID_MSMPEG4V2,
739     sizeof(MpegEncContext),
740     h263_decode_init,
741     NULL,
742     h263_decode_end,
743     h263_decode_frame,
744     CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
745 };
746
747 AVCodec msmpeg4v3_decoder = {
748     "msmpeg4",
749     CODEC_TYPE_VIDEO,
750     CODEC_ID_MSMPEG4V3,
751     sizeof(MpegEncContext),
752     h263_decode_init,
753     NULL,
754     h263_decode_end,
755     h263_decode_frame,
756     CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
757 };
758
759 AVCodec wmv1_decoder = {
760     "wmv1",
761     CODEC_TYPE_VIDEO,
762     CODEC_ID_WMV1,
763     sizeof(MpegEncContext),
764     h263_decode_init,
765     NULL,
766     h263_decode_end,
767     h263_decode_frame,
768     CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
769 };
770
771 AVCodec wmv2_decoder = {
772     "wmv2",
773     CODEC_TYPE_VIDEO,
774     CODEC_ID_WMV2,
775     sizeof(MpegEncContext),
776     h263_decode_init,
777     NULL,
778     h263_decode_end,
779     h263_decode_frame,
780     CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
781 };
782
783 AVCodec h263i_decoder = {
784     "h263i",
785     CODEC_TYPE_VIDEO,
786     CODEC_ID_H263I,
787     sizeof(MpegEncContext),
788     h263_decode_init,
789     NULL,
790     h263_decode_end,
791     h263_decode_frame,
792     CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
793 };
794