Merge branch 'main' into ci/gilbok-lee/update_public
authorGilbok Lee <gilbok.lee@samsung.com>
Tue, 5 Mar 2024 06:20:27 +0000 (15:20 +0900)
committerGilbok Lee <gilbok.lee@samsung.com>
Tue, 5 Mar 2024 06:20:27 +0000 (15:20 +0900)
1  2 
include/esplusplayer_capi/esplusplayer_capi.h
packaging/esplusplayer.spec
src/esplusplayer/CMakeLists.txt
src/esplusplayer/include_internal/esplayer/esplayer.h
src/esplusplayer/src/esplayer.cpp
src/esplusplayer/src/esplusplayer_capi.cpp
src/plusplayer-core/src/trackrendereradapter_utils.cpp

index 8b07515,4f26314..51861bd
mode 100644,100755..100755
  #ifndef __ESPLUSPLAYER_ESPLUSPLAYER_CAPI_ESPLUSPLAYER_CAPI_H__
  #define __ESPLUSPLAYER_ESPLUSPLAYER_CAPI_ESPLUSPLAYER_CAPI_H__
  
 +#ifdef TIZEN_FEATURE_PUBLIC
 +#include <media/sound_manager.h>
 +#endif
 +
  #include "esplusplayer_capi/buffer.h"
  #include "esplusplayer_capi/display.h"
  #include "esplusplayer_capi/drm.h"
@@@ -412,11 -408,18 +412,18 @@@ typedef enum esplusplayer_rsc_alloc_pol
     */
    ESPLUSPLAYER_RSC_ALLOC_EXCLUSIVE_CONDITIONAL,
    /**
-    * @description exclusive no explicit policy, RM will return available
+    * @description inapp multiview policy, RM will return available
     * resources.
     * @version 6.0
     */
-   ESPLUSPLAYER_RSC_ALLOC_EXCLUSIVE_NO_EXPLICIT
+   ESPLUSPLAYER_RSC_ALLOC_INAPP_MULTIVIEW,
+   /**
+    * @description Forced to allocate mfc decoder ,used senario of get decoded
+    * data out.
+    * @version 8.0
+    */
+   ESPLUSPLAYER_RSC_ALLOC_EXCLUSIVE_MFC_FORCED
  } esplusplayer_rsc_alloc_policy;
  
  /**
@@@ -3196,6 -3199,9 +3203,9 @@@ int esplusplayer_set_audio_high_latency
  
  /**
   * @brief     Provided api for getting the maximum number of frames.
+  * @remark    As a part of the dedicated app implementation.
+  * If non dedicated app call this api, this api will return
+  * ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION.
   * @param     [in] handle : esplusplayer handle.
   * @param     [out] frame_count : maximum frame count.
   * @return    @c ESPLUSPLAYER_ERROR_TYPE_NONE on success,otherwise @c one of
   *            esplusplayer_stop(esplayer);
   * @endcode
   * @pre       The player state must be at least #ESPLUSPLAYER_STATE_READY.
-  *            It has to be set to game mode, and multi channel pcm.
+  *            It has to be set to game mode.
   * @post      None
   * @exception None
   * @version   6.0
@@@ -3234,6 -3240,9 +3244,9 @@@ int esplusplayer_get_low_latency_pcm_bu
  
  /**
   * @brief     Provided api for getting the number of currently queued frames.
+  * @remark    As a part of the dedicated app implementation.
+  * If non dedicated app call this api, this api will return
+  * ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION.
   * @param     [in] handle : esplusplayer handle.
   * @param     [out] frame_count : queued frame count.
   * @return    @c ESPLUSPLAYER_ERROR_TYPE_NONE on success,otherwise @c one of
   *            esplusplayer_stop(esplayer);
   * @endcode
   * @pre       The player state must be at least #ESPLUSPLAYER_STATE_READY.
-  *            It has to be set to game mode, and multi channel pcm.
+  *            It has to be set to game mode.
   * @post      None
   * @exception None
   * @version   6.0
@@@ -3272,6 -3281,9 +3285,9 @@@ int esplusplayer_get_low_latency_pcm_cu
  
  /**
   * @brief     Provided api for getting the underrun counts in audio out.
+  * @remark    As a part of the dedicated app implementation.
+  * If non dedicated app call this api, this api will return
+  * ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION.
   * @param     [in] handle : esplusplayer handle.
   * @param     [out] underrun_count : underrun counts in audio out.
   * @return    @c ESPLUSPLAYER_ERROR_TYPE_NONE on success,otherwise @c one of
   *            esplusplayer_stop(esplayer);
   * @endcode
   * @pre       The player state must be at least #ESPLUSPLAYER_STATE_READY.
-  *            It has to be set to game mode, and multi channel pcm.
+  *            It has to be set to game mode.
   * @post      None
   * @exception None
   * @version   6.0
@@@ -3946,62 -3958,6 +3962,62 @@@ int esplusplayer_get_video_stream_rotat
  int esplusplayer_set_simple_mix_out_buffer_level(
      esplusplayer_handle handle, esplusplayer_simple_mix_out_buffer_level level);
  
 +#ifdef TIZEN_FEATURE_PUBLIC
 +/**
 + * @brief     Provided api for enabling video hole.
 + * @param     [in] handle : esplusplayer handle.
 + * @param     [in] value : the value of video hole.
 + *            (@c true = video hole enabled, @c false = video hole disabled)
 + * @return    @c ESPLUSPLAYER_ERROR_TYPE_NONE on success, otherwise @c one of
 + * esplusplayer_error_type values will be returned.
 + * @retval    #ESPLUSPLAYER_ERROR_TYPE_NONE Successful
 + * @retval    #ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER Invalid parameter
 + * @retval    #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation
 + * failed
 + * @code
 + *            esplusplayer_open(esplayer);
 + *            esplusplayer_enable_video_hole(esplayer, false);
 + *            // ... your codes ...
 + *            esplusplayer_close(esplayer);
 + * @endcode
 + * @pre       The player state must not be #ESPLUSPLAYER_STATE_NONE.
 + * @remark    To disable video hole,
 + * esplusplayer_decoded_video_frame_buffer_type() must not be set to
 + * #ESPLUSPLAYER_DECODED_VIDEO_FRAME_BUFFER_TYPE_NONE. To enable video hole,
 + * esplusplayer_set_display() must be set to #ESPLUSPLAYER_DISPLAY_TYPE_OVERLAY
 + * @post      None
 + * @exception None
 + * @see       esplusplayer_set_video_frame_buffer_type()
 + *            esplusplayer_set_media_packet_video_decoded_cb()
 + */
 +int esplusplayer_enable_video_hole(esplusplayer_handle handle,
 +                                   const bool value);
 +
 +/**
 + * @brief     Set sound stream information
 + * @param     [in] handle      : esplusplayer handle.
 + * @param     [in] stream_info : sound stream information
 + * @return    @c ESPLUSPLAYER_ERROR_TYPE_NONE on success,otherwise @c one of
 + * esplusplayer_error_type
 + *            values will be returned.
 + * @retval    #ESPLUSPLAYER_ERROR_TYPE_NONE Successful
 + * @retval    #ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER Invalid parameter
 + * @retval    #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation
 + * failed
 + * @code
 + *            esplusplayer_open(esplayer);
 + *            esplusplayer_set_sound_stream_info(esplayer, stream_info);
 + *            // ... your codes ...
 + *            esplusplayer_close(esplayer);
 + * @endcode
 + * @pre       The player state must be set to #ESPLUSPLAYER_STATE_IDLE
 + * @post      None
 + * @exception None
 + * @see       esplusplayer_open()
 + */
 +int esplusplayer_set_sound_stream_info(esplusplayer_handle handle,
 +                                       const sound_stream_info_h stream_info);
 +#endif
  #ifdef __cplusplus
  }
  #endif
@@@ -1,5 -1,4 +1,5 @@@
  #%bcond_with : disable ESPLUSPLAYER_UT by default, %bcond_without : enable ESPLUSPLAYER_UT
 +%bcond_without TIZEN_PUBLIC
  %if ("%{_vd_cfg_product_type}" != "AUDIO")
  %bcond_without ESPLUSPLAYER_UT
  %else
