|
|
@@ -339,21 +339,39 @@ if(s->quarter_sample) |
|
|
|
} |
|
|
|
} |
|
|
|
/* apply one mpeg motion vector to the three components */ |
|
|
|
static av_always_inline |
|
|
|
void mpeg_motion(MpegEncContext *s, |
|
|
|
uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, |
|
|
|
int field_based, int bottom_field, int field_select, |
|
|
|
uint8_t **ref_picture, op_pixels_func (*pix_op)[4], |
|
|
|
int motion_x, int motion_y, int h, int mb_y) |
|
|
|
static void mpeg_motion(MpegEncContext *s, |
|
|
|
uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, |
|
|
|
int field_select, uint8_t **ref_picture, |
|
|
|
op_pixels_func (*pix_op)[4], |
|
|
|
int motion_x, int motion_y, int h, int mb_y) |
|
|
|
{ |
|
|
|
#if !CONFIG_SMALL |
|
|
|
if(s->out_format == FMT_MPEG1) |
|
|
|
mpeg_motion_internal(s, dest_y, dest_cb, dest_cr, field_based, |
|
|
|
mpeg_motion_internal(s, dest_y, dest_cb, dest_cr, 0, 0, |
|
|
|
field_select, ref_picture, pix_op, |
|
|
|
motion_x, motion_y, h, 1, mb_y); |
|
|
|
else |
|
|
|
#endif |
|
|
|
mpeg_motion_internal(s, dest_y, dest_cb, dest_cr, 0, 0, |
|
|
|
field_select, ref_picture, pix_op, |
|
|
|
motion_x, motion_y, h, 0, mb_y); |
|
|
|
} |
|
|
|
|
|
|
|
static void mpeg_motion_field(MpegEncContext *s, uint8_t *dest_y, |
|
|
|
uint8_t *dest_cb, uint8_t *dest_cr, |
|
|
|
int bottom_field, int field_select, |
|
|
|
uint8_t **ref_picture, |
|
|
|
op_pixels_func (*pix_op)[4], |
|
|
|
int motion_x, int motion_y, int h, int mb_y) |
|
|
|
{ |
|
|
|
#if !CONFIG_SMALL |
|
|
|
if(s->out_format == FMT_MPEG1) |
|
|
|
mpeg_motion_internal(s, dest_y, dest_cb, dest_cr, 1, |
|
|
|
bottom_field, field_select, ref_picture, pix_op, |
|
|
|
motion_x, motion_y, h, 1, mb_y); |
|
|
|
else |
|
|
|
#endif |
|
|
|
mpeg_motion_internal(s, dest_y, dest_cb, dest_cr, field_based, |
|
|
|
mpeg_motion_internal(s, dest_y, dest_cb, dest_cr, 1, |
|
|
|
bottom_field, field_select, ref_picture, pix_op, |
|
|
|
motion_x, motion_y, h, 0, mb_y); |
|
|
|
} |
|
|
@@ -708,8 +726,7 @@ static av_always_inline void MPV_motion_internal(MpegEncContext *s, |
|
|
|
s->mv[dir][0][0], s->mv[dir][0][1], 16); |
|
|
|
}else |
|
|
|
{ |
|
|
|
mpeg_motion(s, dest_y, dest_cb, dest_cr, |
|
|
|
0, 0, 0, |
|
|
|
mpeg_motion(s, dest_y, dest_cb, dest_cr, 0, |
|
|
|
ref_picture, pix_op, |
|
|
|
s->mv[dir][0][0], s->mv[dir][0][1], 16, mb_y); |
|
|
|
} |
|
|
@@ -782,15 +799,15 @@ static av_always_inline void MPV_motion_internal(MpegEncContext *s, |
|
|
|
} |
|
|
|
}else{ |
|
|
|
/* top field */ |
|
|
|
mpeg_motion(s, dest_y, dest_cb, dest_cr, |
|
|
|
1, 0, s->field_select[dir][0], |
|
|
|
ref_picture, pix_op, |
|
|
|
s->mv[dir][0][0], s->mv[dir][0][1], 8, mb_y); |
|
|
|
mpeg_motion_field(s, dest_y, dest_cb, dest_cr, |
|
|
|
0, s->field_select[dir][0], |
|
|
|
ref_picture, pix_op, |
|
|
|
s->mv[dir][0][0], s->mv[dir][0][1], 8, mb_y); |
|
|
|
/* bottom field */ |
|
|
|
mpeg_motion(s, dest_y, dest_cb, dest_cr, |
|
|
|
1, 1, s->field_select[dir][1], |
|
|
|
ref_picture, pix_op, |
|
|
|
s->mv[dir][1][0], s->mv[dir][1][1], 8, mb_y); |
|
|
|
mpeg_motion_field(s, dest_y, dest_cb, dest_cr, |
|
|
|
1, s->field_select[dir][1], |
|
|
|
ref_picture, pix_op, |
|
|
|
s->mv[dir][1][0], s->mv[dir][1][1], 8, mb_y); |
|
|
|
} |
|
|
|
} else { |
|
|
|
if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != AV_PICTURE_TYPE_B && !s->first_field){ |
|
|
@@ -798,7 +815,7 @@ static av_always_inline void MPV_motion_internal(MpegEncContext *s, |
|
|
|
} |
|
|
|
|
|
|
|
mpeg_motion(s, dest_y, dest_cb, dest_cr, |
|
|
|
0, 0, s->field_select[dir][0], |
|
|
|
s->field_select[dir][0], |
|
|
|
ref_picture, pix_op, |
|
|
|
s->mv[dir][0][0], s->mv[dir][0][1], 16, mb_y>>1); |
|
|
|
} |
|
|
@@ -815,7 +832,7 @@ static av_always_inline void MPV_motion_internal(MpegEncContext *s, |
|
|
|
} |
|
|
|
|
|
|
|
mpeg_motion(s, dest_y, dest_cb, dest_cr, |
|
|
|
0, 0, s->field_select[dir][i], |
|
|
|
s->field_select[dir][i], |
|
|
|
ref2picture, pix_op, |
|
|
|
s->mv[dir][i][0], s->mv[dir][i][1] + 16*i, 8, mb_y>>1); |
|
|
|
|
|
|
@@ -829,17 +846,17 @@ static av_always_inline void MPV_motion_internal(MpegEncContext *s, |
|
|
|
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, mb_y); |
|
|
|
mpeg_motion_field(s, dest_y, dest_cb, dest_cr, |
|
|
|
j, j^i, ref_picture, pix_op, |
|
|
|
s->mv[dir][2*i + j][0], |
|
|
|
s->mv[dir][2*i + j][1], 8, mb_y); |
|
|
|
} |
|
|
|
pix_op = s->dsp.avg_pixels_tab; |
|
|
|
} |
|
|
|
}else{ |
|
|
|
for(i=0; i<2; i++){ |
|
|
|
mpeg_motion(s, dest_y, dest_cb, dest_cr, |
|
|
|
0, 0, s->picture_structure != i+1, |
|
|
|
s->picture_structure != i+1, |
|
|
|
ref_picture, pix_op, |
|
|
|
s->mv[dir][2*i][0],s->mv[dir][2*i][1],16, mb_y>>1); |
|
|
|
|
|
|
|