]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/lzwenc.c
Fix r21223: AVup samples (issue 1685) need a buf offset like AV1x (issue 1684).
[ffmpeg] / libavcodec / lzwenc.c
index 4565b22c64ac4b9bcd5585d0feb2e5137c941077..f8cf4911b650a605c83fcc6f955b352f321c68d0 100644 (file)
@@ -26,7 +26,7 @@
  */
 
 #include "avcodec.h"
-#include "bitstream.h"
+#include "put_bits.h"
 #include "lzw.h"
 
 #define LZW_MAXBITS 12
@@ -58,6 +58,8 @@ typedef struct LZWEncodeState {
     int maxcode;             ///< Max value of code
     int output_bytes;        ///< Number of written bytes
     int last_code;           ///< Value of last output code or LZW_PREFIX_EMPTY
+    enum FF_LZW_MODES mode;  ///< TIFF or GIF
+    void (*put_bits)(PutBitContext *, int, unsigned); ///< GIF is LE while TIFF is BE
 }LZWEncodeState;
 
 
@@ -110,7 +112,7 @@ static inline int hashOffset(const int head)
 static inline void writeCode(LZWEncodeState * s, int c)
 {
     assert(0 <= c && c < 1 << s->bits);
-    put_bits(&s->pb, s->bits, c);
+    s->put_bits(&s->pb, s->bits, c);
 }
 
 
@@ -151,7 +153,7 @@ static inline void addCode(LZWEncodeState * s, uint8_t c, int hash_prefix, int h
 
     s->tabsize++;
 
-    if (s->tabsize >= 1 << s->bits)
+    if (s->tabsize >= (1 << s->bits) + (s->mode == FF_LZW_GIF))
         s->bits++;
 }
 
@@ -196,7 +198,9 @@ static int writtenBytes(LZWEncodeState *s){
  * @param outsize Size of output buffer
  * @param maxbits Maximum length of code
  */
-void ff_lzw_encode_init(LZWEncodeState * s, uint8_t * outbuf, int outsize, int maxbits)
+void ff_lzw_encode_init(LZWEncodeState *s, uint8_t *outbuf, int outsize,
+                        int maxbits, enum FF_LZW_MODES mode,
+                        void (*lzw_put_bits)(PutBitContext *, int, unsigned))
 {
     s->clear_code = 256;
     s->end_code = 257;
@@ -208,6 +212,8 @@ void ff_lzw_encode_init(LZWEncodeState * s, uint8_t * outbuf, int outsize, int m
     s->output_bytes = 0;
     s->last_code = LZW_PREFIX_EMPTY;
     s->bits = 9;
+    s->mode = mode;
+    s->put_bits = lzw_put_bits;
 }
 
 /**
@@ -250,12 +256,13 @@ int ff_lzw_encode(LZWEncodeState * s, const uint8_t * inbuf, int insize)
  * @param s LZW state
  * @return Number of bytes written or -1 on error
  */
-int ff_lzw_encode_flush(LZWEncodeState * s)
+int ff_lzw_encode_flush(LZWEncodeState *s,
+                        void (*lzw_flush_put_bits)(PutBitContext *))
 {
     if (s->last_code != -1)
         writeCode(s, s->last_code);
     writeCode(s, s->end_code);
-    flush_put_bits(&s->pb);
+    lzw_flush_put_bits(&s->pb);
     s->last_code = -1;
 
     return writtenBytes(s);