@@@ -8,8 -7,8 +8,7 @@@
  #echo "Product Type: %{_vd_cfg_product_type}"
  Name:       esplusplayer
  Summary:    new multimedia streaming player
- Version:    1.3.3
- Release:    1
+ Version:    1.3.7
 -Release:    0
  Group:      Multimedia/Libraries
  License:    Apache-2.0
  Source0:    %{name}-%{version}.tar.gz
@@@ -25,32 -24,22 +24,32 @@@ BuildRequires:  pkgconfig(elementary
  BuildRequires:  pkgconfig(ecore)
  BuildRequires:  pkgconfig(evas)
  BuildRequires:  pkgconfig(ecore-wl2)
 +%if %{with TIZEN_PUBLIC}
 +BuildRequires:  pkgconfig(libtrackrenderer)
 +BuildRequires:  pkgconfig(capi-media-sound-manager)
 +# for test
 +BuildRequires:  pkgconfig(capi-mediademuxer)
 +BuildRequires:  pkgconfig(appcore-efl)
 +%else
  BuildRequires:  pkgconfig(tv-resource-manager)
 +BuildRequires:  pkgconfig(drmdecrypt)
 +BuildRequires:  pkgconfig(context-aware-api)
 +%if ("%{_vd_cfg_product_type}" != "AUDIO")
 +BuildRequires:  pkgconfig(graphics-control)
 +%endif
 +BuildRequires:  pkgconfig(capi-trackrenderer-tv)
 +BuildRequires:  pkgconfig(logger)
 +%endif
 +
  BuildRequires:  pkgconfig(libtzplatform-config)
  BuildRequires:  pkgconfig(jsoncpp)
  BuildRequires:  pkgconfig(icu-i18n)
 -BuildRequires:  pkgconfig(drmdecrypt)
 -BuildRequires:  pkgconfig(logger)
  BuildRequires:  pkgconfig(gio-2.0)
  BuildRequires:  pkgconfig(libtbm)
 -BuildRequires:  pkgconfig(context-aware-api)
 -BuildRequires:  pkgconfig(capi-trackrenderer-tv)
 +
  BuildRequires:  pkgconfig(libtbm)
  BuildRequires:  pkgconfig(capi-system-info)
  
 -%if ("%{_vd_cfg_product_type}" != "AUDIO")
 -BuildRequires:  pkgconfig(graphics-control)
 -%endif
  
  %if ("%{sec_buildconf_product_lite_tizen}" == "n")
  # for ut
@@@ -110,13 -99,10 +109,13 @@@ cp %{SOURCE1001} 
  %package ut-component-tomato
  Summary: Test package with TOMATO
  BuildRequires:  gtest-devel
 +%if %{without TIZEN_PUBLIC}
  BuildRequires:  pkgconfig(video-capture)
  BuildRequires:  pkgconfig(audio-control)
 -BuildRequires:  libjpeg-turbo-devel
  BuildRequires:  pkgconfig(video-sink)
 +%endif
 +BuildRequires:  libjpeg-turbo-devel
 +
  #BuildRequires:  pkgconfig(capi-system-info)
  Requires: %{name} = %{version}-%{release}
  
@@@ -135,12 -121,6 +134,12 @@@ This package is for tes
  export CFLAGS+=" -Wno-deprecated-declarations"
  export CXXFLAGS+=" -Wno-deprecated-declarations"
  
 +%if %{with TIZEN_PUBLIC}
 +export CFLAGS+=" -DTIZEN_FEATURE_PUBLIC"
 +export CXXFLAGS+=" -DTIZEN_FEATURE_PUBLIC"
 +%define TIZEN_PUBLIC ON
 +%define USE_MIXER no
 +%else
  %if ("%{_vd_cfg_product_type}" == "AUDIO")
  export CFLAGS+=" -DIS_AUDIO_PRODUCT"
  export CXXFLAGS+=" -DIS_AUDIO_PRODUCT"
@@@ -152,8 -132,6 +151,8 @@@ export CXXFLAGS+=" -DUSE_MIXER
  %define PRODUCT_TYPE_AUDIO no
  %define USE_MIXER yes
  %endif
 +%define TIZEN_PUBLIC OFF
 +%endif
  
  #TODO: check AV type is used or not
  %if ("%{_vd_cfg_product_type}" == "AV")
@@@ -179,21 -157,18 +178,21 @@@ export LDFLAGS+=" -lgcov
  
  export CXXFLAGS+=" -Wno-pessimizing-move"
  
 +%if %{without TIZEN_PUBLIC}
  %ifarch aarch64
  export CXXFLAGS+=" -DDRM_MAPI_AARCH_64"
  %endif
 +%endif
  
  %if ("%{sec_buildconf_product_lite_tizen}" == "n")
  %if %{with ESPLUSPLAYER_UT}
 -%cmake . -DESPLUSPLAYER_BUILD_UT=ON -DPRODUCT_TYPE_AUDIO=%PRODUCT_TYPE_AUDIO -DUSE_MIXER=%USE_MIXER
 +%cmake . -DESPLUSPLAYER_BUILD_UT=ON -DPRODUCT_TYPE_AUDIO=%PRODUCT_TYPE_AUDIO -DUSE_MIXER=%USE_MIXER -DTIZEN_PUBLIC=%TIZEN_PUBLIC
  %else
 -%cmake . -DPRODUCT_TYPE_AUDIO=%PRODUCT_TYPE_AUDIO -DUSE_MIXER=%USE_MIXER
 +%cmake . -DPRODUCT_TYPE_AUDIO=%PRODUCT_TYPE_AUDIO -DUSE_MIXER=%USE_MIXER -DTIZEN_PUBLIC=%TIZEN_PUBLIC
  %endif
  %else
 -%cmake . -DPRODUCT_TYPE_AUDIO=%PRODUCT_TYPE_AUDIO -DUSE_MIXER=%USE_MIXER
 +%cmake . -DPRODUCT_TYPE_AUDIO=%PRODUCT_TYPE_AUDIO -DUSE_MIXER=%USE_MIXER -DTIZEN_PUBLIC=%TIZEN_PUBLIC
 +
  %endif
  
  make %{?jobs:-j%jobs}
@@@ -21,15 -21,11 +21,16 @@@ SET(${fw_name}_CXXFLAGS "-Wall -Werror 
  
  SET(dependents "gstreamer-1.0 glib-2.0 dlog"
                 "boost"
 -               "tv-resource-manager"
                 "elementary ecore ecore-wl2"
-                "jsoncpp")
+                "jsoncpp"
+                "drmdecrypt")
  
 +IF(${TIZEN_PUBLIC} STREQUAL "OFF")
 +SET(dependents ${dependents} "tv-resource-manager")
 +ELSE(${TIZEN_PUBLIC} STREQUAL "OFF")
 +SET(dependents ${dependents} "capi-media-sound-manager")
 +ENDIF(${TIZEN_PUBLIC} STREQUAL "OFF")
 +
  INCLUDE(FindPkgConfig)
  
  IF(CMAKE_SYSTEM_PROCESSOR STREQUAL armv7l)
@@@ -5,6 -5,8 +5,8 @@@
  #ifndef __ESPLUSPLAYER_SRC_ESPLAYER_ESPLAYER__H__
  #define __ESPLUSPLAYER_SRC_ESPLAYER_ESPLAYER__H__
  
+ #include <IEME.h>
  #include <boost/core/noncopyable.hpp>
  #include <future>
  #include <list>
@@@ -16,9 -18,7 +18,9 @@@
  #include <vector>
  
  #include "core/decoderinputbuffer.h"
 +#ifndef TIZEN_FEATURE_PUBLIC
  #include "core/kpi.h"
 +#endif
  #include "core/trackrendereradapter.h"
  #ifdef USE_MIXER
  #include "mixer/mixerticket.h"
@@@ -158,10 -158,6 +160,10 @@@ class EsPlayer : public EsPlusPlayer 
    bool GetVideoStreamRotationInfo(VideoRotation* rotation) override;
    bool SetSimpleMixOutBufferLevel(
        const PlayerSimpleMixOutBufferLevel level) override;
 +#ifdef TIZEN_FEATURE_PUBLIC
 +  bool EnableVideoHole(bool value) override;
 +  bool SetSoundStreamInfo(const sound_stream_info_h stream_info) override;
 +#endif  // TIZEN_FEATURE_PUBLIC
  
   private:
    using SubmitPacketOperator =
    void ResetContextForStop_();
    void GetSrcQueueCurrentSize_(const TrackType& type, uint64_t* byte_size,
                                 uint64_t* time_size);
 +#ifndef TIZEN_FEATURE_PUBLIC
    kpi::EsCodecLoggerKeys MakeKpiKeys_();
 +#endif
  #ifdef USE_MIXER
    bool PrepareVideoMixingMode_(std::vector<Track>* tracks);
  #endif  // USE_MIXER
    EsStateManager state_manager_;
  
    SubmitDataType submit_data_type_ = SubmitDataType::kCleanData;
+   std::string key_system_;
+   bool key_system_acquired_ = false;
    drm::Property drm_property_;
    std::uint32_t low_latency_mode_ = 0;
    std::uint32_t video_frame_peek_mode_ = 0;
index fa1922e,a022e13..9096ef6
mode 100644,100755..100755
@@@ -18,9 -18,7 +18,9 @@@
  
  #include "core/gst_utils.h"
  #include "core/track_util.h"
 +#ifndef TIZEN_FEATURE_PUBLIC
  #include "core/utils/caf_logger.h"
 +#endif
  #include "core/utils/performance_checker.h"
  #include "core/utils/plusplayer_cfg.h"
  #include "core/utils/plusplayer_log.h"
@@@ -296,11 -294,9 +296,11 @@@ inline bool IsExclusiveLowLatencyMode(s
  
  EsPlayer::EsPlayer() {
    std::call_once(es_conf::loaded, [this]() { es_conf::LoadIniFile(); });
 +#ifndef TIZEN_FEATURE_PUBLIC
    if (CafLogger::Initialize() != true) {
      LOG_INFO("CAF Dbus not connect.");
    }
 +#endif
    InitValuesFromIni_();
  }
  
@@@ -329,12 -325,9 +329,12 @@@ bool EsPlayer::Open() 
      performance_checker::End(start, "Open");
      return true;
    };
 +
 +#ifndef TIZEN_FEATURE_PUBLIC
    CafLogger::SetUniqueNumber();
    caf_unique_number = CafLogger::GetUniqueNumber();
    CafLogger::LogMessage(CafEventType::kIdle, caf_unique_number);
 +#endif
  
    es_event::Open event{op};
    return state_manager_.ProcessEvent(event);
@@@ -521,9 -514,7 +521,9 @@@ bool EsPlayer::Start() 
      return true;
    };
  
 +#ifndef TIZEN_FEATURE_PUBLIC
    CafLogger::LogMessage(CafEventType::kPlaying, caf_unique_number);
 +#endif
  
    es_event::Start event{op};
    return state_manager_.ProcessEvent(event);
