Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Yushin Cho
aom-rav1e
Commits
5d1c62c6
Commit
5d1c62c6
authored
Jan 29, 2013
by
Paul Wilkins
Committed by
Gerrit Code Review
Jan 29, 2013
Browse files
Merge "Segment Skip Flag" into experimental
parents
8b7eced6
0ff9b033
Changes
10
Hide whitespace changes
Inline
Side-by-side
vp9/common/vp9_blockd.h
View file @
5d1c62c6
...
...
@@ -125,10 +125,9 @@ typedef enum {
SEG_LVL_ALT_Q
=
0
,
// Use alternate Quantizer ....
SEG_LVL_ALT_LF
=
1
,
// Use alternate loop filter value...
SEG_LVL_REF_FRAME
=
2
,
// Optional Segment reference frame
SEG_LVL_MODE
=
3
,
// Optional Segment mode
SEG_LVL_EOB
=
4
,
// EOB end stop marker.
SEG_LVL_TRANSFORM
=
5
,
// Block transform size.
SEG_LVL_MAX
=
6
// Number of MB level features supported
SEG_LVL_SKIP
=
3
,
// Optional Segment (0,0) + skip mode
SEG_LVL_TRANSFORM
=
4
,
// Block transform size.
SEG_LVL_MAX
=
5
// Number of MB level features supported
}
SEG_LVL_FEATURES
;
// Segment level features.
...
...
vp9/common/vp9_seg_common.c
View file @
5d1c62c6
...
...
@@ -12,9 +12,9 @@
#include "vp9/common/vp9_blockd.h"
#include "vp9/common/vp9_seg_common.h"
static
const
int
segfeaturedata_signed
[
SEG_LVL_MAX
]
=
{
1
,
1
,
0
,
0
,
0
,
0
};
static
const
int
segfeaturedata_signed
[
SEG_LVL_MAX
]
=
{
1
,
1
,
0
,
0
,
0
};
static
const
int
seg_feature_data_max
[
SEG_LVL_MAX
]
=
{
MAXQ
,
63
,
0xf
,
MB_MODE_COUNT
-
1
,
255
,
TX_SIZE_MAX_SB
-
1
};
{
MAXQ
,
63
,
0xf
,
0xf
,
TX_SIZE_MAX_SB
-
1
};
// These functions provide access to new segment level features.
// Eventually these function may be "optimized out" but for the moment,
...
...
vp9/decoder/vp9_decodemv.c
View file @
5d1c62c6
...
...
@@ -140,17 +140,13 @@ static void kfread_modes(VP9D_COMP *pbi,
m
->
mbmi
.
mb_skip_coeff
=
0
;
if
(
pbi
->
common
.
mb_no_coeff_skip
&&
(
!
vp9_segfeature_active
(
&
pbi
->
mb
,
m
->
mbmi
.
segment_id
,
SEG_LVL_EOB
)
||
(
vp9_get_segdata
(
&
pbi
->
mb
,
m
->
mbmi
.
segment_id
,
SEG_LVL_EOB
)
!=
0
)))
{
m
->
mbmi
.
segment_id
,
SEG_LVL_SKIP
)))
{
MACROBLOCKD
*
const
xd
=
&
pbi
->
mb
;
m
->
mbmi
.
mb_skip_coeff
=
vp9_read
(
bc
,
vp9_get_pred_prob
(
cm
,
xd
,
PRED_MBSKIP
));
}
else
{
if
(
vp9_segfeature_active
(
&
pbi
->
mb
,
m
->
mbmi
.
segment_id
,
SEG_LVL_EOB
)
&&
(
vp9_get_segdata
(
&
pbi
->
mb
,
m
->
mbmi
.
segment_id
,
SEG_LVL_EOB
)
==
0
))
{
m
->
mbmi
.
segment_id
,
SEG_LVL_SKIP
))
{
m
->
mbmi
.
mb_skip_coeff
=
1
;
}
else
m
->
mbmi
.
mb_skip_coeff
=
0
;
...
...
@@ -697,27 +693,19 @@ static void read_mb_modes_mv(VP9D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi,
read_mb_segment_id
(
pbi
,
mb_row
,
mb_col
,
bc
);
if
(
pbi
->
common
.
mb_no_coeff_skip
&&
(
!
vp9_segfeature_active
(
xd
,
mbmi
->
segment_id
,
SEG_LVL_EOB
)
||
(
vp9_get_segdata
(
xd
,
mbmi
->
segment_id
,
SEG_LVL_EOB
)
!=
0
)))
{
(
!
vp9_segfeature_active
(
xd
,
mbmi
->
segment_id
,
SEG_LVL_SKIP
)))
{
// Read the macroblock coeff skip flag if this feature is in use,
// else default to 0
mbmi
->
mb_skip_coeff
=
vp9_read
(
bc
,
vp9_get_pred_prob
(
cm
,
xd
,
PRED_MBSKIP
));
}
else
{
if
(
vp9_segfeature_active
(
xd
,
mbmi
->
segment_id
,
SEG_LVL_EOB
)
&&
(
vp9_get_segdata
(
xd
,
mbmi
->
segment_id
,
SEG_LVL_EOB
)
==
0
))
{
if
(
vp9_segfeature_active
(
xd
,
mbmi
->
segment_id
,
SEG_LVL_SKIP
))
{
mbmi
->
mb_skip_coeff
=
1
;
}
else
mbmi
->
mb_skip_coeff
=
0
;
}
// Read the reference frame
if
(
vp9_segfeature_active
(
xd
,
mbmi
->
segment_id
,
SEG_LVL_MODE
)
&&
vp9_get_segdata
(
xd
,
mbmi
->
segment_id
,
SEG_LVL_MODE
)
<
NEARESTMV
)
mbmi
->
ref_frame
=
INTRA_FRAME
;
else
mbmi
->
ref_frame
=
read_ref_frame
(
pbi
,
bc
,
mbmi
->
segment_id
);
mbmi
->
ref_frame
=
read_ref_frame
(
pbi
,
bc
,
mbmi
->
segment_id
);
/*
if (pbi->common.current_video_frame == 1)
...
...
@@ -775,10 +763,9 @@ static void read_mb_modes_mv(VP9D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi,
}
*/
// Is the segment level mode feature enabled for this segment
if
(
vp9_segfeature_active
(
xd
,
mbmi
->
segment_id
,
SEG_LVL_MODE
))
{
mbmi
->
mode
=
vp9_get_segdata
(
xd
,
mbmi
->
segment_id
,
SEG_LVL_MODE
);
// Is the segment level skip mode enabled
if
(
vp9_segfeature_active
(
xd
,
mbmi
->
segment_id
,
SEG_LVL_SKIP
))
{
mbmi
->
mode
=
ZEROMV
;
}
else
{
if
(
mbmi
->
sb_type
)
mbmi
->
mode
=
read_sb_mv_ref
(
bc
,
mv_ref_p
);
...
...
@@ -1114,10 +1101,7 @@ static void read_mb_modes_mv(VP9D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi,
/* required for left and above block mv */
mbmi
->
mv
[
0
].
as_int
=
0
;
if
(
vp9_segfeature_active
(
xd
,
mbmi
->
segment_id
,
SEG_LVL_MODE
))
{
mbmi
->
mode
=
(
MB_PREDICTION_MODE
)
vp9_get_segdata
(
xd
,
mbmi
->
segment_id
,
SEG_LVL_MODE
);
}
else
if
(
mbmi
->
sb_type
)
{
if
(
mbmi
->
sb_type
)
{
mbmi
->
mode
=
(
MB_PREDICTION_MODE
)
read_sb_ymode
(
bc
,
pbi
->
common
.
fc
.
sb_ymode_prob
);
pbi
->
common
.
fc
.
sb_ymode_counts
[
mbmi
->
mode
]
++
;
...
...
vp9/decoder/vp9_detokenize.c
View file @
5d1c62c6
...
...
@@ -239,11 +239,13 @@ SKIP_START:
}
static
int
get_eob
(
MACROBLOCKD
*
const
xd
,
int
segment_id
,
int
eob_max
)
{
int
active
=
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_EOB
);
int
eob
=
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_EOB
);
int
eob
;
if
(
!
active
||
eob
>
eob_max
)
if
(
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_SKIP
))
{
eob
=
0
;
}
else
{
eob
=
eob_max
;
}
return
eob
;
}
...
...
vp9/encoder/vp9_bitstream.c
View file @
5d1c62c6
...
...
@@ -729,8 +729,7 @@ static void pack_inter_mode_mvs(VP9_COMP *cpi, MODE_INFO *m,
if
(
!
pc
->
mb_no_coeff_skip
)
{
skip_coeff
=
0
;
}
else
if
(
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_EOB
)
&&
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_EOB
)
==
0
)
{
}
else
if
(
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_SKIP
))
{
skip_coeff
=
1
;
}
else
{
const
int
nmbs
=
mb_size
;
...
...
@@ -750,24 +749,18 @@ static void pack_inter_mode_mvs(VP9_COMP *cpi, MODE_INFO *m,
}
// Encode the reference frame.
if
(
!
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_MODE
)
||
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_MODE
)
>=
NEARESTMV
)
{
encode_ref_frame
(
bc
,
pc
,
xd
,
segment_id
,
rf
);
}
else
{
assert
(
rf
==
INTRA_FRAME
);
}
encode_ref_frame
(
bc
,
pc
,
xd
,
segment_id
,
rf
);
if
(
rf
==
INTRA_FRAME
)
{
#ifdef ENTROPY_STATS
active_section
=
6
;
#endif
if
(
!
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_MODE
))
{
if
(
m
->
mbmi
.
sb_type
)
write_sb_ymode
(
bc
,
mode
,
pc
->
fc
.
sb_ymode_prob
);
else
write_ymode
(
bc
,
mode
,
pc
->
fc
.
ymode_prob
);
}
if
(
m
->
mbmi
.
sb_type
)
write_sb_ymode
(
bc
,
mode
,
pc
->
fc
.
sb_ymode_prob
);
else
write_ymode
(
bc
,
mode
,
pc
->
fc
.
ymode_prob
);
if
(
mode
==
B_PRED
)
{
int
j
=
0
;
do
{
...
...
@@ -798,8 +791,8 @@ static void pack_inter_mode_mvs(VP9_COMP *cpi, MODE_INFO *m,
active_section
=
3
;
#endif
// Is
the
segment
coding of mode enabled
if
(
!
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_
MODE
))
{
// Is segment
skip is not enabled code the mode.
if
(
!
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_
SKIP
))
{
if
(
mi
->
sb_type
)
{
write_sb_mv_ref
(
bc
,
mode
,
mv_ref_p
);
}
else
{
...
...
@@ -942,8 +935,7 @@ static void pack_inter_mode_mvs(VP9_COMP *cpi, MODE_INFO *m,
mi
->
partitioning
==
PARTITIONING_4X4
)))
&&
pc
->
txfm_mode
==
TX_MODE_SELECT
&&
!
((
pc
->
mb_no_coeff_skip
&&
skip_coeff
)
||
(
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_EOB
)
&&
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_EOB
)
==
0
)))
{
(
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_SKIP
))))
{
TX_SIZE
sz
=
mi
->
txfm_size
;
// FIXME(rbultje) code ternary symbol once all experiments are merged
vp9_write
(
bc
,
sz
!=
TX_4X4
,
pc
->
prob_tx
[
0
]);
...
...
@@ -972,8 +964,7 @@ static void write_mb_modes_kf(const VP9_COMP *cpi,
if
(
!
c
->
mb_no_coeff_skip
)
{
skip_coeff
=
0
;
}
else
if
(
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_EOB
)
&&
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_EOB
)
==
0
)
{
}
else
if
(
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_SKIP
))
{
skip_coeff
=
1
;
}
else
{
const
int
nmbs
=
1
<<
m
->
mbmi
.
sb_type
;
...
...
@@ -1032,8 +1023,7 @@ static void write_mb_modes_kf(const VP9_COMP *cpi,
if
(
ym
<=
I8X8_PRED
&&
c
->
txfm_mode
==
TX_MODE_SELECT
&&
!
((
c
->
mb_no_coeff_skip
&&
skip_coeff
)
||
(
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_EOB
)
&&
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_EOB
)
==
0
)))
{
(
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_SKIP
))))
{
TX_SIZE
sz
=
m
->
mbmi
.
txfm_size
;
// FIXME(rbultje) code ternary symbol once all experiments are merged
vp9_write
(
bc
,
sz
!=
TX_4X4
,
c
->
prob_tx
[
0
]);
...
...
vp9/encoder/vp9_encodeframe.c
View file @
5d1c62c6
...
...
@@ -488,8 +488,7 @@ static void update_state(VP9_COMP *cpi,
{
int
segment_id
=
mbmi
->
segment_id
;
if
(
!
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_EOB
)
||
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_EOB
))
{
if
(
!
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_SKIP
))
{
for
(
i
=
0
;
i
<
NB_TXFM_MODES
;
i
++
)
{
cpi
->
rd_tx_select_diff
[
i
]
+=
ctx
->
txfm_rd_diff
[
i
];
}
...
...
@@ -1388,8 +1387,7 @@ static void reset_skip_txfm_size_mb(VP9_COMP *cpi,
const
int
segment_id
=
mbmi
->
segment_id
;
xd
->
mode_info_context
=
mi
;
assert
((
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_EOB
)
&&
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_EOB
)
==
0
)
||
assert
((
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_SKIP
))
||
(
cm
->
mb_no_coeff_skip
&&
mbmi
->
mb_skip_coeff
));
mbmi
->
txfm_size
=
txfm_max
;
}
...
...
@@ -1433,8 +1431,7 @@ static void reset_skip_txfm_size_sb32(VP9_COMP *cpi, MODE_INFO *mi,
const
int
xmbs
=
MIN
(
2
,
mb_cols_left
);
xd
->
mode_info_context
=
mi
;
assert
((
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_EOB
)
&&
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_EOB
)
==
0
)
||
assert
((
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_SKIP
))
||
(
cm
->
mb_no_coeff_skip
&&
get_skip_flag
(
mi
,
mis
,
ymbs
,
xmbs
)));
set_txfm_flag
(
mi
,
mis
,
ymbs
,
xmbs
,
txfm_max
);
}
...
...
@@ -1454,8 +1451,7 @@ static void reset_skip_txfm_size_sb64(VP9_COMP *cpi, MODE_INFO *mi,
const
int
xmbs
=
MIN
(
4
,
mb_cols_left
);
xd
->
mode_info_context
=
mi
;
assert
((
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_EOB
)
&&
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_EOB
)
==
0
)
||
assert
((
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_SKIP
))
||
(
cm
->
mb_no_coeff_skip
&&
get_skip_flag
(
mi
,
mis
,
ymbs
,
xmbs
)));
set_txfm_flag
(
mi
,
mis
,
ymbs
,
xmbs
,
txfm_max
);
}
...
...
@@ -2227,8 +2223,7 @@ static void encode_macroblock(VP9_COMP *cpi, TOKENEXTRA **t,
int
segment_id
=
mbmi
->
segment_id
;
if
(
cpi
->
common
.
txfm_mode
==
TX_MODE_SELECT
&&
!
((
cpi
->
common
.
mb_no_coeff_skip
&&
mbmi
->
mb_skip_coeff
)
||
(
vp9_segfeature_active
(
&
x
->
e_mbd
,
segment_id
,
SEG_LVL_EOB
)
&&
vp9_get_segdata
(
&
x
->
e_mbd
,
segment_id
,
SEG_LVL_EOB
)
==
0
)))
{
(
vp9_segfeature_active
(
&
x
->
e_mbd
,
segment_id
,
SEG_LVL_SKIP
))))
{
assert
(
mbmi
->
txfm_size
<=
TX_16X16
);
if
(
mbmi
->
mode
!=
B_PRED
&&
mbmi
->
mode
!=
I8X8_PRED
&&
mbmi
->
mode
!=
SPLITMV
)
{
...
...
@@ -2465,8 +2460,7 @@ static void encode_superblock32(VP9_COMP *cpi, TOKENEXTRA **t,
if
(
output_enabled
)
{
if
(
cm
->
txfm_mode
==
TX_MODE_SELECT
&&
!
((
cm
->
mb_no_coeff_skip
&&
skip
[
0
]
&&
skip
[
1
]
&&
skip
[
2
]
&&
skip
[
3
])
||
(
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_EOB
)
&&
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_EOB
)
==
0
)))
{
(
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_SKIP
))))
{
cpi
->
txfm_count_32x32p
[
mi
->
mbmi
.
txfm_size
]
++
;
}
else
{
TX_SIZE
sz
=
(
cm
->
txfm_mode
==
TX_MODE_SELECT
)
?
...
...
@@ -2729,8 +2723,7 @@ static void encode_superblock64(VP9_COMP *cpi, TOKENEXTRA **t,
skip
[
4
]
&&
skip
[
5
]
&&
skip
[
6
]
&&
skip
[
7
]
&&
skip
[
8
]
&&
skip
[
9
]
&&
skip
[
10
]
&&
skip
[
11
]
&&
skip
[
12
]
&&
skip
[
13
]
&&
skip
[
14
]
&&
skip
[
15
])))
||
(
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_EOB
)
&&
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_EOB
)
==
0
)))
{
(
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_SKIP
))))
{
cpi
->
txfm_count_32x32p
[
mi
->
mbmi
.
txfm_size
]
++
;
}
else
{
int
x
,
y
;
...
...
vp9/encoder/vp9_onyx_if.c
View file @
5d1c62c6
...
...
@@ -446,7 +446,7 @@ static void init_seg_features(VP9_COMP *cpi) {
else
if
(
xd
->
segmentation_enabled
)
{
// First normal frame in a valid gf or alt ref group
if
(
cpi
->
common
.
frames_since_golden
==
0
)
{
// Set up segment features for normal frames in an af group
// Set up segment features for normal frames in an a
r
f group
if
(
cpi
->
source_alt_ref_active
)
{
xd
->
update_mb_segmentation_map
=
0
;
xd
->
update_mb_segmentation_data
=
1
;
...
...
@@ -463,16 +463,9 @@ static void init_seg_features(VP9_COMP *cpi) {
// Segment coding disabled for compred testing
if
(
high_q
||
(
cpi
->
static_mb_pct
==
100
))
{
// set_segref(xd, 1, LAST_FRAME);
vp9_set_segref
(
xd
,
1
,
ALTREF_FRAME
);
vp9_enable_segfeature
(
xd
,
1
,
SEG_LVL_REF_FRAME
);
vp9_set_segdata
(
xd
,
1
,
SEG_LVL_MODE
,
ZEROMV
);
vp9_enable_segfeature
(
xd
,
1
,
SEG_LVL_MODE
);
// EOB segment coding not fixed for 8x8 yet
vp9_set_segdata
(
xd
,
1
,
SEG_LVL_EOB
,
0
);
vp9_enable_segfeature
(
xd
,
1
,
SEG_LVL_EOB
);
vp9_enable_segfeature
(
xd
,
1
,
SEG_LVL_SKIP
);
}
}
// Disable segmentation and clear down features if alt ref
...
...
@@ -491,29 +484,23 @@ static void init_seg_features(VP9_COMP *cpi) {
}
// Special case where we are coding over the top of a previous
// alt ref frame
// alt ref frame
.
// Segment coding disabled for compred testing
else
if
(
cpi
->
is_src_frame_alt_ref
)
{
// Enable
mode and
ref frame features for segment 0 as well
// Enable ref frame features for segment 0 as well
vp9_enable_segfeature
(
xd
,
0
,
SEG_LVL_REF_FRAME
);
vp9_enable_segfeature
(
xd
,
0
,
SEG_LVL_MODE
);
vp9_enable_segfeature
(
xd
,
1
,
SEG_LVL_REF_FRAME
);
vp9_enable_segfeature
(
xd
,
1
,
SEG_LVL_MODE
);
// All mbs should use ALTREF_FRAME
, ZEROMV exclusively
// All mbs should use ALTREF_FRAME
vp9_clear_segref
(
xd
,
0
);
vp9_set_segref
(
xd
,
0
,
ALTREF_FRAME
);
vp9_clear_segref
(
xd
,
1
);
vp9_set_segref
(
xd
,
1
,
ALTREF_FRAME
);
vp9_set_segdata
(
xd
,
0
,
SEG_LVL_MODE
,
ZEROMV
);
vp9_set_segdata
(
xd
,
1
,
SEG_LVL_MODE
,
ZEROMV
);
// Skip all MBs if high Q
// Skip all MBs if high Q
(0,0 mv and skip coeffs)
if
(
high_q
)
{
vp9_enable_segfeature
(
xd
,
0
,
SEG_LVL_EOB
);
vp9_set_segdata
(
xd
,
0
,
SEG_LVL_EOB
,
0
);
vp9_enable_segfeature
(
xd
,
1
,
SEG_LVL_EOB
);
vp9_set_segdata
(
xd
,
1
,
SEG_LVL_EOB
,
0
);
vp9_enable_segfeature
(
xd
,
0
,
SEG_LVL_SKIP
);
vp9_enable_segfeature
(
xd
,
1
,
SEG_LVL_SKIP
);
}
// Enable data udpate
xd
->
update_mb_segmentation_data
=
1
;
...
...
vp9/encoder/vp9_quantize.c
View file @
5d1c62c6
...
...
@@ -556,16 +556,12 @@ void vp9_mb_init_quantizer(VP9_COMP *cpi, MACROBLOCK *x) {
x
->
block
[
i
].
zrun_zbin_boost
=
cpi
->
zrun_zbin_boost_y1
[
QIndex
];
x
->
block
[
i
].
zbin_extra
=
(
int16_t
)
zbin_extra
;
// Segment max eob offset feature.
if
(
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_EOB
))
{
x
->
block
[
i
].
eob_max_offset
=
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_EOB
);
x
->
block
[
i
].
eob_max_offset_8x8
=
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_EOB
);
x
->
block
[
i
].
eob_max_offset_16x16
=
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_EOB
);
x
->
block
[
i
].
eob_max_offset_32x32
=
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_EOB
);
// Segment skip feature.
if
(
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_SKIP
))
{
x
->
block
[
i
].
eob_max_offset
=
0
;
x
->
block
[
i
].
eob_max_offset_8x8
=
0
;
x
->
block
[
i
].
eob_max_offset_16x16
=
0
;
x
->
block
[
i
].
eob_max_offset_32x32
=
0
;
}
else
{
x
->
block
[
i
].
eob_max_offset
=
16
;
x
->
block
[
i
].
eob_max_offset_8x8
=
64
;
...
...
@@ -590,14 +586,11 @@ void vp9_mb_init_quantizer(VP9_COMP *cpi, MACROBLOCK *x) {
x
->
block
[
i
].
zbin_extra
=
(
int16_t
)
zbin_extra
;
// Segment max eob offset feature.
if
(
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_EOB
))
{
x
->
block
[
i
].
eob_max_offset
=
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_EOB
);
x
->
block
[
i
].
eob_max_offset_8x8
=
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_EOB
);
x
->
block
[
i
].
eob_max_offset_16x16
=
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_EOB
);
// Segment skip feature.
if
(
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_SKIP
))
{
x
->
block
[
i
].
eob_max_offset
=
0
;
x
->
block
[
i
].
eob_max_offset_8x8
=
0
;
x
->
block
[
i
].
eob_max_offset_16x16
=
0
;
}
else
{
x
->
block
[
i
].
eob_max_offset
=
16
;
x
->
block
[
i
].
eob_max_offset_8x8
=
64
;
...
...
@@ -620,12 +613,10 @@ void vp9_mb_init_quantizer(VP9_COMP *cpi, MACROBLOCK *x) {
x
->
block
[
24
].
zbin_extra
=
(
int16_t
)
zbin_extra
;
// TBD perhaps not use for Y2
// Segment max eob offset feature.
if
(
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_EOB
))
{
x
->
block
[
24
].
eob_max_offset
=
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_EOB
);
x
->
block
[
24
].
eob_max_offset_8x8
=
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_EOB
);
// Segment skip feature.
if
(
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_SKIP
))
{
x
->
block
[
24
].
eob_max_offset
=
0
;
x
->
block
[
24
].
eob_max_offset_8x8
=
0
;
}
else
{
x
->
block
[
24
].
eob_max_offset
=
16
;
x
->
block
[
24
].
eob_max_offset_8x8
=
4
;
...
...
vp9/encoder/vp9_rdopt.c
View file @
5d1c62c6
...
...
@@ -498,8 +498,8 @@ static int cost_coeffs(MACROBLOCK *mb,
pn
=
pt
;
#endif
if
(
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_
EOB
))
seg_eob
=
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_EOB
)
;
if
(
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_
SKIP
))
seg_eob
=
0
;
if
(
tx_type
!=
DCT_DCT
)
{
for
(;
c
<
eob
;
c
++
)
{
...
...
@@ -2076,12 +2076,8 @@ int vp9_cost_mv_ref(VP9_COMP *cpi,
MACROBLOCKD
*
xd
=
&
cpi
->
mb
.
e_mbd
;
int
segment_id
=
xd
->
mode_info_context
->
mbmi
.
segment_id
;
// If the mode coding is done entirely at the segment level
// we should not account for it at the per mb level in rd code.
// Note that if the segment level coding is expanded from single mode
// to multiple mode masks as per reference frame coding we will need
// to do something different here.
if
(
!
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_MODE
))
{
// Dont account for mode here if segment skip is enabled.
if
(
!
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_SKIP
))
{
VP9_COMMON
*
pc
=
&
cpi
->
common
;
vp9_prob
p
[
VP9_MVREFS
-
1
];
...
...
@@ -3689,18 +3685,16 @@ static void rd_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
if
(
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_REF_FRAME
)
&&
!
vp9_check_segref
(
xd
,
segment_id
,
mbmi
->
ref_frame
))
{
continue
;
// If the segment
mode
feature is enabled....
// If the segment
skip
feature is enabled....
// then do nothing if the current mode is not allowed..
}
else
if
(
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_MODE
)
&&
(
this_mode
!=
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_MODE
)))
{
}
else
if
(
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_SKIP
)
&&
(
this_mode
!=
ZEROMV
))
{
continue
;
// Disable this drop out case if
either the mode or
ref frame
//
segment
level feature is enabled for this segment. This is to
// Disable this drop out case if
the
ref frame
segment
// level feature is enabled for this segment. This is to
// prevent the possibility that the we end up unable to pick any mode.
}
else
if
(
!
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_REF_FRAME
)
&&
!
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_MODE
))
{
// Only consider ZEROMV/ALTREF_FRAME for alt ref frame,
}
else
if
(
!
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_REF_FRAME
))
{
// Only consider ZEROMV/ALTREF_FRAME for alt ref frame overlay,
// unless ARNR filtering is enabled in which case we want
// an unfiltered alternative
if
(
cpi
->
is_src_frame_alt_ref
&&
(
cpi
->
oxcf
.
arnr_max_frames
==
0
))
{
...
...
@@ -3990,10 +3984,8 @@ static void rd_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
if
(
cpi
->
common
.
mb_no_coeff_skip
)
{
int
mb_skip_allowed
;
// Is Mb level skip allowed for this mb.
mb_skip_allowed
=
!
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_EOB
)
||
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_EOB
);
// Is Mb level skip allowed (i.e. not coded at segment level).
mb_skip_allowed
=
!
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_SKIP
);
if
(
skippable
)
{
mbmi
->
mb_skip_coeff
=
1
;
...
...
@@ -4199,12 +4191,11 @@ static void rd_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x,
cpi
->
rd_thresh_mult
[
best_mode_index
];
}
// This code force Altref,0,0 and skip for the frame that overlays a
// This code force
s
Altref,0,0 and skip for the frame that overlays a
// an alrtef unless Altref is filtered. However, this is unsafe if
// segment level coding of ref frame
or mode
is enabled for this
// segment level coding of ref frame is enabled for this
// segment.
if
(
!
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_REF_FRAME
)
&&
!
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_MODE
)
&&
cpi
->
is_src_frame_alt_ref
&&
(
cpi
->
oxcf
.
arnr_max_frames
==
0
)
&&
(
best_mbmode
.
mode
!=
ZEROMV
||
best_mbmode
.
ref_frame
!=
ALTREF_FRAME
))
{
...
...
@@ -4667,16 +4658,15 @@ static int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x,
if
(
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_REF_FRAME
)
&&
!
vp9_check_segref
(
xd
,
segment_id
,
ref_frame
))
{
continue
;
// If the segment
mode
feature is enabled....
// If the segment
skip
feature is enabled....
// then do nothing if the current mode is not allowed..
}
else
if
(
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_
MODE
)
&&
(
this_mode
!=
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_MODE
)
))
{
}
else
if
(
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_
SKIP
)
&&
(
this_mode
!=
ZEROMV
))
{
continue
;
// Disable this drop out case if
ei
the
r the mode or
ref frame
// Disable this drop out case if the ref frame
// segment level feature is enabled for this segment. This is to
// prevent the possibility that we end up unable to pick any mode.
}
else
if
(
!
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_REF_FRAME
)
&&
!
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_MODE
))
{
}
else
if
(
!
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_REF_FRAME
))
{
// Only consider ZEROMV/ALTREF_FRAME for alt ref frame,
// unless ARNR filtering is enabled in which case we want
// an unfiltered alternative
...
...
@@ -4765,10 +4755,8 @@ static int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x,
if
(
cpi
->
common
.
mb_no_coeff_skip
)
{
int
mb_skip_allowed
;
// Is Mb level skip allowed for this mb.
mb_skip_allowed
=
!
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_EOB
)
||
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_EOB
);
// Is Mb level skip allowed (i.e. not coded at segment level).
mb_skip_allowed
=
!
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_SKIP
);
if
(
skippable
)
{
// Back out the coefficient coding costs
...
...
@@ -4952,10 +4940,8 @@ static int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x,
// This code forces Altref,0,0 and skip for the frame that overlays a
// an alrtef unless Altref is filtered. However, this is unsafe if
// segment level coding of ref frame or mode is enabled for this
// segment.
// segment level coding of ref frame is enabled for this segment.
if
(
!
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_REF_FRAME
)
&&
!
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_MODE
)
&&
cpi
->
is_src_frame_alt_ref
&&
(
cpi
->
oxcf
.
arnr_max_frames
==
0
)
&&
(
best_mbmode
.
mode
!=
ZEROMV
||
best_mbmode
.
ref_frame
!=
ALTREF_FRAME
))
{
...
...
vp9/encoder/vp9_tokenize.c
View file @
5d1c62c6
...
...
@@ -233,8 +233,8 @@ static void tokenize_b(VP9_COMP *cpi,
pn
=
pt
;
#endif
if
(
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_
EOB
))
seg_eob
=
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_EOB
)
;
if
(
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_
SKIP
))
seg_eob
=
0
;
do
{
const
int
band
=
bands
[
c
];
...
...
@@ -390,8 +390,7 @@ void vp9_tokenize_sb(VP9_COMP *cpi,
(
ENTROPY_CONTEXT
*
)
(
xd
->
left_context
+
1
),
};
const
int
mb_skip_context
=
vp9_get_pred_context
(
cm
,
xd
,
PRED_MBSKIP
);
const
int
segment_id
=
mbmi
->
segment_id
;
const
int
skip_inc
=
!
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_EOB
)
||
(
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_EOB
)
!=
0
);
const
int
skip_inc
=
!
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_SKIP
);
int
b
;
mbmi
->
mb_skip_coeff
=
sb_is_skippable_32x32
(
xd
);
...
...
@@ -441,8 +440,7 @@ void vp9_tokenize_mb(VP9_COMP *cpi,
int
skip_inc
;
int
segment_id
=
xd
->
mode_info_context
->
mbmi
.
segment_id
;
if
(
!
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_EOB
)
||
(
vp9_get_segdata
(
xd
,
segment_id
,
SEG_LVL_EOB
)
!=
0
))
{
if
(
!
vp9_segfeature_active
(
xd
,
segment_id
,
SEG_LVL_SKIP
))
{
skip_inc
=
1
;
}
else
skip_inc
=
0
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment