3 * Copyright (c) 2001 Fabrice Bellard.
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.
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.
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
21 #include "mpegvideo.h"
24 #define PRINT_QP(a, b) {}
26 #define PRINT_QP(a, b) printf(a, b)
30 //#define PRINT_FRAME_TIME
31 #ifdef PRINT_FRAME_TIME
32 static inline long long rdtsc()
35 asm volatile( "rdtsc\n\t"
38 // printf("%d\n", int(l/1000));
43 static int h263_decode_init(AVCodecContext
*avctx
)
45 MpegEncContext
*s
= avctx
->priv_data
;
48 s
->out_format
= FMT_H263
;
50 s
->width
= avctx
->width
;
51 s
->height
= avctx
->height
;
52 s
->workaround_bugs
= avctx
->workaround_bugs
;
56 s
->progressive_sequence
=1;
57 s
->decode_mb
= ff_h263_decode_mb
;
60 /* select sub codec */
61 switch(avctx
->codec
->id
) {
66 s
->time_increment_bits
= 4; /* default value for broken headers */
68 s
->low_delay
= 0; //default, might be overriden in the vol header during header parsing
70 case CODEC_ID_MSMPEG4V1
:
75 case CODEC_ID_MSMPEG4V2
:
80 case CODEC_ID_MSMPEG4V3
:
101 s
->codec_id
= avctx
->codec
->id
;
103 /* for h263, we allocate the images after having read the header */
104 if (avctx
->codec
->id
!= CODEC_ID_H263
&& avctx
->codec
->id
!= CODEC_ID_MPEG4
)
105 if (MPV_common_init(s
) < 0)
109 ff_msmpeg4_decode_init(s
);
111 h263_decode_init_vlc(s
);
116 static int h263_decode_end(AVCodecContext
*avctx
)
118 MpegEncContext
*s
= avctx
->priv_data
;
125 * retunrs the number of bytes consumed for building the current frame
127 static int get_consumed_bytes(MpegEncContext
*s
, int buf_size
){
128 int pos
= (get_bits_count(&s
->gb
)+7)>>3;
130 if(s
->divx_version
>=500){
131 //we would have to scan through the whole buf to handle the weird reordering ...
133 }else if(s
->flags
&CODEC_FLAG_TRUNCATED
){
134 pos
-= s
->parse_context
.last_index
;
135 if(pos
<0) pos
=0; // padding is not really read so this might be -1
138 if(pos
==0) pos
=1; //avoid infinite loops (i doubt thats needed but ...)
139 if(pos
+10>buf_size
) pos
=buf_size
; // oops ;)
145 static int decode_slice(MpegEncContext
*s
){
146 s
->last_resync_gb
= s
->gb
;
147 s
->first_slice_line
= 1;
149 s
->resync_mb_x
= s
->mb_x
;
150 s
->resync_mb_y
= s
->mb_y
;
152 s
->y_dc_scale
= s
->y_dc_scale_table
[ s
->qscale
];
153 s
->c_dc_scale
= s
->c_dc_scale_table
[ s
->qscale
];
155 if(s
->partitioned_frame
){
156 const int qscale
= s
->qscale
;
158 if(s
->codec_id
==CODEC_ID_MPEG4
){
159 if(ff_mpeg4_decode_partitions(s
) < 0)
163 /* restore variables which where modified */
164 s
->first_slice_line
=1;
165 s
->mb_x
= s
->resync_mb_x
;
166 s
->mb_y
= s
->resync_mb_y
;
168 s
->y_dc_scale
= s
->y_dc_scale_table
[ s
->qscale
];
169 s
->c_dc_scale
= s
->c_dc_scale_table
[ s
->qscale
];
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 const int xy
= s
->mb_x
+ s
->mb_y
*s
->mb_width
;
177 s
->error_status_table
[xy
-1]|= AC_END
|DC_END
|MV_END
;
182 if(s
->msmpeg4_version
==1){
188 ff_init_block_index(s
);
189 for(; s
->mb_x
< s
->mb_width
; s
->mb_x
++) {
192 ff_update_block_index(s
);
194 if(s
->resync_mb_x
== s
->mb_x
&& s
->resync_mb_y
+1 == s
->mb_y
){
195 s
->first_slice_line
=0;
199 s
->dsp
.clear_blocks(s
->block
[0]);
201 s
->mv_dir
= MV_DIR_FORWARD
;
202 s
->mv_type
= MV_TYPE_16X16
;
204 //printf("%d %d %06X\n", ret, get_bits_count(&s->gb), show_bits(&s->gb, 24));
205 ret
= s
->decode_mb(s
, s
->block
);
207 PRINT_QP("%2d", s
->qscale
);
208 MPV_decode_mb(s
, s
->block
);
211 const int xy
= s
->mb_x
+ s
->mb_y
*s
->mb_width
;
213 //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));
214 s
->error_status_table
[xy
]|= AC_END
;
215 if(!s
->partitioned_frame
)
216 s
->error_status_table
[xy
]|= MV_END
|DC_END
;
218 s
->padding_bug_score
--;
220 if(++s
->mb_x
>= s
->mb_width
){
222 ff_draw_horiz_band(s
);
226 }else if(ret
==SLICE_NOEND
){
227 fprintf(stderr
,"Slice mismatch at MB: %d\n", xy
);
230 fprintf(stderr
,"Error at MB: %d\n", xy
);
231 s
->error_status_table
[xy
]|= AC_ERROR
;
232 if(!s
->partitioned_frame
)
233 s
->error_status_table
[xy
]|= DC_ERROR
|MV_ERROR
;
239 ff_draw_horiz_band(s
);
241 PRINT_QP("%s", "\n");
246 assert(s
->mb_x
==0 && s
->mb_y
==s
->mb_height
);
248 /* try to detect the padding bug */
249 if( s
->codec_id
==CODEC_ID_MPEG4
250 && (s
->workaround_bugs
&FF_BUG_AUTODETECT
)
251 && s
->gb
.size
*8 - get_bits_count(&s
->gb
) >=0
252 && s
->gb
.size
*8 - get_bits_count(&s
->gb
) < 48
253 // && !s->resync_marker
254 && !s
->data_partitioning
){
256 const int bits_count
= get_bits_count(&s
->gb
);
257 const int bits_left
= s
->gb
.size
*8 - bits_count
;
259 if(bits_left
==0 || bits_left
>8){
260 s
->padding_bug_score
++;
261 } else if(bits_left
!= 1){
262 int v
= show_bits(&s
->gb
, 8);
263 v
|= 0x7F >> (7-(bits_count
&7));
266 s
->padding_bug_score
--;
268 s
->padding_bug_score
++;
271 if(s
->padding_bug_score
> -2)
272 s
->workaround_bugs
|= FF_BUG_NO_PADDING
;
274 s
->workaround_bugs
&= ~FF_BUG_NO_PADDING
;
277 // handle formats which dont have unique end markers
278 if(s
->msmpeg4_version
|| (s
->workaround_bugs
&FF_BUG_NO_PADDING
)){ //FIXME perhaps solve this more cleanly
279 int left
= s
->gb
.size
*8 - get_bits_count(&s
->gb
);
282 /* no markers in M$ crap */
283 if(s
->msmpeg4_version
&& s
->pict_type
==I_TYPE
)
286 /* buggy padding but the frame should still end approximately at the bitstream end */
287 if((s
->workaround_bugs
&FF_BUG_NO_PADDING
) && s
->error_resilience
>=3)
289 else if((s
->workaround_bugs
&FF_BUG_NO_PADDING
))
290 max_extra
+= 256*256*256*64;
293 fprintf(stderr
, "discarding %d junk bits at end, next would be %X\n", left
, show_bits(&s
->gb
, 24));
296 fprintf(stderr
, "overreading %d bits\n", -left
);
298 s
->error_status_table
[s
->mb_num
-1]|= AC_END
|MV_END
|DC_END
;
303 fprintf(stderr
, "slice end not reached but screenspace end (%d left %06X)\n",
304 s
->gb
.size
*8 - get_bits_count(&s
->gb
),
305 show_bits(&s
->gb
, 24));
310 * finds the end of the current frame in the bitstream.
311 * @return the position of the first byte of the next frame, or -1
313 static int mpeg4_find_frame_end(MpegEncContext
*s
, UINT8
*buf
, int buf_size
){
314 ParseContext
*pc
= &s
->parse_context
;
318 vop_found
= pc
->frame_start_found
;
323 for(i
=0; i
<buf_size
; i
++){
324 state
= (state
<<8) | buf
[i
];
333 for(; i
<buf_size
; i
++){
334 state
= (state
<<8) | buf
[i
];
335 if((state
&0xFFFFFF00) == 0x100){
336 pc
->frame_start_found
=0;
341 pc
->frame_start_found
= vop_found
;
346 static int h263_decode_frame(AVCodecContext
*avctx
,
347 void *data
, int *data_size
,
348 UINT8
*buf
, int buf_size
)
350 MpegEncContext
*s
= avctx
->priv_data
;
352 AVFrame
*pict
= data
;
356 //printf("h263_decode_frame 1\n");
359 #ifdef PRINT_FRAME_TIME
360 uint64_t time
= rdtsc();
363 printf("*****frame %d size=%d\n", avctx
->frame_number
, buf_size
);
364 printf("bytes=%x %x %x %x\n", buf
[0], buf
[1], buf
[2], buf
[3]);
366 s
->flags
= avctx
->flags
;
370 /* no supplementary picture */
375 //printf("h263_decode_frame 10\n");
377 if(s
->flags
&CODEC_FLAG_TRUNCATED
){
379 ParseContext
*pc
= &s
->parse_context
;
381 pc
->last_index
= pc
->index
;
383 if(s
->codec_id
==CODEC_ID_MPEG4
){
384 next
= mpeg4_find_frame_end(s
, buf
, buf_size
);
386 fprintf(stderr
, "this codec doesnt support truncated bitstreams\n");
390 if(buf_size
+ FF_INPUT_BUFFER_PADDING_SIZE
+ pc
->index
> pc
->buffer_size
){
391 pc
->buffer_size
= buf_size
+ pc
->index
+ 10*1024;
392 pc
->buffer
= realloc(pc
->buffer
, pc
->buffer_size
);
395 memcpy(&pc
->buffer
[pc
->index
], buf
, buf_size
);
396 pc
->index
+= buf_size
;
401 if(next
+ FF_INPUT_BUFFER_PADDING_SIZE
+ pc
->index
> pc
->buffer_size
){
402 pc
->buffer_size
= next
+ pc
->index
+ 10*1024;
403 pc
->buffer
= realloc(pc
->buffer
, pc
->buffer_size
);
406 memcpy(&pc
->buffer
[pc
->index
], buf
, next
+ FF_INPUT_BUFFER_PADDING_SIZE
);
409 buf_size
= pc
->last_index
+ next
;
412 //printf("h263_decode_frame 20\n");
417 if(s
->bitstream_buffer_size
&& buf_size
<20){ //divx 5.01+ frame reorder
418 init_get_bits(&s
->gb
, s
->bitstream_buffer
, s
->bitstream_buffer_size
);
420 init_get_bits(&s
->gb
, buf
, buf_size
);
421 s
->bitstream_buffer_size
=0;
422 //printf("h263_decode_frame 21\n");
424 if (!s
->context_initialized
) {
425 if (MPV_common_init(s
) < 0) //we need the idct permutaton for reading a custom matrix
428 //printf("h263_decode_frame 22\n");
431 if (s
->h263_msmpeg4
) {
432 ret
= msmpeg4_decode_picture_header(s
);
433 } else if (s
->h263_pred
) {
434 if(s
->avctx
->extradata_size
&& s
->picture_number
==0){
437 init_get_bits(&gb
, s
->avctx
->extradata
, s
->avctx
->extradata_size
);
438 ret
= ff_mpeg4_decode_picture_header(s
, &gb
);
440 ret
= ff_mpeg4_decode_picture_header(s
, &s
->gb
);
442 if(s
->flags
& CODEC_FLAG_LOW_DELAY
)
444 } else if (s
->h263_intel
) {
445 ret
= intel_h263_decode_picture_header(s
);
447 ret
= h263_decode_picture_header(s
);
449 avctx
->has_b_frames
= !s
->low_delay
;
450 //printf("h263_decode_frame 23\n");
452 if(s
->workaround_bugs
&FF_BUG_AUTODETECT
){
453 if(s
->avctx
->fourcc
== ff_get_fourcc("XVIX"))
454 s
->workaround_bugs
|= FF_BUG_XVID_ILACE
;
456 if(s
->avctx
->fourcc
== ff_get_fourcc("MP4S"))
457 s
->workaround_bugs
|= FF_BUG_AC_VLC
;
459 if(s
->avctx
->fourcc
== ff_get_fourcc("M4S2"))
460 s
->workaround_bugs
|= FF_BUG_AC_VLC
;
462 if(s
->avctx
->fourcc
== ff_get_fourcc("UMP4")){
463 s
->workaround_bugs
|= FF_BUG_UMP4
;
464 s
->workaround_bugs
|= FF_BUG_AC_VLC
;
468 s
->workaround_bugs
|= FF_BUG_QPEL_CHROMA
;
471 if(s
->avctx
->fourcc
== ff_get_fourcc("XVID") && s
->xvid_build
==0)
472 s
->workaround_bugs
|= FF_BUG_QPEL_CHROMA
;
474 if(s
->avctx
->fourcc
== ff_get_fourcc("XVID") && s
->xvid_build
==0)
475 s
->padding_bug_score
= 256*256*256*64;
477 if(s
->xvid_build
&& s
->xvid_build
<=1)
478 s
->workaround_bugs
|= FF_BUG_QPEL_CHROMA
;
480 //printf("padding_bug_score: %d\n", s->padding_bug_score);
482 if(s
->divx_version
==500)
483 s
->workaround_bugs
|= FF_BUG_NO_PADDING
;
485 /* very ugly XVID padding bug detection FIXME/XXX solve this differently
486 * lets hope this at least works
488 if( s
->resync_marker
==0 && s
->data_partitioning
==0 && s
->divx_version
==0
489 && s
->codec_id
==CODEC_ID_MPEG4
&& s
->vo_type
==0)
490 s
->workaround_bugs
|= FF_BUG_NO_PADDING
;
492 if(s
->lavc_build
&& s
->lavc_build
<4609) //FIXME not sure about the version num but a 4609 file seems ok
493 s
->workaround_bugs
|= FF_BUG_NO_PADDING
;
496 //printf("h263_decode_frame 24\n");
499 #if 0 // dump bits per frame / qp / complexity
502 if(!f
) f
=fopen("rate_qp_cplx.txt", "w");
503 fprintf(f
, "%d %d %f\n", buf_size
, s
->qscale
, buf_size
*(double)s
->qscale
);
507 /* After H263 & mpeg4 header decode we have the height, width,*/
508 /* and other parameters. So then we could init the picture */
509 /* FIXME: By the way H263 decoder is evolving it should have */
510 /* an H263EncContext */
511 if(s
->aspected_height
)
512 new_aspect
= s
->aspected_width
*s
->width
/ (float)(s
->height
*s
->aspected_height
);
516 //printf("h263_decode_frame 25\n");
517 if ( s
->width
!= avctx
->width
|| s
->height
!= avctx
->height
518 || ABS(new_aspect
- avctx
->aspect_ratio
) > 0.001) {
519 /* H.263 could change picture size any time */
521 s
->context_initialized
=0;
524 //printf("h263_decode_frame 26\n");
525 if (!s
->context_initialized
) {
526 avctx
->width
= s
->width
;
527 avctx
->height
= s
->height
;
528 avctx
->aspect_ratio
= new_aspect
;
533 //printf("h263_decode_frame 27\n");
534 if((s
->codec_id
==CODEC_ID_H263
|| s
->codec_id
==CODEC_ID_H263P
))
535 s
->gob_index
= ff_h263_get_gob_height(s
);
537 if(ret
==FRAME_SKIPED
) return get_consumed_bytes(s
, buf_size
);
538 /* skip if the header was thrashed */
540 fprintf(stderr
, "header damaged\n");
543 //printf("h263_decode_frame 28\n");
546 s
->current_picture
.pict_type
= s
->pict_type
;
547 s
->current_picture
.key_frame
= s
->pict_type
== I_TYPE
;
549 /* skip b frames if we dont have reference frames */
550 if(s
->last_picture
.data
[0]==NULL
&& s
->pict_type
==B_TYPE
) return get_consumed_bytes(s
, buf_size
);
551 /* skip b frames if we are in a hurry */
552 if(avctx
->hurry_up
&& s
->pict_type
==B_TYPE
) return get_consumed_bytes(s
, buf_size
);
553 /* skip everything if we are in a hurry>=5 */
554 if(avctx
->hurry_up
>=5) return get_consumed_bytes(s
, buf_size
);
555 //printf("h263_decode_frame 29\n");
557 if(s
->next_p_frame_damaged
){
558 if(s
->pict_type
==B_TYPE
)
559 return get_consumed_bytes(s
, buf_size
);
561 s
->next_p_frame_damaged
=0;
563 //printf("h263_decode_frame 29\n");
565 if(MPV_frame_start(s
, avctx
) < 0)
567 //printf("h263_decode_frame 29\n");
570 printf("qscale=%d\n", s
->qscale
);
573 if(s
->error_resilience
)
574 memset(s
->error_status_table
, MV_ERROR
|AC_ERROR
|DC_ERROR
|VP_START
|AC_END
|DC_END
|MV_END
, s
->mb_num
*sizeof(UINT8
));
575 //printf("h263_decode_frame 30\n");
578 /* decode each macroblock */
582 s
->block_wrap
[3]= s
->mb_width
*2 + 2;
584 s
->block_wrap
[5]= s
->mb_width
+ 2;
588 //printf("h263_decode_frame 40\n");
591 s
->error_status_table
[0]|= VP_START
;
592 while(s
->mb_y
<s
->mb_height
&& s
->gb
.size
*8 - get_bits_count(&s
->gb
)>16){
593 if(s
->msmpeg4_version
){
594 if(s
->mb_x
!=0 || (s
->mb_y
%s
->slice_height
)!=0)
597 if(ff_h263_resync(s
)<0)
601 if(s
->msmpeg4_version
!=4 && s
->h263_pred
)
602 ff_mpeg4_clean_buffers(s
);
606 s
->error_status_table
[s
->resync_mb_x
+ s
->resync_mb_y
*s
->mb_width
]|= VP_START
;
609 //printf("h263_decode_frame 50\n");
611 if (s
->h263_msmpeg4
&& s
->msmpeg4_version
<4 && s
->pict_type
==I_TYPE
)
612 if(msmpeg4_decode_ext_header(s
, buf_size
) < 0){
613 s
->error_status_table
[s
->mb_num
-1]= AC_ERROR
|DC_ERROR
|MV_ERROR
;
616 /* divx 5.01+ bistream reorder stuff */
617 if(s
->codec_id
==CODEC_ID_MPEG4
&& s
->bitstream_buffer_size
==0 && s
->divx_version
>=500){
618 int current_pos
= get_bits_count(&s
->gb
)>>3;
620 if( buf_size
- current_pos
> 5
621 && buf_size
- current_pos
< BITSTREAM_BUFFER_SIZE
){
623 int startcode_found
=0;
624 for(i
=current_pos
; i
<buf_size
-3; i
++){
625 if(buf
[i
]==0 && buf
[i
+1]==0 && buf
[i
+2]==1 && buf
[i
+3]==0xB6){
631 memcpy(s
->bitstream_buffer
, buf
+ current_pos
, buf_size
- current_pos
);
632 s
->bitstream_buffer_size
= buf_size
- current_pos
;
637 //printf("h263_decode_frame 60\n");
639 if(s
->error_resilience
){
640 int error
=0, num_end_markers
=0;
641 for(i
=0; i
<s
->mb_num
; i
++){
642 int status
= s
->error_status_table
[i
];
644 if(i
%s
->mb_width
== 0) printf("\n");
645 printf("%2X ", status
);
647 if(status
==0) continue;
649 if(status
&(DC_ERROR
|AC_ERROR
|MV_ERROR
))
663 if(num_end_markers
|| error
){
664 fprintf(stderr
, "concealing errors\n");
665 //printf("type:%d\n", s->pict_type);
666 ff_error_resilience(s
);
669 //printf("h263_decode_frame 70\n");
673 #if 0 //dirty show MVs, we should export the MV tables and write a filter to show them
677 for(mb_y
=0; mb_y
<s
->mb_height
; mb_y
++){
680 for(mb_x
=0; mb_x
<s
->mb_width
; mb_x
++){
682 uint8_t *ptr
= s
->last_picture
.data
[0];
683 int xy
= 1 + mb_x
*2 + (mb_y
*2 + 1)*(s
->mb_width
*2 + 2);
684 int mx
= (s
->motion_val
[xy
][0]>>1) + x
;
685 int my
= (s
->motion_val
[xy
][1]>>1) + y
;
691 if(mx
>=s
->width
) mx
= s
->width
-1;
692 if(my
>=s
->height
) my
= s
->height
-1;
694 if(ABS(my
-y
) > max
) max
= ABS(my
-y
);
695 /* the ugliest linedrawing routine ... */
696 for(i
=0; i
<max
; i
++){
697 int x1
= x
+ (mx
-x
)*i
/max
;
698 int y1
= y
+ (my
-y
)*i
/max
;
699 ptr
[y1
*s
->linesize
+ x1
]+=100;
701 ptr
[y
*s
->linesize
+ x
]+=100;
702 s
->mbskip_table
[mb_x
+ mb_y
*s
->mb_width
]=0;
709 //printf("h263_decode_frame 1\n");
710 if(s
->pict_type
==B_TYPE
|| s
->low_delay
){
711 //printf("h263_decode_frame 2\n");
712 *pict
= *(AVFrame
*)&s
->current_picture
;
714 //printf("h263_decode_frame 3 %p\n", s->last_picture.data[0]);
715 *pict
= *(AVFrame
*)&s
->last_picture
;
718 if(avctx
->debug
&FF_DEBUG_QP
){
719 int8_t *qtab
= pict
->qscale_table
;
722 for(y
=0; y
<s
->mb_height
; y
++){
723 for(x
=0; x
<s
->mb_width
; x
++){
724 printf("%2d ", qtab
[x
+ y
*s
->mb_width
]);
730 //printf("h263_decode_frame 80\n");
733 /* Return the Picture timestamp as the frame number */
734 /* we substract 1 because it is added on utils.c */
735 avctx
->frame_number
= s
->picture_number
- 1;
737 /* dont output the last pic after seeking */
738 if(s
->last_picture
.data
[0] || s
->low_delay
)
739 *data_size
= sizeof(AVFrame
);
740 #ifdef PRINT_FRAME_TIME
741 printf("%Ld\n", rdtsc()-time
);
743 //printf("h263_decode_frame 100\n");
744 return get_consumed_bytes(s
, buf_size
);
747 AVCodec mpeg4_decoder
= {
751 sizeof(MpegEncContext
),
756 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
| CODEC_CAP_TRUNCATED
,
759 AVCodec h263_decoder
= {
763 sizeof(MpegEncContext
),
768 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
,
771 AVCodec msmpeg4v1_decoder
= {
775 sizeof(MpegEncContext
),
780 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
,
783 AVCodec msmpeg4v2_decoder
= {
787 sizeof(MpegEncContext
),
792 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
,
795 AVCodec msmpeg4v3_decoder
= {
799 sizeof(MpegEncContext
),
804 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
,
807 AVCodec wmv1_decoder
= {
811 sizeof(MpegEncContext
),
816 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
,
819 AVCodec wmv2_decoder
= {
823 sizeof(MpegEncContext
),
828 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
,
831 AVCodec h263i_decoder
= {
835 sizeof(MpegEncContext
),
840 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
,