mlz.h 1.96 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
/*
 * 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
29
#define DIC_INDEX_MAX       32768   // 2^15
30 31 32
#define FLUSH_CODE          256
#define FREEZE_CODE         257
#define FIRST_CODE          258
33 34
#define MAX_CODE            32767
#define TABLE_SIZE          35023   // TABLE_SIZE must be a prime number
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70

/** 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*/