diff options
Diffstat (limited to 'src/libffmpeg/libavcodec/h263dec.c')
-rw-r--r-- | src/libffmpeg/libavcodec/h263dec.c | 35 |
1 files changed, 16 insertions, 19 deletions
diff --git a/src/libffmpeg/libavcodec/h263dec.c b/src/libffmpeg/libavcodec/h263dec.c index 0c88cd758..1f8fb44a8 100644 --- a/src/libffmpeg/libavcodec/h263dec.c +++ b/src/libffmpeg/libavcodec/h263dec.c @@ -199,6 +199,7 @@ static int decode_slice(MpegEncContext *s){ s->mv_dir = MV_DIR_FORWARD; s->mv_type = MV_TYPE_16X16; +// s->mb_skiped = 0; //printf("%d %d %06X\n", ret, get_bits_count(&s->gb), show_bits(&s->gb, 24)); ret= s->decode_mb(s, s->block); @@ -347,7 +348,7 @@ static int h263_decode_frame(AVCodecContext *avctx, { MpegEncContext *s = avctx->priv_data; int ret,i; - AVPicture *pict = data; + AVVideoFrame *pict = data; float new_aspect; #ifdef PRINT_FRAME_TIME @@ -357,7 +358,6 @@ uint64_t time= rdtsc(); printf("*****frame %d size=%d\n", avctx->frame_number, buf_size); printf("bytes=%x %x %x %x\n", buf[0], buf[1], buf[2], buf[3]); #endif - s->flags= avctx->flags; *data_size = 0; @@ -461,6 +461,9 @@ retry: if(s->avctx->fourcc == ff_get_fourcc("XVID") && s->xvid_build==0) s->workaround_bugs|= FF_BUG_QPEL_CHROMA; + if(s->avctx->fourcc == ff_get_fourcc("XVID") && s->xvid_build==0) + s->padding_bug_score= 256*256*256*64; + if(s->xvid_build && s->xvid_build<=1) s->workaround_bugs|= FF_BUG_QPEL_CHROMA; @@ -523,8 +526,9 @@ retry: return -1; } - s->avctx->key_frame = (s->pict_type == I_TYPE); - s->avctx->pict_type = s->pict_type; + // for hurry_up==5 + s->current_picture.pict_type= s->pict_type; + s->current_picture.key_frame= s->pict_type == I_TYPE; /* skip b frames if we dont have reference frames */ if(s->num_available_buffers<2 && s->pict_type==B_TYPE) return get_consumed_bytes(s, buf_size); @@ -580,7 +584,9 @@ retry: } if (s->h263_msmpeg4 && s->msmpeg4_version<4 && s->pict_type==I_TYPE) - if(msmpeg4_decode_ext_header(s, buf_size) < 0) return -1; + if(msmpeg4_decode_ext_header(s, buf_size) < 0){ + s->error_status_table[s->mb_num-1]= AC_ERROR|DC_ERROR|MV_ERROR; + } /* divx 5.01+ bistream reorder stuff */ if(s->codec_id==CODEC_ID_MPEG4 && s->bitstream_buffer_size==0 && s->divx_version>=500){ @@ -644,7 +650,7 @@ retry: int y= mb_y*16 + 8; for(mb_x=0; mb_x<s->mb_width; mb_x++){ int x= mb_x*16 + 8; - uint8_t *ptr= s->last_picture[0]; + uint8_t *ptr= s->last_picture.data[0]; int xy= 1 + mb_x*2 + (mb_y*2 + 1)*(s->mb_width*2 + 2); int mx= (s->motion_val[xy][0]>>1) + x; int my= (s->motion_val[xy][1]>>1) + y; @@ -669,21 +675,12 @@ retry: } } -#endif +#endif if(s->pict_type==B_TYPE || (!s->has_b_frames)){ - pict->data[0] = s->current_picture[0]; - pict->data[1] = s->current_picture[1]; - pict->data[2] = s->current_picture[2]; + *pict= *(AVVideoFrame*)&s->current_picture; } else { - pict->data[0] = s->last_picture[0]; - pict->data[1] = s->last_picture[1]; - pict->data[2] = s->last_picture[2]; + *pict= *(AVVideoFrame*)&s->last_picture; } - pict->linesize[0] = s->linesize; - pict->linesize[1] = s->uvlinesize; - pict->linesize[2] = s->uvlinesize; - - avctx->quality = s->qscale; /* Return the Picture timestamp as the frame number */ /* we substract 1 because it is added on utils.c */ @@ -692,7 +689,7 @@ retry: /* dont output the last pic after seeking note we allready added +1 for the current pix in MPV_frame_end(s) */ if(s->num_available_buffers>=2 || (!s->has_b_frames)) - *data_size = sizeof(AVPicture); + *data_size = sizeof(AVVideoFrame); #ifdef PRINT_FRAME_TIME printf("%Ld\n", rdtsc()-time); #endif |