mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 12:11:13 +00:00
video-tile: add tile mode and helper functions
Move the tile helper functions to their own file. Make it possible to make other tiling modes later. https://bugzilla.gnome.org/show_bug.cgi?id=707361
This commit is contained in:
parent
f8d3b9b4fc
commit
3ceb7dfe22
4 changed files with 197 additions and 92 deletions
|
@ -27,6 +27,7 @@ libgstvideo_@GST_API_VERSION@_la_SOURCES = \
|
||||||
video-color.c \
|
video-color.c \
|
||||||
video-info.c \
|
video-info.c \
|
||||||
video-frame.c \
|
video-frame.c \
|
||||||
|
video-tile.c \
|
||||||
gstvideosink.c \
|
gstvideosink.c \
|
||||||
gstvideofilter.c \
|
gstvideofilter.c \
|
||||||
convertframe.c \
|
convertframe.c \
|
||||||
|
@ -54,6 +55,7 @@ libgstvideo_@GST_API_VERSION@include_HEADERS = \
|
||||||
video-color.h \
|
video-color.h \
|
||||||
video-info.h \
|
video-info.h \
|
||||||
video-frame.h \
|
video-frame.h \
|
||||||
|
video-tile.h \
|
||||||
gstvideosink.h \
|
gstvideosink.h \
|
||||||
gstvideofilter.h \
|
gstvideofilter.h \
|
||||||
gstvideometa.h \
|
gstvideometa.h \
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "video-format.h"
|
#include "video-format.h"
|
||||||
|
#include "video-tile.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SECTION:gstvideo
|
* SECTION:gstvideo
|
||||||
|
@ -2082,98 +2083,6 @@ pack_I422_10BE (const GstVideoFormatInfo * info, GstVideoPackFlags flags,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* GstVideoTileMode:
|
|
||||||
* @GST_VIDEO_TILE_MODE_UNKNOWN: Unknown or unset video format id
|
|
||||||
* @GST_VIDEO_TILE_MODE_ZFLIPZ_2X2: Every four adjacent buffers - two
|
|
||||||
* horizontally and two vertically are grouped together and are located
|
|
||||||
* in memory in Z or flipped Z order.
|
|
||||||
*
|
|
||||||
* Enum value describing the most common video formats.
|
|
||||||
*/
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
GST_VIDEO_TILE_MODE_NONE,
|
|
||||||
GST_VIDEO_TILE_MODE_ZFLIPZ_2X2,
|
|
||||||
} GstVideoTileMode;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_video_tile_get_index:
|
|
||||||
* @mode: a #GstVideoTileMode
|
|
||||||
* @x: x coordinate
|
|
||||||
* @y: y coordinate
|
|
||||||
* @x_tiles: number of horizintal tiles
|
|
||||||
* @y_tiles: number of vertical tiles
|
|
||||||
*
|
|
||||||
* Get the tile index of the tile at coordinates @x and @y.
|
|
||||||
*
|
|
||||||
* Returns: the index of the tile at @x and @y in the tiled image of
|
|
||||||
* @x_tiles by @y_tiles.
|
|
||||||
*/
|
|
||||||
static gsize
|
|
||||||
gst_video_tile_get_index (GstVideoTileMode mode, gint x, gint y,
|
|
||||||
gint x_tiles, gint y_tiles)
|
|
||||||
{
|
|
||||||
gsize offset;
|
|
||||||
|
|
||||||
switch (mode) {
|
|
||||||
case GST_VIDEO_TILE_MODE_ZFLIPZ_2X2:
|
|
||||||
/* Due to the zigzag pattern we know that tiles are numbered like:
|
|
||||||
* (see http://linuxtv.org/downloads/v4l-dvb-apis/re31.html)
|
|
||||||
*
|
|
||||||
* | Column (x)
|
|
||||||
* | 0 1 2 3 4 5 6 7
|
|
||||||
* -------|---------------------------------------
|
|
||||||
* 0 | 0 1 6 7 8 9 14 15
|
|
||||||
* R 1 | 2 3 4 5 10 11 12 13
|
|
||||||
* o 2 | 16 17 22 23 24 25 30 31
|
|
||||||
* w 3 | 18 19 20 21 26 27 28 29
|
|
||||||
* 4 | 32 33 38 39 40 41 46 47
|
|
||||||
* (y) 5 | 34 35 36 37 42 43 44 45
|
|
||||||
* 6 | 48 49 50 51 52 53 54 55
|
|
||||||
*
|
|
||||||
* From this we can see that:
|
|
||||||
*
|
|
||||||
* For even rows:
|
|
||||||
* - The first block in a row is always mapped to memory block 'y * width'.
|
|
||||||
* - For all even rows, except for the last one when 'y' is odd, from the first
|
|
||||||
* block number an offset is then added to obtain the block number for
|
|
||||||
* the other blocks in the row. The offset is 'x' plus the corresponding
|
|
||||||
* number in the series [0, 0, 4, 4, 4, 4, 8, 8, 8, 8, 12, ...], which can be
|
|
||||||
* expressed as 'GST_ROUND_DOWN_4 (x + 2)'.
|
|
||||||
* f(x,y,width,height) = y * width + x + GST_ROUND_DOWN_4 (x + 2)
|
|
||||||
*
|
|
||||||
* - For the last row when 'y' is odd the offset is simply 'x'.
|
|
||||||
* f(x,y,width,height) = y * width + x
|
|
||||||
* - Note that 'y' is even, so 'GST_ROUNDOWN_2 (y) == y' in this case
|
|
||||||
*
|
|
||||||
* For odd rows:
|
|
||||||
* - The first block in the row is always mapped to memory block
|
|
||||||
* 'GST_ROUND_DOWN_2(y) * width + 2'.
|
|
||||||
* - From the first block number an offset is then added to obtain the block
|
|
||||||
* number for the other blocks in the row. The offset is 'x' plus the
|
|
||||||
* corresponding number in the series [0, 0, 0, 0, 4, 4, 4, 4, 8, 8, 8, 8, 12, ...],
|
|
||||||
* which can be expressed as GST_ROUND_DOWN_4 (x).
|
|
||||||
* f(x,y,width,height) = GST_ROUND_DOWN_2 (y) * width + bx 2 + GST_ROUND_DOWN_4 (x)
|
|
||||||
*/
|
|
||||||
/* Common to all cases */
|
|
||||||
offset = GST_ROUND_DOWN_2 (y) * x_tiles + x;
|
|
||||||
|
|
||||||
if (y & 1) {
|
|
||||||
/* For odd row */
|
|
||||||
offset += 2 + GST_ROUND_DOWN_4 (x);
|
|
||||||
} else if ((y_tiles & 1) == 0 || y != (y_tiles - 1)) {
|
|
||||||
/* For even row except for the last row when odd height */
|
|
||||||
offset += GST_ROUND_DOWN_4 (x + 2);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
offset = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
get_tile_NV12 (gint tile_width, gint tile_height, gint tile_size, gint tx,
|
get_tile_NV12 (gint tile_width, gint tile_height, gint tile_size, gint tx,
|
||||||
gint ty, gint x_tiles, gint y_tiles,
|
gint ty, gint x_tiles, gint y_tiles,
|
||||||
|
|
102
gst-libs/gst/video/video-tile.c
Normal file
102
gst-libs/gst/video/video-tile.c
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
/* GStreamer
|
||||||
|
* Copyright (C) <2013> Wim Taymans <wim.taymans@gmail.com>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Library General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Library General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Library General Public
|
||||||
|
* License along with this library; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <gst/video/video-tile.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_video_tile_get_index:
|
||||||
|
* @mode: a #GstVideoTileMode
|
||||||
|
* @x: x coordinate
|
||||||
|
* @y: y coordinate
|
||||||
|
* @x_tiles: number of horizintal tiles
|
||||||
|
* @y_tiles: number of vertical tiles
|
||||||
|
*
|
||||||
|
* Get the tile index of the tile at coordinates @x and @y in the tiled
|
||||||
|
* image of @x_tiles by @y_tiles.
|
||||||
|
*
|
||||||
|
* Use this method when @mode is of type #GST_VIDEO_TILE_MODE_INDEXED.
|
||||||
|
*
|
||||||
|
* Returns: the index of the tile at @x and @y in the tiled image of
|
||||||
|
* @x_tiles by @y_tiles.
|
||||||
|
*/
|
||||||
|
guint
|
||||||
|
gst_video_tile_get_index (GstVideoTileMode mode, gint x, gint y,
|
||||||
|
gint x_tiles, gint y_tiles)
|
||||||
|
{
|
||||||
|
gsize offset;
|
||||||
|
|
||||||
|
g_return_val_if_fail (GST_VIDEO_TILE_MODE_IS_INDEXED (mode), 0);
|
||||||
|
|
||||||
|
switch (mode) {
|
||||||
|
case GST_VIDEO_TILE_MODE_ZFLIPZ_2X2:
|
||||||
|
/* Due to the zigzag pattern we know that tiles are numbered like:
|
||||||
|
* (see http://linuxtv.org/downloads/v4l-dvb-apis/re31.html)
|
||||||
|
*
|
||||||
|
* | Column (x)
|
||||||
|
* | 0 1 2 3 4 5 6 7
|
||||||
|
* -------|---------------------------------------
|
||||||
|
* 0 | 0 1 6 7 8 9 14 15
|
||||||
|
* R 1 | 2 3 4 5 10 11 12 13
|
||||||
|
* o 2 | 16 17 22 23 24 25 30 31
|
||||||
|
* w 3 | 18 19 20 21 26 27 28 29
|
||||||
|
* 4 | 32 33 38 39 40 41 46 47
|
||||||
|
* (y) 5 | 34 35 36 37 42 43 44 45
|
||||||
|
* 6 | 48 49 50 51 52 53 54 55
|
||||||
|
*
|
||||||
|
* From this we can see that:
|
||||||
|
*
|
||||||
|
* For even rows:
|
||||||
|
* - The first block in a row is always mapped to memory block 'y * width'.
|
||||||
|
* - For all even rows, except for the last one when 'y' is odd, from the first
|
||||||
|
* block number an offset is then added to obtain the block number for
|
||||||
|
* the other blocks in the row. The offset is 'x' plus the corresponding
|
||||||
|
* number in the series [0, 0, 4, 4, 4, 4, 8, 8, 8, 8, 12, ...], which can be
|
||||||
|
* expressed as 'GST_ROUND_DOWN_4 (x + 2)'.
|
||||||
|
* f(x,y,width,height) = y * width + x + GST_ROUND_DOWN_4 (x + 2)
|
||||||
|
*
|
||||||
|
* - For the last row when 'y' is odd the offset is simply 'x'.
|
||||||
|
* f(x,y,width,height) = y * width + x
|
||||||
|
* - Note that 'y' is even, so 'GST_ROUNDOWN_2 (y) == y' in this case
|
||||||
|
*
|
||||||
|
* For odd rows:
|
||||||
|
* - The first block in the row is always mapped to memory block
|
||||||
|
* 'GST_ROUND_DOWN_2(y) * width + 2'.
|
||||||
|
* - From the first block number an offset is then added to obtain the block
|
||||||
|
* number for the other blocks in the row. The offset is 'x' plus the
|
||||||
|
* corresponding number in the series [0, 0, 0, 0, 4, 4, 4, 4, 8, 8, 8, 8, 12, ...],
|
||||||
|
* which can be expressed as GST_ROUND_DOWN_4 (x).
|
||||||
|
* f(x,y,width,height) = GST_ROUND_DOWN_2 (y) * width + bx 2 + GST_ROUND_DOWN_4 (x)
|
||||||
|
*/
|
||||||
|
/* Common to all cases */
|
||||||
|
offset = GST_ROUND_DOWN_2 (y) * x_tiles + x;
|
||||||
|
|
||||||
|
if (y & 1) {
|
||||||
|
/* For odd row */
|
||||||
|
offset += 2 + GST_ROUND_DOWN_4 (x);
|
||||||
|
} else if ((y_tiles & 1) == 0 || y != (y_tiles - 1)) {
|
||||||
|
/* For even row except for the last row when odd height */
|
||||||
|
offset += GST_ROUND_DOWN_4 (x + 2);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
offset = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return offset;
|
||||||
|
}
|
92
gst-libs/gst/video/video-tile.h
Normal file
92
gst-libs/gst/video/video-tile.h
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
/* GStreamer
|
||||||
|
* Copyright (C) <2013> Wim Taymans <wim.taymans@gmail.com>
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Library General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Library General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Library General Public
|
||||||
|
* License along with this library; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __GST_VIDEO_TILE_H__
|
||||||
|
#define __GST_VIDEO_TILE_H__
|
||||||
|
|
||||||
|
#include <gst/gst.h>
|
||||||
|
|
||||||
|
#include <gst/video/video-format.h>
|
||||||
|
|
||||||
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GstVideoTileType:
|
||||||
|
* @GST_VIDEO_TILE_TYPE_INDEXED: Tiles are indexed. Use
|
||||||
|
* gst_video_tile_get_index () to retrieve the tile at the requested
|
||||||
|
* coordinates.
|
||||||
|
*
|
||||||
|
* Enum value describing the most common tiling types.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
GST_VIDEO_TILE_TYPE_INDEXED = 0
|
||||||
|
} GstVideoTileType;
|
||||||
|
|
||||||
|
#define GST_VIDEO_TILE_TYPE_SHIFT (16)
|
||||||
|
#define GST_VIDEO_TILE_TYPE_MASK ((1 << GST_VIDEO_TILE_TYPE_SHIFT) - 1)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GST_VIDEO_TILE_MAKE_MODE:
|
||||||
|
* @num: the mode number to create
|
||||||
|
* @type: the tile mode type
|
||||||
|
*
|
||||||
|
* use this macro to create new tile modes.
|
||||||
|
*/
|
||||||
|
#define GST_VIDEO_TILE_MAKE_MODE(num, type) \
|
||||||
|
(((num) << GST_VIDEO_TILE_TYPE_SHIFT) | (GST_VIDEO_TILE_TYPE_ ##type))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GST_VIDEO_TILE_MODE_TYPE:
|
||||||
|
* @mode: the tile mode
|
||||||
|
*
|
||||||
|
* Get the tile mode type of @mode
|
||||||
|
*/
|
||||||
|
#define GST_VIDEO_TILE_MODE_TYPE(mode) ((mode) & GST_VIDEO_TILE_TYPE_MASK)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GST_VIDEO_TILE_MODE_IS_INDEXED:
|
||||||
|
* @mode: a tile mode
|
||||||
|
*
|
||||||
|
* Check if @mode is an indexed tile type
|
||||||
|
*/
|
||||||
|
#define GST_VIDEO_TILE_MODE_IS_INDEXED(mode) (GST_VIDEO_TILE_MODE_TYPE(mode) == GST_VIDEO_TILE_TYPE_INDEXED)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GstVideoTileMode:
|
||||||
|
* @GST_VIDEO_TILE_MODE_UNKNOWN: Unknown or unset tile mode
|
||||||
|
* @GST_VIDEO_TILE_MODE_ZFLIPZ_2X2: Every four adjacent buffers - two
|
||||||
|
* horizontally and two vertically are grouped together and are located
|
||||||
|
* in memory in Z or flipped Z order.
|
||||||
|
*
|
||||||
|
* Enum value describing the available tiling modes.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
GST_VIDEO_TILE_MODE_UNKNOWN = 0,
|
||||||
|
GST_VIDEO_TILE_MODE_ZFLIPZ_2X2 = GST_VIDEO_TILE_MAKE_MODE (1, INDEXED),
|
||||||
|
} GstVideoTileMode;
|
||||||
|
|
||||||
|
guint gst_video_tile_get_index (GstVideoTileMode mode, gint x, gint y,
|
||||||
|
gint x_tiles, gint y_tiles);
|
||||||
|
|
||||||
|
|
||||||
|
G_END_DECLS
|
||||||
|
|
||||||
|
#endif /* __GST_VIDEO_TILE_H__ */
|
Loading…
Reference in a new issue