On 02/09/2012 07:18 PM, Paul B Mahol wrote:
> On 2/10/12, Justin Ruggles <[email protected]> wrote:
>> On 02/09/2012 05:48 PM, Paul B Mahol wrote:
>>
>>>
>>> Signed-off-by: Paul B Mahol <[email protected]>
>>> ---
>>> libavcodec/wavpack.c | 52
>>> ++++++++++++++++++++++++++++---------------------
>>> 1 files changed, 30 insertions(+), 22 deletions(-)
>>>
>>> diff --git a/libavcodec/wavpack.c b/libavcodec/wavpack.c
>>> index 1098873..e7e7da8 100644
>>> --- a/libavcodec/wavpack.c
>>> +++ b/libavcodec/wavpack.c
>>> @@ -408,7 +408,8 @@ static inline int
>>> wv_get_value_integer(WavpackFrameContext *s, uint32_t *crc,
>>>
>>> if (s->got_extra_bits && get_bits_left(&s->gb_extra_bits) >=
>>> s->extra_bits) {
>>> S |= get_bits(&s->gb_extra_bits, s->extra_bits);
>>> - *crc = *crc * 9 + (S & 0xffff) * 3 + ((unsigned)S >> 16);
>>> + if (s->avctx->err_recognition & AV_EF_CRCCHECK)
>>> + *crc = *crc * 9 + (S & 0xffff) * 3 + ((unsigned)S >> 16);
>>> }
>>> }
>>>
>>> @@ -488,7 +489,8 @@ static float wv_get_value_float(WavpackFrameContext
>>> *s, uint32_t *crc, int S)
>>> }
>>> }
>>>
>>> - *crc = *crc * 27 + S * 9 + exp * 3 + sign;
>>> + if (s->avctx->err_recognition & AV_EF_CRCCHECK)
>>> + *crc = *crc * 27 + S * 9 + exp * 3 + sign;
>>>
>>> value.u = (sign << 31) | (exp << 23) | S;
>>> return value.f;
>>> @@ -500,6 +502,24 @@ static void
>>> wv_reset_saved_context(WavpackFrameContext *s)
>>> s->sc.crc = s->extra_sc.crc = 0xFFFFFFFF;
>>> }
>>>
>>> +static inline int wv_check_crc(WavpackFrameContext *s, uint32_t crc,
>>> + uint32_t crc_extra_bits)
>>> +{
>>> + wv_reset_saved_context(s);
>>
>>
>> would be simpler to do:
>>
>> wv_reset_saved_context(s);
>> if (s->avctx->err_recognition & AV_EF_CRCCHECK)
>> wv_check_crc();
>
> That one would break crc checking.
Sorry, that was sort of pseudo-code. The idea still works though. Move
the unconditional part that's not specific to CRC checking out of the
CRC checking function, then call the CRC checking function
conditionally. I suppose it would be more like:
wv_reset_saved_context(s);
if ((s->avctx->err_recognition & AV_EF_CRCCHECK) &&
wv_check_crc(s, crc, crc_extra_bits))
return AVERROR_INVALIDDATA;
-Justin
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel