/*
 * Copyright (C) 2016 foo86
 *
 * 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
 */

#ifndef AVCODEC_DCA_XLL_H
#define AVCODEC_DCA_XLL_H

#include "libavutil/common.h"
#include "libavutil/mem.h"

#include "avcodec.h"
#include "internal.h"
#include "get_bits.h"
#include "dca.h"
#include "dcadsp.h"
#include "dca_exss.h"

#define DCA_XLL_CHSETS_MAX              3
#define DCA_XLL_CHANNELS_MAX            8
#define DCA_XLL_BANDS_MAX               2
#define DCA_XLL_ADAPT_PRED_ORDER_MAX    16
#define DCA_XLL_DECI_HISTORY_MAX        8
#define DCA_XLL_DMIX_SCALES_MAX         ((DCA_XLL_CHSETS_MAX - 1) * DCA_XLL_CHANNELS_MAX)
#define DCA_XLL_DMIX_COEFFS_MAX         (DCA_XLL_DMIX_SCALES_MAX * DCA_XLL_CHANNELS_MAX)
#define DCA_XLL_PBR_BUFFER_MAX          (240 << 10)
#define DCA_XLL_SAMPLE_BUFFERS_MAX      3

typedef struct DCAXllBand {
    int     decor_enabled;                          ///< Pairwise channel decorrelation flag
    int     orig_order[DCA_XLL_CHANNELS_MAX];       ///< Original channel order
    int     decor_coeff[DCA_XLL_CHANNELS_MAX / 2];  ///< Pairwise channel coefficients

    int     adapt_pred_order[DCA_XLL_CHANNELS_MAX]; ///< Adaptive predictor order
    int     highest_pred_order;                     ///< Highest adaptive predictor order
    int     fixed_pred_order[DCA_XLL_CHANNELS_MAX]; ///< Fixed predictor order
    int     adapt_refl_coeff[DCA_XLL_CHANNELS_MAX][DCA_XLL_ADAPT_PRED_ORDER_MAX];   ///< Adaptive predictor reflection coefficients

    int     dmix_embedded;  ///< Downmix performed by encoder in frequency band

    int     lsb_section_size;                       ///< Size of LSB section in any segment
    int     nscalablelsbs[DCA_XLL_CHANNELS_MAX];    ///< Number of bits to represent the samples in LSB part
    int     bit_width_adjust[DCA_XLL_CHANNELS_MAX]; ///< Number of bits discarded by authoring

    int32_t *msb_sample_buffer[DCA_XLL_CHANNELS_MAX];   ///< MSB sample buffer pointers
    int32_t *lsb_sample_buffer[DCA_XLL_CHANNELS_MAX];   ///< LSB sample buffer pointers or NULL
} DCAXllBand;

