[TTVD] Skip rendering pictures with different size than pixmap 12/315412/3
authorJakub Gajownik <j.gajownik2@samsung.com>
Fri, 26 Jul 2024 11:13:33 +0000 (13:13 +0200)
committerBot Blink <blinkbot@samsung.com>
Wed, 31 Jul 2024 16:35:07 +0000 (16:35 +0000)
When RTC stream is decoded by TTVD video decoder, overlay
rendering mode is used and there's in-stream resolution
change, we might end up with different decoded picture size
than the one in video frame. This is an issue, because
layout is calculated based on information provided in the
video frame. In the result, we'll end up with wrong
geometry calculation, because picture size is already
updated, but not yet the one from compositor.

This is first step toward fixing this issue. If such
situation happens (decoded size is different than in the
native pixmap) this specific frame won't be rendered.

Bug: https://jira-eu.sec.samsung.net/browse/VDGAME-543
Change-Id: I5245b28b22a07d11636181b104a740a70b414bcd
Signed-off-by: Jakub Gajownik <j.gajownik2@samsung.com>
tizen_src/chromium_impl/ui/ozone/platform/efl/output_surface.h
tizen_src/chromium_impl/ui/ozone/platform/efl/output_surface_impl.cc
tizen_src/chromium_impl/ui/ozone/platform/efl/output_surface_impl.h
tizen_src/chromium_impl/ui/ozone/platform/efl/output_surface_manager.cc
tizen_src/chromium_impl/ui/ozone/platform/efl/output_surface_proxy.cc
tizen_src/chromium_impl/ui/ozone/platform/efl/output_surface_proxy.h
tizen_src/chromium_impl/ui/ozone/platform/efl/tizen_native_pixmap.cc

index 8976ba12f317d4c537ce611a997bfcae91ec6ee4..bae7bd357083547f27f85433efca33c0a7ebfe36 100644 (file)
@@ -23,7 +23,9 @@ class OutputSurface {
 
   virtual ~OutputSurface() = default;
 
-  virtual void Render(const gfx::OverlayPlaneData&, gfx::OverlayRenderData) = 0;
+  virtual void Render(const gfx::OverlayPlaneData&,
+                      gfx::Size,
+                      gfx::OverlayRenderData) = 0;
 };
 
 std::ostream& operator<<(std::ostream& stream, OutputSurface::Plane plane);
index 479a1c194c595be3fb6ce94f9bda14df77a653f5..ee1a7c51ea4ba17e5c73376ae7789be4e96f24e8 100644 (file)
@@ -266,6 +266,7 @@ gfx::VideoOutputMode OutputSurfaceImpl::PrepareToRender(
 }
 
 void OutputSurfaceImpl::Render(const gfx::OverlayPlaneData& overlay_plane_data,
+                               gfx::Size original_size,
                                gfx::OverlayRenderData render_data) {
   if (last_picture_plane_ && render_data.picture_size.IsZero()) {
     if (last_picture_plane_ != render_data.plane_id) {
@@ -278,6 +279,12 @@ void OutputSurfaceImpl::Render(const gfx::OverlayPlaneData& overlay_plane_data,
     return;
   }
 
+  if (original_size != render_data.picture_size) {
+    TIZEN_MEDIA_LOG(INFO)
+        << "Pixmap size is different than decoded one, ignore it";
+    return;
+  }
+
   // At first apply color changes as setting resolution depends on
   // the value from |color_space_|.
   if (overlay_plane_data.color_space != color_space_) {
index 827b7393ec1d5902eb157543887e18dfbb71762e..296df2e42381ec091772570217a55c63145bd26f 100644 (file)
@@ -39,7 +39,9 @@ class OutputSurfaceImpl : public OutputSurface {
   // Might be called on different thread than creation and initialization
   // was done. It's also common scenario that each decoder has it's own
   // thread, so it should be also safe in such case.
-  void Render(const gfx::OverlayPlaneData&, gfx::OverlayRenderData) override;
+  void Render(const gfx::OverlayPlaneData&,
+              gfx::Size,
+              gfx::OverlayRenderData) override;
 
   void SetBelow(OutputSurfaceImpl& above);
 
index 39bca8ef6918e055e28a8691965ba6818b85edd9..988c29367fbd0410427082c9ced07eee92e7e813 100644 (file)
@@ -439,7 +439,7 @@ void OutputSurfaceManager::SurfaceRenderPrepare(
     surface = &scaler_it->surface();
   }
 
-  surface->Render(overlay_plane_data, render_data);
+  surface->Render(overlay_plane_data, render_data.picture_size, render_data);
 }
 
 }  // namespace ui
index d893a9f5d41f8df2e9d4b864a661c5a93bdf8ff1..1d59e23dfba8243c1ffd6b993c71517cddf1f821 100644 (file)
@@ -300,6 +300,7 @@ void OutputSurfaceProxy::PrepareToRenderOnWorker(
 }
 
 void OutputSurfaceProxy::Render(const gfx::OverlayPlaneData& overlay_plane_data,
+                                gfx::Size original_size,
                                 gfx::OverlayRenderData render_data) {
   base::AutoLock auto_lock(lock_);
   while (!initialized_) {
@@ -366,7 +367,7 @@ void OutputSurfaceProxy::Render(const gfx::OverlayPlaneData& overlay_plane_data,
     event.Wait();
   }
 
-  impl_->Render(overlay_plane_data, render_data);
+  impl_->Render(overlay_plane_data, original_size, render_data);
 }
 
 base::TokenCB OutputSurfaceProxy::ResourceConflict() {
index ecfec159378091213de0d3ec01742721e405e933..c52119d791a74ac3765a1cad959d0d875bdcc2dc 100644 (file)
@@ -41,7 +41,9 @@ class OutputSurfaceProxy
 
   // OutputSurface implementation.
   // Called on decoder thread only.
-  void Render(const gfx::OverlayPlaneData&, gfx::OverlayRenderData) override;
+  void Render(const gfx::OverlayPlaneData&,
+              gfx::Size,
+              gfx::OverlayRenderData) override;
 
   Plane plane() const { return plane_; }
 
index 5adc16753ba1df06472119b4c6884d8d145b866d..ddd7cc1e24b1372494f508e77c0aff7f188467eb 100644 (file)
@@ -117,7 +117,7 @@ bool TizenNativePixmap::ScheduleSoftwareOverlayPlane(
   nv12_data.uv_stride = handle_.planes[1].stride;
   nv12_data.uv_phys_offset = handle_.planes[1].offset;
   render_data.nv12_data = &nv12_data;
-  surface->Render(overlay_plane_data, render_data);
+  surface->Render(overlay_plane_data, size_, render_data);
   return true;
 }
 
@@ -146,7 +146,7 @@ bool TizenNativePixmap::ScheduleOverlayPlane(
   auto surface = surface_factory_->GetSurface(widget);
   if (surface) {
     overlay_plane->Render(base::BindRepeating(
-        &OutputSurface::Render, std::move(surface), overlay_plane_data));
+        &OutputSurface::Render, std::move(surface), overlay_plane_data, size_));
   } else {
     overlay_plane->Render(base::DoNothingAs<void(gfx::OverlayRenderData)>());
   }