| /* | |
| * GStreamer | |
| * Copyright (C) 2016 Vivia Nikolaidou <vivia@toolsonair.com> | |
| * | |
| * gsttimecodestamper.h | |
| * | |
| * This library is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU Library General Public | |
| * License as published by the Free Software Foundation; either | |
| * version 2 of the License, or (at your option) any later version. | |
| * | |
| * This library is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| * Library General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Library General Public | |
| * License along with this library; if not, write to the | |
| * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, | |
| * Boston, MA 02110-1301, USA. | |
| */ | |
| #ifndef __GST_TIME_CODE_STAMPER_H__ | |
| #define __GST_TIME_CODE_STAMPER_H__ | |
| #include <gst/gst.h> | |
| #include <gst/video/video.h> | |
| #include <gst/audio/audio.h> | |
| #if HAVE_LTC | |
| #include <ltc.h> | |
| #endif | |
| #define GST_TYPE_TIME_CODE_STAMPER (gst_timecodestamper_get_type()) | |
| #define GST_TIME_CODE_STAMPER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_TIME_CODE_STAMPER,GstTimeCodeStamper)) | |
| #define GST_TIME_CODE_STAMPER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_TIME_CODE_STAMPER,GstTimeCodeStamperClass)) | |
| #define GST_TIME_CODE_STAMPER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_TIME_CODE_STAMPER,GstTimeCodeStamperClass)) | |
| #define GST_IS_TIME_CODE_STAMPER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_TIME_CODE_STAMPER)) | |
| #define GST_IS_TIME_CODE_STAMPER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_TIME_CODE_STAMPER)) | |
| #define GST_TYPE_TIME_CODE_STAMPER_SOURCE (gst_timecodestamper_source_get_type()) | |
| #define GST_TYPE_TIME_CODE_STAMPER_SET (gst_timecodestamper_set_get_type()) | |
| typedef struct _GstTimeCodeStamper GstTimeCodeStamper; | |
| typedef struct _GstTimeCodeStamperClass GstTimeCodeStamperClass; | |
| typedef enum GstTimeCodeStamperSource | |
| { | |
| GST_TIME_CODE_STAMPER_SOURCE_INTERNAL, | |
| GST_TIME_CODE_STAMPER_SOURCE_ZERO, | |
| GST_TIME_CODE_STAMPER_SOURCE_LAST_KNOWN, | |
| GST_TIME_CODE_STAMPER_SOURCE_LAST_KNOWN_OR_ZERO, | |
| GST_TIME_CODE_STAMPER_SOURCE_LTC, | |
| GST_TIME_CODE_STAMPER_SOURCE_RTC, | |
| } GstTimeCodeStamperSource; | |
| typedef enum GstTimeCodeStamperSet { | |
| GST_TIME_CODE_STAMPER_SET_NEVER, | |
| GST_TIME_CODE_STAMPER_SET_KEEP, | |
| GST_TIME_CODE_STAMPER_SET_ALWAYS, | |
| } GstTimeCodeStamperSet; | |
| /** | |
| * GstTimeCodeStamper: | |
| * | |
| * Opaque data structure. | |
| */ | |
| struct _GstTimeCodeStamper | |
| { | |
| GstBaseTransform videofilter; | |
| /* protected by object lock */ | |
| GstPad *ltcpad; | |
| /* < private > */ | |
| /* Properties, protected by object lock */ | |
| GstTimeCodeStamperSource tc_source; | |
| GstTimeCodeStamperSet tc_set; | |
| gboolean tc_auto_resync; | |
| GstClockTime tc_timeout; | |
| gboolean drop_frame; | |
| gboolean post_messages; | |
| GstVideoTimeCode *set_internal_tc; | |
| GDateTime *ltc_daily_jam; | |
| gboolean ltc_auto_resync; | |
| GstClockTime ltc_timeout; | |
| GstClockTime ltc_extra_latency; | |
| GstClockTime rtc_max_drift; | |
| gboolean rtc_auto_resync; | |
| gint timecode_offset; | |
| /* Timecode tracking, protected by object lock */ | |
| GstVideoTimeCode *internal_tc; | |
| GstVideoTimeCode *last_tc; | |
| GstClockTime last_tc_running_time; | |
| GstVideoTimeCode *rtc_tc; | |
| /* Internal state, protected by object lock, changed only from video streaming thread */ | |
| gint fps_n; | |
| gint fps_d; | |
| GstVideoInterlaceMode interlace_mode; | |
| /* Seek handling, protected by the object lock */ | |
| guint32 prev_seek_seqnum; | |
| gboolean reset_internal_tc_from_seek; | |
| gint64 seeked_frames; | |
| /* LTC specific fields */ | |
| #if HAVE_LTC | |
| GMutex mutex; | |
| GCond ltc_cond_video; | |
| GCond ltc_cond_audio; | |
| /* Only accessed from audio streaming thread */ | |
| GstAudioInfo ainfo; | |
| GstAudioStreamAlign *stream_align; | |
| GstSegment ltc_segment; | |
| /* Running time of the first audio buffer passed to the LTC decoder */ | |
| GstClockTime ltc_first_running_time; | |
| /* Running time of the last sample we passed to the LTC decoder so far */ | |
| GstClockTime ltc_current_running_time; | |
| /* Protected by object lock */ | |
| /* Queue of LTC timecodes we took out of the LTC decoder already | |
| * together with their corresponding running times */ | |
| GQueue ltc_current_tcs; | |
| /* LTC timecode we last synced to and potentially incremented manually since | |
| * then */ | |
| GstVideoTimeCode *ltc_internal_tc; | |
| GstClockTime ltc_internal_running_time; | |
| /* Running time of last video frame we received */ | |
| GstClockTime video_current_running_time; | |
| /* Protected by mutex above */ | |
| LTCDecoder *ltc_dec; | |
| ltc_off_t ltc_total; | |
| /* Protected by mutex above */ | |
| gboolean video_flushing; | |
| gboolean video_eos; | |
| /* Protected by mutex above */ | |
| gboolean ltc_flushing; | |
| gboolean ltc_eos; | |
| /* Latency information for LTC audio and video stream */ | |
| GstClockTime audio_latency, video_latency; | |
| gboolean audio_live, video_live; | |
| /* Latency we report to downstream */ | |
| GstClockTime latency; | |
| GstClockID video_clock_id; | |
| GstPadActivateModeFunction video_activatemode_default; | |
| #endif | |
| }; | |
| struct _GstTimeCodeStamperClass | |
| { | |
| GstBaseTransformClass parent_class; | |
| }; | |
| GType gst_timecodestamper_get_type (void); | |
| GST_ELEMENT_REGISTER_DECLARE (timecodestamper); | |
| GType gst_timecodestamper_source_get_type (void); | |
| GType gst_timecodestamper_set_get_type (void); | |
| G_END_DECLS | |
| #endif /* __GST_TIME_CODE_STAMPER_H__ */ |