[FFmpeg-devel] [PATCH 3/4] avcodec/siren: add checksum calculation
Lynne
dev at lynne.ee
Tue Sep 7 12:42:21 EEST 2021
7 Sept 2021, 11:28 by pross at xvid.org:
> ---
> libavcodec/siren.c | 29 ++++++++++++++++++++++++++++-
> 1 file changed, 28 insertions(+), 1 deletion(-)
>
> diff --git a/libavcodec/siren.c b/libavcodec/siren.c
> index ccc69aaf40..31fb9346da 100644
> --- a/libavcodec/siren.c
> +++ b/libavcodec/siren.c
> @@ -752,7 +752,34 @@ static int siren_decode(AVCodecContext *avctx, void *data,
> frame_error = 1;
> }
>
> - skip_bits(gb, s->checksum_bits);
> + if (s->checksum_bits) {
> + static const uint16_t ChecksumTable[4] = {0x7F80, 0x7878, 0x6666, 0x5555};
> + int wpf, checksum, sum, calculated_checksum, temp1, temp2;
> +
> + wpf = bits_per_frame / 16;
> +
> + checksum = AV_RB16(avpkt->data + (wpf - 1) * 2) & ((1 << s->checksum_bits) - 1);
> +
> + sum = 0;
> + for (int i = 0; i < wpf - 1; i++)
> + sum ^= AV_RB16(avpkt->data + i * 2) << (i % 15);
> + sum ^= (AV_RB16(avpkt->data + (wpf - 1) * 2) & ~checksum) << ((wpf - 1) % 15);
> + sum = (sum >> 15) ^ (sum & 0x7FFF);
> +
> + calculated_checksum = 0;
> + for (int i = 0; i < 4; i++) {
> + temp1 = ChecksumTable[i] & sum;
> + for (int j = 8; j > 0; j >>= 1) {
> + temp2 = temp1 >> j;
> + temp1 ^= temp2;
> + }
> + calculated_checksum <<= 1;
> + calculated_checksum |= temp1 & 1;
> + }
> +
> + if (checksum != calculated_checksum)
> + frame_error = 1;
> + }
>
> if (frame_error) {
> memcpy(s->imdct_in, s->backup_frame, number_of_valid_coefs * sizeof(float));
>
Good idea, but only check it if AV_EF_CRCCHECK is set in avctx->err_recognition
and only error on mismatches if AV_EF_EXPLODE is set in the same field.
More information about the ffmpeg-devel
mailing list