priv->fps_n = fps_n;
priv->fps_d = fps_d;
- if (gst_structure_has_name (s, "video/x-raw-rgb"))
+ if (media_type->is_rgb)
priv->rgb_swap_buf = g_malloc (media_type->sample_size / priv->height);
else
priv->rgb_swap_buf = NULL;
}
gboolean
-gst_ks_video_device_postprocess_frame (GstKsVideoDevice * self, GstBuffer * buf)
+gst_ks_video_device_postprocess_frame (GstKsVideoDevice * self, GstBuffer ** bufptr)
{
GstKsVideoDevicePrivate *priv = GST_KS_VIDEO_DEVICE_GET_PRIVATE (self);
+ GstBuffer *buf = *bufptr;
/* If it's RGB we need to flip the image */
if (priv->rgb_swap_buf != NULL) {
gint stride, line;
guint8 *dst, *src;
+ /* Need to make the buffer writable because
+ * the pseudo-bufferpool of requests keeps a ref */
+ buf = gst_buffer_make_writable (buf);
+
if (!gst_buffer_map (buf, &info, GST_MAP_READWRITE))
return FALSE;
gst_buffer_unmap (buf, &info);
}
+ *bufptr = buf;
return TRUE;
}
}
static GstStructure *
-ks_video_format_to_structure (GUID subtype_guid, GUID format_guid)
+ks_video_format_to_structure (GUID subtype_guid, GUID format_guid,
+ gboolean * p_is_rgb)
{
GstStructure *structure = NULL;
const gchar *media_type = NULL, *format = NULL;
+ /* RGB formats can be bottom-up (upside down) DIB */
+ gboolean is_rgb = FALSE;
if (IsEqualGUID (&subtype_guid, &MEDIASUBTYPE_MJPG) || IsEqualGUID (&subtype_guid, &MEDIASUBTYPE_TVMJ) || /* FIXME: NOT tested */
IsEqualGUID (&subtype_guid, &MEDIASUBTYPE_WAKE) || /* FIXME: NOT tested */
} else if (IsEqualGUID (&subtype_guid, &MEDIASUBTYPE_RGB555)) {
media_type = "video/x-raw";
format = "RGB15";
+ is_rgb = TRUE;
} else if (IsEqualGUID (&subtype_guid, &MEDIASUBTYPE_RGB565)) {
media_type = "video/x-raw";
format = "RGB16";
+ is_rgb = TRUE;
} else if (IsEqualGUID (&subtype_guid, &MEDIASUBTYPE_RGB24)) {
- format = "BGR";
media_type = "video/x-raw";
+ format = "BGR";
+ is_rgb = TRUE;
} else if (IsEqualGUID (&subtype_guid, &MEDIASUBTYPE_RGB32)) {
media_type = "video/x-raw";
format = "BGRx";
+ is_rgb = TRUE;
} else if (IsEqualGUID (&subtype_guid, &MEDIASUBTYPE_ARGB32)) {
media_type = "video/x-raw";
format = "BGRA";
+ is_rgb = TRUE;
} else if (IsEqualGUID (&subtype_guid, &MEDIASUBTYPE_ARGB1555)) {
GST_WARNING ("Unsupported video format ARGB15555");
} else if (IsEqualGUID (&subtype_guid, &MEDIASUBTYPE_ARGB4444)) {
if (format) {
gst_structure_set (structure, "format", G_TYPE_STRING, format, NULL);
}
+ if (p_is_rgb) {
+ *p_is_rgb = is_rgb;
+ }
}
if (!structure) {
media_structure =
ks_video_format_to_structure (range->SubFormat,
- range->Specifier);
+ range->Specifier, &entry->is_rgb);
if (media_structure == NULL) {
g_warning ("ks_video_format_to_structure returned NULL");
/* RGB formats */
structure =
ks_video_append_var_video_fields (ks_video_format_to_structure
- (MEDIASUBTYPE_RGB555, FORMAT_VideoInfo));
+ (MEDIASUBTYPE_RGB555, FORMAT_VideoInfo, NULL));
gst_caps_append_structure (caps, structure);
structure =
ks_video_append_var_video_fields (ks_video_format_to_structure
- (MEDIASUBTYPE_RGB565, FORMAT_VideoInfo));
+ (MEDIASUBTYPE_RGB565, FORMAT_VideoInfo, NULL));
gst_caps_append_structure (caps, structure);
structure =
ks_video_append_var_video_fields (ks_video_format_to_structure
- (MEDIASUBTYPE_RGB24, FORMAT_VideoInfo));
+ (MEDIASUBTYPE_RGB24, FORMAT_VideoInfo, NULL));
gst_caps_append_structure (caps, structure);
structure =
ks_video_append_var_video_fields (ks_video_format_to_structure
- (MEDIASUBTYPE_RGB32, FORMAT_VideoInfo));
+ (MEDIASUBTYPE_RGB32, FORMAT_VideoInfo, NULL));
gst_caps_append_structure (caps, structure);
/* YUV formats */
/* Other formats */
structure =
ks_video_append_var_video_fields (ks_video_format_to_structure
- (MEDIASUBTYPE_MJPG, FORMAT_VideoInfo));
+ (MEDIASUBTYPE_MJPG, FORMAT_VideoInfo, NULL));
gst_caps_append_structure (caps, structure);
structure =
ks_video_append_var_video_fields (ks_video_format_to_structure
- (MEDIASUBTYPE_dvsd, FORMAT_VideoInfo));
+ (MEDIASUBTYPE_dvsd, FORMAT_VideoInfo, NULL));
gst_caps_append_structure (caps, structure);
structure = /* no variable video fields (width, height, framerate) */
- ks_video_format_to_structure (MEDIASUBTYPE_dvsd, FORMAT_DvInfo);
+ ks_video_format_to_structure (MEDIASUBTYPE_dvsd, FORMAT_DvInfo, NULL);
gst_caps_append_structure (caps, structure);
}