1 /* 2 * MPEG-4 Parametric Stereo definitions and declarations 3 * Copyright (c) 2010 Alex Converse <alex.converse@gmail.com> 4 * 5 * This file is part of FFmpeg. 6 * 7 * FFmpeg is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * FFmpeg is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with FFmpeg; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 22 #ifndef AVCODEC_AACPS_H 23 #define AVCODEC_AACPS_H 24 25 #include <stdint.h> 26 27 #include "libavutil/mem_internal.h" 28 29 #include "aacpsdsp.h" 30 #include "avcodec.h" 31 #include "get_bits.h" 32 33 #define PS_MAX_NUM_ENV 5 34 #define PS_MAX_NR_IIDICC 34 35 #define PS_MAX_NR_IPDOPD 17 36 #define PS_MAX_SSB 91 37 #define PS_MAX_AP_BANDS 50 38 #define PS_QMF_TIME_SLOTS 32 39 #define PS_MAX_DELAY 14 40 #define PS_AP_LINKS 3 41 #define PS_MAX_AP_DELAY 5 42 #define PS_BASELINE 0 ///< Operate in Baseline PS mode 43 ///< Baseline implies 10 or 20 stereo bands, 44 ///< mixing mode A, and no ipd/opd 45 46 #define numQMFSlots 32 //numTimeSlots * RATE 47 48 typedef struct PSCommonContext { 49 int start; 50 int enable_iid; 51 int iid_quant; 52 int nr_iid_par; 53 int nr_ipdopd_par; 54 int enable_icc; 55 int icc_mode; 56 int nr_icc_par; 57 int enable_ext; 58 int frame_class; 59 int num_env_old; 60 int num_env; 61 int enable_ipdopd; 62 int border_position[PS_MAX_NUM_ENV+1]; 63 int8_t iid_par[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC]; ///< Inter-channel Intensity Difference Parameters 64 int8_t icc_par[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC]; ///< Inter-Channel Coherence Parameters 65 /* ipd/opd is iid/icc sized so that the same functions can handle both */ 66 int8_t ipd_par[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC]; ///< Inter-channel Phase Difference Parameters 67 int8_t opd_par[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC]; ///< Overall Phase Difference Parameters 68 int is34bands; 69 int is34bands_old; 70 } PSCommonContext; 71 72 typedef struct PSContext { 73 PSCommonContext common; 74 75 DECLARE_ALIGNED(16, INTFLOAT, in_buf)[5][44][2]; 76 DECLARE_ALIGNED(16, INTFLOAT, delay)[PS_MAX_SSB][PS_QMF_TIME_SLOTS + PS_MAX_DELAY][2]; 77 DECLARE_ALIGNED(16, INTFLOAT, ap_delay)[PS_MAX_AP_BANDS][PS_AP_LINKS][PS_QMF_TIME_SLOTS + PS_MAX_AP_DELAY][2]; 78 DECLARE_ALIGNED(16, INTFLOAT, peak_decay_nrg)[34]; 79 DECLARE_ALIGNED(16, INTFLOAT, power_smooth)[34]; 80 DECLARE_ALIGNED(16, INTFLOAT, peak_decay_diff_smooth)[34]; 81 DECLARE_ALIGNED(16, INTFLOAT, H11)[2][PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC]; 82 DECLARE_ALIGNED(16, INTFLOAT, H12)[2][PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC]; 83 DECLARE_ALIGNED(16, INTFLOAT, H21)[2][PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC]; 84 DECLARE_ALIGNED(16, INTFLOAT, H22)[2][PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC]; 85 DECLARE_ALIGNED(16, INTFLOAT, Lbuf)[91][32][2]; 86 DECLARE_ALIGNED(16, INTFLOAT, Rbuf)[91][32][2]; 87 int8_t opd_hist[PS_MAX_NR_IIDICC]; 88 int8_t ipd_hist[PS_MAX_NR_IIDICC]; 89 PSDSPContext dsp; 90 } PSContext; 91 92 extern const int8_t ff_k_to_i_20[]; 93 extern const int8_t ff_k_to_i_34[]; 94 95 void ff_ps_init_common(void); 96 void AAC_RENAME(ff_ps_init)(void); 97 void AAC_RENAME(ff_ps_ctx_init)(PSContext *ps); 98 int ff_ps_read_data(AVCodecContext *avctx, GetBitContext *gb, 99 PSCommonContext *ps, int bits_left); 100 int AAC_RENAME(ff_ps_apply)(AVCodecContext *avctx, PSContext *ps, INTFLOAT L[2][38][64], INTFLOAT R[2][38][64], int top); 101 102 #endif /* AVCODEC_AACPS_H */ 103