Make the SATD functions return the signed DC value instead of abs(dc).
[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)(int *_dc,const unsigned char *_src,
296    const unsigned char *_ref,int _ystride);
297   unsigned (*frag_satd2)(int *_dc,const unsigned char *_src,
298    const unsigned char *_ref1,const unsigned char *_ref2,int _ystride);
299   unsigned (*frag_intra_satd)(int *_dc,const unsigned char *_src,int _ystride);
300   unsigned (*frag_ssd)(const unsigned char *_src,
301    const unsigned char *_ref,int _ystride);
302   unsigned (*frag_border_ssd)(const unsigned char *_src,
303    const unsigned char *_ref,int _ystride,ogg_int64_t _mask);
304   void     (*frag_copy2)(unsigned char *_dst,
305    const unsigned char *_src1,const unsigned char *_src2,int _ystride);
306   void     (*enquant_table_init)(void *_enquant,
307    const ogg_uint16_t _dequant[64]);
308   void     (*enquant_table_fixup)(void *_enquant[3][3][2],int _nqis);
309   int      (*quantize)(ogg_int16_t _qdct[64],const ogg_int16_t _dct[64],
310    const ogg_uint16_t _dequant[64],const void *_enquant);
311   void     (*frag_recon_intra)(unsigned char *_dst,int _ystride,
312    const ogg_int16_t _residue[64]);
313   void     (*frag_recon_inter)(unsigned char *_dst,
314    const unsigned char *_src,int _ystride,const ogg_int16_t _residue[64]);
315   void     (*fdct8x8)(ogg_int16_t _y[64],const ogg_int16_t _x[64]);
316 };
317
318
319 /*Encoder specific data that varies according to which variants of the above
320    functions are used.*/
321 struct oc_enc_opt_data{
322   /*The size of a single quantizer table.
323     This must be a multiple of enquant_table_alignment.*/
324   size_t               enquant_table_size;
325   /*The alignment required for the quantizer tables.
326     This must be a positive power of two.*/
327   int                  enquant_table_alignment;
328 };
329
330
331 void oc_enc_accel_init(oc_enc_ctx *_enc);
332
333
334
335 /*Encoder-specific macroblock information.*/
336 struct oc_mb_enc_info{
337   /*Neighboring macro blocks that have MVs available from the current frame.*/
338   unsigned      cneighbors[4];
339   /*Neighboring macro blocks to use for MVs from the previous frame.*/
340   unsigned      pneighbors[4];
341   /*The number of current-frame neighbors.*/
342   unsigned char ncneighbors;
343   /*The number of previous-frame neighbors.*/
344   unsigned char npneighbors;
345   /*Flags indicating which MB modes have been refined.*/
346   unsigned char refined;
347   /*Motion vectors for a macro block for the current frame and the
348      previous two frames.
349     Each is a set of 2 vectors against OC_FRAME_GOLD and OC_FRAME_PREV, which
350      can be used to estimate constant velocity and constant acceleration
351      predictors.
352     Uninitialized MVs are (0,0).*/
353   oc_mv2        analysis_mv[3];
354   /*Current unrefined analysis MVs.*/
355   oc_mv         unref_mv[2];
356   /*Unrefined block MVs.*/
357   oc_mv         block_mv[4];
358   /*Refined block MVs.*/
359   oc_mv         ref_mv[4];
360   /*Minimum motion estimation error from the analysis stage.*/
361   ogg_uint16_t  error[2];
362   /*MB error for half-pel refinement for each frame type.*/
363   unsigned      satd[2];
364   /*Block error for half-pel refinement.*/
365   unsigned      block_satd[4];
366 };
367
368
369
370 /*State machine to estimate the opportunity cost of coding a MB mode.*/
371 struct oc_mode_scheme_chooser{
372   /*Pointers to the a list containing the index of each mode in the mode
373      alphabet used by each scheme.
374     The first entry points to the dynamic scheme0_ranks, while the remaining 7
375      point to the constant entries stored in OC_MODE_SCHEMES.*/
376   const unsigned char *mode_ranks[8];
377   /*The ranks for each mode when coded with scheme 0.
378     These are optimized so that the more frequent modes have lower ranks.*/
379   unsigned char        scheme0_ranks[OC_NMODES];
380   /*The list of modes, sorted in descending order of frequency, that
381     corresponds to the ranks above.*/
382   unsigned char        scheme0_list[OC_NMODES];
383   /*The number of times each mode has been chosen so far.*/
384   unsigned             mode_counts[OC_NMODES];
385   /*The list of mode coding schemes, sorted in ascending order of bit cost.*/
386   unsigned char        scheme_list[8];
387   /*The number of bits used by each mode coding scheme.*/
388   ptrdiff_t            scheme_bits[8];
389 };
390
391
392 void oc_mode_scheme_chooser_init(oc_mode_scheme_chooser *_chooser);
393
394
395
396 /*State to track coded block flags and their bit cost.
397   We use opportunity cost to measure the bits required to code or skip the next
398    block, using the cheaper of the cost to code it fully or partially, so long
399    as both are possible.*/
400 struct oc_fr_state{
401   /*The number of bits required for the coded block flags so far this frame.*/
402   ptrdiff_t  bits;
403   /*The length of the current run for the partial super block flag, not
404      including the current super block.*/
405   unsigned   sb_partial_count:16;
406   /*The length of the current run for the full super block flag, not
407      including the current super block.*/
408   unsigned   sb_full_count:16;
409   /*The length of the coded block flag run when the current super block
410      started.*/
411   unsigned   b_coded_count_prev:6;
412   /*The coded block flag when the current super block started.*/
413   signed int b_coded_prev:2;
414   /*The length of the current coded block flag run.*/
415   unsigned   b_coded_count:6;
416   /*The current coded block flag.*/
417   signed int b_coded:2;
418   /*The number of blocks processed in the current super block.*/
419   unsigned   b_count:5;
420   /*Whether or not it is cheaper to code the current super block partially,
421      even if it could still be coded fully.*/
422   unsigned   sb_prefer_partial:1;
423   /*Whether the last super block was coded partially.*/
424   signed int sb_partial:2;
425   /*The number of bits required for the flags for the current super block.*/
426   unsigned   sb_bits:6;
427   /*Whether the last non-partial super block was coded fully.*/
428   signed int sb_full:2;
429 };
430
431
432
433 struct oc_qii_state{
434   ptrdiff_t  bits;
435   unsigned   qi01_count:14;
436   signed int qi01:2;
437   unsigned   qi12_count:14;
438   signed int qi12:2;
439 };
440
441
442
443 /*Temporary encoder state for the analysis pipeline.*/
444 struct oc_enc_pipeline_state{
445   /*DCT coefficient storage.
446     This is kept off the stack because a) gcc can't align things on the stack
447      reliably on ARM, and b) it avoids (unintentional) data hazards between
448      ARM and NEON code.*/
449   OC_ALIGN16(ogg_int16_t dct_data[64*3]);
450   OC_ALIGN16(signed char bounding_values[256]);
451   oc_fr_state         fr[3];
452   oc_qii_state        qs[3];
453   /*Skip SSD storage for the current MCU in each plane.*/
454   unsigned           *skip_ssd[3];
455   /*Coded/uncoded fragment lists for each plane for the current MCU.*/
456   ptrdiff_t          *coded_fragis[3];
457   ptrdiff_t          *uncoded_fragis[3];
458   ptrdiff_t           ncoded_fragis[3];
459   ptrdiff_t           nuncoded_fragis[3];
460   /*The starting fragment for the current MCU in each plane.*/
461   ptrdiff_t           froffset[3];
462   /*The starting row for the current MCU in each plane.*/
463   int                 fragy0[3];
464   /*The ending row for the current MCU in each plane.*/
465   int                 fragy_end[3];
466   /*The starting superblock for the current MCU in each plane.*/
467   unsigned            sbi0[3];
468   /*The ending superblock for the current MCU in each plane.*/
469   unsigned            sbi_end[3];
470   /*The number of tokens for zzi=1 for each color plane.*/
471   int                 ndct_tokens1[3];
472   /*The outstanding eob_run count for zzi=1 for each color plane.*/
473   int                 eob_run1[3];
474   /*Whether or not the loop filter is enabled.*/
475   int                 loop_filter;
476 };
477
478
479
480 /*Statistics used to estimate R-D cost of a block in a given coding mode.
481   See modedec.h for more details.*/
482 struct oc_mode_rd{
483   /*The expected bits used by the DCT tokens, shifted by OC_BIT_SCALE.*/
484   ogg_int16_t rate;
485   /*The expected square root of the sum of squared errors, shifted by
486      OC_RMSE_SCALE.*/
487   ogg_int16_t rmse;
488 };
489
490 # if defined(OC_COLLECT_METRICS)
491 #  include "collect.h"
492 # endif
493
494
495
496 /*A 2nd order low-pass Bessel follower.
497   We use this for rate control because it has fast reaction time, but is
498    critically damped.*/
499 struct oc_iir_filter{
500   ogg_int32_t c[2];
501   ogg_int64_t g;
502   ogg_int32_t x[2];
503   ogg_int32_t y[2];
504 };
505
506
507
508 /*The 2-pass metrics associated with a single frame.*/
509 struct oc_frame_metrics{
510   /*The log base 2 of the scale factor for this frame in Q24 format.*/
511   ogg_int32_t   log_scale;
512   /*The number of application-requested duplicates of this frame.*/
513   unsigned      dup_count:31;
514   /*The frame type from pass 1.*/
515   unsigned      frame_type:1;
516 };
517
518
519
520 /*Rate control state information.*/
521 struct oc_rc_state{
522   /*The target average bits per frame.*/
523   ogg_int64_t        bits_per_frame;
524   /*The current buffer fullness (bits available to be used).*/
525   ogg_int64_t        fullness;
526   /*The target buffer fullness.
527     This is where we'd like to be by the last keyframe the appears in the next
528      buf_delay frames.*/
529   ogg_int64_t        target;
530   /*The maximum buffer fullness (total size of the buffer).*/
531   ogg_int64_t        max;
532   /*The log of the number of pixels in a frame in Q57 format.*/
533   ogg_int64_t        log_npixels;
534   /*The exponent used in the rate model in Q8 format.*/
535   unsigned           exp[2];
536   /*The number of frames to distribute the buffer usage over.*/
537   int                buf_delay;
538   /*The total drop count from the previous frame.
539     This includes duplicates explicitly requested via the
540      TH_ENCCTL_SET_DUP_COUNT API as well as frames we chose to drop ourselves.*/
541   ogg_uint32_t       prev_drop_count;
542   /*The log of an estimated scale factor used to obtain the real framerate, for
543      VFR sources or, e.g., 12 fps content doubled to 24 fps, etc.*/
544   ogg_int64_t        log_drop_scale;
545   /*The log of estimated scale factor for the rate model in Q57 format.*/
546   ogg_int64_t        log_scale[2];
547   /*The log of the target quantizer level in Q57 format.*/
548   ogg_int64_t        log_qtarget;
549   /*Will we drop frames to meet bitrate target?*/
550   unsigned char      drop_frames;
551   /*Do we respect the maximum buffer fullness?*/
552   unsigned char      cap_overflow;
553   /*Can the reservoir go negative?*/
554   unsigned char      cap_underflow;
555   /*Second-order lowpass filters to track scale and VFR.*/
556   oc_iir_filter      scalefilter[2];
557   int                inter_count;
558   int                inter_delay;
559   int                inter_delay_target;
560   oc_iir_filter      vfrfilter;
561   /*Two-pass mode state.
562     0 => 1-pass encoding.
563     1 => 1st pass of 2-pass encoding.
564     2 => 2nd pass of 2-pass encoding.*/
565   int                twopass;
566   /*Buffer for current frame metrics.*/
567   unsigned char      twopass_buffer[48];
568   /*The number of bytes in the frame metrics buffer.
569     When 2-pass encoding is enabled, this is set to 0 after each frame is
570      submitted, and must be non-zero before the next frame will be accepted.*/
571   int                twopass_buffer_bytes;
572   int                twopass_buffer_fill;
573   /*Whether or not to force the next frame to be a keyframe.*/
574   unsigned char      twopass_force_kf;
575   /*The metrics for the previous frame.*/
576   oc_frame_metrics   prev_metrics;
577   /*The metrics for the current frame.*/
578   oc_frame_metrics   cur_metrics;
579   /*The buffered metrics for future frames.*/
580   oc_frame_metrics  *frame_metrics;
581   int                nframe_metrics;
582   int                cframe_metrics;
583   /*The index of the current frame in the circular metric buffer.*/
584   int                frame_metrics_head;
585   /*The frame count of each type (keyframes, delta frames, and dup frames);
586      32 bits limits us to 2.268 years at 60 fps.*/
587   ogg_uint32_t       frames_total[3];
588   /*The number of frames of each type yet to be processed.*/
589   ogg_uint32_t       frames_left[3];
590   /*The sum of the scale values for each frame type.*/
591   ogg_int64_t        scale_sum[2];
592   /*The start of the window over which the current scale sums are taken.*/
593   int                scale_window0;
594   /*The end of the window over which the current scale sums are taken.*/
595   int                scale_window_end;
596   /*The frame count of each type in the current 2-pass window; this does not
597      include dup frames.*/
598   int                nframes[3];
599   /*The total accumulated estimation bias.*/
600   ogg_int64_t        rate_bias;
601 };
602
603
604 void oc_rc_state_init(oc_rc_state *_rc,oc_enc_ctx *_enc);
605 void oc_rc_state_clear(oc_rc_state *_rc);
606
607 void oc_enc_rc_resize(oc_enc_ctx *_enc);
608 int oc_enc_select_qi(oc_enc_ctx *_enc,int _qti,int _clamp);
609 void oc_enc_calc_lambda(oc_enc_ctx *_enc,int _frame_type);
610 int oc_enc_update_rc_state(oc_enc_ctx *_enc,
611  long _bits,int _qti,int _qi,int _trial,int _droppable);
612 int oc_enc_rc_2pass_out(oc_enc_ctx *_enc,unsigned char **_buf);
613 int oc_enc_rc_2pass_in(oc_enc_ctx *_enc,unsigned char *_buf,size_t _bytes);
614
615
616
617 /*The internal encoder state.*/
618 struct th_enc_ctx{
619   /*Shared encoder/decoder state.*/
620   oc_theora_state          state;
621   /*Buffer in which to assemble packets.*/
622   oggpack_buffer           opb;
623   /*Encoder-specific macroblock information.*/
624   oc_mb_enc_info          *mb_info;
625   /*DC coefficients after prediction.*/
626   ogg_int16_t             *frag_dc;
627   /*The list of coded macro blocks, in coded order.*/
628   unsigned                *coded_mbis;
629   /*The number of coded macro blocks.*/
630   size_t                   ncoded_mbis;
631   /*Whether or not packets are ready to be emitted.
632     This takes on negative values while there are remaining header packets to
633      be emitted, reaches 0 when the codec is ready for input, and becomes
634      positive when a frame has been processed and data packets are ready.*/
635   int                      packet_state;
636   /*The maximum distance between keyframes.*/
637   ogg_uint32_t             keyframe_frequency_force;
638   /*The number of duplicates to produce for the next frame.*/
639   ogg_uint32_t             dup_count;
640   /*The number of duplicates remaining to be emitted for the current frame.*/
641   ogg_uint32_t             nqueued_dups;
642   /*The number of duplicates emitted for the last frame.*/
643   ogg_uint32_t             prev_dup_count;
644   /*The current speed level.*/
645   int                      sp_level;
646   /*Whether or not VP3 compatibility mode has been enabled.*/
647   unsigned char            vp3_compatible;
648   /*Whether or not any INTER frames have been coded.*/
649   unsigned char            coded_inter_frame;
650   /*Whether or not previous frame was dropped.*/
651   unsigned char            prevframe_dropped;
652   /*Stores most recently chosen Huffman tables for each frame type, DC and AC
653      coefficients, and luma and chroma tokens.
654     The actual Huffman table used for a given coefficient depends not only on
655      the choice made here, but also its index in the zig-zag ordering.*/
656   unsigned char            huff_idxs[2][2][2];
657   /*Current count of bits used by each MV coding mode.*/
658   size_t                   mv_bits[2];
659   /*The mode scheme chooser for estimating mode coding costs.*/
660   oc_mode_scheme_chooser   chooser;
661   /*Temporary encoder state for the analysis pipeline.*/
662   oc_enc_pipeline_state    pipe;
663   /*The number of vertical super blocks in an MCU.*/
664   int                      mcu_nvsbs;
665   /*The SSD error for skipping each fragment in the current MCU.*/
666   unsigned                *mcu_skip_ssd;
667   /*The masking scale factors for chroma blocks in the current MCU.*/
668   ogg_uint16_t            *mcu_rd_scale;
669   ogg_uint16_t            *mcu_rd_iscale;
670   /*The DCT token lists for each coefficient and each plane.*/
671   unsigned char          **dct_tokens[3];
672   /*The extra bits associated with each DCT token.*/
673   ogg_uint16_t           **extra_bits[3];
674   /*The number of DCT tokens for each coefficient for each plane.*/
675   ptrdiff_t                ndct_tokens[3][64];
676   /*Pending EOB runs for each coefficient for each plane.*/
677   ogg_uint16_t             eob_run[3][64];
678   /*The offset of the first DCT token for each coefficient for each plane.*/
679   unsigned char            dct_token_offs[3][64];
680   /*The last DC coefficient for each plane and reference frame.*/
681   int                      dc_pred_last[3][4];
682 #if defined(OC_COLLECT_METRICS)
683   /*Fragment SATD statistics for MB mode estimation metrics.*/
684   unsigned                *frag_satd;
685   /*Fragment SSD statistics for MB mode estimation metrics.*/
686   unsigned                *frag_ssd;
687 #endif
688   /*The R-D optimization parameter.*/
689   int                      lambda;
690   /*The average block "activity" of the previous frame.*/
691   unsigned                 activity_avg;
692   /*The average MB luma of the previous frame.*/
693   unsigned                 luma_avg;
694   /*The huffman tables in use.*/
695   th_huff_code             huff_codes[TH_NHUFFMAN_TABLES][TH_NDCT_TOKENS];
696   /*The quantization parameters in use.*/
697   th_quant_info            qinfo;
698   /*The original DC coefficients saved off from the dequatization tables.*/
699   ogg_uint16_t             dequant_dc[64][3][2];
700   /*Condensed dequantization tables.*/
701   const ogg_uint16_t      *dequant[3][3][2];
702   /*Condensed quantization tables.*/
703   void                    *enquant[3][3][2];
704   /*The full set of quantization tables.*/
705   void                    *enquant_tables[64][3][2];
706   /*Storage for the quantization tables.*/
707   unsigned char           *enquant_table_data;
708   /*An "average" quantizer for each frame type (INTRA or INTER) and qi value.
709     This is used to paramterize the rate control decisions.
710     They are kept in the log domain to simplify later processing.
711     These are DCT domain quantizers, and so are scaled by an additional factor
712      of 4 from the pixel domain.*/
713   ogg_int64_t              log_qavg[2][64];
714   /*The "average" quantizer futher partitioned by color plane.
715     This is used to parameterize mode decision.
716     These are DCT domain quantizers, and so are scaled by an additional factor
717      of 4 from the pixel domain.*/
718   ogg_int16_t              log_plq[64][3][2];
719   /*The R-D scale factors to apply to chroma blocks for a given frame type
720      (INTRA or INTER) and qi value.
721     The first is the "D" modifier (rd_scale), while the second is the "lambda"
722      modifier (rd_iscale).*/
723   ogg_uint16_t             chroma_rd_scale[2][64][2];
724   /*The interpolated mode decision R-D lookup tables for the current
725      quantizers, color plane, and quantization type.*/
726   oc_mode_rd               mode_rd[3][3][2][OC_COMP_BINS];
727   /*The buffer state used to drive rate control.*/
728   oc_rc_state              rc;
729 # if defined(OC_ENC_USE_VTABLE)
730   /*Table for encoder acceleration functions.*/
731   oc_enc_opt_vtable        opt_vtable;
732 # endif
733   /*Table for encoder data used by accelerated functions.*/
734   oc_enc_opt_data          opt_data;
735 };
736
737
738 void oc_enc_analyze_intra(oc_enc_ctx *_enc,int _recode);
739 int oc_enc_analyze_inter(oc_enc_ctx *_enc,int _allow_keyframe,int _recode);
740
741
742
743 /*Perform fullpel motion search for a single MB against both reference frames.*/
744 void oc_mcenc_search(oc_enc_ctx *_enc,int _mbi);
745 /*Refine a MB MV for one frame.*/
746 void oc_mcenc_refine1mv(oc_enc_ctx *_enc,int _mbi,int _frame);
747 /*Refine the block MVs.*/
748 void oc_mcenc_refine4mv(oc_enc_ctx *_enc,int _mbi);
749
750
751
752 /*Used to rollback a tokenlog transaction when we retroactively decide to skip
753    a fragment.
754   A checkpoint is taken right before each token is added.*/
755 struct oc_token_checkpoint{
756   /*The color plane the token was added to.*/
757   unsigned char pli;
758   /*The zig-zag index the token was added to.*/
759   unsigned char zzi;
760   /*The outstanding EOB run count before the token was added.*/
761   ogg_uint16_t  eob_run;
762   /*The token count before the token was added.*/
763   ptrdiff_t     ndct_tokens;
764 };
765
766
767
768 void oc_enc_tokenize_start(oc_enc_ctx *_enc);
769 int oc_enc_tokenize_ac(oc_enc_ctx *_enc,int _pli,ptrdiff_t _fragi,
770  ogg_int16_t *_qdct_out,const ogg_int16_t *_qdct_in,
771  const ogg_uint16_t *_dequant,const ogg_int16_t *_dct,
772  int _zzi,oc_token_checkpoint **_stack,int _lambda,int _acmin);
773 int oc_enc_tokenize_ac_fast(oc_enc_ctx *_enc,int _pli,ptrdiff_t _fragi,
774  ogg_int16_t *_qdct_out,const ogg_int16_t *_qdct_in,
775  const ogg_uint16_t *_dequant,const ogg_int16_t *_dct,
776  int _zzi,oc_token_checkpoint **_stack,int _lambda,int _acmin);
777 void oc_enc_tokenlog_rollback(oc_enc_ctx *_enc,
778  const oc_token_checkpoint *_stack,int _n);
779 void oc_enc_pred_dc_frag_rows(oc_enc_ctx *_enc,
780  int _pli,int _fragy0,int _frag_yend);
781 void oc_enc_tokenize_dc_frag_list(oc_enc_ctx *_enc,int _pli,
782  const ptrdiff_t *_coded_fragis,ptrdiff_t _ncoded_fragis,
783  int _prev_ndct_tokens1,int _prev_eob_run1);
784 void oc_enc_tokenize_finish(oc_enc_ctx *_enc);
785
786
787
788 /*Utility routine to encode one of the header packets.*/
789 int oc_state_flushheader(oc_theora_state *_state,int *_packet_state,
790  oggpack_buffer *_opb,const th_quant_info *_qinfo,
791  const th_huff_code _codes[TH_NHUFFMAN_TABLES][TH_NDCT_TOKENS],
792  const char *_vendor,th_comment *_tc,ogg_packet *_op);
793
794
795
796 /*Default pure-C implementations of encoder-specific accelerated functions.*/
797 void oc_enc_accel_init_c(oc_enc_ctx *_enc);
798
799 void oc_enc_frag_sub_c(ogg_int16_t _diff[64],
800  const unsigned char *_src,const unsigned char *_ref,int _ystride);
801 void oc_enc_frag_sub_128_c(ogg_int16_t _diff[64],
802  const unsigned char *_src,int _ystride);
803 unsigned oc_enc_frag_sad_c(const unsigned char *_src,
804  const unsigned char *_ref,int _ystride);
805 unsigned oc_enc_frag_sad_thresh_c(const unsigned char *_src,
806  const unsigned char *_ref,int _ystride,unsigned _thresh);
807 unsigned oc_enc_frag_sad2_thresh_c(const unsigned char *_src,
808  const unsigned char *_ref1,const unsigned char *_ref2,int _ystride,
809  unsigned _thresh);
810 unsigned oc_enc_frag_satd_c(int *_dc,const unsigned char *_src,
811  const unsigned char *_ref,int _ystride);
812 unsigned oc_enc_frag_satd2_c(int *_dc,const unsigned char *_src,
813  const unsigned char *_ref1,const unsigned char *_ref2,int _ystride);
814 unsigned oc_enc_frag_intra_satd_c(int *_dc,
815  const unsigned char *_src,int _ystride);
816 unsigned oc_enc_frag_ssd_c(const unsigned char *_src,
817  const unsigned char *_ref,int _ystride);
818 unsigned oc_enc_frag_border_ssd_c(const unsigned char *_src,
819  const unsigned char *_ref,int _ystride,ogg_int64_t _mask);
820 void oc_enc_frag_copy2_c(unsigned char *_dst,
821  const unsigned char *_src1,const unsigned char *_src2,int _ystride);
822 void oc_enc_enquant_table_init_c(void *_enquant,
823  const ogg_uint16_t _dequant[64]);
824 void oc_enc_enquant_table_fixup_c(void *_enquant[3][3][2],int _nqis);
825 int oc_enc_quantize_c(ogg_int16_t _qdct[64],const ogg_int16_t _dct[64],
826  const ogg_uint16_t _dequant[64],const void *_enquant);
827 void oc_enc_fdct8x8_c(ogg_int16_t _y[64],const ogg_int16_t _x[64]);
828
829 #endif