FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavdevice
sndio_enc.c
Go to the documentation of this file.
1
/*
2
* sndio play and grab interface
3
* Copyright (c) 2010 Jacob Meuser
4
*
5
* This file is part of FFmpeg.
6
*
7
* FFmpeg is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Lesser General Public
9
* License as published by the Free Software Foundation; either
10
* version 2.1 of the License, or (at your option) any later version.
11
*
12
* FFmpeg is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Lesser General Public License for more details.
16
*
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with FFmpeg; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
*/
21
22
#include <stdint.h>
23
#include <sndio.h>
24
25
#include "
avdevice.h
"
26
#include "
sndio_common.h
"
27
28
static
av_cold
int
audio_write_header
(
AVFormatContext
*
s1
)
29
{
30
SndioData
*
s
= s1->
priv_data
;
31
AVStream
*st;
32
int
ret
;
33
34
st = s1->
streams
[0];
35
s->
sample_rate
= st->
codec
->
sample_rate
;
36
s->
channels
= st->
codec
->
channels
;
37
38
ret =
ff_sndio_open
(s1, 1, s1->
filename
);
39
40
return
ret
;
41
}
42
43
static
int
audio_write_packet
(
AVFormatContext
*
s1
,
AVPacket
*
pkt
)
44
{
45
SndioData
*
s
= s1->
priv_data
;
46
uint8_t
*
buf
= pkt->
data
;
47
int
size
= pkt->
size
;
48
int
len
,
ret
;
49
50
while
(size > 0) {
51
len =
FFMIN
(s->
buffer_size
- s->
buffer_offset
, size);
52
memcpy(s->
buffer
+ s->
buffer_offset
, buf, len);
53
buf +=
len
;
54
size -=
len
;
55
s->
buffer_offset
+=
len
;
56
if
(s->
buffer_offset
>= s->
buffer_size
) {
57
ret = sio_write(s->
hdl
, s->
buffer
, s->
buffer_size
);
58
if
(ret == 0 || sio_eof(s->
hdl
))
59
return
AVERROR
(EIO);
60
s->
softpos
+=
ret
;
61
s->
buffer_offset
= 0;
62
}
63
}
64
65
return
0;
66
}
67
68
static
int
audio_write_trailer
(
AVFormatContext
*
s1
)
69
{
70
SndioData
*
s
= s1->
priv_data
;
71
72
sio_write(s->
hdl
, s->
buffer
, s->
buffer_offset
);
73
74
ff_sndio_close
(s);
75
76
return
0;
77
}
78
79
static
const
AVClass
sndio_muxer_class
= {
80
.
class_name
=
"sndio outdev"
,
81
.item_name =
av_default_item_name
,
82
.version =
LIBAVUTIL_VERSION_INT
,
83
.category =
AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT
,
84
};
85
86
AVOutputFormat
ff_sndio_muxer
= {
87
.
name
=
"sndio"
,
88
.long_name =
NULL_IF_CONFIG_SMALL
(
"sndio audio playback"
),
89
.priv_data_size =
sizeof
(
SndioData
),
90
/* XXX: we make the assumption that the soundcard accepts this format */
91
/* XXX: find better solution with "preinit" method, needed also in
92
other formats */
93
.audio_codec =
AV_NE
(
AV_CODEC_ID_PCM_S16BE
,
AV_CODEC_ID_PCM_S16LE
),
94
.video_codec =
AV_CODEC_ID_NONE
,
95
.write_header =
audio_write_header
,
96
.write_packet =
audio_write_packet
,
97
.write_trailer =
audio_write_trailer
,
98
.flags =
AVFMT_NOFILE
,
99
.priv_class = &
sndio_muxer_class
,
100
};
Generated on Sun Sep 14 2014 18:56:08 for FFmpeg by
1.8.2