TestVideoFrameContainer.cpp (2492B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 5 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "ImageContainer.h" 8 #include "MockMediaDecoderOwner.h" 9 #include "TimeUnits.h" 10 #include "VideoFrameContainer.h" 11 #include "gmock/gmock.h" 12 #include "gtest/gtest.h" 13 #include "nsContentUtils.h" 14 15 using namespace mozilla; 16 using namespace mozilla::layers; 17 18 using testing::InSequence; 19 using testing::MockFunction; 20 using testing::StrEq; 21 22 TEST(TestVideoFrameContainer, UpdatePrincipalHandleForFrameID) 23 { 24 auto owner = std::make_unique<MockMediaDecoderOwner>(); 25 PrincipalHandle principal = 26 MakePrincipalHandle(nsContentUtils::GetSystemPrincipal()); 27 RefPtr container = new VideoFrameContainer( 28 owner.get(), 29 MakeAndAddRef<ImageContainer>(ImageUsageType::VideoFrameContainer, 30 ImageContainer::ASYNCHRONOUS)); 31 MockFunction<void(const char* name)> checkpoint; 32 { 33 InSequence s; 34 EXPECT_CALL(checkpoint, Call(StrEq("id2 is first"))).Times(1); 35 EXPECT_CALL(*owner, PrincipalHandleChangedForVideoFrameContainer( 36 container.get(), principal)) 37 .Times(1); 38 } 39 40 auto image = container->GetImageContainer()->CreatePlanarYCbCrImage(); 41 AutoTArray<ImageContainer::NonOwningImage, 2> images; 42 images.AppendElements(2); 43 TimeStamp timeStamp = TimeStamp::Now(); 44 for (auto& imageRef : images) { 45 imageRef.mFrameID = container->NewFrameID(); 46 imageRef.mImage = image; 47 imageRef.mTimeStamp = timeStamp; 48 timeStamp += TimeDuration::FromSeconds(0.1); 49 } 50 gfx::IntSize intrinsicSize; 51 container->SetCurrentFrames(intrinsicSize, images); 52 53 ImageContainer::FrameID id2 = container->NewFrameID(); 54 container->UpdatePrincipalHandleForFrameID(principal, id2); 55 images.RemoveElementAt(0); 56 auto image2 = images.AppendElement(); 57 image2->mFrameID = id2; 58 image2->mImage = image; 59 image2->mTimeStamp = timeStamp; 60 container->SetCurrentFrames(intrinsicSize, images); 61 // Check no pending NotifyDecoderPrincipalChanged() event. 62 NS_ProcessPendingEvents(nullptr); 63 64 images.RemoveElementAt(0); 65 container->SetCurrentFrames(intrinsicSize, images); 66 checkpoint.Call("id2 is first"); 67 // Process NotifyDecoderPrincipalChanged() event. 68 NS_ProcessPendingEvents(nullptr); 69 }