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.

220 lines
5.6KB

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