Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
F
FFmpeg
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
libremedia
Tethys
FFmpeg
Commits
d46cd249
Commit
d46cd249
authored
7 years ago
by
Diego Biurrun
Browse files
Options
Downloads
Patches
Plain Diff
alsa: Coalesce source files after outdev removal
parent
6ce13070
No related branches found
No related tags found
No related merge requests found
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
libavdevice/Makefile
+1
-1
1 addition, 1 deletion
libavdevice/Makefile
libavdevice/alsa.c
+181
-9
181 additions, 9 deletions
libavdevice/alsa.c
libavdevice/alsa.h
+0
-94
0 additions, 94 deletions
libavdevice/alsa.h
libavdevice/alsa_dec.c
+0
-178
0 additions, 178 deletions
libavdevice/alsa_dec.c
with
182 additions
and
282 deletions
libavdevice/Makefile
+
1
−
1
View file @
d46cd249
...
@@ -10,7 +10,7 @@ OBJS = alldevices.o \
...
@@ -10,7 +10,7 @@ OBJS = alldevices.o \
OBJS-$(HAVE_LIBC_MSVCRT)
+=
file_open.o
OBJS-$(HAVE_LIBC_MSVCRT)
+=
file_open.o
# input devices
# input devices
OBJS-$(CONFIG_ALSA_INDEV)
+=
alsa_dec.o
alsa.o
OBJS-$(CONFIG_ALSA_INDEV)
+=
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
...
...
This diff is collapsed.
Click to expand it.
libavdevice/alsa.c
+
181
−
9
View file @
d46cd249
/*
/*
* ALSA input
and output
* ALSA input
* Copyright (c) 2007 Luca Abeni ( lucabe72 email it )
* Copyright (c) 2007 Luca Abeni ( lucabe72 email it )
* Copyright (c) 2007 Benoit Fouet ( benoit fouet free fr )
* Copyright (c) 2007 Benoit Fouet ( benoit fouet free fr )
*
*
...
@@ -22,18 +22,39 @@
...
@@ -22,18 +22,39 @@
/**
/**
* @file
* @file
* ALSA input
and output: common code
* ALSA input
* @author Luca Abeni ( lucabe72 email it )
* @author Luca Abeni ( lucabe72 email it )
* @author Benoit Fouet ( benoit fouet free fr )
* @author Benoit Fouet ( benoit fouet free fr )
* @author Nicolas George ( nicolas george normalesup org )
* @author Nicolas George ( nicolas george normalesup org )
*/
*/
#include
<alsa/asoundlib.h>
#include
<alsa/asoundlib.h>
#include
"libavformat/avformat.h"
#include
"libavutil/avassert.h"
#include
"libavutil/avassert.h"
#include
"libavutil/channel_layout.h"
#include
"libavutil/channel_layout.h"
#include
"libavutil/opt.h"
#include
"libavformat/avformat.h"
#include
"libavformat/internal.h"
#include
"alsa.h"
/* XXX: we make the assumption that the soundcard accepts this format */
/* XXX: find better solution with "preinit" method, needed also in
other formats */
#define DEFAULT_CODEC_ID AV_NE(AV_CODEC_ID_PCM_S16BE, AV_CODEC_ID_PCM_S16LE)
#define ALSA_BUFFER_SIZE_MAX 32768
typedef
struct
AlsaData
{
AVClass
*
class
;
snd_pcm_t
*
h
;
int
frame_size
;
///< preferred size for reads and writes
int
period_size
;
///< bytes per sample * channels
int
sample_rate
;
///< sample rate set by user
int
channels
;
///< number of channels set by user
void
(
*
reorder_func
)(
const
void
*
,
void
*
,
int
);
void
*
reorder_buf
;
int
reorder_buf_size
;
///< in frames
}
AlsaData
;
static
av_cold
snd_pcm_format_t
codec_id_to_pcm_format
(
int
codec_id
)
static
av_cold
snd_pcm_format_t
codec_id_to_pcm_format
(
int
codec_id
)
{
{
...
@@ -183,9 +204,23 @@ static av_cold int find_reorder_func(AlsaData *s, int codec_id, uint64_t layout,
...
@@ -183,9 +204,23 @@ static av_cold int find_reorder_func(AlsaData *s, int codec_id, uint64_t layout,
return
s
->
reorder_func
?
0
:
AVERROR
(
ENOSYS
);
return
s
->
reorder_func
?
0
:
AVERROR
(
ENOSYS
);
}
}
av_cold
int
ff_alsa_open
(
AVFormatContext
*
ctx
,
snd_pcm_stream_t
mode
,
/**
unsigned
int
*
sample_rate
,
* Open an ALSA PCM.
int
channels
,
enum
AVCodecID
*
codec_id
)
*
* @param s media file handle
* @param mode either SND_PCM_STREAM_CAPTURE or SND_PCM_STREAM_PLAYBACK
* @param sample_rate in: requested sample rate;
* out: actually selected sample rate
* @param channels number of channels
* @param codec_id in: requested AVCodecID or AV_CODEC_ID_NONE;
* out: actually selected AVCodecID, changed only if
* AV_CODEC_ID_NONE was requested
*
* @return 0 if OK, AVERROR_xxx on error
*/
static
av_cold
int
alsa_open
(
AVFormatContext
*
ctx
,
snd_pcm_stream_t
mode
,
unsigned
int
*
sample_rate
,
int
channels
,
enum
AVCodecID
*
codec_id
)
{
{
AlsaData
*
s
=
ctx
->
priv_data
;
AlsaData
*
s
=
ctx
->
priv_data
;
const
char
*
audio_device
;
const
char
*
audio_device
;
...
@@ -315,7 +350,14 @@ fail1:
...
@@ -315,7 +350,14 @@ fail1:
return
AVERROR
(
EIO
);
return
AVERROR
(
EIO
);
}
}
av_cold
int
ff_alsa_close
(
AVFormatContext
*
s1
)
/**
* Close the ALSA PCM.
*
* @param s1 media file handle
*
* @return 0
*/
static
av_cold
int
alsa_close
(
AVFormatContext
*
s1
)
{
{
AlsaData
*
s
=
s1
->
priv_data
;
AlsaData
*
s
=
s1
->
priv_data
;
...
@@ -324,7 +366,15 @@ av_cold int ff_alsa_close(AVFormatContext *s1)
...
@@ -324,7 +366,15 @@ av_cold int ff_alsa_close(AVFormatContext *s1)
return
0
;
return
0
;
}
}
int
ff_alsa_xrun_recover
(
AVFormatContext
*
s1
,
int
err
)
/**
* Try to recover from ALSA buffer underrun.
*
* @param s1 media file handle
* @param err error code reported by the previous ALSA call
*
* @return 0 if OK, AVERROR_xxx on error
*/
static
int
alsa_xrun_recover
(
AVFormatContext
*
s1
,
int
err
)
{
{
AlsaData
*
s
=
s1
->
priv_data
;
AlsaData
*
s
=
s1
->
priv_data
;
snd_pcm_t
*
handle
=
s
->
h
;
snd_pcm_t
*
handle
=
s
->
h
;
...
@@ -344,3 +394,125 @@ int ff_alsa_xrun_recover(AVFormatContext *s1, int err)
...
@@ -344,3 +394,125 @@ int ff_alsa_xrun_recover(AVFormatContext *s1, int err)
}
}
return
err
;
return
err
;
}
}
static
av_cold
int
audio_read_header
(
AVFormatContext
*
s1
)
{
AlsaData
*
s
=
s1
->
priv_data
;
AVStream
*
st
;
int
ret
;
enum
AVCodecID
codec_id
;
snd_pcm_sw_params_t
*
sw_params
;
st
=
avformat_new_stream
(
s1
,
NULL
);
if
(
!
st
)
{
av_log
(
s1
,
AV_LOG_ERROR
,
"Cannot add stream
\n
"
);
return
AVERROR
(
ENOMEM
);
}
codec_id
=
s1
->
audio_codec_id
;
ret
=
alsa_open
(
s1
,
SND_PCM_STREAM_CAPTURE
,
&
s
->
sample_rate
,
s
->
channels
,
&
codec_id
);
if
(
ret
<
0
)
{
return
AVERROR
(
EIO
);
}
if
(
snd_pcm_type
(
s
->
h
)
!=
SND_PCM_TYPE_HW
)
av_log
(
s1
,
AV_LOG_WARNING
,
"capture with some ALSA plugins, especially dsnoop, "
"may hang.
\n
"
);
ret
=
snd_pcm_sw_params_malloc
(
&
sw_params
);
if
(
ret
<
0
)
{
av_log
(
s1
,
AV_LOG_ERROR
,
"cannot allocate software parameters structure (%s)
\n
"
,
snd_strerror
(
ret
));
goto
fail
;
}
snd_pcm_sw_params_current
(
s
->
h
,
sw_params
);
snd_pcm_sw_params_set_tstamp_mode
(
s
->
h
,
sw_params
,
SND_PCM_TSTAMP_ENABLE
);
ret
=
snd_pcm_sw_params
(
s
->
h
,
sw_params
);
snd_pcm_sw_params_free
(
sw_params
);
if
(
ret
<
0
)
{
av_log
(
s1
,
AV_LOG_ERROR
,
"cannot install ALSA software parameters (%s)
\n
"
,
snd_strerror
(
ret
));
goto
fail
;
}
/* take real parameters */
st
->
codecpar
->
codec_type
=
AVMEDIA_TYPE_AUDIO
;
st
->
codecpar
->
codec_id
=
codec_id
;
st
->
codecpar
->
sample_rate
=
s
->
sample_rate
;
st
->
codecpar
->
channels
=
s
->
channels
;
avpriv_set_pts_info
(
st
,
64
,
1
,
1000000
);
/* 64 bits pts in us */
return
0
;
fail:
snd_pcm_close
(
s
->
h
);
return
AVERROR
(
EIO
);
}
static
int
audio_read_packet
(
AVFormatContext
*
s1
,
AVPacket
*
pkt
)
{
AlsaData
*
s
=
s1
->
priv_data
;
AVStream
*
st
=
s1
->
streams
[
0
];
int
res
;
snd_htimestamp_t
timestamp
;
snd_pcm_uframes_t
ts_delay
;
if
(
av_new_packet
(
pkt
,
s
->
period_size
)
<
0
)
{
return
AVERROR
(
EIO
);
}
while
((
res
=
snd_pcm_readi
(
s
->
h
,
pkt
->
data
,
pkt
->
size
/
s
->
frame_size
))
<
0
)
{
if
(
res
==
-
EAGAIN
)
{
av_packet_unref
(
pkt
);
return
AVERROR
(
EAGAIN
);
}
if
(
alsa_xrun_recover
(
s1
,
res
)
<
0
)
{
av_log
(
s1
,
AV_LOG_ERROR
,
"ALSA read error: %s
\n
"
,
snd_strerror
(
res
));
av_packet_unref
(
pkt
);
return
AVERROR
(
EIO
);
}
}
snd_pcm_htimestamp
(
s
->
h
,
&
ts_delay
,
&
timestamp
);
ts_delay
+=
res
;
pkt
->
pts
=
timestamp
.
tv_sec
*
1000000LL
+
(
timestamp
.
tv_nsec
*
st
->
codecpar
->
sample_rate
-
(
int64_t
)
ts_delay
*
1000000000LL
+
st
->
codecpar
->
sample_rate
*
500LL
)
/
(
st
->
codecpar
->
sample_rate
*
1000LL
);
pkt
->
size
=
res
*
s
->
frame_size
;
return
0
;
}
static
const
AVOption
options
[]
=
{
{
"sample_rate"
,
""
,
offsetof
(
AlsaData
,
sample_rate
),
AV_OPT_TYPE_INT
,
{.
i64
=
48000
},
1
,
INT_MAX
,
AV_OPT_FLAG_DECODING_PARAM
},
{
"channels"
,
""
,
offsetof
(
AlsaData
,
channels
),
AV_OPT_TYPE_INT
,
{.
i64
=
2
},
1
,
INT_MAX
,
AV_OPT_FLAG_DECODING_PARAM
},
{
NULL
},
};
static
const
AVClass
alsa_demuxer_class
=
{
.
class_name
=
"ALSA demuxer"
,
.
item_name
=
av_default_item_name
,
.
option
=
options
,
.
version
=
LIBAVUTIL_VERSION_INT
,
};
AVInputFormat
ff_alsa_demuxer
=
{
.
name
=
"alsa"
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"ALSA audio input"
),
.
priv_data_size
=
sizeof
(
AlsaData
),
.
read_header
=
audio_read_header
,
.
read_packet
=
audio_read_packet
,
.
read_close
=
alsa_close
,
.
flags
=
AVFMT_NOFILE
,
.
priv_class
=
&
alsa_demuxer_class
,
};
This diff is collapsed.
Click to expand it.
libavdevice/alsa.h
deleted
100644 → 0
+
0
−
94
View file @
6ce13070
/*
* 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: definitions and structures
* @author Luca Abeni ( lucabe72 email it )
* @author Benoit Fouet ( benoit fouet free fr )
*/
#ifndef AVDEVICE_ALSA_H
#define AVDEVICE_ALSA_H
#include
<alsa/asoundlib.h>
#include
"config.h"
#include
"libavformat/avformat.h"
#include
"libavutil/log.h"
/* XXX: we make the assumption that the soundcard accepts this format */
/* XXX: find better solution with "preinit" method, needed also in
other formats */
#define DEFAULT_CODEC_ID AV_NE(AV_CODEC_ID_PCM_S16BE, AV_CODEC_ID_PCM_S16LE)
#define ALSA_BUFFER_SIZE_MAX 32768
typedef
struct
AlsaData
{
AVClass
*
class
;
snd_pcm_t
*
h
;
int
frame_size
;
///< preferred size for reads and writes
int
period_size
;
///< bytes per sample * channels
int
sample_rate
;
///< sample rate set by user
int
channels
;
///< number of channels set by user
void
(
*
reorder_func
)(
const
void
*
,
void
*
,
int
);
void
*
reorder_buf
;
int
reorder_buf_size
;
///< in frames
}
AlsaData
;
/**
* Open an ALSA PCM.
*
* @param s media file handle
* @param mode either SND_PCM_STREAM_CAPTURE or SND_PCM_STREAM_PLAYBACK
* @param sample_rate in: requested sample rate;
* out: actually selected sample rate
* @param channels number of channels
* @param codec_id in: requested AVCodecID or AV_CODEC_ID_NONE;
* out: actually selected AVCodecID, changed only if
* AV_CODEC_ID_NONE was requested
*
* @return 0 if OK, AVERROR_xxx on error
*/
int
ff_alsa_open
(
AVFormatContext
*
s
,
snd_pcm_stream_t
mode
,
unsigned
int
*
sample_rate
,
int
channels
,
enum
AVCodecID
*
codec_id
);
/**
* Close the ALSA PCM.
*
* @param s1 media file handle
*
* @return 0
*/
int
ff_alsa_close
(
AVFormatContext
*
s1
);
/**
* Try to recover from ALSA buffer underrun.
*
* @param s1 media file handle
* @param err error code reported by the previous ALSA call
*
* @return 0 if OK, AVERROR_xxx on error
*/
int
ff_alsa_xrun_recover
(
AVFormatContext
*
s1
,
int
err
);
#endif
/* AVDEVICE_ALSA_H */
This diff is collapsed.
Click to expand it.
libavdevice/alsa_dec.c
deleted
100644 → 0
+
0
−
178
View file @
6ce13070
/*
* 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: input
* @author Luca Abeni ( lucabe72 email it )
* @author Benoit Fouet ( benoit fouet free fr )
* @author Nicolas George ( nicolas george normalesup org )
*
* This avdevice decoder allows to capture audio from 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 capture period is set to the lower value available for the device,
* which gives a low latency suitable for real-time capture.
*
* The PTS are an Unix time in microsecond.
*
* Due to a bug in the ALSA library
* (https://bugtrack.alsa-project.org/alsa-bug/view.php?id=4308), this
* decoder does not work with certain ALSA plugins, especially the dsnoop
* plugin.
*/
#include
<alsa/asoundlib.h>
#include
"libavutil/internal.h"
#include
"libavutil/opt.h"
#include
"libavformat/avformat.h"
#include
"libavformat/internal.h"
#include
"alsa.h"
static
av_cold
int
audio_read_header
(
AVFormatContext
*
s1
)
{
AlsaData
*
s
=
s1
->
priv_data
;
AVStream
*
st
;
int
ret
;
enum
AVCodecID
codec_id
;
snd_pcm_sw_params_t
*
sw_params
;
st
=
avformat_new_stream
(
s1
,
NULL
);
if
(
!
st
)
{
av_log
(
s1
,
AV_LOG_ERROR
,
"Cannot add stream
\n
"
);
return
AVERROR
(
ENOMEM
);
}
codec_id
=
s1
->
audio_codec_id
;
ret
=
ff_alsa_open
(
s1
,
SND_PCM_STREAM_CAPTURE
,
&
s
->
sample_rate
,
s
->
channels
,
&
codec_id
);
if
(
ret
<
0
)
{
return
AVERROR
(
EIO
);
}
if
(
snd_pcm_type
(
s
->
h
)
!=
SND_PCM_TYPE_HW
)
av_log
(
s1
,
AV_LOG_WARNING
,
"capture with some ALSA plugins, especially dsnoop, "
"may hang.
\n
"
);
ret
=
snd_pcm_sw_params_malloc
(
&
sw_params
);
if
(
ret
<
0
)
{
av_log
(
s1
,
AV_LOG_ERROR
,
"cannot allocate software parameters structure (%s)
\n
"
,
snd_strerror
(
ret
));
goto
fail
;
}
snd_pcm_sw_params_current
(
s
->
h
,
sw_params
);
snd_pcm_sw_params_set_tstamp_mode
(
s
->
h
,
sw_params
,
SND_PCM_TSTAMP_ENABLE
);
ret
=
snd_pcm_sw_params
(
s
->
h
,
sw_params
);
snd_pcm_sw_params_free
(
sw_params
);
if
(
ret
<
0
)
{
av_log
(
s1
,
AV_LOG_ERROR
,
"cannot install ALSA software parameters (%s)
\n
"
,
snd_strerror
(
ret
));
goto
fail
;
}
/* take real parameters */
st
->
codecpar
->
codec_type
=
AVMEDIA_TYPE_AUDIO
;
st
->
codecpar
->
codec_id
=
codec_id
;
st
->
codecpar
->
sample_rate
=
s
->
sample_rate
;
st
->
codecpar
->
channels
=
s
->
channels
;
avpriv_set_pts_info
(
st
,
64
,
1
,
1000000
);
/* 64 bits pts in us */
return
0
;
fail:
snd_pcm_close
(
s
->
h
);
return
AVERROR
(
EIO
);
}
static
int
audio_read_packet
(
AVFormatContext
*
s1
,
AVPacket
*
pkt
)
{
AlsaData
*
s
=
s1
->
priv_data
;
AVStream
*
st
=
s1
->
streams
[
0
];
int
res
;
snd_htimestamp_t
timestamp
;
snd_pcm_uframes_t
ts_delay
;
if
(
av_new_packet
(
pkt
,
s
->
period_size
)
<
0
)
{
return
AVERROR
(
EIO
);
}
while
((
res
=
snd_pcm_readi
(
s
->
h
,
pkt
->
data
,
pkt
->
size
/
s
->
frame_size
))
<
0
)
{
if
(
res
==
-
EAGAIN
)
{
av_packet_unref
(
pkt
);
return
AVERROR
(
EAGAIN
);
}
if
(
ff_alsa_xrun_recover
(
s1
,
res
)
<
0
)
{
av_log
(
s1
,
AV_LOG_ERROR
,
"ALSA read error: %s
\n
"
,
snd_strerror
(
res
));
av_packet_unref
(
pkt
);
return
AVERROR
(
EIO
);
}
}
snd_pcm_htimestamp
(
s
->
h
,
&
ts_delay
,
&
timestamp
);
ts_delay
+=
res
;
pkt
->
pts
=
timestamp
.
tv_sec
*
1000000LL
+
(
timestamp
.
tv_nsec
*
st
->
codecpar
->
sample_rate
-
(
int64_t
)
ts_delay
*
1000000000LL
+
st
->
codecpar
->
sample_rate
*
500LL
)
/
(
st
->
codecpar
->
sample_rate
*
1000LL
);
pkt
->
size
=
res
*
s
->
frame_size
;
return
0
;
}
static
const
AVOption
options
[]
=
{
{
"sample_rate"
,
""
,
offsetof
(
AlsaData
,
sample_rate
),
AV_OPT_TYPE_INT
,
{.
i64
=
48000
},
1
,
INT_MAX
,
AV_OPT_FLAG_DECODING_PARAM
},
{
"channels"
,
""
,
offsetof
(
AlsaData
,
channels
),
AV_OPT_TYPE_INT
,
{.
i64
=
2
},
1
,
INT_MAX
,
AV_OPT_FLAG_DECODING_PARAM
},
{
NULL
},
};
static
const
AVClass
alsa_demuxer_class
=
{
.
class_name
=
"ALSA demuxer"
,
.
item_name
=
av_default_item_name
,
.
option
=
options
,
.
version
=
LIBAVUTIL_VERSION_INT
,
};
AVInputFormat
ff_alsa_demuxer
=
{
.
name
=
"alsa"
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"ALSA audio input"
),
.
priv_data_size
=
sizeof
(
AlsaData
),
.
read_header
=
audio_read_header
,
.
read_packet
=
audio_read_packet
,
.
read_close
=
ff_alsa_close
,
.
flags
=
AVFMT_NOFILE
,
.
priv_class
=
&
alsa_demuxer_class
,
};
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment