summaryrefslogtreecommitdiff
path: root/plugins/demac/libdemac/decoder.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/demac/libdemac/decoder.c')
-rw-r--r--plugins/demac/libdemac/decoder.c192
1 files changed, 0 insertions, 192 deletions
diff --git a/plugins/demac/libdemac/decoder.c b/plugins/demac/libdemac/decoder.c
deleted file mode 100644
index f6826fca..00000000
--- a/plugins/demac/libdemac/decoder.c
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
-
-libdemac - A Monkey's Audio decoder
-
-$Id: decoder.c 19552 2008-12-21 23:49:02Z amiconn $
-
-Copyright (C) Dave Chapman 2007
-
-This program 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.
-
-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 General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
-
-*/
-#include <inttypes.h>
-#include <string.h>
-
-#include "demac.h"
-#include "predictor.h"
-#include "entropy.h"
-#include "filter.h"
-#include "demac_config.h"
-
-/* Statically allocate the filter buffers */
-
-static filter_int filterbuf32[(32*3 + FILTER_HISTORY_SIZE) * 2]
- IBSS_ATTR __attribute__((aligned(16))); /* 2432/4864 bytes */
-static filter_int filterbuf256[(256*3 + FILTER_HISTORY_SIZE) * 2]
- IBSS_ATTR __attribute__((aligned(16))); /* 5120/10240 bytes */
-
-/* This is only needed for "insane" files, and no current Rockbox targets
- can hope to decode them in realtime, although the Gigabeat S comes close. */
-static filter_int filterbuf1280[(1280*3 + FILTER_HISTORY_SIZE) * 2]
- IBSS_ATTR_DEMAC_INSANEBUF __attribute__((aligned(16)));
- /* 17408 or 34816 bytes */
-
-void init_frame_decoder(struct ape_ctx_t* ape_ctx,
- unsigned char* inbuffer, int* firstbyte,
- int* bytesconsumed)
-{
- init_entropy_decoder(ape_ctx, inbuffer, firstbyte, bytesconsumed);
- //printf("CRC=0x%08x\n",ape_ctx->CRC);
- //printf("Flags=0x%08x\n",ape_ctx->frameflags);
-
- init_predictor_decoder(&ape_ctx->predictor);
-
- switch (ape_ctx->compressiontype)
- {
- case 2000:
- init_filter_16_11(filterbuf32);
- break;
-
- case 3000:
- init_filter_64_11(filterbuf256);
- break;
-
- case 4000:
- init_filter_256_13(filterbuf256);
- init_filter_32_10(filterbuf32);
- break;
-
- case 5000:
- init_filter_1280_15(filterbuf1280);
- init_filter_256_13(filterbuf256);
- init_filter_16_11(filterbuf32);
- }
-}
-
-int ICODE_ATTR_DEMAC decode_chunk(struct ape_ctx_t* ape_ctx,
- unsigned char* inbuffer, int* firstbyte,
- int* bytesconsumed,
- int32_t* decoded0, int32_t* decoded1,
- int count)
-{
- int32_t left, right;
-#ifdef ROCKBOX
- int scale = (APE_OUTPUT_DEPTH - ape_ctx->bps);
- #define SCALE(x) ((x) << scale)
-#else
- #define SCALE(x) (x)
-#endif
-
- if ((ape_ctx->channels==1) || ((ape_ctx->frameflags
- & (APE_FRAMECODE_PSEUDO_STEREO|APE_FRAMECODE_STEREO_SILENCE))
- == APE_FRAMECODE_PSEUDO_STEREO)) {
-
- entropy_decode(ape_ctx, inbuffer, firstbyte, bytesconsumed,
- decoded0, NULL, count);
-
- if (ape_ctx->frameflags & APE_FRAMECODE_MONO_SILENCE) {
- /* We are pure silence, so we're done. */
- return 0;
- }
-
- switch (ape_ctx->compressiontype)
- {
- case 2000:
- apply_filter_16_11(ape_ctx->fileversion,decoded0,NULL,count);
- break;
-
- case 3000:
- apply_filter_64_11(ape_ctx->fileversion,decoded0,NULL,count);
- break;
-
- case 4000:
- apply_filter_32_10(ape_ctx->fileversion,decoded0,NULL,count);
- apply_filter_256_13(ape_ctx->fileversion,decoded0,NULL,count);
- break;
-
- case 5000:
- apply_filter_16_11(ape_ctx->fileversion,decoded0,NULL,count);
- apply_filter_256_13(ape_ctx->fileversion,decoded0,NULL,count);
- apply_filter_1280_15(ape_ctx->fileversion,decoded0,NULL,count);
- }
-
- /* Now apply the predictor decoding */
- predictor_decode_mono(&ape_ctx->predictor,decoded0,count);
-
- if (ape_ctx->channels==2) {
- /* Pseudo-stereo - copy left channel to right channel */
- while (count--)
- {
- left = *decoded0;
- *(decoded1++) = *(decoded0++) = SCALE(left);
- }
- }
-#ifdef ROCKBOX
- else {
- /* Scale to output depth */
- while (count--)
- {
- left = *decoded0;
- *(decoded0++) = SCALE(left);
- }
- }
-#endif
- } else { /* Stereo */
- entropy_decode(ape_ctx, inbuffer, firstbyte, bytesconsumed,
- decoded0, decoded1, count);
-
- if ((ape_ctx->frameflags & APE_FRAMECODE_STEREO_SILENCE)
- == APE_FRAMECODE_STEREO_SILENCE) {
- /* We are pure silence, so we're done. */
- return 0;
- }
-
- /* Apply filters - compression type 1000 doesn't have any */
- switch (ape_ctx->compressiontype)
- {
- case 2000:
- apply_filter_16_11(ape_ctx->fileversion,decoded0,decoded1,count);
- break;
-
- case 3000:
- apply_filter_64_11(ape_ctx->fileversion,decoded0,decoded1,count);
- break;
-
- case 4000:
- apply_filter_32_10(ape_ctx->fileversion,decoded0,decoded1,count);
- apply_filter_256_13(ape_ctx->fileversion,decoded0,decoded1,count);
- break;
-
- case 5000:
- apply_filter_16_11(ape_ctx->fileversion,decoded0,decoded1,count);
- apply_filter_256_13(ape_ctx->fileversion,decoded0,decoded1,count);
- apply_filter_1280_15(ape_ctx->fileversion,decoded0,decoded1,count);
- }
-
- /* Now apply the predictor decoding */
- predictor_decode_stereo(&ape_ctx->predictor,decoded0,decoded1,count);
-
- /* Decorrelate and scale to output depth */
- while (count--)
- {
- left = *decoded1 - (*decoded0 / 2);
- right = left + *decoded0;
-
- *(decoded0++) = SCALE(left);
- *(decoded1++) = SCALE(right);
- }
- }
- return 0;
-}