xref: /third_party/ffmpeg/libavcodec/rl.h (revision cabdff1a)
1/*
2 * Copyright (c) 2000-2002 Fabrice Bellard
3 * Copyright (c) 2002-2004 Michael Niedermayer
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/**
23 * @file
24 * rl header.
25 */
26
27#ifndef AVCODEC_RL_H
28#define AVCODEC_RL_H
29
30#include <stdint.h>
31
32#include "vlc.h"
33
34/* run length table */
35#define MAX_RUN    64
36#define MAX_LEVEL  64
37
38/** RLTable. */
39typedef struct RLTable {
40    int n;                         ///< number of entries of table_vlc minus 1
41    int last;                      ///< number of values for last = 0
42    const uint16_t (*table_vlc)[2];
43    const int8_t *table_run;
44    const int8_t *table_level;
45    uint8_t *index_run[2];         ///< encoding only
46    int8_t *max_level[2];          ///< encoding & decoding
47    int8_t *max_run[2];            ///< encoding & decoding
48    RL_VLC_ELEM *rl_vlc[32];       ///< decoding only
49} RLTable;
50
51/**
52 * Initialize index_run, max_level and max_run from n, last, table_vlc,
53 * table_run and table_level.
54 * @param static_store static uint8_t array[2][2*MAX_RUN + MAX_LEVEL + 3]
55 *                     to hold the level and run tables.
56 * @note  This function does not touch rl_vlc at all, hence there is no need
57 *        to synchronize calls to ff_rl_init() and ff_rl_init_vlc() using the
58 *        same RLTable.
59 */
60void ff_rl_init(RLTable *rl, uint8_t static_store[2][2*MAX_RUN + MAX_LEVEL + 3]);
61
62/**
63 * Initialize rl_vlc from n, last, table_vlc, table_run and table_level.
64 * All rl_vlc pointers to be initialized must already point to a static
65 * buffer of `static_size` RL_VLC_ELEM elements; if a pointer is NULL,
66 * initializing further VLCs stops.
67 * @note  This function does not touch what ff_rl_init() initializes at all,
68 *        hence there is no need to synchronize calls to ff_rl_init() and
69 *        ff_rl_init_vlc() using the same RLTable.
70 */
71void ff_rl_init_vlc(RLTable *rl, unsigned static_size);
72
73#define INIT_VLC_RL(rl, static_size)\
74{\
75    static RL_VLC_ELEM rl_vlc_table[32][static_size];\
76\
77    for (int q = 0; q < 32; q++) \
78        rl.rl_vlc[q] = rl_vlc_table[q]; \
79\
80    ff_rl_init_vlc(&rl, static_size); \
81}
82
83#define INIT_FIRST_VLC_RL(rl, static_size)              \
84do {                                                    \
85    static RL_VLC_ELEM rl_vlc_table[static_size];       \
86                                                        \
87    rl.rl_vlc[0] = rl_vlc_table;                        \
88    ff_rl_init_vlc(&rl, static_size);                   \
89} while (0)
90
91static inline int get_rl_index(const RLTable *rl, int last, int run, int level)
92{
93    int index;
94    index = rl->index_run[last][run];
95    if (index >= rl->n)
96        return rl->n;
97    if (level > rl->max_level[last][run])
98        return rl->n;
99    return index + level - 1;
100}
101
102#endif /* AVCODEC_RL_H */
103