copy get_unary from vc1
authorAlex Beregszaszi <alex@rtfs.hu>
Wed, 8 Aug 2007 20:38:30 +0000 (20:38 +0000)
committerAlex Beregszaszi <alex@rtfs.hu>
Wed, 8 Aug 2007 20:38:30 +0000 (20:38 +0000)
Originally committed as revision 9994 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/bitstream.h

index c516c3c..d41d5ec 100644 (file)
@@ -969,4 +969,50 @@ static inline int decode012(GetBitContext *gb){
         return get_bits1(gb) + 1;
 }
 
+/**
+ * Get unary code of limited length
+ * @todo FIXME Slow and ugly
+ * @param gb GetBitContext
+ * @param[in] stop The bitstop value (unary code of 1's or 0's)
+ * @param[in] len Maximum length
+ * @return Unary length/index
+ */
+static int get_unary(GetBitContext *gb, int stop, int len)
+{
+#if 1
+    int i;
+
+    for(i = 0; i < len && get_bits1(gb) != stop; i++);
+    return i;
+/*  int i = 0, tmp = !stop;
+
+  while (i != len && tmp != stop)
+  {
+    tmp = get_bits(gb, 1);
+    i++;
+  }
+  if (i == len && tmp != stop) return len+1;
+  return i;*/
+#else
+  unsigned int buf;
+  int log;
+
+  OPEN_READER(re, gb);
+  UPDATE_CACHE(re, gb);
+  buf=GET_CACHE(re, gb); //Still not sure
+  if (stop) buf = ~buf;
+
+  log= av_log2(-buf); //FIXME: -?
+  if (log < limit){
+    LAST_SKIP_BITS(re, gb, log+1);
+    CLOSE_READER(re, gb);
+    return log;
+  }
+
+  LAST_SKIP_BITS(re, gb, limit);
+  CLOSE_READER(re, gb);
+  return limit;
+#endif
+}
+
 #endif /* BITSTREAM_H */