Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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 "dsputil.h"
  39. #include "get_bits.h"
  40. #include "internal.h"
  41. #include "mathops.h"
  42. #include "put_bits.h"
  43. #include "rangecoder.h"
  44. #include "thread.h"
  45.  
  46. #ifdef __INTEL_COMPILER
  47. #undef av_flatten
  48. #define av_flatten
  49. #endif
  50.  
  51. #define MAX_PLANES 4
  52. #define CONTEXT_SIZE 32
  53.  
  54. #define MAX_QUANT_TABLES 8
  55. #define MAX_CONTEXT_INPUTS 5
  56.  
  57. extern const uint8_t ff_log2_run[41];
  58.  
  59. typedef struct VlcState {
  60.     int16_t drift;
  61.     uint16_t error_sum;
  62.     int8_t bias;
  63.     uint8_t count;
  64. } VlcState;
  65.  
  66. typedef struct PlaneContext {
  67.     int16_t quant_table[MAX_CONTEXT_INPUTS][256];
  68.     int quant_table_index;
  69.     int context_count;
  70.     uint8_t (*state)[CONTEXT_SIZE];
  71.     VlcState *vlc_state;
  72.     uint8_t interlace_bit_state[2];
  73. } PlaneContext;
  74.  
  75. #define MAX_SLICES 256
  76.  
  77. typedef struct FFV1Context {
  78.     AVClass *class;
  79.     AVCodecContext *avctx;
  80.     RangeCoder c;
  81.     GetBitContext gb;
  82.     PutBitContext pb;
  83.     uint64_t rc_stat[256][2];
  84.     uint64_t (*rc_stat2[MAX_QUANT_TABLES])[32][2];
  85.     int version;
  86.     int micro_version;
  87.     int width, height;
  88.     int chroma_planes;
  89.     int chroma_h_shift, chroma_v_shift;
  90.     int transparency;
  91.     int flags;
  92.     int picture_number;
  93.     ThreadFrame picture, last_picture;
  94.     struct FFV1Context *fsrc;
  95.  
  96.     AVFrame *cur;
  97.     int plane_count;
  98.     int ac;                              ///< 1=range coder <-> 0=golomb rice
  99.     int ac_byte_count;                   ///< number of bytes used for AC coding
  100.     PlaneContext plane[MAX_PLANES];
  101.     int16_t quant_table[MAX_CONTEXT_INPUTS][256];
  102.     int16_t quant_tables[MAX_QUANT_TABLES][MAX_CONTEXT_INPUTS][256];
  103.     int context_count[MAX_QUANT_TABLES];
  104.     uint8_t state_transition[256];
  105.     uint8_t (*initial_states[MAX_QUANT_TABLES])[32];
  106.     int run_index;
  107.     int colorspace;
  108.     int16_t *sample_buffer;
  109.  
  110.     int ec;
  111.     int intra;
  112.     int slice_damaged;
  113.     int key_frame_ok;
  114.  
  115.     int bits_per_raw_sample;
  116.     int packed_at_lsb;
  117.  
  118.     int gob_count;
  119.     int quant_table_count;
  120.  
  121.     DSPContext dsp;
  122.  
  123.     struct FFV1Context *slice_context[MAX_SLICES];
  124.     int slice_count;
  125.     int num_v_slices;
  126.     int num_h_slices;
  127.     int slice_width;
  128.     int slice_height;
  129.     int slice_x;
  130.     int slice_y;
  131.     int slice_reset_contexts;
  132.     int slice_coding_mode;
  133. } FFV1Context;
  134.  
  135. int ffv1_common_init(AVCodecContext *avctx);
  136. int ffv1_init_slice_state(FFV1Context *f, FFV1Context *fs);
  137. int ffv1_init_slices_state(FFV1Context *f);
  138. int ffv1_init_slice_contexts(FFV1Context *f);
  139. int ffv1_allocate_initial_states(FFV1Context *f);
  140. void ffv1_clear_slice_state(FFV1Context *f, FFV1Context *fs);
  141. int ffv1_close(AVCodecContext *avctx);
  142.  
  143. static av_always_inline int fold(int diff, int bits)
  144. {
  145.     if (bits == 8)
  146.         diff = (int8_t)diff;
  147.     else {
  148.         diff +=  1 << (bits  - 1);
  149.         diff &= (1 <<  bits) - 1;
  150.         diff -=  1 << (bits  - 1);
  151.     }
  152.  
  153.     return diff;
  154. }
  155.  
  156. static inline int predict(int16_t *src, int16_t *last)
  157. {
  158.     const int LT = last[-1];
  159.     const int T  = last[0];
  160.     const int L  = src[-1];
  161.  
  162.     return mid_pred(L, L + T - LT, T);
  163. }
  164.  
  165. static inline int get_context(PlaneContext *p, int16_t *src,
  166.                               int16_t *last, int16_t *last2)
  167. {
  168.     const int LT = last[-1];
  169.     const int T  = last[0];
  170.     const int RT = last[1];
  171.     const int L  = src[-1];
  172.  
  173.     if (p->quant_table[3][127]) {
  174.         const int TT = last2[0];
  175.         const int LL = src[-2];
  176.         return p->quant_table[0][(L - LT) & 0xFF] +
  177.                p->quant_table[1][(LT - T) & 0xFF] +
  178.                p->quant_table[2][(T - RT) & 0xFF] +
  179.                p->quant_table[3][(LL - L) & 0xFF] +
  180.                p->quant_table[4][(TT - T) & 0xFF];
  181.     } else
  182.         return p->quant_table[0][(L - LT) & 0xFF] +
  183.                p->quant_table[1][(LT - T) & 0xFF] +
  184.                p->quant_table[2][(T - RT) & 0xFF];
  185. }
  186.  
  187. static inline void update_vlc_state(VlcState *const state, const int v)
  188. {
  189.     int drift = state->drift;
  190.     int count = state->count;
  191.     state->error_sum += FFABS(v);
  192.     drift            += v;
  193.  
  194.     if (count == 128) { // FIXME: variable
  195.         count            >>= 1;
  196.         drift            >>= 1;
  197.         state->error_sum >>= 1;
  198.     }
  199.     count++;
  200.  
  201.     if (drift <= -count) {
  202.         if (state->bias > -128)
  203.             state->bias--;
  204.  
  205.         drift += count;
  206.         if (drift <= -count)
  207.             drift = -count + 1;
  208.     } else if (drift > 0) {
  209.         if (state->bias < 127)
  210.             state->bias++;
  211.  
  212.         drift -= count;
  213.         if (drift > 0)
  214.             drift = 0;
  215.     }
  216.  
  217.     state->drift = drift;
  218.     state->count = count;
  219. }
  220.  
  221. #endif /* AVCODEC_FFV1_H */
  222.