@@@ -555,10 -546,8 +555,10 @@@ bool EsPlayer::Stop() 
      LOG_INFO_P(this, "Wait , Wait Prepare() Done...");
    }
  
 +#ifndef TIZEN_FEATURE_PUBLIC
    CafLogger::LogMessage(CafEventType::kIdle, caf_unique_number);
    CafLogger::StopLoggingThread();
 +#endif
  
    return res;
  }
@@@ -726,10 -715,8 +726,10 @@@ bool EsPlayer::Prepare_() 
      return true;
    };
  
 +#ifndef TIZEN_FEATURE_PUBLIC
    CafLogger::StartLoggingThread();
    CafLogger::LogMessage(CafEventType::kReady, caf_unique_number);
 +#endif
  
    es_event::Prepare event{op};
    if (!state_manager_.ProcessEvent(event)) {
@@@ -749,11 -736,9 +749,11 @@@ void EsPlayer::PrepareTask_() 
      LOG_INFO_P(this, "call OnPrepareDone End");
    }
  
 +#ifndef TIZEN_FEATURE_PUBLIC
    kpi::CodecLogger logger;
    kpi::EsCodecLoggerKeys event_keys = MakeKpiKeys_();
    logger.SendKpi(ret, event_keys);
 +#endif
    LOG_LEAVE_P(this);
  }
  
