diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2004-02-29 02:08:28 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2004-02-29 02:08:28 +0000 |
commit | c8a4ebbf278c0116631209de46d7db859e829a4c (patch) | |
tree | 198d2cf0f465b1749de5096a9f2e03d3f14be157 /libavcodec | |
parent | 5ba326b5d4c63d9aad9425fef11293078111b98c (diff) | |
download | ffmpeg-c8a4ebbf278c0116631209de46d7db859e829a4c.tar.gz |
simplify MPV_motion()
Originally committed as revision 2828 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/mpegvideo.c | 110 |
1 files changed, 38 insertions, 72 deletions
diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index 38d68689c1..1413f2df44 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -2875,16 +2875,12 @@ static inline void MPV_motion(MpegEncContext *s, case MV_TYPE_FIELD: if (s->picture_structure == PICT_FRAME) { if(s->quarter_sample){ - /* top field */ - qpel_motion(s, dest_y, dest_cb, dest_cr, - 1, 0, s->field_select[dir][0], - ref_picture, pix_op, qpix_op, - s->mv[dir][0][0], s->mv[dir][0][1], 8); - /* bottom field */ - qpel_motion(s, dest_y, dest_cb, dest_cr, - 1, 1, s->field_select[dir][1], - ref_picture, pix_op, qpix_op, - s->mv[dir][1][0], s->mv[dir][1][1], 8); + for(i=0; i<2; i++){ + qpel_motion(s, dest_y, dest_cb, dest_cr, + 1, i, s->field_select[dir][i], + ref_picture, pix_op, qpix_op, + s->mv[dir][i][0], s->mv[dir][i][1], 8); + } }else{ /* top field */ mpeg_motion(s, dest_y, dest_cb, dest_cr, @@ -2908,83 +2904,53 @@ static inline void MPV_motion(MpegEncContext *s, s->mv[dir][0][0], s->mv[dir][0][1], 16); } break; - case MV_TYPE_16X8:{ - uint8_t ** ref2picture; + case MV_TYPE_16X8: + for(i=0; i<2; i++){ + uint8_t ** ref2picture; - if(s->picture_structure == s->field_select[dir][0] + 1 || s->pict_type == B_TYPE || s->first_field){ + if(s->picture_structure == s->field_select[dir][i] + 1 || s->pict_type == B_TYPE || s->first_field){ ref2picture= ref_picture; }else{ ref2picture= s->current_picture_ptr->data; } mpeg_motion(s, dest_y, dest_cb, dest_cr, - 0, 0, s->field_select[dir][0], + 0, 0, s->field_select[dir][i], ref2picture, pix_op, - s->mv[dir][0][0], s->mv[dir][0][1], 8); - - - if(s->picture_structure == s->field_select[dir][1] + 1 || s->pict_type == B_TYPE || s->first_field){ - ref2picture= ref_picture; - }else{ - ref2picture= s->current_picture_ptr->data; - } - // I know it is ugly but this is the only way to fool emu_edge without rewrite mpeg_motion - mpeg_motion(s, dest_y+16*s->linesize, dest_cb+8*s->uvlinesize, dest_cr+8*s->uvlinesize, - 0, 0, s->field_select[dir][1], - ref2picture, pix_op, - s->mv[dir][1][0], s->mv[dir][1][1]+16, 8); - } - + s->mv[dir][i][0], s->mv[dir][i][1] + 16*i, 8); + + dest_y += 16*s->linesize; + dest_cb+= 8*s->uvlinesize; + dest_cr+= 8*s->uvlinesize; + } break; case MV_TYPE_DMV: - pix_op = s->dsp.put_pixels_tab; - if(s->picture_structure == PICT_FRAME){ - //put top field from top field - mpeg_motion(s, dest_y, dest_cb, dest_cr, - 1, 0, 0, - ref_picture, pix_op, - s->mv[dir][0][0], s->mv[dir][0][1], 8); - //put bottom field from bottom field - mpeg_motion(s, dest_y, dest_cb, dest_cr, - 1, 1, 1, - ref_picture, pix_op, - s->mv[dir][0][0], s->mv[dir][0][1], 8); - - pix_op = s->dsp.avg_pixels_tab; - - //avg top field from bottom field - mpeg_motion(s, dest_y, dest_cb, dest_cr, - 1, 0, 1, - ref_picture, pix_op, - s->mv[dir][2][0], s->mv[dir][2][1], 8); - //avg bottom field from top field - mpeg_motion(s, dest_y, dest_cb, dest_cr, - 1, 1, 0, - ref_picture, pix_op, - s->mv[dir][3][0], s->mv[dir][3][1], 8); - + for(i=0; i<2; i++){ + int j; + for(j=0; j<2; j++){ + mpeg_motion(s, dest_y, dest_cb, dest_cr, + 1, j, j^i, + ref_picture, pix_op, + s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], 8); + } + pix_op = s->dsp.avg_pixels_tab; + } }else{ - //put field from the same parity - //same parity is never in the same frame - mpeg_motion(s, dest_y, dest_cb, dest_cr, - 0, 0, s->picture_structure == PICT_BOTTOM_FIELD, - ref_picture, pix_op, - s->mv[dir][0][0],s->mv[dir][0][1],16); + for(i=0; i<2; i++){ + mpeg_motion(s, dest_y, dest_cb, dest_cr, + 0, 0, s->picture_structure != i+1, + ref_picture, pix_op, + s->mv[dir][2*i][0],s->mv[dir][2*i][1],16); - // after put we make avg of the same block - pix_op=s->dsp.avg_pixels_tab; + // after put we make avg of the same block + pix_op=s->dsp.avg_pixels_tab; - //opposite parity is always in the same frame if this is second field - if(!s->first_field){ - ref_picture = s->current_picture_ptr->data; + //opposite parity is always in the same frame if this is second field + if(!s->first_field){ + ref_picture = s->current_picture_ptr->data; + } } - - //avg field from the opposite parity - mpeg_motion(s, dest_y, dest_cb, dest_cr, - 0, 0, s->picture_structure != PICT_BOTTOM_FIELD, - ref_picture, pix_op, - s->mv[dir][2][0],s->mv[dir][2][1],16); } break; default: assert(0); |