diff --git a/gstajacommon.cpp b/gstajacommon.cpp index bafdb6f8fe..99b064ca28 100644 --- a/gstajacommon.cpp +++ b/gstajacommon.cpp @@ -550,50 +550,13 @@ GType gst_aja_audio_source_get_type(void) { return (GType)id; } -GType gst_aja_embedded_audio_input_get_type(void) { - static gsize id = 0; - static const GEnumValue modes[] = { - {GST_AJA_EMBEDDED_AUDIO_INPUT_AUTO, "auto", "Auto"}, - {GST_AJA_EMBEDDED_AUDIO_INPUT_VIDEO_1, "video-1", "Video 1"}, - {GST_AJA_EMBEDDED_AUDIO_INPUT_VIDEO_2, "video-2", "Video 2"}, - {GST_AJA_EMBEDDED_AUDIO_INPUT_VIDEO_3, "video-3", "Video 3"}, - {GST_AJA_EMBEDDED_AUDIO_INPUT_VIDEO_4, "video-4", "Video 4"}, - {GST_AJA_EMBEDDED_AUDIO_INPUT_VIDEO_5, "video-5", "Video 5"}, - {GST_AJA_EMBEDDED_AUDIO_INPUT_VIDEO_6, "video-6", "Video 6"}, - {GST_AJA_EMBEDDED_AUDIO_INPUT_VIDEO_7, "video-7", "Video 7"}, - {GST_AJA_EMBEDDED_AUDIO_INPUT_VIDEO_8, "video-8", "Video 8"}, - {0, NULL, NULL}}; - - if (g_once_init_enter(&id)) { - GType tmp = g_enum_register_static("GstAjaEmbeddedAudioInput", modes); - g_once_init_leave(&id, tmp); - } - - return (GType)id; -} - GType gst_aja_timecode_index_get_type(void) { static gsize id = 0; static const GEnumValue modes[] = { - {GST_AJA_TIMECODE_INDEX_AUTO, "auto", "Auto"}, - {GST_AJA_TIMECODE_INDEX_SDI1, "sdi-1", "SDI 1"}, - {GST_AJA_TIMECODE_INDEX_SDI2, "sdi-2", "SDI 2"}, - {GST_AJA_TIMECODE_INDEX_SDI3, "sdi-3", "SDI 3"}, - {GST_AJA_TIMECODE_INDEX_SDI4, "sdi-4", "SDI 4"}, - {GST_AJA_TIMECODE_INDEX_SDI5, "sdi-5", "SDI 5"}, - {GST_AJA_TIMECODE_INDEX_SDI6, "sdi-6", "SDI 6"}, - {GST_AJA_TIMECODE_INDEX_SDI7, "sdi-7", "SDI 7"}, - {GST_AJA_TIMECODE_INDEX_SDI8, "sdi-8", "SDI 8"}, - {GST_AJA_TIMECODE_INDEX_SDI1_LTC, "sdi-1-ltc", "SDI 1 LTC"}, - {GST_AJA_TIMECODE_INDEX_SDI2_LTC, "sdi-2-ltc", "SDI 2 LTC"}, - {GST_AJA_TIMECODE_INDEX_SDI3_LTC, "sdi-3-ltc", "SDI 3 LTC"}, - {GST_AJA_TIMECODE_INDEX_SDI4_LTC, "sdi-4-ltc", "SDI 4 LTC"}, - {GST_AJA_TIMECODE_INDEX_SDI5_LTC, "sdi-5-ltc", "SDI 5 LTC"}, - {GST_AJA_TIMECODE_INDEX_SDI6_LTC, "sdi-6-ltc", "SDI 6 LTC"}, - {GST_AJA_TIMECODE_INDEX_SDI7_LTC, "sdi-7-ltc", "SDI 7 LTC"}, - {GST_AJA_TIMECODE_INDEX_SDI8_LTC, "sdi-8-ltc", "SDI 8 LTC"}, - {GST_AJA_TIMECODE_INDEX_LTC1, "ltc-1", "LTC 1"}, - {GST_AJA_TIMECODE_INDEX_LTC2, "ltc-2", "LTC 2"}, + {GST_AJA_TIMECODE_INDEX_VITC, "vitc", "Embedded SDI VITC"}, + {GST_AJA_TIMECODE_INDEX_VITC, "atc-ltc", "Embedded SDI ATC LTC"}, + {GST_AJA_TIMECODE_INDEX_LTC1, "ltc-1", "Analog LTC 1"}, + {GST_AJA_TIMECODE_INDEX_LTC2, "ltc-2", "Analog LTC 2"}, {0, NULL, NULL}}; if (g_once_init_enter(&id)) { diff --git a/gstajacommon.h b/gstajacommon.h index e32fe09a46..af646e4d27 100644 --- a/gstajacommon.h +++ b/gstajacommon.h @@ -218,40 +218,8 @@ G_GNUC_INTERNAL GType gst_aja_audio_source_get_type(void); typedef enum { - GST_AJA_EMBEDDED_AUDIO_INPUT_AUTO, - GST_AJA_EMBEDDED_AUDIO_INPUT_VIDEO_1, - GST_AJA_EMBEDDED_AUDIO_INPUT_VIDEO_2, - GST_AJA_EMBEDDED_AUDIO_INPUT_VIDEO_3, - GST_AJA_EMBEDDED_AUDIO_INPUT_VIDEO_4, - GST_AJA_EMBEDDED_AUDIO_INPUT_VIDEO_5, - GST_AJA_EMBEDDED_AUDIO_INPUT_VIDEO_6, - GST_AJA_EMBEDDED_AUDIO_INPUT_VIDEO_7, - GST_AJA_EMBEDDED_AUDIO_INPUT_VIDEO_8, -} GstAjaEmbeddedAudioInput; - -#define GST_TYPE_AJA_EMBEDDED_AUDIO_INPUT \ - (gst_aja_embedded_audio_input_get_type()) -G_GNUC_INTERNAL -GType gst_aja_embedded_audio_input_get_type(void); - -typedef enum { - GST_AJA_TIMECODE_INDEX_AUTO, - GST_AJA_TIMECODE_INDEX_SDI1, - GST_AJA_TIMECODE_INDEX_SDI2, - GST_AJA_TIMECODE_INDEX_SDI3, - GST_AJA_TIMECODE_INDEX_SDI4, - GST_AJA_TIMECODE_INDEX_SDI5, - GST_AJA_TIMECODE_INDEX_SDI6, - GST_AJA_TIMECODE_INDEX_SDI7, - GST_AJA_TIMECODE_INDEX_SDI8, - GST_AJA_TIMECODE_INDEX_SDI1_LTC, - GST_AJA_TIMECODE_INDEX_SDI2_LTC, - GST_AJA_TIMECODE_INDEX_SDI3_LTC, - GST_AJA_TIMECODE_INDEX_SDI4_LTC, - GST_AJA_TIMECODE_INDEX_SDI5_LTC, - GST_AJA_TIMECODE_INDEX_SDI6_LTC, - GST_AJA_TIMECODE_INDEX_SDI7_LTC, - GST_AJA_TIMECODE_INDEX_SDI8_LTC, + GST_AJA_TIMECODE_INDEX_VITC, + GST_AJA_TIMECODE_INDEX_ATC_LTC, GST_AJA_TIMECODE_INDEX_LTC1, GST_AJA_TIMECODE_INDEX_LTC2, } GstAjaTimecodeIndex; diff --git a/gstajasink.cpp b/gstajasink.cpp index fdd598fb4e..ad2275ba5a 100644 --- a/gstajasink.cpp +++ b/gstajasink.cpp @@ -35,7 +35,7 @@ GST_DEBUG_CATEGORY_STATIC(gst_aja_sink_debug); #define DEFAULT_CHANNEL (::NTV2_CHANNEL1) #define DEFAULT_AUDIO_SYSTEM (GST_AJA_AUDIO_SYSTEM_AUTO) #define DEFAULT_OUTPUT_DESTINATION (GST_AJA_OUTPUT_DESTINATION_AUTO) -#define DEFAULT_TIMECODE_INDEX (GST_AJA_TIMECODE_INDEX_AUTO) +#define DEFAULT_TIMECODE_INDEX (GST_AJA_TIMECODE_INDEX_VITC) #define DEFAULT_REFERENCE_SOURCE (GST_AJA_REFERENCE_SOURCE_AUTO) #define DEFAULT_QUEUE_SIZE (16) #define DEFAULT_OUTPUT_CPU_CORE (G_MAXUINT) @@ -420,6 +420,11 @@ static gboolean gst_aja_sink_stop(GstAjaSink *self) { gst_clear_object(&self->audio_buffer_pool); } + if (self->tc_indexes) { + delete self->tc_indexes; + self->tc_indexes = NULL; + } + GST_DEBUG_OBJECT(self, "Stopped"); return TRUE; @@ -689,33 +694,66 @@ static gboolean gst_aja_sink_set_caps(GstBaseSink *bsink, GstCaps *caps) { NTV2OutputCrosspointID framebuffer_id = ::GetFrameBufferOutputXptFromChannel(self->channel, false, false); + NTV2TCIndex tc_indexes_vitc[2] = {::NTV2_TCINDEX_INVALID, + ::NTV2_TCINDEX_INVALID}; + NTV2TCIndex tc_index_atc_ltc = ::NTV2_TCINDEX_INVALID; NTV2InputCrosspointID output_destination_id; switch (self->output_destination) { case GST_AJA_OUTPUT_DESTINATION_AUTO: + tc_indexes_vitc[0] = + ::NTV2ChannelToTimecodeIndex(self->channel, false, false); + tc_indexes_vitc[1] = + ::NTV2ChannelToTimecodeIndex(self->channel, false, true); + tc_index_atc_ltc = + ::NTV2ChannelToTimecodeIndex(self->channel, false, true); output_destination_id = ::GetSDIOutputInputXpt(self->channel, false); break; case GST_AJA_OUTPUT_DESTINATION_SDI1: + tc_indexes_vitc[0] = ::NTV2_TCINDEX_SDI1; + tc_indexes_vitc[1] = ::NTV2_TCINDEX_SDI1_2; + tc_index_atc_ltc = ::NTV2_TCINDEX_SDI1_LTC; output_destination_id = ::NTV2_XptSDIOut1Input; break; case GST_AJA_OUTPUT_DESTINATION_SDI2: + tc_indexes_vitc[0] = ::NTV2_TCINDEX_SDI2; + tc_indexes_vitc[1] = ::NTV2_TCINDEX_SDI2_2; + tc_index_atc_ltc = ::NTV2_TCINDEX_SDI2_LTC; output_destination_id = ::NTV2_XptSDIOut2Input; break; case GST_AJA_OUTPUT_DESTINATION_SDI3: + tc_indexes_vitc[0] = ::NTV2_TCINDEX_SDI3; + tc_indexes_vitc[1] = ::NTV2_TCINDEX_SDI3_2; + tc_index_atc_ltc = ::NTV2_TCINDEX_SDI3_LTC; output_destination_id = ::NTV2_XptSDIOut3Input; break; case GST_AJA_OUTPUT_DESTINATION_SDI4: + tc_indexes_vitc[0] = ::NTV2_TCINDEX_SDI4; + tc_indexes_vitc[1] = ::NTV2_TCINDEX_SDI4_2; + tc_index_atc_ltc = ::NTV2_TCINDEX_SDI4_LTC; output_destination_id = ::NTV2_XptSDIOut4Input; break; case GST_AJA_OUTPUT_DESTINATION_SDI5: + tc_indexes_vitc[0] = ::NTV2_TCINDEX_SDI5; + tc_indexes_vitc[1] = ::NTV2_TCINDEX_SDI5_2; + tc_index_atc_ltc = ::NTV2_TCINDEX_SDI5_LTC; output_destination_id = ::NTV2_XptSDIOut5Input; break; case GST_AJA_OUTPUT_DESTINATION_SDI6: + tc_indexes_vitc[0] = ::NTV2_TCINDEX_SDI6; + tc_indexes_vitc[1] = ::NTV2_TCINDEX_SDI6_2; + tc_index_atc_ltc = ::NTV2_TCINDEX_SDI6_LTC; output_destination_id = ::NTV2_XptSDIOut6Input; break; case GST_AJA_OUTPUT_DESTINATION_SDI7: + tc_indexes_vitc[0] = ::NTV2_TCINDEX_SDI7; + tc_indexes_vitc[1] = ::NTV2_TCINDEX_SDI7_2; + tc_index_atc_ltc = ::NTV2_TCINDEX_SDI7_LTC; output_destination_id = ::NTV2_XptSDIOut7Input; break; case GST_AJA_OUTPUT_DESTINATION_SDI8: + tc_indexes_vitc[0] = ::NTV2_TCINDEX_SDI8; + tc_indexes_vitc[1] = ::NTV2_TCINDEX_SDI8_2; + tc_index_atc_ltc = ::NTV2_TCINDEX_SDI8_LTC; output_destination_id = ::NTV2_XptSDIOut8Input; break; case GST_AJA_OUTPUT_DESTINATION_ANALOG: @@ -729,6 +767,29 @@ static gboolean gst_aja_sink_set_caps(GstBaseSink *bsink, GstCaps *caps) { break; } + if (!self->tc_indexes) self->tc_indexes = new NTV2TCIndexes; + + switch (self->timecode_index) { + case GST_AJA_TIMECODE_INDEX_VITC: + self->tc_indexes->insert(tc_indexes_vitc[0]); + if (self->configured_info.interlace_mode != + GST_VIDEO_INTERLACE_MODE_PROGRESSIVE) + self->tc_indexes->insert(tc_indexes_vitc[1]); + break; + case GST_AJA_TIMECODE_INDEX_ATC_LTC: + self->tc_indexes->insert(tc_index_atc_ltc); + break; + case GST_AJA_TIMECODE_INDEX_LTC1: + self->tc_indexes->insert(::NTV2_TCINDEX_LTC1); + break; + case GST_AJA_TIMECODE_INDEX_LTC2: + self->tc_indexes->insert(::NTV2_TCINDEX_LTC2); + break; + default: + g_assert_not_reached(); + break; + } + // Need to remove old routes for the output and framebuffer we're going to use NTV2ActualConnections connections = router.GetConnections(); @@ -1154,75 +1215,6 @@ restart: GST_DEBUG_OBJECT(self, "Starting playing"); g_mutex_unlock(&self->queue_lock); - NTV2TCIndexes tc_indexes; - switch (self->timecode_index) { - case GST_AJA_TIMECODE_INDEX_AUTO: - tc_indexes.insert(::NTV2ChannelToTimecodeIndex(self->channel, false)); - tc_indexes.insert(::NTV2ChannelToTimecodeIndex(self->channel, true)); - if (self->configured_info.interlace_mode != - GST_VIDEO_INTERLACE_MODE_PROGRESSIVE) - tc_indexes.insert( - ::NTV2ChannelToTimecodeIndex(self->channel, false, true)); - break; - case GST_AJA_TIMECODE_INDEX_SDI1: - tc_indexes.insert(::NTV2_TCINDEX_SDI1); - break; - case GST_AJA_TIMECODE_INDEX_SDI2: - tc_indexes.insert(::NTV2_TCINDEX_SDI2); - break; - case GST_AJA_TIMECODE_INDEX_SDI3: - tc_indexes.insert(::NTV2_TCINDEX_SDI3); - break; - case GST_AJA_TIMECODE_INDEX_SDI4: - tc_indexes.insert(::NTV2_TCINDEX_SDI4); - break; - case GST_AJA_TIMECODE_INDEX_SDI5: - tc_indexes.insert(::NTV2_TCINDEX_SDI5); - break; - case GST_AJA_TIMECODE_INDEX_SDI6: - tc_indexes.insert(::NTV2_TCINDEX_SDI6); - break; - case GST_AJA_TIMECODE_INDEX_SDI7: - tc_indexes.insert(::NTV2_TCINDEX_SDI7); - break; - case GST_AJA_TIMECODE_INDEX_SDI8: - tc_indexes.insert(::NTV2_TCINDEX_SDI8); - break; - case GST_AJA_TIMECODE_INDEX_SDI1_LTC: - tc_indexes.insert(::NTV2_TCINDEX_SDI1_LTC); - break; - case GST_AJA_TIMECODE_INDEX_SDI2_LTC: - tc_indexes.insert(::NTV2_TCINDEX_SDI2_LTC); - break; - case GST_AJA_TIMECODE_INDEX_SDI3_LTC: - tc_indexes.insert(::NTV2_TCINDEX_SDI3_LTC); - break; - case GST_AJA_TIMECODE_INDEX_SDI4_LTC: - tc_indexes.insert(::NTV2_TCINDEX_SDI4_LTC); - break; - case GST_AJA_TIMECODE_INDEX_SDI5_LTC: - tc_indexes.insert(::NTV2_TCINDEX_SDI5_LTC); - break; - case GST_AJA_TIMECODE_INDEX_SDI6_LTC: - tc_indexes.insert(::NTV2_TCINDEX_SDI6_LTC); - break; - case GST_AJA_TIMECODE_INDEX_SDI7_LTC: - tc_indexes.insert(::NTV2_TCINDEX_SDI7_LTC); - break; - case GST_AJA_TIMECODE_INDEX_SDI8_LTC: - tc_indexes.insert(::NTV2_TCINDEX_SDI8_LTC); - break; - case GST_AJA_TIMECODE_INDEX_LTC1: - tc_indexes.insert(::NTV2_TCINDEX_LTC1); - break; - case GST_AJA_TIMECODE_INDEX_LTC2: - tc_indexes.insert(::NTV2_TCINDEX_LTC2); - break; - default: - g_assert_not_reached(); - break; - } - { // Make sure to globally lock here as the routing settings and others are // global shared state @@ -1347,10 +1339,10 @@ restart: item.audio_buffer ? item.audio_map.size : 0); // Set timecodes if provided by upstream - if (item.tc.IsValid() && item.tc.fDBB != 0xffffffff) { + if (item.tc.IsValid() && item.tc.fDBB != 0xffffffff && self->tc_indexes) { NTV2TimeCodes timecodes; - for (const auto &tc_index : tc_indexes) { + for (const auto &tc_index : *self->tc_indexes) { timecodes[tc_index] = item.tc; } transfer.SetOutputTimeCodes(timecodes); diff --git a/gstajasink.h b/gstajasink.h index 95c7f3aca6..b490f4e58e 100644 --- a/gstajasink.h +++ b/gstajasink.h @@ -78,6 +78,7 @@ struct _GstAjaSink { NTV2AudioSystem audio_system; NTV2VideoFormat video_format; guint32 f2_start_line; + NTV2TCIndexes *tc_indexes; GstCaps *configured_caps; GstVideoInfo configured_info; diff --git a/gstajasrc.cpp b/gstajasrc.cpp index 6e64b9b660..39f71ca6a7 100644 --- a/gstajasrc.cpp +++ b/gstajasrc.cpp @@ -38,8 +38,7 @@ GST_DEBUG_CATEGORY_STATIC(gst_aja_src_debug); #define DEFAULT_AUDIO_SYSTEM (GST_AJA_AUDIO_SYSTEM_AUTO) #define DEFAULT_INPUT_SOURCE (GST_AJA_INPUT_SOURCE_AUTO) #define DEFAULT_AUDIO_SOURCE (GST_AJA_AUDIO_SOURCE_EMBEDDED) -#define DEFAULT_EMBEDDED_AUDIO_INPUT (GST_AJA_EMBEDDED_AUDIO_INPUT_AUTO) -#define DEFAULT_TIMECODE_INDEX (GST_AJA_TIMECODE_INDEX_AUTO) +#define DEFAULT_TIMECODE_INDEX (GST_AJA_TIMECODE_INDEX_VITC) #define DEFAULT_REFERENCE_SOURCE (GST_AJA_REFERENCE_SOURCE_FREERUN) #define DEFAULT_QUEUE_SIZE (16) #define DEFAULT_CAPTURE_CPU_CORE (G_MAXUINT) @@ -52,7 +51,6 @@ enum { PROP_AUDIO_SYSTEM, PROP_INPUT_SOURCE, PROP_AUDIO_SOURCE, - PROP_EMBEDDED_AUDIO_INPUT, PROP_TIMECODE_INDEX, PROP_REFERENCE_SOURCE, PROP_QUEUE_SIZE, @@ -169,15 +167,6 @@ static void gst_aja_src_class_init(GstAjaSrcClass *klass) { (GParamFlags)(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT))); - g_object_class_install_property( - gobject_class, PROP_EMBEDDED_AUDIO_INPUT, - g_param_spec_enum( - "embedded-audio-input", "Embedded Audio Input", - "Embedded audio input to use", GST_TYPE_AJA_EMBEDDED_AUDIO_INPUT, - DEFAULT_EMBEDDED_AUDIO_INPUT, - (GParamFlags)(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | - G_PARAM_CONSTRUCT))); - g_object_class_install_property( gobject_class, PROP_TIMECODE_INDEX, g_param_spec_enum( @@ -239,7 +228,6 @@ static void gst_aja_src_init(GstAjaSrc *self) { self->audio_system_setting = DEFAULT_AUDIO_SYSTEM; self->input_source = DEFAULT_INPUT_SOURCE; self->audio_source = DEFAULT_AUDIO_SOURCE; - self->embedded_audio_input = DEFAULT_EMBEDDED_AUDIO_INPUT; self->timecode_index = DEFAULT_TIMECODE_INDEX; self->reference_source = DEFAULT_REFERENCE_SOURCE; self->capture_cpu_core = DEFAULT_CAPTURE_CPU_CORE; @@ -277,10 +265,6 @@ void gst_aja_src_set_property(GObject *object, guint property_id, case PROP_AUDIO_SOURCE: self->audio_source = (GstAjaAudioSource)g_value_get_enum(value); break; - case PROP_EMBEDDED_AUDIO_INPUT: - self->embedded_audio_input = - (GstAjaEmbeddedAudioInput)g_value_get_enum(value); - break; case PROP_TIMECODE_INDEX: self->timecode_index = (GstAjaTimecodeIndex)g_value_get_enum(value); break; @@ -322,9 +306,6 @@ void gst_aja_src_get_property(GObject *object, guint property_id, GValue *value, case PROP_AUDIO_SOURCE: g_value_set_enum(value, self->audio_source); break; - case PROP_EMBEDDED_AUDIO_INPUT: - g_value_set_enum(value, self->embedded_audio_input); - break; case PROP_TIMECODE_INDEX: g_value_set_enum(value, self->timecode_index); break; @@ -683,43 +664,9 @@ static gboolean gst_aja_src_start(GstAjaSrc *self) { break; } - NTV2EmbeddedAudioInput embedded_audio_input; - switch (self->embedded_audio_input) { - case GST_AJA_EMBEDDED_AUDIO_INPUT_AUTO: - embedded_audio_input = - ::NTV2InputSourceToEmbeddedAudioInput(input_source); - break; - case GST_AJA_EMBEDDED_AUDIO_INPUT_VIDEO_1: - embedded_audio_input = ::NTV2_EMBEDDED_AUDIO_INPUT_VIDEO_1; - break; - case GST_AJA_EMBEDDED_AUDIO_INPUT_VIDEO_2: - embedded_audio_input = ::NTV2_EMBEDDED_AUDIO_INPUT_VIDEO_2; - break; - case GST_AJA_EMBEDDED_AUDIO_INPUT_VIDEO_3: - embedded_audio_input = ::NTV2_EMBEDDED_AUDIO_INPUT_VIDEO_3; - break; - case GST_AJA_EMBEDDED_AUDIO_INPUT_VIDEO_4: - embedded_audio_input = ::NTV2_EMBEDDED_AUDIO_INPUT_VIDEO_4; - break; - case GST_AJA_EMBEDDED_AUDIO_INPUT_VIDEO_5: - embedded_audio_input = ::NTV2_EMBEDDED_AUDIO_INPUT_VIDEO_5; - break; - case GST_AJA_EMBEDDED_AUDIO_INPUT_VIDEO_6: - embedded_audio_input = ::NTV2_EMBEDDED_AUDIO_INPUT_VIDEO_6; - break; - case GST_AJA_EMBEDDED_AUDIO_INPUT_VIDEO_7: - embedded_audio_input = ::NTV2_EMBEDDED_AUDIO_INPUT_VIDEO_7; - break; - case GST_AJA_EMBEDDED_AUDIO_INPUT_VIDEO_8: - embedded_audio_input = ::NTV2_EMBEDDED_AUDIO_INPUT_VIDEO_8; - break; - default: - g_assert_not_reached(); - break; - } - self->device->device->SetAudioSystemInputSource( - self->audio_system, audio_source, embedded_audio_input); + self->audio_system, audio_source, + ::NTV2InputSourceToEmbeddedAudioInput(input_source)); self->configured_audio_channels = ::NTV2DeviceGetMaxAudioChannels(self->device_id); self->device->device->SetNumberAudioChannels( @@ -778,6 +725,24 @@ static gboolean gst_aja_src_start(GstAjaSrc *self) { (int)reference_source); self->device->device->SetReference(reference_source); + + switch (self->timecode_index) { + case GST_AJA_TIMECODE_INDEX_VITC: + self->tc_index = ::NTV2InputSourceToTimecodeIndex(input_source, false); + break; + case GST_AJA_TIMECODE_INDEX_ATC_LTC: + self->tc_index = ::NTV2InputSourceToTimecodeIndex(input_source, true); + break; + case GST_AJA_TIMECODE_INDEX_LTC1: + self->tc_index = ::NTV2_TCINDEX_LTC1; + break; + case GST_AJA_TIMECODE_INDEX_LTC2: + self->tc_index = ::NTV2_TCINDEX_LTC2; + break; + default: + g_assert_not_reached(); + break; + } } guint video_buffer_size = ::GetVideoActiveSize( @@ -1182,70 +1147,6 @@ restart: gst_clear_object(&clock); clock = gst_element_get_clock(GST_ELEMENT_CAST(self)); - NTV2TCIndex tc_index; - switch (self->timecode_index) { - case GST_AJA_TIMECODE_INDEX_AUTO: - tc_index = ::NTV2ChannelToTimecodeIndex(self->channel, false); - break; - case GST_AJA_TIMECODE_INDEX_SDI1: - tc_index = ::NTV2_TCINDEX_SDI1; - break; - case GST_AJA_TIMECODE_INDEX_SDI2: - tc_index = ::NTV2_TCINDEX_SDI2; - break; - case GST_AJA_TIMECODE_INDEX_SDI3: - tc_index = ::NTV2_TCINDEX_SDI3; - break; - case GST_AJA_TIMECODE_INDEX_SDI4: - tc_index = ::NTV2_TCINDEX_SDI4; - break; - case GST_AJA_TIMECODE_INDEX_SDI5: - tc_index = ::NTV2_TCINDEX_SDI5; - break; - case GST_AJA_TIMECODE_INDEX_SDI6: - tc_index = ::NTV2_TCINDEX_SDI6; - break; - case GST_AJA_TIMECODE_INDEX_SDI7: - tc_index = ::NTV2_TCINDEX_SDI7; - break; - case GST_AJA_TIMECODE_INDEX_SDI8: - tc_index = ::NTV2_TCINDEX_SDI8; - break; - case GST_AJA_TIMECODE_INDEX_SDI1_LTC: - tc_index = ::NTV2_TCINDEX_SDI1_LTC; - break; - case GST_AJA_TIMECODE_INDEX_SDI2_LTC: - tc_index = ::NTV2_TCINDEX_SDI2_LTC; - break; - case GST_AJA_TIMECODE_INDEX_SDI3_LTC: - tc_index = ::NTV2_TCINDEX_SDI3_LTC; - break; - case GST_AJA_TIMECODE_INDEX_SDI4_LTC: - tc_index = ::NTV2_TCINDEX_SDI4_LTC; - break; - case GST_AJA_TIMECODE_INDEX_SDI5_LTC: - tc_index = ::NTV2_TCINDEX_SDI5_LTC; - break; - case GST_AJA_TIMECODE_INDEX_SDI6_LTC: - tc_index = ::NTV2_TCINDEX_SDI6_LTC; - break; - case GST_AJA_TIMECODE_INDEX_SDI7_LTC: - tc_index = ::NTV2_TCINDEX_SDI7_LTC; - break; - case GST_AJA_TIMECODE_INDEX_SDI8_LTC: - tc_index = ::NTV2_TCINDEX_SDI8_LTC; - break; - case GST_AJA_TIMECODE_INDEX_LTC1: - tc_index = ::NTV2_TCINDEX_LTC1; - break; - case GST_AJA_TIMECODE_INDEX_LTC2: - tc_index = ::NTV2_TCINDEX_LTC2; - break; - default: - g_assert_not_reached(); - break; - } - g_mutex_lock(&self->queue_lock); while (self->playing && !self->shutdown) { AUTOCIRCULATE_STATUS status; @@ -1363,7 +1264,7 @@ restart: NTV2_RP188 time_code; transfer.acTransferStatus.acFrameStamp.GetInputTimeCode(time_code, - tc_index); + self->tc_index); gint64 frame_time = transfer.acTransferStatus.acFrameStamp.acFrameTime; gint64 now_sys = g_get_real_time(); diff --git a/gstajasrc.h b/gstajasrc.h index cd37a060db..4baf959426 100644 --- a/gstajasrc.h +++ b/gstajasrc.h @@ -66,7 +66,6 @@ struct _GstAjaSrc { GstAjaVideoFormat video_format_setting; GstAjaInputSource input_source; GstAjaAudioSource audio_source; - GstAjaEmbeddedAudioInput embedded_audio_input; GstAjaTimecodeIndex timecode_index; GstAjaReferenceSource reference_source; guint queue_size; @@ -75,6 +74,7 @@ struct _GstAjaSrc { NTV2AudioSystem audio_system; NTV2VideoFormat video_format; guint32 f2_start_line; + NTV2TCIndex tc_index; GstCaps *configured_caps; GstVideoInfo configured_info;