From 75a4b55b34f9c5a6530904c482cfe9d05edbbe2b Mon Sep 17 00:00:00 2001 From: Kongqun Yang Date: Mon, 10 Apr 2017 13:20:45 -0700 Subject: [PATCH] Fix AAC-HE not correctly signaled in codec string - Also fixed a bug with dts audio in esds. Closes #225 Change-Id: I50ca731ac81bedfec37b0e2d577c51d643b7a839 --- packager/app/test/packager_test.py | 10 ++ ...ear-640x360-aac_he-silent_right-golden.mp4 | Bin 0 -> 24539 bytes ...ear-640x360-aac_he-silent_right-golden.mpd | 15 +++ .../media/codecs/aac_audio_specific_config.cc | 42 ++++---- .../media/codecs/aac_audio_specific_config.h | 98 +++++++++++++----- .../aac_audio_specific_config_unittest.cc | 52 ++++++---- .../formats/mp2t/program_map_table_writer.cc | 13 +-- .../media/formats/mp4/mp4_media_parser.cc | 9 +- .../media/formats/wvm/wvm_media_parser.cc | 7 +- packager/media/test/data/README | 2 + .../data/bear-640x360-aac_he-silent_right.mp4 | Bin 0 -> 24087 bytes .../data/bear-640x360-aac_lc-silent_right.mp4 | Bin 0 -> 43213 bytes 12 files changed, 170 insertions(+), 78 deletions(-) create mode 100644 packager/app/test/testdata/bear-640x360-aac_he-silent_right-golden.mp4 create mode 100644 packager/app/test/testdata/bear-640x360-aac_he-silent_right-golden.mpd create mode 100644 packager/media/test/data/bear-640x360-aac_he-silent_right.mp4 create mode 100644 packager/media/test/data/bear-640x360-aac_lc-silent_right.mp4 diff --git a/packager/app/test/packager_test.py b/packager/app/test/packager_test.py index 3164c1c576..399837e441 100755 --- a/packager/app/test/packager_test.py +++ b/packager/app/test/packager_test.py @@ -117,6 +117,16 @@ class PackagerAppTest(unittest.TestCase): self._DiffGold(self.output[1], 'bear-640x360-v-golden.mp4') self._DiffGold(self.mpd_output, 'bear-640x360-av-por-BR-golden.mpd') + def testPackageAacHe(self): + self.packager.Package( + self._GetStreams( + ['audio'], test_files=['bear-640x360-aac_he-silent_right.mp4']), + self._GetFlags()) + self._DiffGold(self.output[0], + 'bear-640x360-aac_he-silent_right-golden.mp4') + self._DiffGold(self.mpd_output, + 'bear-640x360-aac_he-silent_right-golden.mpd') + # Package all video, audio, and text. def testPackageVideoAudioText(self): audio_video_streams = self._GetStreams(['audio', 'video']) diff --git a/packager/app/test/testdata/bear-640x360-aac_he-silent_right-golden.mp4 b/packager/app/test/testdata/bear-640x360-aac_he-silent_right-golden.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..1bc42a7c7816cf6c4938c7153ec453e75a5bfdff GIT binary patch literal 24539 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 + + + + + + + output_audio.mp4 + + + + + + + diff --git a/packager/media/codecs/aac_audio_specific_config.cc b/packager/media/codecs/aac_audio_specific_config.cc index 128b1c4bbd..7783405f47 100644 --- a/packager/media/codecs/aac_audio_specific_config.cc +++ b/packager/media/codecs/aac_audio_specific_config.cc @@ -25,14 +25,7 @@ const uint8_t kChannelConfigs[] = {0, 1, 2, 3, 4, 5, 6, 8}; namespace shaka { namespace media { -AACAudioSpecificConfig::AACAudioSpecificConfig() - : audio_object_type_(0), - frequency_index_(0), - channel_config_(0), - ps_present_(false), - frequency_(0), - extension_frequency_(0), - num_channels_(0) {} +AACAudioSpecificConfig::AACAudioSpecificConfig() {} AACAudioSpecificConfig::~AACAudioSpecificConfig() {} @@ -41,9 +34,10 @@ bool AACAudioSpecificConfig::Parse(const std::vector& data) { return false; BitReader reader(&data[0], data.size()); - uint8_t extension_type = 0; + uint8_t extension_type = AOT_NULL; uint8_t extension_frequency_index = 0xff; + sbr_present_ = false; ps_present_ = false; frequency_ = 0; extension_frequency_ = 0; @@ -62,9 +56,10 @@ bool AACAudioSpecificConfig::Parse(const std::vector& data) { RCHECK(reader.ReadBits(4, &channel_config_)); // Read extension configuration. - if (audio_object_type_ == 5 || audio_object_type_ == 29) { - ps_present_ = (audio_object_type_ == 29); - extension_type = 5; + if (audio_object_type_ == AOT_SBR || audio_object_type_ == AOT_PS) { + sbr_present_ = audio_object_type_ == AOT_SBR; + ps_present_ = audio_object_type_ == AOT_PS; + extension_type = AOT_SBR; RCHECK(reader.ReadBits(4, &extension_frequency_index)); if (extension_frequency_index == 0xf) RCHECK(reader.ReadBits(24, &extension_frequency_)); @@ -78,7 +73,7 @@ bool AACAudioSpecificConfig::Parse(const std::vector& data) { // Read extension configuration again // Note: The check for 16 available bits comes from the AAC spec. - if (extension_type != 5 && reader.bits_available() >= 16) { + if (extension_type != AOT_SBR && reader.bits_available() >= 16) { uint16_t sync_extension_type; uint8_t sbr_present_flag; uint8_t ps_present_flag; @@ -87,6 +82,7 @@ bool AACAudioSpecificConfig::Parse(const std::vector& data) { sync_extension_type == 0x2b7) { if (reader.ReadBits(5, &extension_type) && extension_type == 5) { RCHECK(reader.ReadBits(1, &sbr_present_flag)); + sbr_present_ = sbr_present_flag != 0; if (sbr_present_flag) { RCHECK(reader.ReadBits(4, &extension_frequency_index)); @@ -141,7 +137,7 @@ bool AACAudioSpecificConfig::ConvertToADTS(std::vector* buffer) const { adts[0] = 0xff; adts[1] = 0xf1; adts[2] = ((audio_object_type_ - 1) << 6) + (frequency_index_ << 2) + - (channel_config_ >> 2); + (channel_config_ >> 2); adts[3] = ((channel_config_ & 0x3) << 6) + static_cast(size >> 11); adts[4] = static_cast((size & 0x7ff) >> 3); adts[5] = static_cast(((size & 7) << 5) + 0x1f); @@ -150,12 +146,20 @@ bool AACAudioSpecificConfig::ConvertToADTS(std::vector* buffer) const { return true; } -uint32_t AACAudioSpecificConfig::GetOutputSamplesPerSecond( - bool sbr_in_mimetype) const { +AACAudioSpecificConfig::AudioObjectType +AACAudioSpecificConfig::GetAudioObjectType() const { + if (ps_present_) + return AOT_PS; + if (sbr_present_) + return AOT_SBR; + return audio_object_type_; +} + +uint32_t AACAudioSpecificConfig::GetSamplesPerSecond() const { if (extension_frequency_ > 0) return extension_frequency_; - if (!sbr_in_mimetype) + if (!sbr_present_) return frequency_; // The following code is written according to ISO 14496 Part 3 Table 1.11 and @@ -165,11 +169,11 @@ uint32_t AACAudioSpecificConfig::GetOutputSamplesPerSecond( return std::min(2 * frequency_, 48000u); } -uint8_t AACAudioSpecificConfig::GetNumChannels(bool sbr_in_mimetype) const { +uint8_t AACAudioSpecificConfig::GetNumChannels() const { // Check for implicit signalling of HE-AAC and indicate stereo output // if the mono channel configuration is signalled. // See ISO-14496-3 Section 1.6.6.1.2 for details about this special casing. - if (sbr_in_mimetype && channel_config_ == 1) + if (sbr_present_ && channel_config_ == 1) return 2; // CHANNEL_LAYOUT_STEREO // When Parametric Stereo is on, mono will be played as stereo. diff --git a/packager/media/codecs/aac_audio_specific_config.h b/packager/media/codecs/aac_audio_specific_config.h index e7e61742b3..5be25b8276 100644 --- a/packager/media/codecs/aac_audio_specific_config.h +++ b/packager/media/codecs/aac_audio_specific_config.h @@ -22,6 +22,56 @@ class BitReader; /// for more details. class AACAudioSpecificConfig { public: + // Audio Object Types specified in ISO 14496-3 (2005), Table 1.3 + enum AudioObjectType { + AOT_NULL = 0, + AOT_AAC_MAIN = 1, // Main + AOT_AAC_LC = 2, // Low Complexity + AOT_AAC_SSR = 3, // Scalable Sample Rate + AOT_AAC_LTP = 4, // Long Term Prediction + AOT_SBR = 5, // Spectral Band Replication + AOT_AAC_SCALABLE = 6, // Scalable + AOT_TWINVQ = 7, // Twin Vector Quantizer + AOT_CELP = 8, // Code Excited Linear Prediction + AOT_HVXC = 9, // Harmonic Vector eXcitation Coding + AOT_TTSI = 12, // Text-To-Speech Interface + AOT_MAINSYNTH = 13, // Main Synthesis + AOT_WAVESYNTH = 14, // Wavetable Synthesis + AOT_MIDI = 15, // General MIDI + AOT_SAFX = 16, // Algorithmic Synthesis and Audio Effects + AOT_ER_AAC_LC = 17, // Error Resilient Low Complexity + AOT_ER_AAC_LTP = 19, // Error Resilient Long Term Prediction + AOT_ER_AAC_SCALABLE = 20, // Error Resilient Scalable + AOT_ER_TWINVQ = 21, // Error Resilient Twin Vector Quantizer + AOT_ER_BSAC = 22, // Error Resilient Bit-Sliced Arithmetic Coding + AOT_ER_AAC_LD = 23, // Error Resilient Low Delay + AOT_ER_CELP = 24, // Error Resilient Code Excited Linear + // Prediction + AOT_ER_HVXC = 25, // Error Resilient Harmonic Vector eXcitation + // Coding + AOT_ER_HILN = 26, // Error Resilient Harmonic and Individual Lines + // plus Noise + AOT_ER_PARAM = 27, // Error Resilient Parametric + AOT_SSC = 28, // SinuSoidal Coding + AOT_PS = 29, // Parametric Stereo + AOT_SURROUND = 30, // MPEG Surround + AOT_ESCAPE = 31, // Escape Value + AOT_L1 = 32, // Layer 1 + AOT_L2 = 33, // Layer 2 + AOT_L3 = 34, // Layer 3 + AOT_DST = 35, // Direct Stream Transfer + AOT_ALS = 36, // Audio LosslesS + AOT_SLS = 37, // Scalable LosslesS + AOT_SLS_NON_CORE = 38, // Scalable LosslesS (non core) + AOT_ER_AAC_ELD = 39, // Error Resilient Enhanced Low Delay + AOT_SMR_SIMPLE = 40, // Symbolic Music Representation Simple + AOT_SMR_MAIN = 41, // Symbolic Music Representation Main + AOT_USAC_NOSBR = 42, // Unified Speech and Audio Coding (no SBR) + AOT_SAOC = 43, // Spatial Audio Object Coding + AOT_LD_SURROUND = 44, // Low Delay MPEG Surround + AOT_USAC = 45, // Unified Speech and Audio Coding + }; + AACAudioSpecificConfig(); virtual ~AACAudioSpecificConfig(); @@ -40,28 +90,26 @@ class AACAudioSpecificConfig { /// @return true on success, false otherwise. virtual bool ConvertToADTS(std::vector* buffer) const; - /// @param sbr_in_mimetype indicates whether SBR mode is specified in the - /// mimetype, i.e. codecs parameter contains mp4a.40.5. - /// @return Output sample rate for the AAC stream. - uint32_t GetOutputSamplesPerSecond(bool sbr_in_mimetype) const; + /// @return The audio object type for this AAC config, with possible extension + /// considered. + AudioObjectType GetAudioObjectType() const; - /// @param sbr_in_mimetype indicates whether SBR mode is specified in the - /// mimetype, i.e. codecs parameter contains mp4a.40.5. - /// @return Number of channels for the AAC stream. - uint8_t GetNumChannels(bool sbr_in_mimetype) const; + /// @return Sample rate for the AAC stream, with possible extensions + /// considered. + uint32_t GetSamplesPerSecond() const; - /// @return The audio object type for this AAC config. - uint8_t audio_object_type() const { return audio_object_type_; } - - /// @return The sampling frequency for this AAC config. - uint32_t frequency() const { return frequency_; } - - /// @return Number of channels for this AAC config. - uint8_t num_channels() const { return num_channels_; } + /// @return Number of channels for the AAC stream, with possible extensions + /// considered. + uint8_t GetNumChannels() const; /// Size in bytes of the ADTS header added by ConvertEsdsToADTS(). static const size_t kADTSHeaderSize = 7; + /// @return whether Spectral Band Repliation (SBR) is present in the stream. + bool sbr_present() const { return sbr_present_; } + /// Indicate whether SBR is present in the stream. + void set_sbr_present(bool sbr_present) { sbr_present_ = sbr_present; } + private: bool SkipDecoderGASpecificConfig(BitReader* bit_reader) const; bool SkipErrorSpecificConfig() const; @@ -69,18 +117,20 @@ class AACAudioSpecificConfig { // The following variables store the AAC specific configuration information // that are used to generate the ADTS header. - uint8_t audio_object_type_; - uint8_t frequency_index_; - uint8_t channel_config_; - // Is Parametric Stereo on? - bool ps_present_; + AudioObjectType audio_object_type_ = AOT_NULL; + uint8_t frequency_index_ = 0; + uint8_t channel_config_ = 0; + // Is Spectral Band Replication (SBR) available? + bool sbr_present_ = false; + // Is Parametric Stereo available? + bool ps_present_ = false; // The following variables store audio configuration information. // They are based on the AAC specific configuration but can be overridden // by extensions in elementary stream descriptor. - uint32_t frequency_; - uint32_t extension_frequency_; - uint8_t num_channels_; + uint32_t frequency_ = 0; + uint32_t extension_frequency_ = 0; + uint8_t num_channels_ = 0; }; } // namespace media diff --git a/packager/media/codecs/aac_audio_specific_config_unittest.cc b/packager/media/codecs/aac_audio_specific_config_unittest.cc index a5432d83ea..ab46631f63 100644 --- a/packager/media/codecs/aac_audio_specific_config_unittest.cc +++ b/packager/media/codecs/aac_audio_specific_config_unittest.cc @@ -17,8 +17,10 @@ TEST(AACAudioSpecificConfigTest, BasicProfileTest) { data.assign(buffer, buffer + sizeof(buffer)); EXPECT_TRUE(aac_audio_specific_config.Parse(data)); - EXPECT_EQ(44100u, aac_audio_specific_config.GetOutputSamplesPerSecond(false)); - EXPECT_EQ(2u, aac_audio_specific_config.GetNumChannels(false)); + EXPECT_EQ(44100u, aac_audio_specific_config.GetSamplesPerSecond()); + EXPECT_EQ(2u, aac_audio_specific_config.GetNumChannels()); + EXPECT_EQ(AACAudioSpecificConfig::AOT_AAC_LC, + aac_audio_specific_config.GetAudioObjectType()); } TEST(AACAudioSpecificConfigTest, ExtensionTest) { @@ -29,9 +31,11 @@ TEST(AACAudioSpecificConfigTest, ExtensionTest) { data.assign(buffer, buffer + sizeof(buffer)); EXPECT_TRUE(aac_audio_specific_config.Parse(data)); - EXPECT_EQ(48000u, aac_audio_specific_config.GetOutputSamplesPerSecond(false)); - EXPECT_EQ(48000u, aac_audio_specific_config.GetOutputSamplesPerSecond(true)); - EXPECT_EQ(2u, aac_audio_specific_config.GetNumChannels(false)); + EXPECT_EQ(48000u, aac_audio_specific_config.GetSamplesPerSecond()); + EXPECT_EQ(2u, aac_audio_specific_config.GetNumChannels()); + EXPECT_TRUE(aac_audio_specific_config.sbr_present()); + EXPECT_EQ(AACAudioSpecificConfig::AOT_PS, + aac_audio_specific_config.GetAudioObjectType()); } // Test implicit SBR with mono channel config. @@ -47,13 +51,17 @@ TEST(AACAudioSpecificConfigTest, ImplicitSBR_ChannelConfig0) { EXPECT_TRUE(aac_audio_specific_config.Parse(data)); - // Test w/o implict SBR. - EXPECT_EQ(24000u, aac_audio_specific_config.GetOutputSamplesPerSecond(false)); - EXPECT_EQ(1u, aac_audio_specific_config.GetNumChannels(false)); + EXPECT_EQ(24000u, aac_audio_specific_config.GetSamplesPerSecond()); + EXPECT_EQ(1u, aac_audio_specific_config.GetNumChannels()); + EXPECT_FALSE(aac_audio_specific_config.sbr_present()); + EXPECT_EQ(AACAudioSpecificConfig::AOT_AAC_LC, + aac_audio_specific_config.GetAudioObjectType()); - // Test implicit SBR. - EXPECT_EQ(48000u, aac_audio_specific_config.GetOutputSamplesPerSecond(true)); - EXPECT_EQ(2u, aac_audio_specific_config.GetNumChannels(true)); + aac_audio_specific_config.set_sbr_present(true); + EXPECT_EQ(48000u, aac_audio_specific_config.GetSamplesPerSecond()); + EXPECT_EQ(2u, aac_audio_specific_config.GetNumChannels()); + EXPECT_EQ(AACAudioSpecificConfig::AOT_SBR, + aac_audio_specific_config.GetAudioObjectType()); } // Tests implicit SBR with a stereo channel config. @@ -66,13 +74,17 @@ TEST(AACAudioSpecificConfigTest, ImplicitSBR_ChannelConfig1) { EXPECT_TRUE(aac_audio_specific_config.Parse(data)); - // Test w/o implict SBR. - EXPECT_EQ(24000u, aac_audio_specific_config.GetOutputSamplesPerSecond(false)); - EXPECT_EQ(2u, aac_audio_specific_config.GetNumChannels(false)); + EXPECT_EQ(24000u, aac_audio_specific_config.GetSamplesPerSecond()); + EXPECT_EQ(2u, aac_audio_specific_config.GetNumChannels()); + EXPECT_FALSE(aac_audio_specific_config.sbr_present()); + EXPECT_EQ(AACAudioSpecificConfig::AOT_AAC_LC, + aac_audio_specific_config.GetAudioObjectType()); - // Test implicit SBR. - EXPECT_EQ(48000u, aac_audio_specific_config.GetOutputSamplesPerSecond(true)); - EXPECT_EQ(2u, aac_audio_specific_config.GetNumChannels(true)); + aac_audio_specific_config.set_sbr_present(true); + EXPECT_EQ(48000u, aac_audio_specific_config.GetSamplesPerSecond()); + EXPECT_EQ(2u, aac_audio_specific_config.GetNumChannels()); + EXPECT_EQ(AACAudioSpecificConfig::AOT_SBR, + aac_audio_specific_config.GetAudioObjectType()); } TEST(AACAudioSpecificConfigTest, SixChannelTest) { @@ -83,8 +95,10 @@ TEST(AACAudioSpecificConfigTest, SixChannelTest) { data.assign(buffer, buffer + sizeof(buffer)); EXPECT_TRUE(aac_audio_specific_config.Parse(data)); - EXPECT_EQ(48000u, aac_audio_specific_config.GetOutputSamplesPerSecond(false)); - EXPECT_EQ(6u, aac_audio_specific_config.GetNumChannels(false)); + EXPECT_EQ(48000u, aac_audio_specific_config.GetSamplesPerSecond()); + EXPECT_EQ(6u, aac_audio_specific_config.GetNumChannels()); + EXPECT_EQ(AACAudioSpecificConfig::AOT_AAC_LC, + aac_audio_specific_config.GetAudioObjectType()); } TEST(AACAudioSpecificConfigTest, DataTooShortTest) { diff --git a/packager/media/formats/mp2t/program_map_table_writer.cc b/packager/media/formats/mp2t/program_map_table_writer.cc index 491a367b90..d1b5385b24 100644 --- a/packager/media/formats/mp2t/program_map_table_writer.cc +++ b/packager/media/formats/mp2t/program_map_table_writer.cc @@ -209,20 +209,15 @@ bool WriteAacAudioSetupInformation(const uint8_t* aac_audio_specific_config, return false; } - const uint8_t kAacLc = 2; - const uint8_t kAacHeV1 = 5; - const uint8_t kAacHeV2 = 29; - uint8_t audio_object_type = 2; - audio_object_type = config.audio_object_type(); - + auto audio_object_type = config.GetAudioObjectType(); switch (audio_object_type) { - case kAacLc: + case AACAudioSpecificConfig::AOT_AAC_LC: audio_setup_information->AppendInt(FOURCC_zaac); break; - case kAacHeV1: + case AACAudioSpecificConfig::AOT_SBR: audio_setup_information->AppendInt(FOURCC_zach); break; - case kAacHeV2: + case AACAudioSpecificConfig::AOT_PS: audio_setup_information->AppendInt(FOURCC_zacp); break; default: diff --git a/packager/media/formats/mp4/mp4_media_parser.cc b/packager/media/formats/mp4/mp4_media_parser.cc index b46d4fd1b9..e8513a80b1 100644 --- a/packager/media/formats/mp4/mp4_media_parser.cc +++ b/packager/media/formats/mp4/mp4_media_parser.cc @@ -368,9 +368,10 @@ bool MP4MediaParser::ParseMoov(BoxReader* reader) { codec = kCodecAAC; const AACAudioSpecificConfig& aac_audio_specific_config = entry.esds.aac_audio_specific_config; - num_channels = aac_audio_specific_config.num_channels(); - sampling_frequency = aac_audio_specific_config.frequency(); - audio_object_type = aac_audio_specific_config.audio_object_type(); + num_channels = aac_audio_specific_config.GetNumChannels(); + sampling_frequency = + aac_audio_specific_config.GetSamplesPerSecond(); + audio_object_type = aac_audio_specific_config.GetAudioObjectType(); codec_config = entry.esds.es_descriptor.decoder_specific_info(); break; } else if (entry.esds.es_descriptor.IsDTS()) { @@ -393,7 +394,7 @@ bool MP4MediaParser::ParseMoov(BoxReader* reader) { << " in stsd box."; return false; } - num_channels = entry.esds.aac_audio_specific_config.num_channels(); + num_channels = entry.channelcount; // For dts audio in esds, current supported number of channels is 6 // as the only supported channel layout is 5.1. if (num_channels != kDtsAudioNumChannels) { diff --git a/packager/media/formats/wvm/wvm_media_parser.cc b/packager/media/formats/wvm/wvm_media_parser.cc index 0b090fe7c1..09dfc33af6 100644 --- a/packager/media/formats/wvm/wvm_media_parser.cc +++ b/packager/media/formats/wvm/wvm_media_parser.cc @@ -923,7 +923,7 @@ bool WvmMediaParser::Output(bool output_encrypted_sample) { adts_header.GetSamplingFrequency()); std::vector audio_specific_config; if (!adts_header.GetAudioSpecificConfig(&audio_specific_config)) { - LOG(ERROR) << "Could not compute AACaudiospecificconfig"; + LOG(ERROR) << "Could not compute AACAudiospecificconfig"; return false; } audio_stream_info->set_codec_config(audio_specific_config); @@ -938,10 +938,11 @@ bool WvmMediaParser::Output(bool output_encrypted_sample) { LOG(ERROR) << "Could not parse AACAudioSpecificconfig"; return false; } - audio_stream_info->set_sampling_frequency(aac_config.frequency()); + audio_stream_info->set_sampling_frequency( + aac_config.GetSamplesPerSecond()); audio_stream_info->set_codec_string( AudioStreamInfo::GetCodecString( - kCodecAAC, aac_config.audio_object_type())); + kCodecAAC, aac_config.GetAudioObjectType())); } } } diff --git a/packager/media/test/data/README b/packager/media/test/data/README index dbe240e4ac..ec06ff427a 100644 --- a/packager/media/test/data/README +++ b/packager/media/test/data/README @@ -31,6 +31,8 @@ bear-640x360-hevc.mp4 - Same content, but encoded with HEVC. bear-320x180.mp4 - Same as above, but in a different resolution. bear-640x360-trailing-moov.mp4 - Same content, but with moov box in the end. bear-640x360-av_frag.mp4 - Same content, but in fragmented mp4. +bear-640x360-aac_lc-silent_right.mp4 - Audio only, stereo, but right channel is silent, with AAC-LC profile. +bear-640x360-aac_he-silent_right.mp4 - Same as above, but with AAC-HE profile. // Non square pixels. bear-640x360-non_square_pixel-with_pasp.mp4 - A non-square pixel version of the video track of bear-640x360.mp4 with PixelAspectRatio box. diff --git a/packager/media/test/data/bear-640x360-aac_he-silent_right.mp4 b/packager/media/test/data/bear-640x360-aac_he-silent_right.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..d0638e1eebe31197439de32dd066e3dbb248fe3d GIT binary patch literal 24087 zcmeFYMN}MI6RwK~5AG1$-912n(73xpT|pg|j#H16*1?(Ptr#$6%@zW<)Vo!{Zz zYxU|u&z`DXRr`Ibp`f5hEZn@EtX&=Lp`c)(-oM{Ioc2!K98geDh!!qDAQY4?pS`(> z8wI8m6pk{q^p(gfv@oLB+t2@<59m;6|9;^#{Qu|w5@??aW3c}JXBu{o(d=-HgcHb)BVdVTV>PNP5~+SiHQv+&>7^aI)7$%jt;xL>F+vN}8eQ8xV%bIX`$nWs0U5^nt{t_*~ta&ZiT zqk~2Qg%Wr=&ZktQio8ZfOEYjfCc(= zrhwtA13H(mdVAwoUK19aKND^ZR5Tg+GB&F2*H*yO&zi8JJiK0)DY8YJ*f#uEv@9G7 z2o_(XQ={#r#kR}aeV#Rfq)wHeHEKRF#&|Vhaidf)a?3MCkemiL+fhi#z$Ce7Nyb5$RWO>BT=~Y0X zFKsu}xEfypz_#*l?bX@h5=i<>O?<$K{JLyI4gG}zl_`60!>mdvV(Mw4(GA2HZi5Tj8uE?GVpO?=E z!zG8y;y>6=3gptQsU?RNZ%Slx&~L$=6{rpZ88*Oa4v4MwoV-$&J8&r_7>6nQ7h z05ao{83q(uhvCekd70O$=*BsjTYD#sgjyJcT);)fLL&fV#e|Jki|_xi2SN zh~PY^f7m%MXx(w!j)8&s4!8fdh2O(jx@HCY;VqaGz#nK1?mE5j)o6Fbv&f+|rR3it zNga%WgW~G2_dFi?Nfc5SUXKrq|r<*ZkO9Rlw|aLdCahiMfO4- z<*PKjc@61>j99b!cc#NLeF?~qYG23-Nc?#r-BlUZzgKG?)bg_)n7rIQ*sAPcGJz)% z5T7!I6tglN$|#o-0^S>iqF5cRE0KtZf#j=+XiY){tJXAGAHY`(e2g#^+1?SF`bsPA zG8?1Cuu8Z7_f7zu2 z1?NaalM)lsi;#FuB}CP0Zm;DZaS@bdubH|j;GTvB^-e~axK)D2rV0!7 zG+XT@8EMja0AbcYeX<6MR^=Un7-T3-Ez2c`alVT6uKW8MM@E&ODd%txQRhk?Fd7K_ zqWqv>edj=Pv>0i^NHB4U7Yl~}&j0hdU_N^7*=Rfr2PY{}6Xzo;3X0Q&Wig?}*`QgR z(aZ1W4I(wxY0`BD{bLx#3p}5rREzn<>f1c)oR`2<`)SvoeY2cqq;_CN8DVSJd-qjX zp#hng^?qhY;ly76RuKUU`FyNbU<7K=;_#wq5n0V!M4)HlcJIWn;N-;KqapTRG#YcL z$Aj5-nAxFm75RQ@Slbv%RB|38I^Mrl4yQ?p4)X7Tr$X{z@f(P&)q446NT*R-u6N)% zP!)D}TD%-%JUvLms~+mpVgU-x(ZYAAc>A+L`v{k8j`f)p(gaO}c!{qS*bC3yYSWXxW$F&l0K_c#_O5-Z8a2lk@2DCT#G5k|+Oc_(aRy@OxyW zJ`?i8R$~%SX$zr8PVy z5nCmDk@pp;Vixk31LkzCz#2)c8+GLsn|`dNl-7r<_W6c*;|3%H6({u(GXm9qyl2X+ z&YOMdV=pwhz&qX5-@VltFPyuILB{-Au!FLHG%geT*%$`5yxvMSLh+pY#kwbZ_a?a+&X$U(Lk4)}79J zT*@lSrp>c1fA&S$mAChFr?-x;zqs?4-e!0`Q78VPj}Nkgy&!JjYVlWwf+9kFzZFpY zZzbxjO3Vh;7}Gk9M7oVrxW^hw!iYg>GG^}lFi-#W+RV@rR1__1-gSyTG?J*UuDR+| zrq&@PO?pC{8eEPY%JPU8ZhEp6$7$p+!uNypK3l*o(rvfy|VabbAnHFmFxwO%Hv;m$*n65YgW)t(?A6&+xV=(F8lR!%lT@1R_>-U zNb5fXJ1%4E?q!cC>U>gKPD-CY%joo8%#VLHH2-VS^;>Zhr_6FOMW}c#S;;o6L-lJ~ z?iY}6Ab*LX{j!~*mxJAsOIDwbVpb@EEb|;Ajb3jf!xIYzN`K2I%+&Hu!?AN>o3cLfK!+V?KySKOR&ElL9mtvcgapD)r7V6ocEcH|Un0Y`0HA$dW+o7Kkd^@E}U| zrZgBlW(iXq3;4q*!ExsbF%3DSS+!HJiC>TbVrh)o&3}&q^uqWG>uno-kG{D?5{@Nd z9%g#b5hViAjq~g~r9|ng!2k@a5kcWdtU{%&mr!MTp;FqIqg=C_tUj$IT9uL#Row=u zdz%5@GuwvE(}>c;q;BBSX)|XJ@x+JDIMZ+N)woKRV;a!aJR`mKtzmHVWAUtcv7`0M z*hJS3xu+JUm&24NEx2sU7rP!b<=CgD&>a=wwDO|)Fe5J-3fkJ?@2BZJ1)jEbRu!5o zsUT0+pmpLkw3^tT?GE+kO-sL)jfTW#C)9-1$D$q2Z@u=;H%RkoIGw@1Ap6aJ9AU3* zk5S&e($b8F(nG%;Sbh20+S6^YcV?u*;JzOeP`&ERGc!EFM;8oiwED#7zw~lStXnKnCD{oGn@kMaD4TCVLQ%6GZTpiVitX zggZ(sm<3RlXZvt{Yg#R=vm}{9PF3T-f!zK=jCc~Zm?V4ri7+YDC-`;-3KKQX# zHOUDub+kupSvZo7k~JNg#Lae@rNJtg>*A81-qb~?61DU!lE2LIoG+}+g&IdLTZ7GN zQP^cV_>sl*Lrv-j6OBrQq13qDIX(u_Ji@~DxihF_fmk)}q@|&~V{TG|LiU7wkKFUR zI!SYZ^ItAUx1%k5^8D3!qi02ID-y6ur(o(TaH^81%+|WEMs&Abtp6oQnH3FT<{k7~ zJ!g^}BoRQUo>k!f4zlqjSI2Ic%yJ{{=bl@5Qnh&>Br0qQ5st{edL^jF5C{n%bS z^bFYM5rKC#2zZ_vmo-w%b%pG+RNWNi>RpmKza4GVq}}X@Ah><43B@6qB#Z*?TJCcO zdU9^@l8tJVO-4#e=Hc|tpvwGgw=Y-sB7#*(TBI6MXxyk%8uLef>V$oJF_~vO?R8Zz zyx;iSq`fX;U6kZgXyX1612vVHAA@BFH;8PR!l`YAsJoaqHKJ9g;BJ-p1b=1N(956e z`lT6#Kk8{E>FZ}Y?ue|8xl}QP2Ib_OJQ&7+Zs8UN}CigStb5H9()v2)} z@O|#?^vI-A3asneoK3I_6=htwp zgWD3@{)h$rvE@%N(7@sPD>zCKmgt$O?h;?nM2h{vLR}RD^@F@E3T!48aTp8xNpBE} zc5as1)gMV7SV@uDiJOsvxUz$Knx6tT&DExgA{vTQOKmeG&h&UIVzM-f>M@e@3%azt zv@bW%VzG2gWuDX|J8ce2Y0kFm6@G{+HX$)ov>w}7DE-hm^1(Z1?y4km{45iUReI_9U=buFdWH74l&Iln zEP$+dSXt(Qm0-~NY?Ym)NTV|bI$(&;ACtzr+H+2#<}=0f$B_UPSvTSyH&oFQSY{|6 z;`bW?_tsr~B|B)kl(o~;D{&vnU zR(yGVuJf7nH>oqIVF6Q&wTnL3jE%{FM0ts{P0op{U%?bC1p4E)p+C_~OdgGkfeKdX zJ%$L1^|ChH^w-IW?UNn=14vG211q|#l7o%-)GQ?-0Cjtv5hyqg%(vE}F*LYn%ih!u zmBKn1{nfeS>A7LRwJuMC5ymBF9%ZY3PfpQf&|g)G_2OvoJD0hm{k|LM!Mtit*(^6* zqgPYMG&hudTl|?c>2L<3Ho29F%VjHsH_Dn39XEwy-{a`RQa^_UR*3*1R=XBHXFJBk z0Hli4nzjy9r6TnyQkl|%xPH1>bl6u7w3HkIh0Fh`+k7qSoZnrM)N4M^RW7 zw^9mIGGQHVFphS4L2dMAgwD)JwT67m)m(6mle*|#YyG{ zQHJ1)R<}iyv>b-3G!3Y=PPzSyGQF%sdWK@PY`-Uun6y+fXt6(Qxm>n6UAV#^be`Zx zw4Dr!7}gT#SzCjDJH794Vc6fbp+V9vCuC4Lel#PCY#0z+2o+7o*^cl7m-CO!Y$iVR zAUdF%PR#Lz)T`Eq;sGCQ+%i6hP)KuYK z5jjBz3t0S-xq~6Yg|ea)Ql(WE_W~p!x%QprS2BL6XsA|1{o30ARrz?AHhR{K<8E@NaDBviA8?i~`hIE+}GV z@A~towrN1Y{kul*+h{gC)pA&D)MkIooEB~9v5^1k_q7vT*6i3BQf3dGv6po#)yNj> zVpMsC8^vZ6HRtUp!&DQRwCyhxrjF|K2q)U<;GyZwZA)gwvk%0F-pIPzIbtAdHpOQ~ z+1>tFzDLjrDV08zOJ!;Qg2kT4)f})nr;Iwiy_N~yNXOIt4uwt@&M~3jv}@@iSPYm| z%^Ob$(^{Q!Olkl410YWJS|Ld#7g-&^2{3qO!PopN#&r7AnzMFFo9I%yM)Z!wGj5D7 z!x*K2fC$mD^eZZ@o%kX>9j{Y4&|hX1)X$L3z1%Y^x{a5(WS;F2z$ zW0tl{&N&I7*wtYTDelW~>WW;dN458}?y%j#9{=jd_^92TgIu;)pAxBfH1BA7a{4hM z{Gw02BPOI(+OAfp^gPo+(|sxXbW(D0_Vp>?&av!U)quS{Ad0F(^>LLFmO?nGlbVwP z4kLScJGCrU`IFNY%Flw4fD#1uFOQv;EbpYvdj6ZOA^szk;uNMF?xw6Ez^JGXm#csM z=`L)$xaq1wr^c21`JU9cZ?3jC5-plpyOnKHi~gRbK9|#c8ETTJ%@<+@iD!s2Lf_;% zp77~GCl&fu1b%%5cMy#_{vn+pX}c~p!#EO|*B_5f7O7uUhdAgZx{fWMo`Zi_OI9yd zGw&34;;@Qs^EWomPYG7VJXjwkaM0o+GO_l_qrcL z>N?n>5g{hFEZ^dXHdjrliS~05XN@A-{Tj9p54IX4n@|FfW8VW0dqEvCrckiFigf$Q%)jXh*++Kz!7wd{H=2%dUmIvbiFVick&`` z_b1d*PuotHUR96XE@6HVuf}q{$CMvzfq*y#!Q)_d_6*h|k-vDe)?ChD+XAomQh_il zZ{jY7aj+HrZ*}w}{*5v0|LVnrNf~2fE6O%JRspA#e0;ck3+BhK-TfElW_EnOO4qjV zUQTSVyB4|R87w-T5fEZ6TbnrU0`g+yaK^5EzJ3J^Qn2C}l5AMXPvvlK*!>yaHCN_3 zb?K76496H=Ukiu=^Db4+WGeO%50}H)?|DT68&G;ZK9kjzJ|_z1B3;HBpRub5eNnJ< zx*Qg4eBuzz?(j>S-IYQYvXr3@^$b!nhSt@Xp6vdEJwaI;x!Xnv!jTmZD5)l#>-w7P ztWFOm?Z5++onf~0H(}WMti>8*s$PXuvhWUqbkK`Gw8=^QwK%gTTYHf=~Uqz z6U7y^rk?(*yCNsPu5wW1tlWGRVr&lRsE!BP0xxHp9|ySs_5>s-(|^_ZJA4K z>NX-S7RBN$v@WlEPLFkTbFGH&YAl?UDfi8ae*?9|$5%Z|KIotzbZSoOZ?3YOM|YoO zJ7;pmVLf_cle!0Scj(3n=;T*m)H7+GH5V>v&cQ*9teC&y|4sGFWb&PBvsh_Cq_aLg{nP-CS~PRx+=&;#sLbktmB+k_8`Q5o>CMfr>VYk;$i6!&6WCXB`JpyB>& zfMXP(%EVwKUVZPrFLO76!XpSNLSO6Vk` z-*OXMzA(Z|V)or3(?-XVPbcNInJ6aXiFDTO++^hw!#Dj22n$qJAx}aPiV-7oym)xT z1{N=sW2zV`P(no8Em7aRYDgv-tMz170Wx9}Z5v%Ow(mLC175pH&o|HHGsu_URS=YG zE$+PWMSM0!=8w}d%bKr)xPkR0?*yfrrh&U zm!sb)9h4SEl_`I^h4u(Dg#sil)^Vk}aZnvbo=@Lm8;Y)TyY44bt z8>1w>-Wbb>je~{XGS)P1S4U6USdfC6VnOez#3HC6(&cmyy?)J}Vr zsi4yjgI%Fg7E+|FAEP}psjMc|`EnsRUrQ^EREf2PiRF^xn)%O&HoTz5w{GGY$Q)X^ z=A$06sm|i^_vb95d^HA>GZbIKL0v!>z+O|K&Qm%gWT9x1s~esUQcam3o|x*~^w9AQ zQ8I?s+HTd-Ks@AlvCxAwH}lkG*pNFTR*=53ypUEHXnm?NRYIw1y_>sL zOX||2J1owab^pqjY`d)PBzK{?9;~DIK~6N=VCrMP{wSkg%VTwS?QmT`1CWyz49~3t zq>51A%Xs?e*5dW8iZ&m2x>PomErlypGvGm@$7{=-L@A)^yHd~zf#HOA1 z%!Zv|Z_7i-)A|=&L;jZ52>cfhUV`aqNkz3GnVVF}$3HRShdQ}2hbQMV@NEd1NFi}Pe(VJ_&XsI;(SS4^H- zTB=4T^Bc(dp@1h0Yfm?;(H6N{5_Gp*U4#4)I9GzOg++ZoPFnGU&RMCS@Ym6drsjsMwk7&0 zFgaGRFCf)j2M4(4Y2F+!9Q8Zu&(+-{o@s zu!S60!Pe;( z|Ma}mAQUsG&^Ors>3PJGol-xbt$V~U)MV4$vsDXqpjEUqv8PU&tQC}PofupP?TCHYk>sue@I zh-konrUI`V(6-&zV-7&w7vBb#7GA-r^!td zBD}sn@XDTw@oaE6cO}<7>f6513Kiep#U+OU1T$60|?C1a5`VAHq>kw>skm&}zW{lc1;WxP1@ zy`-%&on?mQZcGXb&a4Po7G;kb0yvn7&(?EEMo`q}OlTe`E?PR;=t@J9$HhenYC>dH zJ)V|=>qWZ}o59497o_Oa#Ut*y2CCZ-B*kMRP+G?)WXrc$>-8!Jt%a17W6$T?+A9Hh z{mTy;qO?`f@9PH82WqhiNjN@Hzz>H+nGb+O-!g9*!jtrHXS)elw7x_BI2_PN+b zVo5C3nACG5XI!{Ho#o^WzMvtjB#&rL>;2MRmF>^>kYi(g9&-nk6KQx^?{J!qTN23q z9D)3-%3+@bjy zbY-VLoS!%ufK-OkKN@`v!tQ*zIaxxt;jR{8oc-KRcrHB6j%4xBUCiq8yR%qD!>;Yt zNl2F`dbJ-pVU=2NTf-esBr*D{|K_c&<-|81UYFspb)hLB12$!ZfIMvwvQ^&LFE@p> z(H`-B=9QGo&piD$i>pmqoiN*C;VjeN>%&Ab>kcy7HgN`For(ihz zE-_DTpor()01G)j-Vgb-2qjArfz$N1-UkIm^`8fJKo}`w+mj{}FBT2o%$5y9yUYlc zwQgggl~&(x;kko_&p1421zOZ$MlqrfDODC8v}xyX6hzFceNTyn~c7c*D0d z3<-{IaMk2Ah9Y>Ed6qM%ej*o8hRYb0ZbdEuJr}d3+--xqHsvC!p=pc09elH@hxFwO zoSv0snUsjGBHVt>>73$S|K@1#TJbdD%~Z@cltfcjXs@;$t}c56zW>p9i=S4BU`d<;){IbfT+hm;I(jmmo%Ak}Z@JdlQc-n%FRU%s`R3JBSVPX) z^L(i*XxBXgJ7r78R0m#?P_b+?w|zXCJ={ls$$xZeSDJ3kaXmW|5}vc{(!DrNhni-& zf5t1Rz9|?!1aAg%8%3-hlN%wVfv!Q>ekXaZ(Me=cUNx@;L+zpLxg+0vlq|z3b)5(k zL#-MBD-Uvp|7_$Y*=oL{z_#wU*cV!F+~DJP5$P$bOm&o@OVRXZY=~^|e0j`Hq6rO4 zKRNBz3gv}xyQMMfF#fSy%!5~v5TmE|NF;`FIAuK0$rjK0b2lAfi)P0Cht;DPC+Byf zX3`IbfvPoc?#7|$_cFqQGxTWzHrL67nCcBS!hcm{U#DstWpk{{hmjkrUNu4aJ0p1n zx54?Za)1h1<#BBv4m=czLMRDRb1%sR7cRk$q@0kJn{(`<`%c56dAx=$5vpXt)FU9z@i_^ZyD0k`mM z&ru5(gK{LfSHA6bt0!g4qNEcmCInj@+;t&#!^wcZ`Ac{CGVaUm;#cF{6b-w({ zZIW=)PP;HM=IK~YHwqcY^nGk1B!4yO9@ObUWyp+aqn=4|z(o~g=tG6Tc!F5!)^~arRbj6OM9Zk0>K!Yw1CMIF(^Z7b%8t)lAV$b5%##!o|91t zT6N2=Wrkd8ps9jy$x-@8WlnoVJ~v#OUE~m^3qwoUipP!E2yqdaj$?Cf%SAhbA^C9- zj7Nx_$Uy|11g7$+5`J!7CeBIGlJz`e$zg=5pJ+1jQ zSC>JJ=~QW#f}qMZMPEAfPht;Ru5ttXOrP>QTDT214DVutj6MVD>{7d@4E*RwMj->| zP;QbJ`0g3$A?co1ZX~yf% zJOxhS!c&Fh%>8Xnbr0pz>vBVEnylCOcyv8l*w*ZW-W?XYOwu9bW}Oi-1R1bRTHVrx zyiF&)k7saKCMsg+l^+71#3SBNLwySs<9{=G7esQQf#Rh1s56n0Q7woVa3xUdb8Fag z&eaWt0fmfFMQNB$L`2C4dcxtHwUovw((0V-kGlV6(wo&2(JMdsWA72FI4`arJdpey z#k0r_tXayGZugB^ztVLESf&a~w3Qd0SyVbjulgua7){GPOsCv+9_IN;TMty#o@4P6 z0quV!{97^3pEOVY?t879Aj5RPd`n3wR7@z{iYnmLQcjQ_Z(TI1{;XzwtHlL!E$z8; zb}ni~u=#pW79icF8y1|Qi*3dC8NErOTnIAZO|y1D+kyv9LAzHY2x zU}K&yyfj9Pv$-Qpy0#+9ZH8S-@P_7CiJ-*7=dLSjp=l zk{@WK3uW^N>I$3feggNE@0>h&rIici@C!L!`D0%h>qq3W8$7&vE z8OSdF!M1F0wRdf=Xak_;0{JUNr*yb~XkPYwW)MgcZ*oMnlVGZkga_!W0?K4<09g~b zrpi>#1xR2Wn~)^XLin-_b9@l*OCMU`nwDS@&Q46C%iqWI10WAvs{-cB&sCF;<&HIG zgrY|}gg5je(I2{3J>lJGGuU8>Di3G8L525~wuO=`g4LWF_RhF9>nHRHKpobr@5L=C z*>bL+;GDLyRjT}GSI-}*YC3#FkRTzE9imq#KDCdOXhzH*=51%N|E8l^E`{@L5nIb< z!b3wxs!M@Zzx)E@@jNjSgo)G8uARBBMbwLaxhZiWtbsrOlSU=WG=g!%fz@vx!Y|ni z{G1i*D6xxNu#>OQ=}(To0Z5#tYUmhV1co`j`X zTG=*!_)kJt)+#WAG9?%)fwS49s$MLpQHC{K?k`oghpY$iTQ^uCeBo%wAloq(9I7bx zfQQgz#ECnQvJPZ-8+s)QCL^(7fZAUnF!F|XA0rsUoQm4atV-2)$cieh4#usLV_VH* zp+@pNaVeJEs7A3vZ;0~#z{E?VkmI;O;bX=@j3)QN@k7_2XPtIlHX=+2NTR7)u|e?n zJmIJ)s$SunBf9vtEb8l*&+#Q*Wifwo)TpJuqw4l3>he+>m6w%D{mNBL5|<(@rEG3# zbQB@_u1ddS13#vV)*Jq*f-iJ@zkYeii(uTJbKVc|a@tk3;+{gyid&kv9d@Voyk|bu zXY#rnQAJzxx4mmge4E^(>$$;<_1hvVg-re(u+=HOF`}&HNo+LPhzv#CRq9sIipNg{eDZFcoOtWTnK)zIqRupv>< ztEj3oNh*iLJq3s)0JelYJj_xsb${usG$?`M%9$^Q6cE*2_&`Pd(J}|Xef*1|LU=cj zx9DtI3jlomI5^)e+D;q1gCH#JLt#-y>Ctd}tda?!P!g4!7HL1v@J}wNyDEz4=rN4K z6in8Dnj>odp+!@`Xrt}t4tIjHg4`?BvTb)F)ncGB+H~?A;k;O3vqh1hUrnmgn-21& z5X%ft=|i*r<(>muWs2_0|VOX>HlXa!ronLqv4xiQ`AjP5S)@m0O$!|A?J_Q1(I zE4Gs}qKdIr^EOTJujY(jH(Se~KL~6Qk~m4GyR`7T%B)fMwv82j7;FPyhvZ9bShfQX z70F;7bM+rLv+9L;5!`|=O6U4SJ2cMvpJxf4R8BV*pjMI}h$cGs1OIIb?vy$}-E7B` zHt)9p2=x@tAKt9A9bJkT(GnQ?Z_>)|jQ8G}E0g486zVoRwIQQ8sN*{_Xe7l#A0&rD1o{vgB1hKR}3c1+UkK9G|7zbkcy9#Q`ugfXkJ1tf%(7%vC03OaORcq4Wmqi-Fz;4D z0H=-APHac$Xe^dWo+w*VMH5Gq6^d)e0ty_5yrzprE-J_rA1dklpAy0HvZq*!4Ga%T z(Gs(PB3F@WBj$#FDSdM7Iloh=?Ef^W#>(E4Ms@wR-oMpTxObuxKo~th=J6aeBr3@* zFLO{;2EC(x8)MX=WnnaV-$}#0kycvysuQ*$ZebDaXEE+aJ0X3D6fZmT)g}>6ay?^4 zw!w}tuUr)-d37bDt{@WsVssu`2Mlx_c{Fi=geZ1;j`PH$jd=IiB3=@8Kn6E+J$2`E4E}Yv=Ag2I z9Cp*k88kV6@lv&JSDM;>LK^tnpb_AymX}^wNxk!x*5KuG(<2ic*Cy3tiMtb~s<*z( z#=vd)*(yS#Aep;5S(=J8S?uhi6Ser_65bZ4NHX72u=QdtEy5MPQ%|`%Gl?cZ!hvJsMDN z?^9pN4XG9w%*5Uv4#ui_DalcC*e~5;+UBaEi8W#4DBa3Y~~DR?Rqy-p#kfbUIef z(pg|xsrIz15jP7r`F7^0EXghU6Rks6n+3?*G#6FZw$FCp#A3*n(iHbdM7xOdqeBrY z20dnm)6$-z9&^qVe>lI5WOTJ|h~lq#+n=efsgsv^he-_&2FkbuYh5@AiAlaE{NZV?&{vgXK?OE zI7rdVa=xLcokela%RlW1Zk=VxLG>H=WAKEy--gWZ!8op1E|I%g4e}-)EJHWfTZOL~ zf<>f%D!+*D$-*LV&N!0EM+;lc3H~=uHi#y%|1Cj)Hfgd${4w;-So%NB>rA8^+MIIK z1B&tngeV`T9^7e|bf=m9vZ`)u7US*gL6%|70i96r`_8CKvSnI=n!`8SkEUwKF0Q@p zdVR1=b&4+GPB_NjA}?8~vaJ}&N=`Q|&)0rkpn{ouUYtYgNYHeLzq{o3r+k`b0W>}t zXDq{e=VjfIT)WFws7vvoD*489>tY=aI<`?ZP^cbXOG9B*6{9v=;UJi7=C{~D8s@}(hyqZX|fo1uq{?qk%o9R`d9QEF5Ww{{BU~%Lr9n$M>mZ{(92`YjX zQuQR-9HdmDR(S3Q>t*i!NR5F!#0JnLhZ$$|eeLPIB8HHH)3WS^`*}LM1^0_$f3@49 z>~xoqoVEhZ(jq(G+N!SA`ouRSx8tK!?YBiJh>8Qg4*5Ik_wCF#n?fTO+MMt}Rtu|8 z$_eK?26&MMo|NOson3p>q_RRrenJxGYBi!FBdQ@IFZ^*t13F2yirZFk!(A2pe1|jB z7o|esqe&zvWVGY214F1gvNoXDaOR+`wwwgB`|1c#=kSDkWH zV|8cHzlu{Mt2va+N4ljGFG5Ob&~BQ#)Wf^2D;0v|oSdvDT-w_8Kp>ZDaCbhv7<=pE z$+;+ZAXR6|^9ijkpzkokU88MB&*zjQ?-z_+AVr6ch9x?*H861@Tg7GqFspCu;hl6!>Op zX>$A-B+ z9j?;tNPb~p(U=pyQAZP-QX#ORSXJbYy`GXo{d!%_Q(5HPsly3g3Q$eQ^E_+Q^k%;D zhCX#wa*@Re+2MX*X*8lq+obP%oNP1&%!SOd=$I_+jrlNha-tj@Y9~$zX7ZhMG&O@T z0kOQa{FihT<#eFhyDx1W(Iob`SNfQTqJfWQi$JD%h*1ju?$ z!NoGLU{+^2jitv{Al*!Mrnt(~MrAiHr5j|bAMV61Awr@v=Ad=7uI28q>>1@;_=ss! z&;sl)Gylx_>yt6E`uG>@do4~9j(%;m_3vj%@(BtFG94{8$X-L{OZrZ3`xhE=oBt;!!elfQdS0VtCk^s#qA-<<~r^jcEIW=|`LLOh#$> z)|B*B$W|Mw`7l#K=4kSINtQ*u0|`uV^4(oH#&TJNE@$GO9ndEmR^~M3cDEXMbvy=| zMZ-SAeA{}|w`WB_MAh&yO}@ahffi1`9W7+C-8_fh8ofmD^+gqTx0+({yf_nu4BtRH zE>qBNY24$W8Q&W8@B41kQ?jS>6mg5?;&L_(?U(lXI3i{e8b(t{s(alu{}$C(ppH@A zf{5&;_eiyqzWqn=X)Uph%}fP~8JQ~}Rl8iNw$fJIwV1qf7?-%1{$~g@GtM0C*kLul z%a{-Jxb+NJ2afQXb7qdVf#-zb=|{XZ_D-1_0SX3!S7=S#p&@launN6mx-h%gB&BuK zJq70^71E*Q;C~wv?<<4Q7X8*yJ@2sp%j^m9Txg5rl0+F?#!)p-X2uFJ=xs7EO8`wJ zvTOb&yemq~>1c;ZzORWZeOM@CUv?SNXIAHrz&e>D6O@YItYb#H+LLLcLR==%dRDw& zMNX1#mt&j+9BgT1%*w4al)}M_FiMIXi_0lbhu#BADdR(3tDZ`3Y*c5-(lt97i^#D9 zvosc@g(7ZK9;=_H%=(OyLtyxfR_CF{yATQ;M*RuxSQ<4!w1keu`w(DymtwmvVMVP^ zU59l$)8Ts9?Yh2sn-(d|38=3rtF2g%I$T9&eXn11FvaF^@a`(tRcqaL(pVT|#xCV2~fDerCT3Qa!q@*nEWum6buSH3$jyYe`g%bJdmG&Q7b%4j4Isf9lRPj`p) z4xNKj7sQp!v|U{Fqt8Hndt1mt4QlDB_N7CaL(@ zbJ&1ktSG=2B6zQ(y3#)+Mjpx7kQJ7c*s03xuB7n`f4=D^=7~icutZ(EJwB~BCIlJF zD>uOUoSQv|o=b1}QcMEW0sTWt%$2$mNuRFL=RWJP$UVP3@IcFUL4L43t;7_+lJ(Y_ zv*HqO%SBLLcUxcDE~vCM1~1~@sL&$MANjv}@VXkTGl<(zch3U3Uk-Wun$j=9h)3SdEAFNBi{*wFy}CeZzZs8)t?y$G-e^K0}Ys{rCB|D@b|%LHsMc!&nex zaCM&=*v`}%)OR)du(bA?#++CO(PKywWKRPooRJsF)i#1;`zTkIyMEBPU;>Fx+pdBF zw$euJ)o-eN=){+{Dy2F5xY0E|#%ewOJ^KE(JT0Q5?+&_GYElOnd5pT1vkStyE3u73 z_RI?+gmin|6uo%XnT*hwDH5;DRI57~OER3=q8-;T;pbaB98)3?O@r~_*uw|p0En|{ z>g>wm|EHbnjEZ8})-!-elpF^Ta6qC63?LFjlH?>A21!GlAq_c+f=E`4S0ocq!&}VB-D&&f9V9vSi>)(gl7q zc`4b!%g2)C_<*^-=)HiThRP}Ojkrp2eol--&(taw+gZ@F zHcLa&QnZ&@Rq45n=vSTNW>;6OJUTx7Fg(+_(b+fqEr=Q`auEK6aa$?0SaRe0Q1A^W zRyJW}ze7<^>+69UKbc~(*OFbI{k$&wK}gvvY_*~gSaY8SPU+LFN3lVazJAJ%&7uJL z<~d$>1Bd;91C~)XBH9%E9B!0prjS*qRgMBbE_IJFhLY>^UT@O27WSfR(ONzC!!{QKlYQ$QCd-1wz>8IL z{`a}BXe{>++J&OZm$%$Pc?dzct6nLe%covgW$#dyf<#)_jXw zB3`+c1(=cfV6B5zhj^q;dmhWVM)g9d zvC~t#A-tK3`l>z?vZ6ZBY}Vj9Dd|`*ObMqp7U{z>)`lGQo%AGva|&hAME80WS4_~) z7@=T*bZFGC`CIZaiK9vvNh%*zBF!*=i5BH(XjzZJ$3ZuujGYjRM8h!8jDW@%lMD;u z!)ug_sTKFG=GWypB9WH3HVfazq}#wM_9!xhMxFn1_}5^YG+h|% z92P0+6y{MzHxI9HSCx3xJO03Kvxez)ausP=HhlT+yV!_KRc4+$n2Y|~QZb^!+D7>( z#u6wE#j{R^ie3MfGWJuFPHtg@lO5OWG#I|=aupZ*R6TZIZ+)09(&OH0kdZ~fVds(W zi*88k!B?tp=n)};P^+hHN0jRFU` z{W0A{9?qc~QVK&Yo1r=t8onC1jA%7P;t-XmX!tU;h@a7! z|BQU@!R|J0)^=9XaLmVZP5Q#e+qf|4Lb@h&C%qEPqdyWS7u|2MZ{x(57QwMM@k`5&}a&v*1yQa52LQ{bgOO)Kd*Pl?HZ@koE9_S-?XvX z>10m49wAVjYW`&Ho?A>YiK3u76!TGdY9Y9ydBflCRsYl>a$UUZCf>+cV_#H{OozpY zO%;hqj5sW?R9sa0E|!%siaVOr!%#D!eA`7|c^!Ntnvb*fV`rtLGKVs~CncO>B8MU} zqK%DM!i3E`9uk+gwZ6=98B#Y&%Uxazqf43EZx4m3@4HcNPF&T#Fqx6At1(p`wA1bF z(o%9Y=O;#W5Z<~AEbC}s3}p&!)7XJ)9R9oCJr$ZJ7=twL}fc$A!|FiRU(0g8Xn)p{uVV(wgrkUqxOD z#A>s!j+W+ymhJ|)9U0!HjpW?1&|Bpa+##;d8eGwc4S2R5-1we+Mzo?;jyM@*Ek$ia zgWS5{;aK>2Wf;AzZ|x>ZmFQ>-f7M8NqMl4Ig`Fuh!A=yTAWu=GN2nQ`tIMbf^c!R( zeXE@}QsCOr{=#?OmII9^6eRWXP&&LGe6X;%I`~%3!ds!F6SZB_*ic!wk@CuHlJgGF zMX>_KXrW@5On2=(3NfY(YYJQAR&i6W?PJ`%#8}YF?sHMd}t)pya6nr@*q_T_5yMH7(8jo5WnNb;? zuOHSVW&eV+uAbi#ca)=_@y(CfVIyQVs&7luhz}NyRD77UaGco9fA)nDKA{lW7RIaF z$De6BR*nl7t;x7iB~rQxLGcUIu^ns=7W+s`Ar;c)+M_~CQ}!E6sxM`OdmO+85CjVpTo$-cx+w;X%k&t*z@lZW?q&l{Z&$W>v;j7kMg)exC2;hO~AiR8CK# z)ogOy&!^TVQ0aKrTH{Nfz)Ou|ILxK_5DK5>-W;x^N;=e>BKU;mTn|Ey>E4oEL|Q&o zTU(AKe*(wpS+n^e2{m)Mvfm}#Eak@Yo7(yRl;GzvYk}X1%uZab|mugT>P`L#Ao; zMn&!qFVF^)PtsjnjDqzjeH9CNnVQ_&dN@_xUXz9PCfKz~nsr?FHp~2W;J))J7#G1A(PChP^Xqyp=Gv3ED`C^Dlex`7fsa_sX~;%1TN~+Cia&> z@y6AWlri;P42`^p*r!xN9e)I{$q*ZMnV<5C#aN#!Z+WDg;6wqrJQblNbmOIM`(=L4 zvzn)F?hXo*%IrBF+=+12Xl6*7bZ7z|Fg7__i)IjK#BSl=Fn(e64oXigAbp zaArsM(UIfZ*rLwoa?;WPj?Xu!SPk3x1YO8-gvgxor0fN|W5vE4-5E>pOW|BsG)~b` z!Ly&t<-k8K)^`xz>_lovCodJ=S5k;^s}yc*C7)3;7nfsE2wR4!e}m_n*sP6RpNTYY z?cw=3vR;urgg%msS(cU8b%7l=Sgj=<+OUo;8xopBKWjgbH!~nKF6~bv*;16!m(QLG zQJieqJ$=LD=f$7*$pOkXe=(ho5ng=YRTA5)VC|+y@ytf;m_Vc}?*lg$V){%qkSS`2(DUJB}Q5 zCBCbZM1}Fm&pJXm)!ewT54+)^ndL{qW%aJnD-WAO?MbKDGS^M*6IL;wHn!8fKihRE zERcCHxhE03A*e zmL$<|emPB2es9MQ)B4Ci<}=0}Fgp6Tu{eWTo&Y+SKJ1!Z+^m(h0K>vo6x(X>Erjax z!lse$L-}m1{ir*>nao*XNQJh?|P=;S|0rEm~P5&3wN$C`*`kx4?dPIl}_Ry~(IuIL8y**cW;N?&r+{VfeMRCj_HDaO8|hZ9>{n$EfE zp&z(E%eNPI@M4%XIqae9<7u2D;$M=~ZeoXf20mp@+&JjGP;uk3$&Q?|Rs= zjcAZq$IgjotTorQ(2v}0N2C(oRu*~(nrL?R4BLdA2X9xD>R_a;x$DQ;6_+3fA)Y`F9VP%KN{ zscER~oqSU}9mutsGqY5?Exy-{?yrmLYx-Q~o6~v!Yn`XWtI9xRXLzb35#55>k`GX~ zkQk@#M%NPs6*?jg+!RPqBbXd>TIGO^H%Hnk3qo=1`m9$Yv!&To$iuq@o*3UuHyKV; zEpIj!#+#hbI{@};0mn06L&faH>A~@Ryj!b>qn*V54|Wx={n-S!?#f0h#(1O0u!fF3 z+{&A7;Tr;WM-p^yNEEMJcn-1b&b9GYOJ#O#Yr5FJTm>hiA?;;aVH15NCO<@UN{gO^ zko|7hl@nQChD-aN8I3U)`2M2ck2 zUnEbPtHnm!H)&$EH-d)f3_R7GF%em2x7hY7mkX@6pBVE8-M?z4*khB!AVH#}ex@7o zY%M4IR-LY1vwg?Y-Sr3TlwD~IFFoxxl_cAc`-=#Y__)bu7MQ3;CIq=nkJM5{T1ul% zGa;m*a4gY^d=8#-0MRl|5b_ZTuYIR0C-7s{A`&k*ztbt#$8?%@G;m=GqnloBV;#CTjXXKgu&Fqq z=|ncqm^~&EMIp~eK6p}B$9By|8^0-3$9+W8F1eHB_PQ<7^yBs_gEVdY(CUQ68gCXY zS^buO>)K9Q^Qw!hYV`}wSm5oyOF7#!p8j^FxaO4%n)1aQQ)dp6N!=?*Dh z=v8(Jep4znkQdGSwKH-|2W8Jlafx{`O^W_f)oF#0+dGPcFO^#-;n@}L#X0O$Ej_3# zyrv6Dj4aA`VbbHU7}2Qrs8}v1k{mBdEiFyjEGu*rA~rJfNb>C5{H&>ii_E)st3SQ) zr`wvg6Cp6wMedqga)I{(e&#;8*>y#h@g@6%y2?SBVDkk_(KAxe$6CRqqM>8>a$={rCP~c} zkRBA6EY0wUL!o66A%C#;L&jvHkn{yF^Frpl9<_yFC#2NXw1x`*te7nbD|~TZVSHMT z*muivu&puAZHuUXisq&N(@f7qX=(M0;SZKLsBMy3a`S~TN$7>U2cI889q+0@AH2VE zwhZR%;)tlBAy+6yyQn=s&uU)``~*Y-ej%qBBw4rai~<>ly!#y$_5+mSmjy7!{x>4* z?^v+E(pL4~0bzrG^YxD?x@2`K|Ba&iH`3Z(J^M}C|23BGze%6{k3stAzkL6l@1g%U zzQN}Od=Mmkg7Nka1m*)YCeY0pNdH4f*B}sTWnkG2{{1C?y8z7pxK{bA;I=Kzys9)1j5w) zt1gKh#@XEg$m7L0|FiFv>JaF5x7oAfn&NKGXum&wK(O8cUcYrPy$W1AYdLs1qfuZP z5=xA_mkXfKV=;eo3U~fx=W_N#f%%|-U7`u_L-YR9p@Ud|M>L?jWBswe9|l;)3W)U$ z-Y6*G^)Dd-HuwVq+$tzCD6BKsVF+ndR1_R2Mh2v;D!;-Sf2oB)zSN!oEM%f-6cBPi zfdWqg!i)7kW(lkZUMm47q(L2Mq{{p!{^Vt9Z literal 0 HcmV?d00001 diff --git a/packager/media/test/data/bear-640x360-aac_lc-silent_right.mp4 b/packager/media/test/data/bear-640x360-aac_lc-silent_right.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..f5478446257568aa13782d4dfaeddc3125e337e4 GIT binary patch literal 43213 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 literal 0 HcmV?d00001