mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
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@outlook.com>
This commit is contained in:
parent
b9133bce04
commit
d2dc6440e6
@ -233,7 +233,7 @@ static void encode_parse_info(VC2EncContext *s, enum DiracParseCodes pcode)
|
|||||||
|
|
||||||
align_put_bits(&s->pb);
|
align_put_bits(&s->pb);
|
||||||
|
|
||||||
cur_pos = put_bits_count(&s->pb) >> 3;
|
cur_pos = put_bytes_count(&s->pb, 0);
|
||||||
|
|
||||||
/* Magic string */
|
/* Magic string */
|
||||||
ff_put_string(&s->pb, "BBCD", 0);
|
ff_put_string(&s->pb, "BBCD", 0);
|
||||||
@ -746,7 +746,7 @@ static int encode_hq_slice(AVCodecContext *avctx, void *arg)
|
|||||||
/* Luma + 2 Chroma planes */
|
/* Luma + 2 Chroma planes */
|
||||||
for (p = 0; p < 3; p++) {
|
for (p = 0; p < 3; p++) {
|
||||||
int bytes_start, bytes_len, pad_s, pad_c;
|
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);
|
put_bits(pb, 8, 0);
|
||||||
for (level = 0; level < s->wavelet_depth; level++) {
|
for (level = 0; level < s->wavelet_depth; level++) {
|
||||||
for (orientation = !!level; orientation < 4; orientation++) {
|
for (orientation = !!level; orientation < 4; orientation++) {
|
||||||
@ -755,10 +755,10 @@ static int encode_hq_slice(AVCodecContext *avctx, void *arg)
|
|||||||
quants[level][orientation]);
|
quants[level][orientation]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
align_put_bits(pb);
|
flush_put_bits(pb);
|
||||||
bytes_len = (put_bits_count(pb) >> 3) - bytes_start - 1;
|
bytes_len = put_bytes_output(pb) - bytes_start - 1;
|
||||||
if (p == 2) {
|
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_s = FFALIGN((bytes_len + len_diff), s->size_scaler)/s->size_scaler;
|
||||||
pad_c = (pad_s*s->size_scaler) - bytes_len;
|
pad_c = (pad_s*s->size_scaler) - bytes_len;
|
||||||
} else {
|
} else {
|
||||||
@ -766,7 +766,6 @@ static int encode_hq_slice(AVCodecContext *avctx, void *arg)
|
|||||||
pad_c = (pad_s*s->size_scaler) - bytes_len;
|
pad_c = (pad_s*s->size_scaler) - bytes_len;
|
||||||
}
|
}
|
||||||
pb->buf[bytes_start] = pad_s;
|
pb->buf[bytes_start] = pad_s;
|
||||||
flush_put_bits(pb);
|
|
||||||
/* vc2-reference uses that padding that decodes to '0' coeffs */
|
/* vc2-reference uses that padding that decodes to '0' coeffs */
|
||||||
memset(put_bits_ptr(pb), 0xFF, pad_c);
|
memset(put_bits_ptr(pb), 0xFF, pad_c);
|
||||||
skip_put_bytes(pb, pad_c);
|
skip_put_bytes(pb, pad_c);
|
||||||
|
Loading…
Reference in New Issue
Block a user