summaryrefslogtreecommitdiff
path: root/libavcodec/huffyuvdec.c
diff options
context:
space:
mode:
authorChristophe Gisquet <christophe.gisquet@gmail.com>2014-06-04 20:48:57 +0000
committerMichael Niedermayer <michaelni@gmx.at>2014-06-05 00:08:57 +0200
commita37020402a4c0c1f375bb7323ed5f79c2c75c538 (patch)
tree081fd065e8fe255203ebedd9e4a340fb6f6763c7 /libavcodec/huffyuvdec.c
parent35dae6220426cb9adeafda6d38598c3130984593 (diff)
huffyuvdec: trick for plane decoding, 8bits
10496 -> 9105 cycles. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/huffyuvdec.c')
-rw-r--r--libavcodec/huffyuvdec.c18
1 files changed, 8 insertions, 10 deletions
diff --git a/libavcodec/huffyuvdec.c b/libavcodec/huffyuvdec.c
index 4c0d29773f..01c01ce00b 100644
--- a/libavcodec/huffyuvdec.c
+++ b/libavcodec/huffyuvdec.c
@@ -637,16 +637,12 @@ static void decode_422_bitstream(HYuvContext *s, int count)
/* TODO instead of restarting the read when the code isn't in the first level
* of the joint table, jump into the 2nd level of the individual table. */
-#define READ_2PIX_PLANE(dst0, dst1, plane){\
- uint16_t code = get_vlc2(&s->gb, s->vlc[4+plane].table, VLC_BITS, 1);\
- if(code != 0xffff){\
- dst0 = code>>8;\
- dst1 = code;\
- }else{\
- dst0 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3);\
- dst1 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3);\
- }\
-}
+#define READ_2PIX_PLANE(dst0, dst1, plane) \
+ UPDATE_CACHE(re, &s->gb); \
+ GET_VLC_DUAL(dst0, dst1, re, &s->gb, s->vlc[4+plane].table, \
+ s->vlc[plane].table, s->vlc[plane].table, \
+ VLC_BITS, 3, 0xffff)
+
#define READ_2PIX_PLANE14(dst0, dst1, plane){\
int16_t code = get_vlc2(&s->gb, s->vlc[4+plane].table, VLC_BITS, 1);\
if(code != (int16_t)0xffff){\
@@ -671,6 +667,7 @@ static void decode_plane_bitstream(HYuvContext *s, int count, int plane)
count/=2;
if (s->bps <= 8) {
+ OPEN_READER(re, &s->gb);
if (count >= (get_bits_left(&s->gb)) / (31 * 2)) {
for (i = 0; i < count && get_bits_left(&s->gb) > 0; i++) {
READ_2PIX_PLANE(s->temp[0][2 * i], s->temp[0][2 * i + 1], plane);
@@ -680,6 +677,7 @@ static void decode_plane_bitstream(HYuvContext *s, int count, int plane)
READ_2PIX_PLANE(s->temp[0][2 * i], s->temp[0][2 * i + 1], plane);
}
}
+ CLOSE_READER(re, &s->gb);
} else if (s->bps <= 14) {
if (count >= (get_bits_left(&s->gb)) / (31 * 2)) {
for (i = 0; i < count && get_bits_left(&s->gb) > 0; i++) {