From patchwork Sun Jul 19 18:29:29 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Steinar H. Gunderson" X-Patchwork-Id: 21192 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 68F9644B550 for ; Sun, 19 Jul 2020 21:29:39 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4FF2568B3D0; Sun, 19 Jul 2020 21:29:39 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from pannekake.samfundet.no (pannekake.samfundet.no [193.35.52.50]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B63D868B028 for ; Sun, 19 Jul 2020 21:29:32 +0300 (EEST) Received: from sesse by pannekake.samfundet.no with local (Exim 4.92) (envelope-from ) id 1jxE43-0004gS-VN; Sun, 19 Jul 2020 20:29:32 +0200 From: "Steinar H. Gunderson" To: ffmpeg-devel@ffmpeg.org Date: Sun, 19 Jul 2020 20:29:29 +0200 Message-Id: <20200719182929.17957-1-steinar+ffmpeg@gunderson.no> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200719181843.iie5e7x66gdltqnz@sesse.net> References: <20200719181843.iie5e7x66gdltqnz@sesse.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avcodec/put_bits: Fix LZW warning X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: "Steinar H. Gunderson" Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" lzwenc stores a function pointer to either put_bits or put_bits_le; however, after the recent change, the function pointer's prototype would depend on BitBuf. BitBuf is defined in put_bits.h, whose definition depends on whether BITSTREAM_WRITER_LE is #defined or not. For safety, we set a boolean flag for little/big endian instead, which also allows the definition to be inlined. --- libavcodec/gif.c | 4 ++-- libavcodec/lzw.h | 6 ++---- libavcodec/lzwenc.c | 28 ++++++++++++++++++---------- libavcodec/tiffenc.c | 4 ++-- 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/libavcodec/gif.c b/libavcodec/gif.c index e2242d0438..e92dfa65d7 100644 --- a/libavcodec/gif.c +++ b/libavcodec/gif.c @@ -344,7 +344,7 @@ static int gif_image_write_image(AVCodecContext *avctx, bytestream_put_byte(bytestream, 0x08); ff_lzw_encode_init(s->lzw, s->buf, s->buf_size, - 12, FF_LZW_GIF, put_bits); + 12, FF_LZW_GIF, 1); ptr = buf + y_start*linesize + x_start; if (honor_transparency) { @@ -366,7 +366,7 @@ static int gif_image_write_image(AVCodecContext *avctx, ptr += linesize; } } - len += ff_lzw_encode_flush(s->lzw, flush_put_bits); + len += ff_lzw_encode_flush(s->lzw); ptr = s->buf; while (len > 0) { diff --git a/libavcodec/lzw.h b/libavcodec/lzw.h index 6af8a6b83a..dae4d05225 100644 --- a/libavcodec/lzw.h +++ b/libavcodec/lzw.h @@ -54,10 +54,8 @@ struct LZWEncodeState; extern const int ff_lzw_encode_state_size; void ff_lzw_encode_init(struct LZWEncodeState *s, uint8_t *outbuf, int outsize, - int maxbits, enum FF_LZW_MODES mode, - void (*lzw_put_bits)(struct PutBitContext *, int, unsigned int)); + int maxbits, enum FF_LZW_MODES mode, int little_endian); int ff_lzw_encode(struct LZWEncodeState * s, const uint8_t * inbuf, int insize); -int ff_lzw_encode_flush(struct LZWEncodeState *s, - void (*lzw_flush_put_bits)(struct PutBitContext *)); +int ff_lzw_encode_flush(struct LZWEncodeState *s); #endif /* AVCODEC_LZW_H */ diff --git a/libavcodec/lzwenc.c b/libavcodec/lzwenc.c index 03080ee587..e693d74272 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); } @@ -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); diff --git a/libavcodec/tiffenc.c b/libavcodec/tiffenc.c index a122f51de4..6661e59d31 100644 --- a/libavcodec/tiffenc.c +++ b/libavcodec/tiffenc.c @@ -421,7 +421,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, if (s->compr == TIFF_LZW) { ff_lzw_encode_init(s->lzws, ptr, s->buf_size - (*s->buf - s->buf_start), - 12, FF_LZW_TIFF, put_bits); + 12, FF_LZW_TIFF, 0); } s->strip_offsets[i / s->rps] = ptr - pkt->data; } @@ -440,7 +440,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, ptr += ret; if (s->compr == TIFF_LZW && (i == s->height - 1 || i % s->rps == s->rps - 1)) { - ret = ff_lzw_encode_flush(s->lzws, flush_put_bits); + ret = ff_lzw_encode_flush(s->lzws); s->strip_sizes[(i / s->rps)] += ret; ptr += ret; }