1bde47d7953e03221173ac9546ef1aa1b4b9655e
[theora.git] / lib / encint.h
1 /********************************************************************
2  *                                                                  *
3  * THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE.   *
4  * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
5  * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
6  * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
7  *                                                                  *
8  * THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009                *
9  * by the Xiph.Org Foundation http://www.xiph.org/                  *
10  *                                                                  *
11  ********************************************************************
12
13   function:
14   last mod: $Id$
15
16  ********************************************************************/
17 #if !defined(_encint_H)
18 # define _encint_H (1)
19 # include "theora/theoraenc.h"
20 # include "state.h"
21 # include "mathops.h"
22 # include "enquant.h"
23 # include "huffenc.h"
24 /*# define OC_COLLECT_METRICS*/
25
26
27
28 typedef oc_mv                         oc_mv2[2];
29
30 typedef struct oc_enc_opt_vtable      oc_enc_opt_vtable;
31 typedef struct oc_enc_opt_data        oc_enc_opt_data;
32 typedef struct oc_mb_enc_info         oc_mb_enc_info;
33 typedef struct oc_mode_scheme_chooser oc_mode_scheme_chooser;
34 typedef struct oc_fr_state            oc_fr_state;
35 typedef struct oc_qii_state           oc_qii_state;
36 typedef struct oc_enc_pipeline_state  oc_enc_pipeline_state;
37 typedef struct oc_mode_rd             oc_mode_rd;
38 typedef struct oc_iir_filter          oc_iir_filter;
39 typedef struct oc_frame_metrics       oc_frame_metrics;
40 typedef struct oc_rc_state            oc_rc_state;
41 typedef struct th_enc_ctx             oc_enc_ctx;
42 typedef struct oc_token_checkpoint    oc_token_checkpoint;
43
44
45
46 /*Encoder-specific accelerated functions.*/
47 # if defined(OC_X86_ASM)
48 #  if defined(_MSC_VER)
49 #   include "x86_vc/x86enc.h"
50 #  else
51 #   include "x86/x86enc.h"
52 #  endif
53 # endif
54 # if defined(OC_ARM_ASM)
55 #  include "arm/armenc.h"
56 # endif
57
58 # if !defined(oc_enc_accel_init)
59 #  define oc_enc_accel_init oc_enc_accel_init_c
60 # endif
61 # if defined(OC_ENC_USE_VTABLE)
62 #  if !defined(oc_enc_frag_sub)
63 #   define oc_enc_frag_sub(_enc,_diff,_src,_ref,_ystride) \
64   ((*(_enc)->opt_vtable.frag_sub)(_diff,_src,_ref,_ystride))
65 #  endif
66 #  if !defined(oc_enc_frag_sub_128)
67 #   define oc_enc_frag_sub_128(_enc,_diff,_src,_ystride) \
68   ((*(_enc)->opt_vtable.frag_sub_128)(_diff,_src,_ystride))
69 #  endif
70 #  if !defined(oc_enc_frag_sad)
71 #   define oc_enc_frag_sad(_enc,_src,_ref,_ystride) \
72   ((*(_enc)->opt_vtable.frag_sad)(_src,_ref,_ystride))
73 #  endif
74 #  if !defined(oc_enc_frag_sad_thresh)
75 #   define oc_enc_frag_sad_thresh(_enc,_src,_ref,_ystride,_thresh) \
76   ((*(_enc)->opt_vtable.frag_sad_thresh)(_src,_ref,_ystride,_thresh))
77 #  endif
78 #  if !defined(oc_enc_frag_sad2_thresh)
79 #   define oc_enc_frag_sad2_thresh(_enc,_src,_ref1,_ref2,_ystride,_thresh) \
80   ((*(_enc)->opt_vtable.frag_sad2_thresh)(_src,_ref1,_ref2,_ystride,_thresh))
81 #  endif
82 #  if !defined(oc_enc_frag_satd)
83 #   define oc_enc_frag_satd(_enc,_dc,_src,_ref,_ystride) \
84   ((*(_enc)->opt_vtable.frag_satd)(_dc,_src,_ref,_ystride))
85 #  endif
86 #  if !defined(oc_enc_frag_satd2)
87 #   define oc_enc_frag_satd2(_enc,_dc,_src,_ref1,_ref2,_ystride) \
88   ((*(_enc)->opt_vtable.frag_satd2)(_dc,_src,_ref1,_ref2,_ystride))
89 #  endif
90 #  if !defined(oc_enc_frag_intra_satd)
91 #   define oc_enc_frag_intra_satd(_enc,_dc,_src,_ystride) \
92   ((*(_enc)->opt_vtable.frag_intra_satd)(_dc,_src,_ystride))
93 #  endif
94 #  if !defined(oc_enc_frag_ssd)
95 #   define oc_enc_frag_ssd(_enc,_src,_ref,_ystride) \
96   ((*(_enc)->opt_vtable.frag_ssd)(_src,_ref,_ystride))
97 #  endif
98 #  if !defined(oc_enc_frag_border_ssd)
99 #   define oc_enc_frag_border_ssd(_enc,_src,_ref,_ystride,_mask) \
100   ((*(_enc)->opt_vtable.frag_border_ssd)(_src,_ref,_ystride,_mask))
101 #  endif
102 #  if !defined(oc_enc_frag_copy2)
103 #   define oc_enc_frag_copy2(_enc,_dst,_src1,_src2,_ystride) \
104   ((*(_enc)->opt_vtable.frag_copy2)(_dst,_src1,_src2,_ystride))
105 #  endif
106 #  if !defined(oc_enc_enquant_table_init)
107 #   define oc_enc_enquant_table_init(_enc,_enquant,_dequant) \
108   ((*(_enc)->opt_vtable.enquant_table_init)(_enquant,_dequant))
109 #  endif
110 #  if !defined(oc_enc_enquant_table_fixup)
111 #   define oc_enc_enquant_table_fixup(_enc,_enquant,_nqis) \
112   ((*(_enc)->opt_vtable.enquant_table_fixup)(_enquant,_nqis))
113 #  endif
114 #  if !defined(oc_enc_quantize)
115 #   define oc_enc_quantize(_enc,_qdct,_dct,_dequant,_enquant) \
116   ((*(_enc)->opt_vtable.quantize)(_qdct,_dct,_dequant,_enquant))
117 #  endif
118 #  if !defined(oc_enc_frag_recon_intra)
119 #   define oc_enc_frag_recon_intra(_enc,_dst,_ystride,_residue) \
120   ((*(_enc)->opt_vtable.frag_recon_intra)(_dst,_ystride,_residue))
121 #  endif
122 #  if !defined(oc_enc_frag_recon_inter)
123 #   define oc_enc_frag_recon_inter(_enc,_dst,_src,_ystride,_residue) \
124   ((*(_enc)->opt_vtable.frag_recon_inter)(_dst,_src,_ystride,_residue))
125 #  endif
126 #  if !defined(oc_enc_fdct8x8)
127 #   define oc_enc_fdct8x8(_enc,_y,_x) \
128   ((*(_enc)->opt_vtable.fdct8x8)(_y,_x))
129 #  endif
130 # else
131 #  if !defined(oc_enc_frag_sub)
132 #   define oc_enc_frag_sub(_enc,_diff,_src,_ref,_ystride) \
133   oc_enc_frag_sub_c(_diff,_src,_ref,_ystride)
134 #  endif
135 #  if !defined(oc_enc_frag_sub_128)
136 #   define oc_enc_frag_sub_128(_enc,_diff,_src,_ystride) \
137   oc_enc_frag_sub_128_c(_diff,_src,_ystride)
138 #  endif
139 #  if !defined(oc_enc_frag_sad)
140 #   define oc_enc_frag_sad(_enc,_src,_ref,_ystride) \
141   oc_enc_frag_sad_c(_src,_ref,_ystride)
142 #  endif
143 #  if !defined(oc_enc_frag_sad_thresh)
144 #   define oc_enc_frag_sad_thresh(_enc,_src,_ref,_ystride,_thresh) \
145   oc_enc_frag_sad_thresh_c(_src,_ref,_ystride,_thresh)
146 #  endif
147 #  if !defined(oc_enc_frag_sad2_thresh)
148 #   define oc_enc_frag_sad2_thresh(_enc,_src,_ref1,_ref2,_ystride,_thresh) \
149   oc_enc_frag_sad2_thresh_c(_src,_ref1,_ref2,_ystride,_thresh)
150 #  endif
151 #  if !defined(oc_enc_frag_satd)
152 #   define oc_enc_frag_satd(_enc,_dc,_src,_ref,_ystride) \
153   oc_enc_frag_satd_c(_dc,_src,_ref,_ystride)
154 #  endif
155 #  if !defined(oc_enc_frag_satd2)
156 #   define oc_enc_frag_satd2(_enc,_dc,_src,_ref1,_ref2,_ystride) \
157   oc_enc_frag_satd2_c(_dc,_src,_ref1,_ref2,_ystride)
158 #  endif
159 #  if !defined(oc_enc_frag_intra_satd)
160 #   define oc_enc_frag_intra_satd(_enc,_dc,_src,_ystride) \
161   oc_enc_frag_intra_satd_c(_dc,_src,_ystride)
162 #  endif
163 #  if !defined(oc_enc_frag_ssd)
164 #   define oc_enc_frag_ssd(_enc,_src,_ref,_ystride) \
165   oc_enc_frag_ssd_c(_src,_ref,_ystride)
166 #  endif
167 #  if !defined(oc_enc_frag_border_ssd)
168 #   define oc_enc_frag_border_ssd(_enc,_src,_ref,_ystride,_mask) \
169   oc_enc_frag_border_ssd_c(_src,_ref,_ystride,_mask)
170 #  endif
171 #  if !defined(oc_enc_frag_copy2)
172 #   define oc_enc_frag_copy2(_enc,_dst,_src1,_src2,_ystride) \
173   oc_enc_frag_copy2_c(_dst,_src1,_src2,_ystride)
174 #  endif
175 #  if !defined(oc_enc_enquant_table_init)
176 #   define oc_enc_enquant_table_init(_enc,_enquant,_dequant) \
177   oc_enc_enquant_table_init_c(_enquant,_dequant)
178 #  endif
179 #  if !defined(oc_enc_enquant_table_fixup)
180 #   define oc_enc_enquant_table_fixup(_enc,_enquant,_nqis) \
181   oc_enc_enquant_table_fixup_c(_enquant,_nqis)
182 #  endif
183 #  if !defined(oc_enc_quantize)
184 #   define oc_enc_quantize(_enc,_qdct,_dct,_dequant,_enquant) \
185   oc_enc_quantize_c(_qdct,_dct,_dequant,_enquant)
186 #  endif
187 #  if !defined(oc_enc_frag_recon_intra)
188 #   define oc_enc_frag_recon_intra(_enc,_dst,_ystride,_residue) \
189   oc_frag_recon_intra_c(_dst,_ystride,_residue)
190 #  endif
191 #  if !defined(oc_enc_frag_recon_inter)
192 #   define oc_enc_frag_recon_inter(_enc,_dst,_src,_ystride,_residue) \
193   oc_frag_recon_inter_c(_dst,_src,_ystride,_residue)
194 #  endif
195 #  if !defined(oc_enc_fdct8x8)
196 #   define oc_enc_fdct8x8(_enc,_y,_x) oc_enc_fdct8x8_c(_y,_x)
197 #  endif
198 # endif
199
200
201
202 /*Constants for the packet-out state machine specific to the encoder.*/
203
204 /*Next packet to emit: Data packet, but none are ready yet.*/
205 #define OC_PACKET_EMPTY (0)
206 /*Next packet to emit: Data packet, and one is ready.*/
207 #define OC_PACKET_READY (1)
208
209 /*All features enabled.*/
210 #define OC_SP_LEVEL_SLOW          (0)
211 /*Enable early skip.*/
212 #define OC_SP_LEVEL_EARLY_SKIP    (1)
213 /*Use analysis shortcuts, single quantizer, and faster tokenization.*/
214 #define OC_SP_LEVEL_FAST_ANALYSIS (2)
215 /*Disable motion compensation.*/
216 #define OC_SP_LEVEL_NOMC          (3)
217 /*Maximum valid speed level.*/
218 #define OC_SP_LEVEL_MAX           (3)
219
220
221 /*The number of extra bits of precision at which to store rate metrics.*/
222 # define OC_BIT_SCALE  (6)
223 /*The number of extra bits of precision at which to store RMSE metrics.
224   This must be at least half OC_BIT_SCALE (rounded up).*/
225 # define OC_RMSE_SCALE (5)
226 /*The number of quantizer bins to partition statistics into.*/
227 # define OC_LOGQ_BINS  (8)
228 /*The number of SAD/SATD bins to partition statistics into.*/
229 # define OC_COMP_BINS   (24)
230 /*The number of bits of precision to drop from SAD and SATD scores
231    to assign them to a bin.*/
232 # define OC_SAD_SHIFT  (6)
233 # define OC_SATD_SHIFT (9)
234
235 /*Masking is applied by scaling the D used in R-D optimization (via rd_scale)
236    or the lambda parameter (via rd_iscale).
237   These are only equivalent within a single block; when more than one block is
238    being considered, the former is the interpretation used.*/
239
240 /*This must be at least 4 for OC_RD_SKIP_SCALE() to work below.*/
241 # define OC_RD_SCALE_BITS (12-OC_BIT_SCALE)
242 # define OC_RD_ISCALE_BITS (11)
243
244 /*This macro is applied to _ssd values with just 4 bits of headroom
245    ((15-OC_RMSE_SCALE)*2+OC_BIT_SCALE+2); since we want to allow rd_scales as
246    large as 16, and need additional fractional bits, our only recourse that
247    doesn't lose precision on blocks with very small SSDs is to use a wider
248    multiply.*/
249 # if LONG_MAX>2147483647
250 #  define OC_RD_SCALE(_ssd,_rd_scale) \
251  ((unsigned)((unsigned long)(_ssd)*(_rd_scale) \
252  +((1<<OC_RD_SCALE_BITS)>>1)>>OC_RD_SCALE_BITS))
253 # else
254 #  define OC_RD_SCALE(_ssd,_rd_scale) \
255  (((_ssd)>>OC_RD_SCALE_BITS)*(_rd_scale) \
256  +(((_ssd)&(1<<OC_RD_SCALE_BITS)-1)*(_rd_scale) \
257  +((1<<OC_RD_SCALE_BITS)>>1)>>OC_RD_SCALE_BITS))
258 # endif
259 # define OC_RD_SKIP_SCALE(_ssd,_rd_scale) \
260  ((_ssd)*(_rd_scale)+((1<<OC_RD_SCALE_BITS-4)>>1)>>OC_RD_SCALE_BITS-4)
261 # define OC_RD_ISCALE(_lambda,_rd_iscale) \
262  ((_lambda)*(_rd_iscale)+((1<<OC_RD_ISCALE_BITS)>>1)>>OC_RD_ISCALE_BITS)
263
264
265 /*The bits used for each of the MB mode codebooks.*/
266 extern const unsigned char OC_MODE_BITS[2][OC_NMODES];
267
268 /*The bits used for each of the MV codebooks.*/
269 extern const unsigned char OC_MV_BITS[2][64];
270
271 /*The minimum value that can be stored in a SB run for each codeword.
272   The last entry is the upper bound on the length of a single SB run.*/
273 extern const ogg_uint16_t  OC_SB_RUN_VAL_MIN[8];
274 /*The bits used for each SB run codeword.*/
275 extern const unsigned char OC_SB_RUN_CODE_NBITS[7];
276
277 /*The bits used for each block run length (starting with 1).*/
278 extern const unsigned char OC_BLOCK_RUN_CODE_NBITS[30];
279
280
281
282 /*Encoder specific functions with accelerated variants.*/
283 struct oc_enc_opt_vtable{
284   void     (*frag_sub)(ogg_int16_t _diff[64],const unsigned char *_src,
285    const unsigned char *_ref,int _ystride);
286   void     (*frag_sub_128)(ogg_int16_t _diff[64],
287    const unsigned char *_src,int _ystride);
288   unsigned (*frag_sad)(const unsigned char *_src,
289    const unsigned char *_ref,int _ystride);
290   unsigned (*frag_sad_thresh)(const unsigned char *_src,
291    const unsigned char *_ref,int _ystride,unsigned _thresh);
292   unsigned (*frag_sad2_thresh)(const unsigned char *_src,
293    const unsigned char *_ref1,const unsigned char *_ref2,int _ystride,
294    unsigned _thresh);
295   unsigned (*frag_satd)(unsigned *_dc,const unsigned char *_src,
296    const unsigned char *_ref,int _ystride);
297   unsigned (*frag_satd2)(unsigned *_dc,const unsigned char *_src,
298    const unsigned char *_ref1,const unsigned char *_ref2,int _ystride);
299   unsigned (*frag_intra_satd)(unsigned *_dc,const unsigned char *_src,
300    int _ystride);
301   unsigned (*frag_ssd)(const unsigned char *_src,
302    const unsigned char *_ref,int _ystride);
303   unsigned (*frag_border_ssd)(const unsigned char *_src,
304    const unsigned char *_ref,int _ystride,ogg_int64_t _mask);
305   void     (*frag_copy2)(unsigned char *_dst,
306    const unsigned char *_src1,const unsigned char *_src2,int _ystride);
307   void     (*enquant_table_init)(void *_enquant,
308    const ogg_uint16_t _dequant[64]);
309   void     (*enquant_table_fixup)(void *_enquant[3][3][2],int _nqis);
310   int      (*quantize)(ogg_int16_t _qdct[64],const ogg_int16_t _dct[64],
311    const ogg_uint16_t _dequant[64],const void *_enquant);
312   void     (*frag_recon_intra)(unsigned char *_dst,int _ystride,
313    const ogg_int16_t _residue[64]);
314   void     (*frag_recon_inter)(unsigned char *_dst,
315    const unsigned char *_src,int _ystride,const ogg_int16_t _residue[64]);
316   void     (*fdct8x8)(ogg_int16_t _y[64],const ogg_int16_t _x[64]);
317 };
318
319
320 /*Encoder specific data that varies according to which variants of the above
321    functions are used.*/
322 struct oc_enc_opt_data{
323   /*The size of a single quantizer table.
324     This must be a multiple of enquant_table_alignment.*/
325   size_t               enquant_table_size;
326   /*The alignment required for the quantizer tables.
327     This must be a positive power of two.*/
328   int                  enquant_table_alignment;
329 };
330
331
332 void oc_enc_accel_init(oc_enc_ctx *_enc);
333
334
335
336 /*Encoder-specific macroblock information.*/
337 struct oc_mb_enc_info{
338   /*Neighboring macro blocks that have MVs available from the current frame.*/
339   unsigned      cneighbors[4];
340   /*Neighboring macro blocks to use for MVs from the previous frame.*/
341   unsigned      pneighbors[4];
342   /*The number of current-frame neighbors.*/
343   unsigned char ncneighbors;
344   /*The number of previous-frame neighbors.*/
345   unsigned char npneighbors;
346   /*Flags indicating which MB modes have been refined.*/
347   unsigned char refined;
348   /*Motion vectors for a macro block for the current frame and the
349      previous two frames.
350     Each is a set of 2 vectors against OC_FRAME_GOLD and OC_FRAME_PREV, which
351      can be used to estimate constant velocity and constant acceleration
352      predictors.
353     Uninitialized MVs are (0,0).*/
354   oc_mv2        analysis_mv[3];
355   /*Current unrefined analysis MVs.*/
356   oc_mv         unref_mv[2];
357   /*Unrefined block MVs.*/
358   oc_mv         block_mv[4];
359   /*Refined block MVs.*/
360   oc_mv         ref_mv[4];
361   /*Minimum motion estimation error from the analysis stage.*/
362   ogg_uint16_t  error[2];
363   /*MB error for half-pel refinement for each frame type.*/
364   unsigned      satd[2];
365   /*Block error for half-pel refinement.*/
366   unsigned      block_satd[4];
367 };
368
369
370
371 /*State machine to estimate the opportunity cost of coding a MB mode.*/
372 struct oc_mode_scheme_chooser{
373   /*Pointers to the a list containing the index of each mode in the mode
374      alphabet used by each scheme.
375     The first entry points to the dynamic scheme0_ranks, while the remaining 7
376      point to the constant entries stored in OC_MODE_SCHEMES.*/
377   const unsigned char *mode_ranks[8];
378   /*The ranks for each mode when coded with scheme 0.
379     These are optimized so that the more frequent modes have lower ranks.*/
380   unsigned char        scheme0_ranks[OC_NMODES];
381   /*The list of modes, sorted in descending order of frequency, that
382     corresponds to the ranks above.*/
383   unsigned char        scheme0_list[OC_NMODES];
384   /*The number of times each mode has been chosen so far.*/
385   unsigned             mode_counts[OC_NMODES];
386   /*The list of mode coding schemes, sorted in ascending order of bit cost.*/
387   unsigned char        scheme_list[8];
388   /*The number of bits used by each mode coding scheme.*/
389   ptrdiff_t            scheme_bits[8];
390 };
391
392
393 void oc_mode_scheme_chooser_init(oc_mode_scheme_chooser *_chooser);
394
395
396
397 /*State to track coded block flags and their bit cost.
398   We use opportunity cost to measure the bits required to code or skip the next
399    block, using the cheaper of the cost to code it fully or partially, so long
400    as both are possible.*/
401 struct oc_fr_state{
402   /*The number of bits required for the coded block flags so far this frame.*/
403   ptrdiff_t  bits;
404   /*The length of the current run for the partial super block flag, not
405      including the current super block.*/
406   unsigned   sb_partial_count:16;
407   /*The length of the current run for the full super block flag, not
408      including the current super block.*/
409   unsigned   sb_full_count:16;
410   /*The length of the coded block flag run when the current super block
411      started.*/
412   unsigned   b_coded_count_prev:6;
413   /*The coded block flag when the current super block started.*/
414   signed int b_coded_prev:2;
415   /*The length of the current coded block flag run.*/
416   unsigned   b_coded_count:6;
417   /*The current coded block flag.*/
418   signed int b_coded:2;
419   /*The number of blocks processed in the current super block.*/
420   unsigned   b_count:5;
421   /*Whether or not it is cheaper to code the current super block partially,
422      even if it could still be coded fully.*/
423   unsigned   sb_prefer_partial:1;
424   /*Whether the last super block was coded partially.*/
425   signed int sb_partial:2;
426   /*The number of bits required for the flags for the current super block.*/
427   unsigned   sb_bits:6;
428   /*Whether the last non-partial super block was coded fully.*/
429   signed int sb_full:2;
430 };
431
432
433
434 struct oc_qii_state{
435   ptrdiff_t  bits;
436   unsigned   qi01_count:14;
437   signed int qi01:2;
438   unsigned   qi12_count:14;
439   signed int qi12:2;
440 };
441
442
443
444 /*Temporary encoder state for the analysis pipeline.*/
445 struct oc_enc_pipeline_state{
446   /*DCT coefficient storage.
447     This is kept off the stack because a) gcc can't align things on the stack
448      reliably on ARM, and b) it avoids (unintentional) data hazards between
449      ARM and NEON code.*/
450   OC_ALIGN16(ogg_int16_t dct_data[64*3]);
451   OC_ALIGN16(signed char bounding_values[256]);
452   oc_fr_state         fr[3];
453   oc_qii_state        qs[3];
454   /*Skip SSD storage for the current MCU in each plane.*/
455   unsigned           *skip_ssd[3];
456   /*Coded/uncoded fragment lists for each plane for the current MCU.*/
457   ptrdiff_t          *coded_fragis[3];
458   ptrdiff_t          *uncoded_fragis[3];
459   ptrdiff_t           ncoded_fragis[3];
460   ptrdiff_t           nuncoded_fragis[3];
461   /*The starting fragment for the current MCU in each plane.*/
462   ptrdiff_t           froffset[3];
463   /*The starting row for the current MCU in each plane.*/
464   int                 fragy0[3];
465   /*The ending row for the current MCU in each plane.*/
466   int                 fragy_end[3];
467   /*The starting superblock for the current MCU in each plane.*/
468   unsigned            sbi0[3];
469   /*The ending superblock for the current MCU in each plane.*/
470   unsigned            sbi_end[3];
471   /*The number of tokens for zzi=1 for each color plane.*/
472   int                 ndct_tokens1[3];
473   /*The outstanding eob_run count for zzi=1 for each color plane.*/
474   int                 eob_run1[3];
475   /*Whether or not the loop filter is enabled.*/
476   int                 loop_filter;
477 };
478
479
480
481 /*Statistics used to estimate R-D cost of a block in a given coding mode.
482   See modedec.h for more details.*/
483 struct oc_mode_rd{
484   /*The expected bits used by the DCT tokens, shifted by OC_BIT_SCALE.*/
485   ogg_int16_t rate;
486   /*The expected square root of the sum of squared errors, shifted by
487      OC_RMSE_SCALE.*/
488   ogg_int16_t rmse;
489 };
490
491 # if defined(OC_COLLECT_METRICS)
492 #  include "collect.h"
493 # endif
494
495
496
497 /*A 2nd order low-pass Bessel follower.
498   We use this for rate control because it has fast reaction time, but is
499    critically damped.*/
500 struct oc_iir_filter{
501   ogg_int32_t c[2];
502   ogg_int64_t g;
503   ogg_int32_t x[2];
504   ogg_int32_t y[2];
505 };
506
507
508
509 /*The 2-pass metrics associated with a single frame.*/
510 struct oc_frame_metrics{
511   /*The log base 2 of the scale factor for this frame in Q24 format.*/
512   ogg_int32_t   log_scale;
513   /*The number of application-requested duplicates of this frame.*/
514   unsigned      dup_count:31;
515   /*The frame type from pass 1.*/
516   unsigned      frame_type:1;
517 };
518
519
520
521 /*Rate control state information.*/
522 struct oc_rc_state{
523   /*The target average bits per frame.*/
524   ogg_int64_t        bits_per_frame;
525   /*The current buffer fullness (bits available to be used).*/
526   ogg_int64_t        fullness;
527   /*The target buffer fullness.
528     This is where we'd like to be by the last keyframe the appears in the next
529      buf_delay frames.*/
530   ogg_int64_t        target;
531   /*The maximum buffer fullness (total size of the buffer).*/
532   ogg_int64_t        max;
533   /*The log of the number of pixels in a frame in Q57 format.*/
534   ogg_int64_t        log_npixels;
535   /*The exponent used in the rate model in Q8 format.*/
536   unsigned           exp[2];
537   /*The number of frames to distribute the buffer usage over.*/
538   int                buf_delay;
539   /*The total drop count from the previous frame.
540     This includes duplicates explicitly requested via the
541      TH_ENCCTL_SET_DUP_COUNT API as well as frames we chose to drop ourselves.*/
542   ogg_uint32_t       prev_drop_count;
543   /*The log of an estimated scale factor used to obtain the real framerate, for
544      VFR sources or, e.g., 12 fps content doubled to 24 fps, etc.*/
545   ogg_int64_t        log_drop_scale;
546   /*The log of estimated scale factor for the rate model in Q57 format.*/
547   ogg_int64_t        log_scale[2];
548   /*The log of the target quantizer level in Q57 format.*/
549   ogg_int64_t        log_qtarget;
550   /*Will we drop frames to meet bitrate target?*/
551   unsigned char      drop_frames;
552   /*Do we respect the maximum buffer fullness?*/
553   unsigned char      cap_overflow;
554   /*Can the reservoir go negative?*/
555   unsigned char      cap_underflow;
556   /*Second-order lowpass filters to track scale and VFR.*/
557   oc_iir_filter      scalefilter[2];
558   int                inter_count;
559   int                inter_delay;
560   int                inter_delay_target;
561   oc_iir_filter      vfrfilter;
562   /*Two-pass mode state.
563     0 => 1-pass encoding.
564     1 => 1st pass of 2-pass encoding.
565     2 => 2nd pass of 2-pass encoding.*/
566   int                twopass;
567   /*Buffer for current frame metrics.*/
568   unsigned char      twopass_buffer[48];
569   /*The number of bytes in the frame metrics buffer.
570     When 2-pass encoding is enabled, this is set to 0 after each frame is
571      submitted, and must be non-zero before the next frame will be accepted.*/
572   int                twopass_buffer_bytes;
573   int                twopass_buffer_fill;
574   /*Whether or not to force the next frame to be a keyframe.*/
575   unsigned char      twopass_force_kf;
576   /*The metrics for the previous frame.*/
577   oc_frame_metrics   prev_metrics;
578   /*The metrics for the current frame.*/
579   oc_frame_metrics   cur_metrics;
580   /*The buffered metrics for future frames.*/
581   oc_frame_metrics  *frame_metrics;
582   int                nframe_metrics;
583   int                cframe_metrics;
584   /*The index of the current frame in the circular metric buffer.*/
585   int                frame_metrics_head;
586   /*The frame count of each type (keyframes, delta frames, and dup frames);
587      32 bits limits us to 2.268 years at 60 fps.*/
588   ogg_uint32_t       frames_total[3];
589   /*The number of frames of each type yet to be processed.*/
590   ogg_uint32_t       frames_left[3];
591   /*The sum of the scale values for each frame type.*/
592   ogg_int64_t        scale_sum[2];
593   /*The start of the window over which the current scale sums are taken.*/
594   int                scale_window0;
595   /*The end of the window over which the current scale sums are taken.*/
596   int                scale_window_end;
597   /*The frame count of each type in the current 2-pass window; this does not
598      include dup frames.*/
599   int                nframes[3];
600   /*The total accumulated estimation bias.*/
601   ogg_int64_t        rate_bias;
602 };
603
604
605 void oc_rc_state_init(oc_rc_state *_rc,oc_enc_ctx *_enc);
606 void oc_rc_state_clear(oc_rc_state *_rc);
607
608 void oc_enc_rc_resize(oc_enc_ctx *_enc);
609 int oc_enc_select_qi(oc_enc_ctx *_enc,int _qti,int _clamp);
610 void oc_enc_calc_lambda(oc_enc_ctx *_enc,int _frame_type);
611 int oc_enc_update_rc_state(oc_enc_ctx *_enc,
612  long _bits,int _qti,int _qi,int _trial,int _droppable);
613 int oc_enc_rc_2pass_out(oc_enc_ctx *_enc,unsigned char **_buf);
614 int oc_enc_rc_2pass_in(oc_enc_ctx *_enc,unsigned char *_buf,size_t _bytes);
615
616
617
618 /*The internal encoder state.*/
619 struct th_enc_ctx{
620   /*Shared encoder/decoder state.*/
621   oc_theora_state          state;
622   /*Buffer in which to assemble packets.*/
623   oggpack_buffer           opb;
624   /*Encoder-specific macroblock information.*/
625   oc_mb_enc_info          *mb_info;
626   /*DC coefficients after prediction.*/
627   ogg_int16_t             *frag_dc;
628   /*The list of coded macro blocks, in coded order.*/
629   unsigned                *coded_mbis;
630   /*The number of coded macro blocks.*/
631   size_t                   ncoded_mbis;
632   /*Whether or not packets are ready to be emitted.
633     This takes on negative values while there are remaining header packets to
634      be emitted, reaches 0 when the codec is ready for input, and becomes
635      positive when a frame has been processed and data packets are ready.*/
636   int                      packet_state;
637   /*The maximum distance between keyframes.*/
638   ogg_uint32_t             keyframe_frequency_force;
639   /*The number of duplicates to produce for the next frame.*/
640   ogg_uint32_t             dup_count;
641   /*The number of duplicates remaining to be emitted for the current frame.*/
642   ogg_uint32_t             nqueued_dups;
643   /*The number of duplicates emitted for the last frame.*/
644   ogg_uint32_t             prev_dup_count;
645   /*The current speed level.*/
646   int                      sp_level;
647   /*Whether or not VP3 compatibility mode has been enabled.*/
648   unsigned char            vp3_compatible;
649   /*Whether or not any INTER frames have been coded.*/
650   unsigned char            coded_inter_frame;
651   /*Whether or not previous frame was dropped.*/
652   unsigned char            prevframe_dropped;
653   /*Stores most recently chosen Huffman tables for each frame type, DC and AC
654      coefficients, and luma and chroma tokens.
655     The actual Huffman table used for a given coefficient depends not only on
656      the choice made here, but also its index in the zig-zag ordering.*/
657   unsigned char            huff_idxs[2][2][2];
658   /*Current count of bits used by each MV coding mode.*/
659   size_t                   mv_bits[2];
660   /*The mode scheme chooser for estimating mode coding costs.*/
661   oc_mode_scheme_chooser   chooser;
662   /*Temporary encoder state for the analysis pipeline.*/
663   oc_enc_pipeline_state    pipe;
664   /*The number of vertical super blocks in an MCU.*/
665   int                      mcu_nvsbs;
666   /*The SSD error for skipping each fragment in the current MCU.*/
667   unsigned                *mcu_skip_ssd;
668   /*The masking scale factors for chroma blocks in the current MCU.*/
669   ogg_uint16_t            *mcu_rd_scale;
670   ogg_uint16_t            *mcu_rd_iscale;
671   /*The DCT token lists for each coefficient and each plane.*/
672   unsigned char          **dct_tokens[3];
673   /*The extra bits associated with each DCT token.*/
674   ogg_uint16_t           **extra_bits[3];
675   /*The number of DCT tokens for each coefficient for each plane.*/
676   ptrdiff_t                ndct_tokens[3][64];
677   /*Pending EOB runs for each coefficient for each plane.*/
678   ogg_uint16_t             eob_run[3][64];
679   /*The offset of the first DCT token for each coefficient for each plane.*/
680   unsigned char            dct_token_offs[3][64];
681   /*The last DC coefficient for each plane and reference frame.*/
682   int                      dc_pred_last[3][4];
683 #if defined(OC_COLLECT_METRICS)
684   /*Fragment SATD statistics for MB mode estimation metrics.*/
685   unsigned                *frag_satd;
686   /*Fragment SSD statistics for MB mode estimation metrics.*/
687   unsigned                *frag_ssd;
688 #endif
689   /*The R-D optimization parameter.*/
690   int                      lambda;
691   /*The average block "activity" of the previous frame.*/
692   unsigned                 activity_avg;
693   /*The average MB luma of the previous frame.*/
694   unsigned                 luma_avg;
695   /*The huffman tables in use.*/
696   th_huff_code             huff_codes[TH_NHUFFMAN_TABLES][TH_NDCT_TOKENS];
697   /*The quantization parameters in use.*/
698   th_quant_info            qinfo;
699   /*The original DC coefficients saved off from the dequatization tables.*/
700   ogg_uint16_t             dequant_dc[64][3][2];
701   /*Condensed dequantization tables.*/
702   const ogg_uint16_t      *dequant[3][3][2];
703   /*Condensed quantization tables.*/
704   void                    *enquant[3][3][2];
705   /*The full set of quantization tables.*/
706   void                    *enquant_tables[64][3][2];
707   /*Storage for the quantization tables.*/
708   unsigned char           *enquant_table_data;
709   /*An "average" quantizer for each frame type (INTRA or INTER) and qi value.
710     This is used to paramterize the rate control decisions.
711     They are kept in the log domain to simplify later processing.
712     These are DCT domain quantizers, and so are scaled by an additional factor
713      of 4 from the pixel domain.*/
714   ogg_int64_t              log_qavg[2][64];
715   /*The "average" quantizer futher partitioned by color plane.
716     This is used to parameterize mode decision.
717     These are DCT domain quantizers, and so are scaled by an additional factor
718      of 4 from the pixel domain.*/
719   ogg_int16_t              log_plq[64][3][2];
720   /*The R-D scale factors to apply to chroma blocks for a given frame type
721      (INTRA or INTER) and qi value.
722     The first is the "D" modifier (rd_scale), while the second is the "lambda"
723      modifier (rd_iscale).*/
724   ogg_uint16_t             chroma_rd_scale[2][64][2];
725   /*The interpolated mode decision R-D lookup tables for the current
726      quantizers, color plane, and quantization type.*/
727   oc_mode_rd               mode_rd[3][3][2][OC_COMP_BINS];
728   /*The buffer state used to drive rate control.*/
729   oc_rc_state              rc;
730 # if defined(OC_ENC_USE_VTABLE)
731   /*Table for encoder acceleration functions.*/
732   oc_enc_opt_vtable        opt_vtable;
733 # endif
734   /*Table for encoder data used by accelerated functions.*/
735   oc_enc_opt_data          opt_data;
736 };
737
738
739 void oc_enc_analyze_intra(oc_enc_ctx *_enc,int _recode);
740 int oc_enc_analyze_inter(oc_enc_ctx *_enc,int _allow_keyframe,int _recode);
741
742
743
744 /*Perform fullpel motion search for a single MB against both reference frames.*/
745 void oc_mcenc_search(oc_enc_ctx *_enc,int _mbi);
746 /*Refine a MB MV for one frame.*/
747 void oc_mcenc_refine1mv(oc_enc_ctx *_enc,int _mbi,int _frame);
748 /*Refine the block MVs.*/
749 void oc_mcenc_refine4mv(oc_enc_ctx *_enc,int _mbi);
750
751
752
753 /*Used to rollback a tokenlog transaction when we retroactively decide to skip
754    a fragment.
755   A checkpoint is taken right before each token is added.*/
756 struct oc_token_checkpoint{
757   /*The color plane the token was added to.*/
758   unsigned char pli;
759   /*The zig-zag index the token was added to.*/
760   unsigned char zzi;
761   /*The outstanding EOB run count before the token was added.*/
762   ogg_uint16_t  eob_run;
763   /*The token count before the token was added.*/
764   ptrdiff_t     ndct_tokens;
765 };
766
767
768
769 void oc_enc_tokenize_start(oc_enc_ctx *_enc);
770 int oc_enc_tokenize_ac(oc_enc_ctx *_enc,int _pli,ptrdiff_t _fragi,
771  ogg_int16_t *_qdct_out,const ogg_int16_t *_qdct_in,
772  const ogg_uint16_t *_dequant,const ogg_int16_t *_dct,
773  int _zzi,oc_token_checkpoint **_stack,int _lambda,int _acmin);
774 int oc_enc_tokenize_ac_fast(oc_enc_ctx *_enc,int _pli,ptrdiff_t _fragi,
775  ogg_int16_t *_qdct_out,const ogg_int16_t *_qdct_in,
776  const ogg_uint16_t *_dequant,const ogg_int16_t *_dct,
777  int _zzi,oc_token_checkpoint **_stack,int _lambda,int _acmin);
778 void oc_enc_tokenlog_rollback(oc_enc_ctx *_enc,
779  const oc_token_checkpoint *_stack,int _n);
780 void oc_enc_pred_dc_frag_rows(oc_enc_ctx *_enc,
781  int _pli,int _fragy0,int _frag_yend);
782 void oc_enc_tokenize_dc_frag_list(oc_enc_ctx *_enc,int _pli,
783  const ptrdiff_t *_coded_fragis,ptrdiff_t _ncoded_fragis,
784  int _prev_ndct_tokens1,int _prev_eob_run1);
785 void oc_enc_tokenize_finish(oc_enc_ctx *_enc);
786
787
788
789 /*Utility routine to encode one of the header packets.*/
790 int oc_state_flushheader(oc_theora_state *_state,int *_packet_state,
791  oggpack_buffer *_opb,const th_quant_info *_qinfo,
792  const th_huff_code _codes[TH_NHUFFMAN_TABLES][TH_NDCT_TOKENS],
793  const char *_vendor,th_comment *_tc,ogg_packet *_op);
794
795
796
797 /*Default pure-C implementations of encoder-specific accelerated functions.*/
798 void oc_enc_accel_init_c(oc_enc_ctx *_enc);
799
800 void oc_enc_frag_sub_c(ogg_int16_t _diff[64],
801  const unsigned char *_src,const unsigned char *_ref,int _ystride);
802 void oc_enc_frag_sub_128_c(ogg_int16_t _diff[64],
803  const unsigned char *_src,int _ystride);
804 unsigned oc_enc_frag_sad_c(const unsigned char *_src,
805  const unsigned char *_ref,int _ystride);
806 unsigned oc_enc_frag_sad_thresh_c(const unsigned char *_src,
807  const unsigned char *_ref,int _ystride,unsigned _thresh);
808 unsigned oc_enc_frag_sad2_thresh_c(const unsigned char *_src,
809  const unsigned char *_ref1,const unsigned char *_ref2,int _ystride,
810  unsigned _thresh);
811 unsigned oc_enc_frag_satd_c(unsigned *_dc,const unsigned char *_src,
812  const unsigned char *_ref,int _ystride);
813 unsigned oc_enc_frag_satd2_c(unsigned *_dc,const unsigned char *_src,
814  const unsigned char *_ref1,const unsigned char *_ref2,int _ystride);
815 unsigned oc_enc_frag_intra_satd_c(unsigned *_dc,const unsigned char *_src,
816  int _ystride);
817 unsigned oc_enc_frag_ssd_c(const unsigned char *_src,
818  const unsigned char *_ref,int _ystride);
819 unsigned oc_enc_frag_border_ssd_c(const unsigned char *_src,
820  const unsigned char *_ref,int _ystride,ogg_int64_t _mask);
821 void oc_enc_frag_copy2_c(unsigned char *_dst,
822  const unsigned char *_src1,const unsigned char *_src2,int _ystride);
823 void oc_enc_enquant_table_init_c(void *_enquant,
824  const ogg_uint16_t _dequant[64]);
825 void oc_enc_enquant_table_fixup_c(void *_enquant[3][3][2],int _nqis);
826 int oc_enc_quantize_c(ogg_int16_t _qdct[64],const ogg_int16_t _dct[64],
827  const ogg_uint16_t _dequant[64],const void *_enquant);
828 void oc_enc_fdct8x8_c(ogg_int16_t _y[64],const ogg_int16_t _x[64]);
829
830 #endif