]> git.vomp.tv Git - vompclient-marten.git/commitdiff
Detect mpeg audio frame header changes, and wait at least 4 packets after a change...
authorMarten Richter <marten.richter@freenet.de>
Sat, 23 Nov 2013 12:56:25 +0000 (13:56 +0100)
committerMarten Richter <marten.richter@freenet.de>
Sat, 23 Nov 2013 12:56:25 +0000 (13:56 +0100)
audioomx.cc
audioomx.h

index 09a66eabf873505cd7152aff0ca216a9d3e44a0f..4703bbf15cfbda39b869ceff425c2ecc1d1b401c 100644 (file)
@@ -64,6 +64,8 @@ AudioOMX::AudioOMX()
   decompress_buffer=NULL;
   decompress_buffer_size=0;
   decompress_buffer_filled=0;
+  mp3sameheader=0;
+  mp3sameheadercount=0;
 
 }
 
@@ -1579,6 +1581,9 @@ unsigned int AudioOMX::AdvanceMpAudioSync(const UCHAR *data,unsigned int size,un
        //inspired by libav parsing code
        while (test+1<size) {
                if (data[test]==0xFF && (data[test+1] &0xe0)==0xe0) {
+                       //sanity check inspired by libav
+
+
                        const int sample_rates[4]={44100,48000,32000,0};
                        const short bitrate_tab[2][3][15] = { { { 0, 32, 64, 96, 128, 160,
                                        192, 224, 256, 288, 320, 352, 384, 416, 448 }, { 0, 32, 48,
@@ -1620,11 +1625,23 @@ unsigned int AudioOMX::AdvanceMpAudioSync(const UCHAR *data,unsigned int size,un
                                frame_size=(temp_frame_size*144000)/(sample_rate<<lsf);
                                frame_size=frame_size+padding;
                        }
+                       unsigned int sameheadertest=(data[test]<<24)|(data[test+1]<<16) |(data[test+2]<<8);
+                       const unsigned mask=(0xffe00000 | (3 << 17) | (3 << 10) | (3 << 19)); // from libav
+                       if (!mp3sameheader) {
+                               mp3sameheader=sameheadertest;
+                               mp3sameheadercount=2;
+                       }
+                       if ((mp3sameheader& mask)== (sameheadertest &mask)) mp3sameheadercount++;
+                       else mp3sameheadercount=0;
+                       mp3sameheader=sameheadertest;
+
                        //Log::getInstance()->log("Audio", Log::DEBUG, "FRAME: %d %d %d %d %d %d %d",lsf,layer,bitrate_index,sample_rate,padding,temp_frame_size, frame_size);
-                       //Log::getInstance()->log("Audio", Log::DEBUG, "FRAME DIAG: %x %x %x ",data[test],data[test+1],data[test+2]);
-                       *framesize=frame_size;
+                       //Log::getInstance()->log("Audio", Log::DEBUG, "FRAME DIAG: %x %x %x %d",data[test],data[test+1],data[test+2],mp3sameheadercount);
 
-                       return test; // probably FrameSync
+                       if (mp3sameheadercount>4) {
+                               *framesize=frame_size;
+                               return test; // probably FrameSync
+                       } //skip it if the header changes too frequently
                }
                test++;
        }
@@ -1829,6 +1846,7 @@ UINT AudioOMX::DeliverMediaPacket(MediaPacket packet, const UCHAR* buffer,
        if (packet.type != lastAType) {//Format Change //Push data out !
                firstsynched = false;
                achange=true;
+               mp3sameheader=0;
                Log::getInstance()->log("Audio", Log::DEBUG,"Notice audio type change %d %d", packet.type,lastAType);
                lastAType = packet.type;
                decompress_buffer_filled=0;
index 42f525bc1fbaedb40fc7d67ecd00d6a31c5ed840..b6b01e06f3daf2df69015e752ab6a5b080fba2b1 100644 (file)
@@ -198,6 +198,9 @@ class AudioOMX : public Audio
     unsigned int decompress_buffer_filled;
     bool lsync;
 
+    unsigned int mp3sameheader;
+    int mp3sameheadercount;
+
 
         int InitDecoderLibAV();
         void DeinitDecoderLibAV();