[encoder] New GOP handling
[schroedinger/research-port.git] / schroedinger / schroencoder.h
blob79a9e11e3b4488b430d355c2a219809e5457d620
2 #ifndef __SCHRO_ENCODER_H__
3 #define __SCHRO_ENCODER_H__
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>
16 SCHRO_BEGIN_DECLS
18 typedef struct _SchroEncoder SchroEncoder;
19 typedef struct _SchroEncoderFrame SchroEncoderFrame;
20 typedef struct _SchroEncoderSetting SchroEncoderSetting;
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;
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_HAVE_GOP,
34 SCHRO_ENCODER_FRAME_STAGE_HAVE_PARAMS,
35 SCHRO_ENCODER_FRAME_STAGE_PREDICT_ROUGH,
36 SCHRO_ENCODER_FRAME_STAGE_PREDICT_PEL,
37 SCHRO_ENCODER_FRAME_STAGE_PREDICT_SUBPEL,
38 SCHRO_ENCODER_FRAME_STAGE_MODE_DECISION,
39 SCHRO_ENCODER_FRAME_STAGE_HAVE_REFS,
40 SCHRO_ENCODER_FRAME_STAGE_HAVE_QUANTS,
41 SCHRO_ENCODER_FRAME_STAGE_ENCODING,
42 SCHRO_ENCODER_FRAME_STAGE_RECONSTRUCT,
43 SCHRO_ENCODER_FRAME_STAGE_POSTANALYSE,
44 SCHRO_ENCODER_FRAME_STAGE_DONE,
45 SCHRO_ENCODER_FRAME_STAGE_FREE,
46 SCHRO_ENCODER_FRAME_STAGE_LAST /* this should be last */
47 } SchroEncoderFrameStateEnum;
48 #endif
50 typedef enum {
51 SCHRO_ENCODER_PERCEPTUAL_CONSTANT,
52 SCHRO_ENCODER_PERCEPTUAL_CCIR959,
53 SCHRO_ENCODER_PERCEPTUAL_MOO,
54 SCHRO_ENCODER_PERCEPTUAL_MANOS_SAKRISON
55 } SchroEncoderPerceptualEnum;
57 typedef enum {
58 SCHRO_ENCODER_RATE_CONTROL_CONSTANT_NOISE_THRESHOLD,
59 SCHRO_ENCODER_RATE_CONTROL_CONSTANT_BITRATE,
60 SCHRO_ENCODER_RATE_CONTROL_LOW_DELAY,
61 SCHRO_ENCODER_RATE_CONTROL_LOSSLESS,
62 SCHRO_ENCODER_RATE_CONTROL_CONSTANT_LAMBDA,
63 SCHRO_ENCODER_RATE_CONTROL_CONSTANT_ERROR,
64 SCHRO_ENCODER_RATE_CONTROL_CONSTANT_QUALITY
65 } SchroEncoderRateControlEnum;
67 typedef enum {
68 SCHRO_ENCODER_GOP_ADAPTIVE,
69 SCHRO_ENCODER_GOP_INTRA_ONLY,
70 SCHRO_ENCODER_GOP_BACKREF,
71 SCHRO_ENCODER_GOP_CHAINED_BACKREF,
72 SCHRO_ENCODER_GOP_BIREF,
73 SCHRO_ENCODER_GOP_CHAINED_BIREF,
74 } SchroEncoderGOPEnum;
76 #ifdef SCHRO_ENABLE_UNSTABLE_API
77 typedef int (*SchroEngineIterateFunc) (SchroEncoder *encoder);
79 /* forward declaration */
80 struct _SchroMotionEst;
81 struct _SchroRoughME;
83 struct _SchroEncoderFrame {
84 /*< private >*/
85 int refcount;
86 //SchroEncoderFrameStateEnum state;
87 //SchroEncoderFrameStateEnum needed_state;
88 SchroEncoderFrameStateEnum working;
89 int busy;
91 void *priv;
93 unsigned int expired_reference;
95 /* Bits telling the engine stages which stuff needs to happen */
96 unsigned int need_extension;
97 unsigned int need_downsampling;
98 unsigned int need_upsampling;
99 unsigned int need_filtering;
100 unsigned int need_average_luma;
102 /* bits indicating that a particular analysis has happened. Mainly
103 * for verification */
104 unsigned int have_estimate_tables;
105 unsigned int have_histograms;
106 unsigned int have_scene_change_score;
107 unsigned int have_downsampling;
108 unsigned int have_upsampling;
109 unsigned int have_average_luma;
111 SchroAsyncStage stages[SCHRO_ENCODER_FRAME_STAGE_LAST];
113 /* other stuff */
115 int start_sequence_header;
116 int subgroup_length;
118 SchroPictureNumber frame_number;
119 SchroFrame *original_frame;
120 SchroFrame *filtered_frame;
121 SchroFrame *downsampled_frames[8];
122 SchroUpsampledFrame *reconstructed_frame;
123 SchroUpsampledFrame *upsampled_original_frame;
125 SchroBuffer *sequence_header_buffer;
126 SchroList *inserted_buffers;
127 int output_buffer_size;
128 SchroBuffer *output_buffer;
129 int presentation_frame;
130 int slot;
131 int last_frame;
133 int is_ref;
134 int num_refs;
135 SchroPictureNumber picture_number_ref[2];
136 SchroPictureNumber retired_picture_number;
138 int16_t slice_y_dc_values[100];
139 int16_t slice_u_dc_values[100];
140 int16_t slice_v_dc_values[100];
141 int slice_y_n;
142 int slice_uv_n;
143 int slice_y_bits;
144 int slice_uv_bits;
145 int slice_y_trailing_zeros;
146 int slice_uv_trailing_zeros;
147 SchroFrameData luma_subbands[SCHRO_LIMIT_SUBBANDS];
148 SchroFrameData chroma1_subbands[SCHRO_LIMIT_SUBBANDS];
149 SchroFrameData chroma2_subbands[SCHRO_LIMIT_SUBBANDS];
151 /* from the old SchroEncoderTask */
153 int stats_dc;
154 int stats_global;
155 int stats_motion;
157 int subband_size;
158 SchroBuffer *subband_buffer;
160 int16_t *quant_data;
162 int *quant_indices[3][SCHRO_LIMIT_SUBBANDS];
164 int quant_index[3][SCHRO_LIMIT_SUBBANDS];
165 double est_entropy[3][SCHRO_LIMIT_SUBBANDS][60];
166 double est_error[3][SCHRO_LIMIT_SUBBANDS][60];
167 SchroPack *pack;
168 SchroParams params;
169 SchroEncoder *encoder;
170 SchroFrame *iwt_frame;
171 SchroFrame *quant_frame;
172 SchroFrame *prediction_frame;
174 SchroEncoderFrame *previous_frame;
175 SchroEncoderFrame *ref_frame[2];
177 struct _SchroMotionEst *me;
178 struct _SchroRoughME *rme[2];
179 struct _SchroPhaseCorr *phasecorr[2];
181 SchroMotion *motion;
183 SchroHistogram subband_hists[3][SCHRO_LIMIT_SUBBANDS];
184 SchroHistogram hist_test;
186 /* statistics */
188 double picture_weight;
189 double scene_change_score;
190 double average_luma;
192 int allocated_residual_bits;
193 int allocated_mc_bits;
194 double base_lambda;
195 int estimated_residual_bits;
196 int estimated_mc_bits;
198 int actual_residual_bits;
199 int actual_mc_bits;
200 double mc_error;
201 double mean_squared_error_luma;
202 double mean_squared_error_chroma;
204 double estimated_arith_context_ratio;
206 double badblock_ratio;
207 double hist_slope;
210 struct _SchroEncoder {
211 /*< private >*/
212 SchroAsync *async;
214 SchroPictureNumber next_frame_number;
216 SchroQueue *frame_queue;
218 SchroEncoderFrame *reference_pictures[SCHRO_LIMIT_REFERENCE_FRAMES];
219 SchroEncoderFrame *last_frame;
221 int assemble_packets;
222 int need_rap;
224 SchroVideoFormat video_format;
225 int version_major;
226 int version_minor;
228 /* configuration */
229 int rate_control;
230 int bitrate;
231 int max_bitrate;
232 int min_bitrate;
233 int buffer_size;
234 int buffer_level;
235 double quality;
236 double noise_threshold;
237 int gop_structure;
238 int subgroup_length;
239 int queue_depth;
240 int perceptual_weighting;
241 double perceptual_distance;
242 int filtering;
243 double filter_value;
244 int profile;
245 int level;
246 int sub_groups_num;
247 int open_gop;
248 schro_bool enable_psnr;
249 schro_bool enable_ssim;
250 schro_bool enable_md5;
252 int ref_distance;
253 int transform_depth;
254 int intra_wavelet;
255 int inter_wavelet;
256 int mv_precision;
257 int motion_block_size;
258 int motion_block_overlap;
259 schro_bool interlaced_coding;
260 schro_bool enable_internal_testing;
261 schro_bool enable_noarith;
262 schro_bool enable_fullscan_estimation;
263 schro_bool enable_hierarchical_estimation;
264 schro_bool enable_zero_estimation;
265 schro_bool enable_phasecorr_estimation;
266 schro_bool enable_bigblock_estimation;
267 schro_bool enable_multiquant;
268 schro_bool enable_dc_multiquant;
269 schro_bool enable_global_motion;
270 schro_bool enable_opengop_structure;
271 int horiz_slices;
272 int vert_slices;
274 double magic_dc_metric_offset;
275 double magic_subband0_lambda_scale;
276 double magic_chroma_lambda_scale;
277 double magic_nonref_lambda_scale;
278 double magic_allocation_scale;
279 double magic_keyframe_weight;
280 double magic_scene_change_threshold;
281 double magic_inter_p_weight;
282 double magic_inter_b_weight;
283 double magic_mc_bailout_limit;
284 double magic_bailout_weight;
285 double magic_error_power;
286 double magic_mc_lambda;
287 double magic_subgroup_length;
288 double magic_lambda;
289 double magic_badblock_multiplier_nonref;
290 double magic_badblock_multiplier_ref;
291 double magic_block_search_threshold;
293 /* hooks */
295 void (*init_frame) (SchroEncoderFrame *frame);
296 void (*handle_gop) (SchroEncoder *encoder, int i);
297 int (*setup_frame) (SchroEncoderFrame *frame);
298 int (*handle_quants) (SchroEncoder *encoder, int i);
300 /* other */
302 int end_of_stream;
303 int end_of_stream_handled;
304 int end_of_stream_pulled;
305 int completed_eos;
306 int prev_offset;
307 int force_sequence_header;
309 SchroPictureNumber au_frame;
310 int next_slot;
312 int output_slot;
314 SchroList *inserted_buffers;
315 int queue_changed;
317 int engine_init;
318 SchroEngineIterateFunc engine_iterate;
319 int quantiser_engine;
321 double start_time;
322 int downsample_levels;
324 #if 0
325 int prefs[SCHRO_PREF_LAST];
326 #endif
328 /* internal stuff */
330 double cycles_per_degree_horiz;
331 double cycles_per_degree_vert;
333 double subband_weights[SCHRO_N_WAVELETS][SCHRO_LIMIT_TRANSFORM_DEPTH][SCHRO_LIMIT_SUBBANDS];
334 SchroHistogramTable intra_hist_tables[60];
336 int bits_per_picture;
338 /* statistics */
340 double average_arith_context_ratio_intra;
341 double average_arith_context_ratio_inter;
343 /* engine specific stuff */
345 int gop_picture;
346 int quant_slot;
348 int last_ref;
350 int need_first_intra;
352 #endif
354 typedef enum {
355 SCHRO_ENCODER_SETTING_TYPE_BOOLEAN,
356 SCHRO_ENCODER_SETTING_TYPE_INT,
357 SCHRO_ENCODER_SETTING_TYPE_ENUM,
358 SCHRO_ENCODER_SETTING_TYPE_DOUBLE,
359 SCHRO_ENCODER_SETTING_TYPE_LAST
360 } SchroEncoderSettingTypeEnum;
362 struct _SchroEncoderSetting {
363 char *name;
364 SchroEncoderSettingTypeEnum type;
366 double min;
367 double max;
368 double default_value;
370 char **enum_list;
373 #if 0
374 struct _SchroEncoderSettings {
375 int transform_depth;
376 int wavelet_filter_index;
378 /* stuff we don't handle yet */
379 int profile;
380 int level;
382 int xbsep_luma;
383 int ybsep_luma;
384 int xblen_luma;
385 int yblen_luma;
387 #endif
389 enum {
390 SCHRO_MOTION_FIELD_HIER_REF0,
391 SCHRO_MOTION_FIELD_HIER1_REF0,
392 SCHRO_MOTION_FIELD_HIER2_REF0,
393 SCHRO_MOTION_FIELD_HIER3_REF0,
394 SCHRO_MOTION_FIELD_HIER_REF1,
395 SCHRO_MOTION_FIELD_HIER1_REF1,
396 SCHRO_MOTION_FIELD_HIER2_REF1,
397 SCHRO_MOTION_FIELD_HIER3_REF1,
398 SCHRO_MOTION_FIELD_PHASECORR_REF0,
399 SCHRO_MOTION_FIELD_PHASECORR_REF1,
400 SCHRO_MOTION_FIELD_DC,
401 SCHRO_MOTION_FIELD_GLOBAL_REF0,
402 SCHRO_MOTION_FIELD_GLOBAL_REF1,
403 SCHRO_MOTION_FIELD_ZERO_REF0,
404 SCHRO_MOTION_FIELD_ZERO_REF1,
405 SCHRO_MOTION_FIELD_FULLSCAN_REF0,
406 SCHRO_MOTION_FIELD_FULLSCAN_REF1,
407 SCHRO_MOTION_FIELD_LAST
410 SchroEncoder * schro_encoder_new (void);
411 void schro_encoder_free (SchroEncoder *encoder);
412 SchroVideoFormat * schro_encoder_get_video_format (SchroEncoder *encoder);
413 void schro_encoder_set_video_format (SchroEncoder *encoder,
414 SchroVideoFormat *video_format);
415 void schro_encoder_end_of_stream (SchroEncoder *encoder);
416 int schro_encoder_push_ready (SchroEncoder *encoder);
417 void schro_encoder_push_frame (SchroEncoder *encoder, SchroFrame *frame);
418 void schro_encoder_push_frame_full (SchroEncoder *encoder, SchroFrame *frame, void *priv);
419 void schro_encoder_force_sequence_header (SchroEncoder *encoder);
421 SchroBuffer * schro_encoder_encode_auxiliary_data (SchroEncoder *encoder,
422 SchroAuxiliaryDataID id, void *data, int size);
423 void schro_encoder_encode_access_unit_header (SchroEncoder *encoder, SchroPack *bits);
424 void schro_encoder_encode_parse_info (SchroPack *bits, int parse_code);
425 void schro_encoder_insert_buffer (SchroEncoder *encoder, SchroBuffer *buffer);
426 void schro_encoder_frame_insert_buffer (SchroEncoderFrame *frame, SchroBuffer *buffer);
427 void schro_encoder_start (SchroEncoder *encoder);
429 void schro_encoder_set_packet_assembly (SchroEncoder *encoder, int value);
430 SchroStateEnum schro_encoder_wait (SchroEncoder *encoder);
431 SchroBuffer * schro_encoder_pull (SchroEncoder *encoder,
432 int *n_decodable_frames);
433 SchroBuffer * schro_encoder_pull_full (SchroEncoder *encoder, int *presentation_frame,
434 void **priv);
436 int schro_encoder_get_n_settings (void);
437 const SchroEncoderSetting *schro_encoder_get_setting_info (int i);
438 void schro_encoder_setting_set_double (SchroEncoder *encoder, const char *name,
439 double d);
440 double schro_encoder_setting_get_double (SchroEncoder *encoder, const char *name);
442 #ifdef SCHRO_ENABLE_UNSTABLE_API
444 void schro_encoder_set_default_subband_weights (SchroEncoder *encoder);
445 void schro_encoder_calculate_subband_weights (SchroEncoder *encoder,
446 double (*perceptual_weight)(double));
447 double schro_encoder_perceptual_weight_constant (double cpd);
448 double schro_encoder_perceptual_weight_ccir959 (double cpd);
449 double schro_encoder_perceptual_weight_moo (double cpd);
450 double schro_encoder_perceptual_weight_manos_sakrison (double cpd);
452 int schro_encoder_need_first_intra (SchroEncoder* encoder);
453 void schro_encoder_reset_first_intra (SchroEncoder* encoder);
454 int schro_encoder_get_subgroup_length (SchroEncoder* encoder);
455 SchroPictureNumber schro_encoder_get_next_seqhdr (SchroEncoder* encoder);
457 void schro_encoder_init_subbands (SchroEncoderFrame *frame);
458 void schro_encoder_encode_subband (SchroEncoderFrame *frame, int component, int index);
459 void schro_encoder_encode_subband_noarith (SchroEncoderFrame *frame, int component, int index);
461 void schro_encoder_analyse_picture (SchroAsyncStage *stage);
462 void schro_encoder_predict_rough_picture (SchroAsyncStage *stage);
463 void schro_encoder_predict_pel_picture (SchroAsyncStage *stage);
464 void schro_encoder_predict_subpel_picture (SchroAsyncStage *stage);
466 void schro_encoder_fullpel_predict_picture (SchroAsyncStage *stage);
467 void schro_encoder_mode_decision (SchroAsyncStage *stage);
469 void schro_encoder_encode_picture (SchroAsyncStage *stage);
470 void schro_encoder_reconstruct_picture (SchroAsyncStage *stage);
471 void schro_encoder_postanalyse_picture (SchroAsyncStage *stage);
473 SchroFrame * schro_encoder_frame_queue_get (SchroEncoder *encoder,
474 SchroPictureNumber frame_number);
475 void schro_encoder_frame_queue_remove (SchroEncoder *encoder,
476 SchroPictureNumber frame_number);
477 SchroEncoderFrame * schro_encoder_reference_get (SchroEncoder *encoder,
478 SchroPictureNumber frame_number);
479 void schro_encoder_encode_picture_header (SchroEncoderFrame *frame);
480 SchroBuffer * schro_encoder_encode_end_of_stream (SchroEncoder *encoder);
481 void schro_encoder_clean_up_transform (SchroEncoderFrame *frame);
482 void schro_encoder_choose_quantisers (SchroEncoderFrame *frame);
483 SchroBuffer * schro_encoder_encode_sequence_header (SchroEncoder *encoder);
484 void schro_encoder_output_push (SchroEncoder *encoder,
485 SchroBuffer *buffer, int slot, int presentation_frame);
487 SchroEncoderFrame * schro_encoder_frame_new (SchroEncoder *encoder);
488 void schro_encoder_frame_ref (SchroEncoderFrame *frame);
489 void schro_encoder_frame_unref (SchroEncoderFrame *frame);
491 void schro_encoder_encode_lowdelay_transform_data (SchroEncoderFrame *frame);
492 void schro_encoder_estimate_entropy (SchroEncoderFrame *frame);
493 void schro_encoder_recalculate_allocations (SchroEncoder *encoder);
495 void schro_encoder_calculate_test_info (SchroEncoderFrame *frame);
497 void schro_encoder_init_error_tables (SchroEncoder *encoder);
499 void schro_encoder_frame_set_quant_index (SchroEncoderFrame *frame, int component,
500 int index, int x, int y, int quant_index);
502 SchroPictureNumber schro_encoder_pic_num (SchroEncoderFrame* frame);
504 #endif
506 SCHRO_END_DECLS
508 #endif