58#include <condition_variable>
70#include <unordered_map>
85#include <ajantv2/includes/ntv2rp188.h>
87#pragma GCC diagnostic push
88#pragma GCC diagnostic ignored "-Wcast-qual"
89#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
90#pragma GCC diagnostic ignored "-Woverloaded-virtual"
92#include "ntv2devicescanner.h"
94#pragma GCC diagnostic pop
96#include "ajabase/common/types.h"
97#include "ajabase/common/videotypes.h"
98#include "ajabase/common/circularbuffer.h"
99#include "ajabase/system/process.h"
100#include "ajabase/system/systemtime.h"
101#include "ajabase/system/thread.h"
103#include "ntv2utils.h"
104#include "ntv2devicefeatures.h"
106#define NTV2_AUDIOSIZE_MAX (401 * 1024)
110#define MOD_NAME "[AJA cap.] "
122#define LINK_SPEC extern "C" __declspec(dllexport)
124#define LINK_SPEC static
127#define CHECK_OK(cmd, msg, action_failed) do { bool ret = cmd; if (!ret) {\
128 LOG(LOG_LEVEL_WARNING) << MOD_NAME << (msg) << "\n";\
132#define NOOP ((void)0)
134#define CHECK_RET_FAIL(cmd) CHECK_OK(cmd, #cmd " failed", return AJA_STATUS_FAIL)
135#define CHECK(cmd) CHECK_OK(cmd, #cmd " failed", NOOP)
137namespace chrono = std::chrono;
138using std::condition_variable;
141using std::ostringstream;
142using std::runtime_error;
144using std::shared_ptr;
147using std::unique_lock;
148using std::unordered_map;
162static const ULWord
app = AJA_FOURCC (
'U',
'L',
'G',
'R');
166 vidcap_state_aja(unordered_map<string, string>
const & parameters,
int audioFlags);
194 chrono::system_clock::time_point
mT0{chrono::system_clock::now()};
213 bool IsInput3Gb(
const NTV2InputSource inputSource);
225 bool colorSpaceSet =
false;
227 for (
auto const &it : parameters) {
228 if (it.first ==
"progressive") {
230 }
else if (it.first ==
"4K" || it.first ==
"4k") {
232 }
else if (it.first ==
"clear-routing") {
234 }
else if (it.first ==
"device") {
236 }
else if (it.first ==
"channel") {
238 }
else if (it.first ==
"codec") {
240 throw string(
"Unknown codec " + it.second +
"!");
250 throw string(
"Cannoc map " + it.second +
" to AJA codec!");
252 }
else if (it.first ==
"connection") {
253 NTV2InputSource
source = NTV2InputSource();
254 while (
source != NTV2_INPUTSOURCE_INVALID) {
255 if (NTV2InputSourceToString(
source,
true) == it.second) {
263 if (
source == NTV2_INPUTSOURCE_INVALID) {
264 throw string(
"Unknown source " + it.second +
"!");
266 }
else if (it.first ==
"format") {
267 NTV2VideoFormat format = NTV2VideoFormat();
268 while (format != NTV2_MAX_NUM_VIDEO_FORMATS) {
269 if (NTV2VideoFormatToString(format) == it.second) {
273 format = (NTV2VideoFormat) ((
int) format + 1);
275 if (format == NTV2_MAX_NUM_VIDEO_FORMATS) {
276 throw string(
"Unknown format " + it.second +
"!");
278 }
else if (it.first ==
"RGB") {
280 throw string(
"Both RGB and YUV input specified!") + it.first;
282 colorSpaceSet =
true;
284 }
else if (it.first ==
"YUV") {
286 throw string(
"Both RGB and YUV input specified!") + it.first;
288 colorSpaceSet =
true;
291 throw string(
"Unknown option: ") + it.first;
297 "probably channel 1. Consider passing \"channel\" option (see help).\n";
308 if (!colorSpaceSet) {
328 " Specifies application FourCC for AJA.\n");
332 AJAStatus
status (AJA_STATUS_SUCCESS);
335 CNTV2DeviceScanner deviceScanner;
338 if (deviceScanner.GetNumDevices () == 0)
339 throw string(
"No devices found!");
342 throw string(
"Device index exceeds number of available devices!");
349 throw string(
"Unable to open device.");
361 memcpy(fcc_s, fcc_req, min<int>(strlen(fcc_req), 4));
362 fourcc = AJA_FOURCC(fcc_s[0], fcc_s[1], fcc_s[2], fcc_s[3]);
365 if (!
mDevice.AcquireStreamForApplication (fourcc,
static_cast <uint32_t
> (getpid())))
366 throw string(
"Cannot aquire stream.");
378 throw string(
"Cannot setup video. Err = ") + to_string(
status);
382 throw string(
"Cannot setup audio. Err = ") + to_string(
status);
397 CHECK(
mDevice.ReleaseStreamForApplication (
app,
static_cast <uint32_t
> (getpid())));
406 NTV2VideoFormat videoFormat (NTV2_FORMAT_UNKNOWN);
410 case NTV2_INPUTSOURCE_SDI1:
411 case NTV2_INPUTSOURCE_SDI5:
414 const ULWord ndx (::GetIndexForNTV2InputSource (
mInputSource));
415 if (::NTV2DeviceCanDoMultiFormat (
mDeviceID))
417 source = ::GetNTV2InputSourceForIndex (ndx + 0);
420 NTV2Standard videoStandard (::GetNTV2StandardFromVideoFormat (videoFormat));
421 if (
mCheckFor4K && (videoStandard == NTV2_STANDARD_1080p))
423 if (::NTV2DeviceCanDoMultiFormat (
mDeviceID))
426 bool allSDISameInput =
true;
427 NTV2VideoFormat videoFormatNext;
428 for (i = 1; i < 4; i++) {
429 source = ::GetNTV2InputSourceForIndex (ndx + i);
432 if (videoFormatNext != videoFormat) {
433 allSDISameInput =
false;
438 videoFormat = GetQuadSizedVideoFormat(videoFormat);
440 LOG(
LOG_LEVEL_WARNING) <<
"Input " << NTV2InputSourceToString(::GetNTV2InputSourceForIndex(ndx + i),
true) <<
" has input format " << NTV2VideoFormatToString(videoFormatNext) <<
" which differs from " << NTV2VideoFormatToString(videoFormat) <<
" on " << NTV2InputSourceToString(::GetNTV2InputSourceForIndex(ndx),
true) <<
"!\n";
442 if (
mCheckFor4K && (videoStandard != NTV2_STANDARD_1080p)) {
448 case NTV2_NUM_INPUTSOURCES:
462 if (NTV2DeviceHasBiDirectionalSDI (
mDeviceID) && NTV2_INPUT_SOURCE_IS_SDI (
source))
464 NTV2Channel channel = ::NTV2InputSourceToChannel(
source);
466 for (
unsigned ndx (0); ndx < 10; ndx++)
477 NTV2LHIHDMIColorSpace hdmiColor (NTV2_LHIHDMIColorSpaceRGB);
483 if (NTV2_IS_4K_VIDEO_FORMAT (
mVideoFormat) && !
mDevice.features().CanDoHDMIQuadRasterConversion()) {
495 if ((hdmiColor == NTV2_LHIHDMIColorSpaceYCbCr && IsRGBFormat(
mPixelFormat))
496 || (hdmiColor == NTV2_LHIHDMIColorSpaceRGB && !IsRGBFormat(
mPixelFormat))) {
500 hdmiColor == NTV2_LHIHDMIColorSpaceRGB ,
offset)));
501 CHECK_RET_FAIL(
mDevice.Connect (GetTSIMuxInputXptFromChannel((NTV2Channel)
offset,
false), GetCSCOutputXptFromChannel (channel,
false, hdmiColor != NTV2_LHIHDMIColorSpaceRGB )));
509 GetTSIMuxOutputXptFromChannel((NTV2Channel) (
offset / 2),
offset % 2 == 1 )));
511 }
else if (NTV2_IS_4K_VIDEO_FORMAT (
mVideoFormat) &&
mDevice.features().CanDoHDMIQuadRasterConversion()) {
518 if ((hdmiColor == NTV2_LHIHDMIColorSpaceYCbCr && IsRGBFormat(
mPixelFormat))
519 || (hdmiColor == NTV2_LHIHDMIColorSpaceRGB && !IsRGBFormat(
mPixelFormat))) {
521 ::GetInputSourceOutputXpt (
mInputSource,
false, hdmiColor == NTV2_LHIHDMIColorSpaceRGB , channel )));
523 ::GetCSCOutputXptFromChannel (channel,
false, hdmiColor != NTV2_LHIHDMIColorSpaceRGB )));
526 ::GetInputSourceOutputXpt (
mInputSource,
false, hdmiColor == NTV2_LHIHDMIColorSpaceRGB , channel )));
533 if ((hdmiColor == NTV2_LHIHDMIColorSpaceYCbCr && IsRGBFormat(
mPixelFormat))
534 || (hdmiColor == NTV2_LHIHDMIColorSpaceRGB && !IsRGBFormat(
mPixelFormat))) {
536 ::GetInputSourceOutputXpt (
mInputSource,
false, hdmiColor == NTV2_LHIHDMIColorSpaceRGB , 0)));
538 ::GetCSCOutputXptFromChannel (
mInputChannel,
false, hdmiColor != NTV2_LHIHDMIColorSpaceRGB )));
541 ::GetInputSourceOutputXpt (
mInputSource,
false, hdmiColor == NTV2_LHIHDMIColorSpaceRGB , 0)));
546 if (NTV2DeviceGetHDMIVersion(
mDeviceID) == 2) {
554 return AJA_STATUS_SUCCESS;
562 return AJA_STATUS_BAD_PARAM;
570 oss <<
"## ERROR: Cannot use channel '" <<
mInputChannel+1 <<
"' -- device only supports channel 1"
571 << (::NTV2DeviceGetNumFrameStores (
mDeviceID) > 1 ? string (
" thru ") + string (1, uint8_t (::NTV2DeviceGetNumFrameStores (
mDeviceID)+
'0')) :
"");
572 throw runtime_error(oss.str());
609 return AJA_STATUS_NOINPUT;
641 NTV2Channel SDIChannel = (NTV2Channel) ((
int) NTV2InputSourceToChannel (
mInputSource) +
offset);
645 CHECK(
mDevice.Connect (::GetDLInInputXptFromChannel(channel,
false), ::GetSDIInputOutputXptFromChannel (SDIChannel,
false)));
646 CHECK(
mDevice.Connect (::GetDLInInputXptFromChannel(channel,
true), ::GetSDIInputOutputXptFromChannel (SDIChannel,
true)));
650 CHECK(
mDevice.Connect (::GetCSCInputXptFromChannel (channel), ::GetSDIInputOutputXptFromChannel (SDIChannel)));
651 CHECK(
mDevice.Connect (::GetFrameBufferInputXptFromChannel (channel), ::GetCSCOutputXptFromChannel (SDIChannel,
false,
true)));
653 CHECK(
mDevice.Connect (::GetFrameBufferInputXptFromChannel (channel), ::GetDLInOutputXptFromChannel(SDIChannel)));
655 CHECK(
mDevice.Connect (::GetFrameBufferInputXptFromChannel (channel), ::GetSDIInputOutputXptFromChannel (SDIChannel)));
657 CHECK(
mDevice.Connect (::GetCSCInputXptFromChannel (channel), ::GetDLInOutputXptFromChannel(SDIChannel)));
658 CHECK(
mDevice.Connect (::GetFrameBufferInputXptFromChannel (channel), ::GetCSCOutputXptFromChannel (SDIChannel,
false,
true)));
679 CHECK(
mDevice.SetReference (NTV2_REFERENCE_ANALOG_INPUT));
691 MSG(ERROR,
"Cannot find valid mapping from AJA pixel format to "
693 return AJA_STATUS_NOINPUT;
696 return AJA_STATUS_SUCCESS;
703 return AJA_STATUS_SUCCESS;
713 return AJA_STATUS_FAIL;
717 return AJA_STATUS_FAIL;
742 mAudio.sample_rate = 48000;
750 return AJA_STATUS_SUCCESS;
764 GetFramesPerSecond(GetNTV2FrameRateFromVideoFormat(
mVideoFormat)),
778 NTV2_FORMAT_UNKNOWN) {
779 MSG(WARNING,
"## WARNING: No video signal present on the "
780 "input connector\n");
786 return AJA_STATUS_SUCCESS;
821 uint32_t currentAudioInAddress = 0;
822 uint32_t audioReadOffset = 0;
823 uint32_t audioInWrapAddress = 0;
824 uint32_t audioOutWrapAddress = 0;
825 uint32_t audioBytesCaptured = 0;
826 NTV2FieldID fieldID = NTV2_VIDEO_FORMAT_HAS_PROGRESSIVE_PICTURE(
mVideoFormat) ? NTV2_FIELD0 : NTV2_FIELD1;
843 audioInWrapAddress = audioOutWrapAddress + audioReadOffset;
849 uint32_t *pHostAudioBuffer = NULL;
857 currentAudioInAddress &= ~0x7f;
858 currentAudioInAddress += audioReadOffset;
860 if (((currentAudioInAddress + (audioInWrapAddress - audioReadOffset) -
mAudioInLastAddress)
875 audioReadOffset, currentAudioInAddress - audioReadOffset));
877 audioBytesCaptured += currentAudioInAddress - audioReadOffset;
894 if (out->color_spec ==
R12L) {
896 vc_copylineR12AtoR12L((
unsigned char *) converted->tiles[0].data, (
unsigned char *) out->tiles[0].data, out->tiles[0].data_len, 0, 0, 0);
897 out = std::move(converted);
901 NTV2_RP188 timecodeValue;
902 string timeCodeString;
905 CRP188 inputRP188Info (timecodeValue);
906 CHECK(inputRP188Info.GetRP188Str (timeCodeString));
907 LOG(
LOG_LEVEL_DEBUG) <<
"AJA: Captured frame with timecode: " << timeCodeString <<
'\n';
915 if (readBackIn == currentInFrame) {
918 <<
"## WARNING: Drop detected: current in "
919 << currentInFrame <<
", readback in " << readBackIn
944 if (
mOutputFrameReady.wait_for(lk, chrono::milliseconds(100), [
this]{return mOutputFrame != NULL;}) ==
false) {
950 static auto dispose = [](
video_frame *f) {
delete static_cast<shared_ptr<video_frame> *
>(f->callbacks.dispose_udata); };
956 for (
int i = 0; i <
mAudio.ch_count; ++i) {
970 chrono::system_clock::time_point now = chrono::system_clock::now();
971 double seconds = chrono::duration_cast<chrono::microseconds>(now -
mT0).count() / 1000000.0;
975 << seconds <<
" seconds = " <<
mFrames / seconds <<
" FPS\n";
987 CHECK(
mDevice.GetSDIInput3GbPresent (is3Gb, ::NTV2InputSourceToChannel (inputSource)));
994 col() <<
SBOLD(
SRED(
"\t-t aja") <<
"[[:4K][:clear-routing][:channel=<ch>][:codec=<pixfmt>][:connection=<c>][:device=<idx>][:format=<fmt>][:progressive][:RGB|:YUV]|:help] -r [embedded|AESEBU|analog]")
"\n";
998 col() <<
"\t\tVideo input is 4K.\n";
1000 col() <<
SBOLD(
"\tclear-routing")
"\n" <<
1001 "\t\tremove all existing signal paths for device\n";
1004 col() <<
"\t\tChannel number to use (indexed from 1). Doesn't need to "
1005 "be set for SDI, useful for HDMI (capture and display should "
1006 "have different channel numbers if both used, also other than "
1007 "1 if SDI1 is in use).\n";
1009 col() <<
SBOLD(
"\tconnection")
"\n" <<
1010 "\t\tConnection can be one of: ";
1011 NTV2InputSource
source = NTV2InputSource();
1012 while (
source != NTV2_INPUTSOURCE_INVALID) {
1016 col() << NTV2InputSourceToString(
source,
true);
1023 col() <<
SBOLD(
"\tprogressive")
"\n";
1024 col() <<
"\t\tVideo input is progressive.\n";
1027 col() <<
"\t\tSet SDI video input to RGB or YCbCr explicitly. If "
1028 "capture pixel format is set, expect the same encoding on "
1029 "input. You can override this setting by specifying the "
1030 "signal color space explicitly by this option (see "
1031 "https://github.com/CESNET/UltraGrid/wiki/"
1032 "Device-Settings#RGB_over_SDI for details).\n";
1035 printf(
"Available devices:\n");
1036 CNTV2DeviceScanner deviceScanner;
1037 for (
unsigned int i = 0; i < deviceScanner.GetNumDevices (); i++) {
1039 if (!CNTV2DeviceScanner::GetDeviceAtIndex(i, device)) {
1040 MSG(WARNING,
"Cannot get device at index #%u!\n", i);
1045 <<
SBOLD(device.GetDisplayName());
1047 const NTV2DeviceID deviceID = device.GetBaseDeviceID();
1048 NTV2VideoFormatSet fmt_set;
1049 if (NTV2DeviceGetSupportedVideoFormats(deviceID, fmt_set)) {
1051 for (
auto fmt : fmt_set) {
1052 if (
fmt != *fmt_set.begin()) {
1055 col() <<
" \"" << NTV2VideoFormatToString(
fmt)
1060 NTV2FrameBufferFormatSet pix_fmts;
1061 if (NTV2DeviceGetSupportedPixelFormats(deviceID, pix_fmts)) {
1062 if (pix_fmts.count(NTV2_FBF_10BIT_YCBCR) == 0 && NTV2DeviceCanDoFrameBufferFormat(deviceID, NTV2_FBF_10BIT_YCBCR)) {
1063 pix_fmts.insert(NTV2_FBF_10BIT_YCBCR);
1066 for (
auto fmt : pix_fmts) {
1067 if (
fmt != *pix_fmts.begin()) {
1073 << NTV2FrameBufferFormatToString(
1075 <<
" (unsupported)";
1084 col() <<
SUNDERLINE(
"\tNumber of frame stores: ") << NTV2DeviceGetNumFrameStores (deviceID) <<
"\n";
1086 if (deviceScanner.GetNumDevices() == 0) {
1094 unordered_map<string, string> parameters_map;
1096 if (strcmp(tmp,
"help") == 0) {
1101 char *
item, *cfg = tmp;
1102 while ((
item = strtok(cfg,
":"))) {
1103 char *key_cstr =
item;
1104 if (strchr(
item,
'=')) {
1105 char *val_cstr = strchr(
item,
'=') + 1;
1106 *strchr(
item,
'=') =
'\0';
1107 parameters_map[key_cstr] = val_cstr;
1109 parameters_map[key_cstr] = string();
1119 }
catch (
string const & s) {
1150 CNTV2DeviceScanner deviceScanner;
1151 for (
unsigned int i = 0; i < deviceScanner.GetNumDevices (); i++) {
1153 if (!CNTV2DeviceScanner::GetDeviceAtIndex(i, device)) {
1154 MSG(WARNING,
"Cannot get device at index #%u!\n", i);
1159 realloc(cards, card_count *
sizeof(
struct device_info));
1160 memset(&cards[card_count - 1], 0,
sizeof(
struct device_info));
1161 snprintf(cards[card_count - 1].
dev,
sizeof cards[card_count - 1].
dev,
1163 snprintf(cards[card_count - 1].
name,
sizeof cards[card_count - 1].
name,
1164 "AJA %s", device.GetDisplayName().c_str());
1165 snprintf(cards[card_count - 1].
extra,
sizeof cards[card_count - 1].
extra,
1166 "\"embeddedAudioAvailable\":\"t\"");
1169 *available_cards = cards;
1170 *
count = card_count;
void print_aja_device_details(CNTV2Card *device)
void vc_copylineR12AtoR12L(unsigned char *__restrict dst, const unsigned char *__restrict src, int dstlen, int rshift, int gshift, int bshift)
struct audio_frame ** audio
int void(** deleter)(void *))
__declspec(dllimport) int vidcap_aja_init(struct vidcap_params *params
const char * get_codec_name(codec_t codec)
codec_t get_codec_from_name(const char *name)
This file contains definition of some common audio types.
struct video_frame * grab(struct audio_frame **audio)
NTV2EveryFrameTaskMode mSavedTaskMode
My device identifier.
NTV2InputSource mInputSource
Wide VANC?
NTV2Channel mInputChannel
Used to restore prior every-frame task mode.
uint32_t mAudioBufferSize
My video buffer size, in bytes.
chrono::system_clock::time_point mT0
NTV2AudioSource mAudioSource
unsigned int mDeviceIndex
NTV2TCIndex mTimeCodeSource
Time code source.
size_t mOutputAudioFrameSize
NTV2VideoFormat GetVideoFormatFromInputSource()
void EnableInput(NTV2InputSource source)
NTV2VideoFormat mVideoFormat
My input channel.
shared_ptr< uint32_t > mOutputAudioFrame
thread mProducerThread
My audio buffer size, in bytes.
virtual void StartProducerThread(void)
Starts my frame consumer thread.
bool IsInput3Gb(const NTV2InputSource inputSource)
uint32_t mVideoBufferSize
The audio system I'm using.
NTV2AudioSystem mAudioSystem
The input source I'm using.
video_frame_pool mPool
My producer thread object – does the frame capturing.
vidcap_state_aja(unordered_map< string, string > const ¶meters, int audioFlags)
bool mWideVanc
VANC enabled?
static void ProducerThreadStatic(vidcap_state_aja *pContext)
bool mInputIsRGB
SDI Input is in RGB otherwise YCbCr.
condition_variable mOutputFrameReady
uint32_t mAudioInLastAddress
My record of the location of the last audio sample captured.
NTV2VANCMode mVancMode
My pixel format.
NTV2FrameBufferFormat mPixelFormat
My video format.
shared_ptr< video_frame > mOutputFrame
virtual ~vidcap_state_aja()
virtual void CaptureFrames(void)
static __device__ const float offset
void log_msg(int level, const char *format,...)
#define LOG_LEVEL_NOTICE
information that may be interesting
#define LOG_LEVEL_INFO
normal reporting
#define LOG_LEVEL_ERROR
general errors
#define LOG_LEVEL_WARNING
less severe errors
#define VIDCAP_INIT_NOERR
state not initialized, other action performed (typically help)
#define VIDCAP_INIT_OK
initialization successful
#define VIDCAP_NO_GENERIC_FPS_INDICATOR
#define VIDEO_CAPTURE_ABI_VERSION
#define VIDCAP_INIT_FAIL
error ocured
const char * get_commandline_param(const char *key)
unsigned int audio_capture_channels
#define DEFAULT_AUDIO_CAPTURE_CHANNELS
#define ADD_TO_PARAM(param, doc)
static void * aligned_malloc(size_t size, size_t alignment)
@ LIBRARY_CLASS_VIDEO_CAPTURE
#define REGISTER_MODULE(name, info, lclass, abi)
Registers module to global modules' registry.
static const std::map< NTV2FrameBufferFormat, codec_t > codec_map
video_frame_pool_allocator * clone() const override
void * allocate(size_t size) override
void deallocate(void *ptr) override
struct used to comunicate with audio capture/playback device
void(* dispose)(struct video_frame *)
std::shared_ptr< video_frame > get_frame()
void reconfigure(struct video_desc new_desc, size_t new_size=SIZE_MAX)
Struct video_frame represents a video frame and contains video description.
struct video_frame_callbacks callbacks
@ PROGRESSIVE
progressive frame
@ INTERLACED_MERGED
Columngs of both fields are interlaced together.
@ VIDEO_CODEC_NONE
dummy color spec
@ R12L
RGB 12-bit packed, little-endian.
struct audio_desc audio_desc_from_frame(const struct audio_frame *frame)
void remux_channel(char *out, const char *in, int bps, int in_len, int in_stream_channels, int out_stream_channels, int pos_in_stream, int pos_out_stream)
This is an umbrella header for video functions.
#define CHECK_OK(cmd, msg, action_failed)
#define CHECK_RET_FAIL(cmd)
LINK_SPEC int vidcap_aja_init(struct vidcap_params *params, void **state)
static const struct video_capture_info vidcap_aja_info
LINK_SPEC struct video_frame * vidcap_aja_grab(void *state, struct audio_frame **audio)
LINK_SPEC void vidcap_aja_probe(device_info **available_cards, int *count, void(**deleter)(void *))
#define NTV2_AUDIOSIZE_MAX
LINK_SPEC void vidcap_aja_done(void *state)
unsigned int * aja_audio_capture_channels
const char * vidcap_params_get_fmt(const struct vidcap_params *params)
unsigned int vidcap_params_get_flags(const struct vidcap_params *params)
#define VIDCAP_FLAG_AUDIO_AESEBU
AES/EBU audio.
#define VIDCAP_FLAG_AUDIO_ANALOG
(balanced) analog audio
#define VIDCAP_FLAG_AUDIO_ANY
#define VIDCAP_FLAG_AUDIO_EMBEDDED
HD-SDI embedded audio.