mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 01:00:37 +00:00
video: port to new video apis
This commit is contained in:
parent
54c9b13ea7
commit
ead60adb33
6 changed files with 301 additions and 411 deletions
|
@ -74,46 +74,20 @@ static GstStaticPadTemplate gst_gamma_src_template =
|
|||
GST_STATIC_PAD_TEMPLATE ("src",
|
||||
GST_PAD_SRC,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";"
|
||||
GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";"
|
||||
GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA ";"
|
||||
GST_VIDEO_CAPS_YUV ("Y444") ";"
|
||||
GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_RGBx ";"
|
||||
GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_BGRx ";"
|
||||
GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";"
|
||||
GST_VIDEO_CAPS_YUV ("Y42B") ";"
|
||||
GST_VIDEO_CAPS_YUV ("NV12") ";"
|
||||
GST_VIDEO_CAPS_YUV ("NV21") ";"
|
||||
GST_VIDEO_CAPS_YUV ("YUY2") ";"
|
||||
GST_VIDEO_CAPS_YUV ("UYVY") ";"
|
||||
GST_VIDEO_CAPS_YUV ("YVYU") ";"
|
||||
GST_VIDEO_CAPS_YUV ("I420") ";"
|
||||
GST_VIDEO_CAPS_YUV ("YV12") ";"
|
||||
GST_VIDEO_CAPS_YUV ("IYUV") ";" GST_VIDEO_CAPS_YUV ("Y41B")
|
||||
)
|
||||
GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("{ AYUV, "
|
||||
"ARGB, BGRA, ABGR, RGBA, ABGR, RGBA, Y444, "
|
||||
"xRGB, RGBx, xBGR, BGRx, RGB, BGR, Y42B, NV12, "
|
||||
"NV21, YUY2, UYVY, YVYU, I420, YV12, IYUV, Y41B }"))
|
||||
);
|
||||
|
||||
static GstStaticPadTemplate gst_gamma_sink_template =
|
||||
GST_STATIC_PAD_TEMPLATE ("sink",
|
||||
GST_PAD_SINK,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";"
|
||||
GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";"
|
||||
GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA ";"
|
||||
GST_VIDEO_CAPS_YUV ("Y444") ";"
|
||||
GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_RGBx ";"
|
||||
GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_BGRx ";"
|
||||
GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";"
|
||||
GST_VIDEO_CAPS_YUV ("Y42B") ";"
|
||||
GST_VIDEO_CAPS_YUV ("NV12") ";"
|
||||
GST_VIDEO_CAPS_YUV ("NV21") ";"
|
||||
GST_VIDEO_CAPS_YUV ("YUY2") ";"
|
||||
GST_VIDEO_CAPS_YUV ("UYVY") ";"
|
||||
GST_VIDEO_CAPS_YUV ("YVYU") ";"
|
||||
GST_VIDEO_CAPS_YUV ("I420") ";"
|
||||
GST_VIDEO_CAPS_YUV ("YV12") ";"
|
||||
GST_VIDEO_CAPS_YUV ("IYUV") ";" GST_VIDEO_CAPS_YUV ("Y41B")
|
||||
)
|
||||
GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("{ AYUV, "
|
||||
"ARGB, BGRA, ABGR, RGBA, ABGR, RGBA, Y444, "
|
||||
"xRGB, RGBx, xBGR, BGRx, RGB, BGR, Y42B, NV12, "
|
||||
"NV21, YUY2, UYVY, YVYU, I420, YV12, IYUV, Y41B }"))
|
||||
);
|
||||
|
||||
static void gst_gamma_set_property (GObject * object, guint prop_id,
|
||||
|
@ -235,21 +209,18 @@ gst_gamma_calculate_tables (GstGamma * gamma)
|
|||
}
|
||||
|
||||
static void
|
||||
gst_gamma_planar_yuv_ip (GstGamma * gamma, guint8 * data)
|
||||
gst_gamma_planar_yuv_ip (GstGamma * gamma, GstVideoFrame * frame)
|
||||
{
|
||||
gint i, j, height;
|
||||
gint width, row_stride, row_wrap;
|
||||
gint width, stride, row_wrap;
|
||||
const guint8 *table = gamma->gamma_table;
|
||||
guint8 *data;
|
||||
|
||||
data =
|
||||
data + gst_video_format_get_component_offset (gamma->format, 0,
|
||||
gamma->width, gamma->height);
|
||||
|
||||
width = gst_video_format_get_component_width (gamma->format, 0, gamma->width);
|
||||
height = gst_video_format_get_component_height (gamma->format, 0,
|
||||
gamma->height);
|
||||
row_stride = gst_video_format_get_row_stride (gamma->format, 0, gamma->width);
|
||||
row_wrap = row_stride - width;
|
||||
data = GST_VIDEO_FRAME_COMP_DATA (frame, 0);
|
||||
stride = GST_VIDEO_FRAME_COMP_STRIDE (frame, 0);
|
||||
width = GST_VIDEO_FRAME_COMP_WIDTH (frame, 0);
|
||||
height = GST_VIDEO_FRAME_COMP_HEIGHT (frame, 0);
|
||||
row_wrap = stride - width;
|
||||
|
||||
for (i = 0; i < height; i++) {
|
||||
for (j = 0; j < width; j++) {
|
||||
|
@ -261,22 +232,20 @@ gst_gamma_planar_yuv_ip (GstGamma * gamma, guint8 * data)
|
|||
}
|
||||
|
||||
static void
|
||||
gst_gamma_packed_yuv_ip (GstGamma * gamma, guint8 * data)
|
||||
gst_gamma_packed_yuv_ip (GstGamma * gamma, GstVideoFrame * frame)
|
||||
{
|
||||
gint i, j, height;
|
||||
gint width, row_stride, row_wrap;
|
||||
gint width, stride, row_wrap;
|
||||
gint pixel_stride;
|
||||
const guint8 *table = gamma->gamma_table;
|
||||
guint8 *data;
|
||||
|
||||
data = data + gst_video_format_get_component_offset (gamma->format, 0,
|
||||
gamma->width, gamma->height);
|
||||
|
||||
width = gst_video_format_get_component_width (gamma->format, 0, gamma->width);
|
||||
height = gst_video_format_get_component_height (gamma->format, 0,
|
||||
gamma->height);
|
||||
row_stride = gst_video_format_get_row_stride (gamma->format, 0, gamma->width);
|
||||
pixel_stride = gst_video_format_get_pixel_stride (gamma->format, 0);
|
||||
row_wrap = row_stride - pixel_stride * width;
|
||||
data = GST_VIDEO_FRAME_COMP_DATA (frame, 0);
|
||||
stride = GST_VIDEO_FRAME_COMP_STRIDE (frame, 0);
|
||||
width = GST_VIDEO_FRAME_COMP_WIDTH (frame, 0);
|
||||
height = GST_VIDEO_FRAME_COMP_HEIGHT (frame, 0);
|
||||
pixel_stride = GST_VIDEO_FRAME_COMP_PSTRIDE (frame, 0);
|
||||
row_wrap = stride - pixel_stride * width;
|
||||
|
||||
for (i = 0; i < height; i++) {
|
||||
for (j = 0; j < width; j++) {
|
||||
|
@ -302,29 +271,28 @@ static const gint cog_rgb_to_ycbcr_matrix_8bit_sdtv[] = {
|
|||
#define APPLY_MATRIX(m,o,v1,v2,v3) ((m[o*4] * v1 + m[o*4+1] * v2 + m[o*4+2] * v3 + m[o*4+3]) >> 8)
|
||||
|
||||
static void
|
||||
gst_gamma_packed_rgb_ip (GstGamma * gamma, guint8 * data)
|
||||
gst_gamma_packed_rgb_ip (GstGamma * gamma, GstVideoFrame * frame)
|
||||
{
|
||||
gint i, j, height;
|
||||
gint width, row_stride, row_wrap;
|
||||
gint width, stride, row_wrap;
|
||||
gint pixel_stride;
|
||||
const guint8 *table = gamma->gamma_table;
|
||||
gint offsets[3];
|
||||
gint r, g, b;
|
||||
gint y, u, v;
|
||||
guint8 *data;
|
||||
|
||||
offsets[0] = gst_video_format_get_component_offset (gamma->format, 0,
|
||||
gamma->width, gamma->height);
|
||||
offsets[1] = gst_video_format_get_component_offset (gamma->format, 1,
|
||||
gamma->width, gamma->height);
|
||||
offsets[2] = gst_video_format_get_component_offset (gamma->format, 2,
|
||||
gamma->width, gamma->height);
|
||||
data = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
|
||||
stride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
|
||||
width = GST_VIDEO_FRAME_COMP_WIDTH (frame, 0);
|
||||
height = GST_VIDEO_FRAME_COMP_HEIGHT (frame, 0);
|
||||
|
||||
width = gst_video_format_get_component_width (gamma->format, 0, gamma->width);
|
||||
height = gst_video_format_get_component_height (gamma->format, 0,
|
||||
gamma->height);
|
||||
row_stride = gst_video_format_get_row_stride (gamma->format, 0, gamma->width);
|
||||
pixel_stride = gst_video_format_get_pixel_stride (gamma->format, 0);
|
||||
row_wrap = row_stride - pixel_stride * width;
|
||||
offsets[0] = GST_VIDEO_FRAME_COMP_OFFSET (frame, 0);
|
||||
offsets[1] = GST_VIDEO_FRAME_COMP_OFFSET (frame, 1);
|
||||
offsets[2] = GST_VIDEO_FRAME_COMP_OFFSET (frame, 2);
|
||||
|
||||
pixel_stride = GST_VIDEO_FRAME_COMP_PSTRIDE (frame, 0);
|
||||
row_wrap = stride - pixel_stride * width;
|
||||
|
||||
for (i = 0; i < height; i++) {
|
||||
for (j = 0; j < width; j++) {
|
||||
|
@ -355,19 +323,18 @@ gst_gamma_set_caps (GstBaseTransform * base, GstCaps * incaps,
|
|||
GstCaps * outcaps)
|
||||
{
|
||||
GstGamma *gamma = GST_GAMMA (base);
|
||||
GstVideoInfo info;
|
||||
|
||||
GST_DEBUG_OBJECT (gamma,
|
||||
"setting caps: in %" GST_PTR_FORMAT " out %" GST_PTR_FORMAT, incaps,
|
||||
outcaps);
|
||||
|
||||
if (!gst_video_format_parse_caps (incaps, &gamma->format, &gamma->width,
|
||||
&gamma->height))
|
||||
if (!gst_video_info_from_caps (&info, incaps))
|
||||
goto invalid_caps;
|
||||
|
||||
gamma->size =
|
||||
gst_video_format_get_size (gamma->format, gamma->width, gamma->height);
|
||||
gamma->info = info;
|
||||
|
||||
switch (gamma->format) {
|
||||
switch (GST_VIDEO_INFO_FORMAT (&info)) {
|
||||
case GST_VIDEO_FORMAT_I420:
|
||||
case GST_VIDEO_FORMAT_YV12:
|
||||
case GST_VIDEO_FORMAT_Y41B:
|
||||
|
@ -403,9 +370,11 @@ gst_gamma_set_caps (GstBaseTransform * base, GstCaps * incaps,
|
|||
return TRUE;
|
||||
|
||||
invalid_caps:
|
||||
{
|
||||
GST_ERROR_OBJECT (gamma, "Invalid caps: %" GST_PTR_FORMAT, incaps);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gst_gamma_before_transform (GstBaseTransform * base, GstBuffer * outbuf)
|
||||
|
@ -428,8 +397,7 @@ static GstFlowReturn
|
|||
gst_gamma_transform_ip (GstBaseTransform * base, GstBuffer * outbuf)
|
||||
{
|
||||
GstGamma *gamma = GST_GAMMA (base);
|
||||
guint8 *data;
|
||||
gsize size;
|
||||
GstVideoFrame frame;
|
||||
|
||||
if (!gamma->process)
|
||||
goto not_negotiated;
|
||||
|
@ -437,26 +405,23 @@ gst_gamma_transform_ip (GstBaseTransform * base, GstBuffer * outbuf)
|
|||
if (base->passthrough)
|
||||
goto done;
|
||||
|
||||
data = gst_buffer_map (outbuf, &size, NULL, GST_MAP_READWRITE);
|
||||
|
||||
if (size != gamma->size)
|
||||
goto wrong_size;
|
||||
if (!gst_video_frame_map (&frame, &gamma->info, outbuf, GST_MAP_READWRITE))
|
||||
goto wrong_buffer;
|
||||
|
||||
GST_OBJECT_LOCK (gamma);
|
||||
gamma->process (gamma, data);
|
||||
gamma->process (gamma, &frame);
|
||||
GST_OBJECT_UNLOCK (gamma);
|
||||
|
||||
gst_buffer_unmap (outbuf, data, size);
|
||||
gst_video_frame_unmap (&frame);
|
||||
|
||||
done:
|
||||
return GST_FLOW_OK;
|
||||
|
||||
/* ERRORS */
|
||||
wrong_size:
|
||||
wrong_buffer:
|
||||
{
|
||||
GST_ELEMENT_ERROR (gamma, STREAM, FORMAT,
|
||||
(NULL), ("Invalid buffer size %d, expected %d", size, gamma->size));
|
||||
gst_buffer_unmap (outbuf, data, size);
|
||||
(NULL), ("Invalid buffer received"));
|
||||
return GST_FLOW_ERROR;
|
||||
}
|
||||
not_negotiated:
|
||||
|
|
|
@ -56,10 +56,7 @@ struct _GstGamma
|
|||
/* < private > */
|
||||
|
||||
/* format */
|
||||
GstVideoFormat format;
|
||||
gint width;
|
||||
gint height;
|
||||
gint size;
|
||||
GstVideoInfo info;
|
||||
|
||||
/* properties */
|
||||
gdouble gamma;
|
||||
|
@ -67,7 +64,7 @@ struct _GstGamma
|
|||
/* tables */
|
||||
guint8 gamma_table[256];
|
||||
|
||||
void (*process) (GstGamma *gamma, guint8 *data);
|
||||
void (*process) (GstGamma *gamma, GstVideoFrame *frame);
|
||||
};
|
||||
|
||||
struct _GstGammaClass
|
||||
|
|
|
@ -74,47 +74,23 @@ static GstStaticPadTemplate gst_video_balance_src_template =
|
|||
GST_STATIC_PAD_TEMPLATE ("src",
|
||||
GST_PAD_SRC,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";"
|
||||
GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";"
|
||||
GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA ";"
|
||||
GST_VIDEO_CAPS_YUV ("Y444") ";"
|
||||
GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_RGBx ";"
|
||||
GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_BGRx ";"
|
||||
GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";"
|
||||
GST_VIDEO_CAPS_YUV ("Y42B") ";"
|
||||
GST_VIDEO_CAPS_YUV ("YUY2") ";"
|
||||
GST_VIDEO_CAPS_YUV ("UYVY") ";"
|
||||
GST_VIDEO_CAPS_YUV ("YVYU") ";"
|
||||
GST_VIDEO_CAPS_YUV ("I420") ";"
|
||||
GST_VIDEO_CAPS_YUV ("YV12") ";"
|
||||
GST_VIDEO_CAPS_YUV ("IYUV") ";" GST_VIDEO_CAPS_YUV ("Y41B")
|
||||
)
|
||||
GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("{ AYUV, "
|
||||
"ARGB, BGRA, ABGR, RGBA, Y444, xRGB, RGBx, "
|
||||
"xBGR, BGRx, RGB, BGR, Y42B, YUY2, UYVY, YVYU, "
|
||||
"I420, YV12, IYUV, Y41B }"))
|
||||
);
|
||||
|
||||
static GstStaticPadTemplate gst_video_balance_sink_template =
|
||||
GST_STATIC_PAD_TEMPLATE ("sink",
|
||||
GST_PAD_SINK,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";"
|
||||
GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";"
|
||||
GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA ";"
|
||||
GST_VIDEO_CAPS_YUV ("Y444") ";"
|
||||
GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_RGBx ";"
|
||||
GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_BGRx ";"
|
||||
GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";"
|
||||
GST_VIDEO_CAPS_YUV ("Y42B") ";"
|
||||
GST_VIDEO_CAPS_YUV ("YUY2") ";"
|
||||
GST_VIDEO_CAPS_YUV ("UYVY") ";"
|
||||
GST_VIDEO_CAPS_YUV ("YVYU") ";"
|
||||
GST_VIDEO_CAPS_YUV ("I420") ";"
|
||||
GST_VIDEO_CAPS_YUV ("YV12") ";"
|
||||
GST_VIDEO_CAPS_YUV ("IYUV") ";" GST_VIDEO_CAPS_YUV ("Y41B")
|
||||
)
|
||||
GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("{ AYUV, "
|
||||
"ARGB, BGRA, ABGR, RGBA, Y444, xRGB, RGBx, "
|
||||
"xBGR, BGRx, RGB, BGR, Y42B, YUY2, UYVY, YVYU, "
|
||||
"I420, YV12, IYUV, Y41B }"))
|
||||
);
|
||||
|
||||
static void gst_video_balance_colorbalance_init (GstColorBalanceClass * iface);
|
||||
static void gst_video_balance_interface_init (GstImplementsInterfaceClass *
|
||||
klass);
|
||||
|
||||
static void gst_video_balance_set_property (GObject * object, guint prop_id,
|
||||
const GValue * value, GParamSpec * pspec);
|
||||
|
@ -124,8 +100,6 @@ static void gst_video_balance_get_property (GObject * object, guint prop_id,
|
|||
#define gst_video_balance_parent_class parent_class
|
||||
G_DEFINE_TYPE_WITH_CODE (GstVideoBalance, gst_video_balance,
|
||||
GST_TYPE_VIDEO_FILTER,
|
||||
G_IMPLEMENT_INTERFACE (GST_TYPE_IMPLEMENTS_INTERFACE,
|
||||
gst_video_balance_interface_init);
|
||||
G_IMPLEMENT_INTERFACE (GST_TYPE_COLOR_BALANCE,
|
||||
gst_video_balance_colorbalance_init));
|
||||
|
||||
|
@ -192,26 +166,24 @@ gst_video_balance_update_properties (GstVideoBalance * videobalance)
|
|||
}
|
||||
|
||||
static void
|
||||
gst_video_balance_planar_yuv (GstVideoBalance * videobalance, guint8 * data)
|
||||
gst_video_balance_planar_yuv (GstVideoBalance * videobalance,
|
||||
GstVideoFrame * frame)
|
||||
{
|
||||
gint x, y;
|
||||
guint8 *ydata;
|
||||
guint8 *udata, *vdata;
|
||||
gint ystride, ustride, vstride;
|
||||
GstVideoFormat format;
|
||||
gint width, height;
|
||||
gint width2, height2;
|
||||
guint8 *tabley = videobalance->tabley;
|
||||
guint8 **tableu = videobalance->tableu;
|
||||
guint8 **tablev = videobalance->tablev;
|
||||
|
||||
format = videobalance->format;
|
||||
width = videobalance->width;
|
||||
height = videobalance->height;
|
||||
width = GST_VIDEO_FRAME_WIDTH (frame);
|
||||
height = GST_VIDEO_FRAME_HEIGHT (frame);
|
||||
|
||||
ydata =
|
||||
data + gst_video_format_get_component_offset (format, 0, width, height);
|
||||
ystride = gst_video_format_get_row_stride (format, 0, width);
|
||||
ydata = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
|
||||
ystride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
|
||||
|
||||
for (y = 0; y < height; y++) {
|
||||
guint8 *yptr;
|
||||
|
@ -223,15 +195,13 @@ gst_video_balance_planar_yuv (GstVideoBalance * videobalance, guint8 * data)
|
|||
}
|
||||
}
|
||||
|
||||
width2 = gst_video_format_get_component_width (format, 1, width);
|
||||
height2 = gst_video_format_get_component_height (format, 1, height);
|
||||
width2 = GST_VIDEO_FRAME_COMP_WIDTH (frame, 1);
|
||||
height2 = GST_VIDEO_FRAME_COMP_HEIGHT (frame, 1);
|
||||
|
||||
udata =
|
||||
data + gst_video_format_get_component_offset (format, 1, width, height);
|
||||
vdata =
|
||||
data + gst_video_format_get_component_offset (format, 2, width, height);
|
||||
ustride = gst_video_format_get_row_stride (format, 1, width);
|
||||
vstride = gst_video_format_get_row_stride (format, 1, width);
|
||||
udata = GST_VIDEO_FRAME_PLANE_DATA (frame, 1);
|
||||
vdata = GST_VIDEO_FRAME_PLANE_DATA (frame, 2);
|
||||
ustride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 1);
|
||||
vstride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 2);
|
||||
|
||||
for (y = 0; y < height2; y++) {
|
||||
guint8 *uptr, *vptr;
|
||||
|
@ -251,57 +221,49 @@ gst_video_balance_planar_yuv (GstVideoBalance * videobalance, guint8 * data)
|
|||
}
|
||||
|
||||
static void
|
||||
gst_video_balance_packed_yuv (GstVideoBalance * videobalance, guint8 * data)
|
||||
gst_video_balance_packed_yuv (GstVideoBalance * videobalance,
|
||||
GstVideoFrame * frame)
|
||||
{
|
||||
gint x, y;
|
||||
guint8 *ydata;
|
||||
guint8 *udata, *vdata;
|
||||
gint ystride, ustride, vstride;
|
||||
gint x, y, stride;
|
||||
guint8 *ydata, *udata, *vdata;
|
||||
gint yoff, uoff, voff;
|
||||
GstVideoFormat format;
|
||||
gint width, height;
|
||||
gint width2, height2;
|
||||
guint8 *tabley = videobalance->tabley;
|
||||
guint8 **tableu = videobalance->tableu;
|
||||
guint8 **tablev = videobalance->tablev;
|
||||
|
||||
format = videobalance->format;
|
||||
width = videobalance->width;
|
||||
height = videobalance->height;
|
||||
width = GST_VIDEO_FRAME_WIDTH (frame);
|
||||
height = GST_VIDEO_FRAME_HEIGHT (frame);
|
||||
|
||||
ydata =
|
||||
data + gst_video_format_get_component_offset (format, 0, width, height);
|
||||
ystride = gst_video_format_get_row_stride (format, 0, width);
|
||||
yoff = gst_video_format_get_pixel_stride (format, 0);
|
||||
stride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
|
||||
ydata = GST_VIDEO_FRAME_COMP_DATA (frame, 0);
|
||||
yoff = GST_VIDEO_FRAME_COMP_PSTRIDE (frame, 0);
|
||||
|
||||
for (y = 0; y < height; y++) {
|
||||
guint8 *yptr;
|
||||
|
||||
yptr = ydata + y * ystride;
|
||||
yptr = ydata + y * stride;
|
||||
for (x = 0; x < width; x++) {
|
||||
*yptr = tabley[*yptr];
|
||||
yptr += yoff;
|
||||
}
|
||||
}
|
||||
|
||||
width2 = gst_video_format_get_component_width (format, 1, width);
|
||||
height2 = gst_video_format_get_component_height (format, 1, height);
|
||||
width2 = GST_VIDEO_FRAME_COMP_WIDTH (frame, 1);
|
||||
height2 = GST_VIDEO_FRAME_COMP_HEIGHT (frame, 1);
|
||||
|
||||
udata =
|
||||
data + gst_video_format_get_component_offset (format, 1, width, height);
|
||||
vdata =
|
||||
data + gst_video_format_get_component_offset (format, 2, width, height);
|
||||
ustride = gst_video_format_get_row_stride (format, 1, width);
|
||||
vstride = gst_video_format_get_row_stride (format, 1, width);
|
||||
uoff = gst_video_format_get_pixel_stride (format, 1);
|
||||
voff = gst_video_format_get_pixel_stride (format, 2);
|
||||
udata = GST_VIDEO_FRAME_COMP_DATA (frame, 1);
|
||||
vdata = GST_VIDEO_FRAME_COMP_DATA (frame, 2);
|
||||
uoff = GST_VIDEO_FRAME_COMP_PSTRIDE (frame, 1);
|
||||
voff = GST_VIDEO_FRAME_COMP_PSTRIDE (frame, 2);
|
||||
|
||||
for (y = 0; y < height2; y++) {
|
||||
guint8 *uptr, *vptr;
|
||||
guint8 u1, v1;
|
||||
|
||||
uptr = udata + y * ustride;
|
||||
vptr = vdata + y * vstride;
|
||||
uptr = udata + y * stride;
|
||||
vptr = vdata + y * stride;
|
||||
|
||||
for (x = 0; x < width2; x++) {
|
||||
u1 = *uptr;
|
||||
|
@ -331,11 +293,13 @@ static const gint cog_rgb_to_ycbcr_matrix_8bit_sdtv[] = {
|
|||
#define APPLY_MATRIX(m,o,v1,v2,v3) ((m[o*4] * v1 + m[o*4+1] * v2 + m[o*4+2] * v3 + m[o*4+3]) >> 8)
|
||||
|
||||
static void
|
||||
gst_video_balance_packed_rgb (GstVideoBalance * videobalance, guint8 * data)
|
||||
gst_video_balance_packed_rgb (GstVideoBalance * videobalance,
|
||||
GstVideoFrame * frame)
|
||||
{
|
||||
gint i, j, height;
|
||||
gint width, row_stride, row_wrap;
|
||||
gint width, stride, row_wrap;
|
||||
gint pixel_stride;
|
||||
guint8 *data;
|
||||
gint offsets[3];
|
||||
gint r, g, b;
|
||||
gint y, u, v;
|
||||
|
@ -344,24 +308,18 @@ gst_video_balance_packed_rgb (GstVideoBalance * videobalance, guint8 * data)
|
|||
guint8 **tableu = videobalance->tableu;
|
||||
guint8 **tablev = videobalance->tablev;
|
||||
|
||||
offsets[0] = gst_video_format_get_component_offset (videobalance->format, 0,
|
||||
videobalance->width, videobalance->height);
|
||||
offsets[1] = gst_video_format_get_component_offset (videobalance->format, 1,
|
||||
videobalance->width, videobalance->height);
|
||||
offsets[2] = gst_video_format_get_component_offset (videobalance->format, 2,
|
||||
videobalance->width, videobalance->height);
|
||||
width = GST_VIDEO_FRAME_WIDTH (frame);
|
||||
height = GST_VIDEO_FRAME_HEIGHT (frame);
|
||||
|
||||
width =
|
||||
gst_video_format_get_component_width (videobalance->format, 0,
|
||||
videobalance->width);
|
||||
height =
|
||||
gst_video_format_get_component_height (videobalance->format, 0,
|
||||
videobalance->height);
|
||||
row_stride =
|
||||
gst_video_format_get_row_stride (videobalance->format, 0,
|
||||
videobalance->width);
|
||||
pixel_stride = gst_video_format_get_pixel_stride (videobalance->format, 0);
|
||||
row_wrap = row_stride - pixel_stride * width;
|
||||
offsets[0] = GST_VIDEO_FRAME_COMP_OFFSET (frame, 0);
|
||||
offsets[1] = GST_VIDEO_FRAME_COMP_OFFSET (frame, 1);
|
||||
offsets[2] = GST_VIDEO_FRAME_COMP_OFFSET (frame, 2);
|
||||
|
||||
data = GST_VIDEO_FRAME_PLANE_DATA (frame, 0);
|
||||
stride = GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0);
|
||||
|
||||
pixel_stride = GST_VIDEO_FRAME_COMP_PSTRIDE (frame, 0);
|
||||
row_wrap = stride - pixel_stride * width;
|
||||
|
||||
for (i = 0; i < height; i++) {
|
||||
for (j = 0; j < width; j++) {
|
||||
|
@ -400,21 +358,17 @@ gst_video_balance_set_caps (GstBaseTransform * base, GstCaps * incaps,
|
|||
GstCaps * outcaps)
|
||||
{
|
||||
GstVideoBalance *videobalance = GST_VIDEO_BALANCE (base);
|
||||
GstVideoInfo info;
|
||||
|
||||
GST_DEBUG_OBJECT (videobalance,
|
||||
"in %" GST_PTR_FORMAT " out %" GST_PTR_FORMAT, incaps, outcaps);
|
||||
|
||||
videobalance->process = NULL;
|
||||
|
||||
if (!gst_video_format_parse_caps (incaps, &videobalance->format,
|
||||
&videobalance->width, &videobalance->height))
|
||||
if (!gst_video_info_from_caps (&info, incaps))
|
||||
goto invalid_caps;
|
||||
|
||||
videobalance->size =
|
||||
gst_video_format_get_size (videobalance->format, videobalance->width,
|
||||
videobalance->height);
|
||||
|
||||
switch (videobalance->format) {
|
||||
switch (GST_VIDEO_INFO_FORMAT (&info)) {
|
||||
case GST_VIDEO_FORMAT_I420:
|
||||
case GST_VIDEO_FORMAT_YV12:
|
||||
case GST_VIDEO_FORMAT_Y41B:
|
||||
|
@ -441,15 +395,25 @@ gst_video_balance_set_caps (GstBaseTransform * base, GstCaps * incaps,
|
|||
videobalance->process = gst_video_balance_packed_rgb;
|
||||
break;
|
||||
default:
|
||||
goto unknown_format;
|
||||
break;
|
||||
}
|
||||
|
||||
return videobalance->process != NULL;
|
||||
videobalance->info = info;
|
||||
|
||||
return TRUE;
|
||||
|
||||
invalid_caps:
|
||||
{
|
||||
GST_ERROR_OBJECT (videobalance, "Invalid caps: %" GST_PTR_FORMAT, incaps);
|
||||
return FALSE;
|
||||
}
|
||||
unknown_format:
|
||||
{
|
||||
GST_ERROR_OBJECT (videobalance, "unknown format %" GST_PTR_FORMAT, incaps);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gst_video_balance_before_transform (GstBaseTransform * base, GstBuffer * buf)
|
||||
|
@ -472,8 +436,7 @@ static GstFlowReturn
|
|||
gst_video_balance_transform_ip (GstBaseTransform * base, GstBuffer * outbuf)
|
||||
{
|
||||
GstVideoBalance *videobalance = GST_VIDEO_BALANCE (base);
|
||||
guint8 *data;
|
||||
gsize size;
|
||||
GstVideoFrame frame;
|
||||
|
||||
if (!videobalance->process)
|
||||
goto not_negotiated;
|
||||
|
@ -482,33 +445,32 @@ gst_video_balance_transform_ip (GstBaseTransform * base, GstBuffer * outbuf)
|
|||
if (base->passthrough)
|
||||
goto done;
|
||||
|
||||
data = gst_buffer_map (outbuf, &size, NULL, GST_MAP_READWRITE);
|
||||
|
||||
if (size != videobalance->size)
|
||||
goto wrong_size;
|
||||
if (!gst_video_frame_map (&frame, &videobalance->info, outbuf,
|
||||
GST_MAP_READWRITE))
|
||||
goto wrong_frame;
|
||||
|
||||
GST_OBJECT_LOCK (videobalance);
|
||||
videobalance->process (videobalance, data);
|
||||
videobalance->process (videobalance, &frame);
|
||||
GST_OBJECT_UNLOCK (videobalance);
|
||||
|
||||
gst_buffer_unmap (outbuf, data, size);
|
||||
gst_video_frame_unmap (&frame);
|
||||
|
||||
done:
|
||||
return GST_FLOW_OK;
|
||||
|
||||
/* ERRORS */
|
||||
wrong_size:
|
||||
wrong_frame:
|
||||
{
|
||||
GST_ELEMENT_ERROR (videobalance, STREAM, FORMAT,
|
||||
(NULL), ("Invalid buffer size %d, expected %d", size,
|
||||
videobalance->size));
|
||||
gst_buffer_unmap (outbuf, data, size);
|
||||
(NULL), ("Invalid buffer received"));
|
||||
return GST_FLOW_ERROR;
|
||||
}
|
||||
not_negotiated:
|
||||
{
|
||||
GST_ERROR_OBJECT (videobalance, "Not negotiated yet");
|
||||
return GST_FLOW_NOT_NEGOTIATED;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gst_video_balance_finalize (GObject * object)
|
||||
|
@ -618,20 +580,6 @@ gst_video_balance_init (GstVideoBalance * videobalance)
|
|||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_video_balance_interface_supported (GstImplementsInterface * iface,
|
||||
GType type)
|
||||
{
|
||||
g_assert (type == GST_TYPE_COLOR_BALANCE);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_video_balance_interface_init (GstImplementsInterfaceClass * klass)
|
||||
{
|
||||
klass->supported = gst_video_balance_interface_supported;
|
||||
}
|
||||
|
||||
static const GList *
|
||||
gst_video_balance_colorbalance_list_channels (GstColorBalance * balance)
|
||||
{
|
||||
|
|
|
@ -61,17 +61,14 @@ struct _GstVideoBalance {
|
|||
gdouble saturation;
|
||||
|
||||
/* format */
|
||||
GstVideoFormat format;
|
||||
gint width;
|
||||
gint height;
|
||||
gint size;
|
||||
GstVideoInfo info;
|
||||
|
||||
/* tables */
|
||||
guint8 tabley[256];
|
||||
guint8 *tableu[256];
|
||||
guint8 *tablev[256];
|
||||
|
||||
void (*process) (GstVideoBalance *balance, guint8 *data);
|
||||
void (*process) (GstVideoBalance *balance, GstVideoFrame *frame);
|
||||
};
|
||||
|
||||
struct _GstVideoBalanceClass {
|
||||
|
|
|
@ -68,37 +68,18 @@ static GstStaticPadTemplate gst_video_flip_src_template =
|
|||
GST_STATIC_PAD_TEMPLATE ("src",
|
||||
GST_PAD_SRC,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";"
|
||||
GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";"
|
||||
GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA ";"
|
||||
GST_VIDEO_CAPS_YUV ("Y444") ";"
|
||||
GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_RGBx ";"
|
||||
GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_BGRx ";"
|
||||
GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";"
|
||||
GST_VIDEO_CAPS_YUV ("I420") ";"
|
||||
GST_VIDEO_CAPS_YUV ("YV12") ";" GST_VIDEO_CAPS_YUV ("IYUV") ";"
|
||||
GST_VIDEO_CAPS_YUV ("YUY2") ";" GST_VIDEO_CAPS_YUV ("UYVY") ";"
|
||||
GST_VIDEO_CAPS_YUV ("YVYU")
|
||||
|
||||
)
|
||||
GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("{ AYUV, "
|
||||
"ARGB, BGRA, ABGR, RGBA, Y444, xRGB, RGBx,xBGR, BGRx, "
|
||||
"RGB, BGR, I420, YV12, IYUV YUY2, UYVY, YVYU }"))
|
||||
);
|
||||
|
||||
static GstStaticPadTemplate gst_video_flip_sink_template =
|
||||
GST_STATIC_PAD_TEMPLATE ("sink",
|
||||
GST_PAD_SINK,
|
||||
GST_PAD_ALWAYS,
|
||||
GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("AYUV") ";"
|
||||
GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_BGRA ";"
|
||||
GST_VIDEO_CAPS_ABGR ";" GST_VIDEO_CAPS_RGBA ";"
|
||||
GST_VIDEO_CAPS_YUV ("Y444") ";"
|
||||
GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_RGBx ";"
|
||||
GST_VIDEO_CAPS_xBGR ";" GST_VIDEO_CAPS_BGRx ";"
|
||||
GST_VIDEO_CAPS_RGB ";" GST_VIDEO_CAPS_BGR ";"
|
||||
GST_VIDEO_CAPS_YUV ("I420") ";"
|
||||
GST_VIDEO_CAPS_YUV ("YV12") ";" GST_VIDEO_CAPS_YUV ("IYUV") ";"
|
||||
GST_VIDEO_CAPS_YUV ("YUY2") ";" GST_VIDEO_CAPS_YUV ("UYVY") ";"
|
||||
GST_VIDEO_CAPS_YUV ("YVYU")
|
||||
)
|
||||
GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("{ AYUV, "
|
||||
"ARGB, BGRA, ABGR, RGBA, Y444, xRGB, RGBx,xBGR, BGRx, "
|
||||
"RGB, BGR, I420, YV12, IYUV YUY2, UYVY, YVYU }"))
|
||||
);
|
||||
|
||||
#define GST_TYPE_VIDEO_FLIP_METHOD (gst_video_flip_method_get_type())
|
||||
|
@ -204,78 +185,62 @@ static gboolean
|
|||
gst_video_flip_get_unit_size (GstBaseTransform * btrans, GstCaps * caps,
|
||||
gsize * size)
|
||||
{
|
||||
GstVideoFormat format;
|
||||
gint width, height;
|
||||
GstVideoInfo info;
|
||||
|
||||
if (!gst_video_format_parse_caps (caps, &format, &width, &height))
|
||||
if (!gst_video_info_from_caps (&info, caps))
|
||||
return FALSE;
|
||||
|
||||
*size = gst_video_format_get_size (format, width, height);
|
||||
*size = info.size;
|
||||
|
||||
GST_DEBUG_OBJECT (btrans, "our frame size is %d bytes (%dx%d)", *size,
|
||||
width, height);
|
||||
info.width, info.height);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
gst_video_flip_planar_yuv (GstVideoFlip * videoflip, guint8 * dest,
|
||||
const guint8 * src)
|
||||
gst_video_flip_planar_yuv (GstVideoFlip * videoflip, GstVideoFrame * dest,
|
||||
const GstVideoFrame * src)
|
||||
{
|
||||
gint x, y;
|
||||
guint8 const *s;
|
||||
guint8 *d;
|
||||
GstVideoFormat format = videoflip->format;
|
||||
gint sw = videoflip->from_width;
|
||||
gint sh = videoflip->from_height;
|
||||
gint dw = videoflip->to_width;
|
||||
gint dh = videoflip->to_height;
|
||||
gint src_y_stride, src_u_stride, src_v_stride;
|
||||
gint src_y_offset, src_u_offset, src_v_offset;
|
||||
gint src_y_height, src_u_height, src_v_height;
|
||||
gint src_y_width, src_u_width, src_v_width;
|
||||
gint dest_y_stride, dest_u_stride, dest_v_stride;
|
||||
gint dest_y_offset, dest_u_offset, dest_v_offset;
|
||||
gint dest_y_height, dest_u_height, dest_v_height;
|
||||
gint dest_y_width, dest_u_width, dest_v_width;
|
||||
|
||||
src_y_stride = gst_video_format_get_row_stride (format, 0, sw);
|
||||
src_u_stride = gst_video_format_get_row_stride (format, 1, sw);
|
||||
src_v_stride = gst_video_format_get_row_stride (format, 2, sw);
|
||||
src_y_stride = GST_VIDEO_FRAME_PLANE_STRIDE (src, 0);
|
||||
src_u_stride = GST_VIDEO_FRAME_PLANE_STRIDE (src, 1);
|
||||
src_v_stride = GST_VIDEO_FRAME_PLANE_STRIDE (src, 2);
|
||||
|
||||
dest_y_stride = gst_video_format_get_row_stride (format, 0, dw);
|
||||
dest_u_stride = gst_video_format_get_row_stride (format, 1, dw);
|
||||
dest_v_stride = gst_video_format_get_row_stride (format, 2, dw);
|
||||
dest_y_stride = GST_VIDEO_FRAME_PLANE_STRIDE (dest, 0);
|
||||
dest_u_stride = GST_VIDEO_FRAME_PLANE_STRIDE (dest, 1);
|
||||
dest_v_stride = GST_VIDEO_FRAME_PLANE_STRIDE (dest, 2);
|
||||
|
||||
src_y_offset = gst_video_format_get_component_offset (format, 0, sw, sh);
|
||||
src_u_offset = gst_video_format_get_component_offset (format, 1, sw, sh);
|
||||
src_v_offset = gst_video_format_get_component_offset (format, 2, sw, sh);
|
||||
src_y_width = GST_VIDEO_FRAME_COMP_WIDTH (src, 0);
|
||||
src_u_width = GST_VIDEO_FRAME_COMP_WIDTH (src, 1);
|
||||
src_v_width = GST_VIDEO_FRAME_COMP_WIDTH (src, 2);
|
||||
|
||||
dest_y_offset = gst_video_format_get_component_offset (format, 0, dw, dh);
|
||||
dest_u_offset = gst_video_format_get_component_offset (format, 1, dw, dh);
|
||||
dest_v_offset = gst_video_format_get_component_offset (format, 2, dw, dh);
|
||||
dest_y_width = GST_VIDEO_FRAME_COMP_WIDTH (dest, 0);
|
||||
dest_u_width = GST_VIDEO_FRAME_COMP_WIDTH (dest, 1);
|
||||
dest_v_width = GST_VIDEO_FRAME_COMP_WIDTH (dest, 2);
|
||||
|
||||
src_y_width = gst_video_format_get_component_width (format, 0, sw);
|
||||
src_u_width = gst_video_format_get_component_width (format, 1, sw);
|
||||
src_v_width = gst_video_format_get_component_width (format, 2, sw);
|
||||
src_y_height = GST_VIDEO_FRAME_COMP_HEIGHT (src, 0);
|
||||
src_u_height = GST_VIDEO_FRAME_COMP_HEIGHT (src, 1);
|
||||
src_v_height = GST_VIDEO_FRAME_COMP_HEIGHT (src, 2);
|
||||
|
||||
dest_y_width = gst_video_format_get_component_width (format, 0, dw);
|
||||
dest_u_width = gst_video_format_get_component_width (format, 1, dw);
|
||||
dest_v_width = gst_video_format_get_component_width (format, 2, dw);
|
||||
|
||||
src_y_height = gst_video_format_get_component_height (format, 0, sh);
|
||||
src_u_height = gst_video_format_get_component_height (format, 1, sh);
|
||||
src_v_height = gst_video_format_get_component_height (format, 2, sh);
|
||||
|
||||
dest_y_height = gst_video_format_get_component_height (format, 0, dh);
|
||||
dest_u_height = gst_video_format_get_component_height (format, 1, dh);
|
||||
dest_v_height = gst_video_format_get_component_height (format, 2, dh);
|
||||
dest_y_height = GST_VIDEO_FRAME_COMP_HEIGHT (dest, 0);
|
||||
dest_u_height = GST_VIDEO_FRAME_COMP_HEIGHT (dest, 1);
|
||||
dest_v_height = GST_VIDEO_FRAME_COMP_HEIGHT (dest, 2);
|
||||
|
||||
switch (videoflip->method) {
|
||||
case GST_VIDEO_FLIP_METHOD_90R:
|
||||
/* Flip Y */
|
||||
s = src + src_y_offset;
|
||||
d = dest + dest_y_offset;
|
||||
s = GST_VIDEO_FRAME_PLANE_DATA (src, 0);
|
||||
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 0);
|
||||
for (y = 0; y < dest_y_height; y++) {
|
||||
for (x = 0; x < dest_y_width; x++) {
|
||||
d[y * dest_y_stride + x] =
|
||||
|
@ -283,8 +248,8 @@ gst_video_flip_planar_yuv (GstVideoFlip * videoflip, guint8 * dest,
|
|||
}
|
||||
}
|
||||
/* Flip U */
|
||||
s = src + src_u_offset;
|
||||
d = dest + dest_u_offset;
|
||||
s = GST_VIDEO_FRAME_PLANE_DATA (src, 1);
|
||||
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 1);
|
||||
for (y = 0; y < dest_u_height; y++) {
|
||||
for (x = 0; x < dest_u_width; x++) {
|
||||
d[y * dest_u_stride + x] =
|
||||
|
@ -292,8 +257,8 @@ gst_video_flip_planar_yuv (GstVideoFlip * videoflip, guint8 * dest,
|
|||
}
|
||||
}
|
||||
/* Flip V */
|
||||
s = src + src_v_offset;
|
||||
d = dest + dest_v_offset;
|
||||
s = GST_VIDEO_FRAME_PLANE_DATA (src, 2);
|
||||
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 2);
|
||||
for (y = 0; y < dest_v_height; y++) {
|
||||
for (x = 0; x < dest_v_width; x++) {
|
||||
d[y * dest_v_stride + x] =
|
||||
|
@ -303,8 +268,8 @@ gst_video_flip_planar_yuv (GstVideoFlip * videoflip, guint8 * dest,
|
|||
break;
|
||||
case GST_VIDEO_FLIP_METHOD_90L:
|
||||
/* Flip Y */
|
||||
s = src + src_y_offset;
|
||||
d = dest + dest_y_offset;
|
||||
s = GST_VIDEO_FRAME_PLANE_DATA (src, 0);
|
||||
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 0);
|
||||
for (y = 0; y < dest_y_height; y++) {
|
||||
for (x = 0; x < dest_y_width; x++) {
|
||||
d[y * dest_y_stride + x] =
|
||||
|
@ -312,8 +277,8 @@ gst_video_flip_planar_yuv (GstVideoFlip * videoflip, guint8 * dest,
|
|||
}
|
||||
}
|
||||
/* Flip U */
|
||||
s = src + src_u_offset;
|
||||
d = dest + dest_u_offset;
|
||||
s = GST_VIDEO_FRAME_PLANE_DATA (src, 1);
|
||||
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 1);
|
||||
for (y = 0; y < dest_u_height; y++) {
|
||||
for (x = 0; x < dest_u_width; x++) {
|
||||
d[y * dest_u_stride + x] =
|
||||
|
@ -321,8 +286,8 @@ gst_video_flip_planar_yuv (GstVideoFlip * videoflip, guint8 * dest,
|
|||
}
|
||||
}
|
||||
/* Flip V */
|
||||
s = src + src_v_offset;
|
||||
d = dest + dest_v_offset;
|
||||
s = GST_VIDEO_FRAME_PLANE_DATA (src, 2);
|
||||
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 2);
|
||||
for (y = 0; y < dest_v_height; y++) {
|
||||
for (x = 0; x < dest_v_width; x++) {
|
||||
d[y * dest_v_stride + x] =
|
||||
|
@ -332,8 +297,8 @@ gst_video_flip_planar_yuv (GstVideoFlip * videoflip, guint8 * dest,
|
|||
break;
|
||||
case GST_VIDEO_FLIP_METHOD_180:
|
||||
/* Flip Y */
|
||||
s = src + src_y_offset;
|
||||
d = dest + dest_y_offset;
|
||||
s = GST_VIDEO_FRAME_PLANE_DATA (src, 0);
|
||||
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 0);
|
||||
for (y = 0; y < dest_y_height; y++) {
|
||||
for (x = 0; x < dest_y_width; x++) {
|
||||
d[y * dest_y_stride + x] =
|
||||
|
@ -341,8 +306,8 @@ gst_video_flip_planar_yuv (GstVideoFlip * videoflip, guint8 * dest,
|
|||
}
|
||||
}
|
||||
/* Flip U */
|
||||
s = src + src_u_offset;
|
||||
d = dest + dest_u_offset;
|
||||
s = GST_VIDEO_FRAME_PLANE_DATA (src, 1);
|
||||
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 1);
|
||||
for (y = 0; y < dest_u_height; y++) {
|
||||
for (x = 0; x < dest_u_width; x++) {
|
||||
d[y * dest_u_stride + x] =
|
||||
|
@ -350,8 +315,8 @@ gst_video_flip_planar_yuv (GstVideoFlip * videoflip, guint8 * dest,
|
|||
}
|
||||
}
|
||||
/* Flip V */
|
||||
s = src + src_v_offset;
|
||||
d = dest + dest_v_offset;
|
||||
s = GST_VIDEO_FRAME_PLANE_DATA (src, 2);
|
||||
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 2);
|
||||
for (y = 0; y < dest_v_height; y++) {
|
||||
for (x = 0; x < dest_v_width; x++) {
|
||||
d[y * dest_v_stride + x] =
|
||||
|
@ -361,8 +326,8 @@ gst_video_flip_planar_yuv (GstVideoFlip * videoflip, guint8 * dest,
|
|||
break;
|
||||
case GST_VIDEO_FLIP_METHOD_HORIZ:
|
||||
/* Flip Y */
|
||||
s = src + src_y_offset;
|
||||
d = dest + dest_y_offset;
|
||||
s = GST_VIDEO_FRAME_PLANE_DATA (src, 0);
|
||||
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 0);
|
||||
for (y = 0; y < dest_y_height; y++) {
|
||||
for (x = 0; x < dest_y_width; x++) {
|
||||
d[y * dest_y_stride + x] =
|
||||
|
@ -370,8 +335,8 @@ gst_video_flip_planar_yuv (GstVideoFlip * videoflip, guint8 * dest,
|
|||
}
|
||||
}
|
||||
/* Flip U */
|
||||
s = src + src_u_offset;
|
||||
d = dest + dest_u_offset;
|
||||
s = GST_VIDEO_FRAME_PLANE_DATA (src, 1);
|
||||
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 1);
|
||||
for (y = 0; y < dest_u_height; y++) {
|
||||
for (x = 0; x < dest_u_width; x++) {
|
||||
d[y * dest_u_stride + x] =
|
||||
|
@ -379,8 +344,8 @@ gst_video_flip_planar_yuv (GstVideoFlip * videoflip, guint8 * dest,
|
|||
}
|
||||
}
|
||||
/* Flip V */
|
||||
s = src + src_v_offset;
|
||||
d = dest + dest_v_offset;
|
||||
s = GST_VIDEO_FRAME_PLANE_DATA (src, 2);
|
||||
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 2);
|
||||
for (y = 0; y < dest_v_height; y++) {
|
||||
for (x = 0; x < dest_v_width; x++) {
|
||||
d[y * dest_v_stride + x] =
|
||||
|
@ -390,8 +355,8 @@ gst_video_flip_planar_yuv (GstVideoFlip * videoflip, guint8 * dest,
|
|||
break;
|
||||
case GST_VIDEO_FLIP_METHOD_VERT:
|
||||
/* Flip Y */
|
||||
s = src + src_y_offset;
|
||||
d = dest + dest_y_offset;
|
||||
s = GST_VIDEO_FRAME_PLANE_DATA (src, 0);
|
||||
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 0);
|
||||
for (y = 0; y < dest_y_height; y++) {
|
||||
for (x = 0; x < dest_y_width; x++) {
|
||||
d[y * dest_y_stride + x] =
|
||||
|
@ -399,8 +364,8 @@ gst_video_flip_planar_yuv (GstVideoFlip * videoflip, guint8 * dest,
|
|||
}
|
||||
}
|
||||
/* Flip U */
|
||||
s = src + src_u_offset;
|
||||
d = dest + dest_u_offset;
|
||||
s = GST_VIDEO_FRAME_PLANE_DATA (src, 1);
|
||||
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 1);
|
||||
for (y = 0; y < dest_u_height; y++) {
|
||||
for (x = 0; x < dest_u_width; x++) {
|
||||
d[y * dest_u_stride + x] =
|
||||
|
@ -408,8 +373,8 @@ gst_video_flip_planar_yuv (GstVideoFlip * videoflip, guint8 * dest,
|
|||
}
|
||||
}
|
||||
/* Flip V */
|
||||
s = src + src_v_offset;
|
||||
d = dest + dest_v_offset;
|
||||
s = GST_VIDEO_FRAME_PLANE_DATA (src, 2);
|
||||
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 2);
|
||||
for (y = 0; y < dest_v_height; y++) {
|
||||
for (x = 0; x < dest_v_width; x++) {
|
||||
d[y * dest_v_stride + x] =
|
||||
|
@ -419,24 +384,24 @@ gst_video_flip_planar_yuv (GstVideoFlip * videoflip, guint8 * dest,
|
|||
break;
|
||||
case GST_VIDEO_FLIP_METHOD_TRANS:
|
||||
/* Flip Y */
|
||||
s = src + src_y_offset;
|
||||
d = dest + dest_y_offset;
|
||||
s = GST_VIDEO_FRAME_PLANE_DATA (src, 0);
|
||||
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 0);
|
||||
for (y = 0; y < dest_y_height; y++) {
|
||||
for (x = 0; x < dest_y_width; x++) {
|
||||
d[y * dest_y_stride + x] = s[x * src_y_stride + y];
|
||||
}
|
||||
}
|
||||
/* Flip U */
|
||||
s = src + src_u_offset;
|
||||
d = dest + dest_u_offset;
|
||||
s = GST_VIDEO_FRAME_PLANE_DATA (src, 1);
|
||||
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 1);
|
||||
for (y = 0; y < dest_u_height; y++) {
|
||||
for (x = 0; x < dest_u_width; x++) {
|
||||
d[y * dest_u_stride + x] = s[x * src_u_stride + y];
|
||||
}
|
||||
}
|
||||
/* Flip V */
|
||||
s = src + src_v_offset;
|
||||
d = dest + dest_v_offset;
|
||||
s = GST_VIDEO_FRAME_PLANE_DATA (src, 2);
|
||||
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 2);
|
||||
for (y = 0; y < dest_u_height; y++) {
|
||||
for (x = 0; x < dest_u_width; x++) {
|
||||
d[y * dest_v_stride + x] = s[x * src_v_stride + y];
|
||||
|
@ -445,8 +410,8 @@ gst_video_flip_planar_yuv (GstVideoFlip * videoflip, guint8 * dest,
|
|||
break;
|
||||
case GST_VIDEO_FLIP_METHOD_OTHER:
|
||||
/* Flip Y */
|
||||
s = src + src_y_offset;
|
||||
d = dest + dest_y_offset;
|
||||
s = GST_VIDEO_FRAME_PLANE_DATA (src, 0);
|
||||
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 0);
|
||||
for (y = 0; y < dest_y_height; y++) {
|
||||
for (x = 0; x < dest_y_width; x++) {
|
||||
d[y * dest_y_stride + x] =
|
||||
|
@ -454,8 +419,8 @@ gst_video_flip_planar_yuv (GstVideoFlip * videoflip, guint8 * dest,
|
|||
}
|
||||
}
|
||||
/* Flip U */
|
||||
s = src + src_u_offset;
|
||||
d = dest + dest_u_offset;
|
||||
s = GST_VIDEO_FRAME_PLANE_DATA (src, 1);
|
||||
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 1);
|
||||
for (y = 0; y < dest_u_height; y++) {
|
||||
for (x = 0; x < dest_u_width; x++) {
|
||||
d[y * dest_u_stride + x] =
|
||||
|
@ -463,8 +428,8 @@ gst_video_flip_planar_yuv (GstVideoFlip * videoflip, guint8 * dest,
|
|||
}
|
||||
}
|
||||
/* Flip V */
|
||||
s = src + src_v_offset;
|
||||
d = dest + dest_v_offset;
|
||||
s = GST_VIDEO_FRAME_PLANE_DATA (src, 2);
|
||||
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 2);
|
||||
for (y = 0; y < dest_v_height; y++) {
|
||||
for (x = 0; x < dest_v_width; x++) {
|
||||
d[y * dest_v_stride + x] =
|
||||
|
@ -482,24 +447,26 @@ gst_video_flip_planar_yuv (GstVideoFlip * videoflip, guint8 * dest,
|
|||
}
|
||||
|
||||
static void
|
||||
gst_video_flip_packed_simple (GstVideoFlip * videoflip, guint8 * dest,
|
||||
const guint8 * src)
|
||||
gst_video_flip_packed_simple (GstVideoFlip * videoflip, GstVideoFrame * dest,
|
||||
const GstVideoFrame * src)
|
||||
{
|
||||
gint x, y, z;
|
||||
guint8 const *s = src;
|
||||
guint8 *d = dest;
|
||||
GstVideoFormat format = videoflip->format;
|
||||
gint sw = videoflip->from_width;
|
||||
gint sh = videoflip->from_height;
|
||||
gint dw = videoflip->to_width;
|
||||
gint dh = videoflip->to_height;
|
||||
guint8 const *s;
|
||||
guint8 *d;
|
||||
gint sw = GST_VIDEO_FRAME_WIDTH (src);
|
||||
gint sh = GST_VIDEO_FRAME_HEIGHT (src);
|
||||
gint dw = GST_VIDEO_FRAME_WIDTH (dest);
|
||||
gint dh = GST_VIDEO_FRAME_HEIGHT (dest);
|
||||
gint src_stride, dest_stride;
|
||||
gint bpp;
|
||||
|
||||
src_stride = gst_video_format_get_row_stride (format, 0, sw);
|
||||
dest_stride = gst_video_format_get_row_stride (format, 0, dw);
|
||||
s = GST_VIDEO_FRAME_PLANE_DATA (src, 0);
|
||||
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 0);
|
||||
|
||||
src_stride = GST_VIDEO_FRAME_PLANE_STRIDE (src, 0);
|
||||
dest_stride = GST_VIDEO_FRAME_PLANE_STRIDE (dest, 0);
|
||||
/* This is only true for non-subsampled formats! */
|
||||
bpp = gst_video_format_get_pixel_stride (format, 0);
|
||||
bpp = GST_VIDEO_FRAME_COMP_PSTRIDE (src, 0);
|
||||
|
||||
switch (videoflip->method) {
|
||||
case GST_VIDEO_FLIP_METHOD_90R:
|
||||
|
@ -582,17 +549,16 @@ gst_video_flip_packed_simple (GstVideoFlip * videoflip, guint8 * dest,
|
|||
|
||||
|
||||
static void
|
||||
gst_video_flip_y422 (GstVideoFlip * videoflip, guint8 * dest,
|
||||
const guint8 * src)
|
||||
gst_video_flip_y422 (GstVideoFlip * videoflip, GstVideoFrame * dest,
|
||||
const GstVideoFrame * src)
|
||||
{
|
||||
gint x, y;
|
||||
guint8 const *s = src;
|
||||
guint8 *d = dest;
|
||||
GstVideoFormat format = videoflip->format;
|
||||
gint sw = videoflip->from_width;
|
||||
gint sh = videoflip->from_height;
|
||||
gint dw = videoflip->to_width;
|
||||
gint dh = videoflip->to_height;
|
||||
guint8 const *s;
|
||||
guint8 *d;
|
||||
gint sw = GST_VIDEO_FRAME_WIDTH (src);
|
||||
gint sh = GST_VIDEO_FRAME_HEIGHT (src);
|
||||
gint dw = GST_VIDEO_FRAME_WIDTH (dest);
|
||||
gint dh = GST_VIDEO_FRAME_HEIGHT (dest);
|
||||
gint src_stride, dest_stride;
|
||||
gint bpp;
|
||||
gint y_offset;
|
||||
|
@ -600,13 +566,16 @@ gst_video_flip_y422 (GstVideoFlip * videoflip, guint8 * dest,
|
|||
gint v_offset;
|
||||
gint y_stride;
|
||||
|
||||
src_stride = gst_video_format_get_row_stride (format, 0, sw);
|
||||
dest_stride = gst_video_format_get_row_stride (format, 0, dw);
|
||||
s = GST_VIDEO_FRAME_PLANE_DATA (src, 0);
|
||||
d = GST_VIDEO_FRAME_PLANE_DATA (dest, 0);
|
||||
|
||||
y_offset = gst_video_format_get_component_offset (format, 0, sw, sh);
|
||||
u_offset = gst_video_format_get_component_offset (format, 1, sw, sh);
|
||||
v_offset = gst_video_format_get_component_offset (format, 2, sw, sh);
|
||||
y_stride = gst_video_format_get_pixel_stride (format, 0);
|
||||
src_stride = GST_VIDEO_FRAME_PLANE_STRIDE (src, 0);
|
||||
dest_stride = GST_VIDEO_FRAME_PLANE_STRIDE (dest, 0);
|
||||
|
||||
y_offset = GST_VIDEO_FRAME_COMP_OFFSET (src, 0);
|
||||
u_offset = GST_VIDEO_FRAME_COMP_OFFSET (src, 1);
|
||||
v_offset = GST_VIDEO_FRAME_COMP_OFFSET (src, 2);
|
||||
y_stride = GST_VIDEO_FRAME_COMP_PSTRIDE (src, 0);
|
||||
bpp = y_stride;
|
||||
|
||||
switch (videoflip->method) {
|
||||
|
@ -800,20 +769,17 @@ gst_video_flip_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
|
|||
GstCaps * outcaps)
|
||||
{
|
||||
GstVideoFlip *vf = GST_VIDEO_FLIP (btrans);
|
||||
GstVideoFormat in_format, out_format;
|
||||
GstVideoInfo in_info, out_info;
|
||||
gboolean ret = FALSE;
|
||||
|
||||
vf->process = NULL;
|
||||
|
||||
if (!gst_video_format_parse_caps (incaps, &in_format, &vf->from_width,
|
||||
&vf->from_height)
|
||||
|| !gst_video_format_parse_caps (outcaps, &out_format, &vf->to_width,
|
||||
&vf->to_height))
|
||||
if (!gst_video_info_from_caps (&in_info, incaps)
|
||||
|| !gst_video_info_from_caps (&out_info, outcaps))
|
||||
goto invalid_caps;
|
||||
|
||||
if (in_format != out_format)
|
||||
if (GST_VIDEO_INFO_FORMAT (&in_info) != GST_VIDEO_INFO_FORMAT (&out_info))
|
||||
goto invalid_caps;
|
||||
vf->format = in_format;
|
||||
|
||||
/* Check that they are correct */
|
||||
switch (vf->method) {
|
||||
|
@ -821,11 +787,11 @@ gst_video_flip_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
|
|||
case GST_VIDEO_FLIP_METHOD_90L:
|
||||
case GST_VIDEO_FLIP_METHOD_TRANS:
|
||||
case GST_VIDEO_FLIP_METHOD_OTHER:
|
||||
if ((vf->from_width != vf->to_height) ||
|
||||
(vf->from_height != vf->to_width)) {
|
||||
if ((in_info.width != out_info.height) ||
|
||||
(in_info.height != out_info.width)) {
|
||||
GST_ERROR_OBJECT (vf, "we are inverting width and height but caps "
|
||||
"are not correct : %dx%d to %dx%d", vf->from_width,
|
||||
vf->from_height, vf->to_width, vf->to_height);
|
||||
"are not correct : %dx%d to %dx%d", in_info.width,
|
||||
in_info.height, out_info.width, out_info.height);
|
||||
goto beach;
|
||||
}
|
||||
break;
|
||||
|
@ -835,11 +801,11 @@ gst_video_flip_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
|
|||
case GST_VIDEO_FLIP_METHOD_180:
|
||||
case GST_VIDEO_FLIP_METHOD_HORIZ:
|
||||
case GST_VIDEO_FLIP_METHOD_VERT:
|
||||
if ((vf->from_width != vf->to_width) ||
|
||||
(vf->from_height != vf->to_height)) {
|
||||
if ((in_info.width != out_info.width) ||
|
||||
(in_info.height != out_info.height)) {
|
||||
GST_ERROR_OBJECT (vf, "we are keeping width and height but caps "
|
||||
"are not correct : %dx%d to %dx%d", vf->from_width,
|
||||
vf->from_height, vf->to_width, vf->to_height);
|
||||
"are not correct : %dx%d to %dx%d", in_info.width,
|
||||
in_info.height, out_info.width, out_info.height);
|
||||
goto beach;
|
||||
}
|
||||
break;
|
||||
|
@ -849,8 +815,10 @@ gst_video_flip_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
|
|||
}
|
||||
|
||||
ret = TRUE;
|
||||
vf->in_info = in_info;
|
||||
vf->out_info = out_info;
|
||||
|
||||
switch (vf->format) {
|
||||
switch (GST_VIDEO_INFO_FORMAT (&in_info)) {
|
||||
case GST_VIDEO_FORMAT_I420:
|
||||
case GST_VIDEO_FORMAT_YV12:
|
||||
case GST_VIDEO_FORMAT_Y444:
|
||||
|
@ -909,33 +877,49 @@ gst_video_flip_transform (GstBaseTransform * trans, GstBuffer * in,
|
|||
GstBuffer * out)
|
||||
{
|
||||
GstVideoFlip *videoflip = GST_VIDEO_FLIP (trans);
|
||||
guint8 *dest;
|
||||
guint8 *src;
|
||||
gsize srcsize, destsize;
|
||||
GstVideoFrame dest;
|
||||
GstVideoFrame src;
|
||||
|
||||
if (G_UNLIKELY (videoflip->process == NULL))
|
||||
goto not_negotiated;
|
||||
|
||||
src = gst_buffer_map (in, &srcsize, NULL, GST_MAP_READ);
|
||||
dest = gst_buffer_map (out, &destsize, NULL, GST_MAP_WRITE);
|
||||
if (!gst_video_frame_map (&src, &videoflip->in_info, in, GST_MAP_READ))
|
||||
goto invalid_in;
|
||||
|
||||
if (!gst_video_frame_map (&dest, &videoflip->out_info, out, GST_MAP_WRITE))
|
||||
goto invalid_out;
|
||||
|
||||
GST_LOG_OBJECT (videoflip, "videoflip: flipping %dx%d to %dx%d (%s)",
|
||||
videoflip->from_width, videoflip->from_height, videoflip->to_width,
|
||||
videoflip->to_height, video_flip_methods[videoflip->method].value_nick);
|
||||
videoflip->in_info.width, videoflip->in_info.height,
|
||||
videoflip->out_info.width, videoflip->out_info.height,
|
||||
video_flip_methods[videoflip->method].value_nick);
|
||||
|
||||
GST_OBJECT_LOCK (videoflip);
|
||||
videoflip->process (videoflip, dest, src);
|
||||
videoflip->process (videoflip, &dest, &src);
|
||||
GST_OBJECT_UNLOCK (videoflip);
|
||||
|
||||
gst_buffer_unmap (in, src, srcsize);
|
||||
gst_buffer_unmap (out, dest, destsize);
|
||||
gst_video_frame_unmap (&src);
|
||||
gst_video_frame_unmap (&dest);
|
||||
|
||||
return GST_FLOW_OK;
|
||||
|
||||
not_negotiated:
|
||||
{
|
||||
GST_ERROR_OBJECT (videoflip, "Not negotiated yet");
|
||||
return GST_FLOW_NOT_NEGOTIATED;
|
||||
}
|
||||
invalid_in:
|
||||
{
|
||||
GST_ERROR_OBJECT (videoflip, "invalid input frame");
|
||||
return GST_FLOW_OK;
|
||||
}
|
||||
invalid_out:
|
||||
{
|
||||
GST_ERROR_OBJECT (videoflip, "invalid output frame");
|
||||
gst_video_frame_unmap (&src);
|
||||
return GST_FLOW_OK;
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_video_flip_src_event (GstBaseTransform * trans, GstEvent * event)
|
||||
|
@ -959,31 +943,31 @@ gst_video_flip_src_event (GstBaseTransform * trans, GstEvent * event)
|
|||
switch (vf->method) {
|
||||
case GST_VIDEO_FLIP_METHOD_90R:
|
||||
new_x = y;
|
||||
new_y = vf->to_width - x;
|
||||
new_y = vf->out_info.width - x;
|
||||
break;
|
||||
case GST_VIDEO_FLIP_METHOD_90L:
|
||||
new_x = vf->to_height - y;
|
||||
new_x = vf->out_info.height - y;
|
||||
new_y = x;
|
||||
break;
|
||||
case GST_VIDEO_FLIP_METHOD_OTHER:
|
||||
new_x = vf->to_height - y;
|
||||
new_y = vf->to_width - x;
|
||||
new_x = vf->out_info.height - y;
|
||||
new_y = vf->out_info.width - x;
|
||||
break;
|
||||
case GST_VIDEO_FLIP_METHOD_TRANS:
|
||||
new_x = y;
|
||||
new_y = x;
|
||||
break;
|
||||
case GST_VIDEO_FLIP_METHOD_180:
|
||||
new_x = vf->to_width - x;
|
||||
new_y = vf->to_height - y;
|
||||
new_x = vf->out_info.width - x;
|
||||
new_y = vf->out_info.height - y;
|
||||
break;
|
||||
case GST_VIDEO_FLIP_METHOD_HORIZ:
|
||||
new_x = vf->to_width - x;
|
||||
new_x = vf->out_info.width - x;
|
||||
new_y = y;
|
||||
break;
|
||||
case GST_VIDEO_FLIP_METHOD_VERT:
|
||||
new_x = x;
|
||||
new_y = vf->to_height - y;
|
||||
new_y = vf->out_info.height - y;
|
||||
break;
|
||||
default:
|
||||
new_x = x;
|
||||
|
|
|
@ -73,12 +73,11 @@ struct _GstVideoFlip {
|
|||
GstVideoFilter videofilter;
|
||||
|
||||
/* < private > */
|
||||
GstVideoFormat format;
|
||||
gint from_width, from_height;
|
||||
gint to_width, to_height;
|
||||
GstVideoInfo in_info;
|
||||
GstVideoInfo out_info;
|
||||
|
||||
GstVideoFlipMethod method;
|
||||
void (*process) (GstVideoFlip *videoflip, guint8 *dest, const guint8 *src);
|
||||
void (*process) (GstVideoFlip *videoflip, GstVideoFrame *dest, const GstVideoFrame *src);
|
||||
};
|
||||
|
||||
struct _GstVideoFlipClass {
|
||||
|
|
Loading…
Reference in a new issue