[M120 Migration][hbbtv] Audio tracks count notification
[platform/framework/web/chromium-efl.git] / media / filters / demuxer_manager.cc
index 25db5bc..c167fb6 100644 (file)
@@ -93,29 +93,19 @@ MimeType TranslateMimeTypeToHistogramEnum(const base::StringPiece& mime_type) {
 }
 
 HlsFallbackImplementation SelectHlsFallbackImplementation() {
-#if !BUILDFLAG(IS_ANDROID)
-  // TODO(crbug/1266991): This should return kBuiltinHlsPlayer when we launch
-  // on non-mobile. For now, do not support it.
-  return HlsFallbackImplementation::kNone;
-#elif !BUILDFLAG(ENABLE_HLS_DEMUXER)
-  // Android build supporting only media player.
-  if (base::FeatureList::IsEnabled(kHlsPlayer)) {
-    return HlsFallbackImplementation::kMediaPlayer;
-  }
-  return HlsFallbackImplementation::kNone;
-#else
-  // Android build with both builtin & media player implementations.
-  // Prefer builtin if it is enabled.
+#if BUILDFLAG(ENABLE_HLS_DEMUXER)
   if (base::FeatureList::IsEnabled(kBuiltInHlsPlayer)) {
-    // TODO(crbug/1266991): This should return kBuiltinHlsPlayer when the
-    // HlsDemuxer is able to be created.
-    return HlsFallbackImplementation::kNone;
+    return HlsFallbackImplementation::kBuiltinHlsPlayer;
   }
+#endif
+
+#if BUILDFLAG(IS_ANDROID)
   if (base::FeatureList::IsEnabled(kHlsPlayer)) {
     return HlsFallbackImplementation::kMediaPlayer;
   }
-  return kNone;
 #endif
+
+  return HlsFallbackImplementation::kNone;
 }
 
 #endif  // BUILDFLAG(ENABLE_HLS_DEMUXER) || BUILDFLAG(IS_ANDROID)
@@ -179,6 +169,19 @@ void DemuxerManager::OnPipelineError(PipelineStatus error) {
     return client_->OnError(std::move(error));
   }
 
+#if defined(TIZEN_MULTIMEDIA)
+  if (error == DEMUXER_ERROR_DETECTED_HLS) {
+    hls_fallback_ = HlsFallbackImplementation::kMediaPlayer;
+
+    client_->StopForDemuxerReset();
+    data_source_->Stop();
+    FreeResourcesAfterMediaThreadWait(base::BindOnce(
+        &DemuxerManager::RestartClientForHLS, weak_factory_.GetWeakPtr()));
+
+    return;
+  }
+#endif
+
 #if BUILDFLAG(ENABLE_HLS_DEMUXER) || BUILDFLAG(IS_ANDROID)
   bool can_play_hls =
       SelectHlsFallbackImplementation() != HlsFallbackImplementation::kNone;
@@ -231,6 +234,10 @@ void DemuxerManager::SetLoadedUrl(GURL url) {
   loaded_url_ = std::move(url);
 }
 
