videolevels: support bpp={10,12,14,16} for GRAY16_{LE,BE}

This commit is contained in:
Joshua M. Doe 2013-05-23 08:01:15 -04:00
parent a4e6fa7db1
commit fca5b782ec
2 changed files with 16 additions and 10 deletions

View File

@ -75,7 +75,12 @@ static GstStaticPadTemplate gst_videolevels_src_template =
GST_STATIC_PAD_TEMPLATE ("sink", GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK, GST_PAD_SINK,
GST_PAD_ALWAYS, GST_PAD_ALWAYS,
GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("{ GRAY16_LE, GRAY16_BE }")) GST_STATIC_CAPS ("video/x-raw, "
"format = (string) { GRAY16_LE, GRAY16_BE }, "
"bpp = (int) {16, 14, 12, 10}, "
"width = " GST_VIDEO_SIZE_RANGE ", "
"height = " GST_VIDEO_SIZE_RANGE ", "
"framerate = " GST_VIDEO_FPS_RANGE)
); );
static GstStaticPadTemplate gst_videolevels_sink_template = static GstStaticPadTemplate gst_videolevels_sink_template =
@ -376,16 +381,11 @@ gst_videolevels_transform_caps (GstBaseTransform * trans,
continue; continue;
st = gst_structure_copy (st); st = gst_structure_copy (st);
gst_structure_remove_fields (st, "format", NULL); gst_structure_remove_fields (st, "format", "bpp", NULL);
gst_caps_append_structure (other_caps, st); gst_caps_append_structure (other_caps, st);
} }
/* finish settings caps of the opposite pad */
//if (direction == GST_PAD_SINK) {
// "GRAY8";
if (!gst_caps_is_empty (other_caps) && filter_caps) { if (!gst_caps_is_empty (other_caps) && filter_caps) {
GstCaps *tmp = gst_caps_intersect_full (filter_caps, other_caps, GstCaps *tmp = gst_caps_intersect_full (filter_caps, other_caps,
GST_CAPS_INTERSECT_FIRST); GST_CAPS_INTERSECT_FIRST);
@ -401,6 +401,7 @@ gst_videolevels_set_info (GstVideoFilter * filter, GstCaps * incaps,
GstVideoInfo * in_info, GstCaps * outcaps, GstVideoInfo * out_info) GstVideoInfo * in_info, GstCaps * outcaps, GstVideoInfo * out_info)
{ {
GstVideoLevels *levels = GST_VIDEOLEVELS (filter); GstVideoLevels *levels = GST_VIDEOLEVELS (filter);
GstStructure *s;
gboolean res; gboolean res;
GST_DEBUG_OBJECT (levels, GST_DEBUG_OBJECT (levels,
@ -409,6 +410,10 @@ gst_videolevels_set_info (GstVideoFilter * filter, GstCaps * incaps,
memcpy (&levels->info_in, in_info, sizeof (GstVideoInfo)); memcpy (&levels->info_in, in_info, sizeof (GstVideoInfo));
memcpy (&levels->info_out, out_info, sizeof (GstVideoInfo)); memcpy (&levels->info_out, out_info, sizeof (GstVideoInfo));
s = gst_caps_get_structure (incaps, 0);
if (!gst_structure_get_int (s, "bpp", &levels->bpp_in))
levels->bpp_in = 16;
res = gst_videolevels_calculate_lut (levels); res = gst_videolevels_calculate_lut (levels);
return res; return res;
@ -534,7 +539,7 @@ gst_videolevels_calculate_lut_uint16_to_uint8 (GstVideoLevels * videolevels,
gdouble m; gdouble m;
gdouble b; gdouble b;
guint8 *lut = (guint8 *) videolevels->lookup_table; guint8 *lut = (guint8 *) videolevels->lookup_table;
const guint16 max_in = (1 << videolevels->info_in.finfo->bits) - 1; const guint16 max_in = (1 << videolevels->bpp_in) - 1;
const guint16 low_in = (guint16) (videolevels->lower_input * max_in); const guint16 low_in = (guint16) (videolevels->lower_input * max_in);
const guint16 high_in = (guint16) (videolevels->upper_input * max_in); const guint16 high_in = (guint16) (videolevels->upper_input * max_in);
const guint8 max_out = (1 << videolevels->info_out.finfo->bits) - 1; const guint8 max_out = (1 << videolevels->info_out.finfo->bits) - 1;
@ -625,7 +630,7 @@ gst_videolevels_calculate_histogram (GstVideoLevels * videolevels,
endianness = G_BYTE_ORDER; endianness = G_BYTE_ORDER;
factor = nbins / (gfloat) (1 << videolevels->info_in.finfo->bits); factor = nbins / (gfloat) (1 << videolevels->bpp_in);
if (videolevels->histogram == NULL) { if (videolevels->histogram == NULL) {
GST_DEBUG_OBJECT (videolevels, GST_DEBUG_OBJECT (videolevels,
@ -674,7 +679,7 @@ gst_videolevels_auto_adjust (GstVideoLevels * videolevels, guint16 * data)
gint i; gint i;
gint size; gint size;
gdouble min = 0.0; gdouble min = 0.0;
gdouble max = (1 << videolevels->info_in.finfo->bits) - 1.0; gdouble max = (1 << videolevels->bpp_in) - 1.0;
gst_videolevels_calculate_histogram (videolevels, data); gst_videolevels_calculate_histogram (videolevels, data);

View File

@ -70,6 +70,7 @@ struct _GstVideoLevels
GstVideoFilter element; GstVideoFilter element;
/* format */ /* format */
gint bpp_in;
GstVideoInfo info_in; GstVideoInfo info_in;
GstVideoInfo info_out; GstVideoInfo info_out;