|
- #ifndef _dash_parser_h_
- #define _dash_parser_h_
-
- #include "dash-proto.h"
- #include <stdint.h>
- #include <stddef.h>
-
- #ifdef __cplusplus
- extern "C" {
- #endif
-
- enum
- {
- DASH_SEGMENT_NONE = 0,
- DASH_SEGMENT_BASE,
- DASH_SEGMENT_LIST,
- DASH_SEGMENT_TEMPLATE,
- };
-
- // https://tools.ietf.org/html/rfc6838
- enum
- {
- DASH_MEDIA_UNKNOWN,
- DASH_MEDIA_FONT, // font
- DASH_MEDIA_TEXT, // text
- DASH_MEDIA_IMAGE, // image
- DASH_MEDIA_AUDIO, // audio
- DASH_MEDIA_VIDEO, // video
- DASH_MEDIA_APPLICATION, // application
- };
-
- // 5.3.9.4.4 Template-based Segment URL construction
- // @media, @index, @initialization, @bitstreamSwitching
- // 1. Either $Number$ or $Time$ may be used but not both at the same time.
- // 2. $SubNumber$ shall only be present if either $Number$ or $Time$ are present as well
- enum
- {
- DASH_TEMPLATE_UNKNOWN,
- DASH_TEMPLATE_REPRESENTATIONID, // Representation@id
- DASH_TEMPLATE_NUMBER,
- DASH_TEMPLATE_BANDWIDTH, // Representation@bandwidth
- DASH_TEMPLATE_TIME, // SegmentTimeline@t
- DASH_TEMPLATE_SUBNUMBER,
- };
-
- enum { DASH_SCAN_UNKNOWN = 0, DASH_SCAN_PROGRESSIVE, DASH_SCAN_INTERLACED, };
-
- struct dash_urltype_t
- {
- char* source_url;
- char* range;
- };
-
- // BaseURL
- struct dash_url_t
- {
- size_t count;
- struct
- {
- char* uri;
- char* service_location;
- char* byte_range;
- double availability_time_offset;
- int availability_time_complete; // boolean
- } *urls;
- };
-
- struct dash_event_t
- {
- uint64_t presentation_time;
- uint64_t duration;
- unsigned int id;
- char* message_data;
- };
-
- struct dash_event_stream_t
- {
- char* href;
- char* actuate; // default: onRequest
- char* scheme_id_uri; // SchemeIdUri
- char* value;
- unsigned int timescale;
-
- size_t event_count;
- struct dash_event_t* events;
- };
-
- struct dash_label_t
- {
- size_t count;
- struct
- {
- char* label;
- unsigned int id;
- char* lang;
- }*labels;
- };
-
- struct dash_program_information_t
- {
- char* lang;
- char* more_information;
-
- char* title;
- char* source;
- char* copyright;
- };
-
- struct dash_descriptor_t
- {
- size_t count;
- struct
- {
- char* scheme_uri;
- char* value;
- char* id;
- }* descs;
- };
-
- struct dash_metric_t
- {
- char* metrics;
-
- size_t range_count;
- struct
- {
- int64_t time;
- int64_t duration;
- }* ranges;
-
- struct dash_descriptor_t reportings;
- };
-
- struct dash_segment_url_t
- {
- char* media;
- char* media_range;
- char* index;
- char* index_range;
- };
-
- struct dash_segment_timeline_t
- {
- size_t count;
-
- struct
- {
- uint64_t t;
- uint64_t n; // specifies the Segment number of the first Segment in the series.
- uint64_t d; // Any @d value shall not exceed the value of MPD@maxSegmentDuration
- uint64_t k; // default 1
- int r; // default 0
- }* S;
- };
-
- struct dash_segment_t
- {
- int type; // DASH_SEGMENT_BASE/DASH_SEGMENT_LIST/DASH_SEGMENT_TEMPLATE
-
- // segment base
- unsigned int timescale;
- uint64_t presentation_time_offset;
- uint64_t presentation_duration;
- int64_t time_shift_buffer_depth;
- char* index_range;
- int index_range_exact; // 0-false, 1-true
- double availability_time_offset;
- int availability_time_complete;
- struct dash_urltype_t initialization; // Initialization
- struct dash_urltype_t representation_index; // RepresentationIndex
-
- // Multiple segment base
- uint64_t start_number;
- // All Segments within this Representation element have the same duration
- // unless it is the last Segment within the Period, which can be significantly shorter.
- unsigned int duration; // specifies the constant approximate Segment duration.
- struct dash_segment_timeline_t segment_timeline; // SegmentTimeline
- struct dash_urltype_t bitstream_switching; // BitstreamSwitching
-
- // segment list
- char* href;
- char* actuate; // default: onRequest
- size_t segment_url_count;
- struct dash_segment_url_t* segment_urls; // SegmentURL
-
- // segment template
- char* media;
- char* index;
- char* initialization_url; // initialization
- char* bitstream_switching_url;
- };
-
- struct dash_content_component_t
- {
- unsigned int id;
- char* lang;
- char* content_type;
- char* par;
- char* tag;
-
- struct dash_descriptor_t accessibilities; // Accessibility
- struct dash_descriptor_t roles; // Role
- struct dash_descriptor_t ratings; // Rating
- struct dash_descriptor_t viewpoints; // Viewpoint
- };
-
- struct dash_representation_base_t
- {
- char* profiles;
- unsigned int width;
- unsigned int height;
- char* sar;
- char* frame_rate;
- char* audio_sampling_rate;
- char* mime_type;
- char* segment_profiles;
- char* codecs;
- double maxmum_sap_period;
- char* start_with_sap;
- double max_playout_rate;
- int coding_dependency;
- int scan_type; // progressive, interlaced
- unsigned int selection_priority; // default 1
- int tag;
-
- struct dash_descriptor_t frame_packings; // FramePacking
- struct dash_descriptor_t audio_channel_configurations; // AudioChannelConfiguration
- struct dash_descriptor_t content_protections; // ContentProtection
- struct dash_descriptor_t essentials; // EssentialProperty
- struct dash_descriptor_t supplementals; // SupplementalProperty
-
- size_t inband_event_stream_count;
- struct dash_event_stream_t* inband_event_streams; // InbandEventStream
-
- size_t switching_count;
- struct
- {
- unsigned int interval;
- int type; // media, bitstream
- } *switchings; // Switching
-
- size_t random_access_count;
- struct
- {
- unsigned int interval;
- int type; // closed, open, gradual
- int64_t min_buffer_time;
- unsigned int bandwidth;
- } *random_accesses; // RandomAccess
-
- struct dash_label_t group_labels; // GroupLabel
- struct dash_label_t labels; // Label
- };
-
- struct dash_preselection_t
- {
- char* id;
- char* preselection_compoents;
- char* lang;
-
- struct dash_representation_base_t base;
-
- struct dash_descriptor_t accessibilities; // Accessibility
- struct dash_descriptor_t roles; // Role
- struct dash_descriptor_t ratings; // Rating
- struct dash_descriptor_t viewpoints; // Viewpoint
- };
-
- struct dash_subrepresentation_t
- {
- unsigned int level;
- unsigned int dependency_level;
- unsigned int bandwidth;
- char* content_component;
-
- struct dash_representation_t* parent;
- struct dash_representation_base_t base;
- };
-
- struct dash_representation_t
- {
- char* id;
- unsigned int bandwidth;
- unsigned int quality_ranking;
- char* dependncy_id;
- char* association_id;
- char* association_type;
- char* media_stream_structure_id;
-
- struct dash_adaptation_set_t* parent;
- struct dash_representation_base_t base;
-
- struct dash_url_t base_urls; // BaseURL
-
- size_t subrepresentation_count;
- struct dash_subrepresentation_t* subrepresentations; // SubRepresentation
-
- struct dash_segment_t segment;
- };
-
- struct dash_adaptation_set_t
- {
- char* href;
- char* actuate; // default: onRequest
- unsigned int id;
- unsigned int group;
- char* lang; // und
- char* content_type; // text/image/audio/video/application/font
- char* par; // n:m 16:9
- unsigned int min_bandwidth;
- unsigned int max_bandwidth;
- unsigned int min_width;
- unsigned int max_width;
- unsigned int min_height;
- unsigned int max_height;
- char* min_framerate; // n/m
- char* max_framerate;
- int segment_alignment; // 0-false, 1-true
- int subsegment_aligment; // 0-false, 1-true
- int subsegment_start_with_sap; // default 0
- int bitstream_switching; // 0-false, 1-true
-
- struct dash_period_t* parent;
- struct dash_representation_base_t base;
-
- struct dash_descriptor_t accessibilities; // Accessibility
- struct dash_descriptor_t roles; // Role
- struct dash_descriptor_t ratings; // Rating
- struct dash_descriptor_t viewpoints; // Viewpoint
-
- size_t content_component_count;
- struct dash_content_component_t* content_components; // ContentComponent
-
- struct dash_url_t base_urls; // BaseURL
-
- struct dash_segment_t segment;
-
- size_t representation_count;
- struct dash_representation_t* representations; // Representation
- };
-
- struct dash_period_t
- {
- char* href;
- char* actuate; // default: onRequest
- char* id;
- int64_t start; // start
- int64_t duration; // duration
- int bitstream_switching; // 0-false
-
- struct dash_mpd_t* parent;
- struct dash_url_t base_urls; // BaseURL
-
- struct dash_segment_t segment; // SegmentBase/SegmentList/SegmentTemplate
-
- struct dash_descriptor_t asset_identifier; // AssetIdentifier
-
- size_t event_stream_count;
- size_t event_stream_capacity;
- struct dash_event_stream_t* event_streams; // EventStream
-
- size_t adaptation_set_count;
- struct dash_adaptation_set_t* adaptation_sets; // AdaptationSet
-
- size_t subset_count;
- struct
- {
- char* contains;
- char* id;
- } *subsets; // SubSet
-
- struct dash_descriptor_t supplementals; // SupplementalProperty
-
- size_t empty_adaptation_set_count;
- struct dash_adaptation_set_t* empty_adaptation_sets; // EmptyAdaptationSet
-
- struct dash_label_t group_labels; // GroupLabel
-
- size_t preselection_count;
- struct dash_preselection_t* preselections; // Preselection
- };
-
- struct dash_mpd_t
- {
- int type; // presentation type: 0-static, 1-dynamic
- char* id;
- char* profiles; // profiles
- char* availability_start_time;
- char* availability_end_time;
- char* publish_time;
- int64_t media_presentation_duration; // mediaPresentationDuration, MPD total duration
- int64_t minimum_update_period; // minimumUpdatePeriod
- int64_t min_buffer_time; // minBufferTime
- int64_t time_shift_buffer_depth; // timeShiftBufferDepth
- int64_t suggested_presentation_delay; // suggestedPresentationDelay
- int64_t max_segment_duration; // maxSegmentDuration
- int64_t max_subsegment_duration; // maxSubsegmentDuration
- char* xsi; // xmlns:xsi
- char* xmlns; // xmlns
- char* schema_location; // xsi:schemaLocation
-
- size_t info_count;
- struct dash_program_information_t* infos; // ProgramInfomation
-
- struct dash_url_t urls; // BaseURL
-
- size_t location_count;
- char** locations; // Location
-
- size_t period_count;
- struct dash_period_t* periods; // Period
-
- size_t metric_count;
- struct dash_metric_t* metrics; // Metrics
-
- struct dash_descriptor_t essentials; // EssentialProperty
- struct dash_descriptor_t supplementals; // SupplementalProperty
- struct dash_descriptor_t timings; // UTCTming
- };
-
- /// Parse MPD(Media Presentation Description for MPEG-DASH ) manifest file
- /// @param[out] mpd mpd object(free by dash_mpd_free)
- /// @return 0-ok, other-error
- int dash_mpd_parse(struct dash_mpd_t** mpd, const char* data, size_t bytes);
-
- int dash_mpd_free(struct dash_mpd_t** mpd);
-
- /// @return -1-live, >=0-duration(ms), other-error
- int64_t dash_get_duration(const struct dash_mpd_t* mpd);
-
- /// Period
-
- /// location period by time
- /// @param[in] time from previous period end to current perid end, range: (period-m-end, period-n-end]
- /// @return >=0-period index, -1-if don't find, other-undefined
- int dash_period_find(const struct dash_mpd_t* mpd, int64_t time);
-
- /// @param[in] media DASH_MEDIA_AUDIO/DASH_MEDIA_VIDEO/xxx
- /// @param[in] id adaptation set id, 0 if unknown
- /// @param[in] group adaptation set group id, 0 if unknown
- /// @param[in] lang adaptation set lang, such as 'en'/'fr', NULL if don't care
- /// @param[in] codecs adaptation set codec type, such as 'avc1', NULL if don't care
- /// @return NULL if don't find any adaptation set
- const struct dash_adaptation_set_t* dash_period_select(const struct dash_period_t* period, int media, unsigned int id, unsigned int group, const char* lang, const char* codecs);
-
- /// Adaptation Set
-
- /// @return adaptation set media type DASH_MEDIA_AUDIO/DASH_MEDIA_VIDEO, DASH_MEDIA_UNKNOWN if unknown
- int dash_adaptation_set_media_type(const struct dash_adaptation_set_t* set);
-
- /// Priority: 1. selectionPriority; 2. qualityRanking; 3. bandwidth
- /// @return >=0-representation index, -1-error
- int dash_adaptation_set_best_representation(const struct dash_adaptation_set_t* set);
-
- /// Representation
-
- const struct dash_url_t* dash_representation_get_base_url(const struct dash_representation_t* representation);
-
- /// Get initialization segment url(MUST use with dash_representation_get_base_url)
- /// @return >0-ok with url length, =0-don't have initialization segment, <0-error
- int dash_representation_get_initialization(const struct dash_representation_t* representation, char* url, size_t size);
-
- /// Find segment by start time
- /// @param[in] time segment time, range: (previous segment end, segment start + duration)
- /// @return -1-not found, >=0-segment item index(index is not the startnumber)
- int dash_representation_find_segment(const struct dash_representation_t* representation, int64_t time);
-
- /// @return <0-error, >=0-segment count(INT_MAX for segment template)
- int dash_representation_segment_count(const struct dash_representation_t* representation);
-
- /// Get segment url(MUST use with dash_representation_get_base_url)
- /// @param[in] index segment index(!= start number)
- /// @param[out] number start number of representation
- /// @param[out] start start time of representation(MUST add period.start)
- /// @param[out] duration segment duration, 0 if unknown
- /// @param[out] range url range, NULL if don't have range
- /// @return >=0-ok with url length, <0-error
- int dash_representation_segment_url(const struct dash_representation_t* representation, int index, int64_t* number, int64_t* start, int64_t* duration, const char** range, char* url, size_t size);
-
- #ifdef __cplusplus
- }
- #endif
- #endif /* !_dash_parser_h_ */
|