[FFmpeg-devel] [PATCH] Multi-Channel Correlation in ALS

Thilo Borgmann thilo.borgmann
Sun Jan 3 10:34:49 CET 2010


Am 21.12.09 13:24, schrieb Thilo Borgmann:
> 
>>>>
>>>> also dont forget to test the code with a fuzzer to make sure it doesnt
>>>> crash and please also go over it to make sure there are no other buffer
>>>> overflows, you know the code better then i do so i might not spot all.
>>>
>>
>>> I played around with the trasher a lot and got some pitfalls removed. I
>>> end up in demuxer segfaults for my trashed files.
>>
>> please report segfaults on roundup unless they are already reported
> 
> My gdb skills are worse than poor, so a stripped ffmpeg pointed me to a
> ff_ac3_ function... the unstripped ffmpeg_g told me it was my fault.
> 
> I've found and debugged the segfault caused by an infinite recursion.
> Now all my trash files fail without crashing ffmpeg.
> 
>>
>>
>> [...]
>>> @@ -%ld,%ld +%ld,%ld @@
>>>  }
>>>  
>>>  
>>> +/** Reads the channel data.
>>> +  */
>>> +static int read_channel_data(ALSDecContext *ctx, ALSChannelData *cd, int c)
>>> +{
>>> +    GetBitContext *gb       = &ctx->gb;
>>> +    ALSChannelData *current = cd;
>>> +    unsigned int channels   = ctx->avctx->channels;
>>> +    int entries             = 0;
>>> +
>>> +    while (entries < channels && !(current->stop_flag = get_bits1(gb))) {
>>> +        current->master_channel = get_bits_long(gb, av_ceil_log2(channels));
>>> +
>>> +        if (current->master_channel >= channels) {
>>> +            av_log(ctx->avctx, AV_LOG_ERROR, "Invalid master channel!\n");
>>> +            return -1;
>>> +        }
>>> +
>>> +        if (current->master_channel != c) {
>>> +            current->time_diff_flag = get_bits1(gb);
>>> +            current->weighting[0]   = mcc_weightings[av_clip(decode_rice(gb, 1) + 16, 0, 32)];
>>> +            current->weighting[1]   = mcc_weightings[av_clip(decode_rice(gb, 2) + 14, 0, 32)];
>>> +            current->weighting[2]   = mcc_weightings[av_clip(decode_rice(gb, 1) + 16, 0, 32)];
>>> +
>>> +            if (current->time_diff_flag) {
>>> +                current->weighting[3] = mcc_weightings[av_clip(decode_rice(gb, 1) + 16, 0, 32)];
>>> +                current->weighting[4] = mcc_weightings[av_clip(decode_rice(gb, 1) + 16, 0, 32)];
>>> +                current->weighting[5] = mcc_weightings[av_clip(decode_rice(gb, 1) + 16, 0, 32)];
>>> +
>>> +                current->time_diff_sign  = get_bits1(gb);
>>> +                current->time_diff_index = get_bits(gb, ctx->ltp_lag_length - 3) + 3;
>>> +                if (current->time_diff_sign)
>>> +                    current->time_diff_index = -current->time_diff_index;
>>> +            }
>>> +        }
>>> +
>>> +        current++;
>>> +        entries++;
>>> +    }
>>> +
>>> +    if (entries == channels) {
>>> +        current--;
>>> +        current->stop_flag = 1;
>>> +        current->master_channel = c;
>>> +        return -1;
>>> +    }
>>
>> there are 2 return -1 in this function but only one sets these things like
>> stop_flag, why is it needed in one but not the other ?
> 
> Indeed these are unnecessary now.
> 
>>
>>
>> [...]
>>> @@ -%ld,%ld +%ld,%ld @@
>>
>> whatever generated this patch is not too well working
> 
> Known issue in MacPorts's svn >= 1.6.5 :(
> As long as I commit these myself I can ignore it until they can solve it...
> 
> 
> Updated patch attached.

ping



More information about the ffmpeg-devel mailing list