video-frame: Avoid using tile width
authorNicolas Dufresne <nicolas.dufresne@collabora.com>
Wed, 16 Nov 2022 20:17:24 +0000 (15:17 -0500)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Fri, 18 Nov 2022 22:59:29 +0000 (22:59 +0000)
The tile width in pixel is not always available. Notably for
8L128 10bit format, the tile is 8x128 bytes, and the pixel
format is fully packed. That means that the tile contains at
least 6 pixels per line, but it also hold some bits of the
pixel from the same line on the previous or next tile.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3424>

subprojects/gst-plugins-base/gst-libs/gst/video/video-frame.c

index 0e7e49c..bfb57e4 100644 (file)
@@ -349,12 +349,10 @@ gst_video_frame_copy_plane (GstVideoFrame * dest, const GstVideoFrame * src,
   if (GST_VIDEO_FORMAT_INFO_IS_TILED (finfo)) {
     gint tile_size;
     gint sx_tiles, sy_tiles, dx_tiles, dy_tiles;
-    guint i, j, tw, th;
+    guint i, j;
     GstVideoTileMode mode;
 
     tile_size = GST_VIDEO_FORMAT_INFO_TILE_SIZE (finfo, plane);
-    tw = GST_VIDEO_FORMAT_INFO_TILE_WIDTH (finfo, plane);
-    th = GST_VIDEO_FORMAT_INFO_TILE_HEIGHT (finfo, plane);
 
     mode = GST_VIDEO_FORMAT_INFO_TILE_MODE (finfo);
 
@@ -365,8 +363,8 @@ gst_video_frame_copy_plane (GstVideoFrame * dest, const GstVideoFrame * src,
     dy_tiles = GST_VIDEO_TILE_Y_TILES (ds);
 
     /* this is the amount of tiles to copy */
-    w = ((w - 1) / tw) + 1;
-    h = ((h - 1) / th) + 1;
+    w = MIN (sx_tiles, dx_tiles);
+    h = MIN (sy_tiles, dy_tiles);
 
     /* FIXME can possibly do better when no retiling is needed, it depends on
      * the stride and the tile_size */