00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "libmpeg3.h"
00031 #include "mpeg2enc.h"
00032 #include "quicktime.h"
00033
00034 #include <pthread.h>
00035 #include <stdint.h>
00036
00037
00038
00039
00040
00041
00042 #ifndef GLOBAL_
00043 #define EXTERN_ extern
00044 #else
00045 #define EXTERN_
00046 #endif
00047
00048
00049
00050
00051
00052 EXTERN_ unsigned char mpeg2_zig_zag_scan[64]
00053 #ifdef GLOBAL_
00054 =
00055 {
00056 0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,
00057 12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,
00058 35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,
00059 58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63
00060 }
00061 #endif
00062 ;
00063
00064
00065 EXTERN_ unsigned char alternate_scan_hv[64]
00066 #ifdef GLOBAL_
00067 =
00068 {
00069 0,8,16,24,1,9,2,10,17,25,32,40,48,56,57,49,
00070 41,33,26,18,3,11,4,12,19,27,34,42,50,58,35,43,
00071 51,59,20,28,5,13,6,14,21,29,36,44,52,60,37,45,
00072 53,61,22,30,7,15,23,31,38,46,54,62,39,47,55,63
00073 }
00074 #endif
00075 ;
00076
00077
00078 EXTERN_ uint16_t default_intra_quantizer_matrix_hv[64]
00079 #ifdef GLOBAL_
00080 =
00081 {
00082 8, 16, 19, 22, 26, 27, 29, 34,
00083 16, 16, 22, 24, 27, 29, 34, 37,
00084 19, 22, 26, 27, 29, 34, 34, 38,
00085 22, 22, 26, 27, 29, 34, 37, 40,
00086 22, 26, 27, 29, 32, 35, 40, 48,
00087 26, 27, 29, 32, 35, 40, 48, 58,
00088 26, 27, 29, 34, 38, 46, 56, 69,
00089 27, 29, 35, 38, 46, 56, 69, 83
00090 }
00091 #endif
00092 ;
00093
00094 EXTERN_ uint16_t hires_intra_quantizer_matrix_hv[64]
00095 #ifdef GLOBAL_
00096 =
00097 {
00098 8, 16, 18, 20, 24, 25, 26, 30,
00099 16, 16, 20, 23, 25, 26, 30, 30,
00100 18, 20, 22, 24, 26, 28, 29, 31,
00101 20, 21, 23, 24, 26, 28, 31, 31,
00102 21, 23, 24, 25, 28, 30, 30, 33,
00103 23, 24, 25, 28, 30, 30, 33, 36,
00104 24, 25, 26, 29, 29, 31, 34, 38,
00105 25, 26, 28, 29, 31, 34, 38, 42
00106 }
00107 #endif
00108 ;
00109
00110
00111
00112
00113 EXTERN_ uint16_t default_nonintra_quantizer_matrix_hv[64]
00114 #ifdef GLOBAL_
00115 =
00116
00117 {
00118 16, 17, 18, 19, 20, 21, 22, 23,
00119 17, 18, 19, 20, 21, 22, 23, 24,
00120 18, 19, 20, 21, 22, 23, 24, 25,
00121 19, 20, 21, 22, 23, 24, 26, 27,
00122 20, 21, 22, 23, 25, 26, 27, 28,
00123 21, 22, 23, 24, 26, 27, 28, 30,
00124 22, 23, 24, 26, 27, 28, 30, 31,
00125 23, 24, 25, 27, 28, 30, 31, 33
00126
00127 }
00128 #endif
00129 ;
00130
00131
00132
00133 EXTERN_ uint16_t hires_nonintra_quantizer_matrix_hv[64]
00134 #ifdef GLOBAL_
00135 =
00136 {
00137 16, 16, 16, 16, 16, 16, 16, 16,
00138 16, 16, 16, 16, 16, 16, 16, 16,
00139 16, 16, 16, 16, 16, 16, 16, 16,
00140 16, 16, 16, 16, 16, 16, 16, 16,
00141 16, 16, 16, 16, 16, 16, 16, 16,
00142 16, 16, 16, 16, 16, 16, 16, 16,
00143 16, 16, 16, 16, 16, 16, 16, 16,
00144 16, 16, 16, 16, 16, 16, 16, 16
00145 }
00146 #endif
00147 ;
00148
00149
00150 EXTERN_ unsigned char non_linear_mquant_table_hv[32]
00151 #ifdef GLOBAL_
00152 =
00153 {
00154 0, 1, 2, 3, 4, 5, 6, 7,
00155 8,10,12,14,16,18,20,22,
00156 24,28,32,36,40,44,48,52,
00157 56,64,72,80,88,96,104,112
00158 }
00159 #endif
00160 ;
00161
00162
00163
00164
00165
00166
00167 EXTERN_ unsigned char map_non_linear_mquant_hv[113]
00168 #ifdef GLOBAL_
00169 =
00170 {
00171 0,1,2,3,4,5,6,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,
00172 16,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,22,22,
00173 22,22,23,23,23,23,24,24,24,24,24,24,24,25,25,25,25,25,25,25,26,26,
00174 26,26,26,26,26,26,27,27,27,27,27,27,27,27,28,28,28,28,28,28,28,29,
00175 29,29,29,29,29,29,29,29,29,30,30,30,30,30,30,30,31,31,31,31,31
00176 }
00177 #endif
00178 ;
00179
00180 struct mc_result
00181 {
00182 uint16_t weight;
00183 int8_t x;
00184 int8_t y;
00185 };
00186
00187 typedef struct mc_result mc_result_s;
00188
00189 typedef struct motion_comp
00190 {
00191 uint8_t **oldorg, **neworg;
00192 uint8_t **oldref, **newref;
00193 uint8_t **cur, **curref;
00194 int sxf, syf, sxb, syb;
00195 } motion_comp_s;
00196
00197 typedef struct mbinfo mbinfo_s;
00198
00199 typedef struct pict_data
00200 {
00201
00202
00203
00204 int temp_ref;
00205 int pict_type;
00206 int vbv_delay;
00207 int forw_hor_f_code, forw_vert_f_code;
00208 int back_hor_f_code, back_vert_f_code;
00209 int dc_prec;
00210 int pict_struct;
00211 int topfirst;
00212 int frame_pred_dct;
00213 int intravlc;
00214 int q_scale_type;
00215 int altscan;
00216 int repeatfirst;
00217 int prog_frame;
00218
00219
00220
00221 int16_t (*blocks)[64];
00222 int16_t (*qblocks)[64];
00223
00224 unsigned char **curorg, **curref;
00225
00226 mbinfo_s *mbinfo;
00227
00228 } pict_data_s;
00229
00230 typedef struct
00231 {
00232 int start_row, end_row;
00233 pthread_mutex_t input_lock, output_lock;
00234 pthread_t tid;
00235 int done;
00236
00237 motion_comp_s *motion_comp;
00238 pict_data_s *pict_data;
00239 int secondfield;
00240 int ipflag;
00241
00242 #define MAX_44_MATCHES (256*256/(4*4))
00243 int sub22_num_mcomps;
00244 int sub44_num_mcomps;
00245 mc_result_s sub44_mcomps[MAX_44_MATCHES];
00246 mc_result_s sub22_mcomps[MAX_44_MATCHES*4];
00247 } motion_engine_t;
00248
00249 #if 0
00250 typedef struct
00251 {
00252 pthread_mutex_t ratectl_lock;
00253
00254 double R, T, d;
00255 double actsum;
00256 int Np, Nb;
00257 double S, Q;
00258 int prev_mquant;
00259 double bitcnt_EOP;
00260 double next_ip_delay;
00261 double decoding_time;
00262 int Xi, Xp, Xb, r, d0i, d0p, d0b;
00263 double avg_act;
00264 } ratectl_t;
00265 #endif
00266
00267 typedef struct
00268 {
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283 pthread_mutex_t ratectl_lock;
00284
00285 double Xi, Xp, Xb;
00286 int r;
00287 int d0i, d0pb;
00288 double R;
00289 int d;
00290 double T;
00291 int CarryR;
00292 int CarryRLim;
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312 int64_t bitcnt_EOP;
00313 int gop_undershoot;
00314
00315
00316
00317
00318
00319
00320
00321
00322 double actsum;
00323 double actcovered;
00324 double sum_avg_act;
00325 double avg_act;
00326 double peak_act;
00327
00328 int Np, Nb;
00329 int64_t S;
00330 double IR;
00331
00332
00333 double Ki;
00334 double Kb;
00335 double Kp;
00336
00337
00338 int min_d,max_d;
00339 int min_q, max_q;
00340
00341
00342 double avg_KI;
00343 double avg_KB;
00344 double avg_KP;
00345 #define K_AVG_WINDOW_I 4.0
00346 #define K_AVG_WINDOW_P 10.0
00347 #define K_AVG_WINDOW_B 20.0
00348 double bits_per_mb;
00349
00350 double SQ;
00351 double AQ;
00352
00353 double current_quant;
00354 int64_t frame_start;
00355 int64_t frame_end;
00356 } ratectl_t;
00357
00358 typedef struct
00359 {
00360 int start_row, end_row;
00361 pthread_mutex_t input_lock, output_lock;
00362 pthread_t tid;
00363 int done;
00364
00365 pict_data_s *picture;
00366 unsigned char **pred;
00367 unsigned char **cur;
00368
00369 unsigned char temp[128];
00370 } transform_engine_t;
00371
00372 typedef struct
00373 {
00374 int start_row, end_row;
00375 pthread_mutex_t input_lock, output_lock;
00376 pthread_t tid;
00377 int done;
00378
00379 int prev_mquant;
00380
00381
00382 int dc_dct_pred[3];
00383
00384 unsigned char *frame;
00385 unsigned char *slice_buffer;
00386 long slice_size;
00387 long slice_allocated;
00388 pict_data_s *picture;
00389 ratectl_t *ratectl;
00390 unsigned char outbfr;
00391 int outcnt;
00392 } slice_engine_t;
00393
00394 EXTERN_ pthread_mutex_t test_lock;
00395 EXTERN_ motion_engine_t *motion_engines;
00396 EXTERN_ transform_engine_t *transform_engines;
00397 EXTERN_ transform_engine_t *itransform_engines;
00398 EXTERN_ slice_engine_t *slice_engines;
00399 EXTERN_ ratectl_t **ratectl;
00400 EXTERN_ int quiet;
00401
00402
00403
00404
00405 EXTERN_ pict_data_s cur_picture;
00406
00407
00408 EXTERN_ unsigned char *newrefframe[3], *oldrefframe[3], *auxframe[3];
00409
00410 EXTERN_ unsigned char *neworgframe[3], *oldorgframe[3], *auxorgframe[3];
00411
00412 EXTERN_ unsigned char *predframe[3];
00413
00414 EXTERN_ struct motion_data *motion_data;
00415
00416
00417
00418
00419 #define IQUANT_SCALE_POW2 16
00420 #define IQUANT_SCALE (1<<IQUANT_SCALE_POW2)
00421 #define COEFFSUM_SCALE (1<<16)
00422
00423
00424 EXTERN_ uint16_t intra_q[64], inter_q[64];
00425 EXTERN_ uint16_t i_intra_q[64], i_inter_q[64];
00426
00427
00428 EXTERN_ uint16_t intra_q_tbl[113][64], inter_q_tbl[113][64];
00429 EXTERN_ uint16_t i_intra_q_tbl[113][64], i_inter_q_tbl[113][64];
00430 EXTERN_ float intra_q_tblf[113][64], inter_q_tblf[113][64];
00431 EXTERN_ float i_intra_q_tblf[113][64], i_inter_q_tblf[113][64];
00432
00433 EXTERN_ uint16_t chrom_intra_q[64],chrom_inter_q[64];
00434
00435
00436
00437
00438
00439
00440 EXTERN_ unsigned char *clp;
00441
00442
00443 EXTERN_ char id_string[256], tplorg[256], tplref[256], out_path[256];
00444 EXTERN_ char iqname[256], niqname[256];
00445 EXTERN_ char statname[256];
00446 EXTERN_ char errortext[256];
00447
00448 EXTERN_ FILE *outfile;
00449 EXTERN_ FILE *statfile;
00450 EXTERN_ int inputtype;
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462 #define READ_LOOK_AHEAD 4
00463 EXTERN_ uint8_t ***frame_buffers;
00464
00465
00466
00467 EXTERN_ quicktime_t *qt_file;
00468 EXTERN_ mpeg3_t *mpeg_file;
00469 EXTERN_ int do_stdin;
00470 EXTERN_ FILE *stdin_fd;
00471
00472
00473 EXTERN_ int do_buffers;
00474 EXTERN_ pthread_mutex_t input_lock;
00475 EXTERN_ pthread_mutex_t output_lock;
00476 EXTERN_ pthread_mutex_t copy_lock;
00477 EXTERN_ char *input_buffer_y;
00478 EXTERN_ char *input_buffer_u;
00479 EXTERN_ char *input_buffer_v;
00480 EXTERN_ int input_buffer_end;
00481
00482
00483 EXTERN_ int verbose;
00484 EXTERN_ quicktime_t *qt_output;
00485 EXTERN_ unsigned char *frame_buffer;
00486 EXTERN_ unsigned char **row_pointers;
00487 EXTERN_ int fixed_mquant;
00488 EXTERN_ double quant_floor;
00489 EXTERN_ double act_boost;
00490 EXTERN_ int use_hires_quant;
00491 EXTERN_ int use_denoise_quant;
00492
00493 EXTERN_ int processors;
00494 EXTERN_ long start_frame, end_frame;
00495 EXTERN_ int seq_header_every_gop;
00496
00497
00498
00499 EXTERN_ int N;
00500 EXTERN_ int M;
00501 EXTERN_ int P;
00502 EXTERN_ int nframes;
00503 EXTERN_ long frames_scaled;
00504 EXTERN_ int frame0, tc0;
00505 EXTERN_ int mpeg1;
00506 EXTERN_ int fieldpic;
00507
00508
00509
00510 EXTERN_ int qsubsample_offset,
00511 fsubsample_offset,
00512 rowsums_offset,
00513 colsums_offset;
00514 EXTERN_ int mb_per_pict;
00515 EXTERN_ int fast_mc_frac;
00516
00517 EXTERN_ int mc_44_red;
00518 EXTERN_ int mc_22_red;
00519
00520
00521
00522 EXTERN_ int horizontal_size, vertical_size;
00523 EXTERN_ int width, height;
00524 EXTERN_ int chrom_width, chrom_height, block_count;
00525 EXTERN_ int mb_width, mb_height;
00526 EXTERN_ int width2, height2, mb_height2, chrom_width2;
00527 EXTERN_ int aspectratio;
00528 EXTERN_ int frame_rate_code;
00529 EXTERN_ int dctsatlim;
00530 EXTERN_ double frame_rate;
00531 EXTERN_ double input_frame_rate;
00532 EXTERN_ double bit_rate;
00533 EXTERN_ int video_buffer_size;
00534 EXTERN_ int vbv_buffer_size;
00535 EXTERN_ int constrparms;
00536 EXTERN_ int load_iquant, load_niquant;
00537 EXTERN_ int load_ciquant,load_cniquant;
00538
00539
00540
00541
00542 EXTERN_ int profile, level;
00543 EXTERN_ int prog_seq;
00544 EXTERN_ int chroma_format;
00545 EXTERN_ int low_delay;
00546
00547
00548
00549
00550 EXTERN_ int video_format;
00551 EXTERN_ int color_primaries;
00552 EXTERN_ int transfer_characteristics;
00553 EXTERN_ int matrix_coefficients;
00554 EXTERN_ int display_horizontal_size, display_vertical_size;
00555
00556
00557
00558 EXTERN_ int opt_dc_prec;
00559 EXTERN_ int opt_prog_frame;
00560 EXTERN_ int opt_repeatfirst;
00561 EXTERN_ int opt_topfirst;
00562
00563
00564 EXTERN_ int frame_pred_dct_tab[3];
00565 EXTERN_ int conceal_tab[3];
00566 EXTERN_ int qscale_tab[3];
00567 EXTERN_ int intravlc_tab[3];
00568 EXTERN_ int altscan_tab[3];
00569
00570
00571
00572
00573 void range_checks _ANSI_ARGS_((void));
00574 void profile_and_level_checks _ANSI_ARGS_(());
00575
00576
00577 void init_fdct _ANSI_ARGS_((void));
00578
00579
00580 void init_idct _ANSI_ARGS_((void));
00581
00582
00583 void motion_estimation _ANSI_ARGS_((pict_data_s *picture,
00584 motion_comp_s *mc_data,
00585 int secondfield, int ipflag));
00586
00587
00588 void error _ANSI_ARGS_((char *text));
00589
00590
00591 void predict _ANSI_ARGS_((pict_data_s *picture,
00592 uint8_t *reff[],
00593 uint8_t *refb[],
00594 uint8_t *cur[3],
00595 int secondfield));
00596
00597
00598 void slice_initbits(slice_engine_t *engine);
00599 void slice_putbits(slice_engine_t *engine, long val, int n);
00600 void slice_alignbits(slice_engine_t *engine);
00601 void slice_finishslice(slice_engine_t *engine);
00602
00603
00604 void mpeg2_initbits _ANSI_ARGS_((void));
00605 void putbits _ANSI_ARGS_((int val, int n));
00606 void alignbits _ANSI_ARGS_((void));
00607 double bitcount _ANSI_ARGS_((void));
00608
00609
00610 void putseqhdr _ANSI_ARGS_((void));
00611 void putseqext _ANSI_ARGS_((void));
00612 void putseqdispext _ANSI_ARGS_((void));
00613 void putuserdata _ANSI_ARGS_((char *userdata));
00614 void putgophdr _ANSI_ARGS_((int frame, int closed_gop));
00615 void putpicthdr _ANSI_ARGS_((pict_data_s *picture));
00616 void putpictcodext _ANSI_ARGS_((pict_data_s *picture));
00617 void putseqend _ANSI_ARGS_((void));
00618
00619
00620 void putintrablk _ANSI_ARGS_((slice_engine_t *engine, pict_data_s *picture, short *blk, int cc));
00621 void putnonintrablk _ANSI_ARGS_((slice_engine_t *engine, pict_data_s *picture, short *blk));
00622 void putmv _ANSI_ARGS_((slice_engine_t *engine, int dmv, int f_code));
00623
00624
00625 void putpict _ANSI_ARGS_((pict_data_s *picture));
00626
00627
00628 void putseq _ANSI_ARGS_((void));
00629
00630
00631 void putDClum _ANSI_ARGS_((slice_engine_t *engine, int val));
00632 void putDCchrom _ANSI_ARGS_((slice_engine_t *engine, int val));
00633 void putACfirst _ANSI_ARGS_((slice_engine_t *engine, int run, int val));
00634 void putAC _ANSI_ARGS_((slice_engine_t *engine, int run, int signed_level, int vlcformat));
00635 void putaddrinc _ANSI_ARGS_((slice_engine_t *engine, int addrinc));
00636 void putmbtype _ANSI_ARGS_((slice_engine_t *engine, int pict_type, int mb_type));
00637 void putmotioncode _ANSI_ARGS_((slice_engine_t *engine, int motion_code));
00638 void putdmv _ANSI_ARGS_((slice_engine_t *engine, int dmv));
00639 void putcbp _ANSI_ARGS_((slice_engine_t *engine, int cbp));
00640
00641 extern int (*pquant_non_intra)(pict_data_s *picture, int16_t *src, int16_t *dst,
00642 int mquant, int *nonsat_mquant);
00643
00644 extern int (*pquant_weight_coeff_sum)(int16_t *blk, uint16_t*i_quant_mat );
00645
00646
00647
00648 void iquantize( pict_data_s *picture );
00649 void quant_intra_hv ( pict_data_s *picture,
00650 int16_t *src, int16_t *dst,
00651 int mquant, int *nonsat_mquant);
00652 int quant_non_intra_hv( pict_data_s *picture,
00653 int16_t *src, int16_t *dst,
00654 int mquant, int *nonsat_mquant);
00655 void iquant_intra ( int16_t *src, int16_t *dst, int dc_prec, int mquant);
00656 void iquant_non_intra (int16_t *src, int16_t *dst, int mquant);
00657 void init_quantizer_hv();
00658 int next_larger_quant_hv( pict_data_s *picture, int quant );
00659
00660 extern int (*pquant_non_intra)(pict_data_s *picture, int16_t *src, int16_t *dst,
00661 int mquant, int *nonsat_mquant);
00662
00663 extern int (*pquant_weight_coeff_sum)(int16_t *blk, uint16_t*i_quant_mat );
00664
00665
00666 void ratectl_init_seq _ANSI_ARGS_((ratectl_t *ratectl));
00667 void ratectl_init_GOP _ANSI_ARGS_((ratectl_t *ratectl, int np, int nb));
00668 void ratectl_init_pict _ANSI_ARGS_((ratectl_t *ratectl, pict_data_s *picture));
00669 void ratectl_update_pict _ANSI_ARGS_((ratectl_t *ratectl, pict_data_s *picture));
00670 int ratectl_start_mb _ANSI_ARGS_((ratectl_t *ratectl, pict_data_s *picture));
00671 int ratectl_calc_mquant _ANSI_ARGS_((ratectl_t *ratectl, pict_data_s *picture, int j));
00672 void vbv_end_of_picture _ANSI_ARGS_((void));
00673 void calc_vbv_delay _ANSI_ARGS_((void));
00674
00675
00676 void readframe _ANSI_ARGS_((int frame_num, uint8_t *frame[]));
00677
00678
00679 void calcSNR _ANSI_ARGS_((unsigned char *org[3], unsigned char *rec[3]));
00680 void stats _ANSI_ARGS_((void));
00681
00682
00683 void transform _ANSI_ARGS_((pict_data_s *picture,
00684 uint8_t *pred[],
00685 uint8_t *cur[]));
00686 void itransform _ANSI_ARGS_((pict_data_s *picture,
00687 uint8_t *pred[], uint8_t *cur[]));
00688 void dct_type_estimation _ANSI_ARGS_((pict_data_s *picture,
00689 uint8_t *pred, uint8_t *cur));
00690