virtual void SetActiveAudioTrack(int index) = 0;
virtual void SetActiveVideoTrack(int index) = 0;
virtual void SetPreferTextLanguage(const std::string& lang) = 0;
+ virtual double GetStartDate() = 0;
virtual void DestroyPlayerSync(base::OnceClosure cb) = 0;
#endif
};
#endif // BUILDFLAG(IS_WIN)
#if BUILDFLAG(IS_TIZEN_TV)
+#include "media/base/logging_override_if_enabled.h"
#include "media/filters/decrypting_media_resource.h"
#endif
#endif
#if BUILDFLAG(IS_TIZEN_TV)
void SetContentMimeType(const std::string& mime_type);
+ void WaitSignal();
void SetParentalRatingResult(bool is_pass);
void SetActiveTextTrack(int id, bool is_in_band);
void SetActiveAudioTrack(int index);
void SetActiveVideoTrack(int index);
void SetPreferTextLanguage(const std::string& lang);
+ double GetStartDate();
void DestroyPlayerSync(base::OnceClosure cb);
#endif
// Create decrypting media resource
void CreateAndInitializeDecryptingMediaResource();
void OnDecryptInitDone(bool success);
+ void RequestStartDate();
+ void StartDateCB(double start_date);
#endif
// Returns whether there's any encrypted stream in the demuxer.
#endif
#if BUILDFLAG(IS_TIZEN_TV)
+ base::WaitableEvent sync_with_worker_task_runner_{
+ base::WaitableEvent::ResetPolicy::AUTOMATIC};
std::string mime_type_;
+ double start_date_{std::numeric_limits<double>::quiet_NaN()};
std::unique_ptr<DecryptingMediaResource> decrypting_media_resource_{nullptr};
base::OnceClosure player_destroy_cb_;
#endif
shared_state_.renderer->SetContentMimeType(mime_type_);
}
+void PipelineImpl::RendererWrapper::WaitSignal() {
+ LOG(INFO) << "Signal the sync_with_worker_task_runner_";
+ sync_with_worker_task_runner_.Signal();
+}
+
void PipelineImpl::RendererWrapper::SetParentalRatingResult(bool is_pass) {
DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
base::BindRepeating(&RendererWrapper::OnWaiting,
weak_factory_.GetWeakPtr()));
}
+
+void PipelineImpl::RendererWrapper::RequestStartDate() {
+ DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
+ if (shared_state_.renderer) {
+ shared_state_.renderer->GetStartDate(base::BindOnce(
+ &RendererWrapper::StartDateCB, weak_factory_.GetWeakPtr()));
+ } else {
+ LOG(ERROR) << "No shared_state_.renderer!";
+ WaitSignal();
+ }
+}
+
+double PipelineImpl::RendererWrapper::GetStartDate() {
+ media_task_runner_->PostTask(
+ FROM_HERE, base::BindOnce(&RendererWrapper::RequestStartDate,
+ weak_factory_.GetWeakPtr()));
+ sync_with_worker_task_runner_.Wait();
+ return start_date_;
+}
+
+void PipelineImpl::RendererWrapper::StartDateCB(double start_date) {
+ DVLOG(1) << __func__;
+ start_date_ = start_date;
+ WaitSignal();
+}
+
void PipelineImpl::RendererWrapper::DestroyPlayerSync(base::OnceClosure cb) {
DCHECK(media_task_runner_->RunsTasksInCurrentSequence());
LOG(INFO) << "(" << static_cast<void*>(this) << ") ;" << __func__;
DCHECK(client_);
client_->AddTrackInfo(std::move(trackinfo));
}
+
+double PipelineImpl::GetStartDate() {
+ DVLOG(2) << __func__;
+ DCHECK(thread_checker_.CalledOnValidThread());
+ return renderer_wrapper_->GetStartDate();
+}
#endif
void PipelineImpl::OnDurationChange(base::TimeDelta duration) {
void SetActiveAudioTrack(int index) override;
void SetActiveVideoTrack(int index) override;
void SetPreferTextLanguage(const std::string& lang) override;
+ double GetStartDate() override;
void DestroyPlayerSync(base::OnceClosure cb) override;
#endif
void OnBufferingStateChange(BufferingState state,
virtual void SetMediaGeometry(const gfx::RectF& rect) {}
#endif
+ using StartDateCB = base::OnceCallback<void(double)>;
#if BUILDFLAG(IS_TIZEN_TV)
virtual void SetContentMimeType(const std::string& mime_type) {}
virtual void SetParentalRatingResult(bool is_pass) {}
virtual void SetActiveAudioTrack(int index) {}
virtual void SetActiveVideoTrack(int index) {}
virtual void SetPreferTextLanguage(const std::string& lang) {}
+ virtual void GetStartDate(StartDateCB cb) {}
virtual void DestroyPlayerSync(base::OnceClosure cb) {}
#endif
pipeline_->SetPreferTextLanguage(lang);
}
+double PipelineController::GetStartDate() const {
+ if (pipeline_)
+ return pipeline_->GetStartDate();
+
+ LOG(ERROR) << "pipeline_ is null";
+ return std::numeric_limits<double>::quiet_NaN();
+}
+
void PipelineController::DestroyPlayerSync(base::OnceClosure cb) {
if (pipeline_) {
pipeline_->DestroyPlayerSync(std::move(cb));
void SetActiveAudioTrack(int index);
void SetActiveVideoTrack(int index);
void SetPreferTextLanguage(const std::string& lang);
+ double GetStartDate() const;
void DestroyPlayerSync(base::OnceClosure cb);
#endif
private:
remote_renderer_->SetPreferTextLanguage(lang);
}
+void MojoRenderer::GetStartDate(StartDateCB cb) {
+ DVLOG(2) << __func__;
+ DCHECK(task_runner_->RunsTasksInCurrentSequence());
+
+ if (!remote_renderer_.is_bound()) {
+ LOG(ERROR) << "remote_renderer is not bound";
+ double start_date = std::numeric_limits<double>::quiet_NaN();
+ std::move(cb).Run(start_date);
+ return;
+ }
+
+ remote_renderer_->GetStartDate(std::move(cb));
+}
+
void MojoRenderer::DestroyPlayerSync(base::OnceClosure cb) {
DVLOG(2) << __func__;
DCHECK(task_runner_->RunsTasksInCurrentSequence());
void SetActiveAudioTrack(int index) override;
void SetActiveVideoTrack(int index) override;
void SetPreferTextLanguage(const std::string& lang) override;
+ void GetStartDate(StartDateCB cb) override;
void DestroyPlayerSync(base::OnceClosure cb) override;
#endif
mojo_renderer_->SetPreferTextLanguage(lang);
}
+void MojoRendererWrapper::GetStartDate(StartDateCB cb) {
+ if (!mojo_renderer_) {
+ LOG(ERROR) << "mojo_renderer_ is null";
+ double start_date = std::numeric_limits<double>::quiet_NaN();
+ std::move(cb).Run(start_date);
+ }
+ mojo_renderer_->GetStartDate(std::move(cb));
+}
+
void MojoRendererWrapper::DestroyPlayerSync(base::OnceClosure cb) {
if (mojo_renderer_) {
mojo_renderer_->DestroyPlayerSync(std::move(cb));
#endif
#if BUILDFLAG(IS_TIZEN_TV)
+ using StartDateCB = base::OnceCallback<void(double)>;
void SetContentMimeType(const std::string& mime_type) override;
void SetParentalRatingResult(bool is_pass) override;
void SetActiveTextTrack(int id, bool is_in_band) override;
void SetActiveVideoTrack(int index) override;
void SetActiveAudioTrack(int index) override;
void SetPreferTextLanguage(const std::string& lang) override;
+ void GetStartDate(StartDateCB cb) override;
void DestroyPlayerSync(base::OnceClosure cb) override;
#endif
SetPreferTextLanguage(string lang);
[EnableIf=is_tizen_tv]
+ GetStartDate()=> (double start_date);
+
+ [EnableIf=is_tizen_tv]
DestroyPlayerSync() => ();
};
renderer_->SetPreferTextLanguage(lang);
}
+void MojoRendererService::GetStartDate(GetStartDateCallback cb) {
+ DVLOG(3) << __func__;
+ if (renderer_) {
+ renderer_->GetStartDate(std::move(cb));
+ } else {
+ LOG(ERROR) << "renderer_ is null";
+ double start_date = std::numeric_limits<double>::quiet_NaN();
+ std::move(cb).Run(start_date);
+ }
+}
+
void MojoRendererService::OnPlayerDestroyed(base::OnceClosure destroy_cb) {
LOG(INFO) << "OnPlayerDestroyed";
std::move(destroy_cb).Run();
void SetActiveAudioTrack(int index) final;
void SetActiveVideoTrack(int index) final;
void SetPreferTextLanguage(const std::string& lang) final;
+ void GetStartDate(GetStartDateCallback cb) final;
void DestroyPlayerSync(base::OnceClosure destroy_cb) final;
#endif
virtual void SetActiveAudioTrack(int) {}
virtual void SetActiveVideoTrack(int) {}
virtual void SetPreferTextLanguage(const std::string&) {}
+ virtual double GetStartDate() const {
+ return std::numeric_limits<double>::quiet_NaN();
+ }
#endif
};
GetWebMediaPlayer()->SetPreferTextLanguage(prefer_text_lang_);
}
#endif
+double HTMLMediaElement::getStartDate() const {
+#if BUILDFLAG(IS_TIZEN_TV)
+ if (!IsHbbTV() || !GetWebMediaPlayer()) {
+ return std::numeric_limits<double>::quiet_NaN();
+ }
+ return GetWebMediaPlayer()->GetStartDate();
+#else
+ return std::numeric_limits<double>::quiet_NaN();
+#endif
+}
bool HTMLMediaElement::HasPendingActivity() const {
const auto result = HasPendingActivityInternal();
void SetLoop(bool);
ScriptPromise playForBindings(ScriptState*);
absl::optional<DOMExceptionCode> Play();
+ double getStartDate() const;
// Called when the video should pause to let audio descriptions finish.
void PauseToLetDescriptionFinish();
attribute double currentTime;
// FIXME: void fastSeek(double time);
readonly attribute unrestricted double duration;
- // FIXME: Date getStartDate(); crbug.com/312699
+ double getStartDate(); // for hbbtv
readonly attribute boolean paused;
attribute double defaultPlaybackRate;
[RaisesException=Setter] attribute double playbackRate;
delete (pInbandCue);
}
}
+
+double WebMediaPlayerImpl::GetStartDate() const {
+ return pipeline_controller_->GetStartDate();
+}
#endif
void WebMediaPlayerImpl::OnDurationChange() {
return is_background_suspend_enabled_;
}
+#if BUILDFLAG(IS_TIZEN_TV)
+ double GetStartDate() const override;
+#endif
+
// Distinct states that |delegate_| can be in. (Public for testing.)
enum class DelegateState {
GONE,
LOG_ID(ERROR, player_id_) << "media_player_ is null";
}
+void TizenRendererImpl::GetStartDate(StartDateCB cb) {
+ double start_date = std::numeric_limits<double>::quiet_NaN();
+ if (media_player_)
+ start_date = media_player_->GetStartDate();
+ else
+ LOG_ID(ERROR, player_id_) << "media_player_ is nullptr";
+ std::move(cb).Run(start_date);
+}
+
void TizenRendererImpl::DestroyPlayerSync(base::OnceClosure destroy_cb) {
if (media_player_) {
media::MediaPlayerRegistry::GetInstance()->DeactivateMediaPlayer(
#if BUILDFLAG(IS_TIZEN_TV)
void SetContentMimeType(const std::string& mime_type) override;
void SetParentalRatingResult(bool is_pass) override;
+ void GetStartDate(StartDateCB cb) override;
void DestroyPlayerSync(base::OnceClosure destroy_cb) override;
#endif
void SetMediaPlayerClient(MediaPlayerTizenClient* client) override {
client_ = client;
}
+ double GetStartDate() override {
+ return std::numeric_limits<double>::quiet_NaN();
+ };
void SetParentalRatingResult(bool is_pass) override {}
#if defined(TIZEN_VIDEO_HOLE)
<< prefer_subtitle_language.c_str();
player_set_ini_param(player_, prefer_subtitle_language.c_str());
}
+
+std::string MediaPlayerBridgeCapiTV::ParseDashKeyword(
+ const std::string& keyword) {
+ std::string dash_info = GetDashInfo();
+ Json::CharReaderBuilder builder;
+ Json::CharReader* reader(builder.newCharReader());
+ Json::Value value;
+ std::string valueForKey;
+
+ if (reader->parse(dash_info.c_str(), dash_info.c_str() + dash_info.length(),
+ &value, nullptr)) {
+ valueForKey = value[keyword].asString();
+ LOG_ID(INFO, player_id_)
+ << "keyword: " << keyword << ",valueForKey:" << valueForKey;
+ return valueForKey;
+ }
+ return "";
+}
+
+double MediaPlayerBridgeCapiTV::GetStartDate() {
+ int64_t millisecond = 0;
+ int ret = player_get_start_date(player_, &millisecond);
+ if (ret != PLAYER_ERROR_NONE) {
+ /* In case of invalid state try to use player_get_dash_info()
+ and parse it for availabilityStartTime -legacy hack*/
+ if (ret == PLAYER_ERROR_INVALID_STATE) {
+ const std::string start_date_keyword = "availabilityStartTime";
+ std::string start_date = ParseDashKeyword(start_date_keyword);
+ LOG_ID(ERROR, player_id_) << "from ParseDashKeyword: " << start_date;
+ if (!start_date.empty()) {
+ double start_date_ret = 0.0;
+ std::stringstream ss;
+ ss << start_date;
+ ss >> start_date_ret;
+ OnHandlePlayerError(ret, FROM_HERE);
+ return start_date_ret;
+ }
+ }
+ OnHandlePlayerError(ret, FROM_HERE);
+ LOG_ID(ERROR, player_id_) << "player_get_start_date fail,ret:" << ret;
+ return std::numeric_limits<double>::quiet_NaN();
+ }
+
+ return static_cast<double>(millisecond);
+}
} // namespace media
int media_position);
#endif
+ double GetStartDate() override;
+
protected:
void PlayerPrepared() override;
void GetAdaptiveStreamingInfo();
void UpdateSeekableTime();
void ParseDashInfo();
+ std::string ParseDashKeyword(const std::string& keyword);
bool GetLiveStreamingDuration(int64_t* min, int64_t* max);
bool GetDashLiveDuration(int64_t* duration);
std::string GetDashInfo();
virtual void SetActiveVideoTrack(int index) {}
virtual void SetPreferTextLanguage(const std::string& lang) {}
virtual void UpdateEventData(std::string data) {}
+ virtual double GetStartDate() {
+ return std::numeric_limits<double>::quiet_NaN();
+ }
#if BUILDFLAG(IS_TIZEN_TV)
virtual void DestroyPlayerSync(base::OnceClosure destroy_cb) {}
#endif