Statistics
| Branch: | Revision:

ffmpeg / libavdevice / sndio_enc.c @ 15d59d2c

History | View | Annotate | Download (2.71 KB)

1
/*
2
 * sndio play and grab interface
3
 * Copyright (c) 2010 Jacob Meuser
4
 *
5
 * This file is part of Libav.
6
 *
7
 * Libav 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
 * Libav 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 Libav; 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 "libavformat/avformat.h"
26

    
27
#include "sndio_common.h"
28

    
29
static av_cold int audio_write_header(AVFormatContext *s1)
30
{
31
    SndioData *s = s1->priv_data;
32
    AVStream *st;
33
    int ret;
34

    
35
    st             = s1->streams[0];
36
    s->sample_rate = st->codec->sample_rate;
37
    s->channels    = st->codec->channels;
38

    
39
    ret = ff_sndio_open(s1, 1, s1->filename);
40

    
41
    return ret;
42
}
43

    
44
static int audio_write_packet(AVFormatContext *s1, AVPacket *pkt)
45
{
46
    SndioData *s = s1->priv_data;
47
    uint8_t *buf= pkt->data;
48
    int size = pkt->size;
49
    int len, ret;
50

    
51
    while (size > 0) {
52
        len = s->buffer_size - s->buffer_offset;
53
        if (len > size)
54
            len = size;
55
        memcpy(s->buffer + s->buffer_offset, buf, len);
56
        buf  += len;
57
        size -= len;
58
        s->buffer_offset += len;
59
        if (s->buffer_offset >= s->buffer_size) {
60
            ret = sio_write(s->hdl, s->buffer, s->buffer_size);
61
            if (ret == 0 || sio_eof(s->hdl))
62
                return AVERROR(EIO);
63
            s->softpos      += ret;
64
            s->buffer_offset = 0;
65
        }
66
    }
67

    
68
    return 0;
69
}
70

    
71
static int audio_write_trailer(AVFormatContext *s1)
72
{
73
    SndioData *s = s1->priv_data;
74

    
75
    sio_write(s->hdl, s->buffer, s->buffer_offset);
76

    
77
    ff_sndio_close(s);
78

    
79
    return 0;
80
}
81

    
82
AVOutputFormat ff_sndio_muxer = {
83
    .name           = "sndio",
84
    .long_name      = NULL_IF_CONFIG_SMALL("sndio audio playback"),
85
    .priv_data_size = sizeof(SndioData),
86
    /* XXX: we make the assumption that the soundcard accepts this format */
87
    /* XXX: find better solution with "preinit" method, needed also in
88
       other formats */
89
    .audio_codec    = AV_NE(CODEC_ID_PCM_S16BE, CODEC_ID_PCM_S16LE),
90
    .video_codec    = CODEC_ID_NONE,
91
    .write_header   = audio_write_header,
92
    .write_packet   = audio_write_packet,
93
    .write_trailer  = audio_write_trailer,
94
    .flags          = AVFMT_NOFILE,
95
};