Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Xiph.Org
aom-rav1e
Commits
0b3560c7
Commit
0b3560c7
authored
Sep 25, 2014
by
Deb Mukherjee
Committed by
Gerrit Code Review
Sep 25, 2014
Browse files
Options
Browse Files
Download
Plain Diff
Merge "Adds various high bit-depth encode functions"
parents
587ff646
993d10a2
Changes
15
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
1247 additions
and
55 deletions
+1247
-55
vp9/decoder/vp9_decodeframe.c
vp9/decoder/vp9_decodeframe.c
+80
-1
vp9/encoder/vp9_aq_variance.c
vp9/encoder/vp9_aq_variance.c
+29
-0
vp9/encoder/vp9_bitstream.c
vp9/encoder/vp9_bitstream.c
+15
-3
vp9/encoder/vp9_encodeframe.c
vp9/encoder/vp9_encodeframe.c
+129
-9
vp9/encoder/vp9_encodemb.c
vp9/encoder/vp9_encodemb.c
+322
-7
vp9/encoder/vp9_extend.c
vp9/encoder/vp9_extend.c
+66
-0
vp9/encoder/vp9_firstpass.c
vp9/encoder/vp9_firstpass.c
+113
-6
vp9/encoder/vp9_mcomp.c
vp9/encoder/vp9_mcomp.c
+47
-10
vp9/encoder/vp9_picklpf.c
vp9/encoder/vp9_picklpf.c
+27
-0
vp9/encoder/vp9_pickmode.c
vp9/encoder/vp9_pickmode.c
+70
-6
vp9/encoder/vp9_rd.c
vp9/encoder/vp9_rd.c
+24
-3
vp9/encoder/vp9_rd.h
vp9/encoder/vp9_rd.h
+4
-0
vp9/encoder/vp9_rdopt.c
vp9/encoder/vp9_rdopt.c
+315
-9
vp9/encoder/vp9_rdopt.h
vp9/encoder/vp9_rdopt.h
+0
-1
vp9/encoder/vp9_tokenize.h
vp9/encoder/vp9_tokenize.h
+6
-0
No files found.
vp9/decoder/vp9_decodeframe.c
View file @
0b3560c7
...
...
@@ -196,6 +196,64 @@ static void inverse_transform_block(MACROBLOCKD* xd, int plane, int block,
if
(
eob
>
0
)
{
TX_TYPE
tx_type
=
DCT_DCT
;
tran_low_t
*
const
dqcoeff
=
BLOCK_OFFSET
(
pd
->
dqcoeff
,
block
);
#if CONFIG_VP9_HIGHBITDEPTH
if
(
xd
->
cur_buf
->
flags
&
YV12_FLAG_HIGHBITDEPTH
)
{
if
(
xd
->
lossless
)
{
tx_type
=
DCT_DCT
;
vp9_high_iwht4x4_add
(
dqcoeff
,
dst
,
stride
,
eob
,
xd
->
bd
);
}
else
{
const
PLANE_TYPE
plane_type
=
pd
->
plane_type
;
switch
(
tx_size
)
{
case
TX_4X4
:
tx_type
=
get_tx_type_4x4
(
plane_type
,
xd
,
block
);
vp9_high_iht4x4_add
(
tx_type
,
dqcoeff
,
dst
,
stride
,
eob
,
xd
->
bd
);
break
;
case
TX_8X8
:
tx_type
=
get_tx_type
(
plane_type
,
xd
);
vp9_high_iht8x8_add
(
tx_type
,
dqcoeff
,
dst
,
stride
,
eob
,
xd
->
bd
);
break
;
case
TX_16X16
:
tx_type
=
get_tx_type
(
plane_type
,
xd
);
vp9_high_iht16x16_add
(
tx_type
,
dqcoeff
,
dst
,
stride
,
eob
,
xd
->
bd
);
break
;
case
TX_32X32
:
tx_type
=
DCT_DCT
;
vp9_high_idct32x32_add
(
dqcoeff
,
dst
,
stride
,
eob
,
xd
->
bd
);
break
;
default:
assert
(
0
&&
"Invalid transform size"
);
}
}
}
else
{
if
(
xd
->
lossless
)
{
tx_type
=
DCT_DCT
;
vp9_iwht4x4_add
(
dqcoeff
,
dst
,
stride
,
eob
);
}
else
{
const
PLANE_TYPE
plane_type
=
pd
->
plane_type
;
switch
(
tx_size
)
{
case
TX_4X4
:
tx_type
=
get_tx_type_4x4
(
plane_type
,
xd
,
block
);
vp9_iht4x4_add
(
tx_type
,
dqcoeff
,
dst
,
stride
,
eob
);
break
;
case
TX_8X8
:
tx_type
=
get_tx_type
(
plane_type
,
xd
);
vp9_iht8x8_add
(
tx_type
,
dqcoeff
,
dst
,
stride
,
eob
);
break
;
case
TX_16X16
:
tx_type
=
get_tx_type
(
plane_type
,
xd
);
vp9_iht16x16_add
(
tx_type
,
dqcoeff
,
dst
,
stride
,
eob
);
break
;
case
TX_32X32
:
tx_type
=
DCT_DCT
;
vp9_idct32x32_add
(
dqcoeff
,
dst
,
stride
,
eob
);
break
;
default:
assert
(
0
&&
"Invalid transform size"
);
return
;
}
}
}
#else
if
(
xd
->
lossless
)
{
tx_type
=
DCT_DCT
;
vp9_iwht4x4_add
(
dqcoeff
,
dst
,
stride
,
eob
);
...
...
@@ -220,8 +278,10 @@ static void inverse_transform_block(MACROBLOCKD* xd, int plane, int block,
break
;
default:
assert
(
0
&&
"Invalid transform size"
);
return
;
}
}
#endif // CONFIG_VP9_HIGHBITDEPTH
if
(
eob
==
1
)
{
vpx_memset
(
dqcoeff
,
0
,
2
*
sizeof
(
dqcoeff
[
0
]));
...
...
@@ -599,6 +659,9 @@ static void setup_quantization(VP9_COMMON *const cm, MACROBLOCKD *const xd,
cm
->
y_dc_delta_q
==
0
&&
cm
->
uv_dc_delta_q
==
0
&&
cm
->
uv_ac_delta_q
==
0
;
#if CONFIG_VP9_HIGHBITDEPTH
xd
->
bd
=
(
int
)
cm
->
bit_depth
;
#endif
}
static
INTERP_FILTER
read_interp_filter
(
struct
vp9_read_bit_buffer
*
rb
)
{
...
...
@@ -1139,8 +1202,17 @@ BITSTREAM_PROFILE vp9_read_profile(struct vp9_read_bit_buffer *rb) {
static
void
read_bitdepth_colorspace_sampling
(
VP9_COMMON
*
cm
,
struct
vp9_read_bit_buffer
*
rb
)
{
if
(
cm
->
profile
>=
PROFILE_2
)
if
(
cm
->
profile
>=
PROFILE_2
)
{
cm
->
bit_depth
=
vp9_rb_read_bit
(
rb
)
?
VPX_BITS_12
:
VPX_BITS_10
;
#if CONFIG_VP9_HIGHBITDEPTH
cm
->
use_highbitdepth
=
1
;
#endif
}
else
{
cm
->
bit_depth
=
VPX_BITS_8
;
#if CONFIG_VP9_HIGHBITDEPTH
cm
->
use_highbitdepth
=
0
;
#endif
}
cm
->
color_space
=
(
COLOR_SPACE
)
vp9_rb_read_literal
(
rb
,
3
);
if
(
cm
->
color_space
!=
SRGB
)
{
vp9_rb_read_bit
(
rb
);
// [16,235] (including xvycc) vs [0,255] range
...
...
@@ -1244,6 +1316,10 @@ static size_t read_uncompressed_header(VP9Decoder *pbi,
// case (normative).
cm
->
color_space
=
BT_601
;
cm
->
subsampling_y
=
cm
->
subsampling_x
=
1
;
cm
->
bit_depth
=
VPX_BITS_8
;
#if CONFIG_VP9_HIGHBITDEPTH
cm
->
use_highbitdepth
=
0
;
#endif
}
pbi
->
refresh_frame_flags
=
vp9_rb_read_literal
(
rb
,
REF_FRAMES
);
...
...
@@ -1284,6 +1360,9 @@ static size_t read_uncompressed_header(VP9Decoder *pbi,
}
}
}
#if CONFIG_VP9_HIGHBITDEPTH
get_frame_new_buffer
(
cm
)
->
bit_depth
=
cm
->
bit_depth
;
#endif
if
(
pbi
->
need_resync
)
{
vpx_internal_error
(
&
cm
->
error
,
VPX_CODEC_CORRUPT_FRAME
,
...
...
vp9/encoder/vp9_aq_variance.c
View file @
0b3560c7
...
...
@@ -34,6 +34,9 @@ static int segment_id[MAX_SEGMENTS] = { 5, 3, 1, 0, 2, 4, 6, 7 };
#define SEGMENT_ID(i) segment_id[(i) - ENERGY_MIN]
DECLARE_ALIGNED
(
16
,
static
const
uint8_t
,
vp9_64_zeros
[
64
])
=
{
0
};
#if CONFIG_VP9_HIGHBITDEPTH
DECLARE_ALIGNED
(
16
,
static
const
uint16_t
,
vp9_highbd_64_zeros
[
64
])
=
{
0
};
#endif
unsigned
int
vp9_vaq_segment_id
(
int
energy
)
{
ENERGY_IN_BOUNDS
(
energy
);
...
...
@@ -126,14 +129,40 @@ static unsigned int block_variance(VP9_COMP *cpi, MACROBLOCK *x,
const
int
bw
=
8
*
num_8x8_blocks_wide_lookup
[
bs
]
-
right_overflow
;
const
int
bh
=
8
*
num_8x8_blocks_high_lookup
[
bs
]
-
bottom_overflow
;
int
avg
;
#if CONFIG_VP9_HIGHBITDEPTH
if
(
xd
->
cur_buf
->
flags
&
YV12_FLAG_HIGHBITDEPTH
)
{
high_variance
(
x
->
plane
[
0
].
src
.
buf
,
x
->
plane
[
0
].
src
.
stride
,
CONVERT_TO_BYTEPTR
(
vp9_highbd_64_zeros
),
0
,
bw
,
bh
,
&
sse
,
&
avg
);
sse
>>=
2
*
(
xd
->
bd
-
8
);
avg
>>=
(
xd
->
bd
-
8
);
}
else
{
variance
(
x
->
plane
[
0
].
src
.
buf
,
x
->
plane
[
0
].
src
.
stride
,
vp9_64_zeros
,
0
,
bw
,
bh
,
&
sse
,
&
avg
);
}
#else
variance
(
x
->
plane
[
0
].
src
.
buf
,
x
->
plane
[
0
].
src
.
stride
,
vp9_64_zeros
,
0
,
bw
,
bh
,
&
sse
,
&
avg
);
#endif // CONFIG_VP9_HIGHBITDEPTH
var
=
sse
-
(((
int64_t
)
avg
*
avg
)
/
(
bw
*
bh
));
return
(
256
*
var
)
/
(
bw
*
bh
);
}
else
{
#if CONFIG_VP9_HIGHBITDEPTH
if
(
xd
->
cur_buf
->
flags
&
YV12_FLAG_HIGHBITDEPTH
)
{
var
=
cpi
->
fn_ptr
[
bs
].
vf
(
x
->
plane
[
0
].
src
.
buf
,
x
->
plane
[
0
].
src
.
stride
,
CONVERT_TO_BYTEPTR
(
vp9_highbd_64_zeros
),
0
,
&
sse
);
}
else
{
var
=
cpi
->
fn_ptr
[
bs
].
vf
(
x
->
plane
[
0
].
src
.
buf
,
x
->
plane
[
0
].
src
.
stride
,
vp9_64_zeros
,
0
,
&
sse
);
}
#else
var
=
cpi
->
fn_ptr
[
bs
].
vf
(
x
->
plane
[
0
].
src
.
buf
,
x
->
plane
[
0
].
src
.
stride
,
vp9_64_zeros
,
0
,
&
sse
);
#endif // CONFIG_VP9_HIGHBITDEPTH
return
(
256
*
var
)
>>
num_pels_log2_lookup
[
bs
];
}
}
...
...
vp9/encoder/vp9_bitstream.c
View file @
0b3560c7
...
...
@@ -120,16 +120,28 @@ static void update_switchable_interp_probs(VP9_COMMON *cm, vp9_writer *w) {
}
static
void
pack_mb_tokens
(
vp9_writer
*
w
,
TOKENEXTRA
**
tp
,
const
TOKENEXTRA
*
const
stop
)
{
TOKENEXTRA
**
tp
,
const
TOKENEXTRA
*
const
stop
,
vpx_bit_depth_t
bit_depth
)
{
TOKENEXTRA
*
p
=
*
tp
;
while
(
p
<
stop
&&
p
->
token
!=
EOSB_TOKEN
)
{
const
int
t
=
p
->
token
;
const
struct
vp9_token
*
const
a
=
&
vp9_coef_encodings
[
t
];
const
vp9_extra_bit
*
const
b
=
&
vp9_extra_bits
[
t
];
int
i
=
0
;
int
v
=
a
->
value
;
int
n
=
a
->
len
;
#if CONFIG_VP9_HIGHBITDEPTH
const
vp9_extra_bit
*
b
;
if
(
bit_depth
==
VPX_BITS_12
)
b
=
&
vp9_extra_bits_high12
[
t
];
else
if
(
bit_depth
==
VPX_BITS_10
)
b
=
&
vp9_extra_bits_high10
[
t
];
else
b
=
&
vp9_extra_bits
[
t
];
#else
const
vp9_extra_bit
*
const
b
=
&
vp9_extra_bits
[
t
];
(
void
)
bit_depth
;
#endif // CONFIG_VP9_HIGHBITDEPTH
/* skip one or two nodes */
if
(
p
->
skip_eob_node
)
{
...
...
@@ -387,7 +399,7 @@ static void write_modes_b(VP9_COMP *cpi, const TileInfo *const tile,
}
assert
(
*
tok
<
tok_end
);
pack_mb_tokens
(
w
,
tok
,
tok_end
);
pack_mb_tokens
(
w
,
tok
,
tok_end
,
cm
->
bit_depth
);
}
static
void
write_partition
(
const
VP9_COMMON
*
const
cm
,
...
...
vp9/encoder/vp9_encodeframe.c
View file @
0b3560c7
...
...
@@ -61,16 +61,51 @@ static void encode_superblock(VP9_COMP *cpi, TOKENEXTRA **t, int output_enabled,
// Eventually this should be replaced by custom no-reference routines,
// which will be faster.
static
const
uint8_t
VP9_VAR_OFFS
[
64
]
=
{
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
};
#if CONFIG_VP9_HIGHBITDEPTH
static
const
uint16_t
VP9_HIGH_VAR_OFFS_8
[
64
]
=
{
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
,
128
};
static
const
uint16_t
VP9_HIGH_VAR_OFFS_10
[
64
]
=
{
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
,
128
*
4
};
static
const
uint16_t
VP9_HIGH_VAR_OFFS_12
[
64
]
=
{
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
,
128
*
16
};
#endif // CONFIG_VP9_HIGHBITDEPTH
static
unsigned
int
get_sby_perpixel_variance
(
VP9_COMP
*
cpi
,
const
struct
buf_2d
*
ref
,
BLOCK_SIZE
bs
)
{
...
...
@@ -80,6 +115,32 @@ static unsigned int get_sby_perpixel_variance(VP9_COMP *cpi,
return
ROUND_POWER_OF_TWO
(
var
,
num_pels_log2_lookup
[
bs
]);
}
#if CONFIG_VP9_HIGHBITDEPTH
static
unsigned
int
high_get_sby_perpixel_variance
(
VP9_COMP
*
cpi
,
const
struct
buf_2d
*
ref
,
BLOCK_SIZE
bs
,
int
bd
)
{
unsigned
int
var
,
sse
;
switch
(
bd
)
{
case
10
:
var
=
cpi
->
fn_ptr
[
bs
].
vf
(
ref
->
buf
,
ref
->
stride
,
CONVERT_TO_BYTEPTR
(
VP9_HIGH_VAR_OFFS_10
),
0
,
&
sse
);
break
;
case
12
:
var
=
cpi
->
fn_ptr
[
bs
].
vf
(
ref
->
buf
,
ref
->
stride
,
CONVERT_TO_BYTEPTR
(
VP9_HIGH_VAR_OFFS_12
),
0
,
&
sse
);
break
;
case
8
:
default:
var
=
cpi
->
fn_ptr
[
bs
].
vf
(
ref
->
buf
,
ref
->
stride
,
CONVERT_TO_BYTEPTR
(
VP9_HIGH_VAR_OFFS_8
),
0
,
&
sse
);
break
;
}
return
ROUND_POWER_OF_TWO
(
var
,
num_pels_log2_lookup
[
bs
]);
}
#endif // CONFIG_VP9_HIGHBITDEPTH
static
unsigned
int
get_sby_perpixel_diff_variance
(
VP9_COMP
*
cpi
,
const
struct
buf_2d
*
ref
,
int
mi_row
,
int
mi_col
,
...
...
@@ -419,6 +480,22 @@ static void choose_partitioning(VP9_COMP *cpi,
}
else
{
d
=
VP9_VAR_OFFS
;
dp
=
0
;
#if CONFIG_VP9_HIGHBITDEPTH
if
(
xd
->
cur_buf
->
flags
&
YV12_FLAG_HIGHBITDEPTH
)
{
switch
(
xd
->
bd
)
{
case
10
:
d
=
CONVERT_TO_BYTEPTR
(
VP9_HIGH_VAR_OFFS_10
);
break
;
case
12
:
d
=
CONVERT_TO_BYTEPTR
(
VP9_HIGH_VAR_OFFS_12
);
break
;
case
8
:
default:
d
=
CONVERT_TO_BYTEPTR
(
VP9_HIGH_VAR_OFFS_8
);
break
;
}
}
#endif // CONFIG_VP9_HIGHBITDEPTH
}
// Fill in the entire tree of 8x8 variances for splits.
...
...
@@ -734,7 +811,17 @@ static void rd_pick_sb_modes(VP9_COMP *cpi, const TileInfo *const tile,
// Set to zero to make sure we do not use the previous encoded frame stats
mbmi
->
skip
=
0
;
#if CONFIG_VP9_HIGHBITDEPTH
if
(
xd
->
cur_buf
->
flags
&
YV12_FLAG_HIGHBITDEPTH
)
{
x
->
source_variance
=
high_get_sby_perpixel_variance
(
cpi
,
&
x
->
plane
[
0
].
src
,
bsize
,
xd
->
bd
);
}
else
{
x
->
source_variance
=
get_sby_perpixel_variance
(
cpi
,
&
x
->
plane
[
0
].
src
,
bsize
);
}
#else
x
->
source_variance
=
get_sby_perpixel_variance
(
cpi
,
&
x
->
plane
[
0
].
src
,
bsize
);
#endif // CONFIG_VP9_HIGHBITDEPTH
// Save rdmult before it might be changed, so it can be restored later.
orig_rdmult
=
x
->
rdmult
;
...
...
@@ -3170,9 +3257,34 @@ static int set_var_thresh_from_histogram(VP9_COMP *cpi) {
for
(
i
=
0
;
i
<
cm
->
mb_rows
;
i
++
)
{
for
(
j
=
0
;
j
<
cm
->
mb_cols
;
j
++
)
{
#if CONFIG_VP9_HIGHBITDEPTH
if
(
cm
->
use_highbitdepth
)
{
switch
(
cm
->
bit_depth
)
{
case
VPX_BITS_8
:
vp9_high_get16x16var
(
src
,
src_stride
,
last_src
,
last_stride
,
&
var16
->
sse
,
&
var16
->
sum
);
break
;
case
VPX_BITS_10
:
vp9_high_10_get16x16var
(
src
,
src_stride
,
last_src
,
last_stride
,
&
var16
->
sse
,
&
var16
->
sum
);
break
;
case
VPX_BITS_12
:
vp9_high_12_get16x16var
(
src
,
src_stride
,
last_src
,
last_stride
,
&
var16
->
sse
,
&
var16
->
sum
);
break
;
default:
assert
(
0
&&
"cm->bit_depth should be VPX_BITS_8, VPX_BITS_10"
" or VPX_BITS_12"
);
return
-
1
;
}
}
else
{
vp9_get16x16var
(
src
,
src_stride
,
last_src
,
last_stride
,
&
var16
->
sse
,
&
var16
->
sum
);
}
#else
vp9_get16x16var
(
src
,
src_stride
,
last_src
,
last_stride
,
&
var16
->
sse
,
&
var16
->
sum
);
#endif // CONFIG_VP9_HIGHBITDEPTH
var16
->
var
=
var16
->
sse
-
(((
uint32_t
)
var16
->
sum
*
var16
->
sum
)
>>
8
);
...
...
@@ -3314,7 +3426,15 @@ static void encode_frame_internal(VP9_COMP *cpi) {
cm
->
tx_mode
=
select_tx_mode
(
cpi
);
#if CONFIG_VP9_HIGHBITDEPTH
if
(
cm
->
use_highbitdepth
)
x
->
fwd_txm4x4
=
xd
->
lossless
?
vp9_fwht4x4
:
vp9_fdct4x4
;
else
x
->
fwd_txm4x4
=
xd
->
lossless
?
vp9_high_fwht4x4
:
vp9_high_fdct4x4
;
x
->
high_itxm_add
=
xd
->
lossless
?
vp9_high_iwht4x4_add
:
vp9_high_idct4x4_add
;
#else
x
->
fwd_txm4x4
=
xd
->
lossless
?
vp9_fwht4x4
:
vp9_fdct4x4
;
#endif // CONFIG_VP9_HIGHBITDEPTH
x
->
itxm_add
=
xd
->
lossless
?
vp9_iwht4x4_add
:
vp9_idct4x4_add
;
if
(
xd
->
lossless
)
{
...
...
vp9/encoder/vp9_encodemb.c
View file @
0b3560c7
...
...
@@ -51,6 +51,29 @@ void vp9_subtract_block_c(int rows, int cols,
}
}
#if CONFIG_VP9_HIGHBITDEPTH
void
vp9_high_subtract_block_c
(
int
rows
,
int
cols
,
int16_t
*
diff
,
ptrdiff_t
diff_stride
,
const
uint8_t
*
src8
,
ptrdiff_t
src_stride
,
const
uint8_t
*
pred8
,
ptrdiff_t
pred_stride
,
int
bd
)
{
int
r
,
c
;
uint16_t
*
src
=
CONVERT_TO_SHORTPTR
(
src8
);
uint16_t
*
pred
=
CONVERT_TO_SHORTPTR
(
pred8
);
(
void
)
bd
;
for
(
r
=
0
;
r
<
rows
;
r
++
)
{
for
(
c
=
0
;
c
<
cols
;
c
++
)
{
diff
[
c
]
=
src
[
c
]
-
pred
[
c
];
}
diff
+=
diff_stride
;
pred
+=
pred_stride
;
src
+=
src_stride
;
}
}
#endif // CONFIG_VP9_HIGHBITDEPTH
void
vp9_subtract_plane
(
MACROBLOCK
*
x
,
BLOCK_SIZE
bsize
,
int
plane
)
{
struct
macroblock_plane
*
const
p
=
&
x
->
plane
[
plane
];
const
struct
macroblockd_plane
*
const
pd
=
&
x
->
e_mbd
.
plane
[
plane
];
...
...
@@ -58,6 +81,13 @@ void vp9_subtract_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane) {
const
int
bw
=
4
*
num_4x4_blocks_wide_lookup
[
plane_bsize
];
const
int
bh
=
4
*
num_4x4_blocks_high_lookup
[
plane_bsize
];
#if CONFIG_VP9_HIGHBITDEPTH
if
(
x
->
e_mbd
.
cur_buf
->
flags
&
YV12_FLAG_HIGHBITDEPTH
)
{
vp9_high_subtract_block
(
bh
,
bw
,
p
->
src_diff
,
bw
,
p
->
src
.
buf
,
p
->
src
.
stride
,
pd
->
dst
.
buf
,
pd
->
dst
.
stride
,
x
->
e_mbd
.
bd
);
return
;
}
#endif // CONFIG_VP9_HIGHBITDEPTH
vp9_subtract_block
(
bh
,
bw
,
p
->
src_diff
,
bw
,
p
->
src
.
buf
,
p
->
src
.
stride
,
pd
->
dst
.
buf
,
pd
->
dst
.
stride
);
}
...
...
@@ -124,6 +154,8 @@ static int optimize_b(MACROBLOCK *mb, int plane, int block,
int64_t
rd_cost0
,
rd_cost1
;
int
rate0
,
rate1
,
error0
,
error1
,
t0
,
t1
;
int
best
,
band
,
pt
,
i
,
final_eob
;
const
TOKENVALUE
*
dct_value_tokens
;
const
int16_t
*
dct_value_cost
;
assert
((
!
type
&&
!
plane
)
||
(
type
&&
plane
));
assert
(
eob
<=
default_eob
);
...
...
@@ -140,9 +172,24 @@ static int optimize_b(MACROBLOCK *mb, int plane, int block,
tokens
[
eob
][
0
].
qc
=
0
;
tokens
[
eob
][
1
]
=
tokens
[
eob
][
0
];
#if CONFIG_VP9_HIGHBITDEPTH
if
(
xd
->
bd
==
12
)
{
dct_value_tokens
=
vp9_dct_value_tokens_high12_ptr
;
dct_value_cost
=
vp9_dct_value_cost_high12_ptr
;
}
else
if
(
xd
->
bd
==
10
)
{
dct_value_tokens
=
vp9_dct_value_tokens_high10_ptr
;
dct_value_cost
=
vp9_dct_value_cost_high10_ptr
;
}
else
{
dct_value_tokens
=
vp9_dct_value_tokens_ptr
;
dct_value_cost
=
vp9_dct_value_cost_ptr
;
}
#else
dct_value_tokens
=
vp9_dct_value_tokens_ptr
;
dct_value_cost
=
vp9_dct_value_cost_ptr
;
#endif
for
(
i
=
0
;
i
<
eob
;
i
++
)
token_cache
[
scan
[
i
]]
=
vp9_pt_energy_class
[
vp9_
dct_value_tokens
_ptr
[
qcoeff
[
scan
[
i
]]].
token
];
vp9_pt_energy_class
[
dct_value_tokens
[
qcoeff
[
scan
[
i
]]].
token
];
for
(
i
=
eob
;
i
--
>
0
;)
{
int
base_bits
,
d2
,
dx
;
...
...
@@ -156,7 +203,7 @@ static int optimize_b(MACROBLOCK *mb, int plane, int block,
/* Evaluate the first possibility for this state. */
rate0
=
tokens
[
next
][
0
].
rate
;
rate1
=
tokens
[
next
][
1
].
rate
;
t0
=
(
vp9_
dct_value_tokens
_ptr
+
x
)
->
token
;
t0
=
(
dct_value_tokens
+
x
)
->
token
;
/* Consider both possible successor states. */
if
(
next
<
default_eob
)
{
band
=
band_translate
[
i
+
1
];
...
...
@@ -169,8 +216,13 @@ static int optimize_b(MACROBLOCK *mb, int plane, int block,
UPDATE_RD_COST
();
/* And pick the best. */
best
=
rd_cost1
<
rd_cost0
;
base_bits
=
vp9_
dct_value_cost
_ptr
[
x
];
base_bits
=
dct_value_cost
[
x
];
dx
=
mul
*
(
dqcoeff
[
rc
]
-
coeff
[
rc
]);
#if CONFIG_VP9_HIGHBITDEPTH
if
(
xd
->
cur_buf
->
flags
&
YV12_FLAG_HIGHBITDEPTH
)
{
dx
>>=
xd
->
bd
-
8
;
}
#endif // CONFIG_VP9_HIGHBITDEPTH
d2
=
dx
*
dx
;
tokens
[
i
][
0
].
rate
=
base_bits
+
(
best
?
rate1
:
rate0
);
tokens
[
i
][
0
].
error
=
d2
+
(
best
?
error1
:
error0
);
...
...
@@ -203,7 +255,7 @@ static int optimize_b(MACROBLOCK *mb, int plane, int block,
t0
=
tokens
[
next
][
0
].
token
==
EOB_TOKEN
?
EOB_TOKEN
:
ZERO_TOKEN
;
t1
=
tokens
[
next
][
1
].
token
==
EOB_TOKEN
?
EOB_TOKEN
:
ZERO_TOKEN
;
}
else
{
t0
=
t1
=
(
vp9_
dct_value_tokens
_ptr
+
x
)
->
token
;
t0
=
t1
=
(
dct_value_tokens
+
x
)
->
token
;
}
if
(
next
<
default_eob
)
{
band
=
band_translate
[
i
+
1
];
...
...
@@ -222,10 +274,19 @@ static int optimize_b(MACROBLOCK *mb, int plane, int block,
UPDATE_RD_COST
();
/* And pick the best. */
best
=
rd_cost1
<
rd_cost0
;
base_bits
=
vp9_
dct_value_cost
_ptr
[
x
];
base_bits
=
dct_value_cost
[
x
];
if
(
shortcut
)
{
dx
-=
(
dequant_ptr
[
rc
!=
0
]
+
sz
)
^
sz
;
#if CONFIG_VP9_HIGHBITDEPTH
if
(
xd
->
cur_buf
->
flags
&
YV12_FLAG_HIGHBITDEPTH
)
{
dx
-=
((
dequant_ptr
[
rc
!=
0
]
>>
(
xd
->
bd
-
8
))
+
sz
)
^
sz
;
}
else
{
dx
-=
(
dequant_ptr
[
rc
!=
0
]
+
sz
)
^
sz
;
}
#else
dx
-=
(
dequant_ptr
[
rc
!=
0
]
+
sz
)
^
sz
;
#endif // CONFIG_VP9_HIGHBITDEPTH
d2
=
dx
*
dx
;
}
tokens
[
i
][
1
].
rate
=
base_bits
+
(
best
?
rate1
:
rate0
);
...
...
@@ -310,7 +371,7 @@ static INLINE void high_fdct32x32(int rd_transform, const int16_t *src,
else
vp9_high_fdct32x32
(
src
,
dst
,
src_stride
);
}
#endif
#endif
// CONFIG_VP9_HIGHBITDEPTH
void
vp9_xform_quant_fp
(
MACROBLOCK
*
x
,
int
plane
,
int
block
,
BLOCK_SIZE
plane_bsize
,
TX_SIZE
tx_size
)
{
...
...
@@ -328,6 +389,44 @@ void vp9_xform_quant_fp(MACROBLOCK *x, int plane, int block,
txfrm_block_to_raster_xy
(
plane_bsize
,
tx_size
,
block
,
&
i
,
&
j
);
src_diff
=
&
p
->
src_diff
[
4
*
(
j
*
diff_stride
+
i
)];
#if CONFIG_VP9_HIGHBITDEPTH
if
(
xd
->
cur_buf
->
flags
&
YV12_FLAG_HIGHBITDEPTH
)
{
switch
(
tx_size
)
{
case
TX_32X32
:
high_fdct32x32
(
x
->
use_lp32x32fdct
,
src_diff
,
coeff
,
diff_stride
);
vp9_high_quantize_fp_32x32
(
coeff
,
1024
,
x
->
skip_block
,
p
->
zbin
,
p
->
round_fp
,
p
->
quant_fp
,
p
->
quant_shift
,
qcoeff
,
dqcoeff
,
pd
->
dequant
,
p
->
zbin_extra
,
eob
,
scan_order
->
scan
,
scan_order
->
iscan
);
break
;
case
TX_16X16
:
vp9_high_fdct16x16
(
src_diff
,
coeff
,
diff_stride
);
vp9_high_quantize_fp
(
coeff
,
256
,
x
->
skip_block
,
p
->
zbin
,
p
->
round_fp
,
p
->
quant_fp
,
p
->
quant_shift
,
qcoeff
,
dqcoeff
,
pd
->
dequant
,
p
->
zbin_extra
,
eob
,
scan_order
->
scan
,
scan_order
->
iscan
);
break
;
case
TX_8X8
:
vp9_high_fdct8x8
(
src_diff
,
coeff
,
diff_stride
);
vp9_high_quantize_fp
(
coeff
,
64
,
x
->
skip_block
,
p
->
zbin
,
p
->
round_fp
,
p
->
quant_fp
,
p
->
quant_shift
,
qcoeff
,
dqcoeff
,
pd
->
dequant
,
p
->
zbin_extra
,
eob
,
scan_order
->
scan
,
scan_order
->
iscan
);
break
;
case
TX_4X4
:
x
->
fwd_txm4x4
(
src_diff
,
coeff
,
diff_stride
);
vp9_high_quantize_fp
(
coeff
,
16
,
x
->
skip_block
,
p
->
zbin
,
p
->
round_fp
,
p
->
quant_fp
,
p
->
quant_shift
,
qcoeff
,
dqcoeff
,
pd
->
dequant
,
p
->
zbin_extra
,
eob
,
scan_order
->
scan
,
scan_order
->
iscan
);
break
;
default:
assert
(
0
);
}
return
;
}
#endif // CONFIG_VP9_HIGHBITDEPTH
switch
(
tx_size
)
{
case
TX_32X32
:
fdct32x32
(
x
->
use_lp32x32fdct
,
src_diff
,
coeff
,
diff_stride
);
...
...
@@ -379,6 +478,40 @@ void vp9_xform_quant_dc(MACROBLOCK *x, int plane, int block,
txfrm_block_to_raster_xy
(
plane_bsize
,
tx_size
,
block
,
&
i
,
&
j
);
src_diff
=
&
p
->
src_diff
[
4
*
(
j
*
diff_stride
+
i
)];
#if CONFIG_VP9_HIGHBITDEPTH
if
(
xd
->
cur_buf
->
flags
&
YV12_FLAG_HIGHBITDEPTH
)
{
switch
(
tx_size
)
{
case
TX_32X32
:
vp9_high_fdct32x32_1
(
src_diff
,
coeff
,
diff_stride
);