video: More video helper library improvements

Make a new GstVideoFormatinfo structure that contains the specific information
related to a format such as the number of planes, components, subsampling,
pixel stride etc. The result is that we are now able to introduce the concept of
components again in the API.
Use tables to specify the formats and its properties.
Use macros to get information about the video format description.
Move code to set strides, offsets and size into one function.
Remove methods that are not handled with the structures.
Add methods to retrieve pointers and strides to the components in the video.
This commit is contained in:
Wim Taymans 2011-07-04 10:19:13 +02:00
parent ebfd6acde1
commit ddce68a5c2
15 changed files with 691 additions and 1310 deletions

View file

@ -764,9 +764,9 @@ gst_base_text_overlay_setcaps (GstBaseTextOverlay * overlay, GstCaps * caps)
goto invalid_caps;
overlay->info = info;
overlay->format = info.format;
overlay->width = info.width;
overlay->height = info.height;
overlay->format = GST_VIDEO_INFO_FORMAT (&info);
overlay->width = GST_VIDEO_INFO_WIDTH (&info);
overlay->height = GST_VIDEO_INFO_HEIGHT (&info);
ret = gst_pad_push_event (overlay->srcpad, gst_event_new_caps (caps));
@ -1465,16 +1465,12 @@ gst_base_text_overlay_shade_packed_Y (GstBaseTextOverlay * overlay,
GstVideoFrame * dest, gint x0, gint x1, gint y0, gint y1)
{
gint i, j;
guint dest_stride, pixel_stride, component_offset;
guint dest_stride, pixel_stride;
guint8 *dest_ptr;
dest_stride = dest->info.stride[0];
dest_ptr = dest->data[0];
pixel_stride = gst_video_format_get_pixel_stride (dest->info.format, 0);
component_offset =
gst_video_format_get_component_offset (dest->info.format, 0,
overlay->width, overlay->height);
dest_stride = GST_VIDEO_FRAME_COMP_STRIDE (dest, 0);
dest_ptr = GST_VIDEO_FRAME_COMP_DATA (dest, 0);
pixel_stride = GST_VIDEO_FRAME_COMP_PSTRIDE (dest, 0);
x0 = CLAMP (x0 - BOX_XPAD, 0, overlay->width);
x1 = CLAMP (x1 + BOX_XPAD, 0, overlay->width);
@ -1483,21 +1479,21 @@ gst_base_text_overlay_shade_packed_Y (GstBaseTextOverlay * overlay,
y1 = CLAMP (y1 + BOX_YPAD, 0, overlay->height);
if (x0 != 0)
x0 = gst_video_format_get_component_width (overlay->format, 0, x0);
x0 = GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (dest->info.finfo, 0, x0);
if (x1 != 0)
x1 = gst_video_format_get_component_width (overlay->format, 0, x1);
x1 = GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (dest->info.finfo, 0, x1);
if (y0 != 0)
y0 = gst_video_format_get_component_height (overlay->format, 0, y0);
y0 = GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (dest->info.finfo, 0, y0);
if (y1 != 0)
y1 = gst_video_format_get_component_height (overlay->format, 0, y1);
y1 = GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (dest->info.finfo, 0, y1);
for (i = y0; i < y1; i++) {
for (j = x0; j < x1; j++) {
gint y;
gint y_pos;
y_pos = (i * dest_stride) + j * pixel_stride + component_offset;
y_pos = (i * dest_stride) + j * pixel_stride;
y = dest_ptr[y_pos] + overlay->shading_value;
dest_ptr[y_pos] = CLAMP (y, 0, 255);

View file

@ -329,6 +329,7 @@ gst_text_render_check_argb (GstTextRender * render)
for (i = 0; i < n; i++) {
GstStructure *s;
GstVideoFormat vformat;
const GstVideoFormatInfo *info;
const gchar *fmt;
s = gst_caps_get_structure (peer_caps, i);
@ -340,7 +341,11 @@ gst_text_render_check_argb (GstTextRender * render)
continue;
vformat = gst_video_format_from_string (fmt);
render->use_ARGB = gst_video_format_has_alpha (vformat);
info = gst_video_format_get_info (vformat);
if (info == NULL)
continue;
render->use_ARGB = GST_VIDEO_FORMAT_INFO_HAS_ALPHA (info);
}
gst_caps_unref (peer_caps);
}

View file

@ -1111,7 +1111,7 @@ theora_handle_image (GstTheoraDec * dec, th_ycbcr_buffer buf, GstBuffer ** out)
gint width, height, stride;
gint pic_width, pic_height;
GstFlowReturn result;
int i, plane;
int i, comp;
guint8 *dest, *src;
GstVideoFrame frame;
GstMetaVideoCrop *crop;
@ -1163,27 +1163,24 @@ theora_handle_image (GstTheoraDec * dec, th_ycbcr_buffer buf, GstBuffer ** out)
}
}
for (plane = 0; plane < 3; plane++) {
for (comp = 0; comp < 3; comp++) {
width =
gst_video_format_get_component_width (frame.info.format, plane,
pic_width);
GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (frame.info.finfo, comp, pic_width);
height =
gst_video_format_get_component_height (frame.info.format, plane,
pic_height);
GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (frame.info.finfo, comp, pic_height);
stride = GST_VIDEO_FRAME_COMP_STRIDE (&frame, comp);
dest = GST_VIDEO_FRAME_COMP_DATA (&frame, comp);
stride = GST_VIDEO_FRAME_STRIDE (&frame, plane);
dest = GST_VIDEO_FRAME_DATA (&frame, plane);
src = buf[plane].data;
src = buf[comp].data;
src += ((height == pic_height) ? offset_y : offset_y / 2)
* buf[plane].stride;
* buf[comp].stride;
src += (width == pic_width) ? offset_x : offset_x / 2;
for (i = 0; i < height; i++) {
memcpy (dest, src, width);
dest += stride;
src += buf[plane].stride;
src += buf[comp].stride;
}
}
gst_video_frame_unmap (&frame);

View file

@ -668,7 +668,7 @@ theora_enc_sink_setcaps (GstTheoraEnc * enc, GstCaps * caps)
enc->info.pic_width = info.width;
enc->info.pic_height = info.height;
switch (info.format) {
switch (GST_VIDEO_INFO_FORMAT (&info)) {
case GST_VIDEO_FORMAT_I420:
enc->info.pixel_fmt = TH_PF_420;
break;
@ -1023,13 +1023,10 @@ theora_enc_init_buffer (th_ycbcr_buffer buf, th_info * info,
* is perfectly ok, even though it does not strictly look ok.
*/
for (i = 0; i < 3; i++) {
buf[i].width =
gst_video_format_get_component_width (format, i, info->frame_width);
buf[i].height =
gst_video_format_get_component_height (format, i, info->frame_height);
buf[i].data = GST_VIDEO_FRAME_DATA (frame, i);
buf[i].stride = GST_VIDEO_FRAME_STRIDE (frame, i);
buf[i].width = GST_VIDEO_FRAME_COMP_WIDTH (frame, i);
buf[i].height = GST_VIDEO_FRAME_COMP_HEIGHT (frame, i);
buf[i].data = GST_VIDEO_FRAME_COMP_DATA (frame, i);
buf[i].stride = GST_VIDEO_FRAME_COMP_STRIDE (frame, i);
}
}

View file

@ -61,7 +61,7 @@ gst_buffer_add_meta_video (GstBuffer * buffer, GstVideoFlags flags,
gst_video_info_set_format (&info, format, width, height);
meta = gst_buffer_add_meta_video_full (buffer, flags, format, width, height,
info.n_planes, info.offset, info.stride);
info.finfo->n_planes, info.offset, info.stride);
return meta;
}

View file

@ -47,7 +47,7 @@ typedef struct _GstMetaVideoCrop GstMetaVideoCrop;
* Extra buffer metadata describing image properties
*/
struct _GstMetaVideo {
GstMeta meta;
GstMeta meta;
GstBuffer *buffer;

File diff suppressed because it is too large Load diff

View file

@ -121,6 +121,76 @@ typedef enum {
GST_VIDEO_FORMAT_r210
} GstVideoFormat;
#define GST_VIDEO_MAX_PLANES 4
#define GST_VIDEO_MAX_COMPONENTS 4
typedef struct _GstVideoFormatInfo GstVideoFormatInfo;
typedef enum
{
GST_VIDEO_FORMAT_FLAG_YUV = (1 << 0),
GST_VIDEO_FORMAT_FLAG_RGB = (1 << 1),
GST_VIDEO_FORMAT_FLAG_GRAY = (1 << 2),
GST_VIDEO_FORMAT_FLAG_ALPHA = (1 << 3)
} GstVideoFormatFlags;
#define GST_VIDEO_SUB_SCALE(scale,val) (-((-(val))>>(scale)))
/**
* GstVideoFormatInfo:
* @format: #GstVideoFormat
* @name: string representation of the format
* @flags: #GstVideoFormatFlags
* @n_components: the number of components in the video format
* @depth: the depth for each component
* @pixel_stride: the pixel stride of each component. This is the amount of
* bytes to the pixel immediately to the right.
* @n_planes: the number of planes for this format
* @plane: the plane number where this component can be found
* @offset: the offset in the plane where the first pixel can be
* found.
* @w_sub: subsampling factor of the width
* @h_sub: subsampling factor of the height
*/
struct _GstVideoFormatInfo {
GstVideoFormat format;
const gchar *name;
GstVideoFormatFlags flags;
guint n_components;
guint depth[GST_VIDEO_MAX_COMPONENTS];
gint pixel_stride[GST_VIDEO_MAX_COMPONENTS];
guint n_planes;
guint plane[GST_VIDEO_MAX_COMPONENTS];
guint offset[GST_VIDEO_MAX_COMPONENTS];
guint w_sub[GST_VIDEO_MAX_COMPONENTS];
guint h_sub[GST_VIDEO_MAX_COMPONENTS];
};
#define GST_VIDEO_FORMAT_INFO_FORMAT(info) ((info)->format)
#define GST_VIDEO_FORMAT_INFO_NAME(info) ((info)->name)
#define GST_VIDEO_FORMAT_INFO_FLAGS(info) ((info)->flags)
#define GST_VIDEO_FORMAT_INFO_IS_YUV(info) ((info)->flags & GST_VIDEO_FORMAT_FLAG_YUV)
#define GST_VIDEO_FORMAT_INFO_IS_RGB(info) ((info)->flags & GST_VIDEO_FORMAT_FLAG_RGB)
#define GST_VIDEO_FORMAT_INFO_IS_GRAY(info) ((info)->flags & GST_VIDEO_FORMAT_FLAG_GRAY)
#define GST_VIDEO_FORMAT_INFO_HAS_ALPHA(info) ((info)->flags & GST_VIDEO_FORMAT_FLAG_ALPHA)
#define GST_VIDEO_FORMAT_INFO_N_COMPONENTS(info) ((info)->n_components)
#define GST_VIDEO_FORMAT_INFO_DEPTH(info,c) ((info)->depth[c])
#define GST_VIDEO_FORMAT_INFO_PSTRIDE(info,c) ((info)->pixel_stride[c])
#define GST_VIDEO_FORMAT_INFO_N_PLANES(info) ((info)->n_planes)
#define GST_VIDEO_FORMAT_INFO_PLANE(info,c) ((info)->plane[c])
#define GST_VIDEO_FORMAT_INFO_OFFSET(info,c) ((info)->offset[c])
#define GST_VIDEO_FORMAT_INFO_W_SUB(info,c) ((info)->w_sub[c])
#define GST_VIDEO_FORMAT_INFO_H_SUB(info,c) ((info)->h_sub[c])
#define GST_VIDEO_FORMAT_INFO_SCALE_WIDTH(info,c,w) GST_VIDEO_SUB_SCALE ((info)->w_sub[(c)],(w))
#define GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT(info,c,h) GST_VIDEO_SUB_SCALE ((info)->h_sub[(c)],(h))
#define GST_VIDEO_FORMAT_INFO_DATA(info,planes,comp) \
(((guint8*)(planes)[info->plane[comp]]) + info->offset[comp])
#define GST_VIDEO_FORMAT_INFO_STRIDE(info,strides,comp) ((strides)[info->plane[comp]])
/* format properties */
GstVideoFormat gst_video_format_from_masks (gint depth, gint bpp, gint endianness,
gint red_mask, gint green_mask,
@ -132,16 +202,8 @@ GstVideoFormat gst_video_format_from_string (const gchar *format) G_GNU
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_n_components (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;
const GstVideoFormatInfo *
gst_video_format_get_info (GstVideoFormat format) G_GNUC_CONST;
typedef struct _GstVideoInfo GstVideoInfo;
typedef struct _GstVideoFrame GstVideoFrame;
@ -168,8 +230,6 @@ typedef enum {
GST_VIDEO_FLAG_PROGRESSIVE = (1 << 5)
} GstVideoFlags;
#define GST_VIDEO_MAX_PLANES 4
/**
* GstVideoInfo:
* @flags: additional video flags
@ -190,33 +250,51 @@ typedef enum {
* @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
* @offset: offsets of the planes
* @stride: strides of the planes
*
* Extra buffer metadata describing image properties
*/
struct _GstVideoInfo {
GstVideoFormat format;
GstVideoFlags flags;
gint width;
gint height;
guint size;
const GstVideoFormatInfo *finfo;
GstVideoFlags flags;
gint width;
gint height;
guint size;
const gchar *color_matrix;
const gchar *chroma_site;
GstBuffer *palette;
const gchar *color_matrix;
const gchar *chroma_site;
GstBuffer *palette;
gint par_n;
gint par_d;
gint fps_n;
gint fps_d;
gint par_n;
gint par_d;
gint fps_n;
gint fps_d;
guint n_planes;
gsize offset[GST_VIDEO_MAX_PLANES];
gint stride[GST_VIDEO_MAX_PLANES];
gsize offset[GST_VIDEO_MAX_PLANES];
gint stride[GST_VIDEO_MAX_PLANES];
};
/* general info */
#define GST_VIDEO_INFO_FORMAT(i) (GST_VIDEO_FORMAT_INFO_FORMAT((i)->finfo))
#define GST_VIDEO_INFO_NAME(i) (GST_VIDEO_FORMAT_INFO_NAME((i)->finfo))
#define GST_VIDEO_INFO_WIDTH(i) ((i)->width)
#define GST_VIDEO_INFO_HEIGHT(i) ((i)->height)
#define GST_VIDEO_INFO_SIZE(i) ((i)->size)
/* dealing with planes */
#define GST_VIDEO_INFO_N_PLANES(i) (GST_VIDEO_FORMAT_INFO_N_PLANES((i)->finfo))
#define GST_VIDEO_INFO_PLANE_OFFSET(i,p) ((i)->offset[p])
#define GST_VIDEO_INFO_PLANE_STRIDE(i,p) ((i)->stride[p])
/* dealing with components */
#define GST_VIDEO_INFO_N_COMPONENTS(i) GST_VIDEO_FORMAT_INFO_N_COMPONENTS((i)->finfo)
#define GST_VIDEO_INFO_COMP_DATA(i,d,c) GST_VIDEO_FORMAT_INFO_DATA((i)->finfo,d,c)
#define GST_VIDEO_INFO_COMP_STRIDE(i,c) GST_VIDEO_FORMAT_INFO_STRIDE((i)->finfo,(i)->stride,c)
#define GST_VIDEO_INFO_COMP_WIDTH(i,c) GST_VIDEO_FORMAT_INFO_SCALE_WIDTH((i)->finfo,c,(i)->width)
#define GST_VIDEO_INFO_COMP_HEIGHT(i,c) GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT((i)->finfo,c,(i)->height)
#define GST_VIDEO_INFO_COMP_PSTRIDE(i,c) GST_VIDEO_FORMAT_INFO_PSTRIDE((i)->finfo,c)
void gst_video_info_init (GstVideoInfo *info);
void gst_video_info_set_format (GstVideoInfo *info, GstVideoFormat format,
@ -236,6 +314,7 @@ gboolean gst_video_info_convert (GstVideoInfo *info,
* GstVideoFrame:
* @info: the #GstVideoInfo
* @buffer: the mapped buffer
* @meta: pointer to metadata if any
* @data: pointers to the plane data
*
* A video frame obtained from gst_video_frame_map()
@ -246,18 +325,33 @@ struct _GstVideoFrame {
GstBuffer *buffer;
gpointer meta;
guint8 *data[GST_VIDEO_MAX_PLANES];
gpointer data[GST_VIDEO_MAX_PLANES];
};
#define GST_VIDEO_FRAME_DATA(f,c) ((f)->data[c])
#define GST_VIDEO_FRAME_STRIDE(f,c) ((f)->info.stride[c])
gboolean gst_video_frame_map (GstVideoFrame *frame, GstVideoInfo *info,
GstBuffer *buffer, GstMapFlags flags);
void gst_video_frame_unmap (GstVideoFrame *frame);
gboolean gst_video_frame_map (GstVideoFrame *frame, GstVideoInfo *info,
GstBuffer *buffer, GstMapFlags flags);
void gst_video_frame_unmap (GstVideoFrame *frame);
gboolean gst_video_frame_copy (GstVideoFrame *dest, const GstVideoFrame *src);
gboolean gst_video_frame_copy (GstVideoFrame *dest, const GstVideoFrame *src);
/* general info */
#define GST_VIDEO_FRAME_FORMAT(f) (GST_VIDEO_INFO_FORMAT(&(f)->info))
#define GST_VIDEO_FRAME_WIDTH(f) (GST_VIDEO_INFO_WIDTH(&(f)->info))
#define GST_VIDEO_FRAME_HEIGHT(f) (GST_VIDEO_INFO_HEIGHT(&(f)->info))
/* dealing with planes */
#define GST_VIDEO_FRAME_N_PLANES(f) (GST_VIDEO_INFO_N_PLANES(&(f)->info))
#define GST_VIDEO_FRAME_PLANE_DATA(f,p) ((f)->data[p])
#define GST_VIDEO_FRAME_PLANE_OFFSET(f,p) (GST_VIDEO_INFO_PLANE_OFFSET(&(f)->info,p))
#define GST_VIDEO_FRAME_PLANE_STRIDE(f,p) (GST_VIDEO_INFO_PLANE_STRIDE(&(f)->info,p))
/* dealing with components */
#define GST_VIDEO_FRAME_N_COMPONENTS(f) GST_VIDEO_INFO_N_COMPONENTS(&(f)->info)
#define GST_VIDEO_FRAME_COMP_DATA(f,c) GST_VIDEO_INFO_COMP_DATA(&(f)->info,(f)->data,c)
#define GST_VIDEO_FRAME_COMP_STRIDE(f,c) GST_VIDEO_INFO_COMP_STRIDE(&(f)->info,c)
#define GST_VIDEO_FRAME_COMP_WIDTH(f,c) GST_VIDEO_INFO_COMP_WIDTH(&(f)->info,c)
#define GST_VIDEO_FRAME_COMP_HEIGHT(f,c) GST_VIDEO_INFO_COMP_HEIGHT(&(f)->info,c)
#define GST_VIDEO_FRAME_COMP_PSTRIDE(f,c) GST_VIDEO_INFO_COMP_PSTRIDE(&(f)->info,c)
#define GST_VIDEO_SIZE_RANGE "(int) [ 1, max ]"
#define GST_VIDEO_FPS_RANGE "(fraction) [ 0, max ]"
@ -338,18 +432,6 @@ gboolean gst_video_calculate_display_ratio (guint * dar_n,
gboolean gst_video_parse_caps_framerate (GstCaps * caps, int *fps_n, int *fps_d);
GstBuffer * gst_video_parse_caps_palette (GstCaps * caps);
int gst_video_format_get_component_width (GstVideoFormat format,
int component,
int width) G_GNUC_CONST;
int gst_video_format_get_component_height (GstVideoFormat format,
int component,
int height) G_GNUC_CONST;
int gst_video_format_get_component_offset (GstVideoFormat format,
int component,
int width,
int height);
/* video still frame event creation and parsing */
GstEvent * gst_video_event_new_still_frame (gboolean in_still);

View file

@ -198,9 +198,9 @@ gst_video_convert_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
if (!gst_video_info_from_caps (&in_info, incaps))
goto invalid_caps;
if (gst_video_format_is_rgb (in_info.format)) {
if (in_info.finfo->flags & GST_VIDEO_FORMAT_FLAG_RGB) {
in_spec = COLOR_SPEC_RGB;
} else if (gst_video_format_is_yuv (in_info.format)) {
} else if (in_info.finfo->flags & GST_VIDEO_FORMAT_FLAG_YUV) {
if (in_info.color_matrix && g_str_equal (in_info.color_matrix, "hdtv"))
in_spec = COLOR_SPEC_YUV_BT709;
else
@ -213,9 +213,9 @@ gst_video_convert_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
if (!gst_video_info_from_caps (&out_info, outcaps))
goto invalid_caps;
if (gst_video_format_is_rgb (out_info.format)) {
if (out_info.finfo->flags & GST_VIDEO_FORMAT_FLAG_RGB) {
out_spec = COLOR_SPEC_RGB;
} else if (gst_video_format_is_yuv (out_info.format)) {
} else if (out_info.finfo->flags & GST_VIDEO_FORMAT_FLAG_YUV) {
if (out_info.color_matrix && g_str_equal (out_info.color_matrix, "hdtv"))
out_spec = COLOR_SPEC_YUV_BT709;
else
@ -246,18 +246,21 @@ gst_video_convert_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
interlaced = (in_info.flags & GST_VIDEO_FLAG_INTERLACED) != 0;
space->convert =
videoconvert_convert_new (out_info.format, out_spec, in_info.format,
in_spec, in_info.width, in_info.height);
videoconvert_convert_new (GST_VIDEO_INFO_FORMAT (&out_info), out_spec,
GST_VIDEO_INFO_FORMAT (&in_info), in_spec, in_info.width, in_info.height);
if (space->convert == NULL)
goto no_convert;
videoconvert_convert_set_interlaced (space->convert, interlaced);
/* palette, only for from data */
if (space->from_info.format == GST_VIDEO_FORMAT_RGB8_PALETTED &&
space->to_info.format == GST_VIDEO_FORMAT_RGB8_PALETTED) {
if (GST_VIDEO_INFO_FORMAT (&space->from_info) ==
GST_VIDEO_FORMAT_RGB8_PALETTED
&& GST_VIDEO_INFO_FORMAT (&space->to_info) ==
GST_VIDEO_FORMAT_RGB8_PALETTED) {
goto format_mismatch;
} else if (space->from_info.format == GST_VIDEO_FORMAT_RGB8_PALETTED) {
} else if (GST_VIDEO_INFO_FORMAT (&space->from_info) ==
GST_VIDEO_FORMAT_RGB8_PALETTED) {
GstBuffer *palette;
guint32 *data;
@ -274,7 +277,8 @@ gst_video_convert_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
gst_buffer_unmap (palette, data, -1);
gst_buffer_unref (palette);
} else if (space->to_info.format == GST_VIDEO_FORMAT_RGB8_PALETTED) {
} else if (GST_VIDEO_INFO_FORMAT (&space->to_info) ==
GST_VIDEO_FORMAT_RGB8_PALETTED) {
const guint32 *palette;
GstBuffer *p_buf;
@ -286,8 +290,10 @@ gst_video_convert_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
gst_buffer_unref (p_buf);
}
GST_DEBUG ("reconfigured %d %d", space->from_info.format,
space->to_info.format);
GST_DEBUG ("reconfigured %d %d", GST_VIDEO_INFO_FORMAT (&space->from_info),
GST_VIDEO_INFO_FORMAT (&space->to_info));
space->negotiated = TRUE;
return TRUE;
@ -295,29 +301,26 @@ gst_video_convert_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
invalid_caps:
{
GST_ERROR_OBJECT (space, "invalid caps");
space->from_info.format = GST_VIDEO_FORMAT_UNKNOWN;
space->to_info.format = GST_VIDEO_FORMAT_UNKNOWN;
return FALSE;
goto error_done;
}
format_mismatch:
{
GST_ERROR_OBJECT (space, "input and output formats do not match");
space->from_info.format = GST_VIDEO_FORMAT_UNKNOWN;
space->to_info.format = GST_VIDEO_FORMAT_UNKNOWN;
return FALSE;
goto error_done;
}
no_convert:
{
GST_ERROR_OBJECT (space, "could not create converter");
space->from_info.format = GST_VIDEO_FORMAT_UNKNOWN;
space->to_info.format = GST_VIDEO_FORMAT_UNKNOWN;
return FALSE;
goto error_done;
}
invalid_palette:
{
GST_ERROR_OBJECT (space, "invalid palette");
space->from_info.format = GST_VIDEO_FORMAT_UNKNOWN;
space->to_info.format = GST_VIDEO_FORMAT_UNKNOWN;
goto error_done;
}
error_done:
{
space->negotiated = FALSE;
return FALSE;
}
}
@ -381,8 +384,7 @@ gst_video_convert_class_init (GstVideoConvertClass * klass)
static void
gst_video_convert_init (GstVideoConvert * space)
{
space->from_info.format = GST_VIDEO_FORMAT_UNKNOWN;
space->to_info.format = GST_VIDEO_FORMAT_UNKNOWN;
space->negotiated = FALSE;
}
void
@ -447,11 +449,10 @@ gst_video_convert_transform (GstBaseTransform * btrans, GstBuffer * inbuf,
space = GST_VIDEO_CONVERT_CAST (btrans);
GST_DEBUG ("from %d -> to %d", space->from_info.format,
space->to_info.format);
GST_DEBUG ("from %s -> to %s", GST_VIDEO_INFO_NAME (&space->from_info),
GST_VIDEO_INFO_NAME (&space->to_info));
if (G_UNLIKELY (space->from_info.format == GST_VIDEO_FORMAT_UNKNOWN ||
space->to_info.format == GST_VIDEO_FORMAT_UNKNOWN))
if (G_UNLIKELY (!space->negotiated))
goto unknown_format;
videoconvert_convert_set_dither (space->convert, space->dither);
@ -468,8 +469,8 @@ gst_video_convert_transform (GstBaseTransform * btrans, GstBuffer * inbuf,
gst_video_frame_unmap (&in_frame);
/* baseclass copies timestamps */
GST_DEBUG ("from %d -> to %d done", space->from_info.format,
space->to_info.format);
GST_DEBUG ("from %s -> to %s done", GST_VIDEO_INFO_NAME (&space->from_info),
GST_VIDEO_INFO_NAME (&space->to_info));
return GST_FLOW_OK;

View file

@ -49,6 +49,7 @@ struct _GstVideoConvert {
GstVideoInfo from_info;
GstVideoInfo to_info;
gboolean negotiated;
ColorSpaceColorSpec from_spec;
ColorSpaceColorSpec to_spec;

View file

@ -42,27 +42,31 @@ videoconvert_convert_new (GstVideoFormat to_format, ColorSpaceColorSpec to_spec,
GstVideoFormat from_format, ColorSpaceColorSpec from_spec,
int width, int height)
{
const GstVideoFormatInfo *to_info, *from_info;
VideoConvert *convert;
int i;
g_return_val_if_fail (!gst_video_format_is_rgb (to_format)
from_info = gst_video_format_get_info (from_format);
to_info = gst_video_format_get_info (to_format);
g_return_val_if_fail (!GST_VIDEO_FORMAT_INFO_IS_RGB (to_info)
|| to_spec == COLOR_SPEC_RGB, NULL);
g_return_val_if_fail (!gst_video_format_is_yuv (to_format)
g_return_val_if_fail (!GST_VIDEO_FORMAT_INFO_IS_YUV (to_info)
|| to_spec == COLOR_SPEC_YUV_BT709
|| to_spec == COLOR_SPEC_YUV_BT470_6, NULL);
g_return_val_if_fail (gst_video_format_is_rgb (to_format)
|| gst_video_format_is_yuv (to_format)
|| (gst_video_format_is_gray (to_format) &&
g_return_val_if_fail (GST_VIDEO_FORMAT_INFO_IS_RGB (to_info)
|| GST_VIDEO_FORMAT_INFO_IS_YUV (to_info)
|| (GST_VIDEO_FORMAT_INFO_IS_GRAY (to_info) &&
to_spec == COLOR_SPEC_GRAY), NULL);
g_return_val_if_fail (!gst_video_format_is_rgb (from_format)
g_return_val_if_fail (!GST_VIDEO_FORMAT_INFO_IS_RGB (from_info)
|| from_spec == COLOR_SPEC_RGB, NULL);
g_return_val_if_fail (!gst_video_format_is_yuv (from_format)
g_return_val_if_fail (!GST_VIDEO_FORMAT_INFO_IS_YUV (from_info)
|| from_spec == COLOR_SPEC_YUV_BT709
|| from_spec == COLOR_SPEC_YUV_BT470_6, NULL);
g_return_val_if_fail (gst_video_format_is_rgb (from_format)
|| gst_video_format_is_yuv (from_format)
|| (gst_video_format_is_gray (from_format) &&
g_return_val_if_fail (GST_VIDEO_FORMAT_INFO_IS_RGB (from_info)
|| GST_VIDEO_FORMAT_INFO_IS_YUV (from_info)
|| (GST_VIDEO_FORMAT_INFO_IS_GRAY (from_info) &&
from_spec == COLOR_SPEC_GRAY), NULL);
convert = g_malloc (sizeof (VideoConvert));
@ -77,8 +81,7 @@ videoconvert_convert_new (GstVideoFormat to_format, ColorSpaceColorSpec to_spec,
convert->convert = videoconvert_convert_generic;
convert->dither16 = videoconvert_dither_none;
if (gst_video_format_get_component_depth (to_format, 0) > 8 ||
gst_video_format_get_component_depth (from_format, 0) > 8) {
if (to_info->depth[0] > 8 || from_info->depth[0] > 8) {
convert->use_16bit = TRUE;
} else {
convert->use_16bit = FALSE;
@ -179,7 +182,7 @@ videoconvert_convert_convert (VideoConvert * convert,
#define FRAME_GET_STRIDE(dir, comp) \
((dir)->info.stride[comp])
#define FRAME_GET_LINE(dir, comp, line) \
((dir)->data[comp] + FRAME_GET_STRIDE (dir, comp) * (line))
(((guint8*)(dir)->data[comp]) + FRAME_GET_STRIDE (dir, comp) * (line))
static void
getline_I420 (VideoConvert * convert, guint8 * dest, const GstVideoFrame * src,

View file

@ -903,20 +903,16 @@ gst_video_scale_setup_vs_image (VSImage * image, GstVideoFrame * frame,
GstVideoFormat format;
gint width, height;
format = frame->info.format;
width = frame->info.width;
height = frame->info.height;
format = GST_VIDEO_FRAME_FORMAT (frame);
width = GST_VIDEO_FRAME_WIDTH (frame);
height = GST_VIDEO_FRAME_HEIGHT (frame);
image->real_width =
gst_video_format_get_component_width (format, component, width);
image->real_height =
gst_video_format_get_component_height (format, component, height);
image->width =
gst_video_format_get_component_width (format, component, MAX (1,
width - b_w));
image->height =
gst_video_format_get_component_height (format, component, MAX (1,
height - b_h));
image->real_width = GST_VIDEO_FRAME_COMP_WIDTH (frame, component);
image->real_height = GST_VIDEO_FRAME_COMP_HEIGHT (frame, component);
image->width = GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (frame->info.finfo,
component, MAX (1, width - b_w));
image->height = GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (frame->info.finfo,
component, MAX (1, height - b_h));
image->border_top = (image->real_height - image->height) / 2;
image->border_bottom = image->real_height - image->height - image->border_top;
@ -940,8 +936,7 @@ gst_video_scale_setup_vs_image (VSImage * image, GstVideoFrame * frame,
image->pixels =
image->real_pixels + image->border_top * image->stride +
image->border_left * gst_video_format_get_pixel_stride (format,
component);
image->border_left * GST_VIDEO_FRAME_COMP_PSTRIDE (frame, component);
}
static const guint8 *
@ -1025,7 +1020,7 @@ gst_video_scale_transform (GstBaseTransform * trans, GstBuffer * in,
add_borders = videoscale->add_borders;
GST_OBJECT_UNLOCK (videoscale);
format = videoscale->from_info.format;
format = GST_VIDEO_INFO_FORMAT (&videoscale->from_info);
black = _get_black_for_format (format);
if (videoscale->from_info.width == 1) {
@ -1039,7 +1034,7 @@ gst_video_scale_transform (GstBaseTransform * trans, GstBuffer * in,
gst_video_frame_map (&in_frame, &videoscale->from_info, in, GST_MAP_READ);
gst_video_frame_map (&out_frame, &videoscale->to_info, out, GST_MAP_WRITE);
for (i = 0; i < in_frame.info.n_planes; i++) {
for (i = 0; i < GST_VIDEO_FRAME_N_PLANES (&in_frame); i++) {
gst_video_scale_setup_vs_image (&src[i], &in_frame, i, 0, 0);
gst_video_scale_setup_vs_image (&dest[i], &out_frame, i,
videoscale->borders_w, videoscale->borders_h);

View file

@ -1562,22 +1562,22 @@ paint_tmpline_AYUV (paintinfo * p, int x, int w)
static void
paint_setup_I420 (paintinfo * p, GstVideoFrame * frame)
{
p->yp = GST_VIDEO_FRAME_DATA (frame, 0);
p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->up = GST_VIDEO_FRAME_DATA (frame, 1);
p->ustride = GST_VIDEO_FRAME_STRIDE (frame, 1);
p->vp = GST_VIDEO_FRAME_DATA (frame, 2);
p->vstride = GST_VIDEO_FRAME_STRIDE (frame, 2);
p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 1);
p->ustride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 1);
p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 2);
p->vstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 2);
p->size = frame->info.size;
}
static void
paint_setup_NV12 (paintinfo * p, GstVideoFrame * frame)
{
p->yp = GST_VIDEO_FRAME_DATA (frame, 0);
p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->up = GST_VIDEO_FRAME_DATA (frame, 1);
p->ustride = GST_VIDEO_FRAME_STRIDE (frame, 1);
p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 1);
p->ustride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 1);
p->vp = p->up + 1;
p->vstride = p->ustride;
p->size = frame->info.size;
@ -1586,10 +1586,10 @@ paint_setup_NV12 (paintinfo * p, GstVideoFrame * frame)
static void
paint_setup_NV21 (paintinfo * p, GstVideoFrame * frame)
{
p->yp = GST_VIDEO_FRAME_DATA (frame, 0);
p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->vp = GST_VIDEO_FRAME_DATA (frame, 1);
p->vstride = GST_VIDEO_FRAME_STRIDE (frame, 1);
p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 1);
p->vstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 1);
p->up = p->vp + 1;
p->ustride = p->vstride;
p->size = frame->info.size;
@ -1653,22 +1653,22 @@ convert_hline_NV21 (paintinfo * p, int y)
static void
paint_setup_YV12 (paintinfo * p, GstVideoFrame * frame)
{
p->yp = GST_VIDEO_FRAME_DATA (frame, 0);
p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->up = GST_VIDEO_FRAME_DATA (frame, 1);
p->ustride = GST_VIDEO_FRAME_STRIDE (frame, 1);
p->vp = GST_VIDEO_FRAME_DATA (frame, 2);
p->vstride = GST_VIDEO_FRAME_STRIDE (frame, 2);
p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 1);
p->ustride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 1);
p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 2);
p->vstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 2);
p->size = frame->info.size;
}
static void
paint_setup_v308 (paintinfo * p, GstVideoFrame * frame)
{
p->yp = GST_VIDEO_FRAME_DATA (frame, 0);
p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->up = p->yp + 1;
p->vp = p->yp + 2;
p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->ustride = p->ystride;
p->vstride = p->ystride;
p->size = frame->info.size;
@ -1677,11 +1677,11 @@ paint_setup_v308 (paintinfo * p, GstVideoFrame * frame)
static void
paint_setup_AYUV (paintinfo * p, GstVideoFrame * frame)
{
p->ap = GST_VIDEO_FRAME_DATA (frame, 0);
p->ap = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->yp = p->ap + 1;
p->up = p->ap + 2;
p->vp = p->ap + 3;
p->astride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->ystride = p->astride;;
p->ustride = p->astride;
p->vstride = p->astride;
@ -1704,11 +1704,11 @@ paint_setup_v410 (paintinfo * p, GstVideoFrame * frame)
static void
paint_setup_v216 (paintinfo * p, GstVideoFrame * frame)
{
p->ap = GST_VIDEO_FRAME_DATA (frame, 0);
p->ap = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->yp = p->ap + 2;
p->up = p->ap + 0;
p->vp = p->ap + 4;
p->astride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->ystride = p->astride;;
p->ustride = p->astride;
p->vstride = p->astride;
@ -1718,11 +1718,11 @@ paint_setup_v216 (paintinfo * p, GstVideoFrame * frame)
static void
paint_setup_v210 (paintinfo * p, GstVideoFrame * frame)
{
p->ap = GST_VIDEO_FRAME_DATA (frame, 0);
p->ap = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->yp = p->ap;
p->up = p->ap;
p->vp = p->ap;
p->astride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->ystride = p->astride;;
p->ustride = p->astride;
p->vstride = p->astride;
@ -1732,11 +1732,11 @@ paint_setup_v210 (paintinfo * p, GstVideoFrame * frame)
static void
paint_setup_UYVP (paintinfo * p, GstVideoFrame * frame)
{
p->ap = GST_VIDEO_FRAME_DATA (frame, 0);
p->ap = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->yp = p->ap;
p->up = p->ap;
p->vp = p->ap;
p->astride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->ystride = p->astride;;
p->ustride = p->astride;
p->vstride = p->astride;
@ -1746,10 +1746,10 @@ paint_setup_UYVP (paintinfo * p, GstVideoFrame * frame)
static void
paint_setup_YUY2 (paintinfo * p, GstVideoFrame * frame)
{
p->yp = GST_VIDEO_FRAME_DATA (frame, 0);
p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->up = p->yp + 1;
p->vp = p->yp + 3;
p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->ustride = p->ystride;
p->vstride = p->ystride;
p->size = frame->info.size;
@ -1758,10 +1758,10 @@ paint_setup_YUY2 (paintinfo * p, GstVideoFrame * frame)
static void
paint_setup_UYVY (paintinfo * p, GstVideoFrame * frame)
{
p->up = GST_VIDEO_FRAME_DATA (frame, 0);
p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->yp = p->up + 1;
p->vp = p->up + 2;
p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->ustride = p->ystride;
p->vstride = p->ystride;
p->size = frame->info.size;
@ -1770,10 +1770,10 @@ paint_setup_UYVY (paintinfo * p, GstVideoFrame * frame)
static void
paint_setup_YVYU (paintinfo * p, GstVideoFrame * frame)
{
p->yp = GST_VIDEO_FRAME_DATA (frame, 0);
p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->up = p->yp + 3;
p->vp = p->yp + 1;
p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->ustride = p->ystride;
p->vstride = p->ystride;
p->size = frame->info.size;
@ -1782,11 +1782,11 @@ paint_setup_YVYU (paintinfo * p, GstVideoFrame * frame)
static void
paint_setup_AY64 (paintinfo * p, GstVideoFrame * frame)
{
p->ap = GST_VIDEO_FRAME_DATA (frame, 0);
p->ap = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->yp = p->ap + 2;
p->up = p->ap + 4;
p->vp = p->ap + 6;
p->astride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->ystride = p->astride;
p->ustride = p->astride;
p->vstride = p->astride;
@ -1977,10 +1977,10 @@ static void
paint_setup_IYU2 (paintinfo * p, GstVideoFrame * frame)
{
/* untested */
p->up = GST_VIDEO_FRAME_DATA (frame, 0);
p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->yp = p->up + 1;
p->vp = p->up + 2;
p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->ustride = p->ystride;
p->vstride = p->ystride;
p->size = frame->info.size;
@ -2006,12 +2006,12 @@ convert_hline_IYU2 (paintinfo * p, int y)
static void
paint_setup_Y41B (paintinfo * p, GstVideoFrame * frame)
{
p->yp = GST_VIDEO_FRAME_DATA (frame, 0);
p->up = GST_VIDEO_FRAME_DATA (frame, 1);
p->vp = GST_VIDEO_FRAME_DATA (frame, 2);
p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->ustride = GST_VIDEO_FRAME_STRIDE (frame, 1);
p->vstride = GST_VIDEO_FRAME_STRIDE (frame, 2);
p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 1);
p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 2);
p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->ustride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 1);
p->vstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 2);
p->size = frame->info.size;
}
@ -2038,12 +2038,12 @@ convert_hline_Y41B (paintinfo * p, int y)
static void
paint_setup_Y42B (paintinfo * p, GstVideoFrame * frame)
{
p->yp = GST_VIDEO_FRAME_DATA (frame, 0);
p->up = GST_VIDEO_FRAME_DATA (frame, 1);
p->vp = GST_VIDEO_FRAME_DATA (frame, 2);
p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->ustride = GST_VIDEO_FRAME_STRIDE (frame, 1);
p->vstride = GST_VIDEO_FRAME_STRIDE (frame, 2);
p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 1);
p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 2);
p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->ustride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 1);
p->vstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 2);
p->size = frame->info.size;
}
@ -2068,12 +2068,12 @@ convert_hline_Y42B (paintinfo * p, int y)
static void
paint_setup_Y444 (paintinfo * p, GstVideoFrame * frame)
{
p->yp = GST_VIDEO_FRAME_DATA (frame, 0);
p->up = GST_VIDEO_FRAME_DATA (frame, 1);
p->vp = GST_VIDEO_FRAME_DATA (frame, 2);
p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->ustride = GST_VIDEO_FRAME_STRIDE (frame, 1);
p->vstride = GST_VIDEO_FRAME_STRIDE (frame, 2);
p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 1);
p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 2);
p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->ustride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 1);
p->vstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 2);
p->size = frame->info.size;
}
@ -2097,8 +2097,8 @@ static void
paint_setup_Y800 (paintinfo * p, GstVideoFrame * frame)
{
/* untested */
p->yp = GST_VIDEO_FRAME_DATA (frame, 0);
p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->size = frame->info.size;
}
@ -2117,24 +2117,24 @@ convert_hline_Y800 (paintinfo * p, int y)
static void
paint_setup_YVU9 (paintinfo * p, GstVideoFrame * frame)
{
p->yp = GST_VIDEO_FRAME_DATA (frame, 0);
p->up = GST_VIDEO_FRAME_DATA (frame, 1);
p->vp = GST_VIDEO_FRAME_DATA (frame, 2);
p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->ustride = GST_VIDEO_FRAME_STRIDE (frame, 1);
p->vstride = GST_VIDEO_FRAME_STRIDE (frame, 2);
p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 1);
p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 2);
p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->ustride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 1);
p->vstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 2);
p->size = frame->info.size;
}
static void
paint_setup_YUV9 (paintinfo * p, GstVideoFrame * frame)
{
p->yp = GST_VIDEO_FRAME_DATA (frame, 0);
p->up = GST_VIDEO_FRAME_DATA (frame, 1);
p->vp = GST_VIDEO_FRAME_DATA (frame, 2);
p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->ustride = GST_VIDEO_FRAME_STRIDE (frame, 1);
p->vstride = GST_VIDEO_FRAME_STRIDE (frame, 2);
p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->up = GST_VIDEO_FRAME_PLANE_DATA (frame, 1);
p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 2);
p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->ustride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 1);
p->vstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 2);
p->size = frame->info.size;
}
@ -2185,11 +2185,11 @@ paint_setup_BGRA8888 (paintinfo * p, GstVideoFrame * frame)
static void
paint_setup_xRGB8888 (paintinfo * p, GstVideoFrame * frame)
{
p->ap = GST_VIDEO_FRAME_DATA (frame, 0);
p->ap = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->yp = p->ap + 1;
p->up = p->ap + 2;
p->vp = p->ap + 3;
p->astride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->ystride = p->astride;
p->ustride = p->astride;
p->vstride = p->astride;
@ -2199,11 +2199,11 @@ paint_setup_xRGB8888 (paintinfo * p, GstVideoFrame * frame)
static void
paint_setup_xBGR8888 (paintinfo * p, GstVideoFrame * frame)
{
p->ap = GST_VIDEO_FRAME_DATA (frame, 0);
p->ap = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->yp = p->ap + 3;
p->up = p->ap + 2;
p->vp = p->ap + 1;
p->astride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->ystride = p->astride;
p->ustride = p->astride;
p->vstride = p->astride;
@ -2213,11 +2213,11 @@ paint_setup_xBGR8888 (paintinfo * p, GstVideoFrame * frame)
static void
paint_setup_RGBx8888 (paintinfo * p, GstVideoFrame * frame)
{
p->yp = GST_VIDEO_FRAME_DATA (frame, 0);
p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->up = p->yp + 1;
p->vp = p->yp + 2;
p->ap = p->yp + 3;
p->astride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->ystride = p->astride;
p->ustride = p->astride;
p->vstride = p->astride;
@ -2227,11 +2227,11 @@ paint_setup_RGBx8888 (paintinfo * p, GstVideoFrame * frame)
static void
paint_setup_BGRx8888 (paintinfo * p, GstVideoFrame * frame)
{
p->vp = GST_VIDEO_FRAME_DATA (frame, 0);
p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->up = p->vp + 1;
p->yp = p->vp + 2;
p->ap = p->vp + 3;
p->astride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->ystride = p->astride;
p->ustride = p->astride;
p->vstride = p->astride;
@ -2241,10 +2241,10 @@ paint_setup_BGRx8888 (paintinfo * p, GstVideoFrame * frame)
static void
paint_setup_RGB888 (paintinfo * p, GstVideoFrame * frame)
{
p->yp = GST_VIDEO_FRAME_DATA (frame, 0);
p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->up = p->yp + 1;
p->vp = p->yp + 2;
p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->ustride = p->ystride;
p->vstride = p->ystride;
p->size = frame->info.size;
@ -2253,10 +2253,10 @@ paint_setup_RGB888 (paintinfo * p, GstVideoFrame * frame)
static void
paint_setup_BGR888 (paintinfo * p, GstVideoFrame * frame)
{
p->vp = GST_VIDEO_FRAME_DATA (frame, 0);
p->vp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->up = p->vp + 1;
p->yp = p->vp + 2;
p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->ustride = p->ystride;
p->vstride = p->ystride;
p->size = frame->info.size;
@ -2265,11 +2265,11 @@ paint_setup_BGR888 (paintinfo * p, GstVideoFrame * frame)
static void
paint_setup_ARGB64 (paintinfo * p, GstVideoFrame * frame)
{
p->ap = GST_VIDEO_FRAME_DATA (frame, 0);
p->ap = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->yp = p->ap + 2;
p->up = p->ap + 4;
p->yp = p->ap + 6;
p->astride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->astride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->ystride = p->astride;
p->ustride = p->astride;
p->vstride = p->astride;
@ -2349,8 +2349,8 @@ convert_hline_str3 (paintinfo * p, int y)
static void
paint_setup_RGB565 (paintinfo * p, GstVideoFrame * frame)
{
p->yp = GST_VIDEO_FRAME_DATA (frame, 0);
p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->ustride = p->ystride;
p->vstride = p->ystride;
p->size = frame->info.size;
@ -2395,8 +2395,8 @@ convert_hline_xRGB1555 (paintinfo * p, int y)
static void
paint_setup_xRGB1555 (paintinfo * p, GstVideoFrame * frame)
{
p->yp = GST_VIDEO_FRAME_DATA (frame, 0);
p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->ustride = p->ystride;
p->vstride = p->ystride;
p->size = frame->info.size;
@ -2406,7 +2406,7 @@ paint_setup_xRGB1555 (paintinfo * p, GstVideoFrame * frame)
static void
paint_setup_bayer_bggr (paintinfo * p, GstVideoFrame * frame)
{
p->yp = GST_VIDEO_FRAME_DATA (frame, 0);
p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->ystride = GST_ROUND_UP_4 (p->width);
p->ustride = GST_ROUND_UP_4 (p->width);
p->vstride = GST_ROUND_UP_4 (p->width);
@ -2418,7 +2418,7 @@ paint_setup_bayer_bggr (paintinfo * p, GstVideoFrame * frame)
static void
paint_setup_bayer_rggb (paintinfo * p, GstVideoFrame * frame)
{
p->yp = GST_VIDEO_FRAME_DATA (frame, 0);
p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->ystride = GST_ROUND_UP_4 (p->width);
p->ustride = GST_ROUND_UP_4 (p->width);
p->vstride = GST_ROUND_UP_4 (p->width);
@ -2430,7 +2430,7 @@ paint_setup_bayer_rggb (paintinfo * p, GstVideoFrame * frame)
static void
paint_setup_bayer_grbg (paintinfo * p, GstVideoFrame * frame)
{
p->yp = GST_VIDEO_FRAME_DATA (frame, 0);
p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->ystride = GST_ROUND_UP_4 (p->width);
p->ustride = GST_ROUND_UP_4 (p->width);
p->vstride = GST_ROUND_UP_4 (p->width);
@ -2442,7 +2442,7 @@ paint_setup_bayer_grbg (paintinfo * p, GstVideoFrame * frame)
static void
paint_setup_bayer_gbrg (paintinfo * p, GstVideoFrame * frame)
{
p->yp = GST_VIDEO_FRAME_DATA (frame, 0);
p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->ystride = GST_ROUND_UP_4 (p->width);
p->ustride = GST_ROUND_UP_4 (p->width);
p->vstride = GST_ROUND_UP_4 (p->width);
@ -2482,8 +2482,8 @@ convert_hline_bayer (paintinfo * p, int y)
static void
paint_setup_GRAY8 (paintinfo * p, GstVideoFrame * frame)
{
p->yp = GST_VIDEO_FRAME_DATA (frame, 0);
p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->size = frame->info.size;
}
@ -2503,8 +2503,8 @@ convert_hline_GRAY8 (paintinfo * p, int y)
static void
paint_setup_GRAY16 (paintinfo * p, GstVideoFrame * frame)
{
p->yp = GST_VIDEO_FRAME_DATA (frame, 0);
p->ystride = GST_VIDEO_FRAME_STRIDE (frame, 0);
p->yp = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
p->ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
p->size = frame->info.size;
}

View file

@ -508,21 +508,25 @@ ximage_buffer_pool_alloc (GstBufferPool * pool, GstBuffer ** buffer,
{
GstXImageBufferPool *xpool = GST_XIMAGE_BUFFER_POOL_CAST (pool);
GstXImageBufferPoolPrivate *priv = xpool->priv;
GstVideoInfo *info;
GstBuffer *ximage;
GstMetaXImage *meta;
info = &priv->info;
ximage = gst_buffer_new ();
meta =
gst_buffer_add_meta_ximage (ximage, xpool->sink, priv->info.width,
priv->info.height);
gst_buffer_add_meta_ximage (ximage, xpool->sink,
GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info));
if (meta == NULL) {
gst_buffer_unref (ximage);
goto no_buffer;
}
if (priv->add_metavideo) {
GST_DEBUG_OBJECT (pool, "adding GstMetaVideo");
/* these are just the defaults for now */
gst_buffer_add_meta_video (ximage, 0, priv->info.format, priv->info.width,
priv->info.height);
gst_buffer_add_meta_video (ximage, 0, GST_VIDEO_INFO_FORMAT (info),
GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info));
}
*buffer = ximage;

View file

@ -555,22 +555,27 @@ xvimage_buffer_pool_alloc (GstBufferPool * pool, GstBuffer ** buffer,
{
GstXvImageBufferPool *xvpool = GST_XVIMAGE_BUFFER_POOL_CAST (pool);
GstXvImageBufferPoolPrivate *priv = xvpool->priv;
GstVideoInfo *info;
GstBuffer *xvimage;
GstMetaXvImage *meta;
info = &priv->info;
xvimage = gst_buffer_new ();
meta =
gst_buffer_add_meta_xvimage (xvimage, xvpool->sink, priv->info.width,
priv->info.height, priv->im_format);
gst_buffer_add_meta_xvimage (xvimage, xvpool->sink,
GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info),
priv->im_format);
if (meta == NULL) {
gst_buffer_unref (xvimage);
goto no_buffer;
}
if (priv->add_metavideo) {
GST_DEBUG_OBJECT (pool, "adding GstMetaVideo");
/* these are just the defaults for now */
gst_buffer_add_meta_video (xvimage, 0, priv->info.format, priv->info.width,
priv->info.height);
gst_buffer_add_meta_video (xvimage, 0, GST_VIDEO_INFO_FORMAT (info),
GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info));
}
*buffer = xvimage;