1 /* mpeg2enc.c, main() and parameter file reading */
3 /* Copyright (C) 1996, MPEG Software Simulation Group. All Rights Reserved. */
6 * Disclaimer of Warranty
8 * These software programs are available to the user without any license fee or
9 * royalty on an "as is" basis. The MPEG Software Simulation Group disclaims
10 * any and all warranties, whether express, implied, or statuary, including any
11 * implied warranties or merchantability or of fitness for a particular
12 * purpose. In no event shall the copyright-holder be liable for any
13 * incidental, punitive, or consequential damages of any kind whatsoever
14 * arising from the use of these programs.
16 * This disclaimer of warranty extends to the user of these programs and user's
17 * customers, employees, agents, transferees, successors, and assigns.
19 * The MPEG Software Simulation Group does not represent or warrant that the
20 * programs furnished hereunder are free of infringement of any third-party
23 * Commercial implementations of MPEG-1 and MPEG-2 video, including shareware,
24 * are subject to royalty fees to patent holders. Many of these patents are
25 * general enough such that they are unavoidable regardless of implementation
30 #define MAX(a,b) ( (a)>(b) ? (a) : (b) )
36 #define GLOBAL_ /* used by global.h */
40 /* private prototypes */
41 static void init
_ANSI_ARGS_((void));
42 static void readcmdline
_ANSI_ARGS_((int argc
, char *argv
[]));
43 static void readquantmat
_ANSI_ARGS_((void));
46 // Hack for libdv to remove glib dependancy
49 g_log (const char *log_domain
,
57 g_logv (const char *log_domain
,
65 void mpeg2enc_set_w(int width
)
67 horizontal_size
= width
;
70 void mpeg2enc_set_h(int height
)
72 vertical_size
= height
;
75 void mpeg2enc_set_rate(double rate
)
77 input_frame_rate
= rate
;
80 void mpeg2enc_set_input_buffers(int eof
, char *y
, char *u
, char *v
)
82 pthread_mutex_lock(&output_lock
);
83 input_buffer_end
= eof
;
87 pthread_mutex_unlock(&input_lock
);
88 // Wait for buffers to get copied before returning.
89 pthread_mutex_lock(©_lock
);
92 void mpeg2enc_init_buffers()
94 pthread_mutex_init(&input_lock
, 0);
95 pthread_mutex_init(&output_lock
, 0);
96 pthread_mutex_init(©_lock
, 0);
97 pthread_mutex_lock(&input_lock
);
98 pthread_mutex_lock(©_lock
);
102 int mpeg2enc(int argc
, char *argv
[])
109 /* Read command line */
110 readcmdline(argc
, argv
);
112 /* read quantization matrices */
115 if(!strlen(out_path
))
117 fprintf(stderr
, "No output file given.\n");
120 /* open output file */
121 if(!(outfile
= fopen(out_path
, "wb")))
123 sprintf(errortext
,"Couldn't create output file %s", out_path
);
129 if(nframes
< 0x7fffffff)
130 printf("Frame Completion Current bitrate Predicted file size\n");
133 stop_slice_engines();
134 stop_motion_engines();
135 stop_transform_engines();
136 stop_itransform_engines();
141 if(qt_file
) quicktime_close(qt_file
);
142 if(qt_output
) quicktime_close(qt_output
);
143 if(mpeg_file
) mpeg3_close(mpeg_file
);
149 pthread_mutex_destroy(&input_lock
);
150 pthread_mutex_destroy(&output_lock
);
154 int HorzMotionCode(int i
)
162 if ((i
< 64) || (constrparms
))
168 if ((i
< 512) || (level
== 10))
170 if ((i
< 1024) || (level
== 8))
177 int VertMotionCode(int i
)
185 if ((i
< 64) || (level
== 10) || (constrparms
))
191 Wrapper for malloc that allocates pbuffers aligned to the
192 specified byte boundary and checks for failure.
193 N.b. don't try to free the resulting pointers, eh...
194 BUG: Of course this won't work if a char * won't fit in an int....
196 static uint8_t *bufalloc( size_t size
)
198 char *buf
= malloc( size
+ BUFFER_ALIGN
);
203 error("malloc failed\n");
205 adjust
= BUFFER_ALIGN
-((int)buf
)%BUFFER_ALIGN
;
206 if( adjust
== BUFFER_ALIGN
)
208 return (uint8_t*)(buf
+adjust
);
214 static int block_count_tab
[3] = {6,8,12};
215 int lum_buffer_size
, chrom_buffer_size
;
216 pthread_mutexattr_t mutex_attr
;
217 pthread_mutexattr_init(&mutex_attr
);
218 pthread_mutex_init(&test_lock
, &mutex_attr
);
220 bzero(&cur_picture
, sizeof(pict_data_s
));
229 /* round picture dimensions to nZearest multiple of 16 or 32 */
230 mb_width
= (horizontal_size
+15)/16;
231 mb_height
= prog_seq
?
232 (vertical_size
+ 15) / 16 :
233 2 * ((vertical_size
+ 31) / 32);
234 mb_height2
= fieldpic
?
236 mb_height
; /* for field pictures */
237 width
= 16 * mb_width
;
238 height
= 16 * mb_height
;
240 chrom_width
= (chroma_format
==CHROMA444
) ? width
: width
>>1;
241 chrom_height
= (chroma_format
!=CHROMA420
) ? height
: height
>>1;
243 height2
= fieldpic
? height
>>1 : height
;
244 width2
= fieldpic
? width
<<1 : width
;
245 chrom_width2
= fieldpic
? chrom_width
<<1 : chrom_width
;
247 block_count
= block_count_tab
[chroma_format
-1];
248 lum_buffer_size
= (width
*height
) +
249 sizeof(uint8_t) *(width
/2)*(height
/2) +
250 sizeof(uint8_t) *(width
/4)*(height
/4+1);
251 chrom_buffer_size
= chrom_width
*chrom_height
;
253 fsubsample_offset
= (width
)*(height
) * sizeof(uint8_t);
254 qsubsample_offset
= fsubsample_offset
+ (width
/2)*(height
/2)*sizeof(uint8_t);
259 mb_per_pict
= mb_width
*mb_height2
;
262 if (!(clp
= (unsigned char *)malloc(1024)))
263 error("malloc failed\n");
265 for (i
=-384; i
<640; i
++)
266 clp
[i
] = (i
<0) ? 0 : ((i
>255) ? 255 : i
);
270 /* Allocate the frame buffer */
273 frame_buffers
= (uint8_t ***)
274 bufalloc(2*READ_LOOK_AHEAD
*sizeof(uint8_t**));
276 for(n
=0;n
<2*READ_LOOK_AHEAD
;n
++)
278 frame_buffers
[n
] = (uint8_t **) bufalloc(3*sizeof(uint8_t*));
281 frame_buffers
[n
][i
] =
282 bufalloc( (i
==0) ? lum_buffer_size
: chrom_buffer_size
);
288 /* TODO: The ref and aux frame buffers are no redundant! */
289 for( i
= 0 ; i
<3; i
++)
291 int size
= (i
==0) ? lum_buffer_size
: chrom_buffer_size
;
292 newrefframe
[i
] = bufalloc(size
);
293 oldrefframe
[i
] = bufalloc(size
);
294 auxframe
[i
] = bufalloc(size
);
295 predframe
[i
] = bufalloc(size
);
298 cur_picture
.qblocks
=
299 (int16_t (*)[64])bufalloc(mb_per_pict
*block_count
*sizeof(int16_t [64]));
301 /* Initialise current transformed picture data tables
302 These will soon become a buffer for transformed picture data to allow
303 look-ahead for bit allocation etc.
305 cur_picture
.mbinfo
= (
306 struct mbinfo
*)bufalloc(mb_per_pict
*sizeof(struct mbinfo
));
309 (int16_t (*)[64])bufalloc(mb_per_pict
* block_count
* sizeof(int16_t [64]));
312 /* open statistics output file */
313 if(statname
[0]=='-') statfile
= stdout
;
315 if(!(statfile
= fopen(statname
,"w")))
317 sprintf(errortext
,"Couldn't create statistics output file %s",statname
);
321 ratectl
= malloc(processors
* sizeof(ratectl_t
*));
322 for(i
= 0; i
< processors
; i
++)
323 ratectl
[i
] = calloc(1, sizeof(ratectl_t
));
327 /* Start parallel threads */
329 //printf("init 1\n");
330 start_motion_engines();
331 //printf("init 2\n");
332 start_transform_engines();
333 //printf("init 3\n");
334 start_itransform_engines();
335 //printf("init 4\n");
336 start_slice_engines();
337 //printf("init 5\n");
343 fprintf(stderr
,text
);
348 #define STRINGLEN 254
352 /* Get processor count */
355 if(proc
= fopen("/proc/cpuinfo", "r"))
360 fgets(string
, 1024, proc
);
361 if(!strncasecmp(string
, "processor", 9))
363 char *ptr
= strchr(string
, ':');
367 result
= atol(ptr
) + 1;
371 if(!strncasecmp(string
, "cpus detected", 13))
373 char *ptr
= strchr(string
, ':');
386 static void readcmdline(int argc
, char *argv
[])
392 // Master frame rate table must match decoder
393 static double ratetab
[]=
394 {24000.0/1001.0, // Official rates
403 1, // Unofficial economy rates
410 // VBV buffer size limits
411 int vbvlim
[4] = { 597, 448, 112, 29 };
412 long total_frame_rates
= (sizeof(ratetab
) / sizeof(double));
415 int param_searchrad
= 16;
418 //printf("readcmdline 1\n");
419 frame0
= 0; /* number of first frame */
420 start_frame
= end_frame
= -1;
422 use_denoise_quant
= 0;
424 bit_rate
= 5000000; /* default bit_rate (bits/s) */
425 prog_seq
= 0; /* progressive_sequence is faster */
426 mpeg1
= 0; /* ISO/IEC 11172-2 stream */
427 fixed_mquant
= 0; /* vary the quantization */
430 N
= 15; /* N (# of frames in GOP) */
431 M
= 1; /* M (I/P frame distance) */
432 processors
= calculate_smp();
434 chroma_format
= 1; /* chroma_format: 1=4:2:0, 2=4:2:2, 3=4:4:4 LibMPEG3 only does 1 */
439 seq_header_every_gop
= 0;
440 /* aspect_ratio_information 1=square pel, 2=4:3, 3=16:9, 4=2.11:1 */
447 //printf("readcmdline 2\n");
451 sprintf(out_path
, "");
453 #define INTTOYES(x) ((x) ? "Yes" : "No")
454 // This isn't used anymore as this is a library entry point.
457 printf("mpeg2encode V1.3, 2000/01/10\n"
458 "(C) 1996, MPEG Software Simulation Group\n"
459 "(C) 2001 Heroine Virtual\n"
460 "Usage: %s [options] <input file> <output file>\n\n"
461 " -1 generate an MPEG-1 stream instead of MPEG-2 (%s)\n"
462 " -422 generate YUV 4:2:2 output\n"
463 " -b bitrate fix the bitrate, vary the quantization (%d)\n"
465 " -f rate Convert framerate\n"
466 " -h High resolution quantization table (%s)\n"
467 " -m frames set number of frames between P frames (%d)\n"
468 " -n frames set number of frames between I frames (%d)\n"
469 " -p encode progressive frames (%s)\n"
470 " -q quantization fix the quantization, vary the bitrate\n"
471 " [number] Start encoding from frame number to end\n"
472 " [number1] [number2] Encode frame number 1 to frame number 2\n"
473 " -u Use only 1 processor\n\n"
474 "Default settings:\n"
475 " fixed 5000000 bits/sec\n"
478 " 15 frames between I frames 0 frames between P frames\n\n"
479 "For the recommended encoding parameters see docs/index.html.\n",
481 mpeg1
? "MPEG-1" : "MPEG-2",
483 INTTOYES(use_denoise_quant
),
484 INTTOYES(use_hires_quant
),
490 //printf("readcmdline 3\n");
492 for(i
= 1; i
< argc
; i
++)
496 for(j
= 0; j
< strlen(argv
[i
]) && isnum
; j
++)
498 if(isalpha(argv
[i
][j
])) isnum
= 0;
502 //printf("readcmdline %s\n", argv[i]);
503 if(!strcmp(argv
[i
], "-1"))
508 if(!strcmp(argv
[i
], "-a"))
513 aspectratio
= atoi(argv
[i
]);
517 fprintf(stderr
, "-i needs an aspect ratio enumeration.\n");
522 if(!strcmp(argv
[i
], "-b"))
527 bit_rate
= atol(argv
[i
]);
531 fprintf(stderr
, "-b requires a bitrate\n");
536 if(!strcmp(argv
[i
], "-d"))
538 use_denoise_quant
= 1;
541 if(!strcmp(argv
[i
], "-f"))
546 frame_rate
= atof(argv
[i
]);
550 fprintf(stderr
, "-f requires a frame rate\n");
555 if(!strcmp(argv
[i
], "-h"))
560 if(!strcmp(argv
[i
], "-m"))
565 M
= atol(argv
[i
]) + 1;
569 fprintf(stderr
, "-m requires a frame count\n");
574 if(!strcmp(argv
[i
], "-n"))
583 fprintf(stderr
, "-n requires a frame count\n");
588 if(!strcmp(argv
[i
], "-p"))
593 if(!strcmp(argv
[i
], "-q"))
598 fixed_mquant
= atol(argv
[i
]);
602 fprintf(stderr
, "-q requires a quantization value\n");
607 if(!strcmp(argv
[i
], "-u"))
612 if(!strcmp(argv
[i
], "-422"))
617 if(!strcmp(argv
[i
], "-g"))
619 seq_header_every_gop
= 1;
622 if(!strcmp(argv
[i
], "-"))
627 /* Start or end frame if number */
631 start_frame
= atol(argv
[i
]);
634 end_frame
= atol(argv
[i
]);
637 if(!strlen(tplorg
) && !do_stdin
&& !do_buffers
)
640 strncpy(tplorg
, argv
[i
], STRINGLEN
);
643 if(!strlen(out_path
))
646 strncpy(out_path
, argv
[i
], STRINGLEN
);
649 //printf("readcmdline 4\n");
651 if(!strlen(out_path
))
653 // Default output path
654 strncpy(out_path
, tplorg
, STRINGLEN
);
655 for(i
= strlen(out_path
) - 1; i
>= 0 && out_path
[i
] != '.'; i
--)
658 if(i
< 0) i
= strlen(out_path
);
661 sprintf(&out_path
[i
], ".m1v");
663 sprintf(&out_path
[i
], ".m2v");
665 //printf("readcmdline 5\n");
667 /* Get info from input file */
675 inputtype
= T_BUFFERS
;
678 if(mpeg3_check_sig(tplorg
))
681 mpeg_file
= mpeg3_open(tplorg
, &error_return
);
685 if(quicktime_check_sig(tplorg
))
687 qt_file
= quicktime_open(tplorg
, 1, 0);
688 inputtype
= T_QUICKTIME
;
690 //printf("readcmdline 6\n");
692 if(!qt_file
&& !mpeg_file
&& !do_stdin
&& !do_buffers
)
694 fprintf(stderr
, "File format not recognized.\n");
698 //printf("readcmdline 7\n");
701 if(!quicktime_video_tracks(qt_file
))
703 fprintf(stderr
, "No video tracks in file.\n");
707 if(!quicktime_supported_video(qt_file
, 0))
709 fprintf(stderr
, "Unsupported video codec.\n");
713 //printf("readcmdline 8\n");
715 /************************************************************************
716 * BEGIN PARAMETER FILE
717 ************************************************************************/
719 /* To eliminate the user hassle we replaced the parameter file with hard coded constants. */
720 strcpy(tplref
, "-"); /* name of intra quant matrix file ("-": default matrix) */
721 strcpy(iqname
, "-"); /* name of intra quant matrix file ("-": default matrix) */
722 strcpy(niqname
, "-"); /* name of non intra quant matrix file ("-": default matrix) */
723 strcpy(statname
, "/dev/null"); /* name of statistics file ("-": stdout ) */
727 nframes
= quicktime_video_length(qt_file
, 0); /* number of frames */
728 horizontal_size
= quicktime_video_width(qt_file
, 0);
729 vertical_size
= quicktime_video_height(qt_file
, 0);
734 nframes
= 0x7fffffff; /* Use percentage instead */
735 horizontal_size
= mpeg3_video_width(mpeg_file
, 0);
736 vertical_size
= mpeg3_video_height(mpeg_file
, 0);
741 unsigned char data
[1024];
742 nframes
= 0x7fffffff;
744 fgets(data
, 1024, stdin_fd
);
745 horizontal_size
= atol(data
);
746 fgets(data
, 1024, stdin_fd
);
747 vertical_size
= atol(data
);
752 nframes
= 0x7fffffff;
756 h
= m
= s
= f
= 0; /* timecode of first frame */
757 fieldpic
= 0; /* 0: progressive, 1: bottom first, 2: top first, 3 = progressive seq, field MC and DCT in picture */
758 low_delay
= 0; /* low_delay */
759 constrparms
= 0; /* constrained_parameters_flag */
760 profile
= 4; /* Profile ID: Simple = 5, Main = 4, SNR = 3, Spatial = 2, High = 1 */
761 level
= 4; /* Level ID: Low = 10, Main = 8, High 1440 = 6, High = 4 */
762 video_format
= 2; /* video_format: 0=comp., 1=PAL, 2=NTSC, 3=SECAM, 4=MAC, 5=unspec. */
763 color_primaries
= 5; /* color_primaries */
764 dctsatlim
= mpeg1
? 255 : 2047;
766 transfer_characteristics
= 5; /* transfer_characteristics */
767 matrix_coefficients
= 4; /* matrix_coefficients (not used) */
768 display_horizontal_size
= horizontal_size
;
769 display_vertical_size
= vertical_size
;
770 cur_picture
.dc_prec
= 0; /* intra_dc_precision (0: 8 bit, 1: 9 bit, 2: 10 bit, 3: 11 bit */
771 cur_picture
.topfirst
= 1; /* top_field_first */
773 frame_pred_dct_tab
[0] = mpeg1
? 1 : 0; /* frame_pred_frame_dct (I P B) */
774 frame_pred_dct_tab
[1] = mpeg1
? 1 : 0; /* frame_pred_frame_dct (I P B) */
775 frame_pred_dct_tab
[2] = mpeg1
? 1 : 0; /* frame_pred_frame_dct (I P B) */
777 conceal_tab
[0] = 0; /* concealment_motion_vectors (I P B) */
778 conceal_tab
[1] = 0; /* concealment_motion_vectors (I P B) */
779 conceal_tab
[2] = 0; /* concealment_motion_vectors (I P B) */
780 qscale_tab
[0] = mpeg1
? 0 : 1; /* q_scale_type (I P B) */
781 qscale_tab
[1] = mpeg1
? 0 : 1; /* q_scale_type (I P B) */
782 qscale_tab
[2] = mpeg1
? 0 : 1; /* q_scale_type (I P B) */
784 intravlc_tab
[0] = 0; /* intra_vlc_format (I P B)*/
785 intravlc_tab
[1] = 0; /* intra_vlc_format (I P B)*/
786 intravlc_tab
[2] = 0; /* intra_vlc_format (I P B)*/
787 altscan_tab
[0] = 0; /* alternate_scan_hv (I P B) */
788 altscan_tab
[1] = 0; /* alternate_scan_hv (I P B) */
789 altscan_tab
[2] = 0; /* alternate_scan_hv (I P B) */
790 opt_dc_prec
= 0; /* 8 bits */
791 opt_topfirst
= (fieldpic
== 2);
793 opt_prog_frame
= prog_seq
;
794 cur_picture
.repeatfirst
= 0; /* repeat_first_field */
795 cur_picture
.prog_frame
= prog_seq
; /* progressive_frame */
796 /* P: forw_hor_f_code forw_vert_f_code search_width/height */
797 motion_data
= (struct motion_data
*)malloc(3 * sizeof(struct motion_data
));
798 video_buffer_size
= 46 * 1024 * 8;
800 /************************************************************************
802 ************************************************************************/
803 //printf("readcmdline 10\n");
808 cur_picture
.prog_frame
= 1;
814 input_frame_rate
= quicktime_frame_rate(qt_file
, 0);
819 input_frame_rate
= mpeg3_frame_rate(mpeg_file
, 0);
826 fgets(data
, 1024, stdin_fd
);
828 input_frame_rate
= atof(data
);
834 frame_rate
= input_frame_rate
;
836 //printf("readcmdline 11\n");
840 if(start_frame
>= 0 && end_frame
>= 0)
842 nframes
= end_frame
- start_frame
;
843 frame0
= start_frame
;
849 nframes
-= start_frame
;
850 frame0
= start_frame
;
857 //printf("readcmdline 12\n");
862 printf("Encoding: %s frames %ld\n", out_path
, nframes
);
864 if(fixed_mquant
== 0)
865 printf(" bitrate %.0f\n", bit_rate
);
867 printf(" quantization %d\n", fixed_mquant
);
868 printf(" %d frames between I frames %d frames between P frames\n", N
, M
- 1);
869 printf(" %s\n", (prog_seq
? "progressive" : "interlaced"));
870 printf(" %s\n", (mpeg1
? "MPEG-1" : "MPEG-2"));
871 printf(" %s\n", (chroma_format
== 1) ? "YUV-420" : "YUV-422");
872 printf(" %d processors\n", processors
);
873 printf(" %.02f frames per second\n", frame_rate
);
874 printf(" Denoise %s\n", INTTOYES(use_denoise_quant
));
875 printf(" Aspect ratio index %d\n", aspectratio
);
876 printf(" Hires quantization %s\n", INTTOYES(use_hires_quant
));
881 fprintf(stderr
, "(MPEG to MPEG transcoding for official use only.)\n");
888 int radius_x
= ((param_searchrad
+ 4) / 8) * 8;
889 int radius_y
= ((param_searchrad
* vertical_size
/ horizontal_size
+ 4) / 8) * 8;
892 /* TODO: These f-codes should really be adjusted for each
895 if( radius_x
*M
< 64) c
= 4;
896 if( radius_x
*M
< 32) c
= 3;
897 if( radius_x
*M
< 16) c
= 2;
898 if( radius_x
*M
< 8) c
= 1;
901 error("malloc failed\n");
907 motion_data
[i
].forw_hor_f_code
= c
;
908 motion_data
[i
].forw_vert_f_code
= c
;
909 motion_data
[i
].sxf
= MAX(1,radius_x
*M
);
910 motion_data
[i
].syf
= MAX(1,radius_y
*M
);
914 motion_data
[i
].forw_hor_f_code
= c
;
915 motion_data
[i
].forw_vert_f_code
= c
;
916 motion_data
[i
].sxf
= MAX(1,radius_x
*i
);
917 motion_data
[i
].syf
= MAX(1,radius_y
*i
);
918 motion_data
[i
].back_hor_f_code
= c
;
919 motion_data
[i
].back_vert_f_code
= c
;
920 motion_data
[i
].sxb
= MAX(1,radius_x
*(M
-i
));
921 motion_data
[i
].syb
= MAX(1,radius_y
*(M
-i
));
927 // vbv_buffer_size = floor(((double)bit_rate * 0.20343) / 16384.0);
929 vbv_buffer_size
= 20 * 16384;
931 vbv_buffer_size
= 112 * 16384;
937 if(vbv_buffer_size
> vbvlim
[(level
- 4) >> 1])
938 vbv_buffer_size
= vbvlim
[(level
- 4) >> 1];
940 /* Set up frame buffers */
941 frame_buffer
= malloc(horizontal_size
* vertical_size
* 3 + 4);
942 row_pointers
= malloc(sizeof(unsigned char*) * vertical_size
);
943 for(i
= 0; i
< vertical_size
; i
++) row_pointers
[i
] = &frame_buffer
[horizontal_size
* 3 * i
];
945 // Get frame rate code from input frame rate
946 for(i
= 0; i
< total_frame_rates
; i
++)
948 if(fabs(frame_rate
- ratetab
[i
]) < 0.001) frame_rate_code
= i
+ 1;
951 /* make flags boolean (x!=0 -> x=1) */
953 fieldpic
= !!fieldpic
;
954 low_delay
= !!low_delay
;
955 constrparms
= !!constrparms
;
956 prog_seq
= !!prog_seq
;
957 cur_picture
.topfirst
= !!cur_picture
.topfirst
;
959 for (i
= 0; i
< 3; i
++)
961 frame_pred_dct_tab
[i
] = !!frame_pred_dct_tab
[i
];
962 conceal_tab
[i
] = !!conceal_tab
[i
];
963 qscale_tab
[i
] = !!qscale_tab
[i
];
964 intravlc_tab
[i
] = !!intravlc_tab
[i
];
965 altscan_tab
[i
] = !!altscan_tab
[i
];
967 cur_picture
.repeatfirst
= !!cur_picture
.repeatfirst
;
968 cur_picture
.prog_frame
= !!cur_picture
.prog_frame
;
970 /* make sure MPEG specific parameters are valid */
973 /* timecode -> frame number */
977 tc0
= (int)(frame_rate
+0.5)*tc0
+ f
;
992 profile_and_level_checks();
999 if (horizontal_size
>768
1000 || vertical_size
>576
1001 || ((horizontal_size
+15)/16)*((vertical_size
+15) / 16) > 396
1002 || ((horizontal_size
+15)/16)*((vertical_size
+15) / 16)*frame_rate
>396*25.0
1006 fprintf(stderr
,"*** Warning: setting constrained_parameters_flag = 0\n");
1012 /* relational checks */
1021 if (chroma_format
!=CHROMA420
)
1023 chroma_format
= CHROMA420
;
1026 if (cur_picture
.dc_prec
!=0)
1028 cur_picture
.dc_prec
= 0;
1038 if (intravlc_tab
[i
])
1040 intravlc_tab
[i
] = 0;
1050 if (!mpeg1
&& constrparms
)
1055 if (prog_seq
&& !cur_picture
.prog_frame
)
1057 cur_picture
.prog_frame
= 1;
1060 if (cur_picture
.prog_frame
&& fieldpic
)
1065 if (!cur_picture
.prog_frame
&& cur_picture
.repeatfirst
)
1067 cur_picture
.repeatfirst
= 0;
1070 if (cur_picture
.prog_frame
)
1073 if (!frame_pred_dct_tab
[i
])
1075 frame_pred_dct_tab
[i
] = 1;
1079 if (prog_seq
&& !cur_picture
.repeatfirst
&& cur_picture
.topfirst
)
1082 fprintf(stderr
,"Warning: setting top_field_first = 0\n");
1083 cur_picture
.topfirst
= 0;
1086 /* search windows */
1089 if (motion_data
[i
].sxf
> (4<<motion_data
[i
].forw_hor_f_code
)-1)
1093 "Warning: reducing forward horizontal search width to %d\n",
1094 (4<<motion_data
[i
].forw_hor_f_code
)-1);
1095 motion_data
[i
].sxf
= (4<<motion_data
[i
].forw_hor_f_code
)-1;
1098 if (motion_data
[i
].syf
> (4<<motion_data
[i
].forw_vert_f_code
)-1)
1102 "Warning: reducing forward vertical search width to %d\n",
1103 (4<<motion_data
[i
].forw_vert_f_code
)-1);
1104 motion_data
[i
].syf
= (4<<motion_data
[i
].forw_vert_f_code
)-1;
1109 if (motion_data
[i
].sxb
> (4<<motion_data
[i
].back_hor_f_code
)-1)
1113 "Warning: reducing backward horizontal search width to %d\n",
1114 (4<<motion_data
[i
].back_hor_f_code
)-1);
1115 motion_data
[i
].sxb
= (4<<motion_data
[i
].back_hor_f_code
)-1;
1118 if (motion_data
[i
].syb
> (4<<motion_data
[i
].back_vert_f_code
)-1)
1122 "Warning: reducing backward vertical search width to %d\n",
1123 (4<<motion_data
[i
].back_vert_f_code
)-1);
1124 motion_data
[i
].syb
= (4<<motion_data
[i
].back_vert_f_code
)-1;
1132 If the user has selected suppression of hf noise via
1133 quantisation then we boost quantisation of hf components
1134 EXPERIMENTAL: currently a linear ramp from 0 at 4pel to
1135 50% increased quantisation...
1138 static int quant_hfnoise_filt(int orgquant
, int qmat_pos
)
1140 int x
= qmat_pos
% 8;
1141 int y
= qmat_pos
/ 8;
1144 if(!use_denoise_quant
)
1149 /* Maximum 50% quantisation boost for HF components... */
1151 qboost
+= (256*(x
-4)/3);
1153 qboost
+= (256*(y
-4)/3);
1155 return (orgquant
* qboost
+ 512)/ 1024;
1158 static void readquantmat()
1169 for (i
=0; i
<64; i
++)
1171 intra_q
[i
] = hires_intra_quantizer_matrix_hv
[i
];
1176 load_iquant
= use_denoise_quant
;
1177 for (i
=0; i
<64; i
++)
1179 v
= quant_hfnoise_filt(default_intra_quantizer_matrix_hv
[i
], i
);
1181 error("value in intra quant matrix invalid (after noise filt adjust)");
1187 /* TODO: Inv Quant matrix initialisation should check if the fraction fits in 16 bits! */
1188 if (niqname
[0]=='-')
1192 for (i
=0; i
<64; i
++)
1194 inter_q
[i
] = hires_nonintra_quantizer_matrix_hv
[i
];
1199 /* default non-intra matrix is all 16's. For *our* default we use something
1200 more suitable for domestic analog sources... which is non-standard...*/
1202 for (i
=0; i
<64; i
++)
1204 v
= quant_hfnoise_filt(default_nonintra_quantizer_matrix_hv
[i
],i
);
1206 error("value in non-intra quant matrix invalid (after noise filt adjust)");
1212 for (i
=0; i
<64; i
++)
1214 i_intra_q
[i
] = (int)(((double)IQUANT_SCALE
) / ((double)intra_q
[i
]));
1215 i_inter_q
[i
] = (int)(((double)IQUANT_SCALE
) / ((double)inter_q
[i
]));
1218 for( q
= 1; q
<= 112; ++q
)
1220 for (i
=0; i
<64; i
++)
1222 intra_q_tbl
[q
][i
] = intra_q
[i
] * q
;
1223 inter_q_tbl
[q
][i
] = inter_q
[i
] * q
;
1224 intra_q_tblf
[q
][i
] = (float)intra_q_tbl
[q
][i
];
1225 inter_q_tblf
[q
][i
] = (float)inter_q_tbl
[q
][i
];
1226 i_intra_q_tblf
[q
][i
] = 1.0f
/ ( intra_q_tblf
[q
][i
] * 0.98);
1227 i_intra_q_tbl
[q
][i
] = (IQUANT_SCALE
/intra_q_tbl
[q
][i
]);
1228 i_inter_q_tblf
[q
][i
] = 1.0f
/ (inter_q_tblf
[q
][i
] * 0.98);
1229 i_inter_q_tbl
[q
][i
] = (IQUANT_SCALE
/inter_q_tbl
[q
][i
] );