Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
A
aom-rav1e
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Packages & Registries
Packages & Registries
Container Registry
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Xiph.Org
aom-rav1e
Commits
993d10a2
Commit
993d10a2
authored
Sep 24, 2014
by
Deb Mukherjee
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Adds various high bit-depth encode functions
Change-Id: I6f67b171022bbc8199c6d674190b57f6bab1b62f
parent
6989e81d
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 @
993d10a2
...
...
@@ -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 @
993d10a2
...
...
@@ -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 @
993d10a2
...
...
@@ -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 @
993d10a2
...
...
@@ -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 @
993d10a2
...
...
@@ -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
);
vp9_high_quantize_dc_32x32
(
coeff
,
x
->
skip_block
,
p
->
round
,