diff lzwenc.c @ 10634:e15eb76d9e47 libavcodec

use lzw compression in gif encoder
author bcoudurier
date Thu, 03 Dec 2009 19:17:39 +0000
parents 4cb7c65fc775
children 7dd2a45249a9
line wrap: on
line diff
--- a/lzwenc.c	Thu Dec 03 18:53:12 2009 +0000
+++ b/lzwenc.c	Thu Dec 03 19:17:39 2009 +0000
@@ -58,6 +58,8 @@
     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 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 @@
 
     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 @@
  * @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 @@
     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 @@
  * @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);