bc422fc97c65f8c5781ecd6a8b66d15262ecacba
[platform/upstream/gstreamer.git] / subprojects / gst-plugins-bad / ext / dash / gstmpdclient.h
1 /* GStreamer
2  *
3  * Copyright (C) 2019 Collabora Ltd.
4  *   Author: Stéphane Cerveau <scerveau@collabora.com>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public
17  * License along with this library (COPYING); if not, write to the
18  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19  * Boston, MA 02111-1307, USA.
20  */
21 #ifndef __GST_MPDCLIENT_H__
22 #define __GST_MPDCLIENT_H__
23
24 #include "gstmpdparser.h"
25
26 G_BEGIN_DECLS
27
28 #define GST_TYPE_MPD_CLIENT gst_mpd_client_get_type ()
29 G_DECLARE_FINAL_TYPE (GstMPDClient, gst_mpd_client, GST, MPD_CLIENT, GstObject)
30
31 struct _GstMPDClient
32 {
33   GstObject     parent_instance;
34   GstMPDRootNode *mpd_root_node;              /* mpd root node */
35
36   GList *periods;                             /* list of GstStreamPeriod */
37   guint period_idx;                           /* index of current Period */
38
39   GList *active_streams;                      /* list of GstActiveStream */
40
41   guint update_failed_count;
42   gchar *mpd_uri;                             /* manifest file URI */
43   gchar *mpd_base_uri;                        /* base URI for resolving relative URIs.
44                                                * this will be different for redirects */
45
46   /* profiles */
47   gboolean profile_isoff_ondemand;
48
49   GstUriDownloader * downloader;
50 };
51
52 /* Basic initialization/deinitialization functions */
53
54 GstMPDClient *gst_mpd_client_new (void);
55 GstMPDClient *gst_mpd_client_new_static (void);
56
57 void gst_mpd_client_active_streams_free (GstMPDClient * client);
58 void gst_mpd_client_free (GstMPDClient * client);
59
60 /* main mpd parsing methods from xml data */
61 gboolean gst_mpd_client_parse (GstMPDClient * client, const gchar * data, gint size);
62
63 /* xml generator */
64 gboolean gst_mpd_client_get_xml_content (GstMPDClient * client, gchar ** data, gint * size);
65
66 void gst_mpd_client_set_uri_downloader (GstMPDClient * client, GstUriDownloader * download);
67 void  gst_mpd_client_check_profiles (GstMPDClient * client);
68 void gst_mpd_client_fetch_on_load_external_resources (GstMPDClient * client);
69
70 /* Streaming management */
71 gboolean gst_mpd_client_setup_media_presentation (GstMPDClient *client, GstClockTime time, gint period_index, const gchar *period_id);
72 gboolean gst_mpd_client_setup_streaming (GstMPDClient * client, GstMPDAdaptationSetNode * adapt_set);
73 gboolean gst_mpd_client_setup_representation (GstMPDClient *client, GstActiveStream *stream, GstMPDRepresentationNode *representation);
74
75 GstClockTime gst_mpd_client_get_next_fragment_duration (GstMPDClient * client, GstActiveStream * stream);
76 GstClockTime gst_mpd_client_get_media_presentation_duration (GstMPDClient *client);
77 GstClockTime gst_mpd_client_get_maximum_segment_duration (GstMPDClient * client);
78 gboolean gst_mpd_client_get_last_fragment_timestamp_end (GstMPDClient * client, guint stream_idx, GstClockTime * ts);
79 gboolean gst_mpd_client_get_next_fragment_timestamp (GstMPDClient * client, guint stream_idx, GstClockTime * ts);
80 gboolean gst_mpd_client_get_next_fragment (GstMPDClient *client, guint indexStream, GstMediaFragmentInfo * fragment);
81 gboolean gst_mpd_client_get_next_header (GstMPDClient *client, gchar **uri, guint stream_idx, gint64 * range_start, gint64 * range_end);
82 gboolean gst_mpd_client_get_next_header_index (GstMPDClient *client, gchar **uri, guint stream_idx, gint64 * range_start, gint64 * range_end);
83 gboolean gst_mpd_client_is_live (GstMPDClient * client);
84 gboolean gst_mpd_client_stream_seek (GstMPDClient * client, GstActiveStream * stream, gboolean forward, GstSeekFlags flags, GstClockTime ts, GstClockTime * final_ts);
85 gboolean gst_mpd_client_seek_to_time (GstMPDClient * client, GDateTime * time);
86 GstClockTime gst_mpd_client_get_stream_presentation_offset (GstMPDClient *client, guint stream_idx);
87 gchar** gst_mpd_client_get_utc_timing_sources (GstMPDClient *client, guint methods, GstMPDUTCTimingType *selected_method);
88 GstClockTime gst_mpd_client_get_period_start_time (GstMPDClient *client);
89
90 /* Period selection */
91 guint gst_mpd_client_get_period_index_at_time (GstMPDClient * client, GstDateTime * time);
92 gboolean gst_mpd_client_set_period_index (GstMPDClient *client, guint period_idx);
93 gboolean gst_mpd_client_set_period_id (GstMPDClient *client, const gchar * period_id);
94 guint gst_mpd_client_get_period_index (GstMPDClient *client);
95 const gchar *gst_mpd_client_get_period_id (GstMPDClient *client);
96 gboolean gst_mpd_client_has_next_period (GstMPDClient *client);
97 gboolean gst_mpd_client_has_previous_period (GstMPDClient * client);
98
99 /* Representation selection */
100 gint gst_mpd_client_get_rep_idx_with_max_bandwidth (GList *Representations, gint64 max_bandwidth, gint max_video_width, gint max_video_height, gint max_video_framerate_n, gint max_video_framerate_d);
101 gint gst_mpd_client_get_rep_idx_with_min_bandwidth (GList * Representations);
102
103 GstDateTime *
104 gst_mpd_client_get_availability_start_time (GstMPDClient * client);
105
106 /* URL management */
107 const gchar *gst_mpd_client_get_baseURL (GstMPDClient *client, guint indexStream);
108 gchar *gst_mpd_client_parse_baseURL (GstMPDClient * client, GstActiveStream * stream, gchar ** query);
109
110 /* Active stream */
111 guint gst_mpd_client_get_nb_active_stream (GstMPDClient *client);
112 GstActiveStream *gst_mpd_client_get_active_stream_by_index (GstMPDClient *client, guint stream_idx);
113 gboolean gst_mpd_client_active_stream_contains_subtitles (GstActiveStream * stream);
114
115 /* AdaptationSet */
116 guint gst_mpd_client_get_nb_adaptationSet (GstMPDClient *client);
117 GList * gst_mpd_client_get_adaptation_sets (GstMPDClient * client);
118
119 /* Segment */
120 gboolean gst_mpd_client_has_next_segment (GstMPDClient * client, GstActiveStream * stream, gboolean forward);
121 GstFlowReturn gst_mpd_client_advance_segment (GstMPDClient * client, GstActiveStream * stream, gboolean forward);
122 void gst_mpd_client_seek_to_first_segment (GstMPDClient * client);
123 GstDateTime *gst_mpd_client_get_next_segment_availability_start_time (GstMPDClient * client, GstActiveStream * stream);
124
125 /* Get audio/video stream parameters (caps, width, height, rate, number of channels) */
126 GstCaps * gst_mpd_client_get_stream_caps (GstActiveStream * stream);
127 gboolean gst_mpd_client_get_bitstream_switching_flag (GstActiveStream * stream);
128 guint gst_mpd_client_get_video_stream_width (GstActiveStream * stream);
129 guint gst_mpd_client_get_video_stream_height (GstActiveStream * stream);
130 gboolean gst_mpd_client_get_video_stream_framerate (GstActiveStream * stream, gint * fps_num, gint * fps_den);
131 guint gst_mpd_client_get_audio_stream_rate (GstActiveStream * stream);
132 guint gst_mpd_client_get_audio_stream_num_channels (GstActiveStream * stream);
133
134 /* Support multi language */
135 guint gst_mpd_client_get_list_and_nb_of_audio_language (GstMPDClient *client, GList **lang);
136
137 gint64 gst_mpd_client_calculate_time_difference (const GstDateTime * t1, const GstDateTime * t2);
138 GstDateTime *gst_mpd_client_add_time_difference (GstDateTime * t1, gint64 usecs);
139 gint64 gst_mpd_client_parse_default_presentation_delay(GstMPDClient * client, const gchar * default_presentation_delay);
140
141 /* profiles */
142 gboolean gst_mpd_client_has_isoff_ondemand_profile (GstMPDClient *client);
143
144 /* add/set node methods */
145 gboolean gst_mpd_client_set_root_node (GstMPDClient * client,
146                                        const gchar * property_name,
147                                        ...);
148 gchar * gst_mpd_client_set_period_node (GstMPDClient * client,
149                                         gchar * period_id,
150                                         const gchar * property_name,
151                                         ...);
152 guint gst_mpd_client_set_adaptation_set_node (GstMPDClient * client,
153                                               gchar * period_id,
154                                               guint adap_set_id,
155                                               const gchar * property_name,
156                                               ...);
157 gchar * gst_mpd_client_set_representation_node (GstMPDClient * client,
158                                                 gchar * period_id,
159                                                 guint adap_set_id,
160                                                 gchar * rep_id,
161                                                 const gchar * property_name,
162                                                 ...);
163 gboolean gst_mpd_client_set_segment_list (GstMPDClient * client,
164                                           gchar * period_id,
165                                           guint adap_set_id,
166                                           gchar * rep_id,
167                                           const gchar * property_name,
168                                           ...);
169 gboolean gst_mpd_client_set_segment_template (GstMPDClient * client,
170                                               gchar * period_id,
171                                               guint adap_set_id,
172                                               gchar * rep_id,
173                                               const gchar * property_name,
174                                               ...);
175
176 /* create a new node */
177 gboolean gst_mpd_client_add_baseurl_node (GstMPDClient * client,
178                                           const gchar * property_name,
179                                           ...);
180 gboolean gst_mpd_client_add_segment_url (GstMPDClient * client,
181                                          gchar * period_id,
182                                          guint adap_set_id,
183                                          gchar * rep_id,
184                                          const gchar * property_name,
185                                          ...);
186 G_END_DECLS
187
188 #endif /* __GST_MPDCLIENT_H__ */