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
This commit is contained in:
@@ -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,22 +140,20 @@ 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)) {
|
||||
++pos;
|
||||
++tmp;
|
||||
--remainingBytes;
|
||||
continue;
|
||||
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);
|
||||
|
||||
Reference in New Issue
Block a user