diff options
Diffstat (limited to 'demux/demux_raw.c')
-rw-r--r-- | demux/demux_raw.c | 61 |
1 files changed, 36 insertions, 25 deletions
diff --git a/demux/demux_raw.c b/demux/demux_raw.c index 552c74a2a3..6faea6e61d 100644 --- a/demux/demux_raw.c +++ b/demux/demux_raw.c @@ -29,7 +29,7 @@ #include "stream/stream.h" #include "demux.h" #include "stheader.h" -#include "audio/format.h" +#include "codec_tags.h" #include "video/img_format.h" #include "video/img_fourcc.h" @@ -40,16 +40,37 @@ struct demux_rawaudio_opts { struct mp_chmap channels; int samplerate; int aformat; - int endian; }; +// Ad-hoc schema to systematically encode the format as int +#define PCM(sign, is_float, bits, is_be) \ + ((sign) | ((is_float) << 1) | ((is_be) << 2) | ((bits) << 3)) +#define NE (BYTE_ORDER == BIG_ENDIAN) + #define OPT_BASE_STRUCT struct demux_rawaudio_opts const struct m_sub_options demux_rawaudio_conf = { .opts = (const m_option_t[]) { OPT_CHMAP("channels", channels, CONF_MIN, .min = 1), OPT_INTRANGE("rate", samplerate, 0, 1000, 8 * 48000), - OPT_AUDIOFORMAT("format", aformat, 0), - OPT_CHOICE("endian", endian, 0, ({"native", 0}, {"le", 1}, {"be", 2})), + OPT_CHOICE("format", aformat, 0, + ({"u8", PCM(0, 0, 8, 0)}, + {"s8", PCM(1, 0, 8, 0)}, + {"u16le", PCM(0, 0, 16, 0)}, {"u16be", PCM(0, 0, 16, 1)}, + {"s16le", PCM(1, 0, 16, 0)}, {"u16be", PCM(1, 0, 16, 1)}, + {"u24le", PCM(0, 0, 24, 0)}, {"u24be", PCM(0, 0, 24, 1)}, + {"s24le", PCM(1, 0, 24, 0)}, {"s24be", PCM(1, 0, 24, 1)}, + {"u32le", PCM(0, 0, 32, 0)}, {"u32be", PCM(0, 0, 32, 1)}, + {"s32le", PCM(1, 0, 32, 0)}, {"s32be", PCM(1, 0, 32, 1)}, + {"floatle", PCM(0, 1, 32, 0)}, {"floatbe", PCM(0, 1, 32, 1)}, + {"doublele",PCM(0, 1, 64, 0)}, {"doublebe", PCM(0, 1, 64, 1)}, + {"u16", PCM(0, 0, 16, NE)}, + {"s16", PCM(1, 0, 16, NE)}, + {"u24", PCM(0, 0, 24, NE)}, + {"s24", PCM(1, 0, 24, NE)}, + {"u32", PCM(0, 0, 32, NE)}, + {"s32", PCM(1, 0, 32, NE)}, + {"float", PCM(0, 1, 32, NE)}, + {"double", PCM(0, 1, 64, NE)})), {0} }, .size = sizeof(struct demux_rawaudio_opts), @@ -57,11 +78,13 @@ const struct m_sub_options demux_rawaudio_conf = { // Note that currently, stream_cdda expects exactly these parameters! .channels = MP_CHMAP_INIT_STEREO, .samplerate = 44100, - .aformat = AF_FORMAT_S16, - .endian = 0, + .aformat = PCM(1, 0, 16, NE), // s16 }, }; +#undef PCM +#undef NE + struct demux_rawvideo_opts { int vformat; int mp_format; @@ -105,32 +128,20 @@ static int demux_rawaudio_open(demuxer_t *demuxer, enum demux_check check) struct demux_rawaudio_opts *opts = demuxer->opts->demux_rawaudio; struct sh_stream *sh; sh_audio_t *sh_audio; - MP_WAVEFORMATEX *w; if (check != DEMUX_CHECK_REQUEST && check != DEMUX_CHECK_FORCE) return -1; - if (AF_FORMAT_IS_SPECIAL(opts->aformat)) - return -1; - sh = new_sh_stream(demuxer, STREAM_AUDIO); sh_audio = sh->audio; - sh->codec = "mp-pcm"; - sh->format = opts->aformat; - sh_audio->wf = w = talloc_zero(sh, MP_WAVEFORMATEX); - w->wFormatTag = 0; sh_audio->channels = opts->channels; - w->nChannels = sh_audio->channels.num; - w->nSamplesPerSec = sh_audio->samplerate = opts->samplerate; - int samplesize = af_fmt2bps(opts->aformat); - w->nAvgBytesPerSec = sh_audio->samplerate * samplesize * w->nChannels; - w->nBlockAlign = w->nChannels * samplesize; - w->wBitsPerSample = 8 * samplesize; - w->cbSize = 0; - int machine_endian = BYTE_ORDER == BIG_ENDIAN ? 2 : 1; - int endian = opts->endian ? opts->endian : machine_endian; - // wav usually implies little endian - sh_audio->big_endian = endian == 2; + sh_audio->force_channels = true; + sh_audio->samplerate = opts->samplerate; + + int f = opts->aformat; + // See PCM(): sign float bits endian + mp_set_pcm_codec(sh, f & 1, f & 2, f >> 3, f & 4); + int samplesize = ((f >> 3) + 7) / 8; struct priv *p = talloc_ptrtype(demuxer, p); demuxer->priv = p; |