typedef struct DCAXllChSet {
    // Channel set header
    int     nchannels;          ///< Number of channels in the channel set (N)
    int     residual_encode;    ///< Residual encoding mask (0 - residual, 1 - full channel)
    int     pcm_bit_res;        ///< PCM bit resolution (variable)
    int     storage_bit_res;    ///< Storage bit resolution (16 or 24)
    int     freq;               ///< Original sampling frequency (max. 96000 Hz)

    int     primary_chset;          ///< Primary channel set flag
    int     dmix_coeffs_present;    ///< Downmix coefficients present in stream
    int     dmix_embedded;          ///< Downmix already performed by encoder
    int     dmix_type;              ///< Primary channel set downmix type
    int     hier_chset;             ///< Whether the channel set is part of a hierarchy
    int     hier_ofs;               ///< Number of preceding channels in a hierarchy (M)
    int     dmix_coeff[DCA_XLL_DMIX_COEFFS_MAX];       ///< Downmixing coefficients
    int     dmix_scale[DCA_XLL_DMIX_SCALES_MAX];       ///< Downmixing scales
    int     dmix_scale_inv[DCA_XLL_DMIX_SCALES_MAX];   ///< Inverse downmixing scales
    int     ch_mask;                ///< Channel mask for set
    int     ch_remap[DCA_XLL_CHANNELS_MAX];    ///< Channel to speaker map

    int     nfreqbands; ///< Number of frequency bands (1 or 2)
    int     nabits;     ///< Number of bits to read bit allocation coding parameter

    DCAXllBand     bands[DCA_XLL_BANDS_MAX];   ///< Frequency bands

    // Frequency band coding parameters
    int     seg_common;                                     ///< Segment type
    int     rice_code_flag[DCA_XLL_CHANNELS_MAX];           ///< Rice coding flag
    int     bitalloc_hybrid_linear[DCA_XLL_CHANNELS_MAX];   ///< Binary code length for isolated samples
    int     bitalloc_part_a[DCA_XLL_CHANNELS_MAX];          ///< Coding parameter for part A of segment
    int     bitalloc_part_b[DCA_XLL_CHANNELS_MAX];          ///< Coding parameter for part B of segment
    int     nsamples_part_a[DCA_XLL_CHANNELS_MAX];          ///< Number of samples in part A of segment

    // Decimator history
    DECLARE_ALIGNED(32, int32_t, deci_history)[DCA_XLL_CHANNELS_MAX][DCA_XLL_DECI_HISTORY_MAX]; ///< Decimator history for frequency band 1

    // Sample buffers
    unsigned int    sample_size[DCA_XLL_SAMPLE_BUFFERS_MAX];
    int32_t         *sample_buffer[DCA_XLL_SAMPLE_BUFFERS_MAX];
} DCAXllChSet;

typedef struct DCAXllDecoder {
    AVCodecContext  *avctx;
    GetBitContext   gb;

    int     frame_size;             ///< Number of bytes in a lossless frame
    int     nchsets;                ///< Number of channels sets per frame
    int     nframesegs;             ///< Number of segments per frame
    int     nsegsamples_log2;       ///< log2(nsegsamples)
    int     nsegsamples;            ///< Samples in segment per one frequency band
    int     nframesamples_log2;     ///< log2(nframesamples)
    int     nframesamples;          ///< Samples in frame per one frequency band
    int     seg_size_nbits;         ///< Number of bits used to read segment size
    int     band_crc_present;       ///< Presence of CRC16 within each frequency band
    int     scalable_lsbs;          ///< MSB/LSB split flag
    int     ch_mask_nbits;          ///< Number of bits used to read channel mask
    int     fixed_lsb_width;        ///< Fixed LSB width

    DCAXllChSet    chset[DCA_XLL_CHSETS_MAX]; ///< Channel sets

    int             *navi;          ///< NAVI table
    unsigned int    navi_size;

    int     nfreqbands;     ///< Highest number of frequency bands
    int     nchannels;      ///< Total number of channels in a hierarchy
    int     nreschsets;     ///< Number of channel sets that have residual encoded channels
    int     nactivechsets;  ///< Number of active channel sets to decode

    int     hd_stream_id;   ///< Previous DTS-HD stream ID for detecting changes

    uint8_t     *pbr_buffer;        ///< Peak bit rate (PBR) smoothing buffer
    int         pbr_length;         ///< Length in bytes of data currently buffered
    int         pbr_delay;          ///< Delay in frames before decoding buffered data

    DCADSPContext   *dcadsp;

    int     output_mask;
    int32_t *output_samples[DCA_SPEAKER_COUNT];
} DCAXllDecoder;

int ff_dca_xll_parse(DCAXllDecoder *s, uint8_t *data, DCAExssAsset *asset);
int ff_dca_xll_filter_frame(DCAXllDecoder *s, AVFrame *frame);
av_cold void ff_dca_xll_flush(DCAXllDecoder *s);
av_cold void ff_dca_xll_close(DCAXllDecoder *s);

#endif
