LCOV - code coverage report
Current view: top level - libavcodec - ffv1.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 32 32 100.0 %
Date: 2017-12-16 13:57:32 Functions: 2 2 100.0 %

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

Generated by: LCOV version 1.13