[Ffmpeg-devel] [PATCH] MP3 decoding from RTP stream. Getting "invalid new backstep"

Martin marthi
Mon Nov 6 15:19:10 CET 2006


Hi

Michael Niedermayer wrote:
> Hi
> 
> On Mon, Nov 06, 2006 at 09:19:17AM +0100, Martin Thielen wrote:
> 
>>Hi
>>
>>Michael Niedermayer wrote:
>>
>>>Hi
>>>
>>>On Fri, Nov 03, 2006 at 03:20:04PM +0100, Martin wrote:
>>>
>>>
>>>>Michael Niedermayer wrote:
>>>>
>>>>
>>>>>Hi
>>>>>
>>>>>On Fri, Nov 03, 2006 at 12:25:30PM +0100, Martin wrote:
>>>>>
>>>>>
>>>>>
>>>>>>Hi,
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>>>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?
>>>>>>>
>>>>>>>
>>>>>>>not without understanding why setting sb_samples to 0 doesnt work
>>>>>>>
>>>>>>>[...]
>>>>>>
>>>>>>It seems to work now, with setting sb_frames to 0. I did it after the
>>>>>>synthesis filter which didn't work. How should I transmit the fact that
>>>>>>a distortion occured in huffmann_decode() to the function
>>>>>>mp_decode_frame()? Can I use the flag for this purpose?
>>>>>>I'm not sure whether I break something if I set sb_samples to 0 directly
>>>>>>at the point where the distortion occurs in huffmann_decode().
>>>>>
>>>>>
>>>>>huffmann_decode() should return -1 if theres an error
>>>>>
>>>>>[...]
>>>>
>>>>Thanks for the help!
>>>>So here is a patch which sets buffers to 0 if 'overread' or 'backstep'
>>>>occurs which prior resulted in distorted sound.
>>>>
>>>>Martin
>>>
>>>
>>>>--- mpegaudiodec.c_bak	2006-11-03 14:38:48.263103729 +0100
>>>>+++ mpegaudiodec.c	2006-11-03 14:43:02.153241601 +0100
>>>>@@ -1705,7 +1705,8 @@ static int huffman_decode(MPADecodeConte
>>>>                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);
>>>>-                break;
>>>>+                //break;
>>>>+                return -1;
>>>>            }
>>>
>>>
>>>this one will break decoding of some mp3 files (from broken encoders ...)
>>
>>So ahould I set the samples to 0 here as well instead of return -1?
> 
> 
> no this case is not an error

Ok, so I removed this return -1 from the patch.

> 
> 
> 
>>>
>>>[...]
>>>
>>>
>>>>        assert(i <= buf_size - HEADER_SIZE && i>= 0);
>>>>        memcpy(s->last_buf + s->last_buf_size, s->gb.buffer + buf_size - HEADER_SIZE - i, i);
>>>>@@ -2503,6 +2508,19 @@ static int mp_decode_frame(MPADecodeCont
>>>>        }
>>>>    }
>>>>#endif
>>>>+
>>>>+    // zero samples if frame is distorted by overread or backstep
>>>>+    if (discard_frame) {
>>>>+        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;
>>>>+                }
>>>>+            }
>>>>+        }
>>>>+    }
>>>
>>>
>>>memset(0);
>>>
>>>[...]
>>
>>Is the rest of the patch ok?
> 
> 
> i think so, but thats just from memory ...
> 
> [...]

The new patch which sets buffers to 0 if 'backstep'occurs which prior
resulted in distorted sound is attached.

Martin
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ffmpeg-6883-patch-discard-distorted-frames.diff
Type: text/x-patch
Size: 1779 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20061106/df4b5699/attachment.bin>



More information about the ffmpeg-devel mailing list