1 /* GStreamer
2  * Copyright (C) <2016> Vivia Nikolaidou <vivia@toolsonair.com>
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19 
20 #ifndef __GST_VIDEO_TIME_CODE_H__
21 #define __GST_VIDEO_TIME_CODE_H__
22 
23 #include <gst/gst.h>
24 #include <gst/video/video-prelude.h>
25 
26 G_BEGIN_DECLS
27 
28 typedef struct _GstVideoTimeCodeConfig GstVideoTimeCodeConfig;
29 typedef struct _GstVideoTimeCode GstVideoTimeCode;
30 typedef struct _GstVideoTimeCodeInterval GstVideoTimeCodeInterval;
31 
32 /**
33  * GstVideoTimeCodeFlags:
34  * @GST_VIDEO_TIME_CODE_FLAGS_NONE: No flags
35  * @GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME: Whether we have drop frame rate
36  * @GST_VIDEO_TIME_CODE_FLAGS_INTERLACED: Whether we have interlaced video
37  *
38  * Flags related to the time code information.
39  * For drop frame, only 30000/1001 and 60000/1001 frame rates are supported.
40  *
41  * Since: 1.10
42  */
43 typedef enum
44 {
45   GST_VIDEO_TIME_CODE_FLAGS_NONE = 0,
46   GST_VIDEO_TIME_CODE_FLAGS_DROP_FRAME = (1<<0),
47   GST_VIDEO_TIME_CODE_FLAGS_INTERLACED = (1<<1)
48   /* Not supported yet:
49    * GST_VIDEO_TIME_CODE_ALLOW_MORE_THAN_24H = (1<<2)
50    * GST_VIDEO_TIME_CODE_ALLOW_NEGATIVE = (1<<3)
51    */
52 } GstVideoTimeCodeFlags;
53 
54 /**
55  * GstVideoTimeCodeConfig:
56  * @fps_n: Numerator of the frame rate
57  * @fps_d: Denominator of the frame rate
58  * @flags: the corresponding #GstVideoTimeCodeFlags
59  * @latest_daily_jam: The latest daily jam information, if present, or NULL
60  *
61  * Supported frame rates: 30000/1001, 60000/1001 (both with and without drop
62  * frame), and integer frame rates e.g. 25/1, 30/1, 50/1, 60/1.
63  *
64  * The configuration of the time code.
65  *
66  * Since: 1.10
67  */
68 struct _GstVideoTimeCodeConfig {
69   guint fps_n;
70   guint fps_d;
71   GstVideoTimeCodeFlags flags;
72   GDateTime *latest_daily_jam;
73 };
74 
75 /**
76  * GstVideoTimeCode:
77  * @hours: the hours field of #GstVideoTimeCode
78  * @minutes: the minutes field of #GstVideoTimeCode
79  * @seconds: the seconds field of #GstVideoTimeCode
80  * @frames: the frames field of #GstVideoTimeCode
81  * @field_count: Interlaced video field count
82  * @config: the corresponding #GstVideoTimeCodeConfig
83  *
84  * @field_count must be 0 for progressive video and 1 or 2 for interlaced.
85  *
86  * A representation of a SMPTE time code.
87  *
88  * @hours must be positive and less than 24. Will wrap around otherwise.
89  * @minutes and @seconds must be positive and less than 60.
90  * @frames must be less than or equal to @config.fps_n / @config.fps_d
91  * These values are *NOT* automatically normalized.
92  *
93  * Since: 1.10
94  */
95 struct _GstVideoTimeCode {
96   GstVideoTimeCodeConfig config;
97 
98   guint hours;
99   guint minutes;
100   guint seconds;
101   guint frames;
102   guint field_count;
103 };
104 
105 /**
106  * GstVideoTimeCodeInterval:
107  * @hours: the hours field of #GstVideoTimeCodeInterval
108  * @minutes: the minutes field of #GstVideoTimeCodeInterval
109  * @seconds: the seconds field of #GstVideoTimeCodeInterval
110  * @frames: the frames field of #GstVideoTimeCodeInterval
111  *
112  * A representation of a difference between two #GstVideoTimeCode instances.
113  * Will not necessarily correspond to a real timecode (e.g. 00:00:10;00)
114  *
115  * Since: 1.12
116  */
117 struct _GstVideoTimeCodeInterval {
118   guint hours;
119   guint minutes;
120   guint seconds;
121   guint frames;
122 };
123 
124 #define GST_VIDEO_TIME_CODE_INIT { {0, 0, 0, NULL}, 0, 0, 0, 0, 0 }
125 
126 #define GST_TYPE_VIDEO_TIME_CODE (gst_video_time_code_get_type())
127 GST_VIDEO_API
128 GType gst_video_time_code_get_type (void);
129 
130 GST_VIDEO_API
131 GstVideoTimeCode * gst_video_time_code_new          (guint                    fps_n,
132                                                      guint                    fps_d,
133                                                      GDateTime              * latest_daily_jam,
134                                                      GstVideoTimeCodeFlags    flags,
135                                                      guint                    hours,
136                                                      guint                    minutes,
137                                                      guint                    seconds,
138                                                      guint                    frames,
139                                                      guint                    field_count);
140 
141 GST_VIDEO_API
142 GstVideoTimeCode * gst_video_time_code_new_empty    (void);
143 
144 GST_VIDEO_API
145 GstVideoTimeCode * gst_video_time_code_new_from_string    (const gchar * tc_str);
146 
147 GST_VIDEO_DEPRECATED_FOR(gst_video_time_code_new_from_date_time_full)
148 GstVideoTimeCode * gst_video_time_code_new_from_date_time (guint                    fps_n,
149                                                            guint                    fps_d,
150                                                            GDateTime              * dt,
151                                                            GstVideoTimeCodeFlags    flags,
152                                                            guint                    field_count);
153 
154 GST_VIDEO_API
155 GstVideoTimeCode * gst_video_time_code_new_from_date_time_full (guint                    fps_n,
156                                                                 guint                    fps_d,
157                                                                 GDateTime              * dt,
158                                                                 GstVideoTimeCodeFlags    flags,
159                                                                 guint                    field_count);
160 
161 GST_VIDEO_API
162 void gst_video_time_code_free                       (GstVideoTimeCode       * tc);
163 
164 GST_VIDEO_API
165 GstVideoTimeCode * gst_video_time_code_copy         (const GstVideoTimeCode * tc);
166 
167 GST_VIDEO_API
168 void gst_video_time_code_init                       (GstVideoTimeCode       * tc,
169                                                      guint                    fps_n,
170                                                      guint                    fps_d,
171                                                      GDateTime              * latest_daily_jam,
172                                                      GstVideoTimeCodeFlags    flags,
173                                                      guint                    hours,
174                                                      guint                    minutes,
175                                                      guint                    seconds,
176                                                      guint                    frames,
177                                                      guint                    field_count);
178 
179 GST_VIDEO_DEPRECATED_FOR(gst_video_time_code_init_from_date_time_full)
180 void gst_video_time_code_init_from_date_time        (GstVideoTimeCode       * tc,
181                                                      guint                    fps_n,
182                                                      guint                    fps_d,
183                                                      GDateTime              * dt,
184                                                      GstVideoTimeCodeFlags    flags,
185                                                      guint                    field_count);
186 GST_VIDEO_API
187 gboolean gst_video_time_code_init_from_date_time_full (GstVideoTimeCode       * tc,
188                                                        guint                    fps_n,
189                                                        guint                    fps_d,
190                                                        GDateTime              * dt,
191                                                        GstVideoTimeCodeFlags    flags,
192                                                        guint                    field_count);
193 
194 GST_VIDEO_API
195 void gst_video_time_code_clear                      (GstVideoTimeCode       * tc);
196 
197 GST_VIDEO_API
198 gboolean gst_video_time_code_is_valid               (const GstVideoTimeCode * tc);
199 
200 GST_VIDEO_API
201 gint gst_video_time_code_compare                    (const GstVideoTimeCode * tc1,
202                                                      const GstVideoTimeCode * tc2);
203 
204 GST_VIDEO_API
205 void gst_video_time_code_increment_frame            (GstVideoTimeCode       * tc);
206 
207 GST_VIDEO_API
208 void gst_video_time_code_add_frames                 (GstVideoTimeCode       * tc,
209                                                      gint64                   frames);
210 
211 GST_VIDEO_API
212 gchar *gst_video_time_code_to_string                (const GstVideoTimeCode * tc);
213 
214 GST_VIDEO_API
215 GDateTime *gst_video_time_code_to_date_time         (const GstVideoTimeCode * tc);
216 
217 GST_VIDEO_API
218 guint64 gst_video_time_code_nsec_since_daily_jam    (const GstVideoTimeCode * tc);
219 
220 GST_VIDEO_API
221 guint64 gst_video_time_code_frames_since_daily_jam  (const GstVideoTimeCode * tc);
222 
223 GST_VIDEO_API
224 GstVideoTimeCode * gst_video_time_code_add_interval (const GstVideoTimeCode * tc, const GstVideoTimeCodeInterval * tc_inter);
225 
226 #define GST_TYPE_VIDEO_TIME_CODE_INTERVAL (gst_video_time_code_interval_get_type())
227 GST_VIDEO_API
228 GType gst_video_time_code_interval_get_type (void);
229 
230 GST_VIDEO_API
231 GstVideoTimeCodeInterval * gst_video_time_code_interval_new  (guint                    hours,
232                                                      guint                    minutes,
233                                                      guint                    seconds,
234                                                      guint                    frames);
235 
236 GST_VIDEO_API
237 GstVideoTimeCodeInterval * gst_video_time_code_interval_new_from_string    (const gchar * tc_inter_str);
238 
239 GST_VIDEO_API
240 void gst_video_time_code_interval_free                   (GstVideoTimeCodeInterval       * tc);
241 
242 GST_VIDEO_API
243 GstVideoTimeCodeInterval * gst_video_time_code_interval_copy (const GstVideoTimeCodeInterval * tc);
244 
245 GST_VIDEO_API
246 void gst_video_time_code_interval_init                   (GstVideoTimeCodeInterval       * tc,
247                                                      guint                    hours,
248                                                      guint                    minutes,
249                                                      guint                    seconds,
250                                                      guint                    frames);
251 
252 GST_VIDEO_API
253 void gst_video_time_code_interval_clear                  (GstVideoTimeCodeInterval       * tc);
254 
255 G_END_DECLS
256 
257 #endif /* __GST_VIDEO_TIME_CODE_H__ */
258