diff --git a/packager/media/event/hls_notify_muxer_listener.cc b/packager/media/event/hls_notify_muxer_listener.cc index 1668f468a6..96007b5d4d 100644 --- a/packager/media/event/hls_notify_muxer_listener.cc +++ b/packager/media/event/hls_notify_muxer_listener.cc @@ -16,9 +16,15 @@ namespace shaka { namespace media { -HlsNotifyMuxerListener::HlsNotifyMuxerListener(const std::string& playlist_name, - hls::HlsNotifier* hls_notifier) - : playlist_name_(playlist_name), hls_notifier_(hls_notifier) { +HlsNotifyMuxerListener::HlsNotifyMuxerListener( + const std::string& playlist_name, + const std::string& ext_x_media_name, + const std::string& ext_x_media_group_id, + hls::HlsNotifier* hls_notifier) + : playlist_name_(playlist_name), + ext_x_media_name_(ext_x_media_name), + ext_x_media_group_id_(ext_x_media_group_id), + hls_notifier_(hls_notifier) { DCHECK(hls_notifier); } @@ -48,13 +54,12 @@ void HlsNotifyMuxerListener::OnMediaStart(const MuxerOptions& muxer_options, return; } const bool result = hls_notifier_->NotifyNewStream( - media_info, playlist_name_, muxer_options.hls_name, - muxer_options.hls_group_id, &stream_id_); + media_info, playlist_name_, ext_x_media_name_, ext_x_media_group_id_, + &stream_id_); LOG_IF(WARNING, !result) << "Failed to notify new stream."; } -void HlsNotifyMuxerListener::OnSampleDurationReady(uint32_t sample_duration) { -} +void HlsNotifyMuxerListener::OnSampleDurationReady(uint32_t sample_duration) {} void HlsNotifyMuxerListener::OnMediaEnd(bool has_init_range, uint64_t init_range_start, @@ -64,8 +69,9 @@ void HlsNotifyMuxerListener::OnMediaEnd(bool has_init_range, uint64_t index_range_end, float duration_seconds, uint64_t file_size) { - const bool result = hls_notifier_->Flush(); - LOG_IF(WARNING, !result) << "Failed to flush."; + // Don't flush the notifier here. Flushing here would write all the playlists + // before all Media Playlists are read. Which could cause problems + // setting the correct EXT-X-TARGETDURATION. } void HlsNotifyMuxerListener::OnNewSegment(const std::string& file_name, diff --git a/packager/media/event/hls_notify_muxer_listener.h b/packager/media/event/hls_notify_muxer_listener.h index 86500155cf..5390295f14 100644 --- a/packager/media/event/hls_notify_muxer_listener.h +++ b/packager/media/event/hls_notify_muxer_listener.h @@ -24,8 +24,16 @@ namespace media { class HlsNotifyMuxerListener : public MuxerListener { public: /// @param playlist_name is the name of the playlist for the muxer's stream. + /// @param ext_x_media_name is the name of this playlist. This is the + /// value of the NAME attribute for EXT-X-MEDIA, it is not the same as + /// @a playlist_name. This may be empty for video. + /// @param ext_x_media_group_id is the group ID for this playlist. This is the + /// value of GROUP-ID attribute for EXT-X-MEDIA. This may be empty for + /// video. /// @param hls_notifier used by this listener. Ownership does not transfer. HlsNotifyMuxerListener(const std::string& playlist_name, + const std::string& ext_x_media_name, + const std::string& ext_x_media_group_id, hls::HlsNotifier* hls_notifier); ~HlsNotifyMuxerListener() override; @@ -58,6 +66,8 @@ class HlsNotifyMuxerListener : public MuxerListener { private: const std::string playlist_name_; + const std::string ext_x_media_name_; + const std::string ext_x_media_group_id_; hls::HlsNotifier* const hls_notifier_; uint32_t stream_id_ = 0; diff --git a/packager/media/event/hls_notify_muxer_listener_unittest.cc b/packager/media/event/hls_notify_muxer_listener_unittest.cc index 87d1e05a4e..9b09543e32 100644 --- a/packager/media/event/hls_notify_muxer_listener_unittest.cc +++ b/packager/media/event/hls_notify_muxer_listener_unittest.cc @@ -66,13 +66,18 @@ const uint8_t kAnyData[] = { const bool kInitialEncryptionInfo = true; const char kDefaultPlaylistName[] = "default_playlist.m3u8"; +const char kDefaultName[] = "DEFAULTNAME"; +const char kDefaultGroupId[] = "DEFAULTGROUPID"; } // namespace class HlsNotifyMuxerListenerTest : public ::testing::Test { protected: HlsNotifyMuxerListenerTest() - : listener_(kDefaultPlaylistName, &mock_notifier_) {} + : listener_(kDefaultPlaylistName, + kDefaultName, + kDefaultGroupId, + &mock_notifier_) {} MockHlsNotifier mock_notifier_; HlsNotifyMuxerListener listener_; @@ -100,29 +105,27 @@ TEST_F(HlsNotifyMuxerListenerTest, OnEncryptionInfoReady) { } TEST_F(HlsNotifyMuxerListenerTest, OnMediaStart) { - MuxerOptions muxer_options; - muxer_options.hls_name = "Name"; - muxer_options.hls_group_id = "GroupID"; - SetDefaultMuxerOptionsValues(&muxer_options); VideoStreamInfoParameters video_params = GetDefaultVideoStreamInfoParams(); scoped_refptr video_stream_info = CreateVideoStreamInfo(video_params); EXPECT_CALL(mock_notifier_, - NotifyNewStream(_, StrEq(kDefaultPlaylistName), StrEq("Name"), - StrEq("GroupID"), _)) + NotifyNewStream(_, StrEq(kDefaultPlaylistName), + StrEq("DEFAULTNAME"), StrEq("DEFAULTGROUPID"), _)) .WillOnce(Return(true)); + MuxerOptions muxer_options; listener_.OnMediaStart(muxer_options, *video_stream_info, 90000, MuxerListener::kContainerMpeg2ts); } +// Make sure it doesn't crash. TEST_F(HlsNotifyMuxerListenerTest, OnSampleDurationReady) { listener_.OnSampleDurationReady(2340); } +// Make sure it doesn't crash. TEST_F(HlsNotifyMuxerListenerTest, OnMediaEnd) { - EXPECT_CALL(mock_notifier_, Flush()).WillOnce(Return(true)); // None of these values matter, they are not used. listener_.OnMediaEnd(false, 0, 0, false, 0, 0, 0, 0); }