The libavformat API is not suitable for exporting output devices as muxers. Some practical problems are e.g. lack of timing/synchronization mechanisms or interaction with output-specific features.tags/n4.0
@@ -73,7 +73,6 @@ Help options: | |||||
--list-protocols show all available protocols | --list-protocols show all available protocols | ||||
--list-bsfs show all available bitstream filters | --list-bsfs show all available bitstream filters | ||||
--list-indevs show all available input devices | --list-indevs show all available input devices | ||||
--list-outdevs show all available output devices | |||||
--list-filters show all available filters | --list-filters show all available filters | ||||
Standard options: | Standard options: | ||||
@@ -163,9 +162,6 @@ Individual component options: | |||||
--enable-indev=NAME enable input device NAME | --enable-indev=NAME enable input device NAME | ||||
--disable-indev=NAME disable input device NAME | --disable-indev=NAME disable input device NAME | ||||
--disable-indevs disable input devices | --disable-indevs disable input devices | ||||
--enable-outdev=NAME enable output device NAME | |||||
--disable-outdev=NAME disable output device NAME | |||||
--disable-outdevs disable output devices | |||||
--disable-devices disable all devices | --disable-devices disable all devices | ||||
--enable-filter=NAME enable filter NAME | --enable-filter=NAME enable filter NAME | ||||
--disable-filter=NAME disable filter NAME | --disable-filter=NAME disable filter NAME | ||||
@@ -1224,7 +1220,6 @@ AVCODEC_COMPONENTS=" | |||||
AVDEVICE_COMPONENTS=" | AVDEVICE_COMPONENTS=" | ||||
indevs | indevs | ||||
outdevs | |||||
" | " | ||||
AVFILTER_COMPONENTS=" | AVFILTER_COMPONENTS=" | ||||
filters | filters | ||||
@@ -2433,9 +2428,8 @@ wtv_demuxer_select="mpegts_demuxer riffdec" | |||||
xmv_demuxer_select="riffdec" | xmv_demuxer_select="riffdec" | ||||
xwma_demuxer_select="riffdec" | xwma_demuxer_select="riffdec" | ||||
# indevs / outdevs | |||||
# indevs | |||||
alsa_indev_deps="alsa" | alsa_indev_deps="alsa" | ||||
alsa_outdev_deps="alsa" | |||||
avfoundation_indev_deps="AVFoundation_AVFoundation_h objc_arc pthreads" | avfoundation_indev_deps="AVFoundation_AVFoundation_h objc_arc pthreads" | ||||
avfoundation_indev_extralibs="-framework Foundation -framework AVFoundation -framework CoreVideo -framework CoreMedia" | avfoundation_indev_extralibs="-framework Foundation -framework AVFoundation -framework CoreVideo -framework CoreMedia" | ||||
bktr_indev_deps_any="dev_bktr_ioctl_bt848_h machine_ioctl_bt848_h dev_video_bktr_ioctl_bt848_h dev_ic_bt8xx_h" | bktr_indev_deps_any="dev_bktr_ioctl_bt848_h machine_ioctl_bt848_h dev_video_bktr_ioctl_bt848_h dev_ic_bt8xx_h" | ||||
@@ -2447,10 +2441,8 @@ jack_indev_deps_any="sem_timedwait dispatch_dispatch_h" | |||||
libcdio_indev_deps="libcdio" | libcdio_indev_deps="libcdio" | ||||
libdc1394_indev_deps="libdc1394" | libdc1394_indev_deps="libdc1394" | ||||
oss_indev_deps_any="sys_soundcard_h" | oss_indev_deps_any="sys_soundcard_h" | ||||
oss_outdev_deps_any="sys_soundcard_h" | |||||
pulse_indev_deps="libpulse" | pulse_indev_deps="libpulse" | ||||
sndio_indev_deps="sndio" | sndio_indev_deps="sndio" | ||||
sndio_outdev_deps="sndio" | |||||
v4l2_indev_deps_any="linux_videodev2_h sys_videoio_h" | v4l2_indev_deps_any="linux_videodev2_h sys_videoio_h" | ||||
vfwcap_indev_deps="vfw32 vfwcap_defines" | vfwcap_indev_deps="vfw32 vfwcap_defines" | ||||
xcbgrab_indev_deps="libxcb libxcb_shape" | xcbgrab_indev_deps="libxcb libxcb_shape" | ||||
@@ -2715,7 +2707,6 @@ HWACCEL_LIST=$(find_things hwaccel HWACCEL libavcodec/allcodecs.c) | |||||
PARSER_LIST=$(find_things parser PARSER libavcodec/allcodecs.c) | PARSER_LIST=$(find_things parser PARSER libavcodec/allcodecs.c) | ||||
MUXER_LIST=$(find_things muxer _MUX libavformat/allformats.c) | MUXER_LIST=$(find_things muxer _MUX libavformat/allformats.c) | ||||
DEMUXER_LIST=$(find_things demuxer DEMUX libavformat/allformats.c) | DEMUXER_LIST=$(find_things demuxer DEMUX libavformat/allformats.c) | ||||
OUTDEV_LIST=$(find_things outdev OUTDEV libavdevice/alldevices.c) | |||||
INDEV_LIST=$(find_things indev _IN libavdevice/alldevices.c) | INDEV_LIST=$(find_things indev _IN libavdevice/alldevices.c) | ||||
FILTER_LIST=$(find_things filter FILTER libavfilter/allfilters.c) | FILTER_LIST=$(find_things filter FILTER libavfilter/allfilters.c) | ||||
@@ -2739,7 +2730,6 @@ AVCODEC_COMPONENTS_LIST=" | |||||
AVDEVICE_COMPONENTS_LIST=" | AVDEVICE_COMPONENTS_LIST=" | ||||
$INDEV_LIST | $INDEV_LIST | ||||
$OUTDEV_LIST | |||||
" | " | ||||
AVFILTER_COMPONENTS_LIST=" | AVFILTER_COMPONENTS_LIST=" | ||||
@@ -2800,7 +2790,7 @@ for opt do | |||||
add_extralibs $optval | add_extralibs $optval | ||||
;; | ;; | ||||
--disable-devices) | --disable-devices) | ||||
disable $INDEV_LIST $OUTDEV_LIST | |||||
disable $INDEV_LIST | |||||
;; | ;; | ||||
--enable-debug=*) | --enable-debug=*) | ||||
debuglevel="$optval" | debuglevel="$optval" | ||||
@@ -3906,7 +3896,6 @@ case $target_os in | |||||
netbsd) | netbsd) | ||||
disable symver | disable symver | ||||
oss_indev_extralibs="-lossaudio" | oss_indev_extralibs="-lossaudio" | ||||
oss_outdev_extralibs="-lossaudio" | |||||
;; | ;; | ||||
openbsd|bitrig) | openbsd|bitrig) | ||||
disable symver | disable symver | ||||
@@ -3914,7 +3903,6 @@ case $target_os in | |||||
SLIB_INSTALL_NAME='$(SLIBNAME).$(LIBMAJOR).$(LIBMINOR)' | SLIB_INSTALL_NAME='$(SLIBNAME).$(LIBMAJOR).$(LIBMINOR)' | ||||
SLIB_INSTALL_LINKS= | SLIB_INSTALL_LINKS= | ||||
oss_indev_extralibs="-lossaudio" | oss_indev_extralibs="-lossaudio" | ||||
oss_outdev_extralibs="-lossaudio" | |||||
;; | ;; | ||||
dragonfly) | dragonfly) | ||||
disable symver | disable symver | ||||
@@ -4789,13 +4777,13 @@ check_header "dev/bktr/ioctl_meteor.h dev/bktr/ioctl_bt848.h" | |||||
check_header sys/soundcard.h | check_header sys/soundcard.h | ||||
enabled_any alsa_indev alsa_outdev && | |||||
enabled alsa_indev && | |||||
check_lib alsa alsa/asoundlib.h snd_pcm_htimestamp -lasound | check_lib alsa alsa/asoundlib.h snd_pcm_htimestamp -lasound | ||||
enabled libjack && | enabled libjack && | ||||
require_pkg_config libjack jack jack/jack.h jack_port_get_latency_range | require_pkg_config libjack jack jack/jack.h jack_port_get_latency_range | ||||
enabled_any sndio_indev sndio_outdev && check_lib sndio sndio.h sio_open -lsndio | |||||
enabled sndio_indev && check_lib sndio sndio.h sio_open -lsndio | |||||
if enabled libcdio; then | if enabled libcdio; then | ||||
check_lib libcdio "cdio/cdda.h cdio/paranoia.h" cdio_cddap_open -lcdio_paranoia -lcdio_cdda -lcdio || | check_lib libcdio "cdio/cdda.h cdio/paranoia.h" cdio_cddap_open -lcdio_paranoia -lcdio_cdda -lcdio || | ||||
@@ -5252,7 +5240,7 @@ echo "Programs:" | |||||
print_enabled '' $PROGRAM_LIST | print_3_columns | print_enabled '' $PROGRAM_LIST | print_3_columns | ||||
echo | echo | ||||
for type in decoder encoder hwaccel parser demuxer muxer protocol filter bsf indev outdev; do | |||||
for type in decoder encoder hwaccel parser demuxer muxer protocol filter bsf indev; do | |||||
echo "Enabled ${type}s:" | echo "Enabled ${type}s:" | ||||
eval list=\$$(toupper $type)_LIST | eval list=\$$(toupper $type)_LIST | ||||
print_enabled '_*' $list | print_3_columns | print_enabled '_*' $list | print_3_columns | ||||
@@ -1264,7 +1264,6 @@ avconv -i src.ext -lmax 21*QP2LAMBDA dst.ext | |||||
@include demuxers.texi | @include demuxers.texi | ||||
@include muxers.texi | @include muxers.texi | ||||
@include indevs.texi | @include indevs.texi | ||||
@include outdevs.texi | |||||
@include protocols.texi | @include protocols.texi | ||||
@include bitstream_filters.texi | @include bitstream_filters.texi | ||||
@include filters.texi | @include filters.texi | ||||
@@ -164,7 +164,6 @@ Seek to percentage in file corresponding to fraction of width. | |||||
@include demuxers.texi | @include demuxers.texi | ||||
@include muxers.texi | @include muxers.texi | ||||
@include indevs.texi | @include indevs.texi | ||||
@include outdevs.texi | |||||
@include protocols.texi | @include protocols.texi | ||||
@include filters.texi | @include filters.texi | ||||
@@ -1,33 +0,0 @@ | |||||
@chapter Output Devices | |||||
@c man begin OUTPUT DEVICES | |||||
Output devices are configured elements in Libav which allow to write | |||||
multimedia data to an output device attached to your system. | |||||
When you configure your Libav build, all the supported output devices | |||||
are enabled by default. You can list all available ones using the | |||||
configure option "--list-outdevs". | |||||
You can disable all the output devices using the configure option | |||||
"--disable-outdevs", and selectively enable an output device using the | |||||
option "--enable-outdev=@var{OUTDEV}", or you can disable a particular | |||||
input device using the option "--disable-outdev=@var{OUTDEV}". | |||||
The option "-formats" of the av* tools will display the list of | |||||
enabled output devices (amongst the muxers). | |||||
A description of the currently available output devices follows. | |||||
@section alsa | |||||
ALSA (Advanced Linux Sound Architecture) output device. | |||||
@section oss | |||||
OSS (Open Sound System) output device. | |||||
@section sndio | |||||
sndio audio output device. | |||||
@c man end OUTPUT DEVICES |
@@ -9,19 +9,16 @@ OBJS = alldevices.o \ | |||||
OBJS-$(HAVE_LIBC_MSVCRT) += file_open.o | OBJS-$(HAVE_LIBC_MSVCRT) += file_open.o | ||||
# input/output devices | |||||
# input devices | |||||
OBJS-$(CONFIG_ALSA_INDEV) += alsa_dec.o alsa.o | OBJS-$(CONFIG_ALSA_INDEV) += alsa_dec.o alsa.o | ||||
OBJS-$(CONFIG_ALSA_OUTDEV) += alsa_enc.o alsa.o | |||||
OBJS-$(CONFIG_AVFOUNDATION_INDEV) += avfoundation_dec.o | OBJS-$(CONFIG_AVFOUNDATION_INDEV) += avfoundation_dec.o | ||||
OBJS-$(CONFIG_BKTR_INDEV) += bktr.o | OBJS-$(CONFIG_BKTR_INDEV) += bktr.o | ||||
OBJS-$(CONFIG_DV1394_INDEV) += dv1394.o | OBJS-$(CONFIG_DV1394_INDEV) += dv1394.o | ||||
OBJS-$(CONFIG_FBDEV_INDEV) += fbdev.o | OBJS-$(CONFIG_FBDEV_INDEV) += fbdev.o | ||||
OBJS-$(CONFIG_JACK_INDEV) += jack.o timefilter.o | OBJS-$(CONFIG_JACK_INDEV) += jack.o timefilter.o | ||||
OBJS-$(CONFIG_OSS_INDEV) += oss_dec.o oss.o | OBJS-$(CONFIG_OSS_INDEV) += oss_dec.o oss.o | ||||
OBJS-$(CONFIG_OSS_OUTDEV) += oss_enc.o oss.o | |||||
OBJS-$(CONFIG_PULSE_INDEV) += pulse.o | OBJS-$(CONFIG_PULSE_INDEV) += pulse.o | ||||
OBJS-$(CONFIG_SNDIO_INDEV) += sndio_dec.o sndio.o | OBJS-$(CONFIG_SNDIO_INDEV) += sndio_dec.o sndio.o | ||||
OBJS-$(CONFIG_SNDIO_OUTDEV) += sndio_enc.o sndio.o | |||||
OBJS-$(CONFIG_V4L2_INDEV) += v4l2.o | OBJS-$(CONFIG_V4L2_INDEV) += v4l2.o | ||||
OBJS-$(CONFIG_VFWCAP_INDEV) += vfwcap.o | OBJS-$(CONFIG_VFWCAP_INDEV) += vfwcap.o | ||||
OBJS-$(CONFIG_XCBGRAB_INDEV) += xcbgrab.o | OBJS-$(CONFIG_XCBGRAB_INDEV) += xcbgrab.o | ||||
@@ -22,13 +22,6 @@ | |||||
#include "libavformat/avformat.h" | #include "libavformat/avformat.h" | ||||
#include "avdevice.h" | #include "avdevice.h" | ||||
#define REGISTER_OUTDEV(X, x) \ | |||||
{ \ | |||||
extern AVOutputFormat ff_##x##_muxer; \ | |||||
if (CONFIG_##X##_OUTDEV) \ | |||||
av_register_output_format(&ff_##x##_muxer); \ | |||||
} | |||||
#define REGISTER_INDEV(X, x) \ | #define REGISTER_INDEV(X, x) \ | ||||
{ \ | { \ | ||||
extern AVInputFormat ff_##x##_demuxer; \ | extern AVInputFormat ff_##x##_demuxer; \ | ||||
@@ -36,8 +29,6 @@ | |||||
av_register_input_format(&ff_##x##_demuxer); \ | av_register_input_format(&ff_##x##_demuxer); \ | ||||
} | } | ||||
#define REGISTER_INOUTDEV(X, x) REGISTER_OUTDEV(X, x); REGISTER_INDEV(X, x) | |||||
void avdevice_register_all(void) | void avdevice_register_all(void) | ||||
{ | { | ||||
static int initialized; | static int initialized; | ||||
@@ -46,21 +37,21 @@ void avdevice_register_all(void) | |||||
return; | return; | ||||
initialized = 1; | initialized = 1; | ||||
/* devices */ | |||||
REGISTER_INOUTDEV(ALSA, alsa); | |||||
REGISTER_INDEV (AVFOUNDATION, avfoundation); | |||||
REGISTER_INDEV (BKTR, bktr); | |||||
REGISTER_INDEV (DV1394, dv1394); | |||||
REGISTER_INDEV (FBDEV, fbdev); | |||||
REGISTER_INDEV (JACK, jack); | |||||
REGISTER_INOUTDEV(OSS, oss); | |||||
REGISTER_INDEV (PULSE, pulse); | |||||
REGISTER_INOUTDEV(SNDIO, sndio); | |||||
REGISTER_INDEV (V4L2, v4l2); | |||||
REGISTER_INDEV (VFWCAP, vfwcap); | |||||
REGISTER_INDEV (XCBGRAB, xcbgrab); | |||||
/* input devices */ | |||||
REGISTER_INDEV(ALSA, alsa); | |||||
REGISTER_INDEV(AVFOUNDATION, avfoundation); | |||||
REGISTER_INDEV(BKTR, bktr); | |||||
REGISTER_INDEV(DV1394, dv1394); | |||||
REGISTER_INDEV(FBDEV, fbdev); | |||||
REGISTER_INDEV(JACK, jack); | |||||
REGISTER_INDEV(OSS, oss); | |||||
REGISTER_INDEV(PULSE, pulse); | |||||
REGISTER_INDEV(SNDIO, sndio); | |||||
REGISTER_INDEV(V4L2, v4l2); | |||||
REGISTER_INDEV(VFWCAP, vfwcap); | |||||
REGISTER_INDEV(XCBGRAB, xcbgrab); | |||||
/* external libraries */ | /* external libraries */ | ||||
REGISTER_INDEV (LIBCDIO, libcdio); | |||||
REGISTER_INDEV (LIBDC1394, libdc1394); | |||||
REGISTER_INDEV(LIBCDIO, libcdio); | |||||
REGISTER_INDEV(LIBDC1394, libdc1394); | |||||
} | } |
@@ -344,19 +344,3 @@ int ff_alsa_xrun_recover(AVFormatContext *s1, int err) | |||||
} | } | ||||
return err; | return err; | ||||
} | } | ||||
int ff_alsa_extend_reorder_buf(AlsaData *s, int min_size) | |||||
{ | |||||
int size = s->reorder_buf_size; | |||||
void *r; | |||||
av_assert0(size != 0); | |||||
while (size < min_size) | |||||
size *= 2; | |||||
r = av_realloc(s->reorder_buf, size * s->frame_size); | |||||
if (!r) | |||||
return AVERROR(ENOMEM); | |||||
s->reorder_buf = r; | |||||
s->reorder_buf_size = size; | |||||
return 0; | |||||
} |
@@ -91,6 +91,4 @@ int ff_alsa_close(AVFormatContext *s1); | |||||
*/ | */ | ||||
int ff_alsa_xrun_recover(AVFormatContext *s1, int err); | int ff_alsa_xrun_recover(AVFormatContext *s1, int err); | ||||
int ff_alsa_extend_reorder_buf(AlsaData *s, int size); | |||||
#endif /* AVDEVICE_ALSA_H */ | #endif /* AVDEVICE_ALSA_H */ |
@@ -1,117 +0,0 @@ | |||||
/* | |||||
* ALSA input and output | |||||
* Copyright (c) 2007 Luca Abeni ( lucabe72 email it ) | |||||
* Copyright (c) 2007 Benoit Fouet ( benoit fouet free fr ) | |||||
* | |||||
* This file is part of Libav. | |||||
* | |||||
* Libav is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 2.1 of the License, or (at your option) any later version. | |||||
* | |||||
* Libav is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public | |||||
* License along with Libav; if not, write to the Free Software | |||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||||
*/ | |||||
/** | |||||
* @file | |||||
* ALSA input and output: output | |||||
* @author Luca Abeni ( lucabe72 email it ) | |||||
* @author Benoit Fouet ( benoit fouet free fr ) | |||||
* | |||||
* This avdevice encoder allows to play audio to an ALSA (Advanced Linux | |||||
* Sound Architecture) device. | |||||
* | |||||
* The filename parameter is the name of an ALSA PCM device capable of | |||||
* capture, for example "default" or "plughw:1"; see the ALSA documentation | |||||
* for naming conventions. The empty string is equivalent to "default". | |||||
* | |||||
* The playback period is set to the lower value available for the device, | |||||
* which gives a low latency suitable for real-time playback. | |||||
*/ | |||||
#include <alsa/asoundlib.h> | |||||
#include "libavutil/internal.h" | |||||
#include "libavformat/avformat.h" | |||||
#include "alsa.h" | |||||
static av_cold int audio_write_header(AVFormatContext *s1) | |||||
{ | |||||
AlsaData *s = s1->priv_data; | |||||
AVStream *st; | |||||
unsigned int sample_rate; | |||||
enum AVCodecID codec_id; | |||||
int res; | |||||
st = s1->streams[0]; | |||||
sample_rate = st->codecpar->sample_rate; | |||||
codec_id = st->codecpar->codec_id; | |||||
res = ff_alsa_open(s1, SND_PCM_STREAM_PLAYBACK, &sample_rate, | |||||
st->codecpar->channels, &codec_id); | |||||
if (sample_rate != st->codecpar->sample_rate) { | |||||
av_log(s1, AV_LOG_ERROR, | |||||
"sample rate %d not available, nearest is %d\n", | |||||
st->codecpar->sample_rate, sample_rate); | |||||
goto fail; | |||||
} | |||||
return res; | |||||
fail: | |||||
snd_pcm_close(s->h); | |||||
return AVERROR(EIO); | |||||
} | |||||
static int audio_write_packet(AVFormatContext *s1, AVPacket *pkt) | |||||
{ | |||||
AlsaData *s = s1->priv_data; | |||||
int res; | |||||
int size = pkt->size; | |||||
uint8_t *buf = pkt->data; | |||||
size /= s->frame_size; | |||||
if (s->reorder_func) { | |||||
if (size > s->reorder_buf_size) | |||||
if (ff_alsa_extend_reorder_buf(s, size)) | |||||
return AVERROR(ENOMEM); | |||||
s->reorder_func(buf, s->reorder_buf, size); | |||||
buf = s->reorder_buf; | |||||
} | |||||
while ((res = snd_pcm_writei(s->h, buf, size)) < 0) { | |||||
if (res == -EAGAIN) { | |||||
return AVERROR(EAGAIN); | |||||
} | |||||
if (ff_alsa_xrun_recover(s1, res) < 0) { | |||||
av_log(s1, AV_LOG_ERROR, "ALSA write error: %s\n", | |||||
snd_strerror(res)); | |||||
return AVERROR(EIO); | |||||
} | |||||
} | |||||
return 0; | |||||
} | |||||
AVOutputFormat ff_alsa_muxer = { | |||||
.name = "alsa", | |||||
.long_name = NULL_IF_CONFIG_SMALL("ALSA audio output"), | |||||
.priv_data_size = sizeof(AlsaData), | |||||
.audio_codec = DEFAULT_CODEC_ID, | |||||
.video_codec = AV_CODEC_ID_NONE, | |||||
.write_header = audio_write_header, | |||||
.write_packet = audio_write_packet, | |||||
.write_trailer = ff_alsa_close, | |||||
.flags = AVFMT_NOFILE, | |||||
}; |
@@ -1,108 +0,0 @@ | |||||
/* | |||||
* Linux audio grab interface | |||||
* Copyright (c) 2000, 2001 Fabrice Bellard | |||||
* | |||||
* This file is part of Libav. | |||||
* | |||||
* Libav is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 2.1 of the License, or (at your option) any later version. | |||||
* | |||||
* Libav is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public | |||||
* License along with Libav; if not, write to the Free Software | |||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||||
*/ | |||||
#include "config.h" | |||||
#if HAVE_SOUNDCARD_H | |||||
#include <soundcard.h> | |||||
#else | |||||
#include <sys/soundcard.h> | |||||
#endif | |||||
#include <unistd.h> | |||||
#include <fcntl.h> | |||||
#include <sys/ioctl.h> | |||||
#include "libavutil/internal.h" | |||||
#include "libavcodec/avcodec.h" | |||||
#include "libavformat/avformat.h" | |||||
#include "libavformat/internal.h" | |||||
#include "oss.h" | |||||
static int audio_write_header(AVFormatContext *s1) | |||||
{ | |||||
OSSAudioData *s = s1->priv_data; | |||||
AVStream *st; | |||||
int ret; | |||||
st = s1->streams[0]; | |||||
s->sample_rate = st->codecpar->sample_rate; | |||||
s->channels = st->codecpar->channels; | |||||
ret = ff_oss_audio_open(s1, 1, s1->filename); | |||||
if (ret < 0) { | |||||
return AVERROR(EIO); | |||||
} else { | |||||
return 0; | |||||
} | |||||
} | |||||
static int audio_write_packet(AVFormatContext *s1, AVPacket *pkt) | |||||
{ | |||||
OSSAudioData *s = s1->priv_data; | |||||
int len, ret; | |||||
int size= pkt->size; | |||||
uint8_t *buf= pkt->data; | |||||
while (size > 0) { | |||||
len = FFMIN(OSS_AUDIO_BLOCK_SIZE - s->buffer_ptr, size); | |||||
memcpy(s->buffer + s->buffer_ptr, buf, len); | |||||
s->buffer_ptr += len; | |||||
if (s->buffer_ptr >= OSS_AUDIO_BLOCK_SIZE) { | |||||
for(;;) { | |||||
ret = write(s->fd, s->buffer, OSS_AUDIO_BLOCK_SIZE); | |||||
if (ret > 0) | |||||
break; | |||||
if (ret < 0 && (errno != EAGAIN && errno != EINTR)) | |||||
return AVERROR(EIO); | |||||
} | |||||
s->buffer_ptr = 0; | |||||
} | |||||
buf += len; | |||||
size -= len; | |||||
} | |||||
return 0; | |||||
} | |||||
static int audio_write_trailer(AVFormatContext *s1) | |||||
{ | |||||
OSSAudioData *s = s1->priv_data; | |||||
ff_oss_audio_close(s); | |||||
return 0; | |||||
} | |||||
AVOutputFormat ff_oss_muxer = { | |||||
.name = "oss", | |||||
.long_name = NULL_IF_CONFIG_SMALL("OSS (Open Sound System) playback"), | |||||
.priv_data_size = sizeof(OSSAudioData), | |||||
/* XXX: we make the assumption that the soundcard accepts this format */ | |||||
/* XXX: find better solution with "preinit" method, needed also in | |||||
other formats */ | |||||
.audio_codec = AV_NE(AV_CODEC_ID_PCM_S16BE, AV_CODEC_ID_PCM_S16LE), | |||||
.video_codec = AV_CODEC_ID_NONE, | |||||
.write_header = audio_write_header, | |||||
.write_packet = audio_write_packet, | |||||
.write_trailer = audio_write_trailer, | |||||
.flags = AVFMT_NOFILE, | |||||
}; |
@@ -1,95 +0,0 @@ | |||||
/* | |||||
* sndio play and grab interface | |||||
* Copyright (c) 2010 Jacob Meuser | |||||
* | |||||
* This file is part of Libav. | |||||
* | |||||
* Libav is free software; you can redistribute it and/or | |||||
* modify it under the terms of the GNU Lesser General Public | |||||
* License as published by the Free Software Foundation; either | |||||
* version 2.1 of the License, or (at your option) any later version. | |||||
* | |||||
* Libav is distributed in the hope that it will be useful, | |||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
* Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public | |||||
* License along with Libav; if not, write to the Free Software | |||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||||
*/ | |||||
#include <stdint.h> | |||||
#include <sndio.h> | |||||
#include "libavutil/internal.h" | |||||
#include "libavformat/avformat.h" | |||||
#include "libavdevice/sndio.h" | |||||
static av_cold int audio_write_header(AVFormatContext *s1) | |||||
{ | |||||
SndioData *s = s1->priv_data; | |||||
AVStream *st; | |||||
int ret; | |||||
st = s1->streams[0]; | |||||
s->sample_rate = st->codecpar->sample_rate; | |||||
s->channels = st->codecpar->channels; | |||||
ret = ff_sndio_open(s1, 1, s1->filename); | |||||
return ret; | |||||
} | |||||
static int audio_write_packet(AVFormatContext *s1, AVPacket *pkt) | |||||
{ | |||||
SndioData *s = s1->priv_data; | |||||
uint8_t *buf= pkt->data; | |||||
int size = pkt->size; | |||||
int len, ret; | |||||
while (size > 0) { | |||||
len = FFMIN(s->buffer_size - s->buffer_offset, size); | |||||
memcpy(s->buffer + s->buffer_offset, buf, len); | |||||
buf += len; | |||||
size -= len; | |||||
s->buffer_offset += len; | |||||
if (s->buffer_offset >= s->buffer_size) { | |||||
ret = sio_write(s->hdl, s->buffer, s->buffer_size); | |||||
if (ret == 0 || sio_eof(s->hdl)) | |||||
return AVERROR(EIO); | |||||
s->softpos += ret; | |||||
s->buffer_offset = 0; | |||||
} | |||||
} | |||||
return 0; | |||||
} | |||||
static int audio_write_trailer(AVFormatContext *s1) | |||||
{ | |||||
SndioData *s = s1->priv_data; | |||||
sio_write(s->hdl, s->buffer, s->buffer_offset); | |||||
ff_sndio_close(s); | |||||
return 0; | |||||
} | |||||
AVOutputFormat ff_sndio_muxer = { | |||||
.name = "sndio", | |||||
.long_name = NULL_IF_CONFIG_SMALL("sndio audio playback"), | |||||
.priv_data_size = sizeof(SndioData), | |||||
/* XXX: we make the assumption that the soundcard accepts this format */ | |||||
/* XXX: find better solution with "preinit" method, needed also in | |||||
other formats */ | |||||
.audio_codec = AV_NE(AV_CODEC_ID_PCM_S16BE, AV_CODEC_ID_PCM_S16LE), | |||||
.video_codec = AV_CODEC_ID_NONE, | |||||
.write_header = audio_write_header, | |||||
.write_packet = audio_write_packet, | |||||
.write_trailer = audio_write_trailer, | |||||
.flags = AVFMT_NOFILE, | |||||
}; |
@@ -29,7 +29,7 @@ | |||||
#define LIBAVDEVICE_VERSION_MAJOR 57 | #define LIBAVDEVICE_VERSION_MAJOR 57 | ||||
#define LIBAVDEVICE_VERSION_MINOR 0 | #define LIBAVDEVICE_VERSION_MINOR 0 | ||||
#define LIBAVDEVICE_VERSION_MICRO 0 | |||||
#define LIBAVDEVICE_VERSION_MICRO 1 | |||||
#define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ | #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ | ||||
LIBAVDEVICE_VERSION_MINOR, \ | LIBAVDEVICE_VERSION_MINOR, \ | ||||