|
@@ -466,19 +466,21 @@ static void rv34_pred_mv(RV34DecContext *r, int block_type, int subblock_no, int |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#define GET_PTS_DIFF(a, b) ((a - b + 8192) & 0x1FFF) |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* Calculate motion vector component that should be added for direct blocks. |
|
|
* Calculate motion vector component that should be added for direct blocks. |
|
|
*/ |
|
|
*/ |
|
|
static int calc_add_mv(MpegEncContext *s, int dir, int component) |
|
|
|
|
|
|
|
|
static int calc_add_mv(RV34DecContext *r, int dir, int val) |
|
|
{ |
|
|
{ |
|
|
int mv_pos = s->mb_x * 2 + s->mb_y * 2 * s->b8_stride; |
|
|
|
|
|
int sum; |
|
|
|
|
|
|
|
|
int refdist = GET_PTS_DIFF(r->next_pts, r->last_pts); |
|
|
|
|
|
int dist = dir ? GET_PTS_DIFF(r->next_pts, r->cur_pts) : GET_PTS_DIFF(r->cur_pts, r->last_pts); |
|
|
|
|
|
|
|
|
sum = (s->next_picture_ptr->motion_val[0][mv_pos][component] + |
|
|
|
|
|
s->next_picture_ptr->motion_val[0][mv_pos + 1][component] + |
|
|
|
|
|
s->next_picture_ptr->motion_val[0][mv_pos + s->b8_stride][component] + |
|
|
|
|
|
s->next_picture_ptr->motion_val[0][mv_pos + s->b8_stride + 1][component]) >> 2; |
|
|
|
|
|
return dir ? -(sum >> 1) : ((sum + 1) >> 1); |
|
|
|
|
|
|
|
|
if(!refdist) return 0; |
|
|
|
|
|
if(!dir) |
|
|
|
|
|
return (val * dist + refdist - 1) / refdist; |
|
|
|
|
|
else |
|
|
|
|
|
return -(val * dist / refdist); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
@@ -545,10 +547,6 @@ static void rv34_pred_mv_b(RV34DecContext *r, int block_type, int dir) |
|
|
mx += r->dmv[dir][0]; |
|
|
mx += r->dmv[dir][0]; |
|
|
my += r->dmv[dir][1]; |
|
|
my += r->dmv[dir][1]; |
|
|
|
|
|
|
|
|
if(block_type == RV34_MB_B_DIRECT){ |
|
|
|
|
|
mx += calc_add_mv(s, dir, 0); |
|
|
|
|
|
my += calc_add_mv(s, dir, 1); |
|
|
|
|
|
} |
|
|
|
|
|
for(j = 0; j < 2; j++){ |
|
|
for(j = 0; j < 2; j++){ |
|
|
for(i = 0; i < 2; i++){ |
|
|
for(i = 0; i < 2; i++){ |
|
|
cur_pic->motion_val[dir][mv_pos + i + j*s->b8_stride][0] = mx; |
|
|
cur_pic->motion_val[dir][mv_pos + i + j*s->b8_stride][0] = mx; |
|
@@ -694,7 +692,7 @@ static int rv34_decode_mv(RV34DecContext *r, int block_type) |
|
|
{ |
|
|
{ |
|
|
MpegEncContext *s = &r->s; |
|
|
MpegEncContext *s = &r->s; |
|
|
GetBitContext *gb = &s->gb; |
|
|
GetBitContext *gb = &s->gb; |
|
|
int i, j, k; |
|
|
|
|
|
|
|
|
int i, j, k, l; |
|
|
int mv_pos = s->mb_x * 2 + s->mb_y * 2 * s->b8_stride; |
|
|
int mv_pos = s->mb_x * 2 + s->mb_y * 2 * s->b8_stride; |
|
|
int next_bt; |
|
|
int next_bt; |
|
|
|
|
|
|
|
@@ -719,10 +717,9 @@ static int rv34_decode_mv(RV34DecContext *r, int block_type) |
|
|
next_bt = s->next_picture_ptr->mb_type[s->mb_x + s->mb_y * s->mb_stride]; |
|
|
next_bt = s->next_picture_ptr->mb_type[s->mb_x + s->mb_y * s->mb_stride]; |
|
|
for(j = 0; j < 2; j++) |
|
|
for(j = 0; j < 2; j++) |
|
|
for(i = 0; i < 2; i++) |
|
|
for(i = 0; i < 2; i++) |
|
|
for(k = 0; k < 2; k++){ |
|
|
|
|
|
s->current_picture_ptr->motion_val[0][mv_pos + i + j*s->b8_stride][k] = (s->next_picture_ptr->motion_val[0][mv_pos + i + j*s->b8_stride][k] + 1) >> 1; |
|
|
|
|
|
s->current_picture_ptr->motion_val[1][mv_pos + i + j*s->b8_stride][k] = -(s->next_picture_ptr->motion_val[0][mv_pos + i + j*s->b8_stride][k] >> 1); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
for(k = 0; k < 2; k++) |
|
|
|
|
|
for(l = 0; l < 2; l++) |
|
|
|
|
|
s->current_picture_ptr->motion_val[l][mv_pos + i + j*s->b8_stride][k] = calc_add_mv(r, l, s->next_picture_ptr->motion_val[0][mv_pos + i + j*s->b8_stride][k]); |
|
|
if(IS_16X16(next_bt)) //we can use whole macroblock MC |
|
|
if(IS_16X16(next_bt)) //we can use whole macroblock MC |
|
|
rv34_mc_2mv(r, block_type); |
|
|
rv34_mc_2mv(r, block_type); |
|
|
else |
|
|
else |
|
@@ -1104,7 +1101,8 @@ static inline int slice_compare(SliceInfo *si1, SliceInfo *si2) |
|
|
return si1->type != si2->type || |
|
|
return si1->type != si2->type || |
|
|
si1->start >= si2->start || |
|
|
si1->start >= si2->start || |
|
|
si1->width != si2->width || |
|
|
si1->width != si2->width || |
|
|
si1->height != si2->height; |
|
|
|
|
|
|
|
|
si1->height != si2->height|| |
|
|
|
|
|
si1->pts != si2->pts; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static int rv34_decode_slice(RV34DecContext *r, int end, uint8_t* buf, int buf_size) |
|
|
static int rv34_decode_slice(RV34DecContext *r, int end, uint8_t* buf, int buf_size) |
|
@@ -1140,6 +1138,11 @@ static int rv34_decode_slice(RV34DecContext *r, int end, uint8_t* buf, int buf_s |
|
|
return -1; |
|
|
return -1; |
|
|
ff_er_frame_start(s); |
|
|
ff_er_frame_start(s); |
|
|
s->current_picture_ptr = &s->current_picture; |
|
|
s->current_picture_ptr = &s->current_picture; |
|
|
|
|
|
r->cur_pts = r->si.pts; |
|
|
|
|
|
if(s->pict_type != FF_B_TYPE){ |
|
|
|
|
|
r->last_pts = r->next_pts; |
|
|
|
|
|
r->next_pts = r->cur_pts; |
|
|
|
|
|
} |
|
|
s->mb_x = s->mb_y = 0; |
|
|
s->mb_x = s->mb_y = 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|