[M94 Migration]Validate the playback buffer before tile/video rasterization. 98/293198/10
authorsuyambu.rm <suyambu.rm@samsung.com>
Mon, 11 Sep 2017 13:18:29 +0000 (18:48 +0530)
committerBot Blink <blinkbot@samsung.com>
Thu, 1 Jun 2023 00:16:00 +0000 (00:16 +0000)
The memory acquired from shared memory buffer, is used for creating
sksurface/skcanvas for tile/video rasterization. Some times the bitmap
pixels (staging buffer) which is backing skcanvas looks corrupted,
causing crashes while writing content to the bitmap. Also it applies
minimum canvas2d accleration size same as TV.

Ref: https://review.tizen.org/gerrit/c/255193

Change-Id: Ib016e22a9436081e44e53228271e6dbd5e1e2b89
Signed-off-by: suyambu.rm <suyambu.rm@samsung.com>
cc/raster/one_copy_raster_buffer_provider.cc
media/renderers/video_resource_updater.cc

index 96e6ba20da08513ddb6a63471e5cbbc9bd5d5f8f..060494382d14364f16d27f95d6b9645c8492f6ee 100644 (file)
@@ -349,7 +349,12 @@ void OneCopyRasterBufferProvider::PlaybackToStagingBuffer(
     DCHECK(buffer->memory(0));
     // RasterBufferProvider::PlaybackToMemory only supports unsigned strides.
     DCHECK_GE(buffer->stride(0), 0);
-
+#if defined(OS_TIZEN)
+    if (!buffer->memory(0) || buffer->stride(0) < 0) {
+      LOG(ERROR) << "Backing buffer creation for rasterization fails";
+      return;
+    }
+#endif
     // TODO(https://crbug.com/870663): Temporary diagnostics.
     base::debug::Alias(&playback_rect);
     base::debug::Alias(&full_rect_size);
@@ -364,9 +369,9 @@ void OneCopyRasterBufferProvider::PlaybackToStagingBuffer(
     DCHECK(!playback_rect.IsEmpty())
         << "Why are we rastering a tile that's not dirty?";
     RasterBufferProvider::PlaybackToMemory(
-        buffer->memory(0), format, staging_buffer->size, buffer->stride(0),
-        raster_source, raster_full_rect, playback_rect, transform,
-        dst_color_space, /*gpu_compositing=*/true, playback_settings);
+      buffer->memory(0), format, staging_buffer->size, buffer->stride(0),
+      raster_source, raster_full_rect, playback_rect, transform,
+      dst_color_space, /*gpu_compositing=*/true, playback_settings);
     buffer->Unmap();
     staging_buffer->content_id = new_content_id;
   }
index a8b5a50f2dcb6199e1524307e71f11efcb20c679..26114add75f2fe308db0b58ae20bbd1ec0de6dc1 100644 (file)
@@ -1101,16 +1101,33 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes(
           video_renderer_ = std::make_unique<PaintCanvasVideoRenderer>();
 
         SoftwarePlaneResource* software_resource = plane_resource->AsSoftware();
+#if defined(OS_TIZEN)
+        if (!software_resource->pixels()) {
+          LOG(ERROR) << " Invalid Software Resource "
+                     << software_resource->resource_size().width() << ":"
+                     << software_resource->resource_size().height();
+          return VideoFrameExternalResources();
+        }
+#endif
 
         // We know the format is RGBA_8888 from check above.
         SkImageInfo info = SkImageInfo::MakeN32Premul(
             gfx::SizeToSkISize(software_resource->resource_size()));
 
         SkBitmap sk_bitmap;
+#if defined(OS_TIZEN)
+        bool success = sk_bitmap.installPixels(
+            info, software_resource->pixels(), info.minRowBytes());
+        if (!success) {
+          LOG(ERROR) << " SkBitmap installPixels failed ";
+          return VideoFrameExternalResources();
+        }
+#else
         sk_bitmap.installPixels(info, software_resource->pixels(),
                                 info.minRowBytes());
         // This is software path, so |canvas| and |video_frame| are always
         // backed by software.
+#endif
         cc::SkiaPaintCanvas canvas(sk_bitmap);
         cc::PaintFlags flags;
         flags.setBlendMode(SkBlendMode::kSrc);