mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-07-05 14:16:06 +00:00
video: port to new API
Add support for palette again. Rewrite setup code for videoconvert using the new video methods.
This commit is contained in:
parent
1aa7ad7dae
commit
6a254de438
|
@ -608,9 +608,8 @@ collect_information (GstDiscoverer * dc, const GstStructure * st,
|
||||||
GstCaps *caps;
|
GstCaps *caps;
|
||||||
GstStructure *caps_st, *tags_st;
|
GstStructure *caps_st, *tags_st;
|
||||||
const gchar *name;
|
const gchar *name;
|
||||||
int tmp, tmp2;
|
int tmp;
|
||||||
guint utmp;
|
guint utmp;
|
||||||
gboolean btmp;
|
|
||||||
|
|
||||||
if (!st || !gst_structure_id_has_field (st, _CAPS_QUARK)) {
|
if (!st || !gst_structure_id_has_field (st, _CAPS_QUARK)) {
|
||||||
GST_WARNING ("Couldn't find caps !");
|
GST_WARNING ("Couldn't find caps !");
|
||||||
|
@ -667,7 +666,7 @@ collect_information (GstDiscoverer * dc, const GstStructure * st,
|
||||||
} else if (g_str_has_prefix (name, "video/") ||
|
} else if (g_str_has_prefix (name, "video/") ||
|
||||||
g_str_has_prefix (name, "image/")) {
|
g_str_has_prefix (name, "image/")) {
|
||||||
GstDiscovererVideoInfo *info;
|
GstDiscovererVideoInfo *info;
|
||||||
GstVideoFormat format;
|
GstVideoInfo vinfo;
|
||||||
|
|
||||||
if (parent)
|
if (parent)
|
||||||
info = (GstDiscovererVideoInfo *) parent;
|
info = (GstDiscovererVideoInfo *) parent;
|
||||||
|
@ -677,27 +676,21 @@ collect_information (GstDiscoverer * dc, const GstStructure * st,
|
||||||
info->parent.caps = caps;
|
info->parent.caps = caps;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gst_video_format_parse_caps (caps, &format, &tmp, &tmp2)) {
|
if (gst_video_info_from_caps (&vinfo, caps)) {
|
||||||
info->width = (guint) tmp;
|
info->width = (guint) vinfo.width;
|
||||||
info->height = (guint) tmp2;
|
info->height = (guint) vinfo.height;
|
||||||
|
|
||||||
|
info->depth = (guint) 0;
|
||||||
|
|
||||||
|
info->par_num = vinfo.par_n;
|
||||||
|
info->par_denom = vinfo.par_d;
|
||||||
|
|
||||||
|
info->framerate_num = vinfo.fps_n;
|
||||||
|
info->framerate_denom = vinfo.fps_d;
|
||||||
|
|
||||||
|
info->interlaced = (vinfo.flags & GST_VIDEO_FLAG_INTERLACED) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gst_structure_get_int (caps_st, "depth", &tmp))
|
|
||||||
info->depth = (guint) tmp;
|
|
||||||
|
|
||||||
if (gst_video_parse_caps_pixel_aspect_ratio (caps, &tmp, &tmp2)) {
|
|
||||||
info->par_num = tmp;
|
|
||||||
info->par_denom = tmp2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gst_video_parse_caps_framerate (caps, &tmp, &tmp2)) {
|
|
||||||
info->framerate_num = tmp;
|
|
||||||
info->framerate_denom = tmp2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gst_video_format_parse_caps_interlaced (caps, &btmp))
|
|
||||||
info->interlaced = btmp;
|
|
||||||
|
|
||||||
if (gst_structure_id_has_field (st, _TAGS_QUARK)) {
|
if (gst_structure_id_has_field (st, _TAGS_QUARK)) {
|
||||||
gst_structure_id_get (st, _TAGS_QUARK,
|
gst_structure_id_get (st, _TAGS_QUARK,
|
||||||
GST_TYPE_STRUCTURE, &tags_st, NULL);
|
GST_TYPE_STRUCTURE, &tags_st, NULL);
|
||||||
|
|
|
@ -37,35 +37,24 @@ gst_meta_video_get_info (void)
|
||||||
|
|
||||||
|
|
||||||
GstMetaVideo *
|
GstMetaVideo *
|
||||||
gst_buffer_add_meta_video (GstBuffer * buffer, GstMetaVideoFlags flags,
|
gst_buffer_add_meta_video (GstBuffer * buffer, GstVideoFlags flags,
|
||||||
GstVideoFormat format, guint width, guint height)
|
GstVideoFormat format, guint width, guint height)
|
||||||
{
|
{
|
||||||
GstMetaVideo *meta;
|
GstMetaVideo *meta;
|
||||||
guint i;
|
GstVideoInfo info;
|
||||||
GstMetaVideoPlane plane[GST_VIDEO_MAX_PLANES];
|
|
||||||
|
|
||||||
for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) {
|
gst_video_info_set_format (&info, format, width, height);
|
||||||
gint offset;
|
|
||||||
|
|
||||||
offset = gst_video_format_get_component_offset (format, i, width, height);
|
|
||||||
/* end when the offset is 0 for something else that the first component */
|
|
||||||
if (i > 0 && offset == 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
plane[i].offset = offset;
|
|
||||||
plane[i].stride = gst_video_format_get_row_stride (format, i, width);
|
|
||||||
}
|
|
||||||
|
|
||||||
meta = gst_buffer_add_meta_video_full (buffer, flags, format, width, height,
|
meta = gst_buffer_add_meta_video_full (buffer, flags, format, width, height,
|
||||||
i, plane);
|
info.n_planes, info.plane);
|
||||||
|
|
||||||
return meta;
|
return meta;
|
||||||
}
|
}
|
||||||
|
|
||||||
GstMetaVideo *
|
GstMetaVideo *
|
||||||
gst_buffer_add_meta_video_full (GstBuffer * buffer, GstMetaVideoFlags flags,
|
gst_buffer_add_meta_video_full (GstBuffer * buffer, GstVideoFlags flags,
|
||||||
GstVideoFormat format, guint width, guint height,
|
GstVideoFormat format, guint width, guint height,
|
||||||
guint n_planes, GstMetaVideoPlane plane[GST_VIDEO_MAX_PLANES])
|
guint n_planes, GstVideoPlane plane[GST_VIDEO_MAX_PLANES])
|
||||||
{
|
{
|
||||||
GstMetaVideo *meta;
|
GstMetaVideo *meta;
|
||||||
guint i;
|
guint i;
|
||||||
|
|
|
@ -32,41 +32,6 @@ G_BEGIN_DECLS
|
||||||
typedef struct _GstMetaVideo GstMetaVideo;
|
typedef struct _GstMetaVideo GstMetaVideo;
|
||||||
typedef struct _GstMetaVideoPlane GstMetaVideoPlane;
|
typedef struct _GstMetaVideoPlane GstMetaVideoPlane;
|
||||||
|
|
||||||
/**
|
|
||||||
* GstMetaVideoFlags:
|
|
||||||
* @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_META_VIDEO_FLAG_NONE = 0,
|
|
||||||
GST_META_VIDEO_FLAG_INTERLACED = (1 << 0),
|
|
||||||
GST_META_VIDEO_FLAG_TTF = (1 << 1),
|
|
||||||
GST_META_VIDEO_FLAG_RFF = (1 << 2),
|
|
||||||
GST_META_VIDEO_FLAG_ONEFIELD = (1 << 3),
|
|
||||||
GST_META_VIDEO_FLAG_TELECINE = (1 << 4),
|
|
||||||
GST_META_VIDEO_FLAG_PROGRESSIVE = (1 << 5)
|
|
||||||
} GstMetaVideoFlags;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* GstMetaVideoPlane:
|
|
||||||
* @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 _GstMetaVideoPlane {
|
|
||||||
gsize offset;
|
|
||||||
gint stride;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GstMetaVideo:
|
* GstMetaVideo:
|
||||||
* @meta: parent #GstMeta
|
* @meta: parent #GstMeta
|
||||||
|
@ -81,16 +46,15 @@ struct _GstMetaVideoPlane {
|
||||||
struct _GstMetaVideo {
|
struct _GstMetaVideo {
|
||||||
GstMeta meta;
|
GstMeta meta;
|
||||||
|
|
||||||
GstMetaVideoFlags flags;
|
|
||||||
|
|
||||||
GstBuffer *buffer;
|
GstBuffer *buffer;
|
||||||
|
|
||||||
|
GstVideoFlags flags;
|
||||||
GstVideoFormat format;
|
GstVideoFormat format;
|
||||||
guint width;
|
guint width;
|
||||||
guint height;
|
guint height;
|
||||||
|
|
||||||
guint n_planes;
|
guint n_planes;
|
||||||
GstMetaVideoPlane plane[GST_VIDEO_MAX_PLANES];
|
GstVideoPlane plane[GST_VIDEO_MAX_PLANES];
|
||||||
|
|
||||||
gpointer (*map) (GstMetaVideo *meta, guint plane, gint *stride,
|
gpointer (*map) (GstMetaVideo *meta, guint plane, gint *stride,
|
||||||
GstMapFlags flags);
|
GstMapFlags flags);
|
||||||
|
@ -100,11 +64,11 @@ struct _GstMetaVideo {
|
||||||
const GstMetaInfo * gst_meta_video_get_info (void);
|
const GstMetaInfo * gst_meta_video_get_info (void);
|
||||||
|
|
||||||
#define gst_buffer_get_meta_video(b) ((GstMetaVideo*)gst_buffer_get_meta((b),GST_META_INFO_VIDEO))
|
#define gst_buffer_get_meta_video(b) ((GstMetaVideo*)gst_buffer_get_meta((b),GST_META_INFO_VIDEO))
|
||||||
GstMetaVideo * gst_buffer_add_meta_video (GstBuffer *buffer, GstMetaVideoFlags flags,
|
GstMetaVideo * gst_buffer_add_meta_video (GstBuffer *buffer, GstVideoFlags flags,
|
||||||
GstVideoFormat format, guint width, guint height);
|
GstVideoFormat format, guint width, guint height);
|
||||||
GstMetaVideo * gst_buffer_add_meta_video_full (GstBuffer *buffer, GstMetaVideoFlags flags,
|
GstMetaVideo * gst_buffer_add_meta_video_full (GstBuffer *buffer, GstVideoFlags flags,
|
||||||
GstVideoFormat format, guint width, guint height,
|
GstVideoFormat format, guint width, guint height,
|
||||||
guint n_planes, GstMetaVideoPlane plane[GST_VIDEO_MAX_PLANES]);
|
guint n_planes, GstVideoPlane plane[GST_VIDEO_MAX_PLANES]);
|
||||||
|
|
||||||
gpointer gst_meta_video_map (GstMetaVideo *meta, guint plane, gint *stride,
|
gpointer gst_meta_video_map (GstMetaVideo *meta, guint plane, gint *stride,
|
||||||
GstMapFlags flags);
|
GstMapFlags flags);
|
||||||
|
|
|
@ -77,15 +77,14 @@ static gboolean
|
||||||
gst_video_filter_get_unit_size (GstBaseTransform * btrans, GstCaps * caps,
|
gst_video_filter_get_unit_size (GstBaseTransform * btrans, GstCaps * caps,
|
||||||
gsize * size)
|
gsize * size)
|
||||||
{
|
{
|
||||||
GstVideoFormat fmt;
|
GstVideoInfo info;
|
||||||
gint width, height;
|
|
||||||
|
|
||||||
if (!gst_video_format_parse_caps (caps, &fmt, &width, &height)) {
|
if (!gst_video_info_from_caps (&info, caps)) {
|
||||||
GST_WARNING_OBJECT (btrans, "Failed to parse caps %" GST_PTR_FORMAT, caps);
|
GST_WARNING_OBJECT (btrans, "Failed to parse caps %" GST_PTR_FORMAT, caps);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
*size = gst_video_format_get_size (fmt, width, height);
|
*size = info.size;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (btrans, "Returning size %u bytes for caps %"
|
GST_DEBUG_OBJECT (btrans, "Returning size %u bytes for caps %"
|
||||||
GST_PTR_FORMAT, *size, caps);
|
GST_PTR_FORMAT, *size, caps);
|
||||||
|
|
|
@ -713,6 +713,7 @@ gst_video_info_set_format (GstVideoInfo * info, GstVideoFormat format,
|
||||||
g_return_if_fail (info != NULL);
|
g_return_if_fail (info != NULL);
|
||||||
g_return_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN);
|
g_return_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN);
|
||||||
|
|
||||||
|
info->flags = 0;
|
||||||
info->format = format;
|
info->format = format;
|
||||||
info->width = width;
|
info->width = width;
|
||||||
info->height = height;
|
info->height = height;
|
||||||
|
@ -1847,7 +1848,36 @@ gst_video_event_parse_still_frame (GstEvent * event, gboolean * in_still)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
/**
|
||||||
|
* gst_video_parse_caps_framerate:
|
||||||
|
* @caps: pointer to a #GstCaps instance
|
||||||
|
* @fps_n: pointer to integer to hold numerator of frame rate (output)
|
||||||
|
* @fps_d: pointer to integer to hold denominator of frame rate (output)
|
||||||
|
*
|
||||||
|
* Extracts the frame rate from @caps and places the values in the locations
|
||||||
|
* pointed to by @fps_n and @fps_d. Returns TRUE if the values could be
|
||||||
|
* parsed correctly, FALSE if not.
|
||||||
|
*
|
||||||
|
* This function can be used with #GstCaps that have any media type; it
|
||||||
|
* is not limited to formats handled by #GstVideoFormat.
|
||||||
|
*
|
||||||
|
* Since: 0.10.16
|
||||||
|
*
|
||||||
|
* Returns: TRUE if @caps was parsed correctly.
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
gst_video_parse_caps_framerate (GstCaps * caps, int *fps_n, int *fps_d)
|
||||||
|
{
|
||||||
|
GstStructure *structure;
|
||||||
|
|
||||||
|
if (!gst_caps_is_fixed (caps))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
structure = gst_caps_get_structure (caps, 0);
|
||||||
|
|
||||||
|
return gst_structure_get_fraction (structure, "framerate", fps_n, fps_d);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_video_parse_caps_palette:
|
* gst_video_parse_caps_palette:
|
||||||
* @caps: #GstCaps to parse
|
* @caps: #GstCaps to parse
|
||||||
|
@ -1879,4 +1909,3 @@ gst_video_parse_caps_palette (GstCaps * caps)
|
||||||
|
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
|
@ -217,6 +217,7 @@ struct _GstVideoInfo {
|
||||||
|
|
||||||
const gchar *color_matrix;
|
const gchar *color_matrix;
|
||||||
const gchar *chroma_site;
|
const gchar *chroma_site;
|
||||||
|
GstBuffer *palette;
|
||||||
|
|
||||||
guint par_n;
|
guint par_n;
|
||||||
guint par_d;
|
guint par_d;
|
||||||
|
@ -319,6 +320,9 @@ 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_parse_caps_framerate (GstCaps * caps, int *fps_n, int *fps_d);
|
||||||
|
GstBuffer * gst_video_parse_caps_palette (GstCaps * caps);
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
int gst_video_format_get_component_width (GstVideoFormat format,
|
int gst_video_format_get_component_width (GstVideoFormat format,
|
||||||
int component,
|
int component,
|
||||||
|
|
|
@ -165,15 +165,8 @@ gst_video_convert_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
|
||||||
GstCaps * outcaps)
|
GstCaps * outcaps)
|
||||||
{
|
{
|
||||||
GstVideoConvert *space;
|
GstVideoConvert *space;
|
||||||
GstVideoFormat in_format;
|
GstVideoInfo in_info;
|
||||||
GstVideoFormat out_format;
|
GstVideoInfo out_info;
|
||||||
gint in_height, in_width;
|
|
||||||
gint out_height, out_width;
|
|
||||||
gint in_fps_n, in_fps_d, in_par_n, in_par_d;
|
|
||||||
gint out_fps_n, out_fps_d, out_par_n, out_par_d;
|
|
||||||
gboolean have_in_par, have_out_par;
|
|
||||||
gboolean have_in_interlaced, have_out_interlaced;
|
|
||||||
gboolean in_interlaced, out_interlaced;
|
|
||||||
gboolean ret;
|
gboolean ret;
|
||||||
ColorSpaceColorSpec in_spec, out_spec;
|
ColorSpaceColorSpec in_spec, out_spec;
|
||||||
|
|
||||||
|
@ -185,25 +178,14 @@ gst_video_convert_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
|
||||||
|
|
||||||
/* input caps */
|
/* input caps */
|
||||||
|
|
||||||
ret = gst_video_format_parse_caps (incaps, &in_format, &in_width, &in_height);
|
ret = gst_video_info_from_caps (&in_info, incaps);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
goto no_width_height;
|
goto invalid_caps;
|
||||||
|
|
||||||
ret = gst_video_parse_caps_framerate (incaps, &in_fps_n, &in_fps_d);
|
if (gst_video_format_is_rgb (in_info.format)) {
|
||||||
if (!ret)
|
|
||||||
goto no_framerate;
|
|
||||||
|
|
||||||
have_in_par = gst_video_parse_caps_pixel_aspect_ratio (incaps,
|
|
||||||
&in_par_n, &in_par_d);
|
|
||||||
have_in_interlaced = gst_video_format_parse_caps_interlaced (incaps,
|
|
||||||
&in_interlaced);
|
|
||||||
|
|
||||||
if (gst_video_format_is_rgb (in_format)) {
|
|
||||||
in_spec = COLOR_SPEC_RGB;
|
in_spec = COLOR_SPEC_RGB;
|
||||||
} else if (gst_video_format_is_yuv (in_format)) {
|
} else if (gst_video_format_is_yuv (in_info.format)) {
|
||||||
const gchar *matrix = gst_video_parse_caps_color_matrix (incaps);
|
if (in_info.color_matrix && g_str_equal (in_info.color_matrix, "hdtv"))
|
||||||
|
|
||||||
if (matrix && g_str_equal (matrix, "hdtv"))
|
|
||||||
in_spec = COLOR_SPEC_YUV_BT709;
|
in_spec = COLOR_SPEC_YUV_BT709;
|
||||||
else
|
else
|
||||||
in_spec = COLOR_SPEC_YUV_BT470_6;
|
in_spec = COLOR_SPEC_YUV_BT470_6;
|
||||||
|
@ -213,27 +195,14 @@ gst_video_convert_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
|
||||||
|
|
||||||
/* output caps */
|
/* output caps */
|
||||||
|
|
||||||
ret =
|
ret = gst_video_info_from_caps (&out_info, outcaps);
|
||||||
gst_video_format_parse_caps (outcaps, &out_format, &out_width,
|
|
||||||
&out_height);
|
|
||||||
if (!ret)
|
if (!ret)
|
||||||
goto no_width_height;
|
goto invalid_caps;
|
||||||
|
|
||||||
ret = gst_video_parse_caps_framerate (outcaps, &out_fps_n, &out_fps_d);
|
if (gst_video_format_is_rgb (out_info.format)) {
|
||||||
if (!ret)
|
|
||||||
goto no_framerate;
|
|
||||||
|
|
||||||
have_out_par = gst_video_parse_caps_pixel_aspect_ratio (outcaps,
|
|
||||||
&out_par_n, &out_par_d);
|
|
||||||
have_out_interlaced = gst_video_format_parse_caps_interlaced (incaps,
|
|
||||||
&out_interlaced);
|
|
||||||
|
|
||||||
if (gst_video_format_is_rgb (out_format)) {
|
|
||||||
out_spec = COLOR_SPEC_RGB;
|
out_spec = COLOR_SPEC_RGB;
|
||||||
} else if (gst_video_format_is_yuv (out_format)) {
|
} else if (gst_video_format_is_yuv (out_info.format)) {
|
||||||
const gchar *matrix = gst_video_parse_caps_color_matrix (outcaps);
|
if (out_info.color_matrix && g_str_equal (out_info.color_matrix, "hdtv"))
|
||||||
|
|
||||||
if (matrix && g_str_equal (matrix, "hdtv"))
|
|
||||||
out_spec = COLOR_SPEC_YUV_BT709;
|
out_spec = COLOR_SPEC_YUV_BT709;
|
||||||
else
|
else
|
||||||
out_spec = COLOR_SPEC_YUV_BT470_6;
|
out_spec = COLOR_SPEC_YUV_BT470_6;
|
||||||
|
@ -242,38 +211,38 @@ gst_video_convert_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* these must match */
|
/* these must match */
|
||||||
if (in_width != out_width || in_height != out_height ||
|
if (in_info.width != out_info.width || in_info.height != out_info.height ||
|
||||||
in_fps_n != out_fps_n || in_fps_d != out_fps_d)
|
in_info.fps_n != out_info.fps_n || in_info.fps_d != out_info.fps_d)
|
||||||
goto format_mismatch;
|
goto format_mismatch;
|
||||||
|
|
||||||
/* if present, these must match too */
|
/* if present, these must match too */
|
||||||
if (have_in_par && have_out_par &&
|
if (in_info.par_n != out_info.par_n || in_info.par_d != out_info.par_d)
|
||||||
(in_par_n != out_par_n || in_par_d != out_par_d))
|
|
||||||
goto format_mismatch;
|
goto format_mismatch;
|
||||||
|
|
||||||
/* if present, these must match too */
|
/* if present, these must match too */
|
||||||
if (have_in_interlaced && have_out_interlaced &&
|
if ((in_info.flags & GST_VIDEO_FLAG_INTERLACED) !=
|
||||||
in_interlaced != out_interlaced)
|
(out_info.flags & GST_VIDEO_FLAG_INTERLACED))
|
||||||
goto format_mismatch;
|
goto format_mismatch;
|
||||||
|
|
||||||
space->from_format = in_format;
|
space->from_info = in_info;
|
||||||
space->from_spec = in_spec;
|
space->from_spec = in_spec;
|
||||||
space->to_format = out_format;
|
space->to_info = out_info;
|
||||||
space->to_spec = out_spec;
|
space->to_spec = out_spec;
|
||||||
space->width = in_width;
|
space->width = in_info.width;
|
||||||
space->height = in_height;
|
space->height = in_info.height;
|
||||||
space->interlaced = in_interlaced;
|
space->interlaced = (in_info.flags & GST_VIDEO_FLAG_INTERLACED) != 0;
|
||||||
|
|
||||||
space->convert = videoconvert_convert_new (out_format, out_spec, in_format,
|
space->convert =
|
||||||
in_spec, in_width, in_height);
|
videoconvert_convert_new (out_info.format, out_spec, in_info.format,
|
||||||
|
in_spec, in_info.width, in_info.height);
|
||||||
if (space->convert) {
|
if (space->convert) {
|
||||||
videoconvert_convert_set_interlaced (space->convert, in_interlaced);
|
videoconvert_convert_set_interlaced (space->convert, space->interlaced);
|
||||||
}
|
}
|
||||||
/* palette, only for from data */
|
/* palette, only for from data */
|
||||||
if (space->from_format == GST_VIDEO_FORMAT_RGB8_PALETTED &&
|
if (space->from_info.format == GST_VIDEO_FORMAT_RGB8_PALETTED &&
|
||||||
space->to_format == GST_VIDEO_FORMAT_RGB8_PALETTED) {
|
space->to_info.format == GST_VIDEO_FORMAT_RGB8_PALETTED) {
|
||||||
goto format_mismatch;
|
goto format_mismatch;
|
||||||
} else if (space->from_format == GST_VIDEO_FORMAT_RGB8_PALETTED) {
|
} else if (space->from_info.format == GST_VIDEO_FORMAT_RGB8_PALETTED) {
|
||||||
GstBuffer *palette;
|
GstBuffer *palette;
|
||||||
guint32 *data;
|
guint32 *data;
|
||||||
|
|
||||||
|
@ -290,7 +259,7 @@ gst_video_convert_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
|
||||||
gst_buffer_unmap (palette, data, -1);
|
gst_buffer_unmap (palette, data, -1);
|
||||||
|
|
||||||
gst_buffer_unref (palette);
|
gst_buffer_unref (palette);
|
||||||
} else if (space->to_format == GST_VIDEO_FORMAT_RGB8_PALETTED) {
|
} else if (space->to_info.format == GST_VIDEO_FORMAT_RGB8_PALETTED) {
|
||||||
const guint32 *palette;
|
const guint32 *palette;
|
||||||
GstBuffer *p_buf;
|
GstBuffer *p_buf;
|
||||||
|
|
||||||
|
@ -302,37 +271,31 @@ gst_video_convert_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
|
||||||
gst_buffer_unref (p_buf);
|
gst_buffer_unref (p_buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
GST_DEBUG ("reconfigured %d %d", space->from_format, space->to_format);
|
GST_DEBUG ("reconfigured %d %d", space->from_info.format,
|
||||||
|
space->to_info.format);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
/* ERRORS */
|
/* ERRORS */
|
||||||
no_width_height:
|
invalid_caps:
|
||||||
{
|
{
|
||||||
GST_ERROR_OBJECT (space, "did not specify width or height");
|
GST_ERROR_OBJECT (space, "invalid caps");
|
||||||
space->from_format = GST_VIDEO_FORMAT_UNKNOWN;
|
space->from_info.format = GST_VIDEO_FORMAT_UNKNOWN;
|
||||||
space->to_format = GST_VIDEO_FORMAT_UNKNOWN;
|
space->to_info.format = GST_VIDEO_FORMAT_UNKNOWN;
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
no_framerate:
|
|
||||||
{
|
|
||||||
GST_ERROR_OBJECT (space, "did not specify framerate");
|
|
||||||
space->from_format = GST_VIDEO_FORMAT_UNKNOWN;
|
|
||||||
space->to_format = GST_VIDEO_FORMAT_UNKNOWN;
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
format_mismatch:
|
format_mismatch:
|
||||||
{
|
{
|
||||||
GST_ERROR_OBJECT (space, "input and output formats do not match");
|
GST_ERROR_OBJECT (space, "input and output formats do not match");
|
||||||
space->from_format = GST_VIDEO_FORMAT_UNKNOWN;
|
space->from_info.format = GST_VIDEO_FORMAT_UNKNOWN;
|
||||||
space->to_format = GST_VIDEO_FORMAT_UNKNOWN;
|
space->to_info.format = GST_VIDEO_FORMAT_UNKNOWN;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
invalid_palette:
|
invalid_palette:
|
||||||
{
|
{
|
||||||
GST_ERROR_OBJECT (space, "invalid palette");
|
GST_ERROR_OBJECT (space, "invalid palette");
|
||||||
space->from_format = GST_VIDEO_FORMAT_UNKNOWN;
|
space->from_info.format = GST_VIDEO_FORMAT_UNKNOWN;
|
||||||
space->to_format = GST_VIDEO_FORMAT_UNKNOWN;
|
space->to_info.format = GST_VIDEO_FORMAT_UNKNOWN;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -394,8 +357,8 @@ gst_video_convert_class_init (GstVideoConvertClass * klass)
|
||||||
static void
|
static void
|
||||||
gst_video_convert_init (GstVideoConvert * space)
|
gst_video_convert_init (GstVideoConvert * space)
|
||||||
{
|
{
|
||||||
space->from_format = GST_VIDEO_FORMAT_UNKNOWN;
|
space->from_info.format = GST_VIDEO_FORMAT_UNKNOWN;
|
||||||
space->to_format = GST_VIDEO_FORMAT_UNKNOWN;
|
space->to_info.format = GST_VIDEO_FORMAT_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -439,14 +402,13 @@ gst_video_convert_get_unit_size (GstBaseTransform * btrans, GstCaps * caps,
|
||||||
gsize * size)
|
gsize * size)
|
||||||
{
|
{
|
||||||
gboolean ret = TRUE;
|
gboolean ret = TRUE;
|
||||||
GstVideoFormat format;
|
GstVideoInfo info;
|
||||||
gint width, height;
|
|
||||||
|
|
||||||
g_assert (size);
|
g_assert (size);
|
||||||
|
|
||||||
ret = gst_video_format_parse_caps (caps, &format, &width, &height);
|
ret = gst_video_info_from_caps (&info, caps);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
*size = gst_video_format_get_size (format, width, height);
|
*size = info.size;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -459,13 +421,15 @@ gst_video_convert_transform (GstBaseTransform * btrans, GstBuffer * inbuf,
|
||||||
GstVideoConvert *space;
|
GstVideoConvert *space;
|
||||||
guint8 *indata, *outdata;
|
guint8 *indata, *outdata;
|
||||||
gsize insize, outsize;
|
gsize insize, outsize;
|
||||||
|
gint i;
|
||||||
|
|
||||||
space = GST_VIDEO_CONVERT_CAST (btrans);
|
space = GST_VIDEO_CONVERT_CAST (btrans);
|
||||||
|
|
||||||
GST_DEBUG ("from %d -> to %d", space->from_format, space->to_format);
|
GST_DEBUG ("from %d -> to %d", space->from_info.format,
|
||||||
|
space->to_info.format);
|
||||||
|
|
||||||
if (G_UNLIKELY (space->from_format == GST_VIDEO_FORMAT_UNKNOWN ||
|
if (G_UNLIKELY (space->from_info.format == GST_VIDEO_FORMAT_UNKNOWN ||
|
||||||
space->to_format == GST_VIDEO_FORMAT_UNKNOWN))
|
space->to_info.format == GST_VIDEO_FORMAT_UNKNOWN))
|
||||||
goto unknown_format;
|
goto unknown_format;
|
||||||
|
|
||||||
videoconvert_convert_set_dither (space->convert, space->dither);
|
videoconvert_convert_set_dither (space->convert, space->dither);
|
||||||
|
@ -473,13 +437,22 @@ gst_video_convert_transform (GstBaseTransform * btrans, GstBuffer * inbuf,
|
||||||
indata = gst_buffer_map (inbuf, &insize, NULL, GST_MAP_READ);
|
indata = gst_buffer_map (inbuf, &insize, NULL, GST_MAP_READ);
|
||||||
outdata = gst_buffer_map (outbuf, &outsize, NULL, GST_MAP_WRITE);
|
outdata = gst_buffer_map (outbuf, &outsize, NULL, GST_MAP_WRITE);
|
||||||
|
|
||||||
|
for (i = 0; i < space->to_info.n_planes; i++) {
|
||||||
|
space->convert->dest_stride[i] = space->to_info.plane[i].stride;
|
||||||
|
space->convert->dest_offset[i] = space->to_info.plane[i].offset;
|
||||||
|
|
||||||
|
space->convert->src_stride[i] = space->from_info.plane[i].stride;
|
||||||
|
space->convert->src_offset[i] = space->from_info.plane[i].offset;
|
||||||
|
}
|
||||||
|
|
||||||
videoconvert_convert_convert (space->convert, outdata, indata);
|
videoconvert_convert_convert (space->convert, outdata, indata);
|
||||||
|
|
||||||
gst_buffer_unmap (outbuf, outdata, outsize);
|
gst_buffer_unmap (outbuf, outdata, outsize);
|
||||||
gst_buffer_unmap (inbuf, indata, insize);
|
gst_buffer_unmap (inbuf, indata, insize);
|
||||||
|
|
||||||
/* baseclass copies timestamps */
|
/* baseclass copies timestamps */
|
||||||
GST_DEBUG ("from %d -> to %d done", space->from_format, space->to_format);
|
GST_DEBUG ("from %d -> to %d done", space->from_info.format,
|
||||||
|
space->to_info.format);
|
||||||
|
|
||||||
return GST_FLOW_OK;
|
return GST_FLOW_OK;
|
||||||
|
|
||||||
|
|
|
@ -49,11 +49,11 @@ struct _GstVideoConvert {
|
||||||
|
|
||||||
gint width, height;
|
gint width, height;
|
||||||
gboolean interlaced;
|
gboolean interlaced;
|
||||||
gfloat fps;
|
|
||||||
|
|
||||||
GstVideoFormat from_format;
|
GstVideoInfo from_info;
|
||||||
|
GstVideoInfo to_info;
|
||||||
|
|
||||||
ColorSpaceColorSpec from_spec;
|
ColorSpaceColorSpec from_spec;
|
||||||
GstVideoFormat to_format;
|
|
||||||
ColorSpaceColorSpec to_spec;
|
ColorSpaceColorSpec to_spec;
|
||||||
|
|
||||||
VideoConvert *convert;
|
VideoConvert *convert;
|
||||||
|
|
|
@ -84,26 +84,6 @@ videoconvert_convert_new (GstVideoFormat to_format, ColorSpaceColorSpec to_spec,
|
||||||
convert->use_16bit = FALSE;
|
convert->use_16bit = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < 4; i++) {
|
|
||||||
convert->dest_stride[i] = gst_video_format_get_row_stride (to_format, i,
|
|
||||||
width);
|
|
||||||
convert->dest_offset[i] = gst_video_format_get_component_offset (to_format,
|
|
||||||
i, width, height);
|
|
||||||
if (i == 0)
|
|
||||||
convert->dest_offset[i] = 0;
|
|
||||||
|
|
||||||
convert->src_stride[i] = gst_video_format_get_row_stride (from_format, i,
|
|
||||||
width);
|
|
||||||
convert->src_offset[i] = gst_video_format_get_component_offset (from_format,
|
|
||||||
i, width, height);
|
|
||||||
if (i == 0)
|
|
||||||
convert->src_offset[i] = 0;
|
|
||||||
|
|
||||||
GST_DEBUG ("%d: dest %d %d src %d %d", i,
|
|
||||||
convert->dest_stride[i], convert->dest_offset[i],
|
|
||||||
convert->src_stride[i], convert->src_offset[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
videoconvert_convert_lookup_fastpath (convert);
|
videoconvert_convert_lookup_fastpath (convert);
|
||||||
videoconvert_convert_lookup_getput (convert);
|
videoconvert_convert_lookup_getput (convert);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue