1/* 2 * RAW PCM demuxers 3 * Copyright (c) 2002 Fabrice Bellard 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 "avformat.h" 23#include "rawdec.h" 24#include "pcm.h" 25#include "libavutil/log.h" 26#include "libavutil/opt.h" 27 28#define RAW_SAMPLES 1024 29 30static int raw_read_packet(AVFormatContext *s, AVPacket *pkt) 31{ 32 int ret, size, bps; 33 // AVStream *st = s->streams[0]; 34 35 size= RAW_SAMPLES*s->streams[0]->codec->block_align; 36 37 ret= av_get_packet(s->pb, pkt, size); 38 39 pkt->stream_index = 0; 40 if (ret < 0) 41 return ret; 42 43 bps= av_get_bits_per_sample(s->streams[0]->codec->codec_id); 44 assert(bps); // if false there IS a bug elsewhere (NOT in this function) 45 pkt->dts= 46 pkt->pts= pkt->pos*8 / (bps * s->streams[0]->codec->channels); 47 48 return ret; 49} 50 51static const AVOption pcm_options[] = { 52 { "sample_rate", "", offsetof(RawAudioDemuxerContext, sample_rate), AV_OPT_TYPE_INT, {.dbl = 0}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM }, 53 { "channels", "", offsetof(RawAudioDemuxerContext, channels), AV_OPT_TYPE_INT, {.dbl = 0}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM }, 54 { NULL }, 55}; 56 57#define PCMDEF(name_, long_name_, ext, codec) \ 58static const AVClass name_ ## _demuxer_class = { \ 59 .class_name = #name_ " demuxer", \ 60 .item_name = av_default_item_name, \ 61 .option = pcm_options, \ 62 .version = LIBAVUTIL_VERSION_INT, \ 63}; \ 64AVInputFormat ff_pcm_ ## name_ ## _demuxer = { \ 65 .name = #name_, \ 66 .long_name = NULL_IF_CONFIG_SMALL(long_name_), \ 67 .priv_data_size = sizeof(RawAudioDemuxerContext), \ 68 .read_header = ff_raw_read_header, \ 69 .read_packet = raw_read_packet, \ 70 .read_seek = pcm_read_seek, \ 71 .flags = AVFMT_GENERIC_INDEX, \ 72 .extensions = ext, \ 73 .value = codec, \ 74 .priv_class = &name_ ## _demuxer_class, \ 75}; 76 77PCMDEF(f64be, "PCM 64 bit floating-point big-endian format", 78 NULL, CODEC_ID_PCM_F64BE) 79 80PCMDEF(f64le, "PCM 64 bit floating-point little-endian format", 81 NULL, CODEC_ID_PCM_F64LE) 82 83PCMDEF(f32be, "PCM 32 bit floating-point big-endian format", 84 NULL, CODEC_ID_PCM_F32BE) 85 86PCMDEF(f32le, "PCM 32 bit floating-point little-endian format", 87 NULL, CODEC_ID_PCM_F32LE) 88 89PCMDEF(s32be, "PCM signed 32 bit big-endian format", 90 NULL, CODEC_ID_PCM_S32BE) 91 92PCMDEF(s32le, "PCM signed 32 bit little-endian format", 93 NULL, CODEC_ID_PCM_S32LE) 94 95PCMDEF(s24be, "PCM signed 24 bit big-endian format", 96 NULL, CODEC_ID_PCM_S24BE) 97 98PCMDEF(s24le, "PCM signed 24 bit little-endian format", 99 NULL, CODEC_ID_PCM_S24LE) 100 101PCMDEF(s16be, "PCM signed 16 bit big-endian format", 102 AV_NE("sw", NULL), CODEC_ID_PCM_S16BE) 103 104PCMDEF(s16le, "PCM signed 16 bit little-endian format", 105 AV_NE(NULL, "sw"), CODEC_ID_PCM_S16LE) 106 107PCMDEF(s8, "PCM signed 8 bit format", 108 "sb", CODEC_ID_PCM_S8) 109 110PCMDEF(u32be, "PCM unsigned 32 bit big-endian format", 111 NULL, CODEC_ID_PCM_U32BE) 112 113PCMDEF(u32le, "PCM unsigned 32 bit little-endian format", 114 NULL, CODEC_ID_PCM_U32LE) 115 116PCMDEF(u24be, "PCM unsigned 24 bit big-endian format", 117 NULL, CODEC_ID_PCM_U24BE) 118 119PCMDEF(u24le, "PCM unsigned 24 bit little-endian format", 120 NULL, CODEC_ID_PCM_U24LE) 121 122PCMDEF(u16be, "PCM unsigned 16 bit big-endian format", 123 AV_NE("uw", NULL), CODEC_ID_PCM_U16BE) 124 125PCMDEF(u16le, "PCM unsigned 16 bit little-endian format", 126 AV_NE(NULL, "uw"), CODEC_ID_PCM_U16LE) 127 128PCMDEF(u8, "PCM unsigned 8 bit format", 129 "ub", CODEC_ID_PCM_U8) 130 131PCMDEF(alaw, "PCM A-law format", 132 "al", CODEC_ID_PCM_ALAW) 133 134PCMDEF(mulaw, "PCM mu-law format", 135 "ul", CODEC_ID_PCM_MULAW) 136