/*
 * Copyright (c) 2016 Umair Khan <omerjerk@gmail.com>
 *
 * 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_MLZ_H
#define AVCODEC_MLZ_H

#include "get_bits.h"

#define CODE_UNSET          -1
#define CODE_BIT_INIT       9
#define DIC_INDEX_INIT      512     // 2^9
#define DIC_INDEX_MAX       32768   // 2^15
#define FLUSH_CODE          256
#define FREEZE_CODE         257
#define FIRST_CODE          258
#define MAX_CODE            32767
#define TABLE_SIZE          35023   // TABLE_SIZE must be a prime number

/** Dictionary structure for mlz decompression
 */
typedef struct MLZDict {
    int  string_code;
    int  parent_code;
    int  char_code;
    int  match_len;
} MLZDict;

/** MLZ data strucure
 */
typedef struct MLZ {
    int dic_code_bit;
    int current_dic_index_max;
    unsigned int bump_code;
    unsigned int flush_code;
    int next_code;
    int freeze_flag;
    MLZDict* dict;
    void* context;
} MLZ;

/** Initialize the dictionary
 */
void ff_mlz_init_dict(void* context, MLZ *mlz);

/** Flush the dictionary
 */
void ff_mlz_flush_dict(MLZ *dict);

/** Run mlz decompression on the next size bits and the output will be stored in buff
 */
int ff_mlz_decompression(MLZ* mlz, GetBitContext* gb, int size, unsigned char *buff);

#endif /*AVCODEC_MLZ_H*/
