[vlc-commits] endian: endian conversion code from format
Rémi Denis-Courmont
git at videolan.org
Thu Nov 15 22:25:48 CET 2012
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Thu Nov 15 23:18:27 2012 +0200| [59987d76ce45ac7e2d01a219ebe98440648850a6] | committer: Rémi Denis-Courmont
endian: endian conversion code from format
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=59987d76ce45ac7e2d01a219ebe98440648850a6
---
modules/audio_filter/Modules.am | 2 +
modules/audio_filter/converter/endian.c | 146 +++++++++++++++++++++++++++++++
2 files changed, 148 insertions(+)
diff --git a/modules/audio_filter/Modules.am b/modules/audio_filter/Modules.am
index da4626c..c6d064c 100644
--- a/modules/audio_filter/Modules.am
+++ b/modules/audio_filter/Modules.am
@@ -51,10 +51,12 @@ SOURCES_a52tofloat32 = converter/a52tofloat32.c
SOURCES_dtstospdif = converter/dtstospdif.c
SOURCES_dtstofloat32 = converter/dtstofloat32.c
SOURCES_mpgatofixed32 = converter/mpgatofixed32.c
+SOURCES_audio_endian = converter/endian.c
SOURCES_audio_format = converter/format.c
libvlc_LTLIBRARIES += \
liba52tospdif_plugin.la \
+ libaudio_endian_plugin.la \
libaudio_format_plugin.la \
libdtstospdif_plugin.la
diff --git a/modules/audio_filter/converter/endian.c b/modules/audio_filter/converter/endian.c
new file mode 100644
index 0000000..72c68e4
--- /dev/null
+++ b/modules/audio_filter/converter/endian.c
@@ -0,0 +1,146 @@
+/*****************************************************************************
+ * endian.c : PCM endian converter
+ *****************************************************************************
+ * Copyright (C) 2002-2005 VLC authors and VideoLAN
+ * Copyright (C) 2010 Laurent Aimar
+ * Copyright (C) 2012 Rémi Denis-Courmont
+ *
+ * Authors: Christophe Massiot <massiot at via.ecp.fr>
+ * Gildas Bazin <gbazin at videolan.org>
+ * Laurent Aimar <fenrir _AT_ videolan _DOT_ org>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <vlc_common.h>
+#include <vlc_plugin.h>
+#include <vlc_aout.h>
+#include <vlc_block.h>
+#include <vlc_filter.h>
+
+static int Open(vlc_object_t *);
+
+vlc_module_begin()
+ set_description(N_("Audio filter for endian conversion"))
+ set_category(CAT_AUDIO)
+ set_subcategory(SUBCAT_AUDIO_MISC)
+ set_capability("audio converter", 2)
+ set_callbacks(Open, NULL)
+vlc_module_end()
+
+static block_t *Filter16(filter_t *filter, block_t *block)
+{
+ uint16_t *data = (uint16_t *)block->p_buffer;
+
+ for (size_t i = 0; i < block->i_buffer / 2; i++)
+ data[i] = bswap16 (data[i]);
+
+ (void) filter;
+ return block;
+}
+
+static block_t *Filter24(filter_t *filter, block_t *block)
+{
+ uint8_t *data = (uint8_t *)block->p_buffer;
+
+ for (size_t i = 0; i < block->i_buffer; i += 3) {
+ uint8_t buf = data[i];
+ data[i] = data[i + 2];
+ data[i + 2] = buf;
+ }
+
+ (void) filter;
+ return block;
+}
+
+static block_t *Filter32(filter_t *filter, block_t *block)
+{
+ uint32_t *data = (uint32_t *)block->p_buffer;
+
+ for (size_t i = 0; i < block->i_buffer / 4; i++)
+ data[i] = bswap32 (data[i]);
+
+ (void) filter;
+ return block;
+}
+
+static block_t *Filter64(filter_t *filter, block_t *block)
+{
+ uint64_t *data = (uint64_t *)block->p_buffer;
+
+ for (size_t i = 0; i < block->i_buffer / 8; i++)
+ data[i] = bswap64 (data[i]);
+
+ (void) filter;
+ return block;
+}
+
+static const vlc_fourcc_t list[][2] = {
+ { VLC_CODEC_F64B, VLC_CODEC_F64L },
+ { VLC_CODEC_F32B, VLC_CODEC_F32L },
+ { VLC_CODEC_S16B, VLC_CODEC_S16L },
+ { VLC_CODEC_S24B, VLC_CODEC_S24L },
+ { VLC_CODEC_S32B, VLC_CODEC_S32L },
+ { VLC_CODEC_S16B, VLC_CODEC_S16L },
+ { VLC_CODEC_S24B, VLC_CODEC_S24L },
+ { VLC_CODEC_S32B, VLC_CODEC_S32L },
+};
+
+static int Open(vlc_object_t *object)
+{
+ filter_t *filter = (filter_t *)object;
+
+ const audio_sample_format_t *src = &filter->fmt_in.audio;
+ const audio_sample_format_t *dst = &filter->fmt_out.audio;
+
+ if (!AOUT_FMTS_SIMILAR(src, dst))
+ return VLC_EGENERIC;
+
+ for (size_t i = 0; i < sizeof (list) / sizeof (list[0]); i++) {
+ if (src->i_format == list[i][0]) {
+ if (dst->i_format != list[i][1])
+ goto ok;
+ break;
+ }
+ if (src->i_format == list[i][1]) {
+ if (dst->i_format == list[i][0])
+ goto ok;
+ break;
+ }
+ }
+ return VLC_EGENERIC;
+
+ok:
+ switch (src->i_bitspersample) {
+ case 16:
+ filter->pf_audio_filter = Filter16;
+ break;
+ case 24:
+ filter->pf_audio_filter = Filter24;
+ break;
+ case 32:
+ filter->pf_audio_filter = Filter32;
+ break;
+ case 64:
+ filter->pf_audio_filter = Filter64;
+ break;
+ }
+
+ return VLC_SUCCESS;
+}
More information about the vlc-commits
mailing list