UniquePtr<TrackInfo> CreateTrackInfoWithMIMETypeAndContainerTypeExtraParameters( const nsACString& aCodecMIMEType, const MediaContainerType& aContainerType) { UniquePtr<TrackInfo> trackInfo = CreateTrackInfoWithMIMEType(aCodecMIMEType); if (trackInfo) { VideoInfo* videoInfo = trackInfo->GetAsVideoInfo(); if (videoInfo) { Maybe<int32_t> maybeWidth = aContainerType.ExtendedType().GetWidth(); if (maybeWidth && *maybeWidth > 0) { videoInfo->mImage.width = *maybeWidth; } Maybe<int32_t> maybeHeight = aContainerType.ExtendedType().GetHeight(); if (maybeHeight && *maybeHeight > 0) { videoInfo->mImage.height = *maybeHeight; } } else if (trackInfo->GetAsAudioInfo()) { AudioInfo* audioInfo = trackInfo->GetAsAudioInfo(); Maybe<int32_t> maybeChannels = aContainerType.ExtendedType().GetChannels(); if (maybeChannels && *maybeChannels > 0) { audioInfo->mChannels = *maybeChannels; } Maybe<int32_t> maybeSamplerate = aContainerType.ExtendedType().GetSamplerate(); if (maybeSamplerate && *maybeSamplerate > 0) { audioInfo->mRate = *maybeSamplerate; } } } return trackInfo; }
TEST(stagefright_MPEG4Metadata, test_case_mp4) { for (size_t test = 0; test < ArrayLength(testFiles); ++test) { nsTArray<uint8_t> buffer = ReadTestFile(testFiles[test].mFilename); ASSERT_FALSE(buffer.IsEmpty()); RefPtr<Stream> stream = new TestStream(buffer.Elements(), buffer.Length()); EXPECT_TRUE(MP4Metadata::HasCompleteMetadata(stream)); RefPtr<MediaByteBuffer> metadataBuffer = MP4Metadata::Metadata(stream); EXPECT_TRUE(metadataBuffer); MP4Metadata metadata(stream); EXPECT_EQ(0u, metadata.GetNumberTracks(TrackInfo::kUndefinedTrack)); EXPECT_EQ(testFiles[test].mNumberAudioTracks, metadata.GetNumberTracks(TrackInfo::kAudioTrack)); EXPECT_EQ(testFiles[test].mNumberVideoTracks, metadata.GetNumberTracks(TrackInfo::kVideoTrack)); EXPECT_EQ(0u, metadata.GetNumberTracks(TrackInfo::kTextTrack)); EXPECT_EQ(0u, metadata.GetNumberTracks(static_cast<TrackInfo::TrackType>(-1))); EXPECT_FALSE(metadata.GetTrackInfo(TrackInfo::kUndefinedTrack, 0)); UniquePtr<TrackInfo> trackInfo = metadata.GetTrackInfo(TrackInfo::kVideoTrack, 0); if (testFiles[test].mNumberVideoTracks == 0) { EXPECT_TRUE(!trackInfo); } else { ASSERT_TRUE(!!trackInfo); const VideoInfo* videoInfo = trackInfo->GetAsVideoInfo(); ASSERT_TRUE(!!videoInfo); EXPECT_TRUE(videoInfo->IsValid()); EXPECT_TRUE(videoInfo->IsVideo()); EXPECT_EQ(testFiles[test].mWidth, videoInfo->mDisplay.width); EXPECT_EQ(testFiles[test].mHeight, videoInfo->mDisplay.height); FallibleTArray<mp4_demuxer::Index::Indice> indices; EXPECT_TRUE(metadata.ReadTrackIndex(indices, videoInfo->mTrackId)); for (const mp4_demuxer::Index::Indice& indice : indices) { EXPECT_TRUE(indice.start_offset <= indice.end_offset); EXPECT_TRUE(indice.start_composition <= indice.end_composition); } } trackInfo = metadata.GetTrackInfo(TrackInfo::kAudioTrack, 0); if (testFiles[test].mNumberAudioTracks == 0) { EXPECT_TRUE(!trackInfo); } else { ASSERT_TRUE(!!trackInfo); const AudioInfo* audioInfo = trackInfo->GetAsAudioInfo(); ASSERT_TRUE(!!audioInfo); EXPECT_TRUE(audioInfo->IsValid()); EXPECT_TRUE(audioInfo->IsAudio()); FallibleTArray<mp4_demuxer::Index::Indice> indices; EXPECT_TRUE(metadata.ReadTrackIndex(indices, audioInfo->mTrackId)); for (const mp4_demuxer::Index::Indice& indice : indices) { EXPECT_TRUE(indice.start_offset <= indice.end_offset); EXPECT_TRUE(indice.start_composition <= indice.end_composition); } } EXPECT_FALSE(metadata.GetTrackInfo(TrackInfo::kTextTrack, 0)); EXPECT_FALSE(metadata.GetTrackInfo(static_cast<TrackInfo::TrackType>(-1), 0)); // We can see anywhere in any MPEG4. EXPECT_TRUE(metadata.CanSeek()); EXPECT_FALSE(metadata.Crypto().valid); } }