You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

204 lines
5.2KB

  1. /*
  2. * FFV1 codec for libavcodec
  3. *
  4. * Copyright (c) 2003-2012 Michael Niedermayer <michaelni@gmx.at>
  5. *
  6. * This file is part of Libav.
  7. *
  8. * Libav 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. * Libav 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 Libav; if not, write to the Free Software
  20. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  21. */
  22. #ifndef AVCODEC_FFV1_H
  23. #define AVCODEC_FFV1_H
  24. #include <stdint.h>
  25. #include "avcodec.h"
  26. #include "get_bits.h"
  27. #include "put_bits.h"
  28. #include "rangecoder.h"
  29. #define MAX_PLANES 4
  30. #define CONTEXT_SIZE 32
  31. #define MAX_QUANT_TABLES 8
  32. #define MAX_CONTEXT_INPUTS 5
  33. extern const uint8_t ff_log2_run[41];
  34. extern const int8_t ffv1_quant5_10bit[256];
  35. extern const int8_t ffv1_quant5[256];
  36. extern const int8_t ffv1_quant9_10bit[256];
  37. extern const int8_t ffv1_quant11[256];
  38. extern const uint8_t ffv1_ver2_state[256];
  39. typedef struct VlcState {
  40. int16_t drift;
  41. uint16_t error_sum;
  42. int8_t bias;
  43. uint8_t count;
  44. } VlcState;
  45. typedef struct PlaneContext {
  46. int16_t quant_table[MAX_CONTEXT_INPUTS][256];
  47. int quant_table_index;
  48. int context_count;
  49. uint8_t (*state)[CONTEXT_SIZE];
  50. VlcState *vlc_state;
  51. uint8_t interlace_bit_state[2];
  52. } PlaneContext;
  53. #define MAX_SLICES 256
  54. typedef struct FFV1Context {
  55. AVClass *class;
  56. AVCodecContext *avctx;
  57. RangeCoder c;
  58. GetBitContext gb;
  59. PutBitContext pb;
  60. uint64_t rc_stat[256][2];
  61. uint64_t (*rc_stat2[MAX_QUANT_TABLES])[32][2];
  62. int version;
  63. int minor_version;
  64. int width, height;
  65. int chroma_planes;
  66. int chroma_h_shift, chroma_v_shift;
  67. int transparency;
  68. int flags;
  69. int picture_number;
  70. AVFrame *frame;
  71. AVFrame *last_picture;
  72. AVFrame *cur;
  73. int plane_count;
  74. int ac; // 1 = range coder <-> 0 = golomb rice
  75. int ac_byte_count; // number of bytes used for AC coding
  76. PlaneContext plane[MAX_PLANES];
  77. int16_t quant_table[MAX_CONTEXT_INPUTS][256];
  78. int16_t quant_tables[MAX_QUANT_TABLES][MAX_CONTEXT_INPUTS][256];
  79. int context_count[MAX_QUANT_TABLES];
  80. uint8_t state_transition[256];
  81. uint8_t (*initial_states[MAX_QUANT_TABLES])[32];
  82. int run_index;
  83. int colorspace;
  84. int16_t *sample_buffer;
  85. int ec;
  86. int slice_damaged;
  87. int key_frame_ok;
  88. int bits_per_raw_sample;
  89. int packed_at_lsb;
  90. int gob_count;
  91. int quant_table_count;
  92. struct FFV1Context *slice_context[MAX_SLICES];
  93. int slice_count;
  94. int num_v_slices;
  95. int num_h_slices;
  96. int slice_width;
  97. int slice_height;
  98. int slice_x;
  99. int slice_y;
  100. } FFV1Context;
  101. static av_always_inline int fold(int diff, int bits)
  102. {
  103. if (bits == 8)
  104. diff = (int8_t)diff;
  105. else {
  106. diff += 1 << (bits - 1);
  107. diff &= (1 << bits) - 1;
  108. diff -= 1 << (bits - 1);
  109. }
  110. return diff;
  111. }
  112. static inline int predict(int16_t *src, int16_t *last)
  113. {
  114. const int LT = last[-1];
  115. const int T = last[0];
  116. const int L = src[-1];
  117. return mid_pred(L, L + T - LT, T);
  118. }
  119. static inline int get_context(PlaneContext *p, int16_t *src,
  120. int16_t *last, int16_t *last2)
  121. {
  122. const int LT = last[-1];
  123. const int T = last[0];
  124. const int RT = last[1];
  125. const int L = src[-1];
  126. if (p->quant_table[3][127]) {
  127. const int TT = last2[0];
  128. const int LL = src[-2];
  129. return p->quant_table[0][(L - LT) & 0xFF] +
  130. p->quant_table[1][(LT - T) & 0xFF] +
  131. p->quant_table[2][(T - RT) & 0xFF] +
  132. p->quant_table[3][(LL - L) & 0xFF] +
  133. p->quant_table[4][(TT - T) & 0xFF];
  134. } else
  135. return p->quant_table[0][(L - LT) & 0xFF] +
  136. p->quant_table[1][(LT - T) & 0xFF] +
  137. p->quant_table[2][(T - RT) & 0xFF];
  138. }
  139. static inline void update_vlc_state(VlcState *const state, const int v)
  140. {
  141. int drift = state->drift;
  142. int count = state->count;
  143. state->error_sum += FFABS(v);
  144. drift += v;
  145. if (count == 128) { // FIXME: variable
  146. count >>= 1;
  147. drift >>= 1;
  148. state->error_sum >>= 1;
  149. }
  150. count++;
  151. if (drift <= -count) {
  152. if (state->bias > -128)
  153. state->bias--;
  154. drift += count;
  155. if (drift <= -count)
  156. drift = -count + 1;
  157. } else if (drift > 0) {
  158. if (state->bias < 127)
  159. state->bias++;
  160. drift -= count;
  161. if (drift > 0)
  162. drift = 0;
  163. }
  164. state->drift = drift;
  165. state->count = count;
  166. }
  167. int ffv1_common_init(AVCodecContext *avctx);
  168. int ffv1_init_slice_state(FFV1Context *f, FFV1Context *fs);
  169. int ffv1_init_slice_contexts(FFV1Context *f);
  170. int ffv1_allocate_initial_states(FFV1Context *f);
  171. void ffv1_clear_slice_state(FFV1Context *f, FFV1Context *fs);
  172. int ffv1_close(AVCodecContext *avctx);
  173. #endif /* AVCODEC_FFV1_H */