@@@ -791,9 -776,7 +791,9 @@@ bool EsPlayer::Pause() 
          internal::ConvertToStreamType(track.type), true);
    }
  
 +#ifndef TIZEN_FEATURE_PUBLIC
    CafLogger::LogMessage(CafEventType::kPaused, caf_unique_number);
 +#endif
  
    es_event::Pause event{op};
    return state_manager_.ProcessEvent(event);
@@@ -826,9 -809,7 +826,9 @@@ bool EsPlayer::Resume() 
          internal::ConvertToStreamType(track.type), true);
    }
  
 +#ifndef TIZEN_FEATURE_PUBLIC
    CafLogger::LogMessage(CafEventType::kPlaying, caf_unique_number);
 +#endif
  
    es_event::Resume event{op};
    return state_manager_.ProcessEvent(event);
@@@ -897,9 -878,7 +897,9 @@@ void EsPlayer::SetAppInfo(const PlayerA
    app_info_ = app_info;
    trackrenderer_->SetAppInfo(app_info);
    LOG_INFO("Appid [%s]", app_info.id.c_str());
 +#ifndef TIZEN_FEATURE_PUBLIC
    CafLogger::SetAppId(app_info.id);
 +#endif
  }
  
  void EsPlayer::SetAppInfoEx(const PlayerAppInfoEx& app_info) {
    app_info_.type = app_info.type;
    trackrenderer_->SetAppInfoEx(app_info);
    LOG_INFO("Appid [%s]", app_info_.id.c_str());
 +#ifndef TIZEN_FEATURE_PUBLIC
    CafLogger::SetAppId(app_info_.id);
 +#endif
  }
  
  bool EsPlayer::SetPlaybackRate(const double rate, const bool audio_mute) {
@@@ -1193,9 -1170,7 +1193,9 @@@ bool EsPlayer::SetStream_(const Track& 
      return true;
    };
  
 +#ifndef TIZEN_FEATURE_PUBLIC
    CafLogger::LogMessage(CafEventType::kStreamReady, caf_unique_number);
 +#endif
  
    es_event::SetStream event{op};
    return state_manager_.ProcessEvent(event);
@@@ -1337,6 -1312,7 +1337,7 @@@ void EsPlayer::ResetContextForClose_() 
    app_info_ = PlayerAppInfo();
    src_queue_size_ = SrcQueueSize();
    is_msg_task_stop_ = false;
+   key_system_acquired_ = false;
  }
  
  void EsPlayer::ResetContextForStop_() {
@@@ -1372,8 -1348,12 +1373,12 @@@ void EsPlayer::GetSrcQueueCurrentSize_(
          &time_size_);
    } else
      return;
