1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * FFV1 codec for libavcodec
3cabdff1aSopenharmony_ci *
4cabdff1aSopenharmony_ci * Copyright (c) 2003-2012 Michael Niedermayer <michaelni@gmx.at>
5cabdff1aSopenharmony_ci *
6cabdff1aSopenharmony_ci * This file is part of FFmpeg.
7cabdff1aSopenharmony_ci *
8cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
9cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
10cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
11cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
12cabdff1aSopenharmony_ci *
13cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
14cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
15cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16cabdff1aSopenharmony_ci * Lesser General Public License for more details.
17cabdff1aSopenharmony_ci *
18cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
19cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
20cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21cabdff1aSopenharmony_ci */
22cabdff1aSopenharmony_ci
23cabdff1aSopenharmony_ci#ifndef AVCODEC_FFV1_H
24cabdff1aSopenharmony_ci#define AVCODEC_FFV1_H
25cabdff1aSopenharmony_ci
26cabdff1aSopenharmony_ci/**
27cabdff1aSopenharmony_ci * @file
28cabdff1aSopenharmony_ci * FF Video Codec 1 (a lossless codec)
29cabdff1aSopenharmony_ci */
30cabdff1aSopenharmony_ci
31cabdff1aSopenharmony_ci#include "libavutil/imgutils.h"
32cabdff1aSopenharmony_ci#include "avcodec.h"
33cabdff1aSopenharmony_ci#include "get_bits.h"
34cabdff1aSopenharmony_ci#include "mathops.h"
35cabdff1aSopenharmony_ci#include "put_bits.h"
36cabdff1aSopenharmony_ci#include "rangecoder.h"
37cabdff1aSopenharmony_ci#include "threadframe.h"
38cabdff1aSopenharmony_ci
39cabdff1aSopenharmony_ci#ifdef __INTEL_COMPILER
40cabdff1aSopenharmony_ci#undef av_flatten
41cabdff1aSopenharmony_ci#define av_flatten
42cabdff1aSopenharmony_ci#endif
43cabdff1aSopenharmony_ci
44cabdff1aSopenharmony_ci#define MAX_PLANES 4
45cabdff1aSopenharmony_ci#define CONTEXT_SIZE 32
46cabdff1aSopenharmony_ci
47cabdff1aSopenharmony_ci#define MAX_QUANT_TABLES 8
48cabdff1aSopenharmony_ci#define MAX_CONTEXT_INPUTS 5
49cabdff1aSopenharmony_ci
50cabdff1aSopenharmony_ci#define AC_GOLOMB_RICE          0
51cabdff1aSopenharmony_ci#define AC_RANGE_DEFAULT_TAB    1
52cabdff1aSopenharmony_ci#define AC_RANGE_CUSTOM_TAB     2
53cabdff1aSopenharmony_ci#define AC_RANGE_DEFAULT_TAB_FORCE -2
54cabdff1aSopenharmony_ci
55cabdff1aSopenharmony_citypedef struct VlcState {
56cabdff1aSopenharmony_ci    int16_t drift;
57cabdff1aSopenharmony_ci    uint16_t error_sum;
58cabdff1aSopenharmony_ci    int8_t bias;
59cabdff1aSopenharmony_ci    uint8_t count;
60cabdff1aSopenharmony_ci} VlcState;
61cabdff1aSopenharmony_ci
62cabdff1aSopenharmony_citypedef struct PlaneContext {
63cabdff1aSopenharmony_ci    int16_t quant_table[MAX_CONTEXT_INPUTS][256];
64cabdff1aSopenharmony_ci    int quant_table_index;
65cabdff1aSopenharmony_ci    int context_count;
66cabdff1aSopenharmony_ci    uint8_t (*state)[CONTEXT_SIZE];
67cabdff1aSopenharmony_ci    VlcState *vlc_state;
68cabdff1aSopenharmony_ci    uint8_t interlace_bit_state[2];
69cabdff1aSopenharmony_ci} PlaneContext;
70cabdff1aSopenharmony_ci
71cabdff1aSopenharmony_ci#define MAX_SLICES 1024
72cabdff1aSopenharmony_ci
73cabdff1aSopenharmony_citypedef struct FFV1Context {
74cabdff1aSopenharmony_ci    AVClass *class;
75cabdff1aSopenharmony_ci    AVCodecContext *avctx;
76cabdff1aSopenharmony_ci    RangeCoder c;
77cabdff1aSopenharmony_ci    GetBitContext gb;
78cabdff1aSopenharmony_ci    PutBitContext pb;
79cabdff1aSopenharmony_ci    uint64_t rc_stat[256][2];
80cabdff1aSopenharmony_ci    uint64_t (*rc_stat2[MAX_QUANT_TABLES])[32][2];
81cabdff1aSopenharmony_ci    int version;
82cabdff1aSopenharmony_ci    int micro_version;
83cabdff1aSopenharmony_ci    int width, height;
84cabdff1aSopenharmony_ci    int chroma_planes;
85cabdff1aSopenharmony_ci    int chroma_h_shift, chroma_v_shift;
86cabdff1aSopenharmony_ci    int transparency;
87cabdff1aSopenharmony_ci    int flags;
88cabdff1aSopenharmony_ci    int picture_number;
89cabdff1aSopenharmony_ci    int key_frame;
90cabdff1aSopenharmony_ci    ThreadFrame picture, last_picture;
91cabdff1aSopenharmony_ci    struct FFV1Context *fsrc;
92cabdff1aSopenharmony_ci
93cabdff1aSopenharmony_ci    AVFrame *cur;
94cabdff1aSopenharmony_ci    int plane_count;
95cabdff1aSopenharmony_ci    int ac;                              ///< 1=range coder <-> 0=golomb rice
96cabdff1aSopenharmony_ci    int ac_byte_count;                   ///< number of bytes used for AC coding
97cabdff1aSopenharmony_ci    PlaneContext plane[MAX_PLANES];
98cabdff1aSopenharmony_ci    int16_t quant_table[MAX_CONTEXT_INPUTS][256];
99cabdff1aSopenharmony_ci    int16_t quant_tables[MAX_QUANT_TABLES][MAX_CONTEXT_INPUTS][256];
100cabdff1aSopenharmony_ci    int context_count[MAX_QUANT_TABLES];
101cabdff1aSopenharmony_ci    uint8_t state_transition[256];
102cabdff1aSopenharmony_ci    uint8_t (*initial_states[MAX_QUANT_TABLES])[32];
103cabdff1aSopenharmony_ci    int run_index;
104cabdff1aSopenharmony_ci    int colorspace;
105cabdff1aSopenharmony_ci    int16_t *sample_buffer;
106cabdff1aSopenharmony_ci    int32_t *sample_buffer32;
107cabdff1aSopenharmony_ci
108cabdff1aSopenharmony_ci    int use32bit;
109cabdff1aSopenharmony_ci
110cabdff1aSopenharmony_ci    int ec;
111cabdff1aSopenharmony_ci    int intra;
112cabdff1aSopenharmony_ci    int slice_damaged;
113cabdff1aSopenharmony_ci    int key_frame_ok;
114cabdff1aSopenharmony_ci    int context_model;
115cabdff1aSopenharmony_ci
116cabdff1aSopenharmony_ci    int bits_per_raw_sample;
117cabdff1aSopenharmony_ci    int packed_at_lsb;
118cabdff1aSopenharmony_ci
119cabdff1aSopenharmony_ci    int gob_count;
120cabdff1aSopenharmony_ci    int quant_table_count;
121cabdff1aSopenharmony_ci
122cabdff1aSopenharmony_ci    struct FFV1Context *slice_context[MAX_SLICES];
123cabdff1aSopenharmony_ci    int slice_count;
124cabdff1aSopenharmony_ci    int max_slice_count;
125cabdff1aSopenharmony_ci    int num_v_slices;
126cabdff1aSopenharmony_ci    int num_h_slices;
127cabdff1aSopenharmony_ci    int slice_width;
128cabdff1aSopenharmony_ci    int slice_height;
129cabdff1aSopenharmony_ci    int slice_x;
130cabdff1aSopenharmony_ci    int slice_y;
131cabdff1aSopenharmony_ci    int slice_reset_contexts;
132cabdff1aSopenharmony_ci    int slice_coding_mode;
133cabdff1aSopenharmony_ci    int slice_rct_by_coef;
134cabdff1aSopenharmony_ci    int slice_rct_ry_coef;
135cabdff1aSopenharmony_ci} FFV1Context;
136cabdff1aSopenharmony_ci
137cabdff1aSopenharmony_ciint ff_ffv1_common_init(AVCodecContext *avctx);
138cabdff1aSopenharmony_ciint ff_ffv1_init_slice_state(const FFV1Context *f, FFV1Context *fs);
139cabdff1aSopenharmony_ciint ff_ffv1_init_slices_state(FFV1Context *f);
140cabdff1aSopenharmony_ciint ff_ffv1_init_slice_contexts(FFV1Context *f);
141cabdff1aSopenharmony_ciint ff_ffv1_allocate_initial_states(FFV1Context *f);
142cabdff1aSopenharmony_civoid ff_ffv1_clear_slice_state(const FFV1Context *f, FFV1Context *fs);
143cabdff1aSopenharmony_ciint ff_ffv1_close(AVCodecContext *avctx);
144cabdff1aSopenharmony_ci
145cabdff1aSopenharmony_cistatic av_always_inline int fold(int diff, int bits)
146cabdff1aSopenharmony_ci{
147cabdff1aSopenharmony_ci    if (bits == 8)
148cabdff1aSopenharmony_ci        diff = (int8_t)diff;
149cabdff1aSopenharmony_ci    else {
150cabdff1aSopenharmony_ci        diff = sign_extend(diff, bits);
151cabdff1aSopenharmony_ci    }
152cabdff1aSopenharmony_ci
153cabdff1aSopenharmony_ci    return diff;
154cabdff1aSopenharmony_ci}
155cabdff1aSopenharmony_ci
156cabdff1aSopenharmony_cistatic inline void update_vlc_state(VlcState *const state, const int v)
157cabdff1aSopenharmony_ci{
158cabdff1aSopenharmony_ci    int drift = state->drift;
159cabdff1aSopenharmony_ci    int count = state->count;
160cabdff1aSopenharmony_ci    state->error_sum += FFABS(v);
161cabdff1aSopenharmony_ci    drift            += v;
162cabdff1aSopenharmony_ci
163cabdff1aSopenharmony_ci    if (count == 128) { // FIXME: variable
164cabdff1aSopenharmony_ci        count            >>= 1;
165cabdff1aSopenharmony_ci        drift            >>= 1;
166cabdff1aSopenharmony_ci        state->error_sum >>= 1;
167cabdff1aSopenharmony_ci    }
168cabdff1aSopenharmony_ci    count++;
169cabdff1aSopenharmony_ci
170cabdff1aSopenharmony_ci    if (drift <= -count) {
171cabdff1aSopenharmony_ci        state->bias = FFMAX(state->bias - 1, -128);
172cabdff1aSopenharmony_ci
173cabdff1aSopenharmony_ci        drift = FFMAX(drift + count, -count + 1);
174cabdff1aSopenharmony_ci    } else if (drift > 0) {
175cabdff1aSopenharmony_ci        state->bias = FFMIN(state->bias + 1, 127);
176cabdff1aSopenharmony_ci
177cabdff1aSopenharmony_ci        drift = FFMIN(drift - count, 0);
178cabdff1aSopenharmony_ci    }
179cabdff1aSopenharmony_ci
180cabdff1aSopenharmony_ci    state->drift = drift;
181cabdff1aSopenharmony_ci    state->count = count;
182cabdff1aSopenharmony_ci}
183cabdff1aSopenharmony_ci
184cabdff1aSopenharmony_ci#define TYPE int16_t
185cabdff1aSopenharmony_ci#define RENAME(name) name
186cabdff1aSopenharmony_ci#include "ffv1_template.c"
187cabdff1aSopenharmony_ci#undef TYPE
188cabdff1aSopenharmony_ci#undef RENAME
189cabdff1aSopenharmony_ci
190cabdff1aSopenharmony_ci#define TYPE int32_t
191cabdff1aSopenharmony_ci#define RENAME(name) name ## 32
192cabdff1aSopenharmony_ci#include "ffv1_template.c"
193cabdff1aSopenharmony_ci#undef TYPE
194cabdff1aSopenharmony_ci#undef RENAME
195cabdff1aSopenharmony_ci
196cabdff1aSopenharmony_ci#endif /* AVCODEC_FFV1_H */
197