[FFmpeg-cvslog] avcodec/vc2enc: Don't use bitcount when byte-aligned
Andreas Rheinhardt
git at videolan.org
Sun Oct 9 20:41:13 EEST 2022
ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinhardt at outlook.com> | Thu Oct 6 02:31:21 2022 +0200| [d2dc6440e6d46d34cfb7d925d4a5420cebf5bf66] | committer: Andreas Rheinhardt
avcodec/vc2enc: Don't use bitcount when byte-aligned
(There is a small issue that is now being treated differently:
The earlier code would record a position in a buffer that
is being written to via put_bits(), then write data,
then overwrite the byte at the position recorded earlier
and only then flush the PutBitContext. In case there was
no writeout in the meantime, said flush would overwrite
what one has just written. This never happened in my tests,
but maybe it can happen. In this case this commit fixes
this issue by flushing before overwriting the old data.)
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=d2dc6440e6d46d34cfb7d925d4a5420cebf5bf66
---
libavcodec/vc2enc.c | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/libavcodec/vc2enc.c b/libavcodec/vc2enc.c
index 5cb6e0d198..82d11462aa 100644
--- a/libavcodec/vc2enc.c
+++ b/libavcodec/vc2enc.c
@@ -233,7 +233,7 @@ static void encode_parse_info(VC2EncContext *s, enum DiracParseCodes pcode)
align_put_bits(&s->pb);
- cur_pos = put_bits_count(&s->pb) >> 3;
+ cur_pos = put_bytes_count(&s->pb, 0);
/* Magic string */
ff_put_string(&s->pb, "BBCD", 0);
@@ -746,7 +746,7 @@ static int encode_hq_slice(AVCodecContext *avctx, void *arg)
/* Luma + 2 Chroma planes */
for (p = 0; p < 3; p++) {
int bytes_start, bytes_len, pad_s, pad_c;
- bytes_start = put_bits_count(pb) >> 3;
+ bytes_start = put_bytes_count(pb, 0);
put_bits(pb, 8, 0);
for (level = 0; level < s->wavelet_depth; level++) {
for (orientation = !!level; orientation < 4; orientation++) {
@@ -755,10 +755,10 @@ static int encode_hq_slice(AVCodecContext *avctx, void *arg)
quants[level][orientation]);
}
}
- align_put_bits(pb);
- bytes_len = (put_bits_count(pb) >> 3) - bytes_start - 1;
+ flush_put_bits(pb);
+ bytes_len = put_bytes_output(pb) - bytes_start - 1;
if (p == 2) {
- int len_diff = slice_bytes_max - (put_bits_count(pb) >> 3);
+ int len_diff = slice_bytes_max - put_bytes_output(pb);
pad_s = FFALIGN((bytes_len + len_diff), s->size_scaler)/s->size_scaler;
pad_c = (pad_s*s->size_scaler) - bytes_len;
} else {
@@ -766,7 +766,6 @@ static int encode_hq_slice(AVCodecContext *avctx, void *arg)
pad_c = (pad_s*s->size_scaler) - bytes_len;
}
pb->buf[bytes_start] = pad_s;
- flush_put_bits(pb);
/* vc2-reference uses that padding that decodes to '0' coeffs */
memset(put_bits_ptr(pb), 0xFF, pad_c);
skip_put_bytes(pb, pad_c);
More information about the ffmpeg-cvslog
mailing list