diff options
author | Christophe Gisquet <christophe.gisquet@gmail.com> | 2014-06-05 00:48:57 +0400 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-06-05 02:08:57 +0400 |
commit | a37020402a4c0c1f375bb7323ed5f79c2c75c538 (patch) | |
tree | 081fd065e8fe255203ebedd9e4a340fb6f6763c7 | |
parent | 35dae6220426cb9adeafda6d38598c3130984593 (diff) |
huffyuvdec: trick for plane decoding, 8bits
10496 -> 9105 cycles.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavcodec/huffyuvdec.c | 18 |
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++) { |