Re: [libav-devel] [PATCH] dv: Convert to the new bitreader

2017-02-09 Thread Luca Barbato
On 09/02/2017 17:42, Diego Biurrun wrote:
> I guess the size variables should have size_t type ;-p

As you like.
___
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Re: [libav-devel] [PATCH] dv: Convert to the new bitreader

2017-02-09 Thread Diego Biurrun
On Thu, Feb 09, 2017 at 05:41:21PM +0100, Diego Biurrun wrote:
> --- a/libavcodec/bitstream.h
> +++ b/libavcodec/bitstream.h
> @@ -384,4 +384,32 @@ static inline int bitstream_apply_sign(BitstreamContext 
> *bc, int val)
>  
> +static inline void bitstream_unget(BitstreamContext *bc, uint64_t value, int 
> size)
> +{
> +int cache_size = sizeof(bc->bits) * 8;

I guess the size variables should have size_t type ;-p

Diego
___
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

[libav-devel] [PATCH] dv: Convert to the new bitreader

2017-02-09 Thread Diego Biurrun
From: Luca Barbato 

---

Moved the bitstream_unwind() and bitstream_unget() functions to bitstream.h
as requested by Anton.

 libavcodec/bitstream.h | 28 +++
 libavcodec/dvdec.c | 94 ++
 2 files changed, 69 insertions(+), 53 deletions(-)

diff --git a/libavcodec/bitstream.h b/libavcodec/bitstream.h
index 996e32e..f75a35c 100644
--- a/libavcodec/bitstream.h
+++ b/libavcodec/bitstream.h
@@ -384,4 +384,32 @@ static inline int bitstream_apply_sign(BitstreamContext 
*bc, int val)
 return (val ^ sign) - sign;
 }
 
+/* Unwind the cache so a refill_32 can fill it again. */
+static inline void bitstream_unwind(BitstreamContext *bc)
+{
+int unwind = 4;
+int unwind_bits = unwind * 8;
+
+if (bc->bits_left < unwind_bits)
+return;
+
+bc->bits  >>= unwind_bits;
+bc->bits  <<= unwind_bits;
+bc->bits_left  -= unwind_bits;
+bc->ptr-= unwind;
+}
+
+/* Unget up to 32 bits. */
+static inline void bitstream_unget(BitstreamContext *bc, uint64_t value, int 
size)
+{
+int cache_size = sizeof(bc->bits) * 8;
+
+if (bc->bits_left + size > cache_size)
+bitstream_unwind(bc);
+
+bc->bits = (bc->bits >> size) | (value << (cache_size - size));
+
+bc->bits_left += size;
+}
+
 #endif /* AVCODEC_BITSTREAM_H */
diff --git a/libavcodec/dvdec.c b/libavcodec/dvdec.c
index dc37a5e..a2f0171 100644
--- a/libavcodec/dvdec.c
+++ b/libavcodec/dvdec.c
@@ -40,9 +40,9 @@
 #include "libavutil/pixdesc.h"
 
 #include "avcodec.h"
+#include "bitstream.h"
 #include "dv.h"
 #include "dvdata.h"
-#include "get_bits.h"
 #include "idctdsp.h"
 #include "internal.h"
 #include "put_bits.h"
@@ -80,51 +80,34 @@ static av_cold int dvvideo_decode_init(AVCodecContext 
*avctx)
 }
 
 /* decode AC coefficients */
-static void dv_decode_ac(GetBitContext *gb, BlockInfo *mb, int16_t *block)
+static void dv_decode_ac(BitstreamContext *bc, BlockInfo *mb, int16_t *block)
 {
-int last_index = gb->size_in_bits;
 const uint8_t  *scan_table   = mb->scan_table;
 const uint32_t *factor_table = mb->factor_table;
 int pos  = mb->pos;
 int partial_bit_count= mb->partial_bit_count;
-int level, run, vlc_len, index;
-
-OPEN_READER_NOSIZE(re, gb);
-UPDATE_CACHE(re, gb);
+int level, run;
 
 /* if we must parse a partial VLC, we do it here */
 if (partial_bit_count > 0) {
-re_cache  = re_cache >> partial_bit_count |
-mb->partial_bit_buffer;
-re_index -= partial_bit_count;
+bitstream_unget(bc, mb->partial_bit_buffer, partial_bit_count);
 mb->partial_bit_count = 0;
 }
 
 /* get the AC coefficients until last_index is reached */
 for (;;) {
-ff_dlog(NULL, "%2d: bits=%04x index=%u\n", pos, SHOW_UBITS(re, gb, 16),
-re_index);
-/* our own optimized GET_RL_VLC */
-index   = NEG_USR32(re_cache, TEX_VLC_BITS);
-vlc_len = ff_dv_rl_vlc[index].len;
-if (vlc_len < 0) {
-index = NEG_USR32((unsigned) re_cache << TEX_VLC_BITS, -vlc_len) +
-ff_dv_rl_vlc[index].level;
-vlc_len = TEX_VLC_BITS - vlc_len;
-}
-level = ff_dv_rl_vlc[index].level;
-run   = ff_dv_rl_vlc[index].run;
-
-/* gotta check if we're still within gb boundaries */
-if (re_index + vlc_len > last_index) {
-/* should be < 16 bits otherwise a codeword could have been parsed 
*/
-mb->partial_bit_count  = last_index - re_index;
-mb->partial_bit_buffer = re_cache & ~(-1u >> 
mb->partial_bit_count);
-re_index   = last_index;
+BitstreamContext tmp = *bc;
+
+ff_dlog(NULL, "%2d: bits=%04x index=%d\n",
+pos, bitstream_peek(bc, 16), bitstream_tell(bc));
+
+BITSTREAM_RL_VLC(level, run, bc, ff_dv_rl_vlc, TEX_VLC_BITS, 2);
+
+if (bitstream_bits_left(bc) < 0) {
+mb->partial_bit_count  = bitstream_bits_left();
+mb->partial_bit_buffer = bitstream_peek(, 
mb->partial_bit_count);
 break;
 }
-re_index += vlc_len;
-
 ff_dlog(NULL, "run=%d level=%d\n", run, level);
 pos += run;
 if (pos >= 64)
@@ -133,22 +116,22 @@ static void dv_decode_ac(GetBitContext *gb, BlockInfo 
*mb, int16_t *block)
 level = (level * factor_table[pos] + (1 << (dv_iweight_bits - 1))) >>
 dv_iweight_bits;
 block[scan_table[pos]] = level;
-
-UPDATE_CACHE(re, gb);
 }
-CLOSE_READER(re, gb);
 mb->pos = pos;
 }
 
-static inline void bit_copy(PutBitContext *pb, GetBitContext *gb)
+static inline void bit_copy(PutBitContext *pb, BitstreamContext *bc)
 {
-int bits_left = get_bits_left(gb);
-while (bits_left >= MIN_CACHE_BITS) {
-put_bits(pb, MIN_CACHE_BITS, get_bits(gb, MIN_CACHE_BITS));
-