Skip to content
GitLab
Explore
Projects
Groups
Topics
Snippets
Projects
Groups
Topics
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
BC
public
external
libvpx
Commits
4f506358
Commit
4f506358
authored
10 years ago
by
Dmitry Kovalev
Committed by
Gerrit Code Review
10 years ago
Browse files
Options
Download
Plain Diff
Merge "Speeding up decode_coeffs()."
parents
5cd0aab8
adaec4d0
v1.14.0-linphone
1.4.X
feature/update_to_v1.9.0-linphone
feature/uwp_nuget
highbitdepth
indianrunnerduck
javanwhistlingduck
khakicampbell
linphone
linphone-android
linphone-old
longtailedduck
m49-2623
m52-2743
m54-2840
m56-2924
m66-3359
m68-3440
mandarinduck
nextgen
nextgenv2
sandbox/Jingning/experimental
sandbox/Jingning/vpx
sandbox/aconverse@google.com/ansbench
sandbox/hkuang@google.com/decode
sandbox/jimbankoski@google.com/proposed-aom
sandbox/jingning@google.com/decoder_test_suite
sandbox/jingning@google.com/experimental
sandbox/jzern@google.com/test
sandbox/wangch@google.com/vp9
sandbox/yaowu@google.com/mergeaom
v1.12.0-linphone
v1.6.1_linphone
v1.7.0-linphone
v1.9.0-linphone
v1.9.0
v1.9.0-rc1
v1.8.2
v1.8.1
v1.8.0
v1.7.0
v1.6.1
v1.6.0
v1.5.0
v1.4.0
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
vp9/decoder/vp9_detokenize.c
+59
-91
vp9/decoder/vp9_detokenize.c
with
59 additions
and
91 deletions
vp9/decoder/vp9_detokenize.c
+
59
−
91
View file @
4f506358
...
...
@@ -13,6 +13,7 @@
#include
"vp9/common/vp9_blockd.h"
#include
"vp9/common/vp9_common.h"
#include
"vp9/common/vp9_entropy.h"
#include
"vp9/decoder/vp9_detokenize.h"
...
...
@@ -31,29 +32,31 @@
#define INCREMENT_COUNT(token) \
do { \
if (!cm->frame_parallel_decoding_mode) \
++coef_counts[band][ctx][token]; \
++coef_counts[band][ctx][token];
\
} while (0)
#define WRITE_COEF_CONTINUE(val, token) \
{ \
v = (val * dqv) >> dq_shift; \
dqcoeff[scan[c]] = vp9_read_bit(r) ? -v : v; \
token_cache[scan[c]] = vp9_pt_energy_class[token]; \
++c; \
ctx = get_coef_context(nb, token_cache, c); \
dqv = dq[1]; \
continue; \
}
static
INLINE
int
read_coeff
(
const
vp9_prob
*
probs
,
int
n
,
vp9_reader
*
r
)
{
int
i
,
val
=
0
;
for
(
i
=
0
;
i
<
n
;
++
i
)
val
=
(
val
<<
1
)
|
vp9_read
(
r
,
probs
[
i
]);
return
val
;
}
#define ADJUST_COEF(prob, bits_count) \
do { \
val += (vp9_read(r, prob) << bits_count); \
} while (0)
static
const
vp9_tree_index
coeff_subtree_high
[
TREE_SIZE
(
ENTROPY_TOKENS
)]
=
{
2
,
6
,
/* 0 = LOW_VAL */
-
TWO_TOKEN
,
4
,
/* 1 = TWO */
-
THREE_TOKEN
,
-
FOUR_TOKEN
,
/* 2 = THREE */
8
,
10
,
/* 3 = HIGH_LOW */
-
CATEGORY1_TOKEN
,
-
CATEGORY2_TOKEN
,
/* 4 = CAT_ONE */
12
,
14
,
/* 5 = CAT_THREEFOUR */
-
CATEGORY3_TOKEN
,
-
CATEGORY4_TOKEN
,
/* 6 = CAT_THREE */
-
CATEGORY5_TOKEN
,
-
CATEGORY6_TOKEN
/* 7 = CAT_FIVE */
};
static
int
decode_coefs
(
VP9_COMMON
*
cm
,
const
MACROBLOCKD
*
xd
,
PLANE_TYPE
type
,
tran_low_t
*
dqcoeff
,
TX_SIZE
tx_size
,
const
int16_t
*
dq
,
int
ctx
,
const
int16_t
*
scan
,
const
int16_t
*
nb
,
vp9_reader
*
r
)
{
tran_low_t
*
dqcoeff
,
TX_SIZE
tx_size
,
const
int16_t
*
dq
,
int
ctx
,
const
int16_t
*
scan
,
const
int16_t
*
nb
,
vp9_reader
*
r
)
{
const
int
max_eob
=
16
<<
(
tx_size
<<
1
);
const
FRAME_CONTEXT
*
const
fc
=
&
cm
->
fc
;
FRAME_COUNTS
*
const
counts
=
&
cm
->
counts
;
...
...
@@ -69,11 +72,11 @@ static int decode_coefs(VP9_COMMON *cm, const MACROBLOCKD *xd, PLANE_TYPE type,
uint8_t
token_cache
[
32
*
32
];
const
uint8_t
*
band_translate
=
get_band_translate
(
tx_size
);
const
int
dq_shift
=
(
tx_size
==
TX_32X32
);
int
v
;
int
v
,
token
;
int16_t
dqv
=
dq
[
0
];
while
(
c
<
max_eob
)
{
int
val
;
int
val
=
-
1
;
band
=
*
band_translate
++
;
prob
=
coef_probs
[
band
][
ctx
];
if
(
!
cm
->
frame_parallel_decoding_mode
)
...
...
@@ -95,81 +98,46 @@ static int decode_coefs(VP9_COMMON *cm, const MACROBLOCKD *xd, PLANE_TYPE type,
prob
=
coef_probs
[
band
][
ctx
];
}
// ONE_CONTEXT_NODE_0_
if
(
!
vp9_read
(
r
,
prob
[
ONE_CONTEXT_NODE
]))
{
INCREMENT_COUNT
(
ONE_TOKEN
);
WRITE_COEF_CONTINUE
(
1
,
ONE_TOKEN
);
}
INCREMENT_COUNT
(
TWO_TOKEN
);
prob
=
vp9_pareto8_full
[
prob
[
PIVOT_NODE
]
-
1
];
if
(
!
vp9_read
(
r
,
prob
[
LOW_VAL_CONTEXT_NODE
]))
{
if
(
!
vp9_read
(
r
,
prob
[
TWO_CONTEXT_NODE
]))
{
WRITE_COEF_CONTINUE
(
2
,
TWO_TOKEN
);
token
=
ONE_TOKEN
;
val
=
1
;
}
else
{
INCREMENT_COUNT
(
TWO_TOKEN
);
token
=
vp9_read_tree
(
r
,
coeff_subtree_high
,
vp9_pareto8_full
[
prob
[
PIVOT_NODE
]
-
1
]);
switch
(
token
)
{
case
TWO_TOKEN
:
case
THREE_TOKEN
:
case
FOUR_TOKEN
:
val
=
token
;
break
;
case
CATEGORY1_TOKEN
:
val
=
CAT1_MIN_VAL
+
read_coeff
(
vp9_cat1_prob
,
1
,
r
);
break
;
case
CATEGORY2_TOKEN
:
val
=
CAT2_MIN_VAL
+
read_coeff
(
vp9_cat2_prob
,
2
,
r
);
break
;
case
CATEGORY3_TOKEN
:
val
=
CAT3_MIN_VAL
+
read_coeff
(
vp9_cat3_prob
,
3
,
r
);
break
;
case
CATEGORY4_TOKEN
:
val
=
CAT4_MIN_VAL
+
read_coeff
(
vp9_cat4_prob
,
4
,
r
);
break
;
case
CATEGORY5_TOKEN
:
val
=
CAT5_MIN_VAL
+
read_coeff
(
vp9_cat5_prob
,
5
,
r
);
break
;
case
CATEGORY6_TOKEN
:
val
=
CAT6_MIN_VAL
+
read_coeff
(
vp9_cat6_prob
,
14
,
r
);
break
;
}
if
(
!
vp9_read
(
r
,
prob
[
THREE_CONTEXT_NODE
]))
{
WRITE_COEF_CONTINUE
(
3
,
THREE_TOKEN
);
}
WRITE_COEF_CONTINUE
(
4
,
FOUR_TOKEN
);
}
if
(
!
vp9_read
(
r
,
prob
[
HIGH_LOW_CONTEXT_NODE
]))
{
if
(
!
vp9_read
(
r
,
prob
[
CAT_ONE_CONTEXT_NODE
]))
{
val
=
CAT1_MIN_VAL
;
ADJUST_COEF
(
vp9_cat1_prob
[
0
],
0
);
WRITE_COEF_CONTINUE
(
val
,
CATEGORY1_TOKEN
);
}
val
=
CAT2_MIN_VAL
;
ADJUST_COEF
(
vp9_cat2_prob
[
0
],
1
);
ADJUST_COEF
(
vp9_cat2_prob
[
1
],
0
);
WRITE_COEF_CONTINUE
(
val
,
CATEGORY2_TOKEN
);
}
if
(
!
vp9_read
(
r
,
prob
[
CAT_THREEFOUR_CONTEXT_NODE
]))
{
if
(
!
vp9_read
(
r
,
prob
[
CAT_THREE_CONTEXT_NODE
]))
{
val
=
CAT3_MIN_VAL
;
ADJUST_COEF
(
vp9_cat3_prob
[
0
],
2
);
ADJUST_COEF
(
vp9_cat3_prob
[
1
],
1
);
ADJUST_COEF
(
vp9_cat3_prob
[
2
],
0
);
WRITE_COEF_CONTINUE
(
val
,
CATEGORY3_TOKEN
);
}
val
=
CAT4_MIN_VAL
;
ADJUST_COEF
(
vp9_cat4_prob
[
0
],
3
);
ADJUST_COEF
(
vp9_cat4_prob
[
1
],
2
);
ADJUST_COEF
(
vp9_cat4_prob
[
2
],
1
);
ADJUST_COEF
(
vp9_cat4_prob
[
3
],
0
);
WRITE_COEF_CONTINUE
(
val
,
CATEGORY4_TOKEN
);
}
if
(
!
vp9_read
(
r
,
prob
[
CAT_FIVE_CONTEXT_NODE
]))
{
val
=
CAT5_MIN_VAL
;
ADJUST_COEF
(
vp9_cat5_prob
[
0
],
4
);
ADJUST_COEF
(
vp9_cat5_prob
[
1
],
3
);
ADJUST_COEF
(
vp9_cat5_prob
[
2
],
2
);
ADJUST_COEF
(
vp9_cat5_prob
[
3
],
1
);
ADJUST_COEF
(
vp9_cat5_prob
[
4
],
0
);
WRITE_COEF_CONTINUE
(
val
,
CATEGORY5_TOKEN
);
}
val
=
0
;
val
=
(
val
<<
1
)
|
vp9_read
(
r
,
vp9_cat6_prob
[
0
]);
val
=
(
val
<<
1
)
|
vp9_read
(
r
,
vp9_cat6_prob
[
1
]);
val
=
(
val
<<
1
)
|
vp9_read
(
r
,
vp9_cat6_prob
[
2
]);
val
=
(
val
<<
1
)
|
vp9_read
(
r
,
vp9_cat6_prob
[
3
]);
val
=
(
val
<<
1
)
|
vp9_read
(
r
,
vp9_cat6_prob
[
4
]);
val
=
(
val
<<
1
)
|
vp9_read
(
r
,
vp9_cat6_prob
[
5
]);
val
=
(
val
<<
1
)
|
vp9_read
(
r
,
vp9_cat6_prob
[
6
]);
val
=
(
val
<<
1
)
|
vp9_read
(
r
,
vp9_cat6_prob
[
7
]);
val
=
(
val
<<
1
)
|
vp9_read
(
r
,
vp9_cat6_prob
[
8
]);
val
=
(
val
<<
1
)
|
vp9_read
(
r
,
vp9_cat6_prob
[
9
]);
val
=
(
val
<<
1
)
|
vp9_read
(
r
,
vp9_cat6_prob
[
10
]);
val
=
(
val
<<
1
)
|
vp9_read
(
r
,
vp9_cat6_prob
[
11
]);
val
=
(
val
<<
1
)
|
vp9_read
(
r
,
vp9_cat6_prob
[
12
]);
val
=
(
val
<<
1
)
|
vp9_read
(
r
,
vp9_cat6_prob
[
13
]);
val
+=
CAT6_MIN_VAL
;
WRITE_COEF_CONTINUE
(
val
,
CATEGORY6_TOKEN
);
v
=
(
val
*
dqv
)
>>
dq_shift
;
dqcoeff
[
scan
[
c
]]
=
vp9_read_bit
(
r
)
?
-
v
:
v
;
token_cache
[
scan
[
c
]]
=
vp9_pt_energy_class
[
token
];
++
c
;
ctx
=
get_coef_context
(
nb
,
token_cache
,
c
);
dqv
=
dq
[
1
];
}
return
c
;
...
...
This diff is collapsed.
Click to expand it.
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment
Menu
Explore
Projects
Groups
Topics
Snippets