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