From cb0b0d99a4ab04905f59ec1a9fcbf90635105d11 Mon Sep 17 00:00:00 2001 From: Stefano Pigozzi Date: Sat, 3 Nov 2012 14:06:53 +0100 Subject: [PATCH] ad_lavc: use fmt-conversion to map sample formats --- Makefile | 1 + audio/decode/ad_lavc.c | 24 ++++------------ audio/fmt-conversion.c | 64 ++++++++++++++++++++++++++++++++++++++++++ audio/fmt-conversion.h | 25 +++++++++++++++++ 4 files changed, 96 insertions(+), 18 deletions(-) create mode 100644 audio/fmt-conversion.c create mode 100644 audio/fmt-conversion.h diff --git a/Makefile b/Makefile index 6cd62d1bf3..978332852f 100644 --- a/Makefile +++ b/Makefile @@ -122,6 +122,7 @@ ifeq ($(HAVE_AVUTIL_REFCOUNTING),no) endif SOURCES = talloc.c \ + audio/fmt-conversion.c \ audio/format.c \ audio/mixer.c \ audio/reorder_ch.c \ diff --git a/audio/decode/ad_lavc.c b/audio/decode/ad_lavc.c index 382d4eacc5..b7dec6bc71 100644 --- a/audio/decode/ad_lavc.c +++ b/audio/decode/ad_lavc.c @@ -35,6 +35,7 @@ #include "ad_internal.h" #include "audio/reorder_ch.h" +#include "audio/fmt-conversion.h" #include "compat/mpbswap.h" #include "compat/libav.h" @@ -144,17 +145,8 @@ static int preinit(sh_audio_t *sh) static int setup_format(sh_audio_t *sh_audio, const AVCodecContext *lavc_context) { - int sample_format = sh_audio->sample_format; - switch (av_get_packed_sample_fmt(lavc_context->sample_fmt)) { - case AV_SAMPLE_FMT_U8: sample_format = AF_FORMAT_U8; break; - case AV_SAMPLE_FMT_S16: sample_format = AF_FORMAT_S16_NE; break; - case AV_SAMPLE_FMT_S32: sample_format = AF_FORMAT_S32_NE; break; - case AV_SAMPLE_FMT_FLT: sample_format = AF_FORMAT_FLOAT_NE; break; - default: - mp_msg(MSGT_DECAUDIO, MSGL_FATAL, "Unsupported sample format\n"); - sample_format = AF_FORMAT_UNKNOWN; - } - + int sample_format = + af_from_avformat(av_get_packed_sample_fmt(lavc_context->sample_fmt)); bool broken_srate = false; int samplerate = lavc_context->sample_rate; int container_samplerate = sh_audio->container_out_samplerate; @@ -279,13 +271,9 @@ static int init(sh_audio_t *sh_audio, const char *decoder) if (sh_audio->wf && sh_audio->wf->nAvgBytesPerSec) sh_audio->i_bps = sh_audio->wf->nAvgBytesPerSec; - switch (av_get_packed_sample_fmt(lavc_context->sample_fmt)) { - case AV_SAMPLE_FMT_U8: - case AV_SAMPLE_FMT_S16: - case AV_SAMPLE_FMT_S32: - case AV_SAMPLE_FMT_FLT: - break; - default: + int af_sample_fmt = + af_from_avformat(av_get_packed_sample_fmt(lavc_context->sample_fmt)); + if (af_sample_fmt == AF_FORMAT_UNKNOWN) { uninit(sh_audio); return 0; } diff --git a/audio/fmt-conversion.c b/audio/fmt-conversion.c new file mode 100644 index 0000000000..58943d3b4b --- /dev/null +++ b/audio/fmt-conversion.c @@ -0,0 +1,64 @@ +/* + * This file is part of MPlayer. + * + * MPlayer is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * MPlayer is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with MPlayer; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "core/mp_msg.h" +#include +#include +#include "format.h" +#include "fmt-conversion.h" + +static const struct { + enum AVSampleFormat sample_fmt; + int fmt; +} audio_conversion_map[] = { + {AV_SAMPLE_FMT_U8, AF_FORMAT_U8}, + {AV_SAMPLE_FMT_S16, AF_FORMAT_S16_NE}, + {AV_SAMPLE_FMT_S32, AF_FORMAT_S32_NE}, + {AV_SAMPLE_FMT_FLT, AF_FORMAT_FLOAT_NE}, + + {AV_SAMPLE_FMT_NONE, 0}, +}; + +enum AVSampleFormat af_to_avformat(int fmt) +{ + int i; + enum AVSampleFormat sample_fmt; + for (i = 0; audio_conversion_map[i].fmt; i++) + if (audio_conversion_map[i].fmt == fmt) + break; + sample_fmt = audio_conversion_map[i].sample_fmt; + if (sample_fmt == AF_FORMAT_UNKNOWN) + mp_msg(MSGT_GLOBAL, MSGL_V, "Unsupported sample format: %s\n", + af_fmt2str_short(fmt)); + return sample_fmt; +} + +int af_from_avformat(enum AVSampleFormat sample_fmt) +{ + int i; + for (i = 0; audio_conversion_map[i].fmt; i++) + if (audio_conversion_map[i].sample_fmt == sample_fmt) + break; + int fmt = audio_conversion_map[i].fmt; + if (!fmt) { + const char *fmtname = av_get_sample_fmt_name(sample_fmt); + mp_msg(MSGT_GLOBAL, MSGL_ERR, "Unsupported AVSampleFormat %s (%d)\n", + fmtname ? fmtname : "INVALID", sample_fmt); + } + return fmt; +} diff --git a/audio/fmt-conversion.h b/audio/fmt-conversion.h new file mode 100644 index 0000000000..7f2739f86f --- /dev/null +++ b/audio/fmt-conversion.h @@ -0,0 +1,25 @@ +/* + * This file is part of MPlayer. + * + * MPlayer is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * MPlayer is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with MPlayer; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef MPLAYER_SAMPLE_FMT_CONVERSION_H +#define MPLAYER_SAMPLE_FMT_CONVERSION_H + +enum AVSampleFormat af_to_avformat(int fmt); +int af_from_avformat(enum AVSampleFormat sample_fmt); + +#endif /* MPLAYER_SAMPLE_FMT_CONVERSION_H */