-   *byte_size = boost::any_cast<std::uint64_t>(byte_size_);
-   *time_size = boost::any_cast<std::uint64_t>(time_size_);
+   try {
+     *byte_size = boost::any_cast<std::uint64_t>(byte_size_);
+     *time_size = boost::any_cast<std::uint64_t>(time_size_);
+   } catch (...) {
+     LOG_INFO_P(this, "any_cast failed");
+   }
    if (time_unit_type == kPlayerTimeUnitTypeMs)
      *time_size = util::ConvertNsToMs(*time_size);
    else if (time_unit_type == kPlayerTimeUnitTypeUs)
@@@ -1660,6 -1640,19 +1665,19 @@@ PacketSubmitStatus EsPlayer::SubmitEncr
      MakeGstBufferForEncryptedPacket_(gstbuffer, packet, drm_info);
      return PacketSubmitStatus::kSuccess;
    };
+   if (!key_system_acquired_ && drm_info.handle != 0) {
+     key_system_ = eme::IEME::getKeySystemName(drm_info.handle);
+     LOG_INFO("KeySystemName :: [%s] ", key_system_.c_str());
+     if (!state_manager_
+              .GetPreparingState()) {  // if the stream comes with clean data at
+                                       // the beginning, re-post kpi when we get
+                                       // key system.
+       kpi::CodecLogger logger;
+       kpi::EsCodecLoggerKeys event_keys = MakeKpiKeys_();
+       logger.SendKpi(true, event_keys);
+     }
+     key_system_acquired_ = true;
+   }
    return SubmitPacketCommon_(packet, submitpacket_op);
  }
  // LCOV_EXCL_STOP
