From d1b3b19088c3921f1f1b07e7198700864bb35b5e Mon Sep 17 00:00:00 2001 From: =?utf8?q?St=C3=A9phane=20Cerveau?= Date: Mon, 2 Sep 2019 14:52:53 +0200 Subject: [PATCH] dash: add set/get property for nodes Add a way to set/get properties for given nodes: - root - baseurl - representation --- ext/dash/gstmpdadaptationsetnode.c | 55 +++++++++ ext/dash/gstmpdbaseurlnode.c | 69 +++++++++++ ext/dash/gstmpdmultsegmentbasenode.c | 56 +++++++++ ext/dash/gstmpdperiodnode.c | 85 +++++++++++++ ext/dash/gstmpdrepresentationbasenode.c | 183 ++++++++++++++++++++++++++++ ext/dash/gstmpdrepresentationnode.c | 63 ++++++++++ ext/dash/gstmpdrootnode.c | 203 +++++++++++++++++++++++++++++++- ext/dash/gstmpdrootnode.h | 1 + ext/dash/gstmpdsegmenttemplatenode.c | 75 ++++++++++++ ext/dash/gstmpdsegmenturlnode.c | 44 +++++++ ext/dash/gstmpdutctimingnode.c | 9 +- 11 files changed, 835 insertions(+), 8 deletions(-) diff --git a/ext/dash/gstmpdadaptationsetnode.c b/ext/dash/gstmpdadaptationsetnode.c index 5d2ed9d..504a846 100644 --- a/ext/dash/gstmpdadaptationsetnode.c +++ b/ext/dash/gstmpdadaptationsetnode.c @@ -24,9 +24,53 @@ G_DEFINE_TYPE (GstMPDAdaptationSetNode, gst_mpd_adaptation_set_node, GST_TYPE_MPD_REPRESENTATION_BASE_NODE); +enum +{ + PROP_MPD_ADAPTATION_SET_0, + PROP_MPD_ADAPTATION_SET_ID, + PROP_MPD_ADAPTATION_SET_CONTENT_TYPE, +}; + /* GObject VMethods */ static void +gst_mpd_adaptation_set_node_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstMPDAdaptationSetNode *self = GST_MPD_ADAPTATION_SET_NODE (object); + switch (prop_id) { + case PROP_MPD_ADAPTATION_SET_ID: + self->id = g_value_get_int (value); + break; + case PROP_MPD_ADAPTATION_SET_CONTENT_TYPE: + g_free (self->contentType); + self->contentType = g_value_dup_string (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_mpd_adaptation_set_node_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstMPDAdaptationSetNode *self = GST_MPD_ADAPTATION_SET_NODE (object); + switch (prop_id) { + case PROP_MPD_ADAPTATION_SET_ID: + g_value_set_int (value, self->id); + break; + case PROP_MPD_ADAPTATION_SET_CONTENT_TYPE: + g_value_set_string (value, self->contentType); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void gst_mpd_adaptation_set_node_finalize (GObject * object) { GstMPDAdaptationSetNode *self = GST_MPD_ADAPTATION_SET_NODE (object); @@ -157,8 +201,19 @@ gst_mpd_adaptation_set_node_class_init (GstMPDAdaptationSetNodeClass * klass) m_klass = GST_MPD_NODE_CLASS (klass); object_class->finalize = gst_mpd_adaptation_set_node_finalize; + object_class->set_property = gst_mpd_adaptation_set_node_set_property; + object_class->get_property = gst_mpd_adaptation_set_node_get_property; m_klass->get_xml_node = gst_mpd_adaptation_set_get_xml_node; + + g_object_class_install_property (object_class, PROP_MPD_ADAPTATION_SET_ID, + g_param_spec_int ("id", "id", + "adaptation set id", 0, G_MAXINT, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, + PROP_MPD_ADAPTATION_SET_CONTENT_TYPE, g_param_spec_string ("content-type", + "content type", "content type of the adaptation set", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void diff --git a/ext/dash/gstmpdbaseurlnode.c b/ext/dash/gstmpdbaseurlnode.c index 53043ed..6519272 100644 --- a/ext/dash/gstmpdbaseurlnode.c +++ b/ext/dash/gstmpdbaseurlnode.c @@ -23,9 +23,62 @@ G_DEFINE_TYPE (GstMPDBaseURLNode, gst_mpd_baseurl_node, GST_TYPE_MPD_NODE); +enum +{ + PROP_MPD_BASEURL_0, + PROP_MPD_BASEURL_URL, + PROP_MPD_BASEURL_SERVICE_LOCATION, + PROP_MPD_BASEURL_BYTE_RANGE, +}; + /* GObject VMethods */ static void +gst_mpd_baseurl_node_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstMPDBaseURLNode *self = GST_MPD_BASEURL_NODE (object); + switch (prop_id) { + case PROP_MPD_BASEURL_URL: + g_free (self->baseURL); + self->baseURL = g_value_dup_string (value); + break; + case PROP_MPD_BASEURL_SERVICE_LOCATION: + g_free (self->serviceLocation); + self->serviceLocation = g_value_dup_string (value); + break; + case PROP_MPD_BASEURL_BYTE_RANGE: + g_free (self->byteRange); + self->byteRange = g_value_dup_string (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_mpd_baseurl_node_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstMPDBaseURLNode *self = GST_MPD_BASEURL_NODE (object); + switch (prop_id) { + case PROP_MPD_BASEURL_URL: + g_value_set_string (value, self->baseURL); + break; + case PROP_MPD_BASEURL_SERVICE_LOCATION: + g_value_set_string (value, self->serviceLocation); + break; + case PROP_MPD_BASEURL_BYTE_RANGE: + g_value_set_string (value, self->byteRange); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void gst_mpd_baseurl_node_finalize (GObject * object) { GstMPDBaseURLNode *self = GST_MPD_BASEURL_NODE (object); @@ -71,8 +124,24 @@ gst_mpd_baseurl_node_class_init (GstMPDBaseURLNodeClass * klass) m_klass = GST_MPD_NODE_CLASS (klass); object_class->finalize = gst_mpd_baseurl_node_finalize; + object_class->set_property = gst_mpd_baseurl_node_set_property; + object_class->get_property = gst_mpd_baseurl_node_get_property; m_klass->get_xml_node = gst_mpd_baseurl_get_xml_node; + + g_object_class_install_property (object_class, PROP_MPD_BASEURL_URL, + g_param_spec_string ("url", "base url", + "url of the base url", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, + PROP_MPD_BASEURL_SERVICE_LOCATION, + g_param_spec_string ("service-location", "service location", + "service location", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, PROP_MPD_BASEURL_BYTE_RANGE, + g_param_spec_string ("byte-range", "byte range", "byte range", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + } static void diff --git a/ext/dash/gstmpdmultsegmentbasenode.c b/ext/dash/gstmpdmultsegmentbasenode.c index 349bfa1..840b508 100644 --- a/ext/dash/gstmpdmultsegmentbasenode.c +++ b/ext/dash/gstmpdmultsegmentbasenode.c @@ -24,9 +24,52 @@ G_DEFINE_TYPE (GstMPDMultSegmentBaseNode, gst_mpd_mult_segment_base_node, GST_TYPE_MPD_NODE); +enum +{ + PROP_MPD_MULT_SEGMENT_BASE_0 = 100, + PROP_MPD_MULT_SEGMENT_BASE_DURATION, + PROP_MPD_MULT_SEGMENT_BASE_START_NUMBER, +}; + /* GObject VMethods */ static void +gst_mpd_mult_segment_base_node_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstMPDMultSegmentBaseNode *self = GST_MPD_MULT_SEGMENT_BASE_NODE (object); + switch (prop_id) { + case PROP_MPD_MULT_SEGMENT_BASE_DURATION: + self->duration = g_value_get_uint (value); + break; + case PROP_MPD_MULT_SEGMENT_BASE_START_NUMBER: + self->startNumber = g_value_get_uint (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_mpd_mult_segment_base_node_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstMPDMultSegmentBaseNode *self = GST_MPD_MULT_SEGMENT_BASE_NODE (object); + switch (prop_id) { + case PROP_MPD_MULT_SEGMENT_BASE_DURATION: + g_value_set_uint (value, self->duration); + break; + case PROP_MPD_MULT_SEGMENT_BASE_START_NUMBER: + g_value_set_uint (value, self->startNumber); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void gst_mpd_mult_segment_base_node_finalize (GObject * object) { GstMPDMultSegmentBaseNode *self = GST_MPD_MULT_SEGMENT_BASE_NODE (object); @@ -73,6 +116,19 @@ gst_mpd_mult_segment_base_node_class_init (GstMPDMultSegmentBaseNodeClass * object_class = G_OBJECT_CLASS (klass); object_class->finalize = gst_mpd_mult_segment_base_node_finalize; + object_class->set_property = gst_mpd_mult_segment_base_node_set_property; + object_class->get_property = gst_mpd_mult_segment_base_node_get_property; + + g_object_class_install_property (object_class, + PROP_MPD_MULT_SEGMENT_BASE_DURATION, g_param_spec_uint ("duration", + "duration", "duration of segment", 0, G_MAXINT, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (object_class, + PROP_MPD_MULT_SEGMENT_BASE_START_NUMBER, + g_param_spec_uint ("start-number", "start number", + "start number in the segment list", 0, G_MAXINT, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void diff --git a/ext/dash/gstmpdperiodnode.c b/ext/dash/gstmpdperiodnode.c index 0b67fc7..7b18b9f 100644 --- a/ext/dash/gstmpdperiodnode.c +++ b/ext/dash/gstmpdperiodnode.c @@ -22,9 +22,68 @@ #include "gstmpdparser.h" G_DEFINE_TYPE (GstMPDPeriodNode, gst_mpd_period_node, GST_TYPE_MPD_NODE); + +enum +{ + PROP_MPD_PERIOD_0, + PROP_MPD_PERIOD_ID, + PROP_MPD_PERIOD_START, + PROP_MPD_PERIOD_DURATION, + PROP_MPD_PERIOD_BITSTREAM_SWITCHING, +}; + /* GObject VMethods */ static void +gst_mpd_period_node_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstMPDPeriodNode *self = GST_MPD_PERIOD_NODE (object); + switch (prop_id) { + case PROP_MPD_PERIOD_ID: + g_free (self->id); + self->id = g_value_dup_string (value); + break; + case PROP_MPD_PERIOD_START: + self->start = g_value_get_uint64 (value); + break; + case PROP_MPD_PERIOD_DURATION: + self->duration = g_value_get_uint64 (value); + break; + case PROP_MPD_PERIOD_BITSTREAM_SWITCHING: + self->bitstreamSwitching = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_mpd_period_node_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstMPDPeriodNode *self = GST_MPD_PERIOD_NODE (object); + switch (prop_id) { + case PROP_MPD_PERIOD_ID: + g_value_set_string (value, self->id); + break; + case PROP_MPD_PERIOD_START: + g_value_set_uint64 (value, self->start); + break; + case PROP_MPD_PERIOD_DURATION: + g_value_set_uint64 (value, self->duration); + break; + case PROP_MPD_PERIOD_BITSTREAM_SWITCHING: + g_value_set_boolean (value, self->bitstreamSwitching); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void gst_mpd_period_node_finalize (GObject * object) { GstMPDPeriodNode *self = GST_MPD_PERIOD_NODE (object); @@ -90,12 +149,38 @@ gst_mpd_period_node_class_init (GstMPDPeriodNodeClass * klass) GObjectClass *object_class; GstMPDNodeClass *m_klass; + object_class = G_OBJECT_CLASS (klass); m_klass = GST_MPD_NODE_CLASS (klass); object_class->finalize = gst_mpd_period_node_finalize; + object_class->set_property = gst_mpd_period_node_set_property; + object_class->get_property = gst_mpd_period_node_get_property; m_klass->get_xml_node = gst_mpd_period_get_xml_node; + + g_object_class_install_property (object_class, PROP_MPD_PERIOD_ID, + g_param_spec_string ("id", "id", + "unique id for period", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (object_class, PROP_MPD_PERIOD_START, + g_param_spec_uint64 ("start", "Period start", + "Period start", + 0, G_MAXUINT64, 0, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + g_object_class_install_property (object_class, PROP_MPD_PERIOD_DURATION, + g_param_spec_uint64 ("duration", "period duration", + "Period duration", + 0, G_MAXUINT64, 0, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + + g_object_class_install_property (object_class, + PROP_MPD_PERIOD_BITSTREAM_SWITCHING, + g_param_spec_boolean ("bitstream-switching", "Bitstream switching", + "Bitstream switching", FALSE, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); } static void diff --git a/ext/dash/gstmpdrepresentationbasenode.c b/ext/dash/gstmpdrepresentationbasenode.c index 29e43d3..cd07443 100644 --- a/ext/dash/gstmpdrepresentationbasenode.c +++ b/ext/dash/gstmpdrepresentationbasenode.c @@ -24,9 +24,167 @@ G_DEFINE_TYPE (GstMPDRepresentationBaseNode, gst_mpd_representation_base_node, GST_TYPE_MPD_NODE); +enum +{ + PROP_MPD_REPRESENTATION_BASE_0 = 100, + PROP_MPD_REPRESENTATION_BASE_PROFILES, + PROP_MPD_REPRESENTATION_BASE_WIDTH, + PROP_MPD_REPRESENTATION_BASE_HEIGHT, + PROP_MPD_REPRESENTATION_BASE_SAR, + PROP_MPD_REPRESENTATION_BASE_MIN_FRAME_RATE, + PROP_MPD_REPRESENTATION_BASE_MAX_FRAME_RATE, + PROP_MPD_REPRESENTATION_BASE_FRAME_RATE, + PROP_MPD_REPRESENTATION_BASE_AUDIO_SAMPLING_RATE, + PROP_MPD_REPRESENTATION_BASE_MIMETYPE, + PROP_MPD_REPRESENTATION_BASE_SEGMENT_PROFILES, + PROP_MPD_REPRESENTATION_BASE_CODECS, + PROP_MPD_REPRESENTATION_BASE_MAX_SAP_PERIOD, + PROP_MPD_REPRESENTATION_BASE_START_WITH_SAP, + PROP_MPD_REPRESENTATION_BASE_MAX_PLAYOUT_RATE, + PROP_MPD_REPRESENTATION_BASE_CODING_DEPENDENCY, + PROP_MPD_REPRESENTATION_BASE_SCAN_TYPE, +}; + /* GObject VMethods */ static void +gst_mpd_representation_base_node_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstMPDRepresentationBaseNode *self = + GST_MPD_REPRESENTATION_BASE_NODE (object); + switch (prop_id) { + case PROP_MPD_REPRESENTATION_BASE_PROFILES: + g_free (self->profiles); + self->profiles = g_value_dup_string (value); + break; + case PROP_MPD_REPRESENTATION_BASE_WIDTH: + self->width = g_value_get_uint (value); + break; + case PROP_MPD_REPRESENTATION_BASE_HEIGHT: + self->height = g_value_get_uint (value); + break; + case PROP_MPD_REPRESENTATION_BASE_SAR: + g_slice_free (GstXMLRatio, self->sar); + self->sar = gst_xml_helper_clone_ratio (g_value_get_pointer (value)); + break; + case PROP_MPD_REPRESENTATION_BASE_MIN_FRAME_RATE: + g_slice_free (GstXMLFrameRate, self->minFrameRate); + self->minFrameRate = + gst_xml_helper_clone_frame_rate (g_value_get_pointer (value)); + break; + case PROP_MPD_REPRESENTATION_BASE_MAX_FRAME_RATE: + g_slice_free (GstXMLFrameRate, self->maxFrameRate); + self->maxFrameRate = + gst_xml_helper_clone_frame_rate (g_value_get_pointer (value)); + break; + case PROP_MPD_REPRESENTATION_BASE_FRAME_RATE: + g_slice_free (GstXMLFrameRate, self->frameRate); + self->frameRate = + gst_xml_helper_clone_frame_rate (g_value_get_pointer (value)); + break; + case PROP_MPD_REPRESENTATION_BASE_AUDIO_SAMPLING_RATE: + g_free (self->audioSamplingRate); + self->audioSamplingRate = + g_strdup_printf ("%u", g_value_get_uint (value)); + break; + case PROP_MPD_REPRESENTATION_BASE_MIMETYPE: + g_free (self->mimeType); + self->mimeType = g_value_dup_string (value); + break; + case PROP_MPD_REPRESENTATION_BASE_SEGMENT_PROFILES: + g_free (self->segmentProfiles); + self->segmentProfiles = g_value_dup_string (value); + break; + case PROP_MPD_REPRESENTATION_BASE_CODECS: + g_free (self->codecs); + self->codecs = g_value_dup_string (value); + break; + case PROP_MPD_REPRESENTATION_BASE_MAX_SAP_PERIOD: + self->maximumSAPPeriod = g_value_get_double (value); + break; + case PROP_MPD_REPRESENTATION_BASE_START_WITH_SAP: + self->startWithSAP = g_value_get_int (value); + break; + case PROP_MPD_REPRESENTATION_BASE_MAX_PLAYOUT_RATE: + self->maxPlayoutRate = g_value_get_double (value); + break; + case PROP_MPD_REPRESENTATION_BASE_CODING_DEPENDENCY: + self->codingDependency = g_value_get_boolean (value); + break; + case PROP_MPD_REPRESENTATION_BASE_SCAN_TYPE: + g_free (self->scanType); + self->scanType = g_value_dup_string (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_mpd_representation_base_node_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstMPDRepresentationBaseNode *self = + GST_MPD_REPRESENTATION_BASE_NODE (object); + switch (prop_id) { + case PROP_MPD_REPRESENTATION_BASE_PROFILES: + g_value_set_string (value, self->profiles); + break; + case PROP_MPD_REPRESENTATION_BASE_WIDTH: + g_value_set_uint (value, self->width); + break; + case PROP_MPD_REPRESENTATION_BASE_HEIGHT: + g_value_set_uint (value, self->height); + break; + case PROP_MPD_REPRESENTATION_BASE_SAR: + g_value_set_pointer (value, self->sar); + break; + case PROP_MPD_REPRESENTATION_BASE_MIN_FRAME_RATE: + g_value_set_pointer (value, self->minFrameRate); + break; + case PROP_MPD_REPRESENTATION_BASE_MAX_FRAME_RATE: + g_value_set_pointer (value, self->maxFrameRate); + break; + case PROP_MPD_REPRESENTATION_BASE_FRAME_RATE: + g_value_set_pointer (value, self->frameRate); + break; + case PROP_MPD_REPRESENTATION_BASE_AUDIO_SAMPLING_RATE: + g_value_set_uint (value, atoi (self->audioSamplingRate)); + break; + case PROP_MPD_REPRESENTATION_BASE_MIMETYPE: + g_value_set_string (value, self->mimeType); + break; + case PROP_MPD_REPRESENTATION_BASE_SEGMENT_PROFILES: + g_value_set_string (value, self->segmentProfiles); + break; + case PROP_MPD_REPRESENTATION_BASE_CODECS: + g_value_set_string (value, self->codecs); + break; + case PROP_MPD_REPRESENTATION_BASE_MAX_SAP_PERIOD: + g_value_set_double (value, self->maximumSAPPeriod); + break; + case PROP_MPD_REPRESENTATION_BASE_START_WITH_SAP: + g_value_set_int (value, self->startWithSAP); + break; + case PROP_MPD_REPRESENTATION_BASE_MAX_PLAYOUT_RATE: + g_value_set_double (value, self->maxPlayoutRate); + break; + case PROP_MPD_REPRESENTATION_BASE_CODING_DEPENDENCY: + g_value_set_boolean (value, self->codingDependency); + self->codingDependency = g_value_get_boolean (value); + break; + case PROP_MPD_REPRESENTATION_BASE_SCAN_TYPE: + g_value_set_string (value, self->scanType); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void gst_mpd_representation_base_node_finalize (GObject * object) { GstMPDRepresentationBaseNode *self = @@ -126,6 +284,31 @@ gst_mpd_representation_base_node_class_init (GstMPDRepresentationBaseNodeClass * object_class = G_OBJECT_CLASS (klass); object_class->finalize = gst_mpd_representation_base_node_finalize; + object_class->set_property = gst_mpd_representation_base_node_set_property; + object_class->get_property = gst_mpd_representation_base_node_get_property; + + + g_object_class_install_property (object_class, + PROP_MPD_REPRESENTATION_BASE_WIDTH, g_param_spec_uint ("width", + "width", "representation width", 0, G_MAXUINT, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, + PROP_MPD_REPRESENTATION_BASE_HEIGHT, g_param_spec_uint ("height", + "height", "representation height", 0, G_MAXUINT, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, + PROP_MPD_REPRESENTATION_BASE_MIMETYPE, g_param_spec_string ("mime-type", + "mimetype", "representation mimetype", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, + PROP_MPD_REPRESENTATION_BASE_CODECS, g_param_spec_string ("codecs", + "codecs", "representation codec", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, + PROP_MPD_REPRESENTATION_BASE_AUDIO_SAMPLING_RATE, + g_param_spec_uint ("audio-sampling-rate", "audio sampling rate", + "representation audio sampling rate", 0, G_MAXUINT, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void diff --git a/ext/dash/gstmpdrepresentationnode.c b/ext/dash/gstmpdrepresentationnode.c index 6b583f0..151e05a 100644 --- a/ext/dash/gstmpdrepresentationnode.c +++ b/ext/dash/gstmpdrepresentationnode.c @@ -24,9 +24,60 @@ G_DEFINE_TYPE (GstMPDRepresentationNode, gst_mpd_representation_node, GST_TYPE_MPD_REPRESENTATION_BASE_NODE); +enum +{ + PROP_MPD_REPRESENTATION_0, + PROP_MPD_REPRESENTATION_ID, + PROP_MPD_REPRESENTATION_BANDWIDTH, + PROP_MPD_REPRESENTATION_QUALITY_RANKING, +}; + /* GObject VMethods */ static void +gst_mpd_representation_node_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstMPDRepresentationNode *self = GST_MPD_REPRESENTATION_NODE (object); + switch (prop_id) { + case PROP_MPD_REPRESENTATION_ID: + g_free (self->id); + self->id = g_value_dup_string (value); + break; + case PROP_MPD_REPRESENTATION_BANDWIDTH: + self->bandwidth = g_value_get_uint (value); + break; + case PROP_MPD_REPRESENTATION_QUALITY_RANKING: + self->qualityRanking = g_value_get_uint (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_mpd_representation_node_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstMPDRepresentationNode *self = GST_MPD_REPRESENTATION_NODE (object); + switch (prop_id) { + case PROP_MPD_REPRESENTATION_ID: + g_value_set_string (value, self->id); + break; + case PROP_MPD_REPRESENTATION_BANDWIDTH: + g_value_set_uint (value, self->bandwidth); + break; + case PROP_MPD_REPRESENTATION_QUALITY_RANKING: + g_value_set_uint (value, self->qualityRanking); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void gst_mpd_representation_node_finalize (GObject * object) { GstMPDRepresentationNode *self = GST_MPD_REPRESENTATION_NODE (object); @@ -102,8 +153,20 @@ gst_mpd_representation_node_class_init (GstMPDRepresentationNodeClass * klass) m_klass = GST_MPD_NODE_CLASS (klass); object_class->finalize = gst_mpd_representation_node_finalize; + object_class->set_property = gst_mpd_representation_node_set_property; + object_class->get_property = gst_mpd_representation_node_get_property; m_klass->get_xml_node = gst_mpd_representation_get_xml_node; + + g_object_class_install_property (object_class, + PROP_MPD_REPRESENTATION_BANDWIDTH, g_param_spec_uint ("bandwidth", + "bandwidth", "representation bandwidth", 0, G_MAXUINT, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, + PROP_MPD_REPRESENTATION_QUALITY_RANKING, + g_param_spec_uint ("quality-ranking", "quality ranking", + "representation quality ranking", 0, G_MAXUINT, 0, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void diff --git a/ext/dash/gstmpdrootnode.c b/ext/dash/gstmpdrootnode.c index 815c421..bb8acda 100644 --- a/ext/dash/gstmpdrootnode.c +++ b/ext/dash/gstmpdrootnode.c @@ -23,9 +23,145 @@ G_DEFINE_TYPE (GstMPDRootNode, gst_mpd_root_node, GST_TYPE_MPD_NODE); +enum +{ + PROP_MPD_ROOT_0, + PROP_MPD_ROOT_DEFAULT_NAMESPACE, + PROP_MPD_ROOT_NAMESPACE_XSI, + PROP_MPD_ROOT_NAMESPACE_EXT, + PROP_MPD_ROOT_SCHEMA_LOCATION, + PROP_MPD_ROOT_ID, + PROP_MPD_ROOT_PROFILES, + PROP_MPD_ROOT_TYPE, + PROP_MPD_ROOT_PUBLISH_TIME, + PROP_MPD_ROOT_AVAILABILTY_START_TIME, + PROP_MPD_ROOT_AVAILABILTY_END_TIME, + PROP_MPD_ROOT_MEDIA_PRESENTATION_DURATION, + PROP_MPD_ROOT_MINIMUM_UPDATE_PERIOD, + PROP_MPD_ROOT_MIN_BUFFER_TIME, + PROP_MPD_ROOT_TIMESHIFT_BUFFER_DEPTH, + PROP_MPD_ROOT_SUGGESTED_PRESENTATION_DELAY, + PROP_MPD_ROOT_MAX_SEGMENT_DURATION, + PROP_MPD_ROOT_MAX_SUBSEGMENT_DURATION, +}; + /* GObject VMethods */ static void +gst_mpd_root_node_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstMPDRootNode *self = GST_MPD_ROOT_NODE (object); + switch (prop_id) { + case PROP_MPD_ROOT_DEFAULT_NAMESPACE: + g_free (self->default_namespace); + self->default_namespace = g_value_dup_string (value); + break; + case PROP_MPD_ROOT_NAMESPACE_XSI: + g_free (self->namespace_xsi); + self->namespace_xsi = g_value_dup_string (value); + break; + case PROP_MPD_ROOT_NAMESPACE_EXT: + g_free (self->namespace_ext); + self->namespace_ext = g_value_dup_string (value); + break; + case PROP_MPD_ROOT_SCHEMA_LOCATION: + g_free (self->schemaLocation); + self->schemaLocation = g_value_dup_string (value); + break; + case PROP_MPD_ROOT_ID: + g_free (self->id); + self->id = g_value_dup_string (value); + break; + case PROP_MPD_ROOT_PROFILES: + g_free (self->profiles); + self->profiles = g_value_dup_string (value); + break; + case PROP_MPD_ROOT_TYPE: + self->type = (GstMPDFileType) g_value_get_int (value); + break; + case PROP_MPD_ROOT_AVAILABILTY_START_TIME: + if (self->availabilityStartTime) + gst_date_time_unref (self->availabilityStartTime); + self->availabilityStartTime = g_value_get_boxed (value); + break; + case PROP_MPD_ROOT_AVAILABILTY_END_TIME: + if (self->availabilityEndTime) + gst_date_time_unref (self->availabilityEndTime); + self->availabilityEndTime = g_value_get_boxed (value); + break; + case PROP_MPD_ROOT_PUBLISH_TIME: + if (self->publishTime) + gst_date_time_unref (self->publishTime); + self->publishTime = g_value_get_boxed (value); + break; + case PROP_MPD_ROOT_MEDIA_PRESENTATION_DURATION: + self->mediaPresentationDuration = g_value_get_uint64 (value); + break; + case PROP_MPD_ROOT_MINIMUM_UPDATE_PERIOD: + self->minimumUpdatePeriod = g_value_get_uint64 (value); + break; + case PROP_MPD_ROOT_MIN_BUFFER_TIME: + self->minBufferTime = g_value_get_uint64 (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_mpd_root_node_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstMPDRootNode *self = GST_MPD_ROOT_NODE (object); + switch (prop_id) { + case PROP_MPD_ROOT_DEFAULT_NAMESPACE: + g_value_set_string (value, self->default_namespace); + break; + case PROP_MPD_ROOT_NAMESPACE_XSI: + g_value_set_string (value, self->namespace_xsi); + break; + case PROP_MPD_ROOT_NAMESPACE_EXT: + g_value_set_string (value, self->namespace_ext); + break; + case PROP_MPD_ROOT_SCHEMA_LOCATION: + g_value_set_string (value, self->schemaLocation); + break; + case PROP_MPD_ROOT_ID: + g_value_set_string (value, self->id); + break; + case PROP_MPD_ROOT_PROFILES: + g_value_set_string (value, self->profiles); + break; + case PROP_MPD_ROOT_TYPE: + g_value_set_int (value, self->type); + break; + case PROP_MPD_ROOT_AVAILABILTY_START_TIME: + g_value_set_boxed (value, self->availabilityStartTime); + break; + case PROP_MPD_ROOT_AVAILABILTY_END_TIME: + g_value_set_boxed (value, self->availabilityEndTime); + break; + case PROP_MPD_ROOT_PUBLISH_TIME: + g_value_set_boxed (value, self->publishTime); + break; + case PROP_MPD_ROOT_MEDIA_PRESENTATION_DURATION: + g_value_set_uint64 (value, self->mediaPresentationDuration); + break; + case PROP_MPD_ROOT_MINIMUM_UPDATE_PERIOD: + g_value_set_uint64 (value, self->minimumUpdatePeriod); + break; + case PROP_MPD_ROOT_MIN_BUFFER_TIME: + g_value_set_uint64 (value, self->minBufferTime); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void gst_mpd_root_node_finalize (GObject * object) { GstMPDRootNode *self = GST_MPD_ROOT_NODE (object); @@ -41,6 +177,8 @@ gst_mpd_root_node_finalize (GObject * object) gst_date_time_unref (self->availabilityStartTime); if (self->availabilityEndTime) gst_date_time_unref (self->availabilityEndTime); + if (self->publishTime) + gst_date_time_unref (self->publishTime); g_list_free_full (self->ProgramInfos, (GDestroyNotify) gst_mpd_program_information_node_free); @@ -88,6 +226,8 @@ gst_mpd_root_get_xml_node (GstMPDNode * node) gst_xml_helper_set_prop_date_time (root_xml_node, "availabilityEndTime", self->availabilityEndTime); + gst_xml_helper_set_prop_date_time (root_xml_node, "publishTime", + self->publishTime); if (self->mediaPresentationDuration) gst_xml_helper_set_prop_duration (root_xml_node, @@ -95,7 +235,7 @@ gst_mpd_root_get_xml_node (GstMPDNode * node) if (self->minimumUpdatePeriod) gst_xml_helper_set_prop_duration (root_xml_node, "minimumUpdatePeriod", self->minimumUpdatePeriod); - if (self->minimumUpdatePeriod) + if (self->minBufferTime) gst_xml_helper_set_prop_duration (root_xml_node, "minBufferTime", self->minBufferTime); if (self->timeShiftBufferDepth) @@ -148,13 +288,73 @@ gst_mpd_root_node_class_init (GstMPDRootNodeClass * klass) GObjectClass *object_class; GstMPDNodeClass *m_klass; + object_class = G_OBJECT_CLASS (klass); m_klass = GST_MPD_NODE_CLASS (klass); object_class->finalize = gst_mpd_root_node_finalize; + object_class->set_property = gst_mpd_root_node_set_property; + object_class->get_property = gst_mpd_root_node_get_property; m_klass->get_xml_buffer = gst_mpd_root_get_xml_buffer; m_klass->get_xml_node = gst_mpd_root_get_xml_node; + + g_object_class_install_property (object_class, + PROP_MPD_ROOT_DEFAULT_NAMESPACE, g_param_spec_string ("default-namespace", + "default namespace", "default namespace", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, PROP_MPD_ROOT_NAMESPACE_XSI, + g_param_spec_string ("namespace-xsi", "namespace xsi", "namespace xsi", + NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, PROP_MPD_ROOT_NAMESPACE_EXT, + g_param_spec_string ("namespace-ext", "namespace ext", "namespace ext", + NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, PROP_MPD_ROOT_SCHEMA_LOCATION, + g_param_spec_string ("schema-location", "schema location", + "schema location for period", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, PROP_MPD_ROOT_ID, + g_param_spec_string ("id", "id", "unique id for period", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, PROP_MPD_ROOT_PROFILES, + g_param_spec_string ("profiles", "profiles", "profiles", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, PROP_MPD_ROOT_TYPE, + g_param_spec_int ("type", "MPD type", + "MPD type", + GST_MPD_FILE_TYPE_STATIC, GST_MPD_FILE_TYPE_DYNAMIC, + GST_MPD_FILE_TYPE_STATIC, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); + g_object_class_install_property (object_class, + PROP_MPD_ROOT_AVAILABILTY_START_TIME, + g_param_spec_boxed ("availability-start-time", "Availability start time", + "MPD availability start time", GST_TYPE_DATE_TIME, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, + PROP_MPD_ROOT_AVAILABILTY_END_TIME, + g_param_spec_boxed ("availability-end-time", "Availability end time", + "MPD availability end time", GST_TYPE_DATE_TIME, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, + PROP_MPD_ROOT_PUBLISH_TIME, + g_param_spec_boxed ("publish-time", "publish time", + "MPD publish time", GST_TYPE_DATE_TIME, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, + PROP_MPD_ROOT_MEDIA_PRESENTATION_DURATION, + g_param_spec_uint64 ("media-presentation-duration", + "media presentation duration", "media presentation duration", 0, + G_MAXUINT64, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, + PROP_MPD_ROOT_MINIMUM_UPDATE_PERIOD, + g_param_spec_uint64 ("minimum-update-period", + "minimum update period", "minimum update period", 0, + G_MAXUINT64, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, + PROP_MPD_ROOT_MIN_BUFFER_TIME, + g_param_spec_uint64 ("min-buffer-time", "mininim buffer time", + "mininim buffer time", 0, + G_MAXUINT64, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void @@ -169,6 +369,7 @@ gst_mpd_root_node_init (GstMPDRootNode * self) self->type = GST_MPD_FILE_TYPE_STATIC; self->availabilityStartTime = NULL; self->availabilityEndTime = NULL; + self->publishTime = NULL; self->mediaPresentationDuration = 0; /* [ms] */ self->minimumUpdatePeriod = 0; /* [ms] */ self->minBufferTime = 2000; /* [ms] */ diff --git a/ext/dash/gstmpdrootnode.h b/ext/dash/gstmpdrootnode.h index 776e6a6..56b295c 100644 --- a/ext/dash/gstmpdrootnode.h +++ b/ext/dash/gstmpdrootnode.h @@ -41,6 +41,7 @@ struct _GstMPDRootNode GstMPDFileType type; GstDateTime *availabilityStartTime; GstDateTime *availabilityEndTime; + GstDateTime *publishTime; guint64 mediaPresentationDuration; /* [ms] */ guint64 minimumUpdatePeriod; /* [ms] */ guint64 minBufferTime; /* [ms] */ diff --git a/ext/dash/gstmpdsegmenttemplatenode.c b/ext/dash/gstmpdsegmenttemplatenode.c index ac2af44..2d3968e 100644 --- a/ext/dash/gstmpdsegmenttemplatenode.c +++ b/ext/dash/gstmpdsegmenttemplatenode.c @@ -24,9 +24,66 @@ G_DEFINE_TYPE (GstMPDSegmentTemplateNode, gst_mpd_segment_template_node, GST_TYPE_MPD_MULT_SEGMENT_BASE_NODE); +enum +{ + PROP_MPD_SEGMENT_TEMPLATE_0, + PROP_MPD_SEGMENT_TEMPLATE_MEDIA, + PROP_MPD_SEGMENT_TEMPLATE_INDEX, + PROP_MPD_SEGMENT_TEMPLATE_INITIALIZATION, + PROP_MPD_SEGMENT_TEMPLATE_BITSTREAM_SWITCHING, +}; + /* GObject VMethods */ static void +gst_mpd_segment_template_node_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstMPDSegmentTemplateNode *self = GST_MPD_SEGMENT_TEMPLATE_NODE (object); + switch (prop_id) { + case PROP_MPD_SEGMENT_TEMPLATE_MEDIA: + self->media = g_value_dup_string (value); + break; + case PROP_MPD_SEGMENT_TEMPLATE_INDEX: + self->index = g_value_dup_string (value); + break; + case PROP_MPD_SEGMENT_TEMPLATE_INITIALIZATION: + self->initialization = g_value_dup_string (value); + break; + case PROP_MPD_SEGMENT_TEMPLATE_BITSTREAM_SWITCHING: + self->bitstreamSwitching = g_value_dup_string (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_mpd_segment_template_node_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstMPDSegmentTemplateNode *self = GST_MPD_SEGMENT_TEMPLATE_NODE (object); + switch (prop_id) { + case PROP_MPD_SEGMENT_TEMPLATE_MEDIA: + g_value_set_string (value, self->media); + break; + case PROP_MPD_SEGMENT_TEMPLATE_INDEX: + g_value_set_string (value, self->index); + break; + case PROP_MPD_SEGMENT_TEMPLATE_INITIALIZATION: + g_value_set_string (value, self->initialization); + break; + case PROP_MPD_SEGMENT_TEMPLATE_BITSTREAM_SWITCHING: + g_value_set_string (value, self->bitstreamSwitching); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void gst_mpd_segment_template_node_finalize (GObject * object) { GstMPDSegmentTemplateNode *self = GST_MPD_SEGMENT_TEMPLATE_NODE (object); @@ -84,8 +141,26 @@ gst_mpd_segment_template_node_class_init (GstMPDSegmentTemplateNodeClass * m_klass = GST_MPD_NODE_CLASS (klass); object_class->finalize = gst_mpd_segment_template_node_finalize; + object_class->set_property = gst_mpd_segment_template_node_set_property; + object_class->get_property = gst_mpd_segment_template_node_get_property; m_klass->get_xml_node = gst_mpd_segment_template_get_xml_node; + + g_object_class_install_property (object_class, + PROP_MPD_SEGMENT_TEMPLATE_MEDIA, g_param_spec_string ("media", + "media", "media", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, + PROP_MPD_SEGMENT_TEMPLATE_INDEX, g_param_spec_string ("index", + "index", "index", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, + PROP_MPD_SEGMENT_TEMPLATE_INITIALIZATION, + g_param_spec_string ("initialization", "initialization", "initialization", + NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (object_class, + PROP_MPD_SEGMENT_TEMPLATE_BITSTREAM_SWITCHING, + g_param_spec_string ("bitstream-switching", "bitstream switching", + "bitstream switching", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void diff --git a/ext/dash/gstmpdsegmenturlnode.c b/ext/dash/gstmpdsegmenturlnode.c index 2a39091..ac13ec4 100644 --- a/ext/dash/gstmpdsegmenturlnode.c +++ b/ext/dash/gstmpdsegmenturlnode.c @@ -25,9 +25,46 @@ G_DEFINE_TYPE (GstMPDSegmentURLNode, gst_mpd_segment_url_node, GST_TYPE_MPD_NODE); +enum +{ + PROP_MPD_SEGMENT_URL_0, + PROP_MPD_SEGMENT_URL_MEDIA, +}; + /* GObject VMethods */ static void +gst_mpd_segment_url_node_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstMPDSegmentURLNode *self = GST_MPD_SEGMENT_URL_NODE (object); + switch (prop_id) { + case PROP_MPD_SEGMENT_URL_MEDIA: + g_free (self->media); + self->media = g_value_dup_string (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_mpd_segment_url_node_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstMPDSegmentURLNode *self = GST_MPD_SEGMENT_URL_NODE (object); + switch (prop_id) { + case PROP_MPD_SEGMENT_URL_MEDIA: + g_value_set_string (value, self->media); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void gst_mpd_segment_url_node_finalize (GObject * object) { GstMPDSegmentURLNode *self = GST_MPD_SEGMENT_URL_NODE (object); @@ -79,8 +116,15 @@ gst_mpd_segment_url_node_class_init (GstMPDSegmentURLNodeClass * klass) m_klass = GST_MPD_NODE_CLASS (klass); object_class->finalize = gst_mpd_segment_url_node_finalize; + object_class->set_property = gst_mpd_segment_url_node_set_property; + object_class->get_property = gst_mpd_segment_url_node_get_property; m_klass->get_xml_node = gst_mpd_segment_url_get_xml_node; + + g_object_class_install_property (object_class, + PROP_MPD_SEGMENT_URL_MEDIA, g_param_spec_string ("media", + "media", "media description", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void diff --git a/ext/dash/gstmpdutctimingnode.c b/ext/dash/gstmpdutctimingnode.c index a02c89c..09bd368 100644 --- a/ext/dash/gstmpdutctimingnode.c +++ b/ext/dash/gstmpdutctimingnode.c @@ -21,15 +21,8 @@ #include "gstmpdutctimingnode.h" #include "gstmpdparser.h" -enum -{ - PROP_MPD_UTCTIMING_0, -}; - G_DEFINE_TYPE (GstMPDUTCTimingNode, gst_mpd_utctiming_node, GST_TYPE_MPD_NODE); -/* GObject VMethods */ - static const struct GstMPDUTCTimingMethod gst_mpd_utctiming_methods[] = { {"urn:mpeg:dash:utc:ntp:2014", GST_MPD_UTCTIMING_TYPE_NTP}, {"urn:mpeg:dash:utc:sntp:2014", GST_MPD_UTCTIMING_TYPE_SNTP}, @@ -53,6 +46,8 @@ static const struct GstMPDUTCTimingMethod gst_mpd_utctiming_methods[] = { {NULL, 0} }; +/* GObject VMethods */ + static void gst_mpd_utctiming_node_finalize (GObject * object) { -- 2.7.4