/*
 * Copyright (c) 2015 Kieran Kunhya
 *
 * 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_CFHD_H
#define AVCODEC_CFHD_H

#include <stdint.h>

#include "libavutil/avassert.h"

#include "avcodec.h"
#include "bytestream.h"
#include "get_bits.h"
#include "vlc.h"
#include "cfhddsp.h"

enum CFHDParam {
    SampleType       =   1,
    SampleIndexTable =   2,
    BitstreamMarker  =   4,
    VersionMajor     =   5,
    VersionMinor     =   6,
    VersionRevision  =   7,
    VersionEdit      =   8,
    TransformType    =  10,
    NumFrames        =  11,
    ChannelCount     =  12,
    WaveletCount     =  13,
    SubbandCount     =  14,
    NumSpatial       =  15,
    FirstWavelet     =  16,
    GroupTrailer     =  18,
    FrameType        =  19,
    ImageWidth       =  20,
    ImageHeight      =  21,
    FrameIndex       =  23,
    LowpassSubband   =  25,
    NumLevels        =  26,
    LowpassWidth     =  27,
    LowpassHeight    =  28,
    PixelOffset      =  33,
    LowpassQuantization=34,
    LowpassPrecision =  35,
    WaveletType      =  37,
    WaveletNumber    =  38,
    WaveletLevel     =  39,
    NumBands         =  40,
    HighpassWidth    =  41,
    HighpassHeight   =  42,
    LowpassBorder    =  43,
    HighpassBorder   =  44,
    LowpassScale     =  45,
    LowpassDivisor   =  46,
    SubbandNumber    =  48,
    BandWidth        =  49,
    BandHeight       =  50,
    SubbandBand      =  51,
    BandEncoding     =  52,
    Quantization     =  53,
    BandScale        =  54,
    BandHeader       =  55,
    BandTrailer      =  56,
    ChannelNumber    =  62,
    SampleFlags      =  68,
    FrameNumber      =  69,
    Precision        =  70,
    InputFormat      =  71,
    BandCodingFlags  =  72,
    PeakLevel        =  74,
    PeakOffsetLow    =  75,
    PeakOffsetHigh   =  76,
    Version          =  79,
    BandSecondPass   =  82,
    PrescaleTable    =  83,
    EncodedFormat    =  84,
    DisplayHeight    =  85,
    ChannelWidth     = 104,
    ChannelHeight    = 105,
};

#define VLC_BITS       9
#define SUBBAND_COUNT 10
#define SUBBAND_COUNT_3D 17

typedef struct CFHD_RL_VLC_ELEM {
    int16_t level;
    int8_t len;
    uint16_t run;
} CFHD_RL_VLC_ELEM;

#define DWT_LEVELS 3
#define DWT_LEVELS_3D 6

typedef struct SubBand {
    ptrdiff_t stride;
    int a_width;
    int width;
    int a_height;
    int height;
} SubBand;

typedef struct Plane {
    int width;
    int height;
    ptrdiff_t stride;

    int16_t *idwt_buf;
    int16_t *idwt_tmp;
    int      idwt_size;

    /* TODO: merge this into SubBand structure */
    int16_t *subband[SUBBAND_COUNT_3D];
    int16_t *l_h[10];

    SubBand band[DWT_LEVELS_3D][4];
} Plane;

typedef struct Peak {
    int level;
    int offset;
    GetByteContext base;
} Peak;

typedef struct CFHDContext {
    AVCodecContext *avctx;

    CFHD_RL_VLC_ELEM table_9_rl_vlc[2088];
    VLC vlc_9;

    CFHD_RL_VLC_ELEM table_18_rl_vlc[4572];
    VLC vlc_18;

    int lut[2][256];

    GetBitContext gb;

    int planes;
    int frame_type;
    int frame_index;
    int sample_type;
    int transform_type;
    int coded_width;
    int coded_height;
    int cropped_height;
    enum AVPixelFormat coded_format;
    int progressive;

    int a_width;
    int a_height;
    int a_format;

    int bpc; // bits per channel/component
    int channel_cnt;
    int subband_cnt;
    int band_encoding;
    int channel_num;
    uint8_t lowpass_precision;
    uint16_t quantisation;

    int codebook;
    int difference_coding;
    int subband_num;
    int level;
    int subband_num_actual;

    uint8_t prescale_table[8];
    Plane plane[4];
    Peak peak;

    CFHDDSPContext dsp;
} CFHDContext;

int ff_cfhd_init_vlcs(CFHDContext *s);

#endif /* AVCODEC_CFHD_H */
