Mercurial > libavcodec.hg
diff mpegvideo.c @ 1326:6cdd3b8f4fd3 libavcodec
DMV support patch by ("Ivan Kalvachev" <ivan at cacad dot com>)
author | michaelni |
---|---|
date | Mon, 23 Jun 2003 22:32:15 +0000 |
parents | 26c44d2433c1 |
children | ca3122e0a3cd |
line wrap: on
line diff
--- a/mpegvideo.c Sun Jun 22 11:08:22 2003 +0000 +++ b/mpegvideo.c Mon Jun 23 22:32:15 2003 +0000 @@ -2190,6 +2190,71 @@ s->mv[dir][0][0], s->mv[dir][0][1], 16); } break; + case MV_TYPE_DMV: + { + op_pixels_func (*dmv_pix_op)[4]; + int offset; + + 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, 0, + ref_picture, 0, + 1, dmv_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, s->linesize, + ref_picture, s->linesize, + 1, dmv_pix_op, + s->mv[dir][0][0], s->mv[dir][0][1], 8); + + dmv_pix_op = s->dsp.avg_pixels_tab; + + //avg top field from bottom field + mpeg_motion(s, dest_y, dest_cb, dest_cr, 0, + ref_picture, s->linesize, + 1, dmv_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, s->linesize, + ref_picture, 0, + 1, dmv_pix_op, + s->mv[dir][3][0], s->mv[dir][3][1], 8); + + }else{ + offset=(s->picture_structure == PICT_BOTTOM_FIELD)? + s->linesize : 0; + + //put field from the same parity + //same parity is never in the same frame + mpeg_motion(s, dest_y, dest_cb, dest_cr, 0, + ref_picture,offset, + 0,dmv_pix_op, + s->mv[dir][0][0],s->mv[dir][0][1],16); + + // after put we make avg of the same block + dmv_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.data; + //top field is one linesize from frame beginig + offset=(s->picture_structure == PICT_BOTTOM_FIELD)? + -s->linesize : s->linesize; + }else + offset=(s->picture_structure == PICT_BOTTOM_FIELD)? + 0 : s->linesize; + + //avg field from the opposite parity + mpeg_motion(s, dest_y, dest_cb, dest_cr,0, + ref_picture, offset, + 0,dmv_pix_op, + s->mv[dir][2][0],s->mv[dir][2][1],16); + } + } + break; + } }