Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4349 Serge 1
/*
2
 * RAW PCM demuxers
3
 * Copyright (c) 2002 Fabrice Bellard
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 "avformat.h"
23
#include "internal.h"
24
#include "pcm.h"
25
#include "libavutil/log.h"
26
#include "libavutil/opt.h"
27
#include "libavutil/avassert.h"
28
 
29
typedef struct PCMAudioDemuxerContext {
30
    AVClass *class;
31
    int sample_rate;
32
    int channels;
33
} PCMAudioDemuxerContext;
34
 
35
static int pcm_read_header(AVFormatContext *s)
36
{
37
    PCMAudioDemuxerContext *s1 = s->priv_data;
38
    AVStream *st;
39
 
40
    st = avformat_new_stream(s, NULL);
41
    if (!st)
42
        return AVERROR(ENOMEM);
43
 
44
 
45
    st->codec->codec_type  = AVMEDIA_TYPE_AUDIO;
46
    st->codec->codec_id    = s->iformat->raw_codec_id;
47
    st->codec->sample_rate = s1->sample_rate;
48
    st->codec->channels    = s1->channels;
49
 
50
    st->codec->bits_per_coded_sample =
51
        av_get_bits_per_sample(st->codec->codec_id);
52
 
53
    av_assert0(st->codec->bits_per_coded_sample > 0);
54
 
55
    st->codec->block_align =
56
        st->codec->bits_per_coded_sample * st->codec->channels / 8;
57
 
58
    avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
59
    return 0;
60
}
61
 
62
static const AVOption pcm_options[] = {
63
    { "sample_rate", "", offsetof(PCMAudioDemuxerContext, sample_rate), AV_OPT_TYPE_INT, {.i64 = 44100}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
64
    { "channels",    "", offsetof(PCMAudioDemuxerContext, channels),    AV_OPT_TYPE_INT, {.i64 = 1}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
65
    { NULL },
66
};
67
 
68
#define PCMDEF(name_, long_name_, ext, codec)               \
69
static const AVClass name_ ## _demuxer_class = {            \
70
    .class_name = #name_ " demuxer",                        \
71
    .item_name  = av_default_item_name,                     \
72
    .option     = pcm_options,                              \
73
    .version    = LIBAVUTIL_VERSION_INT,                    \
74
};                                                          \
75
AVInputFormat ff_pcm_ ## name_ ## _demuxer = {              \
76
    .name           = #name_,                               \
77
    .long_name      = NULL_IF_CONFIG_SMALL(long_name_),     \
78
    .priv_data_size = sizeof(PCMAudioDemuxerContext),       \
79
    .read_header    = pcm_read_header,                      \
80
    .read_packet    = ff_pcm_read_packet,                   \
81
    .read_seek      = ff_pcm_read_seek,                     \
82
    .flags          = AVFMT_GENERIC_INDEX,                  \
83
    .extensions     = ext,                                  \
84
    .raw_codec_id   = codec,                                \
85
    .priv_class     = &name_ ## _demuxer_class,             \
86
};
87
 
88
PCMDEF(f64be, "PCM 64-bit floating-point big-endian",
89
       NULL, AV_CODEC_ID_PCM_F64BE)
90
 
91
PCMDEF(f64le, "PCM 64-bit floating-point little-endian",
92
       NULL, AV_CODEC_ID_PCM_F64LE)
93
 
94
PCMDEF(f32be, "PCM 32-bit floating-point big-endian",
95
       NULL, AV_CODEC_ID_PCM_F32BE)
96
 
97
PCMDEF(f32le, "PCM 32-bit floating-point little-endian",
98
       NULL, AV_CODEC_ID_PCM_F32LE)
99
 
100
PCMDEF(s32be, "PCM signed 32-bit big-endian",
101
       NULL, AV_CODEC_ID_PCM_S32BE)
102
 
103
PCMDEF(s32le, "PCM signed 32-bit little-endian",
104
       NULL, AV_CODEC_ID_PCM_S32LE)
105
 
106
PCMDEF(s24be, "PCM signed 24-bit big-endian",
107
       NULL, AV_CODEC_ID_PCM_S24BE)
108
 
109
PCMDEF(s24le, "PCM signed 24-bit little-endian",
110
       NULL, AV_CODEC_ID_PCM_S24LE)
111
 
112
PCMDEF(s16be, "PCM signed 16-bit big-endian",
113
       AV_NE("sw", NULL), AV_CODEC_ID_PCM_S16BE)
114
 
115
PCMDEF(s16le, "PCM signed 16-bit little-endian",
116
       AV_NE(NULL, "sw"), AV_CODEC_ID_PCM_S16LE)
117
 
118
PCMDEF(s8, "PCM signed 8-bit",
119
       "sb", AV_CODEC_ID_PCM_S8)
120
 
121
PCMDEF(u32be, "PCM unsigned 32-bit big-endian",
122
       NULL, AV_CODEC_ID_PCM_U32BE)
123
 
124
PCMDEF(u32le, "PCM unsigned 32-bit little-endian",
125
       NULL, AV_CODEC_ID_PCM_U32LE)
126
 
127
PCMDEF(u24be, "PCM unsigned 24-bit big-endian",
128
       NULL, AV_CODEC_ID_PCM_U24BE)
129
 
130
PCMDEF(u24le, "PCM unsigned 24-bit little-endian",
131
       NULL, AV_CODEC_ID_PCM_U24LE)
132
 
133
PCMDEF(u16be, "PCM unsigned 16-bit big-endian",
134
       AV_NE("uw", NULL), AV_CODEC_ID_PCM_U16BE)
135
 
136
PCMDEF(u16le, "PCM unsigned 16-bit little-endian",
137
       AV_NE(NULL, "uw"), AV_CODEC_ID_PCM_U16LE)
138
 
139
PCMDEF(u8, "PCM unsigned 8-bit",
140
       "ub", AV_CODEC_ID_PCM_U8)
141
 
142
PCMDEF(alaw, "PCM A-law",
143
       "al", AV_CODEC_ID_PCM_ALAW)
144
 
145
PCMDEF(mulaw, "PCM mu-law",
146
       "ul", AV_CODEC_ID_PCM_MULAW)