Do MpdBuilder test TODOs

- Added factory methods for creating Representation and AdaptationSet in
  tests.
- Since most tests only needed access to the constructors for
  Representation and AdaptationSet, instead of using
  FRIEND_TEST_ALL_PREFIXES() for each test case, added factory methods
  on the test class.
- Check the 'frameRate' attribute in
  CommonMpbBuilderTest.SetSampleDuration.

Change-Id: I57bd3a90b397f90c3a3a91de03eb96000f58ef58
This commit is contained in:
Rintaro Kuroiwa 2015-10-29 15:48:13 -07:00
parent cf0db383a3
commit 749571fc07
2 changed files with 146 additions and 119 deletions

View File

@ -281,6 +281,10 @@ class AdaptationSet {
base::AtomicSequenceNumber* representation_counter); base::AtomicSequenceNumber* representation_counter);
private: private:
friend class MpdBuilder;
template <MpdBuilder::MpdType type>
friend class MpdBuilderTest;
// kSegmentAlignmentUnknown means that it is uncertain if the // kSegmentAlignmentUnknown means that it is uncertain if the
// (sub)segments are aligned or not. // (sub)segments are aligned or not.
// kSegmentAlignmentTrue means that it is certain that the all the (current) // kSegmentAlignmentTrue means that it is certain that the all the (current)
@ -302,23 +306,6 @@ class AdaptationSet {
// 2 -> [0, 200, 400] // 2 -> [0, 200, 400]
typedef std::map<uint32_t, std::list<uint64_t> > RepresentationTimeline; typedef std::map<uint32_t, std::list<uint64_t> > RepresentationTimeline;
friend class MpdBuilder;
FRIEND_TEST_ALL_PREFIXES(CommonMpdBuilderTest, CheckAdaptationSetId);
FRIEND_TEST_ALL_PREFIXES(CommonMpdBuilderTest,
CheckAdaptationSetVideoContentType);
FRIEND_TEST_ALL_PREFIXES(CommonMpdBuilderTest,
CheckAdaptationSetAudioContentType);
FRIEND_TEST_ALL_PREFIXES(CommonMpdBuilderTest,
CheckAdaptationSetTextContentType);
FRIEND_TEST_ALL_PREFIXES(CommonMpdBuilderTest, SetAdaptationSetGroup);
FRIEND_TEST_ALL_PREFIXES(StaticMpdBuilderTest, SubSegmentAlignment);
FRIEND_TEST_ALL_PREFIXES(StaticMpdBuilderTest, ForceSetSubSegmentAlignment);
FRIEND_TEST_ALL_PREFIXES(DynamicMpdBuilderTest, SegmentAlignment);
FRIEND_TEST_ALL_PREFIXES(
CommonMpdBuilderTest,
SetAdaptationFrameRateUsingRepresentationSetSampleDuration);
// Gets the earliest, normalized segment timestamp. Returns true if // Gets the earliest, normalized segment timestamp. Returns true if
// successful, false otherwise. // successful, false otherwise.
bool GetEarliestTimestamp(double* timestamp_seconds); bool GetEarliestTimestamp(double* timestamp_seconds);
@ -506,20 +493,8 @@ class Representation {
private: private:
friend class AdaptationSet; friend class AdaptationSet;
template <MpdBuilder::MpdType type>
// TODO(rkuroiwa): Consider defining a public factory method that constructs friend class MpdBuilderTest;
// and Init()s, at least for testing.
FRIEND_TEST_ALL_PREFIXES(CommonMpdBuilderTest, ValidMediaInfo);
FRIEND_TEST_ALL_PREFIXES(CommonMpdBuilderTest, InvalidMediaInfo);
FRIEND_TEST_ALL_PREFIXES(CommonMpdBuilderTest, CheckVideoInfoReflectedInXml);
FRIEND_TEST_ALL_PREFIXES(CommonMpdBuilderTest, CheckRepresentationId);
FRIEND_TEST_ALL_PREFIXES(CommonMpdBuilderTest, SetSampleDuration);
FRIEND_TEST_ALL_PREFIXES(
CommonMpdBuilderTest,
RepresentationStateChangeListenerOnNewSegmentForRepresentation);
FRIEND_TEST_ALL_PREFIXES(
CommonMpdBuilderTest,
RepresentationStateChangeListenerOnSetFrameRateForRepresentation);
bool AddLiveInfo(xml::RepresentationXmlNode* representation); bool AddLiveInfo(xml::RepresentationXmlNode* representation);

View File

@ -95,7 +95,7 @@ class MockRepresentationStateChangeListener
} // namespace } // namespace
template <MpdBuilder::MpdType type> template <MpdBuilder::MpdType type>
class MpdBuilderTest: public ::testing::Test { class MpdBuilderTest : public ::testing::Test {
public: public:
MpdBuilderTest() : mpd_(type, MpdOptions()), representation_() {} MpdBuilderTest() : mpd_(type, MpdOptions()), representation_() {}
~MpdBuilderTest() override {} ~MpdBuilderTest() override {}
@ -121,6 +121,30 @@ class MpdBuilderTest: public ::testing::Test {
representation_ = representation; representation_ = representation;
} }
// TODO(rkuroiwa): Once std::forward() is allowed by chromium style guide, use
// variadic template and std::forward() so that we don't need to copy the
// constructor signatures.
scoped_ptr<Representation> CreateRepresentation(
const MediaInfo& media_info,
const MpdOptions& mpd_options,
uint32_t representation_id,
scoped_ptr<RepresentationStateChangeListener> state_change_listener) {
return make_scoped_ptr(new Representation(media_info, mpd_options,
representation_id,
state_change_listener.Pass()));
}
scoped_ptr<AdaptationSet> CreateAdaptationSet(
uint32_t adaptation_set_id,
const std::string& lang,
const MpdOptions& mpd_options,
MpdBuilder::MpdType mpd_type,
base::AtomicSequenceNumber* representation_counter) {
return make_scoped_ptr(new AdaptationSet(adaptation_set_id, lang,
mpd_options, mpd_type,
representation_counter));
}
// Helper function to return an empty listener for tests that don't need // Helper function to return an empty listener for tests that don't need
// it. // it.
scoped_ptr<RepresentationStateChangeListener> NoListener() { scoped_ptr<RepresentationStateChangeListener> NoListener() {
@ -353,17 +377,18 @@ class TimeShiftBufferDepthTest : public SegmentTemplateTest {
// Verify that AdaptationSet@group can be set and unset. // Verify that AdaptationSet@group can be set and unset.
TEST_F(CommonMpdBuilderTest, SetAdaptationSetGroup) { TEST_F(CommonMpdBuilderTest, SetAdaptationSetGroup) {
base::AtomicSequenceNumber sequence_counter; base::AtomicSequenceNumber sequence_counter;
AdaptationSet adaptation_set(kAnyAdaptationSetId, "", MpdOptions(), auto adaptation_set =
MpdBuilder::kStatic, &sequence_counter); CreateAdaptationSet(kAnyAdaptationSetId, "", MpdOptions(),
adaptation_set.SetGroup(1); MpdBuilder::kStatic, &sequence_counter);
adaptation_set->SetGroup(1);
xml::ScopedXmlPtr<xmlNode>::type xml_with_group(adaptation_set.GetXml()); xml::ScopedXmlPtr<xmlNode>::type xml_with_group(adaptation_set->GetXml());
EXPECT_NO_FATAL_FAILURE( EXPECT_NO_FATAL_FAILURE(
ExpectAttributeEqString("group", "1", xml_with_group.get())); ExpectAttributeEqString("group", "1", xml_with_group.get()));
// Unset by passing a negative value. // Unset by passing a negative value.
adaptation_set.SetGroup(-1); adaptation_set->SetGroup(-1);
xml::ScopedXmlPtr<xmlNode>::type xml_without_group(adaptation_set.GetXml()); xml::ScopedXmlPtr<xmlNode>::type xml_without_group(adaptation_set->GetXml());
EXPECT_NO_FATAL_FAILURE( EXPECT_NO_FATAL_FAILURE(
ExpectAttributeNotSet("group", xml_without_group.get())); ExpectAttributeNotSet("group", xml_without_group.get()));
} }
@ -382,10 +407,11 @@ TEST_F(CommonMpdBuilderTest, ValidMediaInfo) {
" pixel_height: 1\n" " pixel_height: 1\n"
"}\n" "}\n"
"container_type: 1\n"; "container_type: 1\n";
Representation representation(ConvertToMediaInfo(kTestMediaInfo),
MpdOptions(), kAnyRepresentationId, auto representation =
NoListener()); CreateRepresentation(ConvertToMediaInfo(kTestMediaInfo), MpdOptions(),
EXPECT_TRUE(representation.Init()); kAnyRepresentationId, NoListener());
EXPECT_TRUE(representation->Init());
} }
// Verify that Representation::Init() fails if a required field is missing. // Verify that Representation::Init() fails if a required field is missing.
@ -401,10 +427,10 @@ TEST_F(CommonMpdBuilderTest, InvalidMediaInfo) {
" pixel_height: 1\n" " pixel_height: 1\n"
"}\n" "}\n"
"container_type: 1\n"; "container_type: 1\n";
Representation representation(ConvertToMediaInfo(kTestMediaInfo), auto representation =
MpdOptions(), kAnyRepresentationId, CreateRepresentation(ConvertToMediaInfo(kTestMediaInfo), MpdOptions(),
NoListener()); kAnyRepresentationId, NoListener());
EXPECT_FALSE(representation.Init()); EXPECT_FALSE(representation->Init());
} }
// Basic check that the fields in video info are in the XML. // Basic check that the fields in video info are in the XML.
@ -420,11 +446,11 @@ TEST_F(CommonMpdBuilderTest, CheckVideoInfoReflectedInXml) {
" pixel_height: 1\n" " pixel_height: 1\n"
"}\n" "}\n"
"container_type: 1\n"; "container_type: 1\n";
Representation representation(ConvertToMediaInfo(kTestMediaInfo), auto representation =
MpdOptions(), kAnyRepresentationId, CreateRepresentation(ConvertToMediaInfo(kTestMediaInfo), MpdOptions(),
NoListener()); kAnyRepresentationId, NoListener());
EXPECT_TRUE(representation.Init()); EXPECT_TRUE(representation->Init());
xml::ScopedXmlPtr<xmlNode>::type node_xml(representation.GetXml()); xml::ScopedXmlPtr<xmlNode>::type node_xml(representation->GetXml());
EXPECT_NO_FATAL_FAILURE( EXPECT_NO_FATAL_FAILURE(
ExpectAttributeEqString("codecs", "avc1", node_xml.get())); ExpectAttributeEqString("codecs", "avc1", node_xml.get()));
EXPECT_NO_FATAL_FAILURE( EXPECT_NO_FATAL_FAILURE(
@ -459,12 +485,12 @@ TEST_F(CommonMpdBuilderTest,
new MockRepresentationStateChangeListener()); new MockRepresentationStateChangeListener());
EXPECT_CALL(*listener, EXPECT_CALL(*listener,
OnNewSegmentForRepresentation(kStartTime, kDuration)); OnNewSegmentForRepresentation(kStartTime, kDuration));
Representation representation(ConvertToMediaInfo(kTestMediaInfo), auto representation = CreateRepresentation(ConvertToMediaInfo(kTestMediaInfo),
MpdOptions(), kAnyRepresentationId, MpdOptions(), kAnyRepresentationId,
listener.Pass()); listener.Pass());
EXPECT_TRUE(representation.Init()); EXPECT_TRUE(representation->Init());
representation.AddNewSegment(kStartTime, kDuration, 10 /* any size */); representation->AddNewSegment(kStartTime, kDuration, 10 /* any size */);
} }
// Make sure // Make sure
@ -490,12 +516,12 @@ TEST_F(CommonMpdBuilderTest,
new MockRepresentationStateChangeListener()); new MockRepresentationStateChangeListener());
EXPECT_CALL(*listener, EXPECT_CALL(*listener,
OnSetFrameRateForRepresentation(kFrameDuration, kTimeScale)); OnSetFrameRateForRepresentation(kFrameDuration, kTimeScale));
Representation representation(ConvertToMediaInfo(kTestMediaInfo), auto representation =
MpdOptions(), kAnyRepresentationId, CreateRepresentation(ConvertToMediaInfo(kTestMediaInfo), MpdOptions(),
listener.Pass()); kAnyRepresentationId, listener.Pass());
EXPECT_TRUE(representation.Init()); EXPECT_TRUE(representation->Init());
representation.SetSampleDuration(kFrameDuration); representation->SetSampleDuration(kFrameDuration);
} }
// Verify that content type is set correctly if video info is present in // Verify that content type is set correctly if video info is present in
@ -514,11 +540,12 @@ TEST_F(CommonMpdBuilderTest, CheckAdaptationSetVideoContentType) {
"}\n" "}\n"
"container_type: 1\n"; "container_type: 1\n";
AdaptationSet adaptation_set(kAnyAdaptationSetId, "", MpdOptions(), auto adaptation_set =
MpdBuilder::kStatic, &sequence_counter); CreateAdaptationSet(kAnyAdaptationSetId, "", MpdOptions(),
adaptation_set.AddRepresentation(ConvertToMediaInfo(kVideoMediaInfo)); MpdBuilder::kStatic, &sequence_counter);
adaptation_set->AddRepresentation(ConvertToMediaInfo(kVideoMediaInfo));
xml::ScopedXmlPtr<xmlNode>::type node_xml(adaptation_set.GetXml()); xml::ScopedXmlPtr<xmlNode>::type node_xml(adaptation_set->GetXml());
EXPECT_NO_FATAL_FAILURE( EXPECT_NO_FATAL_FAILURE(
ExpectAttributeEqString("contentType", "video", node_xml.get())); ExpectAttributeEqString("contentType", "video", node_xml.get()));
} }
@ -536,11 +563,12 @@ TEST_F(CommonMpdBuilderTest, CheckAdaptationSetAudioContentType) {
"}\n" "}\n"
"container_type: 1\n"; "container_type: 1\n";
AdaptationSet adaptation_set(kAnyAdaptationSetId, "", MpdOptions(), auto adaptation_set =
MpdBuilder::kStatic, &sequence_counter); CreateAdaptationSet(kAnyAdaptationSetId, "", MpdOptions(),
adaptation_set.AddRepresentation(ConvertToMediaInfo(kAudioMediaInfo)); MpdBuilder::kStatic, &sequence_counter);
adaptation_set->AddRepresentation(ConvertToMediaInfo(kAudioMediaInfo));
xml::ScopedXmlPtr<xmlNode>::type node_xml(adaptation_set.GetXml()); xml::ScopedXmlPtr<xmlNode>::type node_xml(adaptation_set->GetXml());
EXPECT_NO_FATAL_FAILURE( EXPECT_NO_FATAL_FAILURE(
ExpectAttributeEqString("contentType", "audio", node_xml.get())); ExpectAttributeEqString("contentType", "audio", node_xml.get()));
} }
@ -559,11 +587,12 @@ TEST_F(CommonMpdBuilderTest, DISABLED_CheckAdaptationSetTextContentType) {
"}\n" "}\n"
"container_type: 1\n"; "container_type: 1\n";
AdaptationSet adaptation_set(kAnyAdaptationSetId, "", MpdOptions(), auto adaptation_set =
MpdBuilder::kStatic, &sequence_counter); CreateAdaptationSet(kAnyAdaptationSetId, "", MpdOptions(),
adaptation_set.AddRepresentation(ConvertToMediaInfo(kTextMediaInfo)); MpdBuilder::kStatic, &sequence_counter);
adaptation_set->AddRepresentation(ConvertToMediaInfo(kTextMediaInfo));
xml::ScopedXmlPtr<xmlNode>::type node_xml(adaptation_set.GetXml()); xml::ScopedXmlPtr<xmlNode>::type node_xml(adaptation_set->GetXml());
EXPECT_NO_FATAL_FAILURE( EXPECT_NO_FATAL_FAILURE(
ExpectAttributeEqString("contentType", "text", node_xml.get())); ExpectAttributeEqString("contentType", "text", node_xml.get()));
} }
@ -571,9 +600,10 @@ TEST_F(CommonMpdBuilderTest, DISABLED_CheckAdaptationSetTextContentType) {
TEST_F(CommonMpdBuilderTest, CheckAdaptationSetId) { TEST_F(CommonMpdBuilderTest, CheckAdaptationSetId) {
base::AtomicSequenceNumber sequence_counter; base::AtomicSequenceNumber sequence_counter;
const uint32_t kAdaptationSetId = 42; const uint32_t kAdaptationSetId = 42;
AdaptationSet adaptation_set(kAdaptationSetId, "", MpdOptions(), auto adaptation_set =
MpdBuilder::kStatic, &sequence_counter); CreateAdaptationSet(kAdaptationSetId, "", MpdOptions(),
ASSERT_NO_FATAL_FAILURE(CheckIdEqual(kAdaptationSetId, &adaptation_set)); MpdBuilder::kStatic, &sequence_counter);
ASSERT_NO_FATAL_FAILURE(CheckIdEqual(kAdaptationSetId, adaptation_set.get()));
} }
// Verify AdaptationSet::AddRole() works for "main" role. // Verify AdaptationSet::AddRole() works for "main" role.
@ -763,16 +793,17 @@ TEST_F(CommonMpdBuilderTest,
"}\n" "}\n"
"container_type: 1\n"; "container_type: 1\n";
AdaptationSet adaptation_set(kAnyAdaptationSetId, "", MpdOptions(), auto adaptation_set =
MpdBuilder::kStatic, &sequence_counter); CreateAdaptationSet(kAnyAdaptationSetId, "", MpdOptions(),
MpdBuilder::kStatic, &sequence_counter);
Representation* representation_480p = Representation* representation_480p =
adaptation_set.AddRepresentation(ConvertToMediaInfo(k480pMediaInfo)); adaptation_set->AddRepresentation(ConvertToMediaInfo(k480pMediaInfo));
Representation* representation_360p = Representation* representation_360p =
adaptation_set.AddRepresentation(ConvertToMediaInfo(k360pMediaInfo)); adaptation_set->AddRepresentation(ConvertToMediaInfo(k360pMediaInfo));
// First, make sure that maxFrameRate nor frameRate are set because // First, make sure that maxFrameRate nor frameRate are set because
// frame durations were not provided in the MediaInfo. // frame durations were not provided in the MediaInfo.
xml::ScopedXmlPtr<xmlNode>::type no_frame_rate(adaptation_set.GetXml()); xml::ScopedXmlPtr<xmlNode>::type no_frame_rate(adaptation_set->GetXml());
EXPECT_NO_FATAL_FAILURE( EXPECT_NO_FATAL_FAILURE(
ExpectAttributeNotSet("maxFrameRate", no_frame_rate.get())); ExpectAttributeNotSet("maxFrameRate", no_frame_rate.get()));
EXPECT_NO_FATAL_FAILURE( EXPECT_NO_FATAL_FAILURE(
@ -784,7 +815,7 @@ TEST_F(CommonMpdBuilderTest,
representation_480p->SetSampleDuration(kSameFrameDuration); representation_480p->SetSampleDuration(kSameFrameDuration);
representation_360p->SetSampleDuration(kSameFrameDuration); representation_360p->SetSampleDuration(kSameFrameDuration);
xml::ScopedXmlPtr<xmlNode>::type same_frame_rate(adaptation_set.GetXml()); xml::ScopedXmlPtr<xmlNode>::type same_frame_rate(adaptation_set->GetXml());
EXPECT_NO_FATAL_FAILURE( EXPECT_NO_FATAL_FAILURE(
ExpectAttributeNotSet("maxFrameRate", same_frame_rate.get())); ExpectAttributeNotSet("maxFrameRate", same_frame_rate.get()));
EXPECT_NO_FATAL_FAILURE( EXPECT_NO_FATAL_FAILURE(
@ -796,7 +827,7 @@ TEST_F(CommonMpdBuilderTest,
frame_duration_must_be_shorter_for_max_frame_rate); frame_duration_must_be_shorter_for_max_frame_rate);
representation_480p->SetSampleDuration(k5FPSFrameDuration); representation_480p->SetSampleDuration(k5FPSFrameDuration);
xml::ScopedXmlPtr<xmlNode>::type max_frame_rate(adaptation_set.GetXml()); xml::ScopedXmlPtr<xmlNode>::type max_frame_rate(adaptation_set->GetXml());
EXPECT_NO_FATAL_FAILURE( EXPECT_NO_FATAL_FAILURE(
ExpectAttributeEqString("maxFrameRate", "10/2", max_frame_rate.get())); ExpectAttributeEqString("maxFrameRate", "10/2", max_frame_rate.get()));
EXPECT_NO_FATAL_FAILURE( EXPECT_NO_FATAL_FAILURE(
@ -1010,25 +1041,26 @@ TEST_F(StaticMpdBuilderTest, SubSegmentAlignment) {
const uint64_t kDuration = 10u; const uint64_t kDuration = 10u;
const uint64_t kAnySize = 19834u; const uint64_t kAnySize = 19834u;
AdaptationSet adaptation_set(kAnyAdaptationSetId, "", MpdOptions(), auto adaptation_set =
MpdBuilder::kStatic, &sequence_counter); CreateAdaptationSet(kAnyAdaptationSetId, "", MpdOptions(),
MpdBuilder::kStatic, &sequence_counter);
Representation* representation_480p = Representation* representation_480p =
adaptation_set.AddRepresentation(ConvertToMediaInfo(k480pMediaInfo)); adaptation_set->AddRepresentation(ConvertToMediaInfo(k480pMediaInfo));
// Add a subsegment immediately before adding the 360p Representation. // Add a subsegment immediately before adding the 360p Representation.
// This should still work for VOD. // This should still work for VOD.
representation_480p->AddNewSegment(kStartTime, kDuration, kAnySize); representation_480p->AddNewSegment(kStartTime, kDuration, kAnySize);
Representation* representation_360p = Representation* representation_360p =
adaptation_set.AddRepresentation(ConvertToMediaInfo(k360pMediaInfo)); adaptation_set->AddRepresentation(ConvertToMediaInfo(k360pMediaInfo));
representation_360p->AddNewSegment(kStartTime, kDuration, kAnySize); representation_360p->AddNewSegment(kStartTime, kDuration, kAnySize);
xml::ScopedXmlPtr<xmlNode>::type aligned(adaptation_set.GetXml()); xml::ScopedXmlPtr<xmlNode>::type aligned(adaptation_set->GetXml());
EXPECT_NO_FATAL_FAILURE( EXPECT_NO_FATAL_FAILURE(
ExpectAttributeEqString("subSegmentAlignment", "true", aligned.get())); ExpectAttributeEqString("subSegmentAlignment", "true", aligned.get()));
// Unknown because 480p has an extra subsegments. // Unknown because 480p has an extra subsegments.
representation_480p->AddNewSegment(11, 20, kAnySize); representation_480p->AddNewSegment(11, 20, kAnySize);
xml::ScopedXmlPtr<xmlNode>::type alignment_unknown(adaptation_set.GetXml()); xml::ScopedXmlPtr<xmlNode>::type alignment_unknown(adaptation_set->GetXml());
EXPECT_NO_FATAL_FAILURE( EXPECT_NO_FATAL_FAILURE(
ExpectAttributeNotSet("subSegmentAlignment", alignment_unknown.get())); ExpectAttributeNotSet("subSegmentAlignment", alignment_unknown.get()));
@ -1036,7 +1068,7 @@ TEST_F(StaticMpdBuilderTest, SubSegmentAlignment) {
representation_360p->AddNewSegment(10, 1, kAnySize); representation_360p->AddNewSegment(10, 1, kAnySize);
representation_360p->AddNewSegment(11, 19, kAnySize); representation_360p->AddNewSegment(11, 19, kAnySize);
xml::ScopedXmlPtr<xmlNode>::type unaligned(adaptation_set.GetXml()); xml::ScopedXmlPtr<xmlNode>::type unaligned(adaptation_set->GetXml());
EXPECT_NO_FATAL_FAILURE( EXPECT_NO_FATAL_FAILURE(
ExpectAttributeNotSet("subSegmentAlignment", unaligned.get())); ExpectAttributeNotSet("subSegmentAlignment", unaligned.get()));
} }
@ -1066,12 +1098,13 @@ TEST_F(StaticMpdBuilderTest, ForceSetSubSegmentAlignment) {
" pixel_height: 1\n" " pixel_height: 1\n"
"}\n" "}\n"
"container_type: 1\n"; "container_type: 1\n";
AdaptationSet adaptation_set(kAnyAdaptationSetId, "", MpdOptions(), auto adaptation_set =
MpdBuilder::kStatic, &sequence_counter); CreateAdaptationSet(kAnyAdaptationSetId, "", MpdOptions(),
MpdBuilder::kStatic, &sequence_counter);
Representation* representation_480p = Representation* representation_480p =
adaptation_set.AddRepresentation(ConvertToMediaInfo(k480pMediaInfo)); adaptation_set->AddRepresentation(ConvertToMediaInfo(k480pMediaInfo));
Representation* representation_360p = Representation* representation_360p =
adaptation_set.AddRepresentation(ConvertToMediaInfo(k360pMediaInfo)); adaptation_set->AddRepresentation(ConvertToMediaInfo(k360pMediaInfo));
// Use different starting times to make the segments "not aligned". // Use different starting times to make the segments "not aligned".
const uint64_t kStartTime1 = 1u; const uint64_t kStartTime1 = 1u;
@ -1081,13 +1114,13 @@ TEST_F(StaticMpdBuilderTest, ForceSetSubSegmentAlignment) {
const uint64_t kAnySize = 19834u; const uint64_t kAnySize = 19834u;
representation_480p->AddNewSegment(kStartTime1, kDuration, kAnySize); representation_480p->AddNewSegment(kStartTime1, kDuration, kAnySize);
representation_360p->AddNewSegment(kStartTime2, kDuration, kAnySize); representation_360p->AddNewSegment(kStartTime2, kDuration, kAnySize);
xml::ScopedXmlPtr<xmlNode>::type unaligned(adaptation_set.GetXml()); xml::ScopedXmlPtr<xmlNode>::type unaligned(adaptation_set->GetXml());
EXPECT_NO_FATAL_FAILURE( EXPECT_NO_FATAL_FAILURE(
ExpectAttributeNotSet("subSegmentAlignment", unaligned.get())); ExpectAttributeNotSet("subSegmentAlignment", unaligned.get()));
// Then force set the segment alignment attribute to true. // Then force set the segment alignment attribute to true.
adaptation_set.ForceSetSegmentAlignment(true); adaptation_set->ForceSetSegmentAlignment(true);
xml::ScopedXmlPtr<xmlNode>::type aligned(adaptation_set.GetXml()); xml::ScopedXmlPtr<xmlNode>::type aligned(adaptation_set->GetXml());
EXPECT_NO_FATAL_FAILURE( EXPECT_NO_FATAL_FAILURE(
ExpectAttributeEqString("subSegmentAlignment", "true", aligned.get())); ExpectAttributeEqString("subSegmentAlignment", "true", aligned.get()));
} }
@ -1118,12 +1151,13 @@ TEST_F(DynamicMpdBuilderTest, SegmentAlignment) {
" pixel_height: 1\n" " pixel_height: 1\n"
"}\n" "}\n"
"container_type: 1\n"; "container_type: 1\n";
AdaptationSet adaptation_set(kAnyAdaptationSetId, "", MpdOptions(), auto adaptation_set =
MpdBuilder::kDynamic, &sequence_counter); CreateAdaptationSet(kAnyAdaptationSetId, "", MpdOptions(),
MpdBuilder::kDynamic, &sequence_counter);
Representation* representation_480p = Representation* representation_480p =
adaptation_set.AddRepresentation(ConvertToMediaInfo(k480pMediaInfo)); adaptation_set->AddRepresentation(ConvertToMediaInfo(k480pMediaInfo));
Representation* representation_360p = Representation* representation_360p =
adaptation_set.AddRepresentation(ConvertToMediaInfo(k360pMediaInfo)); adaptation_set->AddRepresentation(ConvertToMediaInfo(k360pMediaInfo));
// First use same start time and duration, and verify that that // First use same start time and duration, and verify that that
// segmentAlignment is set. // segmentAlignment is set.
@ -1132,7 +1166,7 @@ TEST_F(DynamicMpdBuilderTest, SegmentAlignment) {
const uint64_t kAnySize = 19834u; const uint64_t kAnySize = 19834u;
representation_480p->AddNewSegment(kStartTime, kDuration, kAnySize); representation_480p->AddNewSegment(kStartTime, kDuration, kAnySize);
representation_360p->AddNewSegment(kStartTime, kDuration, kAnySize); representation_360p->AddNewSegment(kStartTime, kDuration, kAnySize);
xml::ScopedXmlPtr<xmlNode>::type aligned(adaptation_set.GetXml()); xml::ScopedXmlPtr<xmlNode>::type aligned(adaptation_set->GetXml());
EXPECT_NO_FATAL_FAILURE( EXPECT_NO_FATAL_FAILURE(
ExpectAttributeEqString("segmentAlignment", "true", aligned.get())); ExpectAttributeEqString("segmentAlignment", "true", aligned.get()));
@ -1141,7 +1175,7 @@ TEST_F(DynamicMpdBuilderTest, SegmentAlignment) {
representation_360p->AddNewSegment(10, 1, kAnySize); representation_360p->AddNewSegment(10, 1, kAnySize);
representation_360p->AddNewSegment(11, 19, kAnySize); representation_360p->AddNewSegment(11, 19, kAnySize);
xml::ScopedXmlPtr<xmlNode>::type unaligned(adaptation_set.GetXml()); xml::ScopedXmlPtr<xmlNode>::type unaligned(adaptation_set->GetXml());
EXPECT_NO_FATAL_FAILURE( EXPECT_NO_FATAL_FAILURE(
ExpectAttributeNotSet("subSegmentAlignment", unaligned.get())); ExpectAttributeNotSet("subSegmentAlignment", unaligned.get()));
} }
@ -1231,26 +1265,44 @@ TEST_F(CommonMpdBuilderTest, CheckRepresentationId) {
const MediaInfo video_media_info = GetTestMediaInfo(kFileNameVideoMediaInfo1); const MediaInfo video_media_info = GetTestMediaInfo(kFileNameVideoMediaInfo1);
const uint32_t kRepresentationId = 1; const uint32_t kRepresentationId = 1;
Representation representation( auto representation = CreateRepresentation(video_media_info, MpdOptions(),
video_media_info, MpdOptions(), kRepresentationId, NoListener()); kRepresentationId, NoListener());
EXPECT_TRUE(representation.Init()); EXPECT_TRUE(representation->Init());
ASSERT_NO_FATAL_FAILURE(CheckIdEqual(kRepresentationId, &representation)); ASSERT_NO_FATAL_FAILURE(
CheckIdEqual(kRepresentationId, representation.get()));
} }
// TODO(rkuroiwa): Better way to test this is to use GetXml(). Check that // Verify that Representation::SetSampleDuration() works by checking that
// frameRate is set once the patch that adds frameRate attribute lands. // AdaptationSet@frameRate is in the XML.
// For now, check that media_info_ owned by Representation has
// frame_duration = sample_duration.
TEST_F(CommonMpdBuilderTest, SetSampleDuration) { TEST_F(CommonMpdBuilderTest, SetSampleDuration) {
const MediaInfo video_media_info = GetTestMediaInfo(kFileNameVideoMediaInfo1); // Omit frame_duration so that SetSampleDuration() will set a new frameRate.
const uint32_t kRepresentationId = 1; const char kVideoMediaInfo[] =
"video_info {\n"
" codec: \"avc1\"\n"
" width: 1920\n"
" height: 1080\n"
" time_scale: 3000\n"
"}\n"
"container_type: 1\n";
Representation representation( base::AtomicSequenceNumber sequence_counter;
video_media_info, MpdOptions(), kRepresentationId, NoListener()); auto adaptation_set =
EXPECT_TRUE(representation.Init()); CreateAdaptationSet(kAnyAdaptationSetId, "", MpdOptions(),
representation.SetSampleDuration(2u); MpdBuilder::kStatic, &sequence_counter);
EXPECT_EQ(2u,
representation.media_info_.video_info().frame_duration()); const MediaInfo video_media_info = ConvertToMediaInfo(kVideoMediaInfo);
Representation* representation =
adaptation_set->AddRepresentation(video_media_info);
EXPECT_TRUE(representation->Init());
xml::ScopedXmlPtr<xmlNode>::type adaptation_set_xml(adaptation_set->GetXml());
EXPECT_NO_FATAL_FAILURE(
ExpectAttributeNotSet("frameRate", adaptation_set_xml.get()));
representation->SetSampleDuration(2u);
adaptation_set_xml = adaptation_set->GetXml().Pass();
EXPECT_NO_FATAL_FAILURE(
ExpectAttributeEqString("frameRate", "3000/2", adaptation_set_xml.get()));
} }
// Verify that AdaptationSet::AddContentProtection() and // Verify that AdaptationSet::AddContentProtection() and