Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 983ab88e authored by Dongwon Kang's avatar Dongwon Kang
Browse files

To make SniffMP3() more concrete so that we can remove false-positve responses...

To make SniffMP3() more concrete so that we can remove false-positve responses from MPEG-PS streams.

Note: current resync logic keeps searching mp3 frames until it meets a
valid one. This resync logic works well with seek() operation, but in
SniffMP3(), this may cause false-positive classification for the
following MPEG-PS file format.
  A possible MPEG-PS video file:
      [PS header]...[mp3 frame][mp3 frame] ...
  MP3 files:
      [ID3 tag][mp3 frame][mp3 frame] ...

BUG: 5104562
Change-Id: Idd5020723f7bdb2fefc2a63fc8651580fd644399
parent 7fa6e424
Loading
Loading
Loading
Loading
+16 −15
Original line number Diff line number Diff line
@@ -52,7 +52,10 @@ static bool Resync(
        *post_id3_pos = 0;
    }

    bool resync_from_head = false;
    if (*inout_pos == 0) {
        resync_from_head = true;

        // Skip an optional ID3 header if syncing at the very beginning
        // of the datasource.

@@ -137,23 +140,21 @@ static bool Resync(

        uint32_t header = U32_AT(tmp);

        if (match_header != 0 && (header & kMask) != (match_header & kMask)) {
            ++pos;
            ++tmp;
            --remainingBytes;
            continue;
        }

        size_t frame_size;
        int sample_rate, num_channels, bitrate;
        if (!GetMPEGAudioFrameSize(
                    header, &frame_size,
                    &sample_rate, &num_channels, &bitrate)) {
        if ((match_header != 0 && (header & kMask) != (match_header & kMask))
                || !GetMPEGAudioFrameSize(header, &frame_size)) {
            if (resync_from_head) {
                // This isn't a valid mp3 file because it failed to detect
                // a header while a valid mp3 file should have a valid
                // header here.
                break;
            } else {
                ++pos;
                ++tmp;
                --remainingBytes;
                continue;
            }
        }

        LOGV("found possible 1st frame at %lld (header = 0x%08x)", pos, header);