Bug 1207441: [mp4] Ignore invalid tracks. r=gerald

This is designed to minimize the chance of regressions.
This commit is contained in:
Jean-Yves Avenard 2015-09-28 12:32:51 +10:00
parent 947b4b02c2
commit 28995f8c35
2 changed files with 42 additions and 30 deletions

View File

@ -120,12 +120,14 @@ MP4Metadata::GetNumberTracks(mozilla::TrackInfo::TrackType aType) const
} }
switch (aType) { switch (aType) {
case mozilla::TrackInfo::kAudioTrack: case mozilla::TrackInfo::kAudioTrack:
if (!strncmp(mimeType, "audio/", 6)) { if (!strncmp(mimeType, "audio/", 6) &&
CheckTrack(mimeType, metaData.get(), i)) {
total++; total++;
} }
break; break;
case mozilla::TrackInfo::kVideoTrack: case mozilla::TrackInfo::kVideoTrack:
if (!strncmp(mimeType, "video/", 6)) { if (!strncmp(mimeType, "video/", 6) &&
CheckTrack(mimeType, metaData.get(), i)) {
total++; total++;
} }
break; break;
@ -157,12 +159,14 @@ MP4Metadata::GetTrackInfo(mozilla::TrackInfo::TrackType aType,
} }
switch (aType) { switch (aType) {
case mozilla::TrackInfo::kAudioTrack: case mozilla::TrackInfo::kAudioTrack:
if (!strncmp(mimeType, "audio/", 6)) { if (!strncmp(mimeType, "audio/", 6) &&
CheckTrack(mimeType, metaData.get(), i)) {
index++; index++;
} }
break; break;
case mozilla::TrackInfo::kVideoTrack: case mozilla::TrackInfo::kVideoTrack:
if (!strncmp(mimeType, "video/", 6)) { if (!strncmp(mimeType, "video/", 6) &&
CheckTrack(mimeType, metaData.get(), i)) {
index++; index++;
} }
break; break;
@ -178,33 +182,8 @@ MP4Metadata::GetTrackInfo(mozilla::TrackInfo::TrackType aType,
return nullptr; return nullptr;
} }
sp<MediaSource> track = mPrivate->mMetadataExtractor->getTrack(index); UniquePtr<mozilla::TrackInfo> e = CheckTrack(mimeType, metaData.get(), index);
if (!track.get() || track->start() != OK) {
return nullptr;
}
UniquePtr<mozilla::TrackInfo> e;
switch (aType) {
case mozilla::TrackInfo::kAudioTrack:
{
auto info = mozilla::MakeUnique<MP4AudioInfo>();
info->Update(metaData.get(), mimeType);
e = Move(info);
}
break;
case mozilla::TrackInfo::kVideoTrack:
{
auto info = mozilla::MakeUnique<MP4VideoInfo>();
info->Update(metaData.get(), mimeType);
e = Move(info);
}
break;
default:
break;
}
track->stop();
if (e) { if (e) {
metaData = mPrivate->mMetadataExtractor->getMetaData(); metaData = mPrivate->mMetadataExtractor->getMetaData();
int64_t movieDuration; int64_t movieDuration;
@ -218,6 +197,36 @@ MP4Metadata::GetTrackInfo(mozilla::TrackInfo::TrackType aType,
return e; return e;
} }
mozilla::UniquePtr<mozilla::TrackInfo>
MP4Metadata::CheckTrack(const char* aMimeType,
stagefright::MetaData* aMetaData,
int32_t aIndex) const
{
sp<MediaSource> track = mPrivate->mMetadataExtractor->getTrack(aIndex);
if (!track.get() || track->start() != OK) {
return nullptr;
}
UniquePtr<mozilla::TrackInfo> e;
if (!strncmp(aMimeType, "audio/", 6)) {
auto info = mozilla::MakeUnique<MP4AudioInfo>();
info->Update(aMetaData, aMimeType);
e = Move(info);
} else if (!strncmp(aMimeType, "video/", 6)) {
auto info = mozilla::MakeUnique<MP4VideoInfo>();
info->Update(aMetaData, aMimeType);
e = Move(info);
}
track->stop();
if (e && e->IsValid()) {
return e;
}
return nullptr;
}
bool bool
MP4Metadata::CanSeek() const MP4Metadata::CanSeek() const
{ {

View File

@ -46,6 +46,9 @@ public:
private: private:
int32_t GetTrackNumber(mozilla::TrackID aTrackID); int32_t GetTrackNumber(mozilla::TrackID aTrackID);
void UpdateCrypto(const stagefright::MetaData* aMetaData); void UpdateCrypto(const stagefright::MetaData* aMetaData);
mozilla::UniquePtr<mozilla::TrackInfo> CheckTrack(const char* aMimeType,
stagefright::MetaData* aMetaData,
int32_t aIndex) const;
nsAutoPtr<StageFrightPrivate> mPrivate; nsAutoPtr<StageFrightPrivate> mPrivate;
CryptoFile mCrypto; CryptoFile mCrypto;
nsRefPtr<Stream> mSource; nsRefPtr<Stream> mSource;