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>
18 typedef struct _SchroEncoder SchroEncoder
;
19 typedef struct _SchroEncoderFrame SchroEncoderFrame
;
20 typedef struct _SchroEncoderSetting SchroEncoderSetting
;
23 SCHRO_STATE_NEED_FRAME
,
24 SCHRO_STATE_HAVE_BUFFER
,
26 SCHRO_STATE_END_OF_STREAM
29 #ifdef SCHRO_ENABLE_UNSTABLE_API
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
;
51 SCHRO_ENCODER_PERCEPTUAL_CONSTANT
,
52 SCHRO_ENCODER_PERCEPTUAL_CCIR959
,
53 SCHRO_ENCODER_PERCEPTUAL_MOO
,
54 SCHRO_ENCODER_PERCEPTUAL_MANOS_SAKRISON
55 } SchroEncoderPerceptualEnum
;
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
;
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
;
83 struct _SchroEncoderFrame
{
86 //SchroEncoderFrameStateEnum state;
87 //SchroEncoderFrameStateEnum needed_state;
88 SchroEncoderFrameStateEnum working
;
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
];
115 int start_sequence_header
;
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
;
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];
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 */
158 SchroBuffer
*subband_buffer
;
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];
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];
183 SchroHistogram subband_hists
[3][SCHRO_LIMIT_SUBBANDS
];
184 SchroHistogram hist_test
;
188 double picture_weight
;
189 double scene_change_score
;
192 int allocated_residual_bits
;
193 int allocated_mc_bits
;
195 int estimated_residual_bits
;
196 int estimated_mc_bits
;
198 int actual_residual_bits
;
201 double mean_squared_error_luma
;
202 double mean_squared_error_chroma
;
204 double estimated_arith_context_ratio
;
206 double badblock_ratio
;
210 struct _SchroEncoder
{
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
;
224 SchroVideoFormat video_format
;
236 double noise_threshold
;
240 int perceptual_weighting
;
241 double perceptual_distance
;
248 schro_bool enable_psnr
;
249 schro_bool enable_ssim
;
250 schro_bool enable_md5
;
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
;
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
;
289 double magic_badblock_multiplier_nonref
;
290 double magic_badblock_multiplier_ref
;
291 double magic_block_search_threshold
;
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
);
303 int end_of_stream_handled
;
304 int end_of_stream_pulled
;
307 int force_sequence_header
;
309 SchroPictureNumber au_frame
;
314 SchroList
*inserted_buffers
;
318 SchroEngineIterateFunc engine_iterate
;
319 int quantiser_engine
;
322 int downsample_levels
;
325 int prefs
[SCHRO_PREF_LAST
];
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
;
340 double average_arith_context_ratio_intra
;
341 double average_arith_context_ratio_inter
;
343 /* engine specific stuff */
350 int need_first_intra
;
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
{
364 SchroEncoderSettingTypeEnum type
;
368 double default_value
;
374 struct _SchroEncoderSettings
{
376 int wavelet_filter_index
;
378 /* stuff we don't handle yet */
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
,
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
,
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
);