}
void RemoteSurfaceMixed::ForceToUpdateWatcher() {
+ LOGD("ForceToUpdate %s:%s", GetAppId().c_str(), GetInstId().c_str());
if (!is_file_) {
if (img_tbm_.get() == nullptr) {
LOGE("tbm surface is not ready");
}
}
+void RemoteSurfaceMixed::ReleaseBuffer() {
+ if (img_tbm_.get() != nullptr) {
+ LOGD("tbm surface release buffer %s:%s", GetAppId().c_str(),
+ GetInstId().c_str());
+ img_tbm_->ReleaseWlBuffer();
+ }
+}
+
void RemoteSurfaceMixed::SetChangedEventFilter(
RemoteSurface::ChangedEventFilter filter) {
RemoteSurface::SetChangedEventFilter(filter);
}
}
+void RemoteSurfaceWatcher::Impl::ReleaseFocusedSurfaceBuffer() {
+ if (focused_only_) {
+ for (auto& i : surfaces_) {
+ if (i->GetInstId() == focused_inst_id_) {
+ i->ReleaseBuffer();
+ }
+ }
+ }
+}
+
void RemoteSurfaceWatcher::Impl::OnAppFocused(const std::string& app_id,
const std::string& inst_id,
const int pid,
for (auto& i : impl_->surfaces_) {
i->SetChangedEventFilter(filter);
}
+
+
}
int RemoteSurfaceWatcher::SetRemoteRender() {
int RemoteSurfaceWatcher::SetBlock(bool enable) {
impl_->block_update_ = enable;
impl_->UpdateFocusedSurface();
+ if (enable)
+ impl_->ReleaseFocusedSurfaceBuffer();
+
return 0;
}
#include "screen_connector_remote_surface_evas/watcher_image_internal.h"
+#include <dlog.h>
+
+#undef LOG_TAG
+#define LOG_TAG "SC_RS_WI"
+
#define SC_TOOLKIT_HANDLE_TAG "SC_TOOLKIT_HANDLE_TAG"
namespace screen_connector {
void WatcherImage::ClearTbm() {
/* set null to previous object for the tbm type */
evas_object_image_native_surface_set(GetRaw(), NULL);
- prev_buf_.reset();
+ if (prev_buf_.get() != nullptr) {
+ prev_buf_.reset();
+ } else {
+ prev_surf_.reset();
+ }
+}
+
+void WatcherImage::ReleaseWlBuffer() {
+ if (prev_buf_.get() == nullptr)
+ return;
+
+ LOGD("ReleaseWlBuffer() start");
+
+ Evas_Native_Surface* ns;
+ tbm_surface_h surface;
+ int ret;
+ tbm_surface_info_s info = {0, };
+ tbm_surface_info_s info2;
+ void* source_data;
+
+ ns = evas_object_image_native_surface_get(GetRaw());
+ if (ns == nullptr) // image_ is file
+ return;
+
+ surface = (tbm_surface_h)ns->data.tbm.buffer;
+ if (surface == nullptr)
+ return;
+
+ ret = tbm_surface_map(surface, TBM_SURF_OPTION_READ, &info);
+ if (ret != TBM_SURFACE_ERROR_NONE)
+ return;
+
+ source_data = info.planes[0].ptr;
+ if (source_data == nullptr) {
+ tbm_surface_unmap(surface);
+ return;
+ }
+
+ prev_surf_.reset(new TbmSurface(tbm_surface_create(info.width, info.height, info.format), true));
+ if (prev_surf_.get() == nullptr) {
+ tbm_surface_unmap(surface);
+ return;
+ }
+
+ ret = tbm_surface_map(prev_surf_.get()->GetRaw(), TBM_SURF_OPTION_WRITE, &info2);
+ if (ret != TBM_SURFACE_ERROR_NONE) {
+ tbm_surface_unmap(surface);
+ return;
+ }
+
+ memset(info2.planes[0].ptr, 0, info2.planes[0].size);
+ memcpy(info2.planes[0].ptr, source_data, info.planes[0].size);
+
+ Evas_Native_Surface ns2;
+ memset(&ns2, 0, sizeof(Evas_Native_Surface));
+ ns2.version = EVAS_NATIVE_SURFACE_VERSION;
+ ns2.type = EVAS_NATIVE_SURFACE_TBM;
+ ns2.data.tbm.buffer = prev_surf_.get()->GetRaw();
+ evas_object_image_native_surface_set(GetRaw(), &ns2);
+
+ tbm_surface_unmap(surface);
+ tbm_surface_unmap(prev_surf_.get()->GetRaw());
+ prev_buf_.reset();
+
+ LOGD("ReleaseWlBuffer() end");
}
void WatcherImage::UpdateFile(int fd, uint32_t size) {