@ -772,7 +772,7 @@ static int vp8_decode_frame_header(VP8Context *s, const uint8_t *buf, int buf_si
}
static av_always_inline
void clamp_mv ( VP8Context * s , VP56mv * dst , const VP56mv * src )
void clamp_mv ( VP8mvbounds * s , VP56mv * dst , const VP56mv * src )
{
dst - > x = av_clip ( src - > x , av_clip ( s - > mv_min . x , INT16_MIN , INT16_MAX ) ,
av_clip ( s - > mv_max . x , INT16_MIN , INT16_MAX ) ) ;
@ -1031,7 +1031,7 @@ void vp7_decode_mvs(VP8Context *s, VP8Macroblock *mb,
}
static av_always_inline
void vp8_decode_mvs ( VP8Context * s , VP8Macroblock * mb ,
void vp8_decode_mvs ( VP8Context * s , VP8mvbounds * mv_bounds , VP8 Macroblock * mb ,
int mb_x , int mb_y , int layout )
{
VP8Macroblock * mb_edge [ 3 ] = { 0 /* top */ ,
@ -1102,7 +1102,7 @@ void vp8_decode_mvs(VP8Context *s, VP8Macroblock *mb,
if ( vp56_rac_get_prob_branchy ( c , vp8_mode_contexts [ cnt [ CNT_NEAREST ] ] [ 1 ] ) ) {
if ( vp56_rac_get_prob_branchy ( c , vp8_mode_contexts [ cnt [ CNT_NEAR ] ] [ 2 ] ) ) {
/* Choose the best mv out of 0,0 and the nearest mv */
clamp_mv ( s , & mb - > mv , & near_mv [ CNT_ZERO + ( cnt [ CNT_NEAREST ] > = cnt [ CNT_ZERO ] ) ] ) ;
clamp_mv ( mv_bound s, & mb - > mv , & near_mv [ CNT_ZERO + ( cnt [ CNT_NEAREST ] > = cnt [ CNT_ZERO ] ) ] ) ;
cnt [ CNT_SPLITMV ] = ( ( mb_edge [ VP8_EDGE_LEFT ] - > mode = = VP8_MVMODE_SPLIT ) +
( mb_edge [ VP8_EDGE_TOP ] - > mode = = VP8_MVMODE_SPLIT ) ) * 2 +
( mb_edge [ VP8_EDGE_TOPLEFT ] - > mode = = VP8_MVMODE_SPLIT ) ;
@ -1116,11 +1116,11 @@ void vp8_decode_mvs(VP8Context *s, VP8Macroblock *mb,
mb - > bmv [ 0 ] = mb - > mv ;
}
} else {
clamp_mv ( s , & mb - > mv , & near_mv [ CNT_NEAR ] ) ;
clamp_mv ( mv_bound s, & mb - > mv , & near_mv [ CNT_NEAR ] ) ;
mb - > bmv [ 0 ] = mb - > mv ;
}
} else {
clamp_mv ( s , & mb - > mv , & near_mv [ CNT_NEAREST ] ) ;
clamp_mv ( mv_bound s, & mb - > mv , & near_mv [ CNT_NEAREST ] ) ;
mb - > bmv [ 0 ] = mb - > mv ;
}
} else {
@ -1166,7 +1166,8 @@ void decode_intra4x4_modes(VP8Context *s, VP56RangeCoder *c, VP8Macroblock *mb,
}
static av_always_inline
void decode_mb_mode ( VP8Context * s , VP8Macroblock * mb , int mb_x , int mb_y ,
void decode_mb_mode ( VP8Context * s , VP8mvbounds * mv_bounds ,
VP8Macroblock * mb , int mb_x , int mb_y ,
uint8_t * segment , uint8_t * ref , int layout , int is_vp7 )
{
VP56RangeCoder * c = & s - > c ;
@ -1230,7 +1231,7 @@ void decode_mb_mode(VP8Context *s, VP8Macroblock *mb, int mb_x, int mb_y,
if ( is_vp7 )
vp7_decode_mvs ( s , mb , mb_x , mb_y , layout ) ;
else
vp8_decode_mvs ( s , mb , mb_x , mb_y , layout ) ;
vp8_decode_mvs ( s , mv_bounds , m b , mb_x , mb_y , layout ) ;
} else {
// intra MB, 16.1
mb - > mode = vp8_rac_get_tree ( c , vp8_pred16x16_tree_inter , s - > prob - > pred16x16 ) ;
@ -2205,8 +2206,8 @@ void vp78_decode_mv_mb_modes(AVCodecContext *avctx, VP8Frame *curframe,
VP8Context * s = avctx - > priv_data ;
int mb_x , mb_y ;
s - > mv_min . y = - MARGIN ;
s - > mv_max . y = ( ( s - > mb_height - 1 ) < < 6 ) + MARGIN ;
s - > mv_bounds . mv_ min . y = - MARGIN ;
s - > mv_bounds . mv_ max . y = ( ( s - > mb_height - 1 ) < < 6 ) + MARGIN ;
for ( mb_y = 0 ; mb_y < s - > mb_height ; mb_y + + ) {
VP8Macroblock * mb = s - > macroblocks_base +
( ( s - > mb_width + 1 ) * ( mb_y + 1 ) + 1 ) ;
@ -2214,20 +2215,20 @@ void vp78_decode_mv_mb_modes(AVCodecContext *avctx, VP8Frame *curframe,
AV_WN32A ( s - > intra4x4_pred_mode_left , DC_PRED * 0x01010101 ) ;
s - > mv_min . x = - MARGIN ;
s - > mv_max . x = ( ( s - > mb_width - 1 ) < < 6 ) + MARGIN ;
s - > mv_bounds . mv_ min . x = - MARGIN ;
s - > mv_bounds . mv_ max . x = ( ( s - > mb_width - 1 ) < < 6 ) + MARGIN ;
for ( mb_x = 0 ; mb_x < s - > mb_width ; mb_x + + , mb_xy + + , mb + + ) {
if ( mb_y = = 0 )
AV_WN32A ( ( mb - s - > mb_width - 1 ) - > intra4x4_pred_mode_top ,
DC_PRED * 0x01010101 ) ;
decode_mb_mode ( s , mb , mb_x , mb_y , curframe - > seg_map - > data + mb_xy ,
decode_mb_mode ( s , & s - > mv_bounds , mb , mb_x , mb_y , curframe - > seg_map - > data + mb_xy ,
prev_frame & & prev_frame - > seg_map ?
prev_frame - > seg_map - > data + mb_xy : NULL , 1 , is_vp7 ) ;
s - > mv_min . x - = 64 ;
s - > mv_max . x - = 64 ;
s - > mv_bounds . mv_ min . x - = 64 ;
s - > mv_bounds . mv_ max . x - = 64 ;
}
s - > mv_min . y - = 64 ;
s - > mv_max . y - = 64 ;
s - > mv_bounds . mv_ min . y - = 64 ;
s - > mv_bounds . mv_ max . y - = 64 ;
}
}
@ -2325,8 +2326,8 @@ static av_always_inline int decode_mb_row_no_filter(AVCodecContext *avctx, void
if ( ! is_vp7 | | mb_y = = 0 )
memset ( td - > left_nnz , 0 , sizeof ( td - > left_nnz ) ) ;
s - > mv_min . x = - MARGIN ;
s - > mv_max . x = ( ( s - > mb_width - 1 ) < < 6 ) + MARGIN ;
td - > mv_bounds . mv_min . x = - MARGIN ;
td - > mv_bounds . mv_max . x = ( ( s - > mb_width - 1 ) < < 6 ) + MARGIN ;
for ( mb_x = 0 ; mb_x < s - > mb_width ; mb_x + + , mb_xy + + , mb + + ) {
if ( c - > end < = c - > buffer & & c - > bits > = 0 )
@ -2350,7 +2351,7 @@ static av_always_inline int decode_mb_row_no_filter(AVCodecContext *avctx, void
dst [ 2 ] - dst [ 1 ] , 2 ) ;
if ( ! s - > mb_layout )
decode_mb_mode ( s , mb , mb_x , mb_y , curframe - > seg_map - > data + mb_xy ,
decode_mb_mode ( s , & td - > mv_bounds , mb , mb_x , mb_y , curframe - > seg_map - > data + mb_xy ,
prev_frame & & prev_frame - > seg_map ?
prev_frame - > seg_map - > data + mb_xy : NULL , 0 , is_vp7 ) ;
@ -2397,8 +2398,8 @@ static av_always_inline int decode_mb_row_no_filter(AVCodecContext *avctx, void
dst [ 0 ] + = 16 ;
dst [ 1 ] + = 8 ;
dst [ 2 ] + = 8 ;
s - > mv_min . x - = 64 ;
s - > mv_max . x - = 64 ;
td - > mv_bounds . mv_min . x - = 64 ;
td - > mv_bounds . mv_max . x - = 64 ;
if ( mb_x = = s - > mb_width + 1 ) {
update_pos ( td , mb_y , s - > mb_width + 3 ) ;
@ -2504,6 +2505,8 @@ int vp78_decode_mb_row_sliced(AVCodecContext *avctx, void *tdata, int jobnr,
int ret ;
td - > thread_nr = threadnr ;
td - > mv_bounds . mv_min . y = - MARGIN - 64 * threadnr ;
td - > mv_bounds . mv_max . y = ( ( s - > mb_height - 1 ) < < 6 ) + MARGIN - 64 * threadnr ;
for ( mb_y = jobnr ; mb_y < s - > mb_height ; mb_y + = num_jobs ) {
atomic_store ( & td - > thread_mb_pos , mb_y < < 16 ) ;
ret = s - > decode_mb_row_no_filter ( avctx , tdata , jobnr , threadnr ) ;
@ -2515,8 +2518,8 @@ int vp78_decode_mb_row_sliced(AVCodecContext *avctx, void *tdata, int jobnr,
s - > filter_mb_row ( avctx , tdata , jobnr , threadnr ) ;
update_pos ( td , mb_y , INT_MAX & 0xFFFF ) ;
s - > mv_min . y - = 64 ;
s - > mv_max . y - = 64 ;
td - > mv_bounds . mv_ min . y - = 64 * num_jobs ;
td - > mv_bounds . mv_ max . y - = 64 * num_jobs ;
if ( avctx - > active_thread_type = = FF_THREAD_FRAME )
ff_thread_report_progress ( & curframe - > tf , mb_y , 0 ) ;
@ -2662,8 +2665,8 @@ int vp78_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
s - > num_jobs = num_jobs ;
s - > curframe = curframe ;
s - > prev_frame = prev_frame ;
s - > mv_min . y = - MARGIN ;
s - > mv_max . y = ( ( s - > mb_height - 1 ) < < 6 ) + MARGIN ;
s - > mv_bounds . mv_ min . y = - MARGIN ;
s - > mv_bounds . mv_ max . y = ( ( s - > mb_height - 1 ) < < 6 ) + MARGIN ;
for ( i = 0 ; i < MAX_THREADS ; i + + ) {
VP8ThreadData * td = & s - > thread_data [ i ] ;
atomic_init ( & td - > thread_mb_pos , 0 ) ;