X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Flzwenc.c;h=6c45f7cc37e65438b04bcd2519bbc86e5e7e2bdd;hb=1ec87f50f42a16f9228444dc08aa8264879f61e1;hp=03080ee58729325d5defca45ea37b5ac79cc236e;hpb=1a8be90adbaf86faa3053ff98118004ad7711c8c;p=ffmpeg diff --git a/libavcodec/lzwenc.c b/libavcodec/lzwenc.c index 03080ee5872..6c45f7cc37e 100644 --- a/libavcodec/lzwenc.c +++ b/libavcodec/lzwenc.c @@ -60,7 +60,7 @@ typedef struct LZWEncodeState { 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; @@ -113,7 +113,10 @@ static inline int hashOffset(const int head) 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); } @@ -186,7 +189,7 @@ static void clearTable(LZWEncodeState * s) * @return Number of bytes written */ static int writtenBytes(LZWEncodeState *s){ - int ret = put_bits_count(&s->pb) >> 3; + int ret = put_bytes_count(&s->pb, 0); ret -= s->output_bytes; s->output_bytes += ret; return ret; @@ -200,8 +203,7 @@ static int writtenBytes(LZWEncodeState *s){ * @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; @@ -214,7 +216,7 @@ void ff_lzw_encode_init(LZWEncodeState *s, uint8_t *outbuf, int outsize, s->last_code = LZW_PREFIX_EMPTY; s->bits = 9; s->mode = mode; - s->put_bits = lzw_put_bits; + s->little_endian = little_endian; } /** @@ -257,16 +259,22 @@ 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, - 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);