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 "rawdec.h"
00024 #include "pcm.h"
00025 #include "libavutil/log.h"
00026 #include "libavutil/opt.h"
00027
00028 #define RAW_SAMPLES 1024
00029
00030 static int raw_read_packet(AVFormatContext *s, AVPacket *pkt)
00031 {
00032 int ret, size, bps;
00033
00034
00035 size= RAW_SAMPLES*s->streams[0]->codec->block_align;
00036
00037 ret= av_get_packet(s->pb, pkt, size);
00038
00039 pkt->flags &= ~AV_PKT_FLAG_CORRUPT;
00040 pkt->stream_index = 0;
00041 if (ret < 0)
00042 return ret;
00043
00044 bps= av_get_bits_per_sample(s->streams[0]->codec->codec_id);
00045 assert(bps);
00046 pkt->dts=
00047 pkt->pts= pkt->pos*8 / (bps * s->streams[0]->codec->channels);
00048
00049 return ret;
00050 }
00051
00052 static const AVOption pcm_options[] = {
00053 { "sample_rate", "", offsetof(RawAudioDemuxerContext, sample_rate), AV_OPT_TYPE_INT, {.dbl = 0}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
00054 { "channels", "", offsetof(RawAudioDemuxerContext, channels), AV_OPT_TYPE_INT, {.dbl = 0}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
00055 { NULL },
00056 };
00057
00058 #define PCMDEF(name_, long_name_, ext, codec) \
00059 static const AVClass name_ ## _demuxer_class = { \
00060 .class_name = #name_ " demuxer", \
00061 .item_name = av_default_item_name, \
00062 .option = pcm_options, \
00063 .version = LIBAVUTIL_VERSION_INT, \
00064 }; \
00065 AVInputFormat ff_pcm_ ## name_ ## _demuxer = { \
00066 .name = #name_, \
00067 .long_name = NULL_IF_CONFIG_SMALL(long_name_), \
00068 .priv_data_size = sizeof(RawAudioDemuxerContext), \
00069 .read_header = ff_raw_read_header, \
00070 .read_packet = raw_read_packet, \
00071 .read_seek = ff_pcm_read_seek, \
00072 .flags = AVFMT_GENERIC_INDEX, \
00073 .extensions = ext, \
00074 .raw_codec_id = codec, \
00075 .priv_class = &name_ ## _demuxer_class, \
00076 };
00077
00078 PCMDEF(f64be, "PCM 64 bit floating-point big-endian format",
00079 NULL, CODEC_ID_PCM_F64BE)
00080
00081 PCMDEF(f64le, "PCM 64 bit floating-point little-endian format",
00082 NULL, CODEC_ID_PCM_F64LE)
00083
00084 PCMDEF(f32be, "PCM 32 bit floating-point big-endian format",
00085 NULL, CODEC_ID_PCM_F32BE)
00086
00087 PCMDEF(f32le, "PCM 32 bit floating-point little-endian format",
00088 NULL, CODEC_ID_PCM_F32LE)
00089
00090 PCMDEF(s32be, "PCM signed 32 bit big-endian format",
00091 NULL, CODEC_ID_PCM_S32BE)
00092
00093 PCMDEF(s32le, "PCM signed 32 bit little-endian format",
00094 NULL, CODEC_ID_PCM_S32LE)
00095
00096 PCMDEF(s24be, "PCM signed 24 bit big-endian format",
00097 NULL, CODEC_ID_PCM_S24BE)
00098
00099 PCMDEF(s24le, "PCM signed 24 bit little-endian format",
00100 NULL, CODEC_ID_PCM_S24LE)
00101
00102 PCMDEF(s16be, "PCM signed 16 bit big-endian format",
00103 AV_NE("sw", NULL), CODEC_ID_PCM_S16BE)
00104
00105 PCMDEF(s16le, "PCM signed 16 bit little-endian format",
00106 AV_NE(NULL, "sw"), CODEC_ID_PCM_S16LE)
00107
00108 PCMDEF(s8, "PCM signed 8 bit format",
00109 "sb", CODEC_ID_PCM_S8)
00110
00111 PCMDEF(u32be, "PCM unsigned 32 bit big-endian format",
00112 NULL, CODEC_ID_PCM_U32BE)
00113
00114 PCMDEF(u32le, "PCM unsigned 32 bit little-endian format",
00115 NULL, CODEC_ID_PCM_U32LE)
00116
00117 PCMDEF(u24be, "PCM unsigned 24 bit big-endian format",
00118 NULL, CODEC_ID_PCM_U24BE)
00119
00120 PCMDEF(u24le, "PCM unsigned 24 bit little-endian format",
00121 NULL, CODEC_ID_PCM_U24LE)
00122
00123 PCMDEF(u16be, "PCM unsigned 16 bit big-endian format",
00124 AV_NE("uw", NULL), CODEC_ID_PCM_U16BE)
00125
00126 PCMDEF(u16le, "PCM unsigned 16 bit little-endian format",
00127 AV_NE(NULL, "uw"), CODEC_ID_PCM_U16LE)
00128
00129 PCMDEF(u8, "PCM unsigned 8 bit format",
00130 "ub", CODEC_ID_PCM_U8)
00131
00132 PCMDEF(alaw, "PCM A-law format",
00133 "al", CODEC_ID_PCM_ALAW)
00134
00135 PCMDEF(mulaw, "PCM mu-law format",
00136 "ul", CODEC_ID_PCM_MULAW)