* media contents.
* @param [in] handle : trackrenderer handle
* @return Return 0 if no problem.
- * Otherewise -1 if the trackrenderer is not even set up.
+ * Otherwise -1 if the trackrenderer is not even set up.
* @pre The trackrenderer must be at least created and set up.
* trackrenderer_create()
* trackrenderer_prepare()
* @param [in] handle : trackrenderer handle ptr.
* @param [in] color_info : matroska color info
* @return Return 0 if no problem.
- * Otherewise -1 if the trackrenderer is not even set up.
+ * Otherwise -1 if the trackrenderer is not even set up.
* @pre The trackrenderer must be at least created and set up.
* trackrenderer_create()
* trackrenderer_prepare()
* @param [in] handle : trackrenderer handle ptr.
* @param [in] volume : volume level(0 ~ 100)
* @return Return 0 if no problem.
- * Otherewise -1 if the trackrenderer is not created.
+ * Otherwise -1 if the trackrenderer is not created.
* @pre The trackrenderer must be at least created.
* trackrenderer_create()
* @post None
* @param [in] handle : trackrenderer handle ptr.
* @param [out] volume : volume ptr
* @return Return 0 if no problem.
- * Otherewise -1 if the trackrenderer is not created.
+ * Otherwise -1 if the trackrenderer is not created.
* @pre The trackrenderer must be at least created.
* trackrenderer_create()
* @post None
*/
int trackrenderer_get_volume(TrackRendererHandle handle, int* volume);
+/**
+ * @brief Enable videohole from trackrenderer
+ * @param [in] handle : trackrenderer handle ptr.
+ * @param [in] value : videohole\n
+ * (@c true = enabled, @c false = disabled)
+ * @return Return 0 if no problem.
+ * Otherwise -1 if the trackrenderer is not created.
+ * @pre The trackrenderer must be at least created.
+ * trackrenderer_create()
+ * @post None
+ * @exception None
+ */
+int trackrenderer_enable_video_hole(TrackRendererHandle handle, const bool value);
+
+
/* CALL back*/
/**
trackctx_[track.type].track = &track;
LOGD("track.type : %d", track.type);
if ((int)track.type == (int)kTrackTypeVideo) {
- if (internal::IsVideoDecodedBufferNeeded(decoded_buffer_type_))
- trackctx_[track.type].create_pipeline =
- std::bind(&TrackRenderer::CreateDecodedVideoPipeline_, this,
- std::placeholders::_1);
- else
- trackctx_[track.type].create_pipeline = std::bind(
- &TrackRenderer::CreateVideoPipeline_, this, std::placeholders::_1);
-
+ trackctx_[track.type].create_pipeline = std::bind(
+ &TrackRenderer::CreateVideoPipeline_, this, std::placeholders::_1);
} else if ((int)track.type == (int)kTrackTypeAudio) {
if (internal::IsDecoderElementNecessary(track.mimetype)) {
trackctx_[track.type].create_pipeline =
return false;
}
- pipeline_->FactoryMake(Elements::kSinkVideo,
- internal::GetVideoSinkPluginName(ini_elements_, track->use_swdecoder), NULL);
+ auto videosink_name = internal::GetVideoSinkPluginName(ini_elements_, track->use_swdecoder);
+ pipeline_->FactoryMake(Elements::kSinkVideo, videosink_name, NULL);
+
+ if (strstr(videosink_name, "tizenwlsink")) {
+ pipeline_->SignalConnect(Elements::kSinkVideo, "handoff",
+ G_CALLBACK(GstDecodedVideoBufferCb_), this);
+ if (internal::IsVideoDecodedBufferNeeded(decoded_buffer_type_)) {
+ TRACKRENDERER_INFO("set signal-handoffs to FALSE");
+ CreateTbmBufferManager_(track);
+ EnableVideoHole(true);
+ pipeline_->SetProperty(Elements::kSinkVideo, "sync", TRUE, "async", TRUE);
+ } else {
+ TRACKRENDERER_INFO("didn't set signal-handoffs");
+ }
+ } else {
+ TRACKRENDERER_ERROR("video sink is not tizenwlsink. => %s", videosink_name);
+ }
pipeline_->FactoryMake(Elements::kCCExtractor, "ccextractor", "ccextractor");
Elements::kSinkVideo);
} else {
if (pipeline_->IsFactoryListType(Elements::kDecVideo, GST_ELEMENT_FACTORY_TYPE_HARDWARE)) {
+ TRACKRENDERER_INFO("HW codec");
pipeline_->SetProperty(Elements::kSinkVideo, "use-tbm", true);
pipeline_->BinAdd(Elements::kBinVideo, Elements::kAppSrcVideo, Elements::kParseVideo,
Elements::kDecVideo, Elements::kCCExtractor, Elements::kSinkVideo);
} else { /* sw */
+ TRACKRENDERER_INFO("SW codec");
pipeline_->FactoryMake(Elements::kVideoQueue, "queue", NULL);
pipeline_->SetProperty(Elements::kVideoQueue, "max-size-buffers", 2);
return true;
}
-bool TrackRenderer::CreateDecodedVideoPipeline_(const Track* track) {
- TRACKRENDERER_ENTER;
- CreateTbmBufferManager_(track);
- auto caps = caps_builder_.Build(*track, internal::IsDrmEmeElementNecessary(
- drm_property_, track->mimetype));
-
- CreateAppSrc_(kTrackTypeVideo, track->mimetype);
-
- pipeline_->FactoryMake(Elements::kParseVideo, (GstCaps*)caps.GetCaps_(),
- GST_ELEMENT_FACTORY_TYPE_PARSER, NULL);
- auto parse_caps =
- gstguard::make_guard(pipeline_->GetSrcPadCaps(Elements::kParseVideo));
-
- if (!pipeline_->FactoryMake(Elements::kDecVideo, (GstCaps*)parse_caps.get(),
- GST_ELEMENT_FACTORY_TYPE_DECODER, NULL)) {
- const ErrorType err = ErrorType::kNotSupportedVideoCodec;
- eventlistener_->OnError(err);
- return false;
- }
-
- pipeline_->FactoryMake(Elements::kSinkVideo, "fakesink", "fakesink");
-
- pipeline_->CreateBin(Elements::kBinVideo, "videobin");
-
- pipeline_->SignalConnect(Elements::kAppSrcVideo, "need-data",
- G_CALLBACK(GstVideoNeedDataCb_), this);
- pipeline_->SignalConnect(Elements::kAppSrcVideo, "enough-data",
- G_CALLBACK(GstVideoEnoughDataCb_), this);
- pipeline_->SignalConnect(Elements::kAppSrcVideo, "seek-data",
- G_CALLBACK(GstVideoSeekDataCb_), this);
- pipeline_->SetProperty(Elements::kAppSrcVideo, "format", GST_FORMAT_TIME);
-
- if (internal::IsDrmEmeElementNecessary(drm_property_, track->mimetype)) {
- pipeline_->FactoryMake(Elements::kDrmVideo, "drm_eme", "video_drm");
- pipeline_->SetProperty(Elements::kDrmVideo, "plus-player-eme", TRUE);
- if (internal::IsExternalDecryptionCase(drm_property_) == false) {
- pipeline_->SetProperty(Elements::kDrmVideo, "getrights-complete-cb",
- GstVideoDrmInitDataCb_);
- pipeline_->SetProperty(Elements::kDrmVideo, "getrights-complete-cb-data",
- this);
- }
-
- pipeline_->BinAdd(Elements::kBinVideo, Elements::kAppSrcVideo,
- Elements::kDrmVideo, Elements::kDecVideo,
- Elements::kSinkVideo);
- } else {
- if (pipeline_->IsFactoryListType(Elements::kDecVideo, GST_ELEMENT_FACTORY_TYPE_HARDWARE)) {
- TRACKRENDERER_INFO("HW codec");
- pipeline_->BinAdd(Elements::kBinVideo, Elements::kAppSrcVideo, Elements::kParseVideo,
- Elements::kDecVideo, Elements::kSinkVideo);
- } else {
- TRACKRENDERER_INFO("SW codec");
- pipeline_->FactoryMake(Elements::kVideoQueue, "queue", NULL);
- pipeline_->SetProperty(Elements::kVideoQueue, "max-size-buffers", 2);
-
- pipeline_->FactoryMake(Elements::kVideoConvert, "videoconvert", NULL);
- pipeline_->SetProperty(Elements::kVideoConvert, "n-threads", 2);
-
- pipeline_->BinAdd(Elements::kBinVideo, Elements::kAppSrcVideo, Elements::kParseVideo,
- Elements::kDecVideo, Elements::kVideoQueue, Elements::kVideoConvert, Elements::kSinkVideo);
- }
- }
-
- pipeline_->BinAddSimple(Elements::kPipeline, Elements::kBinVideo);
-
- pipeline_->SetAppSrcCaps(Elements::kAppSrcVideo, caps);
-
- pipeline_->SetProperty(Elements::kAppSrcVideo, "stream-type",
- GST_APP_STREAM_TYPE_SEEKABLE);
-
- pipeline_->SetProperty(Elements::kSinkVideo, "signal-handoffs", TRUE, "sync", TRUE, "async", TRUE);
-
- pipeline_->SignalConnect(Elements::kSinkVideo, "handoff",
- G_CALLBACK(GstDecodedVideoBufferCb_),
- this);
-
- TRACKRENDERER_LEAVE;
- return true;
-}
-
void TrackRenderer::SetOpusChannelMappingFamily(const GstCapsWrapper& caps) {
auto p = gst_caps_get_structure((GstCaps*)caps.GetCaps_(), 0);
gint channels = 0;
return true;
}
+bool TrackRenderer::EnableVideoHole(bool value) {
+ TRACKRENDERER_DEBUG("EnableVideoHole : %d", value);
+ std::lock_guard<std::mutex> lk(resource_m_);
+ is_video_hole_enabled_ = value;
+ if (!pipeline_) return true;
+ EnableVideoHole_();
+ return true;
+}
+
+void TrackRenderer::EnableVideoHole_() {
+ const gchar* sink_name = nullptr;
+ pipeline_->GetProperty(Elements::kSinkVideo, "name", &sink_name);
+ if (sink_name == nullptr) {
+ TRACKRENDERER_WARN("no video sink");
+ return;
+ }
+ if (strstr(sink_name, "tizenwlsink")) {
+ pipeline_->SetProperty(Elements::kSinkVideo, "signal-handoffs", is_video_hole_enabled_ ? false : true);
+ TRACKRENDERER_DEBUG("value: %d", is_video_hole_enabled_);
+ } else {
+ TRACKRENDERER_WARN("sink name: %s", sink_name);
+ }
+}
+
} // namespace trackrenderer
} // namespace plusplayer