[FFmpeg-devel] [PATCHv2] avcodec/siren: add checksum calculation

James Almer jamrial at gmail.com
Thu Sep 9 16:40:06 EEST 2021


On 9/9/2021 5:46 AM, Peter Ross wrote:
> ---
> 
> Thanks for suggestion. I will apply in a couple days if no objections.
> 
>   libavcodec/siren.c | 32 +++++++++++++++++++++++++++++++-
>   1 file changed, 31 insertions(+), 1 deletion(-)
> 
> diff --git a/libavcodec/siren.c b/libavcodec/siren.c
> index 2161b29a2c..40910f34e5 100644
> --- a/libavcodec/siren.c
> +++ b/libavcodec/siren.c
> @@ -752,7 +752,37 @@ static int siren_decode(AVCodecContext *avctx, void *data,
>               frame_error = 1;
>       }
>   
> -    skip_bits(gb, s->checksum_bits);
> +    if ((avctx->err_recognition & AV_EF_CRCCHECK) && 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);

Shouldn't you read this value from the getbitcontext?

> +
> +        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;
> +        }

What crc is this? If it's not already supported by AVCRC, could it be 
implemented?

> +
> +        if (checksum != calculated_checksum) {
> +            if (avctx->err_recognition & AV_EF_EXPLODE)
> +                return AVERROR_INVALIDDATA;
> +            frame_error = 1;
> +        }
> +    }
>   
>       if (frame_error) {
>           memcpy(s->imdct_in, s->backup_frame, number_of_valid_coefs * sizeof(float));
> 
> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
> 



More information about the ffmpeg-devel mailing list