diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2004-04-16 01:01:45 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2004-04-16 01:01:45 +0000 |
commit | 137c8468e840e31f9399997b95e02341c67d0a31 (patch) | |
tree | 5b05f1f9d27b864e880fb9842a7b24b07f4b7ede /libavcodec/mpegvideo.c | |
parent | 37f5cd5a18a8e08a18814d1aca828c92ee398d10 (diff) | |
download | ffmpeg-137c8468e840e31f9399997b95e02341c67d0a31.tar.gz |
unify table indexing (motion_val,dc_val,ac_val,coded_block changed)
minor +-1 bugfix
Originally committed as revision 3016 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/mpegvideo.c')
-rw-r--r-- | libavcodec/mpegvideo.c | 82 |
1 files changed, 50 insertions, 32 deletions
diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index 25a1996b68..3bab4da407 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -275,7 +275,9 @@ static void copy_picture(Picture *dst, Picture *src){ dst->type= FF_BUFFER_TYPE_COPY; } -static void copy_picture_attributes(AVFrame *dst, AVFrame *src){ +static void copy_picture_attributes(MpegEncContext *s, AVFrame *dst, AVFrame *src){ + int i; + dst->pict_type = src->pict_type; dst->quality = src->quality; dst->coded_picture_number = src->coded_picture_number; @@ -284,6 +286,18 @@ static void copy_picture_attributes(AVFrame *dst, AVFrame *src){ dst->pts = src->pts; dst->interlaced_frame = src->interlaced_frame; dst->top_field_first = src->top_field_first; + + if(src->motion_val[0] && src->motion_val[0] != dst->motion_val[0]){ + if(src->motion_subsample_log2 != dst->motion_subsample_log2) + av_log(s->avctx, AV_LOG_ERROR, "AVFrame.motion_subsample_log2 doesnt match!\n"); + else{ + int stride= ((16*s->mb_width )>>src->motion_subsample_log2) + 1; + int height= ((16*s->mb_height)>>src->motion_subsample_log2); + + for(i=0; i<2; i++) + memcpy(dst->motion_val[i], src->motion_val[i], stride*height*sizeof(int16_t)); + } + } } /** @@ -347,7 +361,7 @@ static int alloc_picture(MpegEncContext *s, Picture *pic, int shared){ pic->motion_subsample_log2= 2; }else if(s->out_format == FMT_H263 || s->encoding || (s->avctx->debug&FF_DEBUG_MV) || (s->avctx->debug_mv)){ for(i=0; i<2; i++){ - CHECKED_ALLOCZ(pic->motion_val_base[i], 2 * (b8_array_size+2) * sizeof(int16_t)*2) //FIXME + CHECKED_ALLOCZ(pic->motion_val_base[i], 2 * (b8_array_size+2) * sizeof(int16_t)) pic->motion_val[i]= pic->motion_val_base[i]+2; } pic->motion_subsample_log2= 3; @@ -591,12 +605,12 @@ int MPV_common_init(MpegEncContext *s) s->block_wrap[0]= s->block_wrap[1]= s->block_wrap[2]= - s->block_wrap[3]= s->mb_width*2 + 2; + s->block_wrap[3]= s->b8_stride; s->block_wrap[4]= - s->block_wrap[5]= s->mb_width + 2; + s->block_wrap[5]= s->mb_stride; - y_size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2); - c_size = (s->mb_width + 2) * (s->mb_height + 2); + y_size = s->b8_stride * (2 * s->mb_height + 1); + c_size = s->mb_stride * (s->mb_height + 1); yc_size = y_size + 2 * c_size; /* convert fourcc to upper case */ @@ -678,12 +692,14 @@ int MPV_common_init(MpegEncContext *s) } if (s->out_format == FMT_H263) { /* ac values */ - CHECKED_ALLOCZ(s->ac_val[0], yc_size * sizeof(int16_t) * 16); - s->ac_val[1] = s->ac_val[0] + y_size; + CHECKED_ALLOCZ(s->ac_val_base, yc_size * sizeof(int16_t) * 16); + s->ac_val[0] = s->ac_val_base + s->b8_stride + 1; + s->ac_val[1] = s->ac_val_base + y_size + s->mb_stride + 1; s->ac_val[2] = s->ac_val[1] + c_size; /* cbp values */ - CHECKED_ALLOCZ(s->coded_block, y_size); + CHECKED_ALLOCZ(s->coded_block_base, y_size); + s->coded_block= s->coded_block_base + s->b8_stride + 1; /* divx501 bitstream reorder buffer */ CHECKED_ALLOCZ(s->bitstream_buffer, BITSTREAM_BUFFER_SIZE); @@ -696,11 +712,12 @@ int MPV_common_init(MpegEncContext *s) if (s->h263_pred || s->h263_plus || !s->encoding) { /* dc values */ //MN: we need these for error resilience of intra-frames - CHECKED_ALLOCZ(s->dc_val[0], yc_size * sizeof(int16_t)); - s->dc_val[1] = s->dc_val[0] + y_size; + CHECKED_ALLOCZ(s->dc_val_base, yc_size * sizeof(int16_t)); + s->dc_val[0] = s->dc_val_base + s->b8_stride + 1; + s->dc_val[1] = s->dc_val_base + y_size + s->mb_stride + 1; s->dc_val[2] = s->dc_val[1] + c_size; for(i=0;i<yc_size;i++) - s->dc_val[0][i] = 1024; + s->dc_val_base[i] = 1024; } /* which mb is a intra block */ @@ -781,9 +798,9 @@ void MPV_common_end(MpegEncContext *s) av_freep(&s->p_field_select_table[i]); } - av_freep(&s->dc_val[0]); - av_freep(&s->ac_val[0]); - av_freep(&s->coded_block); + av_freep(&s->dc_val_base); + av_freep(&s->ac_val_base); + av_freep(&s->coded_block_base); av_freep(&s->mbintra_table); av_freep(&s->cbp_table); av_freep(&s->pred_dir_table); @@ -1684,12 +1701,13 @@ void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){ if(!USES_LIST(pict->mb_type[mb_index], direction)) continue; + //FIXME for h264 if(IS_8X8(pict->mb_type[mb_index])){ int i; for(i=0; i<4; i++){ int sx= mb_x*16 + 4 + 8*(i&1); int sy= mb_y*16 + 4 + 8*(i>>1); - int xy= 1 + mb_x*2 + (i&1) + (mb_y*2 + 1 + (i>>1))*(s->mb_width*2 + 2); + int xy= mb_x*2 + (i&1) + (mb_y*2 + (i>>1))*s->b8_stride; int mx= (pict->motion_val[direction][xy][0]>>shift) + sx; int my= (pict->motion_val[direction][xy][1]>>shift) + sy; draw_arrow(ptr, sx, sy, mx, my, s->width, s->height, s->linesize, 100); @@ -1699,7 +1717,7 @@ void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){ for(i=0; i<2; i++){ int sx=mb_x*16 + 8; int sy=mb_y*16 + 4 + 8*i; - int xy=1 + mb_x*2 + (mb_y*2 + 1 + i)*(s->mb_width*2 + 2); + int xy= mb_x*2 + (mb_y*2 + i)*s->b8_stride; int mx=(pict->motion_val[direction][xy][0]>>shift) + sx; int my=(pict->motion_val[direction][xy][1]>>shift) + sy; draw_arrow(ptr, sx, sy, mx, my, s->width, s->height, s->linesize, 100); @@ -1707,7 +1725,7 @@ void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){ }else{ int sx= mb_x*16 + 8; int sy= mb_y*16 + 8; - int xy= 1 + mb_x*2 + (mb_y*2 + 1)*(s->mb_width*2 + 2); + int xy= mb_x*2 + mb_y*2*s->b8_stride; int mx= (pict->motion_val[direction][xy][0]>>shift) + sx; int my= (pict->motion_val[direction][xy][1]>>shift) + sy; draw_arrow(ptr, sx, sy, mx, my, s->width, s->height, s->linesize, 100); @@ -1884,7 +1902,7 @@ static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg){ } } } - copy_picture_attributes(pic, pic_arg); + copy_picture_attributes(s, pic, pic_arg); pic->display_picture_number= s->input_picture_number++; if(pic->pts != AV_NOPTS_VALUE){ @@ -2013,7 +2031,7 @@ static void select_input_picture(MpegEncContext *s){ s->reordered_input_picture[0]->data[i]= NULL; s->reordered_input_picture[0]->type= 0; - copy_picture_attributes((AVFrame*)pic, (AVFrame*)s->reordered_input_picture[0]); + copy_picture_attributes(s, (AVFrame*)pic, (AVFrame*)s->reordered_input_picture[0]); pic->reference = s->reordered_input_picture[0]->reference; alloc_picture(s, pic, 0); @@ -2746,8 +2764,8 @@ static inline void MPV_motion(MpegEncContext *s, if(s->obmc && s->pict_type != B_TYPE){ int16_t mv_cache[4][4][2]; const int xy= s->mb_x + s->mb_y*s->mb_stride; - const int mot_stride= s->mb_width*2 + 2; - const int mot_xy= 1 + mb_x*2 + (mb_y*2 + 1)*mot_stride; + const int mot_stride= s->b8_stride; + const int mot_xy= mb_x*2 + mb_y*2*mot_stride; assert(!s->mb_skiped); @@ -3003,7 +3021,7 @@ static inline void add_dequant_dct(MpegEncContext *s, */ void ff_clean_intra_table_entries(MpegEncContext *s) { - int wrap = s->block_wrap[0]; + int wrap = s->b8_stride; int xy = s->block_index[0]; s->dc_val[0][xy ] = @@ -3020,15 +3038,15 @@ void ff_clean_intra_table_entries(MpegEncContext *s) s->coded_block[xy + 1 + wrap] = 0; } /* chroma */ - wrap = s->block_wrap[4]; - xy = s->mb_x + 1 + (s->mb_y + 1) * wrap; + wrap = s->mb_stride; + xy = s->mb_x + s->mb_y * wrap; s->dc_val[1][xy] = s->dc_val[2][xy] = 1024; /* ac pred */ memset(s->ac_val[1][xy], 0, 16 * sizeof(int16_t)); memset(s->ac_val[2][xy], 0, 16 * sizeof(int16_t)); - s->mbintra_table[s->mb_x + s->mb_y*s->mb_stride]= 0; + s->mbintra_table[xy]= 0; } /* generic function called after a macroblock has been parsed by the @@ -3348,12 +3366,12 @@ void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename const int linesize= s->current_picture.linesize[0]; //not s->linesize as this woulnd be wrong for field pics const int uvlinesize= s->current_picture.linesize[1]; - s->block_index[0]= s->block_wrap[0]*(s->mb_y*2 + 1) - 1 + s->mb_x*2; - s->block_index[1]= s->block_wrap[0]*(s->mb_y*2 + 1) + s->mb_x*2; - s->block_index[2]= s->block_wrap[0]*(s->mb_y*2 + 2) - 1 + s->mb_x*2; - s->block_index[3]= s->block_wrap[0]*(s->mb_y*2 + 2) + s->mb_x*2; - s->block_index[4]= s->block_wrap[4]*(s->mb_y + 1) + s->block_wrap[0]*(s->mb_height*2 + 2) + s->mb_x; - s->block_index[5]= s->block_wrap[4]*(s->mb_y + 1 + s->mb_height + 2) + s->block_wrap[0]*(s->mb_height*2 + 2) + s->mb_x; + s->block_index[0]= s->b8_stride*(s->mb_y*2 ) - 2 + s->mb_x*2; + s->block_index[1]= s->b8_stride*(s->mb_y*2 ) - 1 + s->mb_x*2; + s->block_index[2]= s->b8_stride*(s->mb_y*2 + 1) - 2 + s->mb_x*2; + s->block_index[3]= s->b8_stride*(s->mb_y*2 + 1) - 1 + s->mb_x*2; + s->block_index[4]= s->mb_stride*(s->mb_y + 1) + s->b8_stride*s->mb_height*2 + s->mb_x - 1; + s->block_index[5]= s->mb_stride*(s->mb_y + s->mb_height + 2) + s->b8_stride*s->mb_height*2 + s->mb_x - 1; if(s->pict_type==B_TYPE && s->avctx->draw_horiz_band && s->picture_structure==PICT_FRAME){ s->dest[0] = s->current_picture.data[0] + s->mb_x * 16 - 16; |