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