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
+ int little_endian; ///< GIF is LE while TIFF is BE
}LZWEncodeState;
static inline void writeCode(LZWEncodeState * s, int c)
{
av_assert2(0 <= c && c < 1 << s->bits);
- s->put_bits(&s->pb, s->bits, c);
+ if (s->little_endian)
+ put_bits_le(&s->pb, s->bits, c);
+ else
+ put_bits(&s->pb, s->bits, c);
}
* @param maxbits Maximum length of code
*/
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))
+ int maxbits, enum FF_LZW_MODES mode, int little_endian)
{
s->clear_code = 256;
s->end_code = 257;
s->last_code = LZW_PREFIX_EMPTY;
s->bits = 9;
s->mode = mode;
- s->put_bits = lzw_put_bits;
+ s->little_endian = little_endian;
}
/**
* @param s LZW state
* @return Number of bytes written or -1 on error
*/
-int ff_lzw_encode_flush(LZWEncodeState *s,
- void (*lzw_flush_put_bits)(PutBitContext *))
+int ff_lzw_encode_flush(LZWEncodeState *s)
{
if (s->last_code != -1)
writeCode(s, s->last_code);
writeCode(s, s->end_code);
- if (s->mode == FF_LZW_GIF)
- s->put_bits(&s->pb, 1, 0);
+ if (s->little_endian) {
+ if (s->mode == FF_LZW_GIF)
+ put_bits_le(&s->pb, 1, 0);
- lzw_flush_put_bits(&s->pb);
+ flush_put_bits_le(&s->pb);
+ } else {
+ if (s->mode == FF_LZW_GIF)
+ put_bits(&s->pb, 1, 0);
+
+ flush_put_bits(&s->pb);
+ }
s->last_code = -1;
return writtenBytes(s);