22
22
#include "config.h"
26
24
#include <string.h>
28
26
#if HAVE_SOUNDCARD_H
29
27
#include <soundcard.h>
31
29
#include <sys/soundcard.h>
33
32
#include <unistd.h>
35
34
#include <sys/ioctl.h>
37
#include "libavutil/internal.h"
38
36
#include "libavutil/log.h"
39
#include "libavutil/opt.h"
40
#include "libavutil/time.h"
41
38
#include "libavcodec/avcodec.h"
42
40
#include "libavformat/avformat.h"
43
#include "libavformat/internal.h"
45
#define AUDIO_BLOCK_SIZE 4096
52
int frame_size; /* in bytes ! */
53
enum AVCodecID codec_id;
54
unsigned int flip_left : 1;
55
uint8_t buffer[AUDIO_BLOCK_SIZE];
59
static int audio_open(AVFormatContext *s1, int is_output, const char *audio_device)
42
#include "oss_audio.h"
44
int ff_oss_audio_open(AVFormatContext *s1, int is_output,
45
const char *audio_device)
61
AudioData *s = s1->priv_data;
47
OSSAudioData *s = s1->priv_data;
64
50
char *flip = getenv("AUDIO_FLIP_LEFT");
143
129
return AVERROR(EIO);
146
static int audio_close(AudioData *s)
132
int ff_oss_audio_close(OSSAudioData *s)
152
/* sound output support */
153
static int audio_write_header(AVFormatContext *s1)
155
AudioData *s = s1->priv_data;
160
s->sample_rate = st->codec->sample_rate;
161
s->channels = st->codec->channels;
162
ret = audio_open(s1, 1, s1->filename);
170
static int audio_write_packet(AVFormatContext *s1, AVPacket *pkt)
172
AudioData *s = s1->priv_data;
175
uint8_t *buf= pkt->data;
178
len = FFMIN(AUDIO_BLOCK_SIZE - s->buffer_ptr, size);
179
memcpy(s->buffer + s->buffer_ptr, buf, len);
180
s->buffer_ptr += len;
181
if (s->buffer_ptr >= AUDIO_BLOCK_SIZE) {
183
ret = write(s->fd, s->buffer, AUDIO_BLOCK_SIZE);
186
if (ret < 0 && (errno != EAGAIN && errno != EINTR))
197
static int audio_write_trailer(AVFormatContext *s1)
199
AudioData *s = s1->priv_data;
207
static int audio_read_header(AVFormatContext *s1)
209
AudioData *s = s1->priv_data;
213
st = avformat_new_stream(s1, NULL);
215
return AVERROR(ENOMEM);
218
ret = audio_open(s1, 0, s1->filename);
223
/* take real parameters */
224
st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
225
st->codec->codec_id = s->codec_id;
226
st->codec->sample_rate = s->sample_rate;
227
st->codec->channels = s->channels;
229
avpriv_set_pts_info(st, 64, 1, 1000000); /* 64 bits pts in us */
233
static int audio_read_packet(AVFormatContext *s1, AVPacket *pkt)
235
AudioData *s = s1->priv_data;
238
struct audio_buf_info abufi;
240
if ((ret=av_new_packet(pkt, s->frame_size)) < 0)
243
ret = read(s->fd, pkt->data, pkt->size);
247
if (ret<0) return AVERROR(errno);
248
else return AVERROR_EOF;
252
/* compute pts of the start of the packet */
253
cur_time = av_gettime();
255
if (ioctl(s->fd, SNDCTL_DSP_GETISPACE, &abufi) == 0) {
256
bdelay += abufi.bytes;
258
/* subtract time represented by the number of bytes in the audio fifo */
259
cur_time -= (bdelay * 1000000LL) / (s->sample_rate * s->channels);
261
/* convert to wanted units */
264
if (s->flip_left && s->channels == 2) {
266
short *p = (short *) pkt->data;
268
for (i = 0; i < ret; i += 4) {
276
static int audio_read_close(AVFormatContext *s1)
278
AudioData *s = s1->priv_data;
285
static const AVOption options[] = {
286
{ "sample_rate", "", offsetof(AudioData, sample_rate), AV_OPT_TYPE_INT, {.i64 = 48000}, 1, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
287
{ "channels", "", offsetof(AudioData, channels), AV_OPT_TYPE_INT, {.i64 = 2}, 1, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
291
static const AVClass oss_demuxer_class = {
292
.class_name = "OSS demuxer",
293
.item_name = av_default_item_name,
295
.version = LIBAVUTIL_VERSION_INT,
298
AVInputFormat ff_oss_demuxer = {
300
.long_name = NULL_IF_CONFIG_SMALL("OSS (Open Sound System) capture"),
301
.priv_data_size = sizeof(AudioData),
302
.read_header = audio_read_header,
303
.read_packet = audio_read_packet,
304
.read_close = audio_read_close,
305
.flags = AVFMT_NOFILE,
306
.priv_class = &oss_demuxer_class,
310
#if CONFIG_OSS_OUTDEV
311
AVOutputFormat ff_oss_muxer = {
313
.long_name = NULL_IF_CONFIG_SMALL("OSS (Open Sound System) playback"),
314
.priv_data_size = sizeof(AudioData),
315
/* XXX: we make the assumption that the soundcard accepts this format */
316
/* XXX: find better solution with "preinit" method, needed also in
318
.audio_codec = AV_NE(AV_CODEC_ID_PCM_S16BE, AV_CODEC_ID_PCM_S16LE),
319
.video_codec = AV_CODEC_ID_NONE,
320
.write_header = audio_write_header,
321
.write_packet = audio_write_packet,
322
.write_trailer = audio_write_trailer,
323
.flags = AVFMT_NOFILE,