Bug 1366208: Make sure no empty RefPtr are ever stored. r?gerald
Should any error occurred while checking the tracks, we could end up with a null pointer stored in the list of track demuxers.
MozReview-Commit-ID: 13FllESrpbg
--- a/dom/media/fmp4/MP4Demuxer.cpp
+++ b/dom/media/fmp4/MP4Demuxer.cpp
@@ -182,17 +182,16 @@ MP4Demuxer::Init()
if (NS_FAILED(audioTrackCount.Result()) && result == NS_OK) {
result = Move(audioTrackCount.Result());
}
if (NS_FAILED(videoTrackCount.Result()) && result == NS_OK) {
result = Move(videoTrackCount.Result());
}
if (audioTrackCount.Ref() != 0) {
- mAudioDemuxers.SetLength(audioTrackCount.Ref());
for (size_t i = 0; i < audioTrackCount.Ref(); i++) {
mp4_demuxer::MP4Metadata::ResultAndTrackInfo info =
metadata.GetTrackInfo(TrackInfo::kAudioTrack, i);
if (!info.Ref()) {
if (MediaPrefs::MediaWarningsAsErrors()) {
return InitPromise::CreateAndReject(
MediaResult(NS_ERROR_DOM_MEDIA_DEMUXER_ERR,
RESULT_DETAIL("Invalid MP4 audio track (%s)",
@@ -211,23 +210,22 @@ MP4Demuxer::Init()
mp4_demuxer::MP4Metadata::ResultAndIndice indices =
metadata.GetTrackIndice(info.Ref()->mTrackId);
if (!indices.Ref()) {
if (NS_FAILED(info.Result()) && result == NS_OK) {
result = Move(indices.Result());
}
continue;
}
- mAudioDemuxers[i] =
- new MP4TrackDemuxer(this, Move(info.Ref()), *indices.Ref().get());
+ mAudioDemuxers.AppendElement(
+ new MP4TrackDemuxer(this, Move(info.Ref()), *indices.Ref().get()));
}
}
if (videoTrackCount.Ref() != 0) {
- mVideoDemuxers.SetLength(videoTrackCount.Ref());
for (size_t i = 0; i < videoTrackCount.Ref(); i++) {
mp4_demuxer::MP4Metadata::ResultAndTrackInfo info =
metadata.GetTrackInfo(TrackInfo::kVideoTrack, i);
if (!info.Ref()) {
if (MediaPrefs::MediaWarningsAsErrors()) {
return InitPromise::CreateAndReject(
MediaResult(NS_ERROR_DOM_MEDIA_DEMUXER_ERR,
RESULT_DETAIL("Invalid MP4 video track (%s)",
@@ -246,18 +244,18 @@ MP4Demuxer::Init()
mp4_demuxer::MP4Metadata::ResultAndIndice indices =
metadata.GetTrackIndice(info.Ref()->mTrackId);
if (!indices.Ref()) {
if (NS_FAILED(info.Result()) && result == NS_OK) {
result = Move(indices.Result());
}
continue;
}
- mVideoDemuxers[i] =
- new MP4TrackDemuxer(this, Move(info.Ref()), *indices.Ref().get());
+ mVideoDemuxers.AppendElement(
+ new MP4TrackDemuxer(this, Move(info.Ref()), *indices.Ref().get()));
}
}
mp4_demuxer::MP4Metadata::ResultAndCryptoFile cryptoFile =
metadata.Crypto();
if (NS_FAILED(cryptoFile.Result()) && result == NS_OK) {
result = Move(cryptoFile.Result());
}