@@@ -3002,7 -2995,6 +3020,7 @@@ bool EsPlayer::SetSimpleMixOutBufferLev
    return trackrenderer_->SetSimpleMixOutBufferLevel(converted_level);
  }
  
 +#ifndef TIZEN_FEATURE_PUBLIC
  kpi::EsCodecLoggerKeys EsPlayer::MakeKpiKeys_() {
    kpi::EsCodecLoggerKeys event_info;
    event_info.app_id = app_info_.id;
      event_info.is_clean = true;
    } else {
      event_info.is_clean = false;
+     event_info.key_system = key_system_;
    }
  
    for (const auto& track : track_) {
    }
    return event_info;
  }
 +#endif
  
  void EsPlayer::InitValuesFromIni_() {
    force_audio_swdecoder_use_ = es_conf::ini_property["force_sw_audio_codec"];
    force_video_swdecoder_use_ = es_conf::ini_property["force_sw_video_codec"];
  }
  
 +#ifdef TIZEN_FEATURE_PUBLIC
 +bool EsPlayer::EnableVideoHole(bool value) {
 +  if (state_manager_.GetState() < EsState::kIdle) {
 +    LOG_ERROR_P(this, "Invalid State , current %d",
 +                state_manager_.GetStateEnum());
 +    return false;
 +  }
 +  return trackrenderer_->EnableVideoHole(value);
 +}
 +
 +bool EsPlayer::SetSoundStreamInfo(const sound_stream_info_h stream_info) {
 +  if (state_manager_.GetState() != EsState::kIdle) {
 +    LOG_ERROR_P(this, "Invalid State , current %d",
 +                state_manager_.GetStateEnum());
 +    return false;
 +  }
 +  if (!stream_info) {
 +    LOG_ERROR_P(this, "stream_info is null");
 +    return false;
 +  }
 +  return trackrenderer_->SetSoundStreamInfo(stream_info);
 +}
 +#endif
 +
  namespace es_conf {
  
  void LoadIniProperty(const Json::Value& root) {
@@@ -307,11 -307,7 +307,11 @@@ class listener_bridge : public espluspl
      _pkt->pts = packet.pts;
      _pkt->duration = packet.duration;
      _pkt->surface_data = static_cast<void*>(packet.surface_data);
 +#ifdef TIZEN_FETURE_PUBLIC
 +    _pkt->private_data = packet.buffer_addr;
 +#else
      _pkt->private_data = packet.scaler_index;
 +#endif
      if (decoded_pkt_mgr_ && decoded_pkt_mgr_->TryToAdd(_pkt)) {
        this->media_packet_video_decoded_cb_(
            _pkt, media_packet_video_decoded_cb_userdata_);
@@@ -1505,11 -1501,7 +1505,11 @@@ std::shared_ptr<DecodedPacketManagerInt
            _pkt.pts = pkt->pts;
            _pkt.duration = pkt->duration;
            _pkt.surface_data = static_cast<tbm_surface_h>(pkt->surface_data);
 +#ifdef TIZEN_FEATURE_PUBLIC
 +          _pkt.buffer_addr = pkt->private_data;
 +#else
            _pkt.scaler_index = pkt->private_data;
 +#endif
            return cast_(handle)->ReturnDecodedPacket(_pkt);
          });
    return mgr;
@@@ -1932,11 -1924,7 +1932,11 @@@ int esplusplayer_get_decoded_video_pack
      packet->pts = _packet.pts;
      packet->duration = _packet.duration;
      packet->surface_data = static_cast<void*>(_packet.surface_data);
 +#ifdef TIZEN_FEATURE_PUBLIC
 +    packet->private_data = _packet.buffer_addr;
 +#else
      packet->private_data = _packet.scaler_index;
 +#endif
    }
    if (state) {
      *state = convert_get_decoded_video_frame_status_(_state);
@@@ -2305,7 -2293,6 +2305,6 @@@ int esplusplayer_set_resource_allocate_
    LOG_ENTER_P(cast_(handle))
    if (is_null_(handle)) return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
    LOG_INFO("policy: %d", static_cast<int>(policy));
    auto ret = cast_(handle)->SetResourceAllocatePolicy(
        static_cast<RscAllocPolicy>(policy));
    return convert_return_type_(ret);
@@@ -2431,24 -2418,3 +2430,24 @@@ int esplusplayer_set_simple_mix_out_buf
    return convert_return_type_(cast_(handle)->SetSimpleMixOutBufferLevel(
        static_cast<PlayerSimpleMixOutBufferLevel>(level)));
  }
 +
 +#ifdef TIZEN_FEATURE_PUBLIC
 +int esplusplayer_enable_video_hole(esplusplayer_handle handle,
 +                                   const bool value) {
 +  LOG_ENTER_P(cast_(handle))
 +  if (is_null_(handle)) return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
 +
 +  auto ret = cast_(handle)->EnableVideoHole(value);
 +  return convert_return_type_(ret);
 +}
 +
 +int esplusplayer_set_sound_stream_info(esplusplayer_handle handle,
 +                                       const sound_stream_info_h stream_info) {
 +  LOG_ENTER_P(cast_(handle))
 +  if (is_null_(handle) || is_null_(stream_info))
 +    return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
 +
 +  auto ret = cast_(handle)->SetSoundStreamInfo(stream_info);
 +  return convert_return_type_(ret);
 +}
 +#endif
