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