PROP_START_DATE,
PROP_SERVICE_ACCOUNT_CREDENTIALS,
PROP_METADATA,
+ PROP_CONTENT_TYPE,
};
class GSWriteStream;
gboolean post_messages;
GstGsSinkNext next_file;
const gchar* content_type;
+ gchar* content_type_prop;
size_t nb_percent_format;
gboolean percent_s_is_first;
GstStructure* metadata;
(GParamFlags)(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
GST_PARAM_MUTABLE_READY)));
+ /**
+ * GstGsSink:content-type:
+ *
+ * The Content-Type of the object.
+ * If not set we use the name of the input caps.
+ *
+ * Since: 1.22
+ */
+ g_object_class_install_property(
+ gobject_class, PROP_CONTENT_TYPE,
+ g_param_spec_string(
+ "content-type", "Content-Type",
+ "The Content-Type of the object",
+ NULL,
+ (GParamFlags)(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
+ GST_PARAM_MUTABLE_READY)));
+
gobject_class->finalize = gst_gs_sink_finalize;
gstbasesink_class->start = GST_DEBUG_FUNCPTR(gst_gs_sink_start);
sink->start_date = NULL;
sink->next_file = DEFAULT_NEXT_FILE;
sink->content_type = NULL;
+ sink->content_type_prop = NULL;
sink->nb_percent_format = 0;
sink->percent_s_is_first = FALSE;
sink->start_date = NULL;
}
sink->content_type = NULL;
+ g_clear_pointer(&sink->content_type_prop, g_free);
g_clear_pointer(&sink->metadata, gst_structure_free);
G_OBJECT_CLASS(parent_class)->finalize(object);
g_clear_pointer(&sink->metadata, gst_structure_free);
sink->metadata = (GstStructure*)g_value_dup_boxed(value);
break;
+ case PROP_CONTENT_TYPE:
+ g_clear_pointer(&sink->content_type_prop, g_free);
+ sink->content_type_prop = g_value_dup_string(value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
case PROP_METADATA:
g_value_set_boxed(value, sink->metadata);
break;
+ case PROP_CONTENT_TYPE:
+ g_value_set_string(value, sink->content_type_prop);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
GstMapInfo map = {0};
gchar* object_name = NULL;
gchar* buffer_date = NULL;
+ const gchar* content_type;
if (!gst_buffer_map(buffer, &map, GST_MAP_READ))
return GST_FLOW_ERROR;
+ if (sink->content_type_prop)
+ content_type = sink->content_type_prop;
+ else
+ content_type = sink->content_type;
+
gcs::ObjectMetadata metadata =
- gcs::ObjectMetadata().set_content_type(sink->content_type);
+ gcs::ObjectMetadata().set_content_type(content_type);
if (sink->metadata) {
struct AddMetadataIter it = {sink, &metadata};
sink->content_type = gst_structure_get_name(s);
- GST_INFO_OBJECT(sink, "Content type: %s", sink->content_type);
+ /* TODO: we could automatically convert some caps such as 'video/quicktime,variant=iso' to 'video/mp4' */
+
+ GST_INFO_OBJECT(sink, "Content-Type: caps: %s property: %s", sink->content_type, sink->content_type_prop);
return TRUE;
}