[Ffmpeg-devel] MP3 decoding from RTP stream. Getting "invalid new backstep"
Martin
marthi
Fri Nov 3 10:24:19 CET 2006
Hi,
>>>the best way:
>>>1) Return a value that indicates a problem
>>>2) Set a flag (which one?) in AVCodecContext that indicates a problem
>>>3) Changing the buffer values to 0? Is 0 the right value for silence?
>>
>>Zero is not a good value as it will cause pops or clicks if the previous
>>sample has a large value.
>
>
> hmm zeroing a block before the MDCT shouldnt introduce any big
> discontinuities i think though iam not that good at MDCT related stuff ...
> one alternative might be to simply use the coeffs fromm the previous
> block, if that fails too google/citeseer would be the right place to
> look for audio error concealment
>
> [...]
>
I'm still not able to solve the problem with writing zero to the buffer
I tried like this in the function mp_decode_frame :
right before returning:
if (discard_frame) {
//dicard frame is set if an backstep or overread occurs.
for(i=0;i<nb_frames;i++) {
for(ch=0;ch<s->nb_channels;ch++) {
int j;
for(j=0;j<SBLIMIT;j++) {
s->sb_samples[ch][i][j] = 0;
}
}
}
}
This didn't worked as expected. Also I found another problem caused by
this point in the huffman_decode() function:
if (pos > end_pos2 && last_pos){
/* some encoders generate an incorrect size for this
part. We must go back into the data */
s_index -= 4;
skip_bits_long(&s->gb, last_pos - pos);
av_log(NULL, AV_LOG_INFO, "overread, skip %d enddists:
%d %d\n", last_pos - pos, end_pos-pos, end_pos2-pos);
s->frame_distorted = 1;
break;
}
My idea was now to introduce a new flag into the MPADecodeContext:
int frame_distorted;
Now I set this flag to 0 at the start of decode_frame()
and set it to 1 when backstep or overread occurs. At the end of
decode_frame() I check the flag and return -1 if it is set. This is
working for me. If I send a patch with the new flag, would you include it?
Martin
More information about the ffmpeg-devel
mailing list