saperasrc: add channel-extract property to get UINT16 of R, G, or B
This commit is contained in:
parent
94b387cc13
commit
16dbd0c915
@ -104,6 +104,7 @@ protected:
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
// TODO: optimize this
|
// TODO: optimize this
|
||||||
|
if (src->channel_extract == 0) {
|
||||||
if (pitch == src->gst_stride) {
|
if (pitch == src->gst_stride) {
|
||||||
memcpy (minfo.data, pData, size);
|
memcpy (minfo.data, pData, size);
|
||||||
} else {
|
} else {
|
||||||
@ -112,6 +113,30 @@ protected:
|
|||||||
(guint8 *) pData + (line * pitch), pitch);
|
(guint8 *) pData + (line * pitch), pitch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
guint32 mask, shift;
|
||||||
|
if (src->channel_extract == 1) {
|
||||||
|
mask = 0x3ff00000;
|
||||||
|
shift = 20;
|
||||||
|
} else if (src->channel_extract == 2) {
|
||||||
|
mask = 0xffc00;
|
||||||
|
shift = 10;
|
||||||
|
} else if (src->channel_extract == 3) {
|
||||||
|
mask = 0x3ff;
|
||||||
|
shift = 0;
|
||||||
|
} else
|
||||||
|
g_assert_not_reached ();
|
||||||
|
|
||||||
|
guint32 *packed = (guint32 *) pData;
|
||||||
|
guint16 *dst = (guint16 *) minfo.data;
|
||||||
|
for (int r = 0; r < src->height; ++r) {
|
||||||
|
for (int c = 0; c < src->width; ++c) {
|
||||||
|
*dst = (*packed & mask) >> shift;
|
||||||
|
++dst;
|
||||||
|
++packed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
src->sap_buffers->ReleaseAddress (pData);
|
src->sap_buffers->ReleaseAddress (pData);
|
||||||
|
|
||||||
@ -311,12 +336,14 @@ enum
|
|||||||
PROP_NUM_CAPTURE_BUFFERS,
|
PROP_NUM_CAPTURE_BUFFERS,
|
||||||
PROP_SERVER_INDEX,
|
PROP_SERVER_INDEX,
|
||||||
PROP_RESOURCE_INDEX,
|
PROP_RESOURCE_INDEX,
|
||||||
|
PROP_CHANNEL_EXTRACT
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DEFAULT_PROP_FORMAT_FILE ""
|
#define DEFAULT_PROP_FORMAT_FILE ""
|
||||||
#define DEFAULT_PROP_NUM_CAPTURE_BUFFERS 2
|
#define DEFAULT_PROP_NUM_CAPTURE_BUFFERS 2
|
||||||
#define DEFAULT_PROP_SERVER_INDEX 1
|
#define DEFAULT_PROP_SERVER_INDEX 1
|
||||||
#define DEFAULT_PROP_RESOURCE_INDEX 0
|
#define DEFAULT_PROP_RESOURCE_INDEX 0
|
||||||
|
#define DEFAULT_PROP_CHANNEL_EXTRACT 0
|
||||||
|
|
||||||
/* pad templates */
|
/* pad templates */
|
||||||
|
|
||||||
@ -383,6 +410,10 @@ gst_saperasrc_class_init (GstSaperaSrcClass * klass)
|
|||||||
"Resource index, such as different ports or configurations", 0,
|
"Resource index, such as different ports or configurations", 0,
|
||||||
G_MAXINT, DEFAULT_PROP_RESOURCE_INDEX,
|
G_MAXINT, DEFAULT_PROP_RESOURCE_INDEX,
|
||||||
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
|
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
|
||||||
|
g_object_class_install_property (gobject_class, PROP_CHANNEL_EXTRACT,
|
||||||
|
g_param_spec_int ("color-channel", "Color channel", "Color channel", 0, 3,
|
||||||
|
DEFAULT_PROP_CHANNEL_EXTRACT,
|
||||||
|
(GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -465,6 +496,9 @@ gst_saperasrc_set_property (GObject * object, guint property_id,
|
|||||||
case PROP_RESOURCE_INDEX:
|
case PROP_RESOURCE_INDEX:
|
||||||
src->resource_index = g_value_get_int (value);
|
src->resource_index = g_value_get_int (value);
|
||||||
break;
|
break;
|
||||||
|
case PROP_CHANNEL_EXTRACT:
|
||||||
|
src->channel_extract = g_value_get_int (value);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||||
break;
|
break;
|
||||||
@ -493,6 +527,9 @@ gst_saperasrc_get_property (GObject * object, guint property_id,
|
|||||||
case PROP_RESOURCE_INDEX:
|
case PROP_RESOURCE_INDEX:
|
||||||
g_value_set_int (value, src->resource_index);
|
g_value_set_int (value, src->resource_index);
|
||||||
break;
|
break;
|
||||||
|
case PROP_CHANNEL_EXTRACT:
|
||||||
|
g_value_set_int (value, src->channel_extract);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||||
break;
|
break;
|
||||||
@ -578,6 +615,9 @@ gst_saperasrc_start (GstBaseSrc * bsrc)
|
|||||||
case SapFormatRGB8888:
|
case SapFormatRGB8888:
|
||||||
gst_format = GST_VIDEO_FORMAT_BGRA;
|
gst_format = GST_VIDEO_FORMAT_BGRA;
|
||||||
break;
|
break;
|
||||||
|
case SapFormatRGB101010:
|
||||||
|
gst_format = GST_VIDEO_FORMAT_GRAY16_LE;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
gst_format = GST_VIDEO_FORMAT_UNKNOWN;
|
gst_format = GST_VIDEO_FORMAT_UNKNOWN;
|
||||||
}
|
}
|
||||||
@ -595,6 +635,7 @@ gst_saperasrc_start (GstBaseSrc * bsrc)
|
|||||||
vinfo.finfo = gst_video_format_get_info (gst_format);
|
vinfo.finfo = gst_video_format_get_info (gst_format);
|
||||||
src->caps = gst_video_info_to_caps (&vinfo);
|
src->caps = gst_video_info_to_caps (&vinfo);
|
||||||
|
|
||||||
|
src->width = vinfo.width;
|
||||||
src->height = vinfo.height;
|
src->height = vinfo.height;
|
||||||
src->gst_stride = GST_VIDEO_INFO_COMP_STRIDE (&vinfo, 0);
|
src->gst_stride = GST_VIDEO_INFO_COMP_STRIDE (&vinfo, 0);
|
||||||
|
|
||||||
|
|||||||
@ -58,10 +58,12 @@ struct _GstSaperaSrc
|
|||||||
guint num_capture_buffers;
|
guint num_capture_buffers;
|
||||||
gint server_index;
|
gint server_index;
|
||||||
gint resource_index;
|
gint resource_index;
|
||||||
|
gint channel_extract;
|
||||||
|
|
||||||
GstBuffer *buffer;
|
GstBuffer *buffer;
|
||||||
|
|
||||||
GstCaps *caps;
|
GstCaps *caps;
|
||||||
|
gint width;
|
||||||
gint height;
|
gint height;
|
||||||
gint gst_stride;
|
gint gst_stride;
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user