mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-26 10:10:32 +00:00
video: rework part 1
Add GstVideoFlags similar to the flags on the metadata. The idea is to replace the metadata flags with the GstVideoFlags. Move VideoPlane to video.h, it contains the information for a plane. Add GstVideoInfo structure that holds the current configuration of a video format. Add methods to parse caps into GstVideoInfo.
This commit is contained in:
parent
3802d2365c
commit
a7ae8d41aa
3 changed files with 418 additions and 519 deletions
|
@ -29,8 +29,6 @@ G_BEGIN_DECLS
|
||||||
#define GST_META_API_VIDEO "GstMetaVideo"
|
#define GST_META_API_VIDEO "GstMetaVideo"
|
||||||
#define GST_META_INFO_VIDEO (gst_meta_video_get_info())
|
#define GST_META_INFO_VIDEO (gst_meta_video_get_info())
|
||||||
|
|
||||||
#define GST_VIDEO_MAX_PLANES 4
|
|
||||||
|
|
||||||
typedef struct _GstMetaVideo GstMetaVideo;
|
typedef struct _GstMetaVideo GstMetaVideo;
|
||||||
typedef struct _GstMetaVideoPlane GstMetaVideoPlane;
|
typedef struct _GstMetaVideoPlane GstMetaVideoPlane;
|
||||||
|
|
||||||
|
|
|
@ -27,57 +27,97 @@
|
||||||
|
|
||||||
#include "video.h"
|
#include "video.h"
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
VIDEO_FLAG_YUV = (1 << 0),
|
||||||
|
VIDEO_FLAG_RGB = (1 << 1),
|
||||||
|
VIDEO_FLAG_GRAY = (1 << 2),
|
||||||
|
VIDEO_FLAG_ALPHA = (1 << 3)
|
||||||
|
} VideoFlags;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
const gchar *fmt;
|
const gchar *fmt;
|
||||||
GstVideoFormat format;
|
GstVideoFormat format;
|
||||||
guint32 fourcc;
|
guint32 fourcc;
|
||||||
|
VideoFlags flags;
|
||||||
|
guint depth[GST_VIDEO_MAX_PLANES];
|
||||||
} VideoFormat;
|
} VideoFormat;
|
||||||
|
|
||||||
|
#define COMP0 { 0, 0, 0, 0 }
|
||||||
|
#define COMP8 { 8, 0, 0, 0 }
|
||||||
|
#define COMP888 { 8, 8, 8, 0 }
|
||||||
|
#define COMP8888 { 8, 8, 8, 8 }
|
||||||
|
#define COMP10_10_10 { 10, 10, 10, 0 }
|
||||||
|
#define COMP16 { 16, 0, 0, 0 }
|
||||||
|
#define COMP16_16_16 { 16, 0, 0, 0 }
|
||||||
|
#define COMP16_16_16_16 { 16, 0, 0, 0 }
|
||||||
|
#define COMP555 { 5, 5, 5, 0 }
|
||||||
|
#define COMP565 { 5, 6, 5, 0 }
|
||||||
|
|
||||||
|
#define MAKE_YUV_FORMAT(name, fourcc, comp) \
|
||||||
|
{ G_STRINGIFY(name), GST_VIDEO_FORMAT_ ##name, fourcc, VIDEO_FLAG_YUV, comp }
|
||||||
|
#define MAKE_YUVA_FORMAT(name, fourcc, comp) \
|
||||||
|
{ G_STRINGIFY(name), GST_VIDEO_FORMAT_ ##name, fourcc, VIDEO_FLAG_YUV | VIDEO_FLAG_ALPHA, comp }
|
||||||
|
|
||||||
|
#define MAKE_RGB_FORMAT(name, comp) \
|
||||||
|
{ G_STRINGIFY(name), GST_VIDEO_FORMAT_ ##name, 0x00000000, VIDEO_FLAG_RGB, comp }
|
||||||
|
#define MAKE_RGBA_FORMAT(name, comp) \
|
||||||
|
{ G_STRINGIFY(name), GST_VIDEO_FORMAT_ ##name, 0x00000000, VIDEO_FLAG_RGB | VIDEO_FLAG_ALPHA, comp }
|
||||||
|
|
||||||
|
#define MAKE_GRAY_FORMAT(name, comp) \
|
||||||
|
{ G_STRINGIFY(name), GST_VIDEO_FORMAT_ ##name, 0x00000000, VIDEO_FLAG_GRAY, comp }
|
||||||
|
|
||||||
static VideoFormat formats[] = {
|
static VideoFormat formats[] = {
|
||||||
{"UNKNOWN", GST_VIDEO_FORMAT_UNKNOWN, 0x00000000},
|
{"UNKNOWN", GST_VIDEO_FORMAT_UNKNOWN, 0x00000000, 0, COMP0},
|
||||||
{"I420", GST_VIDEO_FORMAT_I420, GST_MAKE_FOURCC ('I', '4', '2', '0')},
|
|
||||||
{"YV12", GST_VIDEO_FORMAT_YV12, GST_MAKE_FOURCC ('Y', 'V', '1', '2')},
|
MAKE_YUV_FORMAT (I420, GST_MAKE_FOURCC ('I', '4', '2', '0'), COMP888),
|
||||||
{"YUY2", GST_VIDEO_FORMAT_YUY2, GST_MAKE_FOURCC ('Y', 'U', 'Y', '2')},
|
MAKE_YUV_FORMAT (YV12, GST_MAKE_FOURCC ('Y', 'V', '1', '2'), COMP888),
|
||||||
{"UYVY", GST_VIDEO_FORMAT_UYVY, GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y')},
|
MAKE_YUV_FORMAT (YUY2, GST_MAKE_FOURCC ('Y', 'U', 'Y', '2'), COMP888),
|
||||||
{"AYUV", GST_VIDEO_FORMAT_AYUV, GST_MAKE_FOURCC ('A', 'Y', 'U', 'V')},
|
MAKE_YUV_FORMAT (UYVY, GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'), COMP888),
|
||||||
{"RGBx", GST_VIDEO_FORMAT_RGBx, 0x00000000},
|
MAKE_YUVA_FORMAT (AYUV, GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'), COMP8888),
|
||||||
{"BGRx", GST_VIDEO_FORMAT_BGRx, 0x00000000},
|
MAKE_RGB_FORMAT (RGBx, COMP888),
|
||||||
{"xRGB", GST_VIDEO_FORMAT_xRGB, 0x00000000},
|
MAKE_RGB_FORMAT (BGRx, COMP888),
|
||||||
{"xBGR", GST_VIDEO_FORMAT_xBGR, 0x00000000},
|
MAKE_RGB_FORMAT (xRGB, COMP888),
|
||||||
{"RGBA", GST_VIDEO_FORMAT_RGBA, 0x00000000},
|
MAKE_RGB_FORMAT (xBGR, COMP888),
|
||||||
{"BGRA", GST_VIDEO_FORMAT_BGRA, 0x00000000},
|
MAKE_RGBA_FORMAT (RGBA, COMP8888),
|
||||||
{"ARGB", GST_VIDEO_FORMAT_ARGB, 0x00000000},
|
MAKE_RGBA_FORMAT (BGRA, COMP8888),
|
||||||
{"ABGR", GST_VIDEO_FORMAT_ABGR, 0x00000000},
|
MAKE_RGBA_FORMAT (ARGB, COMP8888),
|
||||||
{"RGB", GST_VIDEO_FORMAT_RGB, 0x00000000},
|
MAKE_RGBA_FORMAT (ABGR, COMP8888),
|
||||||
{"BGR", GST_VIDEO_FORMAT_BGR, 0x00000000},
|
MAKE_RGB_FORMAT (RGB, COMP888),
|
||||||
{"Y41B", GST_VIDEO_FORMAT_Y41B, GST_MAKE_FOURCC ('Y', '4', '1', 'B')},
|
MAKE_RGB_FORMAT (BGR, COMP888),
|
||||||
{"Y42B", GST_VIDEO_FORMAT_Y42B, GST_MAKE_FOURCC ('Y', '4', '2', 'B')},
|
|
||||||
{"YVYU", GST_VIDEO_FORMAT_YVYU, GST_MAKE_FOURCC ('Y', 'V', 'Y', 'U')},
|
MAKE_YUV_FORMAT (Y41B, GST_MAKE_FOURCC ('Y', '4', '1', 'B'), COMP888),
|
||||||
{"Y444", GST_VIDEO_FORMAT_Y444, GST_MAKE_FOURCC ('Y', '4', '4', '4')},
|
MAKE_YUV_FORMAT (Y42B, GST_MAKE_FOURCC ('Y', '4', '2', 'B'), COMP888),
|
||||||
{"v210", GST_VIDEO_FORMAT_v210, GST_MAKE_FOURCC ('v', '2', '1', '0')},
|
MAKE_YUV_FORMAT (YVYU, GST_MAKE_FOURCC ('Y', 'V', 'Y', 'U'), COMP888),
|
||||||
{"v216", GST_VIDEO_FORMAT_v216, GST_MAKE_FOURCC ('v', '2', '1', '6')},
|
MAKE_YUV_FORMAT (Y444, GST_MAKE_FOURCC ('Y', '4', '4', '4'), COMP888),
|
||||||
{"NV12", GST_VIDEO_FORMAT_NV12, GST_MAKE_FOURCC ('N', 'V', '1', '2')},
|
MAKE_YUV_FORMAT (v210, GST_MAKE_FOURCC ('v', '2', '1', '0'), COMP10_10_10),
|
||||||
{"NV21", GST_VIDEO_FORMAT_NV21, GST_MAKE_FOURCC ('N', 'V', '2', '1')},
|
MAKE_YUV_FORMAT (v216, GST_MAKE_FOURCC ('v', '2', '1', '6'), COMP16_16_16),
|
||||||
{"GRAY8", GST_VIDEO_FORMAT_GRAY8, 0x00000000},
|
MAKE_YUV_FORMAT (NV12, GST_MAKE_FOURCC ('N', 'V', '1', '2'), COMP888),
|
||||||
{"GRAY16_BE", GST_VIDEO_FORMAT_GRAY16_BE, 0x00000000},
|
MAKE_YUV_FORMAT (NV21, GST_MAKE_FOURCC ('N', 'V', '2', '1'), COMP888),
|
||||||
{"GRAY16_LE", GST_VIDEO_FORMAT_GRAY16_LE, 0x00000000},
|
|
||||||
{"v308", GST_VIDEO_FORMAT_v308, GST_MAKE_FOURCC ('v', '3', '0', '8')},
|
MAKE_GRAY_FORMAT (GRAY8, COMP8),
|
||||||
{"Y800", GST_VIDEO_FORMAT_Y800, GST_MAKE_FOURCC ('Y', '8', '0', '0')},
|
MAKE_GRAY_FORMAT (GRAY16_BE, COMP16),
|
||||||
{"Y16", GST_VIDEO_FORMAT_Y16, GST_MAKE_FOURCC ('Y', '1', '6', ' ')},
|
MAKE_GRAY_FORMAT (GRAY16_LE, COMP16),
|
||||||
{"RGB16", GST_VIDEO_FORMAT_RGB16, 0x00000000},
|
|
||||||
{"BGR16", GST_VIDEO_FORMAT_BGR16, 0x00000000},
|
MAKE_YUV_FORMAT (v308, GST_MAKE_FOURCC ('v', '3', '0', '8'), COMP888),
|
||||||
{"RGB15", GST_VIDEO_FORMAT_RGB15, 0x00000000},
|
MAKE_YUV_FORMAT (Y800, GST_MAKE_FOURCC ('Y', '8', '0', '0'), COMP8),
|
||||||
{"BGR15", GST_VIDEO_FORMAT_BGR15, 0x00000000},
|
MAKE_YUV_FORMAT (Y16, GST_MAKE_FOURCC ('Y', '1', '6', ' '), COMP16),
|
||||||
{"UYVP", GST_VIDEO_FORMAT_UYVP, GST_MAKE_FOURCC ('U', 'Y', 'V', 'P')},
|
|
||||||
{"A420", GST_VIDEO_FORMAT_A420, GST_MAKE_FOURCC ('A', '4', '2', '0')},
|
MAKE_RGB_FORMAT (RGB16, COMP565),
|
||||||
{"RGB8_PALLETTED", GST_VIDEO_FORMAT_RGB8_PALETTED, 0x00000000},
|
MAKE_RGB_FORMAT (BGR16, COMP565),
|
||||||
{"YUV9", GST_VIDEO_FORMAT_YUV9, GST_MAKE_FOURCC ('Y', 'U', 'V', '9')},
|
MAKE_RGB_FORMAT (RGB15, COMP555),
|
||||||
{"YVU9", GST_VIDEO_FORMAT_YVU9, GST_MAKE_FOURCC ('Y', 'V', 'U', '9')},
|
MAKE_RGB_FORMAT (BGR15, COMP555),
|
||||||
{"IYU1", GST_VIDEO_FORMAT_IYU1, GST_MAKE_FOURCC ('I', 'Y', 'U', '1')},
|
|
||||||
{"ARGB64", GST_VIDEO_FORMAT_ARGB64, 0x00000000},
|
MAKE_YUV_FORMAT (UYVP, GST_MAKE_FOURCC ('U', 'Y', 'V', 'P'), COMP10_10_10),
|
||||||
{"AYUV64", GST_VIDEO_FORMAT_AYUV64, GST_MAKE_FOURCC ('A', 'Y', '6', '4')},
|
MAKE_YUVA_FORMAT (A420, GST_MAKE_FOURCC ('A', '4', '2', '0'), COMP888),
|
||||||
{"r210", GST_VIDEO_FORMAT_r210, 0x00000000}
|
MAKE_RGBA_FORMAT (RGB8_PALETTED, COMP8888),
|
||||||
|
MAKE_YUV_FORMAT (YUV9, GST_MAKE_FOURCC ('Y', 'U', 'V', '9'), COMP888),
|
||||||
|
MAKE_YUV_FORMAT (YVU9, GST_MAKE_FOURCC ('Y', 'V', 'U', '9'), COMP888),
|
||||||
|
MAKE_YUV_FORMAT (IYU1, GST_MAKE_FOURCC ('I', 'Y', 'U', '1'), COMP888),
|
||||||
|
MAKE_RGBA_FORMAT (ARGB64, COMP16_16_16_16),
|
||||||
|
MAKE_YUVA_FORMAT (AYUV64, 0x00000000, COMP16_16_16_16),
|
||||||
|
MAKE_YUV_FORMAT (r210, GST_MAKE_FOURCC ('r', '2', '1', '0'), COMP10_10_10),
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -158,63 +198,6 @@ no_fraction:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_video_get_size:
|
|
||||||
* @pad: pointer to a #GstPad
|
|
||||||
* @width: pointer to integer to hold pixel width of the video frames (output)
|
|
||||||
* @height: pointer to integer to hold pixel height of the video frames (output)
|
|
||||||
*
|
|
||||||
* Inspect the caps of the provided pad and retrieve the width and height of
|
|
||||||
* the video frames it is configured for.
|
|
||||||
*
|
|
||||||
* The pad needs to have negotiated caps containing width and height properties.
|
|
||||||
*
|
|
||||||
* Returns: TRUE if the width and height could be retrieved.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
gboolean
|
|
||||||
gst_video_get_size (GstPad * pad, gint * width, gint * height)
|
|
||||||
{
|
|
||||||
GstCaps *caps = NULL;
|
|
||||||
GstStructure *structure;
|
|
||||||
gboolean ret;
|
|
||||||
|
|
||||||
g_return_val_if_fail (pad != NULL, FALSE);
|
|
||||||
g_return_val_if_fail (width != NULL, FALSE);
|
|
||||||
g_return_val_if_fail (height != NULL, FALSE);
|
|
||||||
|
|
||||||
caps = gst_pad_get_current_caps (pad);
|
|
||||||
if (caps == NULL)
|
|
||||||
goto no_caps;
|
|
||||||
|
|
||||||
structure = gst_caps_get_structure (caps, 0);
|
|
||||||
ret = gst_structure_get_int (structure, "width", width);
|
|
||||||
ret &= gst_structure_get_int (structure, "height", height);
|
|
||||||
gst_caps_unref (caps);
|
|
||||||
|
|
||||||
if (!ret)
|
|
||||||
goto no_size;
|
|
||||||
|
|
||||||
GST_DEBUG ("size request on pad %s:%s: %dx%d",
|
|
||||||
GST_DEBUG_PAD_NAME (pad), width ? *width : -1, height ? *height : -1);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
/* ERROR */
|
|
||||||
no_caps:
|
|
||||||
{
|
|
||||||
g_warning ("gstvideo: failed to get caps of pad %s:%s",
|
|
||||||
GST_DEBUG_PAD_NAME (pad));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
no_size:
|
|
||||||
{
|
|
||||||
g_warning ("gstvideo: failed to get size properties on pad %s:%s",
|
|
||||||
GST_DEBUG_PAD_NAME (pad));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_video_calculate_display_ratio:
|
* gst_video_calculate_display_ratio:
|
||||||
* @dar_n: Numerator of the calculated display_ratio
|
* @dar_n: Numerator of the calculated display_ratio
|
||||||
|
@ -265,8 +248,13 @@ gst_video_calculate_display_ratio (guint * dar_n, guint * dar_d,
|
||||||
*dar_d = den;
|
*dar_d = den;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
/* ERRORS */
|
||||||
error_overflow:
|
error_overflow:
|
||||||
return FALSE;
|
{
|
||||||
|
GST_WARNING ("overflow in multiply");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -375,64 +363,6 @@ gst_video_parse_caps_chroma_site (GstCaps * caps)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_video_format_parse_caps:
|
|
||||||
* @caps: the #GstCaps to parse
|
|
||||||
* @format: the #GstVideoFormat of the video represented by @caps (output)
|
|
||||||
* @width: the width of the video represented by @caps, may be NULL (output)
|
|
||||||
* @height: the height of the video represented by @caps, may be NULL (output)
|
|
||||||
*
|
|
||||||
* Determines the #GstVideoFormat of @caps and places it in the location
|
|
||||||
* pointed to by @format. Extracts the size of the video and places it
|
|
||||||
* in the location pointed to by @width and @height. If @caps does not
|
|
||||||
* represent one of the raw video formats listed in #GstVideoFormat, the
|
|
||||||
* function will fail and return FALSE.
|
|
||||||
*
|
|
||||||
* Since: 0.10.16
|
|
||||||
*
|
|
||||||
* Returns: TRUE if @caps was parsed correctly.
|
|
||||||
*/
|
|
||||||
gboolean
|
|
||||||
gst_video_format_parse_caps (const GstCaps * caps, GstVideoFormat * format,
|
|
||||||
int *width, int *height)
|
|
||||||
{
|
|
||||||
GstStructure *structure;
|
|
||||||
gboolean ok = TRUE;
|
|
||||||
|
|
||||||
if (!gst_caps_is_fixed (caps))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
structure = gst_caps_get_structure (caps, 0);
|
|
||||||
|
|
||||||
if (format) {
|
|
||||||
if (gst_structure_has_name (structure, "video/x-raw")) {
|
|
||||||
const gchar *fmt;
|
|
||||||
|
|
||||||
fmt = gst_structure_get_string (structure, "format");
|
|
||||||
if (fmt == NULL)
|
|
||||||
ok = FALSE;
|
|
||||||
|
|
||||||
*format = gst_video_format_from_string (fmt);
|
|
||||||
if (*format == GST_VIDEO_FORMAT_UNKNOWN) {
|
|
||||||
ok = FALSE;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ok = FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (width) {
|
|
||||||
ok &= gst_structure_get_int (structure, "width", width);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (height) {
|
|
||||||
ok &= gst_structure_get_int (structure, "height", height);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_video_parse_caps_framerate:
|
* gst_video_parse_caps_framerate:
|
||||||
* @caps: pointer to a #GstCaps instance
|
* @caps: pointer to a #GstCaps instance
|
||||||
|
@ -879,10 +809,10 @@ gst_video_format_to_fourcc (GstVideoFormat format)
|
||||||
const gchar *
|
const gchar *
|
||||||
gst_video_format_to_string (GstVideoFormat format)
|
gst_video_format_to_string (GstVideoFormat format)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, 0);
|
g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, NULL);
|
||||||
|
|
||||||
if (format >= G_N_ELEMENTS (formats))
|
if (format >= G_N_ELEMENTS (formats))
|
||||||
return GST_VIDEO_FORMAT_UNKNOWN;
|
return NULL;
|
||||||
|
|
||||||
return formats[format].fmt;
|
return formats[format].fmt;
|
||||||
}
|
}
|
||||||
|
@ -900,49 +830,12 @@ gst_video_format_to_string (GstVideoFormat format)
|
||||||
gboolean
|
gboolean
|
||||||
gst_video_format_is_rgb (GstVideoFormat format)
|
gst_video_format_is_rgb (GstVideoFormat format)
|
||||||
{
|
{
|
||||||
switch (format) {
|
g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, FALSE);
|
||||||
case GST_VIDEO_FORMAT_I420:
|
|
||||||
case GST_VIDEO_FORMAT_YV12:
|
if (format >= G_N_ELEMENTS (formats))
|
||||||
case GST_VIDEO_FORMAT_YUY2:
|
return FALSE;
|
||||||
case GST_VIDEO_FORMAT_YVYU:
|
|
||||||
case GST_VIDEO_FORMAT_UYVY:
|
return (formats[format].flags & VIDEO_FLAG_RGB) != 0;
|
||||||
case GST_VIDEO_FORMAT_AYUV:
|
|
||||||
case GST_VIDEO_FORMAT_Y41B:
|
|
||||||
case GST_VIDEO_FORMAT_Y42B:
|
|
||||||
case GST_VIDEO_FORMAT_Y444:
|
|
||||||
case GST_VIDEO_FORMAT_v210:
|
|
||||||
case GST_VIDEO_FORMAT_v216:
|
|
||||||
case GST_VIDEO_FORMAT_NV12:
|
|
||||||
case GST_VIDEO_FORMAT_NV21:
|
|
||||||
case GST_VIDEO_FORMAT_v308:
|
|
||||||
case GST_VIDEO_FORMAT_UYVP:
|
|
||||||
case GST_VIDEO_FORMAT_A420:
|
|
||||||
case GST_VIDEO_FORMAT_YUV9:
|
|
||||||
case GST_VIDEO_FORMAT_YVU9:
|
|
||||||
case GST_VIDEO_FORMAT_IYU1:
|
|
||||||
case GST_VIDEO_FORMAT_AYUV64:
|
|
||||||
return FALSE;
|
|
||||||
case GST_VIDEO_FORMAT_RGBx:
|
|
||||||
case GST_VIDEO_FORMAT_BGRx:
|
|
||||||
case GST_VIDEO_FORMAT_xRGB:
|
|
||||||
case GST_VIDEO_FORMAT_xBGR:
|
|
||||||
case GST_VIDEO_FORMAT_RGBA:
|
|
||||||
case GST_VIDEO_FORMAT_BGRA:
|
|
||||||
case GST_VIDEO_FORMAT_ARGB:
|
|
||||||
case GST_VIDEO_FORMAT_ABGR:
|
|
||||||
case GST_VIDEO_FORMAT_RGB:
|
|
||||||
case GST_VIDEO_FORMAT_BGR:
|
|
||||||
case GST_VIDEO_FORMAT_RGB16:
|
|
||||||
case GST_VIDEO_FORMAT_BGR16:
|
|
||||||
case GST_VIDEO_FORMAT_RGB15:
|
|
||||||
case GST_VIDEO_FORMAT_BGR15:
|
|
||||||
case GST_VIDEO_FORMAT_RGB8_PALETTED:
|
|
||||||
case GST_VIDEO_FORMAT_ARGB64:
|
|
||||||
case GST_VIDEO_FORMAT_r210:
|
|
||||||
return TRUE;
|
|
||||||
default:
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -958,51 +851,12 @@ gst_video_format_is_rgb (GstVideoFormat format)
|
||||||
gboolean
|
gboolean
|
||||||
gst_video_format_is_yuv (GstVideoFormat format)
|
gst_video_format_is_yuv (GstVideoFormat format)
|
||||||
{
|
{
|
||||||
switch (format) {
|
g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, FALSE);
|
||||||
case GST_VIDEO_FORMAT_I420:
|
|
||||||
case GST_VIDEO_FORMAT_YV12:
|
if (format >= G_N_ELEMENTS (formats))
|
||||||
case GST_VIDEO_FORMAT_YUY2:
|
return FALSE;
|
||||||
case GST_VIDEO_FORMAT_YVYU:
|
|
||||||
case GST_VIDEO_FORMAT_UYVY:
|
return (formats[format].flags & VIDEO_FLAG_YUV) != 0;
|
||||||
case GST_VIDEO_FORMAT_AYUV:
|
|
||||||
case GST_VIDEO_FORMAT_Y41B:
|
|
||||||
case GST_VIDEO_FORMAT_Y42B:
|
|
||||||
case GST_VIDEO_FORMAT_Y444:
|
|
||||||
case GST_VIDEO_FORMAT_v210:
|
|
||||||
case GST_VIDEO_FORMAT_v216:
|
|
||||||
case GST_VIDEO_FORMAT_NV12:
|
|
||||||
case GST_VIDEO_FORMAT_NV21:
|
|
||||||
case GST_VIDEO_FORMAT_v308:
|
|
||||||
case GST_VIDEO_FORMAT_Y800:
|
|
||||||
case GST_VIDEO_FORMAT_Y16:
|
|
||||||
case GST_VIDEO_FORMAT_UYVP:
|
|
||||||
case GST_VIDEO_FORMAT_A420:
|
|
||||||
case GST_VIDEO_FORMAT_YUV9:
|
|
||||||
case GST_VIDEO_FORMAT_YVU9:
|
|
||||||
case GST_VIDEO_FORMAT_IYU1:
|
|
||||||
case GST_VIDEO_FORMAT_AYUV64:
|
|
||||||
return TRUE;
|
|
||||||
case GST_VIDEO_FORMAT_RGBx:
|
|
||||||
case GST_VIDEO_FORMAT_BGRx:
|
|
||||||
case GST_VIDEO_FORMAT_xRGB:
|
|
||||||
case GST_VIDEO_FORMAT_xBGR:
|
|
||||||
case GST_VIDEO_FORMAT_RGBA:
|
|
||||||
case GST_VIDEO_FORMAT_BGRA:
|
|
||||||
case GST_VIDEO_FORMAT_ARGB:
|
|
||||||
case GST_VIDEO_FORMAT_ABGR:
|
|
||||||
case GST_VIDEO_FORMAT_RGB:
|
|
||||||
case GST_VIDEO_FORMAT_BGR:
|
|
||||||
case GST_VIDEO_FORMAT_RGB16:
|
|
||||||
case GST_VIDEO_FORMAT_BGR16:
|
|
||||||
case GST_VIDEO_FORMAT_RGB15:
|
|
||||||
case GST_VIDEO_FORMAT_BGR15:
|
|
||||||
case GST_VIDEO_FORMAT_RGB8_PALETTED:
|
|
||||||
case GST_VIDEO_FORMAT_ARGB64:
|
|
||||||
case GST_VIDEO_FORMAT_r210:
|
|
||||||
return FALSE;
|
|
||||||
default:
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1018,16 +872,12 @@ gst_video_format_is_yuv (GstVideoFormat format)
|
||||||
gboolean
|
gboolean
|
||||||
gst_video_format_is_gray (GstVideoFormat format)
|
gst_video_format_is_gray (GstVideoFormat format)
|
||||||
{
|
{
|
||||||
switch (format) {
|
g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, FALSE);
|
||||||
case GST_VIDEO_FORMAT_GRAY8:
|
|
||||||
case GST_VIDEO_FORMAT_GRAY16_BE:
|
if (format >= G_N_ELEMENTS (formats))
|
||||||
case GST_VIDEO_FORMAT_GRAY16_LE:
|
return FALSE;
|
||||||
case GST_VIDEO_FORMAT_Y800:
|
|
||||||
case GST_VIDEO_FORMAT_Y16:
|
return (formats[format].flags & VIDEO_FLAG_GRAY) != 0;
|
||||||
return TRUE;
|
|
||||||
default:
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1044,52 +894,12 @@ gst_video_format_is_gray (GstVideoFormat format)
|
||||||
gboolean
|
gboolean
|
||||||
gst_video_format_has_alpha (GstVideoFormat format)
|
gst_video_format_has_alpha (GstVideoFormat format)
|
||||||
{
|
{
|
||||||
switch (format) {
|
g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, FALSE);
|
||||||
case GST_VIDEO_FORMAT_I420:
|
|
||||||
case GST_VIDEO_FORMAT_YV12:
|
if (format >= G_N_ELEMENTS (formats))
|
||||||
case GST_VIDEO_FORMAT_YUY2:
|
return FALSE;
|
||||||
case GST_VIDEO_FORMAT_YVYU:
|
|
||||||
case GST_VIDEO_FORMAT_UYVY:
|
return (formats[format].flags & VIDEO_FLAG_ALPHA) != 0;
|
||||||
case GST_VIDEO_FORMAT_Y41B:
|
|
||||||
case GST_VIDEO_FORMAT_Y42B:
|
|
||||||
case GST_VIDEO_FORMAT_Y444:
|
|
||||||
case GST_VIDEO_FORMAT_v210:
|
|
||||||
case GST_VIDEO_FORMAT_v216:
|
|
||||||
case GST_VIDEO_FORMAT_NV12:
|
|
||||||
case GST_VIDEO_FORMAT_NV21:
|
|
||||||
case GST_VIDEO_FORMAT_v308:
|
|
||||||
case GST_VIDEO_FORMAT_Y800:
|
|
||||||
case GST_VIDEO_FORMAT_Y16:
|
|
||||||
case GST_VIDEO_FORMAT_UYVP:
|
|
||||||
case GST_VIDEO_FORMAT_YUV9:
|
|
||||||
case GST_VIDEO_FORMAT_YVU9:
|
|
||||||
case GST_VIDEO_FORMAT_IYU1:
|
|
||||||
return FALSE;
|
|
||||||
case GST_VIDEO_FORMAT_AYUV:
|
|
||||||
case GST_VIDEO_FORMAT_RGBA:
|
|
||||||
case GST_VIDEO_FORMAT_BGRA:
|
|
||||||
case GST_VIDEO_FORMAT_ARGB:
|
|
||||||
case GST_VIDEO_FORMAT_ABGR:
|
|
||||||
case GST_VIDEO_FORMAT_A420:
|
|
||||||
case GST_VIDEO_FORMAT_RGB8_PALETTED:
|
|
||||||
case GST_VIDEO_FORMAT_ARGB64:
|
|
||||||
case GST_VIDEO_FORMAT_AYUV64:
|
|
||||||
return TRUE;
|
|
||||||
case GST_VIDEO_FORMAT_RGBx:
|
|
||||||
case GST_VIDEO_FORMAT_BGRx:
|
|
||||||
case GST_VIDEO_FORMAT_xRGB:
|
|
||||||
case GST_VIDEO_FORMAT_xBGR:
|
|
||||||
case GST_VIDEO_FORMAT_RGB:
|
|
||||||
case GST_VIDEO_FORMAT_BGR:
|
|
||||||
case GST_VIDEO_FORMAT_RGB16:
|
|
||||||
case GST_VIDEO_FORMAT_BGR16:
|
|
||||||
case GST_VIDEO_FORMAT_RGB15:
|
|
||||||
case GST_VIDEO_FORMAT_BGR15:
|
|
||||||
case GST_VIDEO_FORMAT_r210:
|
|
||||||
return FALSE;
|
|
||||||
default:
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1108,59 +918,218 @@ gst_video_format_has_alpha (GstVideoFormat format)
|
||||||
int
|
int
|
||||||
gst_video_format_get_component_depth (GstVideoFormat format, int component)
|
gst_video_format_get_component_depth (GstVideoFormat format, int component)
|
||||||
{
|
{
|
||||||
if (component == 3 && !gst_video_format_has_alpha (format))
|
g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, 0);
|
||||||
return 0;
|
g_return_val_if_fail (component < GST_VIDEO_MAX_PLANES, 0);
|
||||||
|
|
||||||
|
if (format >= G_N_ELEMENTS (formats))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
return formats[format].depth[component];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_video_format_get_pixel_stride:
|
||||||
|
* @format: a #GstVideoFormat
|
||||||
|
* @component: the component index
|
||||||
|
*
|
||||||
|
* Calculates the pixel stride (number of bytes from one pixel to the
|
||||||
|
* pixel to its immediate left) for the video component with an index
|
||||||
|
* of @component. See @gst_video_format_get_row_stride for a description
|
||||||
|
* of the component index.
|
||||||
|
*
|
||||||
|
* Since: 0.10.16
|
||||||
|
*
|
||||||
|
* Returns: pixel stride of component @component
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
gst_video_format_get_pixel_stride (GstVideoFormat format, int component)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, 0);
|
||||||
|
g_return_val_if_fail (component >= 0 && component <= 3, 0);
|
||||||
|
|
||||||
switch (format) {
|
switch (format) {
|
||||||
case GST_VIDEO_FORMAT_RGB16:
|
|
||||||
case GST_VIDEO_FORMAT_BGR16:
|
|
||||||
if (component == 1)
|
|
||||||
return 6;
|
|
||||||
return 5;
|
|
||||||
case GST_VIDEO_FORMAT_RGB15:
|
|
||||||
case GST_VIDEO_FORMAT_BGR15:
|
|
||||||
return 5;
|
|
||||||
case GST_VIDEO_FORMAT_I420:
|
case GST_VIDEO_FORMAT_I420:
|
||||||
case GST_VIDEO_FORMAT_YV12:
|
case GST_VIDEO_FORMAT_YV12:
|
||||||
case GST_VIDEO_FORMAT_YUY2:
|
|
||||||
case GST_VIDEO_FORMAT_YVYU:
|
|
||||||
case GST_VIDEO_FORMAT_UYVY:
|
|
||||||
case GST_VIDEO_FORMAT_Y41B:
|
case GST_VIDEO_FORMAT_Y41B:
|
||||||
case GST_VIDEO_FORMAT_Y42B:
|
case GST_VIDEO_FORMAT_Y42B:
|
||||||
case GST_VIDEO_FORMAT_Y444:
|
case GST_VIDEO_FORMAT_Y444:
|
||||||
case GST_VIDEO_FORMAT_NV12:
|
case GST_VIDEO_FORMAT_A420:
|
||||||
case GST_VIDEO_FORMAT_NV21:
|
|
||||||
case GST_VIDEO_FORMAT_v308:
|
|
||||||
case GST_VIDEO_FORMAT_Y800:
|
|
||||||
case GST_VIDEO_FORMAT_YUV9:
|
case GST_VIDEO_FORMAT_YUV9:
|
||||||
case GST_VIDEO_FORMAT_YVU9:
|
case GST_VIDEO_FORMAT_YVU9:
|
||||||
|
return 1;
|
||||||
|
case GST_VIDEO_FORMAT_YUY2:
|
||||||
|
case GST_VIDEO_FORMAT_YVYU:
|
||||||
|
case GST_VIDEO_FORMAT_UYVY:
|
||||||
|
if (component == 0) {
|
||||||
|
return 2;
|
||||||
|
} else {
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
case GST_VIDEO_FORMAT_IYU1:
|
case GST_VIDEO_FORMAT_IYU1:
|
||||||
|
/* doesn't make much sense for IYU1 because it's 1 or 3
|
||||||
|
* for luma depending on position */
|
||||||
|
return 0;
|
||||||
case GST_VIDEO_FORMAT_AYUV:
|
case GST_VIDEO_FORMAT_AYUV:
|
||||||
case GST_VIDEO_FORMAT_RGBA:
|
|
||||||
case GST_VIDEO_FORMAT_BGRA:
|
|
||||||
case GST_VIDEO_FORMAT_ARGB:
|
|
||||||
case GST_VIDEO_FORMAT_ABGR:
|
|
||||||
case GST_VIDEO_FORMAT_A420:
|
|
||||||
case GST_VIDEO_FORMAT_RGB8_PALETTED:
|
|
||||||
case GST_VIDEO_FORMAT_RGBx:
|
case GST_VIDEO_FORMAT_RGBx:
|
||||||
case GST_VIDEO_FORMAT_BGRx:
|
case GST_VIDEO_FORMAT_BGRx:
|
||||||
case GST_VIDEO_FORMAT_xRGB:
|
case GST_VIDEO_FORMAT_xRGB:
|
||||||
case GST_VIDEO_FORMAT_xBGR:
|
case GST_VIDEO_FORMAT_xBGR:
|
||||||
|
case GST_VIDEO_FORMAT_RGBA:
|
||||||
|
case GST_VIDEO_FORMAT_BGRA:
|
||||||
|
case GST_VIDEO_FORMAT_ARGB:
|
||||||
|
case GST_VIDEO_FORMAT_ABGR:
|
||||||
|
case GST_VIDEO_FORMAT_r210:
|
||||||
|
return 4;
|
||||||
|
case GST_VIDEO_FORMAT_RGB16:
|
||||||
|
case GST_VIDEO_FORMAT_BGR16:
|
||||||
|
case GST_VIDEO_FORMAT_RGB15:
|
||||||
|
case GST_VIDEO_FORMAT_BGR15:
|
||||||
|
return 2;
|
||||||
case GST_VIDEO_FORMAT_RGB:
|
case GST_VIDEO_FORMAT_RGB:
|
||||||
case GST_VIDEO_FORMAT_BGR:
|
case GST_VIDEO_FORMAT_BGR:
|
||||||
default:
|
case GST_VIDEO_FORMAT_v308:
|
||||||
return 8;
|
return 3;
|
||||||
case GST_VIDEO_FORMAT_v210:
|
case GST_VIDEO_FORMAT_v210:
|
||||||
case GST_VIDEO_FORMAT_UYVP:
|
/* v210 is packed at the bit level, so pixel stride doesn't make sense */
|
||||||
case GST_VIDEO_FORMAT_r210:
|
return 0;
|
||||||
return 10;
|
|
||||||
case GST_VIDEO_FORMAT_Y16:
|
|
||||||
case GST_VIDEO_FORMAT_v216:
|
case GST_VIDEO_FORMAT_v216:
|
||||||
|
if (component == 0) {
|
||||||
|
return 4;
|
||||||
|
} else {
|
||||||
|
return 8;
|
||||||
|
}
|
||||||
|
case GST_VIDEO_FORMAT_NV12:
|
||||||
|
case GST_VIDEO_FORMAT_NV21:
|
||||||
|
if (component == 0) {
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
case GST_VIDEO_FORMAT_GRAY8:
|
||||||
|
case GST_VIDEO_FORMAT_Y800:
|
||||||
|
return 1;
|
||||||
|
case GST_VIDEO_FORMAT_GRAY16_BE:
|
||||||
|
case GST_VIDEO_FORMAT_GRAY16_LE:
|
||||||
|
case GST_VIDEO_FORMAT_Y16:
|
||||||
|
return 2;
|
||||||
|
case GST_VIDEO_FORMAT_UYVP:
|
||||||
|
/* UYVP is packed at the bit level, so pixel stride doesn't make sense */
|
||||||
|
return 0;
|
||||||
|
case GST_VIDEO_FORMAT_RGB8_PALETTED:
|
||||||
|
return 1;
|
||||||
case GST_VIDEO_FORMAT_ARGB64:
|
case GST_VIDEO_FORMAT_ARGB64:
|
||||||
case GST_VIDEO_FORMAT_AYUV64:
|
case GST_VIDEO_FORMAT_AYUV64:
|
||||||
return 16;
|
return 8;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_video_info_init:
|
||||||
|
* @info: a #GstVideoInfo
|
||||||
|
*
|
||||||
|
* Initialize @info with default values.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gst_video_info_init (GstVideoInfo * info)
|
||||||
|
{
|
||||||
|
g_return_if_fail (info != NULL);
|
||||||
|
|
||||||
|
memset (info, 0, sizeof (GstVideoInfo));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_video_info_set_format:
|
||||||
|
* @info: a #GstVideoInfo
|
||||||
|
* @format: the format
|
||||||
|
* @width: a width
|
||||||
|
* @height: a height
|
||||||
|
*
|
||||||
|
* Set the default info for a video frame of @format and @width and @height.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gst_video_info_set_format (GstVideoInfo * info, GstVideoFormat format,
|
||||||
|
guint width, guint height)
|
||||||
|
{
|
||||||
|
g_return_if_fail (info != NULL);
|
||||||
|
g_return_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN);
|
||||||
|
|
||||||
|
info->format = format;
|
||||||
|
info->width = width;
|
||||||
|
info->heigth = height;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_video_info_from_caps:
|
||||||
|
* @info: a #GstVideoInfo
|
||||||
|
* @caps: a #GstCaps
|
||||||
|
*
|
||||||
|
* Parse @caps and update @info.
|
||||||
|
*
|
||||||
|
* Returns: TRUE if @caps could be parsed
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
gst_video_info_from_caps (GstVideoInfo * info, const GstCaps * caps)
|
||||||
|
{
|
||||||
|
GstStructure *structure;
|
||||||
|
const gchar *fmt;
|
||||||
|
gboolean ok = TRUE;
|
||||||
|
GstVideoFormat format;
|
||||||
|
gint width, height g_return_val_if_fail (info != NULL, FALSE);
|
||||||
|
g_return_val_if_fail (caps != NULL, FALSE);
|
||||||
|
|
||||||
|
if (!gst_caps_is_fixed (caps))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
structure = gst_caps_get_structure (caps, 0);
|
||||||
|
|
||||||
|
if (!gst_structure_has_name (structure, "video/x-raw"))
|
||||||
|
goto wrong_name;
|
||||||
|
|
||||||
|
if (!(fmt = gst_structure_get_string (structure, "format")))
|
||||||
|
goto no_format;
|
||||||
|
|
||||||
|
format = gst_video_format_from_string (fmt);
|
||||||
|
if (format == GST_VIDEO_FORMAT_UNKNOWN)
|
||||||
|
goto unknown_format;
|
||||||
|
|
||||||
|
info->format = format;
|
||||||
|
|
||||||
|
if (gst_structure_get_int (structure, "width", &width))
|
||||||
|
info->width = width;
|
||||||
|
if (gst_structure_get_int (structure, "height", &height))
|
||||||
|
info->height = height;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
/* ERROR */
|
||||||
|
wrong_name:
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
no_format:
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
unknown_format:
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GstCaps *
|
||||||
|
gst_video_info_to_caps (GstVideoInfo * info)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
gst_video_info_convert (GstVideoInfo * info,
|
||||||
|
GstFormat src_format, gint64 src_value, GstFormat dest_format,
|
||||||
|
gint64 * dest_value)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1277,104 +1246,6 @@ gst_video_format_get_row_stride (GstVideoFormat format, int component,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* gst_video_format_get_pixel_stride:
|
|
||||||
* @format: a #GstVideoFormat
|
|
||||||
* @component: the component index
|
|
||||||
*
|
|
||||||
* Calculates the pixel stride (number of bytes from one pixel to the
|
|
||||||
* pixel to its immediate left) for the video component with an index
|
|
||||||
* of @component. See @gst_video_format_get_row_stride for a description
|
|
||||||
* of the component index.
|
|
||||||
*
|
|
||||||
* Since: 0.10.16
|
|
||||||
*
|
|
||||||
* Returns: pixel stride of component @component
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
gst_video_format_get_pixel_stride (GstVideoFormat format, int component)
|
|
||||||
{
|
|
||||||
g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, 0);
|
|
||||||
g_return_val_if_fail (component >= 0 && component <= 3, 0);
|
|
||||||
|
|
||||||
switch (format) {
|
|
||||||
case GST_VIDEO_FORMAT_I420:
|
|
||||||
case GST_VIDEO_FORMAT_YV12:
|
|
||||||
case GST_VIDEO_FORMAT_Y41B:
|
|
||||||
case GST_VIDEO_FORMAT_Y42B:
|
|
||||||
case GST_VIDEO_FORMAT_Y444:
|
|
||||||
case GST_VIDEO_FORMAT_A420:
|
|
||||||
case GST_VIDEO_FORMAT_YUV9:
|
|
||||||
case GST_VIDEO_FORMAT_YVU9:
|
|
||||||
return 1;
|
|
||||||
case GST_VIDEO_FORMAT_YUY2:
|
|
||||||
case GST_VIDEO_FORMAT_YVYU:
|
|
||||||
case GST_VIDEO_FORMAT_UYVY:
|
|
||||||
if (component == 0) {
|
|
||||||
return 2;
|
|
||||||
} else {
|
|
||||||
return 4;
|
|
||||||
}
|
|
||||||
case GST_VIDEO_FORMAT_IYU1:
|
|
||||||
/* doesn't make much sense for IYU1 because it's 1 or 3
|
|
||||||
* for luma depending on position */
|
|
||||||
return 0;
|
|
||||||
case GST_VIDEO_FORMAT_AYUV:
|
|
||||||
case GST_VIDEO_FORMAT_RGBx:
|
|
||||||
case GST_VIDEO_FORMAT_BGRx:
|
|
||||||
case GST_VIDEO_FORMAT_xRGB:
|
|
||||||
case GST_VIDEO_FORMAT_xBGR:
|
|
||||||
case GST_VIDEO_FORMAT_RGBA:
|
|
||||||
case GST_VIDEO_FORMAT_BGRA:
|
|
||||||
case GST_VIDEO_FORMAT_ARGB:
|
|
||||||
case GST_VIDEO_FORMAT_ABGR:
|
|
||||||
case GST_VIDEO_FORMAT_r210:
|
|
||||||
return 4;
|
|
||||||
case GST_VIDEO_FORMAT_RGB16:
|
|
||||||
case GST_VIDEO_FORMAT_BGR16:
|
|
||||||
case GST_VIDEO_FORMAT_RGB15:
|
|
||||||
case GST_VIDEO_FORMAT_BGR15:
|
|
||||||
return 2;
|
|
||||||
case GST_VIDEO_FORMAT_RGB:
|
|
||||||
case GST_VIDEO_FORMAT_BGR:
|
|
||||||
case GST_VIDEO_FORMAT_v308:
|
|
||||||
return 3;
|
|
||||||
case GST_VIDEO_FORMAT_v210:
|
|
||||||
/* v210 is packed at the bit level, so pixel stride doesn't make sense */
|
|
||||||
return 0;
|
|
||||||
case GST_VIDEO_FORMAT_v216:
|
|
||||||
if (component == 0) {
|
|
||||||
return 4;
|
|
||||||
} else {
|
|
||||||
return 8;
|
|
||||||
}
|
|
||||||
case GST_VIDEO_FORMAT_NV12:
|
|
||||||
case GST_VIDEO_FORMAT_NV21:
|
|
||||||
if (component == 0) {
|
|
||||||
return 1;
|
|
||||||
} else {
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
case GST_VIDEO_FORMAT_GRAY8:
|
|
||||||
case GST_VIDEO_FORMAT_Y800:
|
|
||||||
return 1;
|
|
||||||
case GST_VIDEO_FORMAT_GRAY16_BE:
|
|
||||||
case GST_VIDEO_FORMAT_GRAY16_LE:
|
|
||||||
case GST_VIDEO_FORMAT_Y16:
|
|
||||||
return 2;
|
|
||||||
case GST_VIDEO_FORMAT_UYVP:
|
|
||||||
/* UYVP is packed at the bit level, so pixel stride doesn't make sense */
|
|
||||||
return 0;
|
|
||||||
case GST_VIDEO_FORMAT_RGB8_PALETTED:
|
|
||||||
return 1;
|
|
||||||
case GST_VIDEO_FORMAT_ARGB64:
|
|
||||||
case GST_VIDEO_FORMAT_AYUV64:
|
|
||||||
return 8;
|
|
||||||
default:
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_video_format_get_component_width:
|
* gst_video_format_get_component_width:
|
||||||
* @format: a #GstVideoFormat
|
* @format: a #GstVideoFormat
|
||||||
|
|
|
@ -121,6 +121,118 @@ typedef enum {
|
||||||
GST_VIDEO_FORMAT_r210
|
GST_VIDEO_FORMAT_r210
|
||||||
} GstVideoFormat;
|
} GstVideoFormat;
|
||||||
|
|
||||||
|
/* format properties */
|
||||||
|
GstVideoFormat gst_video_format_from_masks (gint depth, gint bpp, gint endianness,
|
||||||
|
gint red_mask, gint green_mask,
|
||||||
|
gint blue_mask, gint alpha_mask) G_GNUC_CONST;
|
||||||
|
|
||||||
|
GstVideoFormat gst_video_format_from_fourcc (guint32 fourcc) G_GNUC_CONST;
|
||||||
|
GstVideoFormat gst_video_format_from_string (const gchar *format) G_GNUC_CONST;
|
||||||
|
|
||||||
|
guint32 gst_video_format_to_fourcc (GstVideoFormat format) G_GNUC_CONST;
|
||||||
|
const gchar * gst_video_format_to_string (GstVideoFormat format) G_GNUC_CONST;
|
||||||
|
|
||||||
|
gboolean gst_video_format_is_rgb (GstVideoFormat format) G_GNUC_CONST;
|
||||||
|
gboolean gst_video_format_is_yuv (GstVideoFormat format) G_GNUC_CONST;
|
||||||
|
gboolean gst_video_format_is_gray (GstVideoFormat format) G_GNUC_CONST;
|
||||||
|
gboolean gst_video_format_has_alpha (GstVideoFormat format) G_GNUC_CONST;
|
||||||
|
|
||||||
|
int gst_video_format_get_component_depth (GstVideoFormat format,
|
||||||
|
int component) G_GNUC_CONST;
|
||||||
|
int gst_video_format_get_pixel_stride (GstVideoFormat format,
|
||||||
|
int component) G_GNUC_CONST;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct _GstVideoPlane GstVideoPlane;
|
||||||
|
typedef struct _GstVideoInfo GstVideoInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GstVideoFlags:
|
||||||
|
* @GST_META_VIDEO_FLAG_NONE: no flags
|
||||||
|
* @GST_META_VIDEO_FLAG_INTERLACED:
|
||||||
|
* @GST_META_VIDEO_FLAG_TTF:
|
||||||
|
* @GST_META_VIDEO_FLAG_RFF:
|
||||||
|
* @GST_META_VIDEO_FLAG_ONEFIELD:
|
||||||
|
* @GST_META_VIDEO_FLAG_TELECINE:
|
||||||
|
* @GST_META_VIDEO_FLAG_PROGRESSIVE:
|
||||||
|
*
|
||||||
|
* Extra video flags
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
GST_VIDEO_FLAG_NONE = 0,
|
||||||
|
GST_VIDEO_FLAG_INTERLACED = (1 << 0),
|
||||||
|
GST_VIDEO_FLAG_TTF = (1 << 1),
|
||||||
|
GST_VIDEO_FLAG_RFF = (1 << 2),
|
||||||
|
GST_VIDEO_FLAG_ONEFIELD = (1 << 3),
|
||||||
|
GST_VIDEO_FLAG_TELECINE = (1 << 4),
|
||||||
|
GST_VIDEO_FLAG_PROGRESSIVE = (1 << 5)
|
||||||
|
} GstVideoFlags;
|
||||||
|
|
||||||
|
#define GST_VIDEO_MAX_PLANES 4
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GstVideoPlane:
|
||||||
|
* @offset: offset of the first pixel in the buffer memory region
|
||||||
|
* @stride: stride of the image lines. Can be negative when the image is
|
||||||
|
* upside-down
|
||||||
|
*
|
||||||
|
* Information for one video plane.
|
||||||
|
*/
|
||||||
|
struct _GstVideoPlane {
|
||||||
|
gsize offset;
|
||||||
|
gint stride;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GstVideoInfo:
|
||||||
|
* @flags: additional video flags
|
||||||
|
* @format: the format of the video
|
||||||
|
* @width: the width of the video
|
||||||
|
* @height: the height of the video
|
||||||
|
* @par_n: the pixel-aspect-ratio numerator
|
||||||
|
* @par_d: the pixel-aspect-ratio demnominator
|
||||||
|
* @fps_n: the framerate numerator
|
||||||
|
* @fps_d: the framerate demnominator
|
||||||
|
* @n_planes: the number of planes in the image
|
||||||
|
* @plane: array of #GstMetaVideoPlane
|
||||||
|
*
|
||||||
|
* Extra buffer metadata describing image properties
|
||||||
|
*/
|
||||||
|
struct _GstVideoInfo {
|
||||||
|
GstVideoFormat format;
|
||||||
|
GstVideoFlags flags;
|
||||||
|
guint width;
|
||||||
|
guint height;
|
||||||
|
guint size;
|
||||||
|
|
||||||
|
const gchar *color_matrix;
|
||||||
|
const gchar *chroma_site;
|
||||||
|
|
||||||
|
guint par_n;
|
||||||
|
guint par_d;
|
||||||
|
guint fps_n;
|
||||||
|
guint fps_d;
|
||||||
|
|
||||||
|
guint n_planes;
|
||||||
|
GstVideoPlane plane[GST_VIDEO_MAX_PLANES];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void gst_video_info_init (GstVideoInfo *info);
|
||||||
|
|
||||||
|
void gst_video_info_set_format (GstVideoInfo *info, GstVideoFormat format,
|
||||||
|
guint width, guint height);
|
||||||
|
|
||||||
|
gboolean gst_video_info_from_caps (GstVideoInfo *info, const GstCaps * caps);
|
||||||
|
|
||||||
|
GstCaps * gst_video_info_to_caps (GstVideoInfo *info);
|
||||||
|
|
||||||
|
gboolean gst_video_info_convert (GstVideoInfo *info,
|
||||||
|
GstFormat src_format,
|
||||||
|
gint64 src_value,
|
||||||
|
GstFormat dest_format,
|
||||||
|
gint64 *dest_value);
|
||||||
|
|
||||||
#define GST_VIDEO_SIZE_RANGE "(int) [ 1, max ]"
|
#define GST_VIDEO_SIZE_RANGE "(int) [ 1, max ]"
|
||||||
#define GST_VIDEO_FPS_RANGE "(fraction) [ 0, max ]"
|
#define GST_VIDEO_FPS_RANGE "(fraction) [ 0, max ]"
|
||||||
|
|
||||||
|
@ -190,10 +302,6 @@ typedef enum {
|
||||||
/* functions */
|
/* functions */
|
||||||
const GValue * gst_video_frame_rate (GstPad * pad);
|
const GValue * gst_video_frame_rate (GstPad * pad);
|
||||||
|
|
||||||
gboolean gst_video_get_size (GstPad * pad,
|
|
||||||
gint * width,
|
|
||||||
gint * height);
|
|
||||||
|
|
||||||
gboolean gst_video_calculate_display_ratio (guint * dar_n,
|
gboolean gst_video_calculate_display_ratio (guint * dar_n,
|
||||||
guint * dar_d,
|
guint * dar_d,
|
||||||
guint video_width,
|
guint video_width,
|
||||||
|
@ -203,77 +311,7 @@ gboolean gst_video_calculate_display_ratio (guint * dar_n,
|
||||||
guint display_par_n,
|
guint display_par_n,
|
||||||
guint display_par_d);
|
guint display_par_d);
|
||||||
|
|
||||||
gboolean gst_video_format_parse_caps (const GstCaps * caps,
|
#if 0
|
||||||
GstVideoFormat * format,
|
|
||||||
int * width,
|
|
||||||
int * height);
|
|
||||||
|
|
||||||
gboolean gst_video_format_parse_caps_interlaced (GstCaps * caps,
|
|
||||||
gboolean * interlaced);
|
|
||||||
|
|
||||||
|
|
||||||
gboolean gst_video_parse_caps_pixel_aspect_ratio (GstCaps * caps,
|
|
||||||
int * par_n,
|
|
||||||
int * par_d);
|
|
||||||
|
|
||||||
gboolean gst_video_parse_caps_framerate (GstCaps * caps,
|
|
||||||
int * fps_n,
|
|
||||||
int * fps_d);
|
|
||||||
|
|
||||||
const char * gst_video_parse_caps_color_matrix (GstCaps * caps);
|
|
||||||
|
|
||||||
const char * gst_video_parse_caps_chroma_site (GstCaps * caps);
|
|
||||||
|
|
||||||
GstBuffer * gst_video_parse_caps_palette (GstCaps * caps);
|
|
||||||
|
|
||||||
/* create caps given format and details */
|
|
||||||
|
|
||||||
GstCaps * gst_video_format_new_caps (GstVideoFormat format,
|
|
||||||
int width, int height,
|
|
||||||
int framerate_n,
|
|
||||||
int framerate_d,
|
|
||||||
int par_n, int par_d);
|
|
||||||
|
|
||||||
GstCaps * gst_video_format_new_caps_interlaced (GstVideoFormat format,
|
|
||||||
int width, int height,
|
|
||||||
int framerate_n,
|
|
||||||
int framerate_d,
|
|
||||||
int par_n, int par_d,
|
|
||||||
gboolean interlaced);
|
|
||||||
|
|
||||||
GstCaps * gst_video_format_new_template_caps (GstVideoFormat format);
|
|
||||||
|
|
||||||
/* format properties */
|
|
||||||
|
|
||||||
GstVideoFormat gst_video_format_from_masks (gint depth, gint bpp, gint endianness,
|
|
||||||
gint red_mask, gint green_mask,
|
|
||||||
gint blue_mask, gint alpha_mask) G_GNUC_CONST;
|
|
||||||
|
|
||||||
GstVideoFormat gst_video_format_from_fourcc (guint32 fourcc) G_GNUC_CONST;
|
|
||||||
GstVideoFormat gst_video_format_from_string (const gchar *format) G_GNUC_CONST;
|
|
||||||
|
|
||||||
guint32 gst_video_format_to_fourcc (GstVideoFormat format) G_GNUC_CONST;
|
|
||||||
const gchar * gst_video_format_to_string (GstVideoFormat format) G_GNUC_CONST;
|
|
||||||
|
|
||||||
gboolean gst_video_format_is_rgb (GstVideoFormat format) G_GNUC_CONST;
|
|
||||||
|
|
||||||
gboolean gst_video_format_is_yuv (GstVideoFormat format) G_GNUC_CONST;
|
|
||||||
|
|
||||||
gboolean gst_video_format_is_gray (GstVideoFormat format) G_GNUC_CONST;
|
|
||||||
|
|
||||||
gboolean gst_video_format_has_alpha (GstVideoFormat format) G_GNUC_CONST;
|
|
||||||
|
|
||||||
|
|
||||||
int gst_video_format_get_component_depth (GstVideoFormat format,
|
|
||||||
int component) G_GNUC_CONST;
|
|
||||||
|
|
||||||
int gst_video_format_get_row_stride (GstVideoFormat format,
|
|
||||||
int component,
|
|
||||||
int width) G_GNUC_CONST;
|
|
||||||
|
|
||||||
int gst_video_format_get_pixel_stride (GstVideoFormat format,
|
|
||||||
int component) G_GNUC_CONST;
|
|
||||||
|
|
||||||
int gst_video_format_get_component_width (GstVideoFormat format,
|
int gst_video_format_get_component_width (GstVideoFormat format,
|
||||||
int component,
|
int component,
|
||||||
int width) G_GNUC_CONST;
|
int width) G_GNUC_CONST;
|
||||||
|
@ -292,16 +330,8 @@ int gst_video_format_get_size (GstVideoFormat format,
|
||||||
int height) G_GNUC_CONST;
|
int height) G_GNUC_CONST;
|
||||||
|
|
||||||
gboolean gst_video_get_size_from_caps (const GstCaps * caps, gint * size);
|
gboolean gst_video_get_size_from_caps (const GstCaps * caps, gint * size);
|
||||||
|
#endif
|
||||||
|
|
||||||
gboolean gst_video_format_convert (GstVideoFormat format,
|
|
||||||
int width,
|
|
||||||
int height,
|
|
||||||
int fps_n,
|
|
||||||
int fps_d,
|
|
||||||
GstFormat src_format,
|
|
||||||
gint64 src_value,
|
|
||||||
GstFormat dest_format,
|
|
||||||
gint64 * dest_value);
|
|
||||||
|
|
||||||
/* video still frame event creation and parsing */
|
/* video still frame event creation and parsing */
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue