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_PS_H 23#define AVCODEC_PS_H 24 25#include <stdint.h> 26 27#include "aacpsdsp.h" 28#include "avcodec.h" 29#include "get_bits.h" 30 31#define PS_MAX_NUM_ENV 5 32#define PS_MAX_NR_IIDICC 34 33#define PS_MAX_NR_IPDOPD 17 34#define PS_MAX_SSB 91 35#define PS_MAX_AP_BANDS 50 36#define PS_QMF_TIME_SLOTS 32 37#define PS_MAX_DELAY 14 38#define PS_AP_LINKS 3 39#define PS_MAX_AP_DELAY 5 40 41typedef struct PSContext { 42 int start; 43 int enable_iid; 44 int iid_quant; 45 int nr_iid_par; 46 int nr_ipdopd_par; 47 int enable_icc; 48 int icc_mode; 49 int nr_icc_par; 50 int enable_ext; 51 int frame_class; 52 int num_env_old; 53 int num_env; 54 int enable_ipdopd; 55 int border_position[PS_MAX_NUM_ENV+1]; 56 int8_t iid_par[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC]; ///< Inter-channel Intensity Difference Parameters 57 int8_t icc_par[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC]; ///< Inter-Channel Coherence Parameters 58 /* ipd/opd is iid/icc sized so that the same functions can handle both */ 59 int8_t ipd_par[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC]; ///< Inter-channel Phase Difference Parameters 60 int8_t opd_par[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC]; ///< Overall Phase Difference Parameters 61 int is34bands; 62 int is34bands_old; 63 64 DECLARE_ALIGNED(16, float, in_buf)[5][44][2]; 65 DECLARE_ALIGNED(16, float, delay)[PS_MAX_SSB][PS_QMF_TIME_SLOTS + PS_MAX_DELAY][2]; 66 DECLARE_ALIGNED(16, float, ap_delay)[PS_MAX_AP_BANDS][PS_AP_LINKS][PS_QMF_TIME_SLOTS + PS_MAX_AP_DELAY][2]; 67 DECLARE_ALIGNED(16, float, peak_decay_nrg)[34]; 68 DECLARE_ALIGNED(16, float, power_smooth)[34]; 69 DECLARE_ALIGNED(16, float, peak_decay_diff_smooth)[34]; 70 DECLARE_ALIGNED(16, float, H11)[2][PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC]; 71 DECLARE_ALIGNED(16, float, H12)[2][PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC]; 72 DECLARE_ALIGNED(16, float, H21)[2][PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC]; 73 DECLARE_ALIGNED(16, float, H22)[2][PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC]; 74 int8_t opd_hist[PS_MAX_NR_IIDICC]; 75 int8_t ipd_hist[PS_MAX_NR_IIDICC]; 76 PSDSPContext dsp; 77} PSContext; 78 79void ff_ps_init(void); 80void ff_ps_ctx_init(PSContext *ps); 81int ff_ps_read_data(AVCodecContext *avctx, GetBitContext *gb, PSContext *ps, int bits_left); 82int ff_ps_apply(AVCodecContext *avctx, PSContext *ps, float L[2][38][64], float R[2][38][64], int top); 83 84#endif /* AVCODEC_PS_H */ 85