diff options
author | Andreas Rheinhardt <andreas.rheinhardt@gmail.com> | 2019-07-06 16:18:03 +0200 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2019-07-09 13:23:42 +0200 |
commit | 836065b27a0f5b8268c2fb6c6e825ac3b63168f0 (patch) | |
tree | 33d22298a8dea2c92953f105e816410027f3443d | |
parent | 2275e70569cea1bc976c349520fa029734b323de (diff) | |
download | ffmpeg-836065b27a0f5b8268c2fb6c6e825ac3b63168f0.tar.gz |
truehd_core: Use byte offsets instead of bit offsets
Words of 16 bit are the unit for TrueHD's size and offset fields;
in particular the sizes of the high-level structures of TrueHD are
always a multiple of a byte; yet truehd_core unnecessarily used
bit offsets at several places. This has been changed.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
-rw-r--r-- | libavcodec/truehd_core_bsf.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/libavcodec/truehd_core_bsf.c b/libavcodec/truehd_core_bsf.c index 47684235db..8ea80d3015 100644 --- a/libavcodec/truehd_core_bsf.c +++ b/libavcodec/truehd_core_bsf.c @@ -45,7 +45,7 @@ static int truehd_core_filter(AVBSFContext *ctx, AVPacket *out) int ret, i, last_offset = 0; int in_size, out_size; int have_header = 0; - int substream_bits = 0; + int substream_bytes = 0; int end; ret = ff_bsf_get_packet(ctx, &in); @@ -85,30 +85,32 @@ static int truehd_core_filter(AVBSFContext *ctx, AVPacket *out) units[i].offset = get_bits(&gbc, 12); if (i < 3) { last_offset = units[i].offset * 2; - substream_bits += 16; + substream_bytes += 2; } if (units[i].bits[0]) { units[i].optional = get_bits(&gbc, 16); if (i < 3) - substream_bits += 16; + substream_bytes += 2; } } - end = get_bits_count(&gbc); + end = get_bits_count(&gbc) >> 3; - out_size = ((end + 7) >> 3) + 4 + last_offset; + out_size = end + 4 + last_offset; if (out_size < in_size) { - int bpos = 0, reduce = (end - have_header * 28 * 8 - substream_bits) >> 4; + int bpos = 0, reduce = end - have_header * 28 - substream_bytes; uint16_t parity_nibble, dts = AV_RB16(in->data + 2); uint16_t auheader; + av_assert1(reduce % 2 == 0); + ret = av_new_packet(out, out_size); if (ret < 0) goto fail; AV_WB16(out->data + 2, dts); parity_nibble = dts; - out->size -= reduce * 2; + out->size -= reduce; parity_nibble ^= out->size / 2; if (have_header) { @@ -146,8 +148,8 @@ static int truehd_core_filter(AVBSFContext *ctx, AVPacket *out) parity_nibble &= 0xF; memcpy(out->data + have_header * 28 + 4 + bpos, - in->data + 4 + (end >> 3), - out_size - (4 + (end >> 3))); + in->data + 4 + end, + out_size - (4 + end)); auheader = (parity_nibble ^ 0xF) << 12; auheader |= (out->size / 2) & 0x0fff; AV_WB16(out->data, auheader); |