+const GURL& DemuxerManager::LoadedUrl() const {
+  return loaded_url_;
+}
+
 #if BUILDFLAG(ENABLE_HLS_DEMUXER) || BUILDFLAG(IS_ANDROID)
 
 void DemuxerManager::PopulateHlsHistograms(bool cryptographic_url) {
@@ -323,7 +330,7 @@ absl::optional<double> DemuxerManager::GetDemuxerDuration() {
   return static_cast<ChunkDemuxer*>(demuxer_.get())->GetDuration();
 }
 
-absl::optional<DemuxerType> DemuxerManager::GetDemuxerType() {
+absl::optional<DemuxerType> DemuxerManager::GetDemuxerType() const {
   if (!demuxer_) {
     return absl::nullopt;
   }
@@ -367,17 +374,38 @@ void DemuxerManager::RespondToDemuxerMemoryUsageReport(
   }
 }
 
+void DemuxerManager::DisableDemuxerCanChangeType() {
+  demuxer_->DisableCanChangeType();
+}
+
 PipelineStatus DemuxerManager::CreateDemuxer(
     bool load_media_source,
     DataSource::Preload preload,
-    bool has_poster,
+    bool needs_first_frame,
     DemuxerManager::DemuxerCreatedCB on_demuxer_created) {
   // TODO(crbug/1377053) return a better error
   if (!client_) {
     return DEMUXER_ERROR_COULD_NOT_OPEN;
   }
 
-#if BUILDFLAG(IS_ANDROID)
+  // We can only do a universal suspend for posters, unless the flag is enabled.
+  auto suspended_mode = Pipeline::StartType::kSuspendAfterMetadataForAudioOnly;
+  if (!needs_first_frame) {
+    suspended_mode = Pipeline::StartType::kSuspendAfterMetadata;
+  }
+
+#if BUILDFLAG(ENABLE_HLS_DEMUXER)
+  if (hls_fallback_ == HlsFallbackImplementation::kBuiltinHlsPlayer ||
+      (base::FeatureList::IsEnabled(kBuiltInHlsPlayer) &&
+       loaded_url_.path_piece().ends_with(".m3u8"))) {
+    SetDemuxer(CreateHlsDemuxer());
+    return std::move(on_demuxer_created)
+        .Run(demuxer_.get(), suspended_mode, /*is_streaming=*/false,
+             /*is_static=*/false);
+  }
+#endif  // BUILDFLAG(ENABLE_HLS_DEMUXER)
+
+#if BUILDFLAG(IS_ANDROID) || defined(TIZEN_MULTIMEDIA)
   const bool media_player_hls =
       hls_fallback_ == HlsFallbackImplementation::kMediaPlayer;
   if (media_player_hls || client_->IsMediaPlayerRendererClient()) {
@@ -389,15 +417,6 @@ PipelineStatus DemuxerManager::CreateDemuxer(
   }
 #endif
 
-#if BUILDFLAG(ENABLE_HLS_DEMUXER)
-  if (hls_fallback_ == HlsFallbackImplementation::kBuiltinHlsPlayer) {
-    SetDemuxer(CreateHlsDemuxer());
-    return std::move(on_demuxer_created)
-        .Run(demuxer_.get(), Pipeline::StartType::kNormal,
-             /*is_streaming=*/false, /*is_static=*/false);
-  }
-#endif  // BUILDFLAG(ENABLE_HLS_DEMUXER)
-
   // TODO(sandersd): FileSystem objects may also be non-static, but due to our
   // caching layer such situations are broken already. http://crbug.com/593159
   bool is_static = true;
@@ -432,11 +451,6 @@ PipelineStatus DemuxerManager::CreateDemuxer(
              is_static);
   }
 
-  // We can only do a universal suspend for posters, unless the flag is enabled.
-  auto suspended_mode = Pipeline::StartType::kSuspendAfterMetadataForAudioOnly;
-  if (has_poster || base::FeatureList::IsEnabled(kPreloadMetadataLazyLoad)) {
-    suspended_mode = Pipeline::StartType::kSuspendAfterMetadata;
-  }
   return std::move(on_demuxer_created)
       .Run(demuxer_.get(), suspended_mode, IsStreaming(), is_static);
 }
@@ -545,6 +559,16 @@ bool DemuxerManager::PassedDataSourceTimingAllowOriginCheck() const {
   return data_source_ ? data_source_->PassedTimingAllowOriginCheck() : true;
 }
 
+bool DemuxerManager::IsLiveContent() const {
+  // Manifest demuxer reports true live content accurately, while all other
+  // demuxers do not. TODO(crbug/1266991): Consider making IsSeekable return
+  // an enum class with vod/semi-live/true-live states.
+  if (GetDemuxerType() == DemuxerType::kManifestDemuxer) {
+    return !demuxer_->IsSeekable();
+  }
+  return false;
+}
+
 std::unique_ptr<Demuxer> DemuxerManager::CreateChunkDemuxer() {
   if (base::FeatureList::IsEnabled(kMemoryPressureBasedSourceBufferGC)) {
     memory_pressure_listener_ = std::make_unique<base::MemoryPressureListener>(
@@ -560,9 +584,27 @@ std::unique_ptr<Demuxer> DemuxerManager::CreateChunkDemuxer() {
       base::BindPostTaskToCurrentDefault(
           base::BindRepeating(&DemuxerManager::OnEncryptedMediaInitData,
                               weak_factory_.GetWeakPtr())),
+#if BUILDFLAG(IS_TIZEN_TV)
+      base::BindPostTaskToCurrentDefault(
+          base::BindRepeating(&DemuxerManager::OnAudioTracksCountChanged,
+                              weak_factory_.GetWeakPtr())),
+#else
+      base::DoNothing(),
+#endif
       media_log_.get());
 }
 
+#if BUILDFLAG(IS_TIZEN_TV)
+void DemuxerManager::OnAudioTracksCountChanged(unsigned count) {
+  if (client_) {
+    client_->OnAudioTracksCountChanged(count);
+  } else {
+    LOG(ERROR) << __func__
+               << "Audio track count changed, but no client, count: " << count;
+  }
+}
+#endif
+
 #if BUILDFLAG(ENABLE_FFMPEG)
 std::unique_ptr<Demuxer> DemuxerManager::CreateFFmpegDemuxer() {
   DCHECK(data_source_);
@@ -580,21 +622,32 @@ std::unique_ptr<Demuxer> DemuxerManager::CreateFFmpegDemuxer() {
 
 #if BUILDFLAG(ENABLE_HLS_DEMUXER)
 std::unique_ptr<Demuxer> DemuxerManager::CreateHlsDemuxer() {
-  auto player_impl = std::make_unique<HlsManifestDemuxerEngine>();
+  auto engine = std::make_unique<HlsManifestDemuxerEngine>(
+      client_->GetHlsDataSourceProvider(), media_task_runner_, loaded_url_,
+      media_log_.get());
   return std::make_unique<ManifestDemuxer>(
-      media_task_runner_, std::move(player_impl), media_log_.get());
+      media_task_runner_,
+      base::BindPostTaskToCurrentDefault(base::BindRepeating(
+          &DemuxerManager::DemuxerRequestsSeek, weak_factory_.GetWeakPtr())),
+      std::move(engine), media_log_.get());
 }
 #endif
 
-#if BUILDFLAG(IS_ANDROID)
+#if BUILDFLAG(IS_ANDROID) || defined(TIZEN_MULTIMEDIA)
 std::unique_ptr<Demuxer> DemuxerManager::CreateMediaUrlDemuxer(
     bool expect_hls_content) {
   return std::make_unique<MediaUrlDemuxer>(
       media_task_runner_, loaded_url_, site_for_cookies_, top_frame_origin_,
+#if BUILDFLAG(IS_ANDROID)
       has_storage_access_, allow_media_player_renderer_credentials_,
+#else
+      // The platform media player in Tizen OS doesn't require these params
+      // except for the url, so they are not used for tizen multimedia.
+      true, true,
+#endif
       expect_hls_content);
 }
-#endif  // BUILDFLAG(IS_ANDROID)
+#endif  // BUILDFLAG(IS_ANDROID) || defined(TIZEN_MULTIMEDIA)
 
 void DemuxerManager::SetDemuxer(std::unique_ptr<Demuxer> demuxer) {
   DCHECK(!demuxer_);
@@ -688,11 +741,11 @@ void DemuxerManager::OnFFmpegMediaTracksUpdated(
   bool is_first_audio_track = true;
   bool is_first_video_track = true;
   for (const auto& track : tracks->tracks()) {
-    if (track->type() == MediaTrack::Audio) {
+    if (track->type() == MediaTrack::Type::kAudio) {
       client_->AddAudioTrack(track->id().value(), track->label().value(),
                              track->language().value(), is_first_audio_track);
       is_first_audio_track = false;
-    } else if (track->type() == MediaTrack::Video) {
+    } else if (track->type() == MediaTrack::Type::kVideo) {
       client_->AddVideoTrack(track->id().value(), track->label().value(),
                              track->language().value(), is_first_video_track);
       is_first_video_track = false;
@@ -704,4 +757,11 @@ void DemuxerManager::OnFFmpegMediaTracksUpdated(
 }
 #endif  // BUILDFLAG(ENABLE_FFMPEG)
 
+void DemuxerManager::DemuxerRequestsSeek(base::TimeDelta time) {
+  if (!client_) {
+    return;
+  }
+  client_->DemuxerRequestsSeek(time);
+}
+
 }  // namespace media