00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00026 #include "avcodec.h"
00027 #include "dsputil.h"
00028 #include "mpegvideo.h"
00029
00030
00031
00032
00033 int ff_h263_decode_init(AVCodecContext *avctx)
00034 {
00035 MpegEncContext *s = avctx->priv_data;
00036
00037 s->avctx = avctx;
00038 s->out_format = FMT_H263;
00039
00040 s->width = avctx->coded_width;
00041 s->height = avctx->coded_height;
00042 s->workaround_bugs= avctx->workaround_bugs;
00043
00044
00045 MPV_decode_defaults(s);
00046 s->quant_precision=5;
00047 s->decode_mb= ff_h263_decode_mb;
00048 s->low_delay= 1;
00049 avctx->pix_fmt= PIX_FMT_YUV420P;
00050 s->unrestricted_mv= 1;
00051
00052
00053 switch(avctx->codec->id) {
00054 case CODEC_ID_H263:
00055 s->unrestricted_mv= 0;
00056 break;
00057 case CODEC_ID_MPEG4:
00058 s->decode_mb= ff_mpeg4_decode_mb;
00059 s->time_increment_bits = 4;
00060 s->h263_pred = 1;
00061 s->low_delay = 0;
00062 break;
00063 case CODEC_ID_MSMPEG4V1:
00064 s->h263_msmpeg4 = 1;
00065 s->h263_pred = 1;
00066 s->msmpeg4_version=1;
00067 break;
00068 case CODEC_ID_MSMPEG4V2:
00069 s->h263_msmpeg4 = 1;
00070 s->h263_pred = 1;
00071 s->msmpeg4_version=2;
00072 break;
00073 case CODEC_ID_MSMPEG4V3:
00074 s->h263_msmpeg4 = 1;
00075 s->h263_pred = 1;
00076 s->msmpeg4_version=3;
00077 break;
00078 case CODEC_ID_WMV1:
00079 s->h263_msmpeg4 = 1;
00080 s->h263_pred = 1;
00081 s->msmpeg4_version=4;
00082 break;
00083 case CODEC_ID_WMV2:
00084 s->h263_msmpeg4 = 1;
00085 s->h263_pred = 1;
00086 s->msmpeg4_version=5;
00087 break;
00088 case CODEC_ID_WMV3:
00089 s->h263_msmpeg4 = 1;
00090 s->h263_pred = 1;
00091 s->msmpeg4_version=6;
00092 break;
00093 case CODEC_ID_H263I:
00094 break;
00095 case CODEC_ID_FLV1:
00096 s->h263_flv = 1;
00097 break;
00098 default:
00099 return -1;
00100 }
00101 s->codec_id= avctx->codec->id;
00102
00103
00104 if (avctx->codec->id != CODEC_ID_H263 && avctx->codec->id != CODEC_ID_MPEG4)
00105 if (MPV_common_init(s) < 0)
00106 return -1;
00107
00108 if (s->h263_msmpeg4)
00109 ff_msmpeg4_decode_init(s);
00110 else
00111 h263_decode_init_vlc(s);
00112
00113 return 0;
00114 }
00115
00116 int ff_h263_decode_end(AVCodecContext *avctx)
00117 {
00118 MpegEncContext *s = avctx->priv_data;
00119
00120 MPV_common_end(s);
00121 return 0;
00122 }
00123
00127 static int get_consumed_bytes(MpegEncContext *s, int buf_size){
00128 int pos= (get_bits_count(&s->gb)+7)>>3;
00129
00130 if(s->divx_packed){
00131
00132 return buf_size;
00133 }else if(s->flags&CODEC_FLAG_TRUNCATED){
00134 pos -= s->parse_context.last_index;
00135 if(pos<0) pos=0;
00136 return pos;
00137 }else{
00138 if(pos==0) pos=1;
00139 if(pos+10>buf_size) pos=buf_size;
00140
00141 return pos;
00142 }
00143 }
00144
00145 static int decode_slice(MpegEncContext *s){
00146 const int part_mask= s->partitioned_frame ? (AC_END|AC_ERROR) : 0x7F;
00147 const int mb_size= 16>>s->avctx->lowres;
00148 s->last_resync_gb= s->gb;
00149 s->first_slice_line= 1;
00150
00151 s->resync_mb_x= s->mb_x;
00152 s->resync_mb_y= s->mb_y;
00153
00154 ff_set_qscale(s, s->qscale);
00155
00156 if(s->partitioned_frame){
00157 const int qscale= s->qscale;
00158
00159 if(s->codec_id==CODEC_ID_MPEG4){
00160 if(ff_mpeg4_decode_partitions(s) < 0)
00161 return -1;
00162 }
00163
00164
00165 s->first_slice_line=1;
00166 s->mb_x= s->resync_mb_x;
00167 s->mb_y= s->resync_mb_y;
00168 ff_set_qscale(s, qscale);
00169 }
00170
00171 for(; s->mb_y < s->mb_height; s->mb_y++) {
00172
00173 if(s->msmpeg4_version){
00174 if(s->resync_mb_y + s->slice_height == s->mb_y){
00175 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);
00176
00177 return 0;
00178 }
00179 }
00180
00181 if(s->msmpeg4_version==1){
00182 s->last_dc[0]=
00183 s->last_dc[1]=
00184 s->last_dc[2]= 128;
00185 }
00186
00187 ff_init_block_index(s);
00188 for(; s->mb_x < s->mb_width; s->mb_x++) {
00189 int ret;
00190
00191 ff_update_block_index(s);
00192
00193 if(s->resync_mb_x == s->mb_x && s->resync_mb_y+1 == s->mb_y){
00194 s->first_slice_line=0;
00195 }
00196
00197
00198
00199 s->mv_dir = MV_DIR_FORWARD;
00200 s->mv_type = MV_TYPE_16X16;
00201
00202
00203 ret= s->decode_mb(s, s->block);
00204
00205 if (s->pict_type!=B_TYPE)
00206 ff_h263_update_motion_val(s);
00207
00208 if(ret<0){
00209 const int xy= s->mb_x + s->mb_y*s->mb_stride;
00210 if(ret==SLICE_END){
00211 MPV_decode_mb(s, s->block);
00212 if(s->loop_filter)
00213 ff_h263_loop_filter(s);
00214
00215
00216 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);
00217
00218 s->padding_bug_score--;
00219
00220 if(++s->mb_x >= s->mb_width){
00221 s->mb_x=0;
00222 ff_draw_horiz_band(s, s->mb_y*mb_size, mb_size);
00223 s->mb_y++;
00224 }
00225 return 0;
00226 }else if(ret==SLICE_NOEND){
00227 av_log(s->avctx, AV_LOG_ERROR, "Slice mismatch at MB: %d\n", xy);
00228 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);
00229 return -1;
00230 }
00231 av_log(s->avctx, AV_LOG_ERROR, "Error at MB: %d\n", xy);
00232 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);
00233
00234 return -1;
00235 }
00236
00237 MPV_decode_mb(s, s->block);
00238 if(s->loop_filter)
00239 ff_h263_loop_filter(s);
00240 }
00241
00242 ff_draw_horiz_band(s, s->mb_y*mb_size, mb_size);
00243
00244 s->mb_x= 0;
00245 }
00246
00247 assert(s->mb_x==0 && s->mb_y==s->mb_height);
00248
00249
00250 if( s->codec_id==CODEC_ID_MPEG4
00251 && (s->workaround_bugs&FF_BUG_AUTODETECT)
00252 && s->gb.size_in_bits - get_bits_count(&s->gb) >=0
00253 && s->gb.size_in_bits - get_bits_count(&s->gb) < 48
00254
00255 && !s->data_partitioning){
00256
00257 const int bits_count= get_bits_count(&s->gb);
00258 const int bits_left = s->gb.size_in_bits - bits_count;
00259
00260 if(bits_left==0){
00261 s->padding_bug_score+=16;
00262 } else if(bits_left != 1){
00263 int v= show_bits(&s->gb, 8);
00264 v|= 0x7F >> (7-(bits_count&7));
00265
00266 if(v==0x7F && bits_left<=8)
00267 s->padding_bug_score--;
00268 else if(v==0x7F && ((get_bits_count(&s->gb)+8)&8) && bits_left<=16)
00269 s->padding_bug_score+= 4;
00270 else
00271 s->padding_bug_score++;
00272 }
00273 }
00274
00275 if(s->workaround_bugs&FF_BUG_AUTODETECT){
00276 if(s->padding_bug_score > -2 && !s->data_partitioning )
00277 s->workaround_bugs |= FF_BUG_NO_PADDING;
00278 else
00279 s->workaround_bugs &= ~FF_BUG_NO_PADDING;
00280 }
00281
00282
00283 if(s->msmpeg4_version || (s->workaround_bugs&FF_BUG_NO_PADDING)){
00284 int left= s->gb.size_in_bits - get_bits_count(&s->gb);
00285 int max_extra=7;
00286
00287
00288 if(s->msmpeg4_version && s->pict_type==I_TYPE)
00289 max_extra+= 17;
00290
00291
00292 if((s->workaround_bugs&FF_BUG_NO_PADDING) && s->error_resilience>=3)
00293 max_extra+= 48;
00294 else if((s->workaround_bugs&FF_BUG_NO_PADDING))
00295 max_extra+= 256*256*256*64;
00296
00297 if(left>max_extra){
00298 av_log(s->avctx, AV_LOG_ERROR, "discarding %d junk bits at end, next would be %X\n", left, show_bits(&s->gb, 24));
00299 }
00300 else if(left<0){
00301 av_log(s->avctx, AV_LOG_ERROR, "overreading %d bits\n", -left);
00302 }else
00303 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);
00304
00305 return 0;
00306 }
00307
00308 av_log(s->avctx, AV_LOG_ERROR, "slice end not reached but screenspace end (%d left %06X, score= %d)\n",
00309 s->gb.size_in_bits - get_bits_count(&s->gb),
00310 show_bits(&s->gb, 24), s->padding_bug_score);
00311
00312 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);
00313
00314 return -1;
00315 }
00316
00321 int ff_mpeg4_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size){
00322 int vop_found, i;
00323 uint32_t state;
00324
00325 vop_found= pc->frame_start_found;
00326 state= pc->state;
00327
00328 i=0;
00329 if(!vop_found){
00330 for(i=0; i<buf_size; i++){
00331 state= (state<<8) | buf[i];
00332 if(state == 0x1B6){
00333 i++;
00334 vop_found=1;
00335 break;
00336 }
00337 }
00338 }
00339
00340 if(vop_found){
00341
00342 if (buf_size == 0)
00343 return 0;
00344 for(; i<buf_size; i++){
00345 state= (state<<8) | buf[i];
00346 if((state&0xFFFFFF00) == 0x100){
00347 pc->frame_start_found=0;
00348 pc->state=-1;
00349 return i-3;
00350 }
00351 }
00352 }
00353 pc->frame_start_found= vop_found;
00354 pc->state= state;
00355 return END_NOT_FOUND;
00356 }
00357
00358 static int h263_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size){
00359 int vop_found, i;
00360 uint32_t state;
00361
00362 vop_found= pc->frame_start_found;
00363 state= pc->state;
00364
00365 i=0;
00366 if(!vop_found){
00367 for(i=0; i<buf_size; i++){
00368 state= (state<<8) | buf[i];
00369 if(state>>(32-22) == 0x20){
00370 i++;
00371 vop_found=1;
00372 break;
00373 }
00374 }
00375 }
00376
00377 if(vop_found){
00378 for(; i<buf_size; i++){
00379 state= (state<<8) | buf[i];
00380 if(state>>(32-22) == 0x20){
00381 pc->frame_start_found=0;
00382 pc->state=-1;
00383 return i-3;
00384 }
00385 }
00386 }
00387 pc->frame_start_found= vop_found;
00388 pc->state= state;
00389
00390 return END_NOT_FOUND;
00391 }
00392
00393 static int h263_parse(AVCodecParserContext *s,
00394 AVCodecContext *avctx,
00395 uint8_t **poutbuf, int *poutbuf_size,
00396 const uint8_t *buf, int buf_size)
00397 {
00398 ParseContext *pc = s->priv_data;
00399 int next;
00400
00401 next= h263_find_frame_end(pc, buf, buf_size);
00402
00403 if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) {
00404 *poutbuf = NULL;
00405 *poutbuf_size = 0;
00406 return buf_size;
00407 }
00408
00409 *poutbuf = (uint8_t *)buf;
00410 *poutbuf_size = buf_size;
00411 return next;
00412 }
00413
00414 int ff_h263_decode_frame(AVCodecContext *avctx,
00415 void *data, int *data_size,
00416 uint8_t *buf, int buf_size)
00417 {
00418 MpegEncContext *s = avctx->priv_data;
00419 int ret;
00420 AVFrame *pict = data;
00421
00422 #ifdef PRINT_FRAME_TIME
00423 uint64_t time= rdtsc();
00424 #endif
00425 #ifdef DEBUG
00426 printf("*****frame %d size=%d\n", avctx->frame_number, buf_size);
00427 printf("bytes=%x %x %x %x\n", buf[0], buf[1], buf[2], buf[3]);
00428 #endif
00429 s->flags= avctx->flags;
00430 s->flags2= avctx->flags2;
00431
00432
00433 if (buf_size == 0) {
00434
00435 if (s->low_delay==0 && s->next_picture_ptr) {
00436 *pict= *(AVFrame*)s->next_picture_ptr;
00437 s->next_picture_ptr= NULL;
00438
00439 *data_size = sizeof(AVFrame);
00440 }
00441
00442 return 0;
00443 }
00444
00445 if(s->flags&CODEC_FLAG_TRUNCATED){
00446 int next;
00447
00448 if(s->codec_id==CODEC_ID_MPEG4){
00449 next= ff_mpeg4_find_frame_end(&s->parse_context, buf, buf_size);
00450 }else if(s->codec_id==CODEC_ID_H263){
00451 next= h263_find_frame_end(&s->parse_context, buf, buf_size);
00452 }else{
00453 av_log(s->avctx, AV_LOG_ERROR, "this codec does not support truncated bitstreams\n");
00454 return -1;
00455 }
00456
00457 if( ff_combine_frame(&s->parse_context, next, &buf, &buf_size) < 0 )
00458 return buf_size;
00459 }
00460
00461
00462 retry:
00463
00464 if(s->bitstream_buffer_size && (s->divx_packed || buf_size<20)){
00465 init_get_bits(&s->gb, s->bitstream_buffer, s->bitstream_buffer_size*8);
00466 }else
00467 init_get_bits(&s->gb, buf, buf_size*8);
00468 s->bitstream_buffer_size=0;
00469
00470 if (!s->context_initialized) {
00471 if (MPV_common_init(s) < 0)
00472 return -1;
00473 }
00474
00475
00476 if(s->current_picture_ptr==NULL || s->current_picture_ptr->data[0]){
00477 int i= ff_find_unused_picture(s, 0);
00478 s->current_picture_ptr= &s->picture[i];
00479 }
00480
00481
00482 if (s->msmpeg4_version==5) {
00483 ret= ff_wmv2_decode_picture_header(s);
00484 } else if (s->msmpeg4_version) {
00485 ret = msmpeg4_decode_picture_header(s);
00486 } else if (s->h263_pred) {
00487 if(s->avctx->extradata_size && s->picture_number==0){
00488 GetBitContext gb;
00489
00490 init_get_bits(&gb, s->avctx->extradata, s->avctx->extradata_size*8);
00491 ret = ff_mpeg4_decode_picture_header(s, &gb);
00492 }
00493 ret = ff_mpeg4_decode_picture_header(s, &s->gb);
00494
00495 if(s->flags& CODEC_FLAG_LOW_DELAY)
00496 s->low_delay=1;
00497 } else if (s->codec_id == CODEC_ID_H263I) {
00498 ret = intel_h263_decode_picture_header(s);
00499 } else if (s->h263_flv) {
00500 ret = flv_h263_decode_picture_header(s);
00501 } else {
00502 ret = h263_decode_picture_header(s);
00503 }
00504
00505 if(ret==FRAME_SKIPPED) return get_consumed_bytes(s, buf_size);
00506
00507
00508 if (ret < 0){
00509 av_log(s->avctx, AV_LOG_ERROR, "header damaged\n");
00510 return -1;
00511 }
00512
00513 avctx->has_b_frames= !s->low_delay;
00514
00515 if(s->xvid_build==0 && s->divx_version==0 && s->lavc_build==0){
00516 if(s->avctx->stream_codec_tag == ff_get_fourcc("XVID") ||
00517 s->avctx->codec_tag == ff_get_fourcc("XVID") || s->avctx->codec_tag == ff_get_fourcc("XVIX"))
00518 s->xvid_build= -1;
00519 #if 0
00520 if(s->avctx->codec_tag == ff_get_fourcc("DIVX") && s->vo_type==0 && s->vol_control_parameters==1
00521 && s->padding_bug_score > 0 && s->low_delay)
00522 s->xvid_build= -1;
00523 #endif
00524 }
00525
00526 if(s->xvid_build==0 && s->divx_version==0 && s->lavc_build==0){
00527 if(s->avctx->codec_tag == ff_get_fourcc("DIVX") && s->vo_type==0 && s->vol_control_parameters==0)
00528 s->divx_version= 400;
00529 }
00530
00531 if(s->xvid_build && s->divx_version){
00532 s->divx_version=
00533 s->divx_build= 0;
00534 }
00535
00536 if(s->workaround_bugs&FF_BUG_AUTODETECT){
00537 if(s->avctx->codec_tag == ff_get_fourcc("XVIX"))
00538 s->workaround_bugs|= FF_BUG_XVID_ILACE;
00539
00540 if(s->avctx->codec_tag == ff_get_fourcc("UMP4")){
00541 s->workaround_bugs|= FF_BUG_UMP4;
00542 }
00543
00544 if(s->divx_version>=500){
00545 s->workaround_bugs|= FF_BUG_QPEL_CHROMA;
00546 }
00547
00548 if(s->divx_version>502){
00549 s->workaround_bugs|= FF_BUG_QPEL_CHROMA2;
00550 }
00551
00552 if(s->xvid_build && s->xvid_build<=3)
00553 s->padding_bug_score= 256*256*256*64;
00554
00555 if(s->xvid_build && s->xvid_build<=1)
00556 s->workaround_bugs|= FF_BUG_QPEL_CHROMA;
00557
00558 if(s->xvid_build && s->xvid_build<=12)
00559 s->workaround_bugs|= FF_BUG_EDGE;
00560
00561 if(s->xvid_build && s->xvid_build<=32)
00562 s->workaround_bugs|= FF_BUG_DC_CLIP;
00563
00564 #define SET_QPEL_FUNC(postfix1, postfix2) \
00565 s->dsp.put_ ## postfix1 = ff_put_ ## postfix2;\
00566 s->dsp.put_no_rnd_ ## postfix1 = ff_put_no_rnd_ ## postfix2;\
00567 s->dsp.avg_ ## postfix1 = ff_avg_ ## postfix2;
00568
00569 if(s->lavc_build && s->lavc_build<4653)
00570 s->workaround_bugs|= FF_BUG_STD_QPEL;
00571
00572 if(s->lavc_build && s->lavc_build<4655)
00573 s->workaround_bugs|= FF_BUG_DIRECT_BLOCKSIZE;
00574
00575 if(s->lavc_build && s->lavc_build<4670){
00576 s->workaround_bugs|= FF_BUG_EDGE;
00577 }
00578
00579 if(s->lavc_build && s->lavc_build<=4712)
00580 s->workaround_bugs|= FF_BUG_DC_CLIP;
00581
00582 if(s->divx_version)
00583 s->workaround_bugs|= FF_BUG_DIRECT_BLOCKSIZE;
00584
00585 if(s->divx_version==501 && s->divx_build==20020416)
00586 s->padding_bug_score= 256*256*256*64;
00587
00588 if(s->divx_version && s->divx_version<500){
00589 s->workaround_bugs|= FF_BUG_EDGE;
00590 }
00591
00592 if(s->divx_version)
00593 s->workaround_bugs|= FF_BUG_HPEL_CHROMA;
00594 #if 0
00595 if(s->divx_version==500)
00596 s->padding_bug_score= 256*256*256*64;
00597
00598
00599
00600
00601 if( s->resync_marker==0 && s->data_partitioning==0 && s->divx_version==0
00602 && s->codec_id==CODEC_ID_MPEG4 && s->vo_type==0)
00603 s->workaround_bugs|= FF_BUG_NO_PADDING;
00604
00605 if(s->lavc_build && s->lavc_build<4609)
00606 s->workaround_bugs|= FF_BUG_NO_PADDING;
00607 #endif
00608 }
00609
00610 if(s->workaround_bugs& FF_BUG_STD_QPEL){
00611 SET_QPEL_FUNC(qpel_pixels_tab[0][ 5], qpel16_mc11_old_c)
00612 SET_QPEL_FUNC(qpel_pixels_tab[0][ 7], qpel16_mc31_old_c)
00613 SET_QPEL_FUNC(qpel_pixels_tab[0][ 9], qpel16_mc12_old_c)
00614 SET_QPEL_FUNC(qpel_pixels_tab[0][11], qpel16_mc32_old_c)
00615 SET_QPEL_FUNC(qpel_pixels_tab[0][13], qpel16_mc13_old_c)
00616 SET_QPEL_FUNC(qpel_pixels_tab[0][15], qpel16_mc33_old_c)
00617
00618 SET_QPEL_FUNC(qpel_pixels_tab[1][ 5], qpel8_mc11_old_c)
00619 SET_QPEL_FUNC(qpel_pixels_tab[1][ 7], qpel8_mc31_old_c)
00620 SET_QPEL_FUNC(qpel_pixels_tab[1][ 9], qpel8_mc12_old_c)
00621 SET_QPEL_FUNC(qpel_pixels_tab[1][11], qpel8_mc32_old_c)
00622 SET_QPEL_FUNC(qpel_pixels_tab[1][13], qpel8_mc13_old_c)
00623 SET_QPEL_FUNC(qpel_pixels_tab[1][15], qpel8_mc33_old_c)
00624 }
00625
00626 if(avctx->debug & FF_DEBUG_BUGS)
00627 av_log(s->avctx, AV_LOG_DEBUG, "bugs: %X lavc_build:%d xvid_build:%d divx_version:%d divx_build:%d %s\n",
00628 s->workaround_bugs, s->lavc_build, s->xvid_build, s->divx_version, s->divx_build,
00629 s->divx_packed ? "p" : "");
00630
00631 #if 0 // dump bits per frame / qp / complexity
00632 {
00633 static FILE *f=NULL;
00634 if(!f) f=fopen("rate_qp_cplx.txt", "w");
00635 fprintf(f, "%d %d %f\n", buf_size, s->qscale, buf_size*(double)s->qscale);
00636 }
00637 #endif
00638
00639 #ifdef HAVE_MMX
00640 if(s->codec_id == CODEC_ID_MPEG4 && s->xvid_build && avctx->idct_algo == FF_IDCT_AUTO && (mm_flags & MM_MMX) && !(s->flags&CODEC_FLAG_BITEXACT)){
00641 avctx->idct_algo= FF_IDCT_LIBMPEG2MMX;
00642 avctx->coded_width= 0;
00643 }
00644 #endif
00645
00646
00647
00648
00649
00650
00651 if ( s->width != avctx->coded_width
00652 || s->height != avctx->coded_height) {
00653
00654 ParseContext pc= s->parse_context;
00655 s->parse_context.buffer=0;
00656 MPV_common_end(s);
00657 s->parse_context= pc;
00658 }
00659 if (!s->context_initialized) {
00660 avcodec_set_dimensions(avctx, s->width, s->height);
00661
00662 goto retry;
00663 }
00664
00665 if((s->codec_id==CODEC_ID_H263 || s->codec_id==CODEC_ID_H263P))
00666 s->gob_index = ff_h263_get_gob_height(s);
00667
00668
00669 s->current_picture.pict_type= s->pict_type;
00670 s->current_picture.key_frame= s->pict_type == I_TYPE;
00671
00672
00673 if(s->last_picture_ptr==NULL && (s->pict_type==B_TYPE || s->dropable)) return get_consumed_bytes(s, buf_size);
00674
00675 if(avctx->hurry_up && s->pict_type==B_TYPE) return get_consumed_bytes(s, buf_size);
00676 if( (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type==B_TYPE)
00677 || (avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type!=I_TYPE)
00678 || avctx->skip_frame >= AVDISCARD_ALL)
00679 return get_consumed_bytes(s, buf_size);
00680
00681 if(avctx->hurry_up>=5) return get_consumed_bytes(s, buf_size);
00682
00683 if(s->next_p_frame_damaged){
00684 if(s->pict_type==B_TYPE)
00685 return get_consumed_bytes(s, buf_size);
00686 else
00687 s->next_p_frame_damaged=0;
00688 }
00689
00690 if(MPV_frame_start(s, avctx) < 0)
00691 return -1;
00692
00693 #ifdef DEBUG
00694 printf("qscale=%d\n", s->qscale);
00695 #endif
00696
00697 ff_er_frame_start(s);
00698
00699
00700
00701 if (s->msmpeg4_version==5){
00702 if(ff_wmv2_decode_secondary_picture_header(s) < 0)
00703 return -1;
00704 }
00705
00706
00707 s->mb_x=0;
00708 s->mb_y=0;
00709
00710 decode_slice(s);
00711 while(s->mb_y<s->mb_height){
00712 if(s->msmpeg4_version){
00713 if(s->mb_x!=0 || (s->mb_y%s->slice_height)!=0 || get_bits_count(&s->gb) > s->gb.size_in_bits)
00714 break;
00715 }else{
00716 if(ff_h263_resync(s)<0)
00717 break;
00718 }
00719
00720 if(s->msmpeg4_version<4 && s->h263_pred)
00721 ff_mpeg4_clean_buffers(s);
00722
00723 decode_slice(s);
00724 }
00725
00726 if (s->h263_msmpeg4 && s->msmpeg4_version<4 && s->pict_type==I_TYPE)
00727 if(msmpeg4_decode_ext_header(s, buf_size) < 0){
00728 s->error_status_table[s->mb_num-1]= AC_ERROR|DC_ERROR|MV_ERROR;
00729 }
00730
00731
00732 if(s->codec_id==CODEC_ID_MPEG4 && s->bitstream_buffer_size==0 && s->divx_packed){
00733 int current_pos= get_bits_count(&s->gb)>>3;
00734 int startcode_found=0;
00735
00736 if(buf_size - current_pos > 5){
00737 int i;
00738 for(i=current_pos; i<buf_size-3; i++){
00739 if(buf[i]==0 && buf[i+1]==0 && buf[i+2]==1 && buf[i+3]==0xB6){
00740 startcode_found=1;
00741 break;
00742 }
00743 }
00744 }
00745 if(s->gb.buffer == s->bitstream_buffer && buf_size>20){
00746 startcode_found=1;
00747 current_pos=0;
00748 }
00749
00750 if(startcode_found){
00751 s->bitstream_buffer= av_fast_realloc(
00752 s->bitstream_buffer,
00753 &s->allocated_bitstream_buffer_size,
00754 buf_size - current_pos + FF_INPUT_BUFFER_PADDING_SIZE);
00755 memcpy(s->bitstream_buffer, buf + current_pos, buf_size - current_pos);
00756 s->bitstream_buffer_size= buf_size - current_pos;
00757 }
00758 }
00759
00760 ff_er_frame_end(s);
00761
00762 MPV_frame_end(s);
00763
00764 assert(s->current_picture.pict_type == s->current_picture_ptr->pict_type);
00765 assert(s->current_picture.pict_type == s->pict_type);
00766 if(s->pict_type==B_TYPE || s->low_delay){
00767 *pict= *(AVFrame*)&s->current_picture;
00768 ff_print_debug_info(s, pict);
00769 } else {
00770 *pict= *(AVFrame*)&s->last_picture;
00771 if(pict)
00772 ff_print_debug_info(s, pict);
00773 }
00774
00775
00776
00777 avctx->frame_number = s->picture_number - 1;
00778
00779
00780 if(s->last_picture_ptr || s->low_delay)
00781 *data_size = sizeof(AVFrame);
00782 #ifdef PRINT_FRAME_TIME
00783 printf("%Ld\n", rdtsc()-time);
00784 #endif
00785
00786 return get_consumed_bytes(s, buf_size);
00787 }
00788
00789 AVCodec mpeg4_decoder = {
00790 "mpeg4",
00791 CODEC_TYPE_VIDEO,
00792 CODEC_ID_MPEG4,
00793 sizeof(MpegEncContext),
00794 ff_h263_decode_init,
00795 NULL,
00796 ff_h263_decode_end,
00797 ff_h263_decode_frame,
00798 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY,
00799 .flush= ff_mpeg_flush,
00800 };
00801
00802 AVCodec h263_decoder = {
00803 "h263",
00804 CODEC_TYPE_VIDEO,
00805 CODEC_ID_H263,
00806 sizeof(MpegEncContext),
00807 ff_h263_decode_init,
00808 NULL,
00809 ff_h263_decode_end,
00810 ff_h263_decode_frame,
00811 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY,
00812 .flush= ff_mpeg_flush,
00813 };
00814
00815 AVCodec msmpeg4v1_decoder = {
00816 "msmpeg4v1",
00817 CODEC_TYPE_VIDEO,
00818 CODEC_ID_MSMPEG4V1,
00819 sizeof(MpegEncContext),
00820 ff_h263_decode_init,
00821 NULL,
00822 ff_h263_decode_end,
00823 ff_h263_decode_frame,
00824 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
00825 };
00826
00827 AVCodec msmpeg4v2_decoder = {
00828 "msmpeg4v2",
00829 CODEC_TYPE_VIDEO,
00830 CODEC_ID_MSMPEG4V2,
00831 sizeof(MpegEncContext),
00832 ff_h263_decode_init,
00833 NULL,
00834 ff_h263_decode_end,
00835 ff_h263_decode_frame,
00836 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
00837 };
00838
00839 AVCodec msmpeg4v3_decoder = {
00840 "msmpeg4",
00841 CODEC_TYPE_VIDEO,
00842 CODEC_ID_MSMPEG4V3,
00843 sizeof(MpegEncContext),
00844 ff_h263_decode_init,
00845 NULL,
00846 ff_h263_decode_end,
00847 ff_h263_decode_frame,
00848 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
00849 };
00850
00851 AVCodec wmv1_decoder = {
00852 "wmv1",
00853 CODEC_TYPE_VIDEO,
00854 CODEC_ID_WMV1,
00855 sizeof(MpegEncContext),
00856 ff_h263_decode_init,
00857 NULL,
00858 ff_h263_decode_end,
00859 ff_h263_decode_frame,
00860 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
00861 };
00862
00863 AVCodec h263i_decoder = {
00864 "h263i",
00865 CODEC_TYPE_VIDEO,
00866 CODEC_ID_H263I,
00867 sizeof(MpegEncContext),
00868 ff_h263_decode_init,
00869 NULL,
00870 ff_h263_decode_end,
00871 ff_h263_decode_frame,
00872 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
00873 };
00874
00875 AVCodec flv_decoder = {
00876 "flv",
00877 CODEC_TYPE_VIDEO,
00878 CODEC_ID_FLV1,
00879 sizeof(MpegEncContext),
00880 ff_h263_decode_init,
00881 NULL,
00882 ff_h263_decode_end,
00883 ff_h263_decode_frame,
00884 CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1
00885 };
00886
00887 AVCodecParser h263_parser = {
00888 { CODEC_ID_H263 },
00889 sizeof(ParseContext),
00890 NULL,
00891 h263_parse,
00892 ff_parse_close,
00893 };