jack_audio.c
Go to the documentation of this file.
1 /*
2  * JACK Audio Connection Kit input device
3  * Copyright (c) 2009 Samalyse
4  * Author: Olivier Guilyardi <olivier samalyse com>
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 #include "config.h"
24 #include <semaphore.h>
25 #include <jack/jack.h>
26 
27 #include "libavutil/log.h"
28 #include "libavutil/fifo.h"
29 #include "libavutil/opt.h"
30 #include "libavutil/time.h"
31 #include "libavcodec/avcodec.h"
32 #include "libavformat/avformat.h"
33 #include "libavformat/internal.h"
34 #include "timefilter.h"
35 #include "avdevice.h"
36 
37 /**
38  * Size of the internal FIFO buffers as a number of audio packets
39  */
40 #define FIFO_PACKETS_NUM 16
41 
42 typedef struct {
43  AVClass *class;
44  jack_client_t * client;
45  int activated;
46  sem_t packet_count;
47  jack_nframes_t sample_rate;
48  jack_nframes_t buffer_size;
49  jack_port_t ** ports;
50  int nports;
54  int pkt_xrun;
55  int jack_xrun;
56 } JackData;
57 
58 static int process_callback(jack_nframes_t nframes, void *arg)
59 {
60  /* Warning: this function runs in realtime. One mustn't allocate memory here
61  * or do any other thing that could block. */
62 
63  int i, j;
64  JackData *self = arg;
65  float * buffer;
66  jack_nframes_t latency, cycle_delay;
67  AVPacket pkt;
68  float *pkt_data;
69  double cycle_time;
70 
71  if (!self->client)
72  return 0;
73 
74  /* The approximate delay since the hardware interrupt as a number of frames */
75  cycle_delay = jack_frames_since_cycle_start(self->client);
76 
77  /* Retrieve filtered cycle time */
78  cycle_time = ff_timefilter_update(self->timefilter,
79  av_gettime() / 1000000.0 - (double) cycle_delay / self->sample_rate,
80  self->buffer_size);
81 
82  /* Check if an empty packet is available, and if there's enough space to send it back once filled */
83  if ((av_fifo_size(self->new_pkts) < sizeof(pkt)) || (av_fifo_space(self->filled_pkts) < sizeof(pkt))) {
84  self->pkt_xrun = 1;
85  return 0;
86  }
87 
88  /* Retrieve empty (but allocated) packet */
89  av_fifo_generic_read(self->new_pkts, &pkt, sizeof(pkt), NULL);
90 
91  pkt_data = (float *) pkt.data;
92  latency = 0;
93 
94  /* Copy and interleave audio data from the JACK buffer into the packet */
95  for (i = 0; i < self->nports; i++) {
96  #if HAVE_JACK_PORT_GET_LATENCY_RANGE
97  jack_latency_range_t range;
98  jack_port_get_latency_range(self->ports[i], JackCaptureLatency, &range);
99  latency += range.max;
100  #else
101  latency += jack_port_get_total_latency(self->client, self->ports[i]);
102  #endif
103  buffer = jack_port_get_buffer(self->ports[i], self->buffer_size);
104  for (j = 0; j < self->buffer_size; j++)
105  pkt_data[j * self->nports + i] = buffer[j];
106  }
107 
108  /* Timestamp the packet with the cycle start time minus the average latency */
109  pkt.pts = (cycle_time - (double) latency / (self->nports * self->sample_rate)) * 1000000.0;
110 
111  /* Send the now filled packet back, and increase packet counter */
112  av_fifo_generic_write(self->filled_pkts, &pkt, sizeof(pkt), NULL);
113  sem_post(&self->packet_count);
114 
115  return 0;
116 }
117 
118 static void shutdown_callback(void *arg)
119 {
120  JackData *self = arg;
121  self->client = NULL;
122 }
123 
124 static int xrun_callback(void *arg)
125 {
126  JackData *self = arg;
127  self->jack_xrun = 1;
128  ff_timefilter_reset(self->timefilter);
129  return 0;
130 }
131 
132 static int supply_new_packets(JackData *self, AVFormatContext *context)
133 {
134  AVPacket pkt;
135  int test, pkt_size = self->buffer_size * self->nports * sizeof(float);
136 
137  /* Supply the process callback with new empty packets, by filling the new
138  * packets FIFO buffer with as many packets as possible. process_callback()
139  * can't do this by itself, because it can't allocate memory in realtime. */
140  while (av_fifo_space(self->new_pkts) >= sizeof(pkt)) {
141  if ((test = av_new_packet(&pkt, pkt_size)) < 0) {
142  av_log(context, AV_LOG_ERROR, "Could not create packet of size %d\n", pkt_size);
143  return test;
144  }
145  av_fifo_generic_write(self->new_pkts, &pkt, sizeof(pkt), NULL);
146  }
147  return 0;
148 }
149 
150 static int start_jack(AVFormatContext *context)
151 {
152  JackData *self = context->priv_data;
153  jack_status_t status;
154  int i, test;
155 
156  /* Register as a JACK client, using the context filename as client name. */
157  self->client = jack_client_open(context->filename, JackNullOption, &status);
158  if (!self->client) {
159  av_log(context, AV_LOG_ERROR, "Unable to register as a JACK client\n");
160  return AVERROR(EIO);
161  }
162 
163  sem_init(&self->packet_count, 0, 0);
164 
165  self->sample_rate = jack_get_sample_rate(self->client);
166  self->ports = av_malloc(self->nports * sizeof(*self->ports));
167  self->buffer_size = jack_get_buffer_size(self->client);
168 
169  /* Register JACK ports */
170  for (i = 0; i < self->nports; i++) {
171  char str[16];
172  snprintf(str, sizeof(str), "input_%d", i + 1);
173  self->ports[i] = jack_port_register(self->client, str,
174  JACK_DEFAULT_AUDIO_TYPE,
175  JackPortIsInput, 0);
176  if (!self->ports[i]) {
177  av_log(context, AV_LOG_ERROR, "Unable to register port %s:%s\n",
178  context->filename, str);
179  jack_client_close(self->client);
180  return AVERROR(EIO);
181  }
182  }
183 
184  /* Register JACK callbacks */
185  jack_set_process_callback(self->client, process_callback, self);
186  jack_on_shutdown(self->client, shutdown_callback, self);
187  jack_set_xrun_callback(self->client, xrun_callback, self);
188 
189  /* Create time filter */
190  self->timefilter = ff_timefilter_new (1.0 / self->sample_rate, self->buffer_size, 1.5);
191 
192  /* Create FIFO buffers */
193  self->filled_pkts = av_fifo_alloc(FIFO_PACKETS_NUM * sizeof(AVPacket));
194  /* New packets FIFO with one extra packet for safety against underruns */
195  self->new_pkts = av_fifo_alloc((FIFO_PACKETS_NUM + 1) * sizeof(AVPacket));
196  if ((test = supply_new_packets(self, context))) {
197  jack_client_close(self->client);
198  return test;
199  }
200 
201  return 0;
202 
203 }
204 
205 static void free_pkt_fifo(AVFifoBuffer *fifo)
206 {
207  AVPacket pkt;
208  while (av_fifo_size(fifo)) {
209  av_fifo_generic_read(fifo, &pkt, sizeof(pkt), NULL);
210  av_free_packet(&pkt);
211  }
212  av_fifo_free(fifo);
213 }
214 
215 static void stop_jack(JackData *self)
216 {
217  if (self->client) {
218  if (self->activated)
219  jack_deactivate(self->client);
220  jack_client_close(self->client);
221  }
222  sem_destroy(&self->packet_count);
223  free_pkt_fifo(self->new_pkts);
224  free_pkt_fifo(self->filled_pkts);
225  av_freep(&self->ports);
226  ff_timefilter_destroy(self->timefilter);
227 }
228 
229 static int audio_read_header(AVFormatContext *context)
230 {
231  JackData *self = context->priv_data;
232  AVStream *stream;
233  int test;
234 
235  if ((test = start_jack(context)))
236  return test;
237 
238  stream = avformat_new_stream(context, NULL);
239  if (!stream) {
240  stop_jack(self);
241  return AVERROR(ENOMEM);
242  }
243 
245 #if HAVE_BIGENDIAN
247 #else
249 #endif
250  stream->codec->sample_rate = self->sample_rate;
251  stream->codec->channels = self->nports;
252 
253  avpriv_set_pts_info(stream, 64, 1, 1000000); /* 64 bits pts in us */
254  return 0;
255 }
256 
258 {
259  JackData *self = context->priv_data;
260  struct timespec timeout = {0, 0};
261  int test;
262 
263  /* Activate the JACK client on first packet read. Activating the JACK client
264  * means that process_callback() starts to get called at regular interval.
265  * If we activate it in audio_read_header(), we're actually reading audio data
266  * from the device before instructed to, and that may result in an overrun. */
267  if (!self->activated) {
268  if (!jack_activate(self->client)) {
269  self->activated = 1;
270  av_log(context, AV_LOG_INFO,
271  "JACK client registered and activated (rate=%dHz, buffer_size=%d frames)\n",
272  self->sample_rate, self->buffer_size);
273  } else {
274  av_log(context, AV_LOG_ERROR, "Unable to activate JACK client\n");
275  return AVERROR(EIO);
276  }
277  }
278 
279  /* Wait for a packet coming back from process_callback(), if one isn't available yet */
280  timeout.tv_sec = av_gettime() / 1000000 + 2;
281  if (sem_timedwait(&self->packet_count, &timeout)) {
282  if (errno == ETIMEDOUT) {
283  av_log(context, AV_LOG_ERROR,
284  "Input error: timed out when waiting for JACK process callback output\n");
285  } else {
286  av_log(context, AV_LOG_ERROR, "Error while waiting for audio packet: %s\n",
287  strerror(errno));
288  }
289  if (!self->client)
290  av_log(context, AV_LOG_ERROR, "Input error: JACK server is gone\n");
291 
292  return AVERROR(EIO);
293  }
294 
295  if (self->pkt_xrun) {
296  av_log(context, AV_LOG_WARNING, "Audio packet xrun\n");
297  self->pkt_xrun = 0;
298  }
299 
300  if (self->jack_xrun) {
301  av_log(context, AV_LOG_WARNING, "JACK xrun\n");
302  self->jack_xrun = 0;
303  }
304 
305  /* Retrieve the packet filled with audio data by process_callback() */
306  av_fifo_generic_read(self->filled_pkts, pkt, sizeof(*pkt), NULL);
307 
308  if ((test = supply_new_packets(self, context)))
309  return test;
310 
311  return 0;
312 }
313 
314 static int audio_read_close(AVFormatContext *context)
315 {
316  JackData *self = context->priv_data;
317  stop_jack(self);
318  return 0;
319 }
320 
321 #define OFFSET(x) offsetof(JackData, x)
322 static const AVOption options[] = {
323  { "channels", "Number of audio channels.", OFFSET(nports), AV_OPT_TYPE_INT, { .i64 = 2 }, 1, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
324  { NULL },
325 };
326 
327 static const AVClass jack_indev_class = {
328  .class_name = "JACK indev",
329  .item_name = av_default_item_name,
330  .option = options,
331  .version = LIBAVUTIL_VERSION_INT,
332 };
333 
335  .name = "jack",
336  .long_name = NULL_IF_CONFIG_SMALL("JACK Audio Connection Kit"),
337  .priv_data_size = sizeof(JackData),
341  .flags = AVFMT_NOFILE,
342  .priv_class = &jack_indev_class,
343 };
static int supply_new_packets(JackData *self, AVFormatContext *context)
Definition: jack_audio.c:132
jack_client_t * client
Definition: jack_audio.c:44
int pkt_xrun
Definition: jack_audio.c:54
void av_free_packet(AVPacket *pkt)
Free a packet.
Definition: avpacket.c:242
static const AVClass jack_indev_class
Definition: jack_audio.c:327
AVOption.
Definition: opt.h:251
av_default_item_name
void ff_timefilter_destroy(TimeFilter *self)
Free all resources associated with the filter.
Definition: timefilter.c:58
static void shutdown_callback(void *arg)
Definition: jack_audio.c:118
void ff_timefilter_reset(TimeFilter *self)
Reset the filter.
Definition: timefilter.c:63
void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:154
location of range
int jack_xrun
Definition: jack_audio.c:55
int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int(*func)(void *, void *, int))
Feed data from a user-supplied callback to an AVFifoBuffer.
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
Definition: mem.c:198
Format I/O context.
Definition: avformat.h:944
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:55
AVOptions.
static AVPacket pkt
Definition: demuxing.c:56
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
AVFifoBuffer * filled_pkts
Definition: jack_audio.c:53
jack_port_t ** ports
Definition: jack_audio.c:49
uint8_t * data
static int audio_read_header(AVFormatContext *context)
Definition: jack_audio.c:229
static av_cold int read_close(AVFormatContext *ctx)
Definition: libcdio.c:145
void av_fifo_free(AVFifoBuffer *f)
Free an AVFifoBuffer.
Main libavdevice API header.
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
Definition: avpacket.c:73
int nports
Definition: jack_audio.c:50
static int start_jack(AVFormatContext *context)
Definition: jack_audio.c:150
static int audio_read_packet(AVFormatContext *context, AVPacket *pkt)
Definition: jack_audio.c:257
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void(*func)(void *, void *, int))
Feed data from an AVFifoBuffer to a user-supplied callback.
const char * arg
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
static int audio_read_close(AVFormatContext *context)
Definition: jack_audio.c:314
FFmpeg Automated Testing Environment ************************************Table of Contents *****************FFmpeg Automated Testing Environment Introduction Using FATE from your FFmpeg source directory Submitting the results to the FFmpeg result aggregation server FATE makefile targets and variables Makefile targets Makefile variables Examples Introduction **************FATE is an extended regression suite on the client side and a means for results aggregation and presentation on the server side The first part of this document explains how you can use FATE from your FFmpeg source directory to test your ffmpeg binary The second part describes how you can run FATE to submit the results to FFmpeg s FATE server In any way you can have a look at the publicly viewable FATE results by visiting this as it can be seen if some test on some platform broke with their recent contribution This usually happens on the platforms the developers could not test on The second part of this document describes how you can run FATE to submit your results to FFmpeg s FATE server If you want to submit your results be sure to check that your combination of OS and compiler is not already listed on the above mentioned website In the third part you can find a comprehensive listing of FATE makefile targets and variables Using FATE from your FFmpeg source directory **********************************************If you want to run FATE on your machine you need to have the samples in place You can get the samples via the build target fate rsync Use this command from the top level source this will cause FATE to fail NOTE To use a custom wrapper to run the test
Definition: fate.txt:34
external API header
int activated
Definition: jack_audio.c:45
AVCodecContext * codec
Codec context associated with this stream.
Definition: avformat.h:662
#define FIFO_PACKETS_NUM
Size of the internal FIFO buffers as a number of audio packets.
Definition: jack_audio.c:40
static void stop_jack(JackData *self)
Definition: jack_audio.c:215
char filename[1024]
input or output filename
Definition: avformat.h:994
static int xrun_callback(void *arg)
Definition: jack_audio.c:124
sem_t packet_count
Definition: jack_audio.c:46
normalize analysis window nframes
Definition: stft.m:13
static const AVOption options[]
Definition: jack_audio.c:322
AVInputFormat ff_jack_demuxer
Definition: jack_audio.c:334
LIBAVUTIL_VERSION_INT
Definition: eval.c:55
static int read_header(FFV1Context *f)
Definition: ffv1dec.c:517
int64_t av_gettime(void)
Get the current time in microseconds.
Definition: time.c:39
Stream structure.
Definition: avformat.h:643
NULL
Definition: eval.c:55
int av_fifo_space(AVFifoBuffer *f)
Return the amount of space in bytes in the AVFifoBuffer, that is the amount of data you can write int...
TimeFilter * ff_timefilter_new(double time_base, double period, double bandwidth)
Create a new Delay Locked Loop time filter.
Definition: timefilter.c:46
enum AVMediaType codec_type
enum AVCodecID codec_id
int sample_rate
samples per second
jack_nframes_t sample_rate
Definition: jack_audio.c:47
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
a very simple circular buffer FIFO implementation
static int read_packet(AVFormatContext *ctx, AVPacket *pkt)
Definition: libcdio.c:114
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:73
Describe the class of an AVClass context structure.
Definition: log.h:50
synthesis window for stochastic i
#define AV_OPT_FLAG_DECODING_PARAM
a generic parameter which can be set by the user for demuxing or decoding
Definition: opt.h:282
#define snprintf
Definition: snprintf.h:34
#define OFFSET(x)
Definition: jack_audio.c:321
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
static int flags
Definition: cpu.c:23
TimeFilter * timefilter
Definition: jack_audio.c:51
Main libavformat public API header.
int av_fifo_size(AVFifoBuffer *f)
Return the amount of data in bytes in the AVFifoBuffer, that is the amount of data you can read from ...
static void free_pkt_fifo(AVFifoBuffer *fifo)
Definition: jack_audio.c:205
double ff_timefilter_update(TimeFilter *self, double system_time, double period)
Update the filter.
Definition: timefilter.c:68
#define AVFMT_NOFILE
Demuxer will use avio_open, no opened file should be provided by the caller.
Definition: avformat.h:345
the buffer and buffer reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFilterBuffer structures They must not be accessed but through references stored in AVFilterBufferRef structures Several references can point to the same buffer
AVFifoBuffer * av_fifo_alloc(unsigned int size)
Initialize an AVFifoBuffer.
int channels
number of audio channels
void * priv_data
Format private data.
Definition: avformat.h:964
#define AV_LOG_INFO
Definition: log.h:156
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:461
jack_nframes_t buffer_size
Definition: jack_audio.c:48
static int process_callback(jack_nframes_t nframes, void *arg)
Definition: jack_audio.c:58
This structure stores compressed data.
AVFifoBuffer * new_pkts
Definition: jack_audio.c:52
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
for(j=16;j >0;--j)