index 8bdbdc5,5666638..bde1350
mode 100644,100755..100755
@@@ -13,9 -13,6 +13,9 @@@ namespace esplusplayer 
  namespace adapter_utils {
  
  void InitTrack(TrackRendererTrack* track) {
 +#ifdef TIZEN_FEATURE_PUBLIC
 +  memset(track, 0x00, sizeof(TrackRendererTrack));
 +#endif
    track->index = kTrackRendererInvalidTrackIndex;  // int index
    track->id = 0;                                   // int id
    track->mimetype = nullptr;                       // const char* mimetype
@@@ -511,11 -508,7 +511,11 @@@ DecodedVideoPacket ConvertToDecodedVide
    _packet.pts = packet->pts;
    _packet.duration = packet->duration;
    _packet.surface_data = static_cast<tbm_surface_h>(packet->surface_data);
 +#ifdef TIZEN_FEATURE_PUBLIC
 +  _packet.buffer_addr = packet->buffer_addr;
 +#else
    _packet.scaler_index = packet->scaler_index;
 +#endif
    return _packet;
  }
  
@@@ -525,11 -518,7 +525,11 @@@ TrackRendererDecodedVideoPacket Convert
    _packet.pts = packet.pts;
    _packet.duration = packet.duration;
    _packet.surface_data = static_cast<tbm_surface_h>(packet.surface_data);
 +#ifdef TIZEN_FEATURE_PUBLIC
 +  _packet.buffer_addr = packet.buffer_addr;
 +#else
    _packet.scaler_index = packet.scaler_index;
 +#endif
    return _packet;
  }
  
@@@ -955,8 -944,12 +955,12 @@@ bool ConvertToTrackRendererRscAllocPoli
        *policy = kTrackRendererRscAllocConditional;
        return true;
      }
-     case RscAllocPolicy::kRscAllocExclusiveNoExplicit: {
-       *policy = kTrackRendererRscAllocExclusiveNoExplicit;
+     case RscAllocPolicy::kRscAllocInAppMultiview: {
+       *policy = kTrackRendererRscAllocInAppMultiview;
+       return true;
+     }
+     case RscAllocPolicy::kRscAllocExclusiveMfcForced: {
+       *policy = kTrackRendererRscAllocExclusiveMfcForced;
        return true;
      }
      default: