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