}
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)
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;
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) {
return static_cast<ChunkDemuxer*>(demuxer_.get())->GetDuration();
}
-absl::optional<DemuxerType> DemuxerManager::GetDemuxerType() {
+absl::optional<DemuxerType> DemuxerManager::GetDemuxerType() const {
if (!demuxer_) {
return absl::nullopt;
}
}
}
+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()) {
}
#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;
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);
}
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>(
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_);
#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_);
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;
}
#endif // BUILDFLAG(ENABLE_FFMPEG)
+void DemuxerManager::DemuxerRequestsSeek(base::TimeDelta time) {
+ if (!client_) {
+ return;
+ }
+ client_->DemuxerRequestsSeek(time);
+}
+
} // namespace media