1 
2 #ifndef __SCHRO_ENCODER_H__
3 #define __SCHRO_ENCODER_H__
4 
5 #include <schroedinger/schroutils.h>
6 #include <schroedinger/schropack.h>
7 #include <schroedinger/schrobuffer.h>
8 #include <schroedinger/schroparams.h>
9 #include <schroedinger/schroframe.h>
10 #include <schroedinger/schroasync.h>
11 #include <schroedinger/schroqueue.h>
12 #include <schroedinger/schromotion.h>
13 #include <schroedinger/schrohistogram.h>
14 #include <schroedinger/schrolist.h>
15 
16 SCHRO_BEGIN_DECLS
17 
18 typedef struct _SchroEncoder SchroEncoder;
19 typedef struct _SchroEncoderFrame SchroEncoderFrame;
20 typedef struct _SchroEncoderSetting SchroEncoderSetting;
21 
22 typedef enum {
23   SCHRO_STATE_NEED_FRAME,
24   SCHRO_STATE_HAVE_BUFFER,
25   SCHRO_STATE_AGAIN,
26   SCHRO_STATE_END_OF_STREAM
27 } SchroStateEnum;
28 
29 #ifdef SCHRO_ENABLE_UNSTABLE_API
30 typedef enum {
31   SCHRO_ENCODER_FRAME_STAGE_NEW = 0,
32   SCHRO_ENCODER_FRAME_STAGE_ANALYSE,
33   SCHRO_ENCODER_FRAME_STAGE_SC_DETECT_1,
34   SCHRO_ENCODER_FRAME_STAGE_SC_DETECT_2,
35   SCHRO_ENCODER_FRAME_STAGE_HAVE_GOP,
36   SCHRO_ENCODER_FRAME_STAGE_HAVE_PARAMS,
37   SCHRO_ENCODER_FRAME_STAGE_PREDICT_ROUGH,
38   SCHRO_ENCODER_FRAME_STAGE_PREDICT_PEL,
39   SCHRO_ENCODER_FRAME_STAGE_PREDICT_SUBPEL,
40   SCHRO_ENCODER_FRAME_STAGE_MODE_DECISION,
41   SCHRO_ENCODER_FRAME_STAGE_HAVE_REFS,
42   SCHRO_ENCODER_FRAME_STAGE_HAVE_QUANTS,
43   SCHRO_ENCODER_FRAME_STAGE_ENCODING,
44   SCHRO_ENCODER_FRAME_STAGE_RECONSTRUCT,
45   SCHRO_ENCODER_FRAME_STAGE_POSTANALYSE,
46   SCHRO_ENCODER_FRAME_STAGE_DONE,
47   SCHRO_ENCODER_FRAME_STAGE_FREE,
48   SCHRO_ENCODER_FRAME_STAGE_LAST /* this should be last */
49 } SchroEncoderFrameStateEnum;
50 #endif
51 
52 typedef enum {
53   SCHRO_ENCODER_PERCEPTUAL_CONSTANT,
54   SCHRO_ENCODER_PERCEPTUAL_CCIR959,
55   SCHRO_ENCODER_PERCEPTUAL_MOO,
56   SCHRO_ENCODER_PERCEPTUAL_MANOS_SAKRISON
57 } SchroEncoderPerceptualEnum;
58 
59 typedef enum {
60   SCHRO_ENCODER_RATE_CONTROL_CONSTANT_NOISE_THRESHOLD,
61   SCHRO_ENCODER_RATE_CONTROL_CONSTANT_BITRATE,
62   SCHRO_ENCODER_RATE_CONTROL_LOW_DELAY,
63   SCHRO_ENCODER_RATE_CONTROL_LOSSLESS,
64   SCHRO_ENCODER_RATE_CONTROL_CONSTANT_LAMBDA,
65   SCHRO_ENCODER_RATE_CONTROL_CONSTANT_ERROR,
66   SCHRO_ENCODER_RATE_CONTROL_CONSTANT_QUALITY
67 } SchroEncoderRateControlEnum;
68 
69 typedef enum {
70   SCHRO_ENCODER_GOP_ADAPTIVE,
71   SCHRO_ENCODER_GOP_INTRA_ONLY,
72   SCHRO_ENCODER_GOP_BACKREF,
73   SCHRO_ENCODER_GOP_CHAINED_BACKREF,
74   SCHRO_ENCODER_GOP_BIREF,
75   SCHRO_ENCODER_GOP_CHAINED_BIREF,
76 } SchroEncoderGOPEnum;
77 
78 typedef enum {
79   SCHRO_ENCODER_PROFILE_AUTO,
80   SCHRO_ENCODER_PROFILE_VC2_LOW_DELAY,
81   SCHRO_ENCODER_PROFILE_VC2_SIMPLE,
82   SCHRO_ENCODER_PROFILE_VC2_MAIN,
83   SCHRO_ENCODER_PROFILE_MAIN
84 } SchroEncoderProfile;
85 
86 #ifdef SCHRO_ENABLE_UNSTABLE_API
87 typedef int (*SchroEngineIterateFunc) (SchroEncoder *encoder);
88 
89 /* forward declaration */
90 struct _SchroMotionEst;
91 struct _SchroRoughME;
92 
93 struct _SchroEncoderFrame {
94   /*< private >*/
95   int refcount;
96   //SchroEncoderFrameStateEnum state;
97   //SchroEncoderFrameStateEnum needed_state;
98   SchroEncoderFrameStateEnum working;
99   int busy;
100 
101   void *priv;
102 
103   unsigned int expired_reference;
104 
105   /* Bits telling the engine stages which stuff needs to happen */
106   unsigned int need_extension;
107   unsigned int need_downsampling;
108   unsigned int need_upsampling;
109   unsigned int need_filtering;
110   unsigned int need_average_luma;
111   unsigned int need_mad;
112 
113   /* bits indicating that a particular analysis has happened.  Mainly
114    * for verification */
115   unsigned int have_estimate_tables;
116   unsigned int have_histograms;
117   unsigned int have_scene_change_score;
118   unsigned int have_downsampling;
119   unsigned int have_upsampling;
120   unsigned int have_average_luma;
121   unsigned int have_mad;
122 
123   SchroAsyncStage stages[SCHRO_ENCODER_FRAME_STAGE_LAST];
124 
125   /* other stuff */
126 
127   int start_sequence_header;
128   int gop_length;
129 
130   SchroPictureNumber frame_number;
131   SchroFrame *original_frame;
132   SchroFrame *filtered_frame;
133   SchroFrame *downsampled_frames[8];
134   SchroUpsampledFrame *reconstructed_frame;
135   SchroUpsampledFrame *upsampled_original_frame;
136 
137   int sc_mad; /* shot change mean absolute difference */
138   double sc_threshold; /* shot change threshold */
139 
140   SchroBuffer *sequence_header_buffer;
141   SchroList *inserted_buffers;
142   int output_buffer_size;
143   SchroBuffer *output_buffer;
144   int presentation_frame;
145   int slot;
146   int last_frame;
147 
148   int is_ref;
149   int num_refs;
150   SchroPictureNumber picture_number_ref[2];
151   SchroPictureNumber retired_picture_number;
152 
153   int16_t slice_y_dc_values[100];
154   int16_t slice_u_dc_values[100];
155   int16_t slice_v_dc_values[100];
156   int slice_y_n;
157   int slice_uv_n;
158   int slice_y_bits;
159   int slice_uv_bits;
160   int slice_y_trailing_zeros;
161   int slice_uv_trailing_zeros;
162   SchroFrameData luma_subbands[SCHRO_LIMIT_SUBBANDS];
163   SchroFrameData chroma1_subbands[SCHRO_LIMIT_SUBBANDS];
164   SchroFrameData chroma2_subbands[SCHRO_LIMIT_SUBBANDS];
165 
166   /* from the old SchroEncoderTask */
167 
168   int stats_dc;
169   int stats_global;
170   int stats_motion;
171 
172   int subband_size;
173   SchroBuffer *subband_buffer;
174 
175   int16_t *quant_data;
176 
177   int *quant_indices[3][SCHRO_LIMIT_SUBBANDS];
178 
179   double est_entropy[3][SCHRO_LIMIT_SUBBANDS][60];
180   double actual_subband_bits[3][SCHRO_LIMIT_SUBBANDS];
181   double est_error[3][SCHRO_LIMIT_SUBBANDS][60];
182   SchroPack *pack;
183   SchroParams params;
184   SchroEncoder *encoder;
185   SchroFrame *iwt_frame;
186   SchroFrame *quant_frame;
187   SchroFrame *prediction_frame;
188 
189   SchroEncoderFrame *previous_frame;
190   SchroEncoderFrame *ref_frame[2];
191 
192   struct _SchroMotionEst *me;
193   struct _SchroRoughME *rme[2];
194   struct _SchroPhaseCorr *phasecorr[2];
195   struct _SchroHierBm *hier_bm[2];
196   struct _SchroMe *deep_me;
197 
198   SchroMotion *motion;
199 
200   SchroHistogram subband_hists[3][SCHRO_LIMIT_SUBBANDS];
201   SchroHistogram hist_test;
202 
203   /* statistics */
204 
205   double picture_weight;
206   double scene_change_score;
207   double average_luma;
208 
209   int hard_limit_bits;
210   int allocated_residual_bits;
211   int allocated_mc_bits;
212   double frame_lambda;
213   double frame_me_lambda;
214   int estimated_residual_bits;
215   int estimated_mc_bits;
216 
217   int actual_residual_bits;
218   int actual_mc_bits;
219   double mc_error;
220   double mean_squared_error_luma;
221   double mean_squared_error_chroma;
222   double mssim;
223 
224   double estimated_arith_context_ratio;
225 
226   double badblock_ratio;
227   double dcblock_ratio;
228   double hist_slope;
229 };
230 
231 struct _SchroEncoder {
232   /*< private >*/
233   SchroAsync *async;
234 
235   SchroPictureNumber next_frame_number;
236 
237   SchroQueue *frame_queue;
238 
239   SchroEncoderFrame *reference_pictures[SCHRO_LIMIT_REFERENCE_FRAMES];
240   SchroEncoderFrame *last_frame;
241 
242   int assemble_packets;
243   int need_rap;
244 
245   SchroVideoFormat video_format;
246   int version_major;
247   int version_minor;
248 
249   int bit_depth;
250   int input_frame_depth;
251   int intermediate_frame_depth;
252 
253   /* configuration */
254   int rate_control;
255   int bitrate;
256   int max_bitrate;
257   int min_bitrate;
258 
259   // Buffer model parameters for CBR and (TODO) constrained VBR coding
260   int buffer_size;
261   int buffer_level;
262   double quality;
263   double noise_threshold;
264   int gop_structure;
265   int queue_depth;
266   int perceptual_weighting;
267   double perceptual_distance;
268   int filtering;
269   double filter_value;
270   SchroEncoderProfile force_profile;
271   int profile;
272   int level;
273   int open_gop;
274   int au_distance;
275   int max_refs;
276   schro_bool enable_psnr;
277   schro_bool enable_ssim;
278   schro_bool enable_md5;
279 
280   int transform_depth;
281   int intra_wavelet;
282   int inter_wavelet;
283   int mv_precision;
284   int motion_block_size;
285   int motion_block_overlap;
286   schro_bool interlaced_coding;
287   schro_bool enable_internal_testing;
288   schro_bool enable_noarith;
289   schro_bool enable_fullscan_estimation;
290   schro_bool enable_hierarchical_estimation;
291   schro_bool enable_zero_estimation;
292   schro_bool enable_phasecorr_estimation;
293   schro_bool enable_bigblock_estimation;
294   schro_bool enable_multiquant;
295   schro_bool enable_dc_multiquant;
296   schro_bool enable_global_motion;
297   schro_bool enable_scene_change_detection;
298   schro_bool enable_deep_estimation;
299   schro_bool enable_rdo_cbr;
300   schro_bool enable_chroma_me;
301   int horiz_slices;
302   int vert_slices;
303   int codeblock_size;
304 
305   double magic_dc_metric_offset;
306   double magic_subband0_lambda_scale;
307   double magic_chroma_lambda_scale;
308   double magic_nonref_lambda_scale;
309   double magic_I_lambda_scale;
310   double magic_P_lambda_scale;
311   double magic_B_lambda_scale;
312   double magic_me_lambda_scale;
313   double magic_allocation_scale;
314   double magic_inter_cpd_scale;
315   double magic_keyframe_weight;
316   double magic_scene_change_threshold;
317   double magic_inter_p_weight;
318   double magic_inter_b_weight;
319   double magic_me_bailout_limit;
320   double magic_bailout_weight;
321   double magic_error_power;
322   double magic_subgroup_length;
323   double magic_badblock_multiplier_nonref;
324   double magic_badblock_multiplier_ref;
325   double magic_block_search_threshold;
326   double magic_scan_distance;
327   double magic_diagonal_lambda_scale;
328 
329   /* hooks */
330 
331   void (*init_frame) (SchroEncoderFrame *frame);
332   void (*handle_gop) (SchroEncoder *encoder, int i);
333   int (*setup_frame) (SchroEncoderFrame *frame);
334   int (*handle_quants) (SchroEncoder *encoder, int i);
335 
336   /* other */
337 
338   int end_of_stream;
339   int end_of_stream_handled;
340   int end_of_stream_pulled;
341   int completed_eos;
342   int prev_offset;
343   int force_sequence_header;
344 
345   SchroPictureNumber au_frame;
346   int next_slot;
347 
348   int output_slot;
349 
350   SchroList *inserted_buffers;
351   int queue_changed;
352 
353   int engine_init;
354   SchroEngineIterateFunc engine_iterate;
355   int quantiser_engine;
356 
357   double start_time;
358   int downsample_levels;
359 
360   /* internal stuff */
361 
362   double cycles_per_degree_horiz;
363   double cycles_per_degree_vert;
364 
365   double intra_subband_weights[SCHRO_N_WAVELETS][SCHRO_LIMIT_TRANSFORM_DEPTH][SCHRO_LIMIT_SUBBANDS];
366   double inter_subband_weights[SCHRO_N_WAVELETS][SCHRO_LIMIT_TRANSFORM_DEPTH][SCHRO_LIMIT_SUBBANDS];
367   SchroHistogramTable intra_hist_tables[60];
368 
369 
370   /* statistics */
371 
372   double average_arith_context_ratios_intra[3][SCHRO_LIMIT_SUBBANDS];
373   double average_arith_context_ratios_inter[3][SCHRO_LIMIT_SUBBANDS];
374 
375   double frame_stats[21];
376 
377   /* engine specific stuff */
378 
379   int bits_per_picture;
380   int subgroup_position;
381   int I_complexity;
382   int P_complexity;
383   int B_complexity;
384   int B_complexity_sum;
385   long int I_frame_alloc;
386   long int P_frame_alloc;
387   long int B_frame_alloc;
388   long int gop_target;
389 
390   // Current qf, from which is derived ...
391   double qf;
392   // lambda to use for intra pictures in CBR mode
393   double intra_cbr_lambda;
394 
395   int gop_picture;
396   int quant_slot;
397 
398   int last_ref;
399 };
400 #endif
401 
402 typedef enum {
403   SCHRO_ENCODER_SETTING_TYPE_BOOLEAN,
404   SCHRO_ENCODER_SETTING_TYPE_INT,
405   SCHRO_ENCODER_SETTING_TYPE_ENUM,
406   SCHRO_ENCODER_SETTING_TYPE_DOUBLE,
407   SCHRO_ENCODER_SETTING_TYPE_LAST
408 } SchroEncoderSettingTypeEnum;
409 
410 struct _SchroEncoderSetting {
411   const char *name;
412   SchroEncoderSettingTypeEnum type;
413 
414   double min;
415   double max;
416   double default_value;
417 
418   const char **enum_list;
419 };
420 
421 enum {
422   SCHRO_MOTION_FIELD_HIER_REF0,
423   SCHRO_MOTION_FIELD_HIER1_REF0,
424   SCHRO_MOTION_FIELD_HIER2_REF0,
425   SCHRO_MOTION_FIELD_HIER3_REF0,
426   SCHRO_MOTION_FIELD_HIER_REF1,
427   SCHRO_MOTION_FIELD_HIER1_REF1,
428   SCHRO_MOTION_FIELD_HIER2_REF1,
429   SCHRO_MOTION_FIELD_HIER3_REF1,
430   SCHRO_MOTION_FIELD_PHASECORR_REF0,
431   SCHRO_MOTION_FIELD_PHASECORR_REF1,
432   SCHRO_MOTION_FIELD_DC,
433   SCHRO_MOTION_FIELD_GLOBAL_REF0,
434   SCHRO_MOTION_FIELD_GLOBAL_REF1,
435   SCHRO_MOTION_FIELD_ZERO_REF0,
436   SCHRO_MOTION_FIELD_ZERO_REF1,
437   SCHRO_MOTION_FIELD_FULLSCAN_REF0,
438   SCHRO_MOTION_FIELD_FULLSCAN_REF1,
439   SCHRO_MOTION_FIELD_LAST
440 };
441 
442 SchroEncoder * schro_encoder_new (void);
443 void schro_encoder_free (SchroEncoder *encoder);
444 SchroVideoFormat * schro_encoder_get_video_format (SchroEncoder *encoder);
445 void schro_encoder_set_video_format (SchroEncoder *encoder,
446     SchroVideoFormat *video_format);
447 void schro_encoder_set_frame_lambda (SchroEncoderFrame* frame);
448 void schro_encoder_end_of_stream (SchroEncoder *encoder);
449 int schro_encoder_push_ready (SchroEncoder *encoder);
450 void schro_encoder_push_frame (SchroEncoder *encoder, SchroFrame *frame);
451 void schro_encoder_push_frame_full (SchroEncoder *encoder, SchroFrame *frame, void *priv);
452 void schro_encoder_force_sequence_header (SchroEncoder *encoder);
453 
454 SchroBuffer * schro_encoder_encode_auxiliary_data (SchroEncoder *encoder,
455     SchroAuxiliaryDataID id, const void *data, int size);
456 void schro_encoder_encode_parse_info (SchroPack *bits, int parse_code);
457 void schro_encoder_insert_buffer (SchroEncoder *encoder, SchroBuffer *buffer);
458 void schro_encoder_frame_insert_buffer (SchroEncoderFrame *frame, SchroBuffer *buffer);
459 void schro_encoder_start (SchroEncoder *encoder);
460 
461 void schro_encoder_set_packet_assembly (SchroEncoder *encoder, int value);
462 SchroStateEnum schro_encoder_wait (SchroEncoder *encoder);
463 SchroBuffer * schro_encoder_pull (SchroEncoder *encoder,
464     int *n_decodable_frames);
465 SchroBuffer * schro_encoder_pull_full (SchroEncoder *encoder, int *presentation_frame,
466     void **priv);
467 SchroBuffer * schro_encoder_encode_sequence_header (SchroEncoder *encoder);
468 
469 int schro_encoder_get_n_settings (void);
470 const SchroEncoderSetting *schro_encoder_get_setting_info (int i);
471 void schro_encoder_setting_set_double (SchroEncoder *encoder, const char *name,
472     double d);
473 double schro_encoder_setting_get_double (SchroEncoder *encoder, const char *name);
474 
475 int schro_encoder_get_frame_stats_size (SchroEncoder *encoder);
476 void schro_encoder_get_frame_stats (SchroEncoder *encoder, double *dest, int n);
477 
478 #ifdef SCHRO_ENABLE_UNSTABLE_API
479 
480 void schro_encoder_set_default_subband_weights (SchroEncoder *encoder);
481 void schro_encoder_calculate_subband_weights (SchroEncoder *encoder,
482         double (*perceptual_weight)(double));
483 double schro_encoder_perceptual_weight_constant (double cpd);
484 double schro_encoder_perceptual_weight_ccir959 (double cpd);
485 double schro_encoder_perceptual_weight_moo (double cpd);
486 double schro_encoder_perceptual_weight_manos_sakrison (double cpd);
487 
488 void schro_encoder_init_subbands (SchroEncoderFrame *frame);
489 void schro_encoder_encode_subband (SchroEncoderFrame *frame, int component, int index);
490 void schro_encoder_encode_subband_noarith (SchroEncoderFrame *frame, int component, int index);
491 
492 void schro_encoder_analyse_picture (SchroAsyncStage *stage);
493 void schro_encoder_predict_rough_picture (SchroAsyncStage *stage);
494 void schro_encoder_predict_pel_picture (SchroAsyncStage *stage);
495 void schro_encoder_predict_subpel_picture (SchroAsyncStage *stage);
496 
497 void schro_encoder_fullpel_predict_picture (SchroAsyncStage *stage);
498 void schro_encoder_mode_decision (SchroAsyncStage *stage);
499 
500 void schro_encoder_encode_picture (SchroAsyncStage *stage);
501 void schro_encoder_reconstruct_picture (SchroAsyncStage *stage);
502 void schro_encoder_postanalyse_picture (SchroAsyncStage *stage);
503 
504 SchroFrame * schro_encoder_frame_queue_get (SchroEncoder *encoder,
505     SchroPictureNumber frame_number);
506 void schro_encoder_frame_queue_remove (SchroEncoder *encoder,
507     SchroPictureNumber frame_number);
508 SchroEncoderFrame * schro_encoder_reference_get (SchroEncoder *encoder,
509     SchroPictureNumber frame_number);
510 void schro_encoder_encode_picture_header (SchroEncoderFrame *frame);
511 SchroBuffer * schro_encoder_encode_end_of_stream (SchroEncoder *encoder);
512 void schro_encoder_clean_up_transform (SchroEncoderFrame *frame);
513 void schro_encoder_choose_quantisers (SchroEncoderFrame *frame);
514 void schro_encoder_output_push (SchroEncoder *encoder,
515     SchroBuffer *buffer, int slot, int presentation_frame);
516 
517 SchroEncoderFrame * schro_encoder_frame_new (SchroEncoder *encoder);
518 void schro_encoder_frame_ref (SchroEncoderFrame *frame);
519 void schro_encoder_frame_unref (SchroEncoderFrame *frame);
520 int schro_encoder_frame_is_B_frame (SchroEncoderFrame* frame);
521 void schro_encoder_encode_lowdelay_transform_data (SchroEncoderFrame *frame);
522 void schro_encoder_estimate_entropy (SchroEncoderFrame *frame);
523 void schro_encoder_recalculate_allocations (SchroEncoder *encoder);
524 
525 void schro_encoder_calculate_test_info (SchroEncoderFrame *frame);
526 
527 void schro_encoder_init_error_tables (SchroEncoder *encoder);
528 
529 int schro_encoder_frame_get_quant_index (SchroEncoderFrame *frame, int component,
530     int index, int x, int y);
531 void schro_encoder_frame_set_quant_index (SchroEncoderFrame *frame, int component,
532     int index, int x, int y, int quant_index);
533 
534 #endif
535 
536 SCHRO_END_DECLS
537 
538 #endif
539 
540