Add configuration for audio source, embedded audio input and timecode index

This commit is contained in:
Sebastian Dröge 2021-02-09 13:24:20 +02:00
parent 453f482c0b
commit 7be26718b8
6 changed files with 397 additions and 13 deletions

View file

@ -532,6 +532,78 @@ GType gst_aja_video_format_get_type(void) {
return (GType)id;
}
GType gst_aja_audio_source_get_type(void) {
static gsize id = 0;
static const GEnumValue modes[] = {
{GST_AJA_AUDIO_SOURCE_EMBEDDED, "embedded", "Embedded"},
{GST_AJA_AUDIO_SOURCE_AES, "aes", "AES"},
{GST_AJA_AUDIO_SOURCE_ANALOG, "analog", "Analog"},
{GST_AJA_AUDIO_SOURCE_HDMI, "hdmi", "HDMI"},
{GST_AJA_AUDIO_SOURCE_MIC, "mic", "Microphone"},
{0, NULL, NULL}};
if (g_once_init_enter(&id)) {
GType tmp = g_enum_register_static("GstAjaAudioSource", modes);
g_once_init_leave(&id, tmp);
}
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"},
{0, NULL, NULL}};
if (g_once_init_enter(&id)) {
GType tmp = g_enum_register_static("GstAjaTimecodeIndex", modes);
g_once_init_leave(&id, tmp);
}
return (GType)id;
}
void gst_aja_common_init(void) {
GST_DEBUG_CATEGORY_INIT(gst_aja_debug, "aja", 0,
"Debug category for AJA plugin");

View file

@ -205,6 +205,61 @@ typedef enum {
G_GNUC_INTERNAL
GType gst_aja_video_format_get_type(void);
typedef enum {
GST_AJA_AUDIO_SOURCE_EMBEDDED,
GST_AJA_AUDIO_SOURCE_AES,
GST_AJA_AUDIO_SOURCE_ANALOG,
GST_AJA_AUDIO_SOURCE_HDMI,
GST_AJA_AUDIO_SOURCE_MIC,
} GstAjaAudioSource;
#define GST_TYPE_AJA_AUDIO_SOURCE (gst_aja_audio_source_get_type())
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_LTC1,
GST_AJA_TIMECODE_INDEX_LTC2,
} GstAjaTimecodeIndex;
#define GST_TYPE_AJA_TIMECODE_INDEX (gst_aja_timecode_index_get_type())
G_GNUC_INTERNAL
GType gst_aja_timecode_index_get_type(void);
G_GNUC_INTERNAL
void gst_aja_common_init(void);

View file

@ -35,6 +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_REFERENCE_SOURCE (GST_AJA_REFERENCE_SOURCE_AUTO)
#define DEFAULT_QUEUE_SIZE (16)
#define DEFAULT_OUTPUT_CPU_CORE (G_MAXUINT)
@ -45,6 +46,7 @@ enum {
PROP_CHANNEL,
PROP_AUDIO_SYSTEM,
PROP_OUTPUT_DESTINATION,
PROP_TIMECODE_INDEX,
PROP_REFERENCE_SOURCE,
PROP_QUEUE_SIZE,
PROP_OUTPUT_CPU_CORE,
@ -144,6 +146,14 @@ static void gst_aja_sink_class_init(GstAjaSinkClass *klass) {
(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(
"timecode-index", "Timecode Index", "Timecode index to use",
GST_TYPE_AJA_TIMECODE_INDEX, DEFAULT_TIMECODE_INDEX,
(GParamFlags)(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
G_PARAM_CONSTRUCT)));
g_object_class_install_property(
gobject_class, PROP_REFERENCE_SOURCE,
g_param_spec_enum(
@ -195,6 +205,7 @@ static void gst_aja_sink_init(GstAjaSink *self) {
self->queue_size = DEFAULT_QUEUE_SIZE;
self->audio_system_setting = DEFAULT_AUDIO_SYSTEM;
self->output_destination = DEFAULT_OUTPUT_DESTINATION;
self->timecode_index = DEFAULT_TIMECODE_INDEX;
self->reference_source = DEFAULT_REFERENCE_SOURCE;
self->output_cpu_core = DEFAULT_OUTPUT_CPU_CORE;
@ -226,6 +237,9 @@ void gst_aja_sink_set_property(GObject *object, guint property_id,
self->output_destination =
(GstAjaOutputDestination)g_value_get_enum(value);
break;
case PROP_TIMECODE_INDEX:
self->timecode_index = (GstAjaTimecodeIndex)g_value_get_enum(value);
break;
case PROP_REFERENCE_SOURCE:
self->reference_source = (GstAjaReferenceSource)g_value_get_enum(value);
break;
@ -258,6 +272,9 @@ void gst_aja_sink_get_property(GObject *object, guint property_id,
case PROP_OUTPUT_DESTINATION:
g_value_set_enum(value, self->output_destination);
break;
case PROP_TIMECODE_INDEX:
g_value_set_enum(value, self->timecode_index);
break;
case PROP_REFERENCE_SOURCE:
g_value_set_enum(value, self->reference_source);
break;
@ -1137,6 +1154,75 @@ 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
@ -1299,12 +1385,9 @@ restart:
if (item.tc.IsValid() && item.tc.fDBB != 0xffffffff) {
NTV2TimeCodes timecodes;
timecodes[::NTV2ChannelToTimecodeIndex(self->channel, false)] = item.tc;
timecodes[::NTV2ChannelToTimecodeIndex(self->channel, true)] = item.tc;
if (self->configured_info.interlace_mode !=
GST_VIDEO_INTERLACE_MODE_PROGRESSIVE)
timecodes[::NTV2ChannelToTimecodeIndex(self->channel, false, true)] =
item.tc;
for (const auto &tc_index : tc_indexes) {
timecodes[tc_index] = item.tc;
}
transfer.SetOutputTimeCodes(timecodes);
}

View file

@ -72,6 +72,7 @@ struct _GstAjaSink {
GstAjaAudioSystem audio_system_setting;
GstAjaOutputDestination output_destination;
GstAjaTimecodeIndex timecode_index;
GstAjaReferenceSource reference_source;
NTV2AudioSystem audio_system;

View file

@ -37,6 +37,9 @@ GST_DEBUG_CATEGORY_STATIC(gst_aja_src_debug);
#define DEFAULT_VIDEO_FORMAT (GST_AJA_VIDEO_FORMAT_1080i_5000)
#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_REFERENCE_SOURCE (GST_AJA_REFERENCE_SOURCE_FREERUN)
#define DEFAULT_QUEUE_SIZE (16)
#define DEFAULT_CAPTURE_CPU_CORE (G_MAXUINT)
@ -48,6 +51,9 @@ enum {
PROP_VIDEO_FORMAT,
PROP_AUDIO_SYSTEM,
PROP_INPUT_SOURCE,
PROP_AUDIO_SOURCE,
PROP_EMBEDDED_AUDIO_INPUT,
PROP_TIMECODE_INDEX,
PROP_REFERENCE_SOURCE,
PROP_QUEUE_SIZE,
PROP_CAPTURE_CPU_CORE,
@ -155,6 +161,31 @@ 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_AUDIO_SOURCE,
g_param_spec_enum(
"audio-source", "Audio Source", "Audio source to use",
GST_TYPE_AJA_AUDIO_SOURCE, DEFAULT_AUDIO_SOURCE,
(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(
"timecode-index", "Timecode Index", "Timecode index to use",
GST_TYPE_AJA_TIMECODE_INDEX, DEFAULT_TIMECODE_INDEX,
(GParamFlags)(G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
G_PARAM_CONSTRUCT)));
g_object_class_install_property(
gobject_class, PROP_REFERENCE_SOURCE,
g_param_spec_enum(
@ -207,6 +238,9 @@ static void gst_aja_src_init(GstAjaSrc *self) {
self->video_format_setting = DEFAULT_VIDEO_FORMAT;
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;
@ -240,6 +274,16 @@ void gst_aja_src_set_property(GObject *object, guint property_id,
case PROP_INPUT_SOURCE:
self->input_source = (GstAjaInputSource)g_value_get_enum(value);
break;
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;
case PROP_REFERENCE_SOURCE:
self->reference_source = (GstAjaReferenceSource)g_value_get_enum(value);
break;
@ -275,6 +319,15 @@ void gst_aja_src_get_property(GObject *object, guint property_id, GValue *value,
case PROP_INPUT_SOURCE:
g_value_set_enum(value, self->input_source);
break;
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;
case PROP_REFERENCE_SOURCE:
g_value_set_enum(value, self->reference_source);
break;
@ -608,12 +661,65 @@ static gboolean gst_aja_src_start(GstAjaSrc *self) {
GST_DEBUG_OBJECT(self, "Using audio system %d", self->audio_system);
// TODO: make configurable
NTV2AudioSource audio_source;
switch (self->audio_source) {
case GST_AJA_AUDIO_SOURCE_EMBEDDED:
audio_source = ::NTV2_AUDIO_EMBEDDED;
break;
case GST_AJA_AUDIO_SOURCE_AES:
audio_source = ::NTV2_AUDIO_AES;
break;
case GST_AJA_AUDIO_SOURCE_ANALOG:
audio_source = ::NTV2_AUDIO_ANALOG;
break;
case GST_AJA_AUDIO_SOURCE_HDMI:
audio_source = ::NTV2_AUDIO_HDMI;
break;
case GST_AJA_AUDIO_SOURCE_MIC:
audio_source = ::NTV2_AUDIO_MIC;
break;
default:
g_assert_not_reached();
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, NTV2_AUDIO_EMBEDDED,
::NTV2InputSourceToEmbeddedAudioInput(input_source));
self->device->device->SetEmbeddedAudioInput(
::NTV2ChannelToEmbeddedAudioInput(self->channel), self->audio_system);
self->audio_system, audio_source, embedded_audio_input);
self->configured_audio_channels =
::NTV2DeviceGetMaxAudioChannels(self->device_id);
self->device->device->SetNumberAudioChannels(
@ -1076,6 +1182,70 @@ 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;
@ -1192,8 +1362,8 @@ restart:
transfer.GetCapturedAncByteCount(true));
NTV2_RP188 time_code;
transfer.acTransferStatus.acFrameStamp.GetInputTimeCode(
time_code, ::NTV2ChannelToTimecodeIndex(self->channel, false));
transfer.acTransferStatus.acFrameStamp.GetInputTimeCode(time_code,
tc_index);
gint64 frame_time = transfer.acTransferStatus.acFrameStamp.acFrameTime;
gint64 now_sys = g_get_real_time();

View file

@ -65,6 +65,9 @@ struct _GstAjaSrc {
GstAjaAudioSystem audio_system_setting;
GstAjaVideoFormat video_format_setting;
GstAjaInputSource input_source;
GstAjaAudioSource audio_source;
GstAjaEmbeddedAudioInput embedded_audio_input;
GstAjaTimecodeIndex timecode_index;
GstAjaReferenceSource reference_source;
guint queue_size;
guint capture_cpu_core;