static GstFlowReturn gst_gamma_transform_ip (GstBaseTransform * base, GstBuffer * outbuf) { GstGamma *gamma; guint8 *data; guint size; gamma = GST_GAMMA (base); if (base->passthrough) goto done; data = GST_BUFFER_DATA (outbuf); size = GST_BUFFER_SIZE (outbuf); if (size != gamma->size) goto wrong_size; gst_gamma_planar411_ip (gamma, data, gamma->height * GST_VIDEO_I420_Y_ROWSTRIDE (gamma->width)); done: return GST_FLOW_OK; /* ERRORS */ wrong_size: { GST_ELEMENT_ERROR (gamma, STREAM, FORMAT, (NULL), ("Invalid buffer size %d, expected %d", size, gamma->size)); return GST_FLOW_ERROR; } }
static gboolean gst_gamma_set_caps (GstBaseTransform * base, GstCaps * incaps, GstCaps * outcaps) { GstGamma *this; GstStructure *structure; gboolean res; this = GST_GAMMA (base); GST_DEBUG_OBJECT (this, "set_caps: in %" GST_PTR_FORMAT " out %" GST_PTR_FORMAT, incaps, outcaps); structure = gst_caps_get_structure (incaps, 0); res = gst_structure_get_int (structure, "width", &this->width); res &= gst_structure_get_int (structure, "height", &this->height); if (!res) goto done; this->size = GST_VIDEO_I420_SIZE (this->width, this->height); done: return res; }
static gboolean gst_gamma_set_caps (GstBaseTransform * base, GstCaps * incaps, GstCaps * outcaps) { GstGamma *gamma = GST_GAMMA (base); 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)) goto invalid_caps; gamma->size = gst_video_format_get_size (gamma->format, gamma->width, gamma->height); switch (gamma->format) { case GST_VIDEO_FORMAT_I420: case GST_VIDEO_FORMAT_YV12: case GST_VIDEO_FORMAT_Y41B: case GST_VIDEO_FORMAT_Y42B: case GST_VIDEO_FORMAT_Y444: case GST_VIDEO_FORMAT_NV12: case GST_VIDEO_FORMAT_NV21: gamma->process = gst_gamma_planar_yuv_ip; break; case GST_VIDEO_FORMAT_YUY2: case GST_VIDEO_FORMAT_UYVY: case GST_VIDEO_FORMAT_AYUV: case GST_VIDEO_FORMAT_YVYU: gamma->process = gst_gamma_packed_yuv_ip; break; case GST_VIDEO_FORMAT_ARGB: case GST_VIDEO_FORMAT_ABGR: case GST_VIDEO_FORMAT_RGBA: case GST_VIDEO_FORMAT_BGRA: case GST_VIDEO_FORMAT_xRGB: case GST_VIDEO_FORMAT_xBGR: case GST_VIDEO_FORMAT_RGBx: case GST_VIDEO_FORMAT_BGRx: case GST_VIDEO_FORMAT_RGB: case GST_VIDEO_FORMAT_BGR: gamma->process = gst_gamma_packed_rgb_ip; break; default: goto invalid_caps; break; } return TRUE; invalid_caps: GST_ERROR_OBJECT (gamma, "Invalid caps: %" GST_PTR_FORMAT, incaps); return FALSE; }
static gboolean gst_gamma_set_info (GstVideoFilter * vfilter, GstCaps * incaps, GstVideoInfo * in_info, GstCaps * outcaps, GstVideoInfo * out_info) { GstGamma *gamma = GST_GAMMA (vfilter); GST_DEBUG_OBJECT (gamma, "setting caps: in %" GST_PTR_FORMAT " out %" GST_PTR_FORMAT, incaps, outcaps); switch (GST_VIDEO_INFO_FORMAT (in_info)) { case GST_VIDEO_FORMAT_I420: case GST_VIDEO_FORMAT_YV12: case GST_VIDEO_FORMAT_Y41B: case GST_VIDEO_FORMAT_Y42B: case GST_VIDEO_FORMAT_Y444: case GST_VIDEO_FORMAT_NV12: case GST_VIDEO_FORMAT_NV21: gamma->process = gst_gamma_planar_yuv_ip; break; case GST_VIDEO_FORMAT_YUY2: case GST_VIDEO_FORMAT_UYVY: case GST_VIDEO_FORMAT_AYUV: case GST_VIDEO_FORMAT_YVYU: gamma->process = gst_gamma_packed_yuv_ip; break; case GST_VIDEO_FORMAT_ARGB: case GST_VIDEO_FORMAT_ABGR: case GST_VIDEO_FORMAT_RGBA: case GST_VIDEO_FORMAT_BGRA: case GST_VIDEO_FORMAT_xRGB: case GST_VIDEO_FORMAT_xBGR: case GST_VIDEO_FORMAT_RGBx: case GST_VIDEO_FORMAT_BGRx: case GST_VIDEO_FORMAT_RGB: case GST_VIDEO_FORMAT_BGR: gamma->process = gst_gamma_packed_rgb_ip; break; default: goto invalid_caps; break; } return TRUE; /* ERRORS */ invalid_caps: { GST_ERROR_OBJECT (gamma, "Invalid caps: %" GST_PTR_FORMAT, incaps); return FALSE; } }
static void gst_gamma_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstGamma *gamma = GST_GAMMA (object); switch (prop_id) { case PROP_GAMMA: g_value_set_double (value, gamma->gamma); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static void gst_gamma_before_transform (GstBaseTransform * base, GstBuffer * outbuf) { GstGamma *gamma = GST_GAMMA (base); GstClockTime timestamp, stream_time; timestamp = GST_BUFFER_TIMESTAMP (outbuf); stream_time = gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, timestamp); GST_DEBUG_OBJECT (gamma, "sync to %" GST_TIME_FORMAT, GST_TIME_ARGS (timestamp)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) gst_object_sync_values (GST_OBJECT (gamma), stream_time); }
static void gst_gamma_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstGamma *gamma; g_return_if_fail (GST_IS_GAMMA (object)); gamma = GST_GAMMA (object); GST_DEBUG ("gst_gamma_set_property"); switch (prop_id) { case PROP_GAMMA: gamma->gamma = g_value_get_double (value); gst_gamma_calculate_tables (gamma); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static GstFlowReturn gst_gamma_transform_frame_ip (GstVideoFilter * vfilter, GstVideoFrame * frame) { GstGamma *gamma = GST_GAMMA (vfilter); if (!gamma->process) goto not_negotiated; GST_OBJECT_LOCK (gamma); gamma->process (gamma, frame); GST_OBJECT_UNLOCK (gamma); return GST_FLOW_OK; /* ERRORS */ not_negotiated: { GST_ERROR_OBJECT (gamma, "Not negotiated yet"); return GST_FLOW_NOT_NEGOTIATED; } }
static GstFlowReturn gst_gamma_transform_ip (GstBaseTransform * base, GstBuffer * outbuf) { GstGamma *gamma = GST_GAMMA (base); guint8 *data; guint size; if (!gamma->process) goto not_negotiated; if (base->passthrough) goto done; data = GST_BUFFER_DATA (outbuf); size = GST_BUFFER_SIZE (outbuf); if (size != gamma->size) goto wrong_size; GST_OBJECT_LOCK (gamma); gamma->process (gamma, data); GST_OBJECT_UNLOCK (gamma); done: return GST_FLOW_OK; /* ERRORS */ wrong_size: { GST_ELEMENT_ERROR (gamma, STREAM, FORMAT, (NULL), ("Invalid buffer size %d, expected %d", size, gamma->size)); return GST_FLOW_ERROR; } not_negotiated: { GST_ERROR_OBJECT (gamma, "Not negotiated yet"); return GST_FLOW_NOT_NEGOTIATED; } }
static void gst_gamma_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstGamma *gamma = GST_GAMMA (object); switch (prop_id) { case PROP_GAMMA:{ gdouble val = g_value_get_double (value); GST_DEBUG_OBJECT (gamma, "Changing gamma from %lf to %lf", gamma->gamma, val); GST_OBJECT_LOCK (gamma); gamma->gamma = val; GST_OBJECT_UNLOCK (gamma); gst_gamma_calculate_tables (gamma); break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }