UltraGrid
UltraGrid Low-Latency High-Resolution Transmission System
Loading...
Searching...
No Matches
sdi.cpp File Reference
#include "audio/audio_capture.h"
#include "audio/capture/sdi.h"
#include "audio/types.h"
#include "debug.h"
#include "host.h"
#include "lib_common.h"
#include "types.h"
#include <condition_variable>
#include <chrono>
#include <mutex>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Include dependency graph for sdi.cpp:

Go to the source code of this file.

Classes

struct  state_sdi_capture
 

Macros

#define DEFAULT_BUF_SIZE_MS   100L
 
#define FRAME_CAPTURE   1
 
#define FRAME_NETWORK   0
 
#define MOD_NAME   "[acap.] "
 

Functions

static void audio_cap_sdi_done (void *state)
 
static void audio_cap_sdi_help (const char *driver_name)
 
static void * audio_cap_sdi_init (struct module *parent, const char *cfg)
 
static void audio_cap_sdi_probe_aesebu (struct device_info **available_devices, int *count, void(**deleter)(void *))
 
static void audio_cap_sdi_probe_analog (struct device_info **available_devices, int *count, void(**deleter)(void *))
 
static void audio_cap_sdi_probe_common (struct device_info **available_devices, int *count, const char *dev, const char *name)
 
static void audio_cap_sdi_probe_embedded (struct device_info **available_devices, int *count, void(**deleter)(void *))
 
static struct audio_frame * audio_cap_sdi_read (void *state)
 
 REGISTER_MODULE (AESEBU, &acap_sdi_info_aesebu, LIBRARY_CLASS_AUDIO_CAPTURE, AUDIO_CAPTURE_ABI_VERSION)
 
 REGISTER_MODULE (analog, &acap_sdi_info_analog, LIBRARY_CLASS_AUDIO_CAPTURE, AUDIO_CAPTURE_ABI_VERSION)
 
 REGISTER_MODULE (embedded, &acap_sdi_info_embedded, LIBRARY_CLASS_AUDIO_CAPTURE, AUDIO_CAPTURE_ABI_VERSION)
 
void sdi_capture_new_incoming_frame (void *state, struct audio_frame *frame)
 

Variables

static const struct audio_capture_info acap_sdi_info_aesebu
 
static const struct audio_capture_info acap_sdi_info_analog
 
static const struct audio_capture_info acap_sdi_info_embedded
 

Detailed Description

Author
Martin Pulec pulec.nosp@m.@ces.nosp@m.net.c.nosp@m.z

Definition in file sdi.cpp.

Macro Definition Documentation

◆ DEFAULT_BUF_SIZE_MS

#define DEFAULT_BUF_SIZE_MS   100L

Definition at line 60 of file sdi.cpp.

◆ FRAME_CAPTURE

#define FRAME_CAPTURE   1

Definition at line 63 of file sdi.cpp.

Referenced by audio_cap_sdi_read(), and sdi_capture_new_incoming_frame().

◆ FRAME_NETWORK

#define FRAME_NETWORK   0

Definition at line 62 of file sdi.cpp.

Referenced by audio_cap_sdi_read().

◆ MOD_NAME

#define MOD_NAME   "[acap.] "

Definition at line 64 of file sdi.cpp.

Referenced by sdi_capture_new_incoming_frame().

Function Documentation

◆ audio_cap_sdi_done()

static void audio_cap_sdi_done ( void * state)
static

Definition at line 153 of file sdi.cpp.

154{
155 struct state_sdi_capture *s;
156
157 s = (struct state_sdi_capture *) state;
158 for(int i = 0; i < 2; ++i) {
159 free(s->audio_frame[i].data);
160 }
161}
void ** state
char * data
Definition types.h:102
struct audio_frame audio_frame[2]
Definition sdi.cpp:80

References state_sdi_capture::audio_frame, audio_frame::data, and state.

◆ audio_cap_sdi_help()

static void audio_cap_sdi_help ( const char * driver_name)
static

Definition at line 163 of file sdi.cpp.

164{
165 if(strcmp(driver_name, "embedded") == 0) {
166 printf("\tembedded[:<index>] : SDI audio (if available)\n");
167 } else if(strcmp(driver_name, "AESEBU") == 0) {
168 printf("\tAESEBU[:<index>] : separately connected AES/EBU to a grabbing card (if available)\n");
169 } else if(strcmp(driver_name, "analog") == 0) {
170 printf("\tanalog[:<index>] : analog input of grabbing card (if available)\n");
171 }
172}

Referenced by audio_cap_sdi_init().

◆ audio_cap_sdi_init()

static void * audio_cap_sdi_init ( struct module * parent,
const char * cfg )
static

Definition at line 115 of file sdi.cpp.

116{
117 UNUSED(parent);
118 if (strcmp(cfg, "help") == 0) {
119 printf("Available vidcap audio devices:\n");
120 audio_cap_sdi_help("embedded");
121 audio_cap_sdi_help("AESEBU");
122 audio_cap_sdi_help("analog");
123 printf("\t\twhere <index> is index of vidcap device "
124 "to be taken audio from.\n");
125 return INIT_NOERR;
126 }
127
128 return new state_sdi_capture();
129}
#define UNUSED(x)
#define INIT_NOERR
Definition host.h:73
static void audio_cap_sdi_help(const char *driver_name)
Definition sdi.cpp:163
const char * parent
Definition settings.cpp:198

References audio_cap_sdi_help(), INIT_NOERR, parent, and UNUSED.

Here is the call graph for this function:

◆ audio_cap_sdi_probe_aesebu()

static void audio_cap_sdi_probe_aesebu ( struct device_info ** available_devices,
int * count,
void(** deleter )(void *) )
static

Definition at line 103 of file sdi.cpp.

104{
105 *deleter = free;
106 audio_cap_sdi_probe_common(available_devices, count, "", "Digital AES/EBU audio");
107}
int void(** deleter)(void *))
int count
Definition hd-rum.c:44
static void audio_cap_sdi_probe_common(struct device_info **available_devices, int *count, const char *dev, const char *name)
Definition sdi.cpp:87

References audio_cap_sdi_probe_common(), count, and deleter.

Here is the call graph for this function:

◆ audio_cap_sdi_probe_analog()

static void audio_cap_sdi_probe_analog ( struct device_info ** available_devices,
int * count,
void(** deleter )(void *) )
static

Definition at line 109 of file sdi.cpp.

110{
111 *deleter = free;
112 audio_cap_sdi_probe_common(available_devices, count, "", "Analog audio through capture card");
113}

References audio_cap_sdi_probe_common(), count, and deleter.

Here is the call graph for this function:

◆ audio_cap_sdi_probe_common()

static void audio_cap_sdi_probe_common ( struct device_info ** available_devices,
int * count,
const char * dev,
const char * name )
static

Definition at line 87 of file sdi.cpp.

89{
90 *available_devices = (struct device_info *) calloc(1, sizeof(struct device_info));
91 strncpy((*available_devices)[0].dev, dev, sizeof (*available_devices)[0].dev - 1);
92 strncpy((*available_devices)[0].name, name, sizeof (*available_devices)[0].name - 1);
93 snprintf((*available_devices)[0].extra, sizeof (*available_devices)[0].extra, "\"isEmbeddedAudio\":\"t\"");
94 *count = 1;
95}
const char * name
Definition settings.cpp:193
char extra[1024]
Definition types.h:389
char dev[1024]
Definition types.h:383

References count, device_info::dev, device_info::extra, and name.

Referenced by audio_cap_sdi_probe_aesebu(), audio_cap_sdi_probe_analog(), and audio_cap_sdi_probe_embedded().

◆ audio_cap_sdi_probe_embedded()

static void audio_cap_sdi_probe_embedded ( struct device_info ** available_devices,
int * count,
void(** deleter )(void *) )
static

Definition at line 97 of file sdi.cpp.

98{
99 *deleter = free;
100 audio_cap_sdi_probe_common(available_devices, count, "", "Embedded SDI/HDMI audio");
101}

References audio_cap_sdi_probe_common(), count, and deleter.

Here is the call graph for this function:

◆ audio_cap_sdi_read()

static struct audio_frame * audio_cap_sdi_read ( void * state)
static

Definition at line 131 of file sdi.cpp.

132{
133 struct state_sdi_capture *s = (struct state_sdi_capture *) state;
134
135 unique_lock<mutex> lk(s->lock);
136 bool rc = s->audio_frame_ready_cv.wait_for(lk, milliseconds(100), [s]{return s->audio_frame[FRAME_CAPTURE].data_len > 0;});
137
138 if (rc == false) {
139 return NULL;
140 }
141
142 // FRAME_NETWORK has been "consumed"
144 // swap
145 struct audio_frame tmp;
146 memcpy(&tmp, &s->audio_frame[FRAME_CAPTURE], sizeof(struct audio_frame));
147 memcpy(&s->audio_frame[FRAME_CAPTURE], &s->audio_frame[FRAME_NETWORK], sizeof(struct audio_frame));
148 memcpy(&s->audio_frame[FRAME_NETWORK], &tmp, sizeof(struct audio_frame));
149
150 return &s->audio_frame[FRAME_NETWORK];
151}
#define FRAME_NETWORK
Definition sdi.cpp:62
#define FRAME_CAPTURE
Definition sdi.cpp:63
struct used to comunicate with audio capture/playback device
Definition types.h:99
int data_len
Definition types.h:103
condition_variable audio_frame_ready_cv
Definition sdi.cpp:82

References state_sdi_capture::audio_frame, state_sdi_capture::audio_frame_ready_cv, audio_frame::data_len, FRAME_CAPTURE, FRAME_NETWORK, state_sdi_capture::lock, and state.

◆ REGISTER_MODULE() [1/3]

REGISTER_MODULE ( AESEBU ,
& acap_sdi_info_aesebu,
LIBRARY_CLASS_AUDIO_CAPTURE ,
AUDIO_CAPTURE_ABI_VERSION  )

◆ REGISTER_MODULE() [2/3]

REGISTER_MODULE ( analog ,
& acap_sdi_info_analog,
LIBRARY_CLASS_AUDIO_CAPTURE ,
AUDIO_CAPTURE_ABI_VERSION  )

◆ REGISTER_MODULE() [3/3]

REGISTER_MODULE ( embedded ,
& acap_sdi_info_embedded,
LIBRARY_CLASS_AUDIO_CAPTURE ,
AUDIO_CAPTURE_ABI_VERSION  )

◆ sdi_capture_new_incoming_frame()

void sdi_capture_new_incoming_frame ( void * state,
struct audio_frame * frame )

Definition at line 174 of file sdi.cpp.

175{
176 struct state_sdi_capture *s;
177
178 s = (struct state_sdi_capture *) state;
179
180 unique_lock<mutex> lk(s->lock);
181
182 if (s->audio_frame[FRAME_CAPTURE].bps != frame->bps ||
183 s->audio_frame[FRAME_CAPTURE].ch_count != frame->ch_count ||
184 s->audio_frame[FRAME_CAPTURE].sample_rate != frame->sample_rate) {
186 s->audio_frame[FRAME_CAPTURE].ch_count = frame->ch_count;
187 s->audio_frame[FRAME_CAPTURE].sample_rate = frame->sample_rate;
189 s->audio_frame[FRAME_CAPTURE].max_size = frame->bps * frame->ch_count * frame->sample_rate / 1000L * s->buf_size_ms;
190 s->audio_frame[FRAME_CAPTURE].data = static_cast<char *>(malloc(s->audio_frame[FRAME_CAPTURE].max_size));
191 }
192
193 int len = frame->data_len;
195 LOG(LOG_LEVEL_WARNING) << MOD_NAME << "Maximal audio buffer length " << s->buf_size_ms << " ms exceeded! Dropping "
196 << len - (s->audio_frame[FRAME_CAPTURE].max_size - s->audio_frame[FRAME_CAPTURE].data_len) << " samples.\n";
198 }
200 frame->data, len);
201 if (s->audio_frame[FRAME_CAPTURE].data_len == 0 && (frame->flags & TIMESTAMP_VALID) != 0) {
204 }
206
207 lk.unlock();
208 s->audio_frame_ready_cv.notify_one();
209}
struct video_frame * frame
int void size_t * len
#define LOG(level)
Definition debug.h:313
#define LOG_LEVEL_WARNING
less severe errors
Definition debug.h:60
#define MOD_NAME
Definition sdi.cpp:64
int sample_rate
Definition types.h:101
int64_t timestamp
Definition types.h:109
int ch_count
Definition types.h:104
int flags
Definition types.h:111
int bps
Definition types.h:100
int max_size
Definition types.h:105
long buf_size_ms
Definition sdi.cpp:79
int64_t timestamp
Definition types.h:331
int flags
Definition types.h:329
@ TIMESTAMP_VALID
timestamp set by source (in 90 kHz clock)
Definition types.h:223

References state_sdi_capture::audio_frame, state_sdi_capture::audio_frame_ready_cv, audio_frame::bps, state_sdi_capture::buf_size_ms, audio_frame::ch_count, audio_frame::data, audio_frame::data_len, audio_frame::flags, video_frame::flags, frame, FRAME_CAPTURE, len, state_sdi_capture::lock, LOG, LOG_LEVEL_WARNING, audio_frame::max_size, MOD_NAME, audio_frame::sample_rate, state, audio_frame::timestamp, video_frame::timestamp, and TIMESTAMP_VALID.

Referenced by audio_sdi_send().

Variable Documentation

◆ acap_sdi_info_aesebu

const struct audio_capture_info acap_sdi_info_aesebu
static
Initial value:
= {
}
static void audio_cap_sdi_probe_aesebu(struct device_info **available_devices, int *count, void(**deleter)(void *))
Definition sdi.cpp:103
static void audio_cap_sdi_done(void *state)
Definition sdi.cpp:153
static void * audio_cap_sdi_init(struct module *parent, const char *cfg)
Definition sdi.cpp:115
static struct audio_frame * audio_cap_sdi_read(void *state)
Definition sdi.cpp:131

Definition at line 218 of file sdi.cpp.

◆ acap_sdi_info_analog

const struct audio_capture_info acap_sdi_info_analog
static
Initial value:
= {
}
static void audio_cap_sdi_probe_analog(struct device_info **available_devices, int *count, void(**deleter)(void *))
Definition sdi.cpp:109

Definition at line 225 of file sdi.cpp.

◆ acap_sdi_info_embedded

const struct audio_capture_info acap_sdi_info_embedded
static
Initial value:
= {
}
static void audio_cap_sdi_probe_embedded(struct device_info **available_devices, int *count, void(**deleter)(void *))
Definition sdi.cpp:97

Definition at line 211 of file sdi.cpp.