Files
itgmania212121/bundle/ffmpeg/libavcodec/dcadec.c
T

2522 lines
94 KiB
C

/*
* DCA compatible decoder
* Copyright (C) 2004 Gildas Bazin
* Copyright (C) 2004 Benjamin Zores
* Copyright (C) 2006 Benjamin Larsson
* Copyright (C) 2007 Konstantin Shishkov
*
* This file is part of FFmpeg.
*
* FFmpeg 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.
*
* FFmpeg 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 FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <math.h>
#include <stddef.h>
#include <stdio.h>
#include "libavutil/channel_layout.h"
#include "libavutil/common.h"
#include "libavutil/float_dsp.h"
#include "libavutil/internal.h"
#include "libavutil/intreadwrite.h"
#include "libavutil/mathematics.h"
#include "libavutil/samplefmt.h"
#include "avcodec.h"
#include "fft.h"
#include "get_bits.h"
#include "dcadata.h"
#include "dcahuff.h"
#include "dca.h"
#include "mathops.h"
#include "synth_filter.h"
#include "dcadsp.h"
#include "fmtconvert.h"
#include "internal.h"
#if ARCH_ARM
# include "arm/dca.h"
#endif
//#define TRACE
#define DCA_PRIM_CHANNELS_MAX (7)
#define DCA_SUBBANDS (64)
#define DCA_ABITS_MAX (32) /* Should be 28 */
#define DCA_SUBSUBFRAMES_MAX (4)
#define DCA_SUBFRAMES_MAX (16)
#define DCA_BLOCKS_MAX (16)
#define DCA_LFE_MAX (3)
#define DCA_CHSETS_MAX (4)
#define DCA_CHSET_CHANS_MAX (8)
enum DCAMode {
DCA_MONO = 0,
DCA_CHANNEL,
DCA_STEREO,
DCA_STEREO_SUMDIFF,
DCA_STEREO_TOTAL,
DCA_3F,
DCA_2F1R,
DCA_3F1R,
DCA_2F2R,
DCA_3F2R,
DCA_4F2R
};
/* these are unconfirmed but should be mostly correct */
enum DCAExSSSpeakerMask {
DCA_EXSS_FRONT_CENTER = 0x0001,
DCA_EXSS_FRONT_LEFT_RIGHT = 0x0002,
DCA_EXSS_SIDE_REAR_LEFT_RIGHT = 0x0004,
DCA_EXSS_LFE = 0x0008,
DCA_EXSS_REAR_CENTER = 0x0010,
DCA_EXSS_FRONT_HIGH_LEFT_RIGHT = 0x0020,
DCA_EXSS_REAR_LEFT_RIGHT = 0x0040,
DCA_EXSS_FRONT_HIGH_CENTER = 0x0080,
DCA_EXSS_OVERHEAD = 0x0100,
DCA_EXSS_CENTER_LEFT_RIGHT = 0x0200,
DCA_EXSS_WIDE_LEFT_RIGHT = 0x0400,
DCA_EXSS_SIDE_LEFT_RIGHT = 0x0800,
DCA_EXSS_LFE2 = 0x1000,
DCA_EXSS_SIDE_HIGH_LEFT_RIGHT = 0x2000,
DCA_EXSS_REAR_HIGH_CENTER = 0x4000,
DCA_EXSS_REAR_HIGH_LEFT_RIGHT = 0x8000,
};
enum DCAXxchSpeakerMask {
DCA_XXCH_FRONT_CENTER = 0x0000001,
DCA_XXCH_FRONT_LEFT = 0x0000002,
DCA_XXCH_FRONT_RIGHT = 0x0000004,
DCA_XXCH_SIDE_REAR_LEFT = 0x0000008,
DCA_XXCH_SIDE_REAR_RIGHT = 0x0000010,
DCA_XXCH_LFE1 = 0x0000020,
DCA_XXCH_REAR_CENTER = 0x0000040,
DCA_XXCH_SURROUND_REAR_LEFT = 0x0000080,
DCA_XXCH_SURROUND_REAR_RIGHT = 0x0000100,
DCA_XXCH_SIDE_SURROUND_LEFT = 0x0000200,
DCA_XXCH_SIDE_SURROUND_RIGHT = 0x0000400,
DCA_XXCH_FRONT_CENTER_LEFT = 0x0000800,
DCA_XXCH_FRONT_CENTER_RIGHT = 0x0001000,
DCA_XXCH_FRONT_HIGH_LEFT = 0x0002000,
DCA_XXCH_FRONT_HIGH_CENTER = 0x0004000,
DCA_XXCH_FRONT_HIGH_RIGHT = 0x0008000,
DCA_XXCH_LFE2 = 0x0010000,
DCA_XXCH_SIDE_FRONT_LEFT = 0x0020000,
DCA_XXCH_SIDE_FRONT_RIGHT = 0x0040000,
DCA_XXCH_OVERHEAD = 0x0080000,
DCA_XXCH_SIDE_HIGH_LEFT = 0x0100000,
DCA_XXCH_SIDE_HIGH_RIGHT = 0x0200000,
DCA_XXCH_REAR_HIGH_CENTER = 0x0400000,
DCA_XXCH_REAR_HIGH_LEFT = 0x0800000,
DCA_XXCH_REAR_HIGH_RIGHT = 0x1000000,
DCA_XXCH_REAR_LOW_CENTER = 0x2000000,
DCA_XXCH_REAR_LOW_LEFT = 0x4000000,
DCA_XXCH_REAR_LOW_RIGHT = 0x8000000,
};