00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "avformat.h"
00023 #include "internal.h"
00024 #include "pcm.h"
00025 #include "libavutil/log.h"
00026 #include "libavutil/opt.h"
00027 #include "libavutil/avassert.h"
00028
00029 typedef struct PCMAudioDemuxerContext {
00030 AVClass *class;
00031 int sample_rate;
00032 int channels;
00033 } PCMAudioDemuxerContext;
00034
00035 static int pcm_read_header(AVFormatContext *s)
00036 {
00037 PCMAudioDemuxerContext *s1 = s->priv_data;
00038 AVStream *st;
00039
00040 st = avformat_new_stream(s, NULL);
00041 if (!st)
00042 return AVERROR(ENOMEM);
00043
00044
00045 st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
00046 st->codec->codec_id = s->iformat->raw_codec_id;
00047 st->codec->sample_rate = s1->sample_rate;
00048 st->codec->channels = s1->channels;
00049
00050 st->codec->bits_per_coded_sample =
00051 av_get_bits_per_sample(st->codec->codec_id);
00052
00053 av_assert0(st->codec->bits_per_coded_sample > 0);
00054
00055 st->codec->block_align =
00056 st->codec->bits_per_coded_sample * st->codec->channels / 8;
00057
00058 avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
00059 return 0;
00060 }
00061
00062 static const AVOption pcm_options[] = {
00063 { "sample_rate", "", offsetof(PCMAudioDemuxerContext, sample_rate), AV_OPT_TYPE_INT, {.i64 = 44100}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
00064 { "channels", "", offsetof(PCMAudioDemuxerContext, channels), AV_OPT_TYPE_INT, {.i64 = 1}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
00065 { NULL },
00066 };
00067
00068 #define PCMDEF(name_, long_name_, ext, codec) \
00069 static const AVClass name_ ## _demuxer_class = { \
00070 .class_name = #name_ " demuxer", \
00071 .item_name = av_default_item_name, \
00072 .option = pcm_options, \
00073 .version = LIBAVUTIL_VERSION_INT, \
00074 }; \
00075 AVInputFormat ff_pcm_ ## name_ ## _demuxer = { \
00076 .name = #name_, \
00077 .long_name = NULL_IF_CONFIG_SMALL(long_name_), \
00078 .priv_data_size = sizeof(PCMAudioDemuxerContext), \
00079 .read_header = pcm_read_header, \
00080 .read_packet = ff_pcm_read_packet, \
00081 .read_seek = ff_pcm_read_seek, \
00082 .flags = AVFMT_GENERIC_INDEX, \
00083 .extensions = ext, \
00084 .raw_codec_id = codec, \
00085 .priv_class = &name_ ## _demuxer_class, \
00086 };
00087
00088 PCMDEF(f64be, "PCM 64-bit floating-point big-endian",
00089 NULL, AV_CODEC_ID_PCM_F64BE)
00090
00091 PCMDEF(f64le, "PCM 64-bit floating-point little-endian",
00092 NULL, AV_CODEC_ID_PCM_F64LE)
00093
00094 PCMDEF(f32be, "PCM 32-bit floating-point big-endian",
00095 NULL, AV_CODEC_ID_PCM_F32BE)
00096
00097 PCMDEF(f32le, "PCM 32-bit floating-point little-endian",
00098 NULL, AV_CODEC_ID_PCM_F32LE)
00099
00100 PCMDEF(s32be, "PCM signed 32-bit big-endian",
00101 NULL, AV_CODEC_ID_PCM_S32BE)
00102
00103 PCMDEF(s32le, "PCM signed 32-bit little-endian",
00104 NULL, AV_CODEC_ID_PCM_S32LE)
00105
00106 PCMDEF(s24be, "PCM signed 24-bit big-endian",
00107 NULL, AV_CODEC_ID_PCM_S24BE)
00108
00109 PCMDEF(s24le, "PCM signed 24-bit little-endian",
00110 NULL, AV_CODEC_ID_PCM_S24LE)
00111
00112 PCMDEF(s16be, "PCM signed 16-bit big-endian",
00113 AV_NE("sw", NULL), AV_CODEC_ID_PCM_S16BE)
00114
00115 PCMDEF(s16le, "PCM signed 16-bit little-endian",
00116 AV_NE(NULL, "sw"), AV_CODEC_ID_PCM_S16LE)
00117
00118 PCMDEF(s8, "PCM signed 8-bit",
00119 "sb", AV_CODEC_ID_PCM_S8)
00120
00121 PCMDEF(u32be, "PCM unsigned 32-bit big-endian",
00122 NULL, AV_CODEC_ID_PCM_U32BE)
00123
00124 PCMDEF(u32le, "PCM unsigned 32-bit little-endian",
00125 NULL, AV_CODEC_ID_PCM_U32LE)
00126
00127 PCMDEF(u24be, "PCM unsigned 24-bit big-endian",
00128 NULL, AV_CODEC_ID_PCM_U24BE)
00129
00130 PCMDEF(u24le, "PCM unsigned 24-bit little-endian",
00131 NULL, AV_CODEC_ID_PCM_U24LE)
00132
00133 PCMDEF(u16be, "PCM unsigned 16-bit big-endian",
00134 AV_NE("uw", NULL), AV_CODEC_ID_PCM_U16BE)
00135
00136 PCMDEF(u16le, "PCM unsigned 16-bit little-endian",
00137 AV_NE(NULL, "uw"), AV_CODEC_ID_PCM_U16LE)
00138
00139 PCMDEF(u8, "PCM unsigned 8-bit",
00140 "ub", AV_CODEC_ID_PCM_U8)
00141
00142 PCMDEF(alaw, "PCM A-law",
00143 "al", AV_CODEC_ID_PCM_ALAW)
00144
00145 PCMDEF(mulaw, "PCM mu-law",
00146 "ul", AV_CODEC_ID_PCM_MULAW)