2522 lines
94 KiB
C
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,
|
|
};
|
|