提交 dd18c9a0 编写于 作者: J Jason Garrett-Glaser

VP8: simplify lf_delta mb mode logic

上级 4359288c
...@@ -162,13 +162,14 @@ typedef struct { ...@@ -162,13 +162,14 @@ typedef struct {
/** /**
* filter strength adjustment for the following macroblock modes: * filter strength adjustment for the following macroblock modes:
* [0] - i4x4 * [0-3] - i16x16 (always zero)
* [1] - zero mv * [4] - i4x4
* [2] - inter modes except for zero or split mv * [5] - zero mv
* [3] - split mv * [6] - inter modes except for zero or split mv
* [7] - split mv
* i16x16 modes never have any adjustment * i16x16 modes never have any adjustment
*/ */
int8_t mode[4]; int8_t mode[VP8_MVMODE_SPLIT+1];
/** /**
* filter strength adjustment for macroblocks that reference: * filter strength adjustment for macroblocks that reference:
...@@ -278,7 +279,7 @@ static void update_lf_deltas(VP8Context *s) ...@@ -278,7 +279,7 @@ static void update_lf_deltas(VP8Context *s)
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
s->lf_delta.ref[i] = vp8_rac_get_sint(c, 6); s->lf_delta.ref[i] = vp8_rac_get_sint(c, 6);
for (i = 0; i < 4; i++) for (i = MODE_I4x4; i <= VP8_MVMODE_SPLIT; i++)
s->lf_delta.mode[i] = vp8_rac_get_sint(c, 6); s->lf_delta.mode[i] = vp8_rac_get_sint(c, 6);
} }
...@@ -762,6 +763,7 @@ void decode_mb_mode(VP8Context *s, VP8Macroblock *mb, int mb_x, int mb_y, uint8_ ...@@ -762,6 +763,7 @@ void decode_mb_mode(VP8Context *s, VP8Macroblock *mb, int mb_x, int mb_y, uint8_
// motion vectors, 16.3 // motion vectors, 16.3
find_near_mvs(s, mb, near, &best, cnt); find_near_mvs(s, mb, near, &best, cnt);
if (vp56_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[0]][0])) { if (vp56_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[0]][0])) {
mb->mode = VP8_MVMODE_MV;
if (vp56_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[1]][1])) { if (vp56_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[1]][1])) {
if (vp56_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[2]][2])) { if (vp56_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[2]][2])) {
if (vp56_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[3]][3])) { if (vp56_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[3]][3])) {
...@@ -769,19 +771,14 @@ void decode_mb_mode(VP8Context *s, VP8Macroblock *mb, int mb_x, int mb_y, uint8_ ...@@ -769,19 +771,14 @@ void decode_mb_mode(VP8Context *s, VP8Macroblock *mb, int mb_x, int mb_y, uint8_
clamp_mv(s, &mb->mv, &mb->mv, mb_x, mb_y); clamp_mv(s, &mb->mv, &mb->mv, mb_x, mb_y);
mb->mv = mb->bmv[decode_splitmvs(s, c, mb) - 1]; mb->mv = mb->bmv[decode_splitmvs(s, c, mb) - 1];
} else { } else {
mb->mode = VP8_MVMODE_NEW;
clamp_mv(s, &mb->mv, &mb->mv, mb_x, mb_y); clamp_mv(s, &mb->mv, &mb->mv, mb_x, mb_y);
mb->mv.y += read_mv_component(c, s->prob->mvc[0]); mb->mv.y += read_mv_component(c, s->prob->mvc[0]);
mb->mv.x += read_mv_component(c, s->prob->mvc[1]); mb->mv.x += read_mv_component(c, s->prob->mvc[1]);
} }
} else { } else
mb->mode = VP8_MVMODE_NEAR;
clamp_mv(s, &mb->mv, &near[1], mb_x, mb_y); clamp_mv(s, &mb->mv, &near[1], mb_x, mb_y);
} } else
} else {
mb->mode = VP8_MVMODE_NEAREST;
clamp_mv(s, &mb->mv, &near[0], mb_x, mb_y); clamp_mv(s, &mb->mv, &near[0], mb_x, mb_y);
}
} else { } else {
mb->mode = VP8_MVMODE_ZERO; mb->mode = VP8_MVMODE_ZERO;
AV_ZERO32(&mb->mv); AV_ZERO32(&mb->mv);
...@@ -1481,18 +1478,7 @@ static av_always_inline void filter_level_for_mb(VP8Context *s, VP8Macroblock *m ...@@ -1481,18 +1478,7 @@ static av_always_inline void filter_level_for_mb(VP8Context *s, VP8Macroblock *m
if (s->lf_delta.enabled) { if (s->lf_delta.enabled) {
filter_level += s->lf_delta.ref[mb->ref_frame]; filter_level += s->lf_delta.ref[mb->ref_frame];
filter_level += s->lf_delta.mode[mb->mode];
if (mb->ref_frame == VP56_FRAME_CURRENT) {
if (mb->mode == MODE_I4x4)
filter_level += s->lf_delta.mode[0];
} else {
if (mb->mode == VP8_MVMODE_ZERO)
filter_level += s->lf_delta.mode[1];
else if (mb->mode == VP8_MVMODE_SPLIT)
filter_level += s->lf_delta.mode[3];
else
filter_level += s->lf_delta.mode[2];
}
} }
filter_level = av_clip(filter_level, 0, 63); filter_level = av_clip(filter_level, 0, 63);
......
...@@ -48,10 +48,8 @@ enum dct_token { ...@@ -48,10 +48,8 @@ enum dct_token {
#define MODE_I4x4 4 #define MODE_I4x4 4
enum inter_mvmode { enum inter_mvmode {
VP8_MVMODE_NEAREST = MODE_I4x4 + 1, VP8_MVMODE_ZERO = MODE_I4x4 + 1,
VP8_MVMODE_NEAR, VP8_MVMODE_MV,
VP8_MVMODE_ZERO,
VP8_MVMODE_NEW,
VP8_MVMODE_SPLIT VP8_MVMODE_SPLIT
}; };
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册