Signal handler messages moved to help_mp, so they can be translated
[mplayer/greg.git] / mencoder.c
blobf395f428ca79557d2c6abfb2b7c71f675c446b07
1 #define VCODEC_COPY 0
2 #define VCODEC_FRAMENO 1
3 // real codecs:
4 #define VCODEC_DIVX4 2
5 #define VCODEC_LIBAVCODEC 4
6 #define VCODEC_RAWRGB 6
7 #define VCODEC_VFW 7
8 #define VCODEC_LIBDV 8
9 #define VCODEC_XVID 9
10 #define VCODEC_QTVIDEO 10
12 #define ACODEC_COPY 0
13 #define ACODEC_PCM 1
14 #define ACODEC_VBRMP3 2
15 #define ACODEC_NULL 3
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <string.h>
20 #include <signal.h>
21 #include <sys/time.h>
23 #include "config.h"
25 #include "version.h"
26 #include "mp_msg.h"
27 #include "help_mp.h"
29 static char* banner_text=
30 "\n\n"
31 "MEncoder " VERSION MSGTR_MEncoderCopyright
32 "\n";
34 #include "cpudetect.h"
36 #include "codec-cfg.h"
37 #ifdef NEW_CONFIG
38 #include "m_option.h"
39 #include "m_config.h"
40 #include "parser-mecmd.h"
41 #else
42 #include "cfgparser.h"
43 #include "playtree.h"
44 #endif
46 #include "libmpdemux/stream.h"
47 #include "libmpdemux/demuxer.h"
48 #include "libmpdemux/stheader.h"
49 #include "libmpdemux/mp3_hdr.h"
50 #include "libmpdemux/muxer.h"
53 #include "libvo/video_out.h"
55 #include "libao2/afmt.h"
57 #include "libmpcodecs/mp_image.h"
58 #include "libmpcodecs/dec_audio.h"
59 #include "libmpcodecs/dec_video.h"
60 #include "libmpcodecs/vf.h"
62 // for MPEGLAYER3WAVEFORMAT:
63 #include "loader/wine/mmreg.h"
65 #ifdef HAVE_MP3LAME
66 #undef CDECL
67 #include <lame/lame.h>
68 #endif
70 #ifdef HAVE_LIBCSS
71 #include "libmpdemux/dvdauth.h"
72 #endif
74 #include <inttypes.h>
76 #include "libvo/fastmemcpy.h"
78 #include "linux/timer.h"
80 int vo_doublebuffering=0;
81 int vo_directrendering=0;
82 int vo_config_count=0;
84 //--------------------------
86 // cache2:
87 int stream_cache_size=-1;
88 #ifdef USE_STREAM_CACHE
89 extern int cache_fill_status;
90 #else
91 #define cache_fill_status 0
92 #endif
94 int vcd_track=0;
95 int audio_id=-1;
96 int video_id=-1;
97 int dvdsub_id=-1;
98 int vobsub_id=-1;
99 static char* audio_lang=NULL;
100 static char* dvdsub_lang=NULL;
101 static char* spudec_ifo=NULL;
103 static char** audio_codec_list=NULL; // override audio codec
104 static char** video_codec_list=NULL; // override video codec
105 static char** audio_fm_list=NULL; // override audio codec family
106 static char** video_fm_list=NULL; // override video codec family
108 static int out_audio_codec=-1;
109 static int out_video_codec=-1;
111 int out_file_format=MUXER_TYPE_AVI; // default to AVI
113 // audio stream skip/resync functions requires only for seeking.
114 // (they should be implemented in the audio codec layer)
115 //void skip_audio_frame(sh_audio_t *sh_audio){}
116 //void resync_audio_stream(sh_audio_t *sh_audio){}
118 int verbose=0; // must be global!
119 double video_time_usage=0;
120 double vout_time_usage=0;
121 double max_video_time_usage=0;
122 double max_vout_time_usage=0;
123 double cur_video_time_usage=0;
124 double cur_vout_time_usage=0;
125 int benchmark=0;
127 // A-V sync:
128 int delay_corrected=1;
129 static float default_max_pts_correction=-1;//0.01f;
130 static float max_pts_correction=0;//default_max_pts_correction;
131 static float c_total=0;
133 static float audio_preload=0.5;
134 static float audio_delay=0.0;
135 static int audio_density=2;
137 static float force_fps=0;
138 static float force_ofps=0; // set to 24 for inverse telecine
139 static int skip_limit=-1;
141 static int force_srate=0;
142 static int audio_output_format=0;
144 char *vobsub_out=NULL;
145 unsigned int vobsub_out_index=0;
146 char *vobsub_out_id=NULL;
148 char* out_filename="test.avi";
150 char *force_fourcc=NULL;
152 char* passtmpfile="divx2pass.log";
154 static int play_n_frames=-1;
155 static int play_n_frames_mf=-1;
157 #include "libvo/font_load.h"
158 #include "libvo/sub.h"
160 // sub:
161 char *font_name=NULL;
162 float font_factor=0.75;
163 char *sub_name=NULL;
164 float sub_delay=0;
165 float sub_fps=0;
166 int sub_auto = 0;
167 int subcc_enabled=0;
168 int suboverlap_enabled = 1;
170 #ifdef USE_SUB
171 static subtitle* subtitles=NULL;
172 float sub_last_pts = -303;
173 #endif
175 // infos are empty by default
176 char *info_name=NULL;
177 char *info_artist=NULL;
178 char *info_genre=NULL;
179 char *info_subject=NULL;
180 char *info_copyright=NULL;
181 char *info_sourceform=NULL;
182 char *info_comment=NULL;
186 //char *out_audio_codec=NULL; // override audio codec
187 //char *out_video_codec=NULL; // override video codec
189 //#include "libmpeg2/mpeg2.h"
190 //#include "libmpeg2/mpeg2_internal.h"
192 #ifdef HAVE_MP3LAME
193 int lame_param_quality=0; // best
194 int lame_param_algqual=5; // same as old default
195 int lame_param_vbr=vbr_default;
196 int lame_param_mode=-1; // unset
197 int lame_param_padding=-1; // unset
198 int lame_param_br=-1; // unset
199 int lame_param_ratio=-1; // unset
200 float lame_param_scale=-1; // unset
201 #if HAVE_MP3LAME >= 392
202 int lame_param_fast=0; // unset
203 static char* lame_param_preset=NULL; // unset
204 static int lame_presets_set( lame_t gfp, int fast, int cbr, const char* preset_name );
205 static void lame_presets_longinfo_dm ( FILE* msgfp );
206 #endif
207 #endif
209 //static int vo_w=0, vo_h=0;
211 //-------------------------- config stuff:
213 m_config_t* mconfig;
215 #ifdef NEW_CONFIG
216 extern int
217 m_config_parse_config_file(m_config_t* config, char *conffile);
218 #endif
221 static int cfg_inc_verbose(struct config *conf){ ++verbose; return 0;}
223 static int cfg_include(struct config *conf, char *filename){
224 return m_config_parse_config_file(mconfig, filename);
227 static char *seek_to_sec=NULL;
228 static off_t seek_to_byte=0;
230 static int parse_end_at(struct config *conf, const char* param);
231 //static uint8_t* flip_upside_down(uint8_t* dst, const uint8_t* src, int width, int height);
233 #include "get_path.c"
235 #include "cfg-mplayer-def.h"
236 #include "cfg-mencoder.h"
238 #ifdef USE_DVDREAD
239 #include "spudec.h"
240 #endif
241 #include "vobsub.h"
243 /* FIXME */
244 void mencoder_exit(int level, char *how)
246 if (how)
247 printf("Exiting... (%s)\n", how);
248 else
249 printf("Exiting...\n");
251 exit(level);
254 void parse_cfgfiles( m_config_t* conf )
256 char *conffile;
257 if ((conffile = get_path("mencoder")) == NULL) {
258 mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_GetpathProblem);
259 } else {
260 if (m_config_parse_config_file(conf, conffile) < 0)
261 mencoder_exit(1,"configfile error");
262 free(conffile);
267 //---------------------------------------------------------------------------
269 static int dec_audio(sh_audio_t *sh_audio,unsigned char* buffer,int total){
270 int size=0;
271 int at_eof=0;
272 while(size<total && !at_eof){
273 int len=total-size;
274 if(len>MAX_OUTBURST) len=MAX_OUTBURST;
275 if(len>sh_audio->a_out_buffer_size) len=sh_audio->a_out_buffer_size;
276 if(len>sh_audio->a_out_buffer_len){
277 int ret=decode_audio(sh_audio,
278 &sh_audio->a_out_buffer[sh_audio->a_out_buffer_len],
279 len-sh_audio->a_out_buffer_len,
280 sh_audio->a_out_buffer_size-sh_audio->a_out_buffer_len);
281 if(ret>0) sh_audio->a_out_buffer_len+=ret; else at_eof=1;
283 if(len>sh_audio->a_out_buffer_len) len=sh_audio->a_out_buffer_len;
284 memcpy(buffer+size,sh_audio->a_out_buffer,len);
285 sh_audio->a_out_buffer_len-=len; size+=len;
286 if(sh_audio->a_out_buffer_len>0)
287 memcpy(sh_audio->a_out_buffer,&sh_audio->a_out_buffer[len],sh_audio->a_out_buffer_len);
289 return size;
292 //---------------------------------------------------------------------------
294 static int at_eof=0;
295 static int interrupted=0;
297 enum end_at_type_t {END_AT_NONE, END_AT_TIME, END_AT_SIZE};
298 static enum end_at_type_t end_at_type = END_AT_NONE;
299 static double end_at;
301 static void exit_sighandler(int x){
302 at_eof=1;
303 interrupted=1;
306 static muxer_t* muxer=NULL;
307 static FILE* muxer_f=NULL;
309 // callback for ve_*.c:
310 void mencoder_write_chunk(muxer_stream_t *s,int len,unsigned int flags){
311 muxer_write_chunk(muxer,s,muxer_f,len,flags);
314 extern void print_wave_header(WAVEFORMATEX *h);
316 int main(int argc,char* argv[]){
318 stream_t* stream=NULL;
319 demuxer_t* demuxer=NULL;
320 stream_t* stream2=NULL;
321 demuxer_t* demuxer2=NULL;
322 demux_stream_t *d_audio=NULL;
323 demux_stream_t *d_video=NULL;
324 demux_stream_t *d_dvdsub=NULL;
325 sh_audio_t *sh_audio=NULL;
326 sh_video_t *sh_video=NULL;
327 int file_format=DEMUXER_TYPE_UNKNOWN;
328 int i;
329 void *vobsub_writer=NULL;
331 uint32_t ptimer_start;
332 uint32_t audiorate=0;
333 uint32_t videorate=0;
334 uint32_t audiosamples=1;
335 uint32_t videosamples=1;
336 uint32_t skippedframes=0;
337 uint32_t duplicatedframes=0;
338 uint32_t badframes=0;
340 muxer_stream_t* mux_a=NULL;
341 muxer_stream_t* mux_v=NULL;
342 off_t muxer_f_size=0;
344 #ifdef HAVE_MP3LAME
345 lame_global_flags *lame;
346 #endif
348 double v_pts_corr=0;
349 double v_timer_corr=0;
351 #ifdef NEW_CONFIG
352 m_entry_t* filelist = NULL;
353 #else
354 play_tree_t* playtree;
355 play_tree_iter_t* playtree_iter;
356 #endif
357 char* filename=NULL;
358 char* frameno_filename="frameno.avi";
360 int decoded_frameno=0;
361 int next_frameno=-1;
363 unsigned int timer_start;
365 mp_msg_init();
366 mp_msg_set_level(MSGL_STATUS);
367 mp_msg(MSGT_CPLAYER,MSGL_INFO,"%s",banner_text);
369 /* Test for cpu capabilities (and corresponding OS support) for optimizing */
370 #ifdef ARCH_X86
371 GetCpuCaps(&gCpuCaps);
372 mp_msg(MSGT_CPLAYER,MSGL_INFO,"CPUflags: Type: %d MMX: %d MMX2: %d 3DNow: %d 3DNow2: %d SSE: %d SSE2: %d\n",
373 gCpuCaps.cpuType,gCpuCaps.hasMMX,gCpuCaps.hasMMX2,
374 gCpuCaps.has3DNow, gCpuCaps.has3DNowExt,
375 gCpuCaps.hasSSE, gCpuCaps.hasSSE2);
376 #endif
378 // check codec.conf
379 if(!parse_codec_cfg(get_path("codecs.conf"))){
380 if(!parse_codec_cfg(CONFDIR"/codecs.conf")){
381 if(!parse_codec_cfg(NULL)){
382 mp_msg(MSGT_MENCODER,MSGL_HINT,MSGTR_CopyCodecsConf);
383 exit(0);
385 mp_msg(MSGT_MENCODER,MSGL_INFO,MSGTR_BuiltinCodecsConf);
389 // FIXME: get rid of -dvd and other tricky options
390 stream2=open_stream(frameno_filename,0,&i);
391 if(stream2){
392 demuxer2=demux_open(stream2,DEMUXER_TYPE_AVI,-1,-1,-2);
393 if(demuxer2) printf(MSGTR_UsingPass3ControllFile,frameno_filename);
396 // New config code
397 #ifdef NEW_CONFIG
398 mconfig = m_config_new();
399 m_config_register_options(mconfig,mencoder_opts);
400 parse_cfgfiles(mconfig);
401 filelist = m_config_parse_me_command_line(mconfig, argc, argv);
402 if(!filelist) mencoder_exit(1, "error parsing cmdline");
403 m_entry_set_options(mconfig,&filelist[0]);
404 filename = filelist[0].name;
405 // Warn the user if he put more than 1 filename ?
406 #else
407 playtree = play_tree_new();
408 mconfig = m_config_new(playtree);
409 m_config_register_options(mconfig,mencoder_opts);
410 parse_cfgfiles(mconfig);
412 if(m_config_parse_command_line(mconfig, argc, argv) < 0) mencoder_exit(1, "error parsing cmdline");
413 playtree = play_tree_cleanup(playtree);
414 if(playtree) {
415 playtree_iter = play_tree_iter_new(playtree,mconfig);
416 if(playtree_iter) {
417 if(play_tree_iter_step(playtree_iter,0,0) != PLAY_TREE_ITER_ENTRY) {
418 play_tree_iter_free(playtree_iter);
419 playtree_iter = NULL;
421 filename = play_tree_iter_get_file(playtree_iter,1);
424 #endif
426 if(!filename && !vcd_track && !dvd_title && !tv_param_on){
427 printf(MSGTR_MissingFilename);
428 mencoder_exit(1,NULL);
431 mp_msg_set_level(verbose+MSGL_STATUS);
433 // check font
434 #ifdef USE_OSD
435 #ifdef HAVE_FREETYPE
436 init_freetype();
437 #else
438 if(font_name){
439 vo_font=read_font_desc(font_name,font_factor,verbose>1);
440 if(!vo_font) mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_CantLoadFont,font_name);
441 } else {
442 // try default:
443 vo_font=read_font_desc(get_path("font/font.desc"),font_factor,verbose>1);
444 if(!vo_font)
445 vo_font=read_font_desc(DATADIR"/font/font.desc",font_factor,verbose>1);
447 #endif
448 #endif
450 vo_init_osd();
452 stream=open_stream(filename,vcd_track,&file_format);
454 if(!stream){
455 printf(MSGTR_CannotOpenFile_Device);
456 mencoder_exit(1,NULL);
459 printf("success: format: %d data: 0x%X - 0x%X\n",file_format, (int)(stream->start_pos),(int)(stream->end_pos));
461 #ifdef USE_DVDREAD
462 if(stream->type==STREAMTYPE_DVD){
463 if(audio_lang && audio_id==-1) audio_id=dvd_aid_from_lang(stream,audio_lang);
464 if(dvdsub_lang && dvdsub_id==-1) dvdsub_id=dvd_sid_from_lang(stream,dvdsub_lang);
466 #endif
468 stream->start_pos+=seek_to_byte;
470 #ifdef HAVE_LIBCSS
471 // current_module="libcss";
472 if (dvdimportkey) {
473 if (dvd_import_key(dvdimportkey)) {
474 mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_ErrorDVDkey);
475 mencoder_exit(1,NULL);
477 mp_msg(MSGT_CPLAYER,MSGL_INFO,MSGTR_CmdlineDVDkey);
479 if (dvd_auth_device) {
480 // if (dvd_auth(dvd_auth_device,f)) {
481 if (dvd_auth(dvd_auth_device,filename)) {
482 mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_ErrorDVDAuth);
483 mencoder_exit(1,NULL);
485 mp_msg(MSGT_CPLAYER,MSGL_INFO,MSGTR_DVDauthOk);
487 #endif
489 if(stream_cache_size>0) stream_enable_cache(stream,stream_cache_size*1024,0,0);
491 if(demuxer2) audio_id=-2; /* do NOT read audio packets... */
493 //demuxer=demux_open(stream,file_format,video_id,audio_id,dvdsub_id);
494 demuxer=demux_open(stream,file_format,audio_id,video_id,dvdsub_id);
495 if(!demuxer){
496 printf(MSGTR_CannotOpenDemuxer);
497 mencoder_exit(1,NULL);
500 d_audio=demuxer2 ? demuxer2->audio : demuxer->audio;
501 d_video=demuxer->video;
502 d_dvdsub=demuxer->sub;
503 sh_audio=d_audio->sh;
504 sh_video=d_video->sh;
506 if(!video_read_properties(sh_video)){
507 printf(MSGTR_CannotReadVideoProperties);
508 mencoder_exit(1,NULL);
511 mp_msg(MSGT_MENCODER,MSGL_INFO,"[V] filefmt:%d fourcc:0x%X size:%dx%d fps:%5.2f ftime:=%6.4f\n",
512 demuxer->file_format,sh_video->format, sh_video->disp_w,sh_video->disp_h,
513 sh_video->fps,sh_video->frametime
516 if(force_fps){
517 sh_video->fps=force_fps;
518 sh_video->frametime=1.0f/sh_video->fps;
519 mp_msg(MSGT_MENCODER,MSGL_INFO,"input fps will be interpreted as %5.2f instead\n", sh_video->fps);
522 if(sh_audio && out_audio_codec<0){
523 if(audio_id==-2)
524 mp_msg(MSGT_MENCODER,MSGL_ERR,"This demuxer doesn't support -nosound yet.\n");
525 mp_msg(MSGT_MENCODER,MSGL_FATAL,MSGTR_NoAudioEncoderSelected);
526 mencoder_exit(1,NULL);
528 if(sh_video && out_video_codec<0){
529 mp_msg(MSGT_MENCODER,MSGL_FATAL,MSGTR_NoVideoEncoderSelected);
530 mencoder_exit(1,NULL);
533 if(sh_audio && (out_audio_codec || seek_to_sec || !sh_audio->wf)){
534 // Go through the codec.conf and find the best codec...
535 mp_msg(MSGT_CPLAYER,MSGL_INFO,"==========================================================================\n");
536 if(!init_best_audio_codec(sh_audio,audio_codec_list,audio_fm_list)){
537 sh_audio=d_audio->sh=NULL; // failed to init :(
539 mp_msg(MSGT_CPLAYER,MSGL_INFO,"==========================================================================\n");
542 // set up video encoder:
544 if (vobsub_out) {
545 unsigned int palette[16], width, height;
546 unsigned char tmp[3] = { 0, 0, 0 };
547 if (spudec_ifo && vobsub_parse_ifo(NULL,spudec_ifo, palette, &width, &height, 1, dvdsub_id, tmp) >= 0)
548 vobsub_writer = vobsub_out_open(vobsub_out, palette, sh_video->disp_w, sh_video->disp_h,
549 vobsub_out_id?vobsub_out_id:(char *)tmp, vobsub_out_index);
550 #ifdef USE_DVDREAD
551 if (vobsub_writer == NULL) {
552 char tmp[3];
553 if (vobsub_out_id == NULL && stream->type == STREAMTYPE_DVD) {
554 int i;
555 dvd_priv_t *dvd = (dvd_priv_t*)stream->priv;
556 for (i = 0; i < dvd->nr_of_subtitles; ++i)
557 if (dvd->subtitles[i].id == dvdsub_id) {
558 tmp[0] = (dvd->subtitles[i].language >> 8) & 0xff;
559 tmp[1] = dvd->subtitles[i].language & 0xff;
560 tmp[2] = 0;
561 vobsub_out_id = tmp;
562 break;
565 vobsub_writer=vobsub_out_open(vobsub_out, stream->type==STREAMTYPE_DVD?((dvd_priv_t *)(stream->priv))->cur_pgc->palette:NULL,
566 sh_video->disp_w, sh_video->disp_h, vobsub_out_id, vobsub_out_index);
568 #endif
570 else {
571 if (spudec_ifo) {
572 unsigned int palette[16], width, height;
573 if (vobsub_parse_ifo(NULL,spudec_ifo, palette, &width, &height, 1, -1, NULL) >= 0)
574 vo_spudec=spudec_new_scaled(palette, sh_video->disp_w, sh_video->disp_h);
576 #ifdef USE_DVDREAD
577 if (vo_spudec==NULL) {
578 vo_spudec=spudec_new_scaled(stream->type==STREAMTYPE_DVD?((dvd_priv_t *)(stream->priv))->cur_pgc->palette:NULL,
579 sh_video->disp_w, sh_video->disp_h);
581 #endif
584 #ifdef USE_SUB
585 // after reading video params we should load subtitles because
586 // we know fps so now we can adjust subtitles time to ~6 seconds AST
587 // check .sub
588 // current_module="read_subtitles_file";
589 if(sub_name){
590 subtitles=sub_read_file(sub_name, sh_video->fps);
591 if(!subtitles) mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_CantLoadSub,sub_name);
592 } else
593 if(sub_auto) { // auto load sub file ...
594 subtitles=sub_read_file( filename ? sub_filename( get_path("sub/"), filename )
595 : "default.sub", sh_video->fps );
597 #endif
600 // set up output file:
601 muxer_f=fopen(out_filename,"wb");
602 if(!muxer_f) {
603 printf(MSGTR_CannotOpenOutputFile, out_filename);
604 mencoder_exit(1,NULL);
607 muxer=muxer_new_muxer(out_file_format);
609 // ============= VIDEO ===============
611 mux_v=muxer_new_stream(muxer,MUXER_TYPE_VIDEO);
613 mux_v->buffer_size=0x200000; // 2MB
614 mux_v->buffer=malloc(mux_v->buffer_size);
616 mux_v->source=sh_video;
618 mux_v->h.dwSampleSize=0; // VBR
619 mux_v->h.dwScale=10000;
620 mux_v->h.dwRate=mux_v->h.dwScale*(force_ofps?force_ofps:sh_video->fps);
622 mux_v->codec=out_video_codec;
624 mux_v->bih=NULL;
625 sh_video->codec=NULL;
626 sh_video->video_out=NULL;
627 sh_video->vfilter=NULL; // fixme!
629 switch(mux_v->codec){
630 case VCODEC_COPY:
631 if (sh_video->bih)
632 mux_v->bih=sh_video->bih;
633 else
635 mux_v->bih=malloc(sizeof(BITMAPINFOHEADER));
636 mux_v->bih->biSize=sizeof(BITMAPINFOHEADER);
637 mux_v->bih->biWidth=sh_video->disp_w;
638 mux_v->bih->biHeight=sh_video->disp_h;
639 mux_v->bih->biCompression=sh_video->format;
640 mux_v->bih->biPlanes=1;
641 mux_v->bih->biBitCount=24; // FIXME!!!
642 mux_v->bih->biSizeImage=mux_v->bih->biWidth*mux_v->bih->biHeight*(mux_v->bih->biBitCount/8);
644 printf("videocodec: framecopy (%dx%d %dbpp fourcc=%x)\n",
645 mux_v->bih->biWidth, mux_v->bih->biHeight,
646 mux_v->bih->biBitCount, mux_v->bih->biCompression);
647 break;
648 case VCODEC_FRAMENO:
649 mux_v->bih=malloc(sizeof(BITMAPINFOHEADER));
650 mux_v->bih->biSize=sizeof(BITMAPINFOHEADER);
651 mux_v->bih->biWidth=sh_video->disp_w;
652 mux_v->bih->biHeight=sh_video->disp_h;
653 mux_v->bih->biPlanes=1;
654 mux_v->bih->biBitCount=24;
655 mux_v->bih->biCompression=mmioFOURCC('F','r','N','o');
656 mux_v->bih->biSizeImage=mux_v->bih->biWidth*mux_v->bih->biHeight*(mux_v->bih->biBitCount/8);
657 break;
658 default:
660 switch(mux_v->codec){
661 case VCODEC_DIVX4:
662 sh_video->vfilter=vf_open_encoder(NULL,"divx4",(char *)mux_v); break;
663 case VCODEC_LIBAVCODEC:
664 sh_video->vfilter=vf_open_encoder(NULL,"lavc",(char *)mux_v); break;
665 case VCODEC_RAWRGB:
666 sh_video->vfilter=vf_open_encoder(NULL,"rawrgb",(char *)mux_v); break;
667 case VCODEC_VFW:
668 sh_video->vfilter=vf_open_encoder(NULL,"vfw",(char *)mux_v); break;
669 case VCODEC_LIBDV:
670 sh_video->vfilter=vf_open_encoder(NULL,"libdv",(char *)mux_v); break;
671 case VCODEC_XVID:
672 sh_video->vfilter=vf_open_encoder(NULL,"xvid",(char *)mux_v); break;
673 case VCODEC_QTVIDEO:
674 sh_video->vfilter=vf_open_encoder(NULL,"qtvideo",(char *)mux_v); break;
676 if(!mux_v->bih || !sh_video->vfilter){
677 mp_msg(MSGT_MENCODER,MSGL_FATAL,MSGTR_EncoderOpenFailed);
678 mencoder_exit(1,NULL);
680 // append 'expand' filter, it fixes stride problems and renders osd:
681 sh_video->vfilter=vf_open_filter(sh_video->vfilter,"expand","-1:-1:-1:-1:1");
682 sh_video->vfilter=append_filters(sh_video->vfilter);
684 mp_msg(MSGT_CPLAYER,MSGL_INFO,"==========================================================================\n");
685 init_best_video_codec(sh_video,video_codec_list,video_fm_list);
686 mp_msg(MSGT_CPLAYER,MSGL_INFO,"==========================================================================\n");
687 if(!sh_video->inited) mencoder_exit(1,NULL);
691 /* force output fourcc to .. */
692 if ((force_fourcc != NULL) && (strlen(force_fourcc) >= 4))
694 mux_v->bih->biCompression = mmioFOURCC(force_fourcc[0], force_fourcc[1],
695 force_fourcc[2], force_fourcc[3]);
696 printf(MSGTR_ForcingOutputFourcc,
697 mux_v->bih->biCompression, (char *)&mux_v->bih->biCompression);
700 //if(demuxer->file_format!=DEMUXER_TYPE_AVI) pts_from_bps=0; // it must be 0 for mpeg/asf!
702 // ============= AUDIO ===============
703 if(sh_audio){
705 mux_a=muxer_new_stream(muxer,MUXER_TYPE_AUDIO);
707 mux_a->buffer_size=0x100000; //16384;
708 mux_a->buffer=malloc(mux_a->buffer_size);
710 mux_a->source=sh_audio;
712 mux_a->codec=out_audio_codec;
714 switch(mux_a->codec){
715 case ACODEC_COPY:
716 if (sh_audio->wf){
717 mux_a->wf=sh_audio->wf;
718 if(!sh_audio->i_bps) sh_audio->i_bps=mux_a->wf->nAvgBytesPerSec;
719 } else {
720 mux_a->wf = malloc(sizeof(WAVEFORMATEX));
721 mux_a->wf->nBlockAlign = 1; //mux_a->h.dwSampleSize;
722 mux_a->wf->wFormatTag = sh_audio->format;
723 mux_a->wf->nChannels = sh_audio->channels;
724 mux_a->wf->nSamplesPerSec = sh_audio->samplerate;
725 mux_a->wf->nAvgBytesPerSec=sh_audio->i_bps; //mux_a->h.dwSampleSize*mux_a->wf->nSamplesPerSec;
726 mux_a->wf->wBitsPerSample = 16; // FIXME
727 mux_a->wf->cbSize=0; // FIXME for l3codeca.acm
729 if(sh_audio->audio.dwScale){
730 mux_a->h.dwSampleSize=sh_audio->audio.dwSampleSize;
731 mux_a->h.dwScale=sh_audio->audio.dwScale;
732 mux_a->h.dwRate=sh_audio->audio.dwRate;
733 // mux_a->h.dwStart=sh_audio->audio.dwStart;
734 } else {
735 mux_a->h.dwSampleSize=mux_a->wf->nBlockAlign;
736 mux_a->h.dwScale=mux_a->h.dwSampleSize;
737 mux_a->h.dwRate=mux_a->wf->nAvgBytesPerSec;
739 printf("audiocodec: framecopy (format=%x chans=%d rate=%ld bits=%d bps=%ld sample=%ld)\n",
740 mux_a->wf->wFormatTag, mux_a->wf->nChannels, mux_a->wf->nSamplesPerSec,
741 mux_a->wf->wBitsPerSample, mux_a->wf->nAvgBytesPerSec, mux_a->h.dwSampleSize);
742 break;
743 case ACODEC_PCM:
744 printf("CBR PCM audio selected\n");
745 mux_a->h.dwSampleSize=2*sh_audio->channels;
746 mux_a->h.dwScale=1;
747 mux_a->h.dwRate=force_srate?force_srate:sh_audio->samplerate;
748 mux_a->wf=malloc(sizeof(WAVEFORMATEX));
749 mux_a->wf->nBlockAlign=mux_a->h.dwSampleSize;
750 mux_a->wf->wFormatTag=0x1; // PCM
751 mux_a->wf->nChannels=audio_output_channels?audio_output_channels:sh_audio->channels;
752 mux_a->wf->nSamplesPerSec=mux_a->h.dwRate;
753 mux_a->wf->nAvgBytesPerSec=mux_a->h.dwSampleSize*mux_a->wf->nSamplesPerSec;
754 mux_a->wf->wBitsPerSample=16;
755 mux_a->wf->cbSize=0; // FIXME for l3codeca.acm
756 // setup filter:
757 if(!init_audio_filters(sh_audio,
758 sh_audio->samplerate,
759 sh_audio->channels, sh_audio->sample_format, sh_audio->samplesize,
760 mux_a->wf->nSamplesPerSec, mux_a->wf->nChannels,
761 (mux_a->wf->wBitsPerSample==8)? AFMT_U8:AFMT_S16_LE,
762 mux_a->wf->wBitsPerSample/8,
763 16384, mux_a->wf->nAvgBytesPerSec)){
764 mp_msg(MSGT_CPLAYER,MSGL_ERR,"Couldn't find matching filter / ao format!\n");
766 break;
767 #ifdef HAVE_MP3LAME
768 case ACODEC_VBRMP3:
769 printf("MP3 audio selected\n");
770 mux_a->h.dwSampleSize=0; // VBR
771 mux_a->h.dwRate=force_srate?force_srate:sh_audio->samplerate;
772 mux_a->h.dwScale=(mux_a->h.dwRate<32000)?576:1152; // samples/frame
773 if(sizeof(MPEGLAYER3WAVEFORMAT)!=30) mp_msg(MSGT_MENCODER,MSGL_WARN,"sizeof(MPEGLAYER3WAVEFORMAT)==%d!=30, maybe broken C compiler?\n",sizeof(MPEGLAYER3WAVEFORMAT));
774 mux_a->wf=malloc(sizeof(MPEGLAYER3WAVEFORMAT)); // should be 30
775 mux_a->wf->wFormatTag=0x55; // MP3
776 mux_a->wf->nChannels= (lame_param_mode<0) ? sh_audio->channels :
777 ((lame_param_mode==3) ? 1 : 2);
778 mux_a->wf->nSamplesPerSec=mux_a->h.dwRate;
779 mux_a->wf->nAvgBytesPerSec=192000/8; // FIXME!
780 mux_a->wf->nBlockAlign=(mux_a->h.dwRate<32000)?576:1152; // required for l3codeca.acm + WMP 6.4
781 mux_a->wf->wBitsPerSample=0; //16;
782 // from NaNdub: (requires for l3codeca.acm)
783 mux_a->wf->cbSize=12;
784 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->wID=1;
785 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->fdwFlags=2;
786 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->nBlockSize=(mux_a->h.dwRate<32000)?576:1152; // ???
787 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->nFramesPerBlock=1;
788 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->nCodecDelay=0;
789 // setup filter:
790 if(!init_audio_filters(sh_audio,
791 sh_audio->samplerate,
792 sh_audio->channels, sh_audio->sample_format, sh_audio->samplesize,
793 mux_a->wf->nSamplesPerSec, mux_a->wf->nChannels,
794 #ifdef WORDS_BIGENDIAN
795 AFMT_S16_BE, 2,
796 #else
797 AFMT_S16_LE, 2,
798 #endif
799 4608, mux_a->h.dwRate*mux_a->wf->nChannels*2)){
800 mp_msg(MSGT_CPLAYER,MSGL_ERR,"Couldn't find matching filter / ao format!\n");
802 break;
803 #endif
806 if (verbose>1) print_wave_header(mux_a->wf);
808 if(audio_delay!=0.0){
809 mux_a->h.dwStart=audio_delay*mux_a->h.dwRate/mux_a->h.dwScale;
810 printf("Setting AUDIO DELAY to %5.3f\n",mux_a->h.dwStart*mux_a->h.dwScale/(float)mux_a->h.dwRate);
813 } // if(sh_audio)
815 printf(MSGTR_WritingAVIHeader);
816 muxer_write_header(muxer,muxer_f);
818 decoded_frameno=0;
820 if(sh_audio)
821 switch(mux_a->codec){
822 #ifdef HAVE_MP3LAME
823 case ACODEC_VBRMP3:
825 lame=lame_init();
826 lame_set_bWriteVbrTag(lame,0);
827 lame_set_in_samplerate(lame,mux_a->wf->nSamplesPerSec);
828 //lame_set_in_samplerate(lame,sh_audio->samplerate); // if resampling done by lame
829 lame_set_num_channels(lame,mux_a->wf->nChannels);
830 lame_set_out_samplerate(lame,mux_a->wf->nSamplesPerSec);
831 lame_set_quality(lame,lame_param_algqual); // 0 = best q
832 if(lame_param_vbr){ // VBR:
833 lame_set_VBR(lame,lame_param_vbr); // vbr mode
834 lame_set_VBR_q(lame,lame_param_quality+1); // 1 = best vbr q 6=~128k
835 if(lame_param_br>0) lame_set_VBR_mean_bitrate_kbps(lame,lame_param_br);
836 } else { // CBR:
837 if(lame_param_br>0) lame_set_brate(lame,lame_param_br);
839 if(lame_param_mode>=0) lame_set_mode(lame,lame_param_mode); // j-st
840 if(lame_param_ratio>0) lame_set_compression_ratio(lame,lame_param_ratio);
841 if(lame_param_scale>0) {
842 printf("Setting audio input gain to %f\n", lame_param_scale);
843 lame_set_scale(lame,lame_param_scale);
845 #if HAVE_MP3LAME >= 392
846 if(lame_param_preset != NULL){
847 printf ("\npreset=%s\n\n",lame_param_preset);
848 lame_presets_set(lame,lame_param_fast, (lame_param_vbr==0), lame_param_preset);
850 #endif
851 lame_init_params(lame);
852 if(verbose>0){
853 lame_print_config(lame);
854 lame_print_internals(lame);
856 break;
857 #endif
860 signal(SIGINT,exit_sighandler); // Interrupt from keyboard
861 signal(SIGQUIT,exit_sighandler); // Quit from keyboard
862 signal(SIGTERM,exit_sighandler); // kill
864 timer_start=GetTimerMS();
866 if (seek_to_sec) {
867 int a,b; float d;
869 if (sscanf(seek_to_sec, "%d:%d:%f", &a,&b,&d)==3)
870 d += 3600*a + 60*b;
871 else if (sscanf(seek_to_sec, "%d:%f", &a, &d)==2)
872 d += 60*a;
873 else
874 sscanf(seek_to_sec, "%f", &d);
876 demux_seek(demuxer, d, 1);
877 // there is 2 way to handle the -ss option in 3-pass mode:
878 // > 1. do the first pass for the whole file, and use -ss for 2nd/3rd pases only
879 // > 2. do all the 3 passes with the same -ss value
880 // this line enables behaviour 1. (and kills 2. at the same time):
881 // if(demuxer2) demux_seek(demuxer2, d, 1);
884 if (out_file_format == MUXER_TYPE_MPEG)
886 if (audio_preload > 0.4) {
887 fprintf(stderr,"Limiting audio preload to 0.4s\n");
888 audio_preload = 0.4;
890 if (audio_density < 4) {
891 fprintf(stderr,"Increasing audio density to 4\n");
892 audio_density = 4;
896 if(tv_param_on == 1)
898 fprintf(stderr,"Forcing audio preload to 0, max pts correction to 0\n");
899 audio_preload = 0.0;
900 default_max_pts_correction = 0;
903 play_n_frames=play_n_frames_mf;
905 while(!at_eof){
907 float frame_time=0;
908 int blit_frame=0;
909 float a_pts=0;
910 float v_pts=0;
911 unsigned char* start=NULL;
912 int in_size;
913 int skip_flag=0; // 1=skip -1=duplicate
915 if((end_at_type == END_AT_SIZE && end_at <= ftello(muxer_f)) ||
916 (end_at_type == END_AT_TIME && end_at < sh_video->timer))
917 break;
919 if(play_n_frames>=0){
920 --play_n_frames;
921 if(play_n_frames<0) break;
924 if(sh_audio){
925 // get audio:
926 while(mux_a->timer-audio_preload<mux_v->timer){
927 int len=0;
929 ptimer_start = GetTimerMS();
931 if(mux_a->h.dwSampleSize){
932 // CBR - copy 0.5 sec of audio
933 switch(mux_a->codec){
934 case ACODEC_COPY: // copy
935 len=mux_a->wf->nAvgBytesPerSec/audio_density;
936 len/=mux_a->h.dwSampleSize;if(len<1) len=1;
937 len*=mux_a->h.dwSampleSize;
938 len=demux_read_data(sh_audio->ds,mux_a->buffer,len);
939 break;
940 case ACODEC_PCM:
941 len=mux_a->h.dwSampleSize*(mux_a->h.dwRate/audio_density);
942 len=dec_audio(sh_audio,mux_a->buffer,len);
943 break;
945 } else {
946 // VBR - encode/copy an audio frame
947 switch(mux_a->codec){
948 case ACODEC_COPY: // copy
949 len=ds_get_packet(sh_audio->ds,(unsigned char**) &mux_a->buffer);
950 // printf("VBR audio framecopy not yet implemented!\n");
951 break;
952 #ifdef HAVE_MP3LAME
953 case ACODEC_VBRMP3:
954 while(mux_a->buffer_len<4){
955 unsigned char tmp[2304];
956 int len=dec_audio(sh_audio,tmp,2304);
957 if(len<=0) break; // eof
958 /* mono encoding, a bit tricky */
959 if (mux_a->wf->nChannels == 1)
961 len = lame_encode_buffer(lame, (short *)tmp, (short *)tmp, len/2,
962 mux_a->buffer+mux_a->buffer_len, mux_a->buffer_size-mux_a->buffer_len);
964 else
966 len=lame_encode_buffer_interleaved(lame,
967 (short *)tmp,len/4,
968 mux_a->buffer+mux_a->buffer_len,mux_a->buffer_size-mux_a->buffer_len);
970 if(len<0) break; // error
971 mux_a->buffer_len+=len;
973 if(mux_a->buffer_len<4) break;
974 len=mp_decode_mp3_header(mux_a->buffer);
975 //printf("%d\n",len);
976 if(len<=0) break; // bad frame!
977 // printf("[%d]\n",mp_mp3_get_lsf(mux_a->buffer));
978 while(mux_a->buffer_len<len){
979 unsigned char tmp[2304];
980 int len=dec_audio(sh_audio,tmp,2304);
981 if(len<=0) break; // eof
982 /* mono encoding, a bit tricky */
983 if (mux_a->wf->nChannels == 1)
985 len = lame_encode_buffer(lame, (short *)tmp, (short *)tmp, len/2,
986 mux_a->buffer+mux_a->buffer_len, mux_a->buffer_size-mux_a->buffer_len);
988 else
990 len=lame_encode_buffer_interleaved(lame,
991 (short *)tmp,len/4,
992 mux_a->buffer+mux_a->buffer_len,mux_a->buffer_size-mux_a->buffer_len);
994 if(len<0) break; // error
995 mux_a->buffer_len+=len;
997 break;
998 #endif
1001 if(len<=0) break; // EOF?
1002 muxer_write_chunk(muxer,mux_a,muxer_f,len,0x10);
1003 if(!mux_a->h.dwSampleSize && mux_a->timer>0)
1004 mux_a->wf->nAvgBytesPerSec=0.5f+(double)mux_a->size/mux_a->timer; // avg bps (VBR)
1005 if(mux_a->buffer_len>=len){
1006 mux_a->buffer_len-=len;
1007 memcpy(mux_a->buffer,mux_a->buffer+len,mux_a->buffer_len);
1011 audiosamples++;
1012 audiorate+= (GetTimerMS() - ptimer_start);
1016 // get video frame!
1018 in_size=video_read_frame(sh_video,&frame_time,&start,force_fps);
1019 if(in_size<0){ at_eof=1; break; }
1020 sh_video->timer+=frame_time; ++decoded_frameno;
1022 v_timer_corr-=frame_time-(float)mux_v->h.dwScale/mux_v->h.dwRate;
1024 if(demuxer2){ // 3-pass encoding, read control file (frameno.avi)
1025 // find our frame:
1026 while(next_frameno<decoded_frameno){
1027 int* start;
1028 int len=ds_get_packet(demuxer2->video,(unsigned char**) &start);
1029 if(len<0){ at_eof=1;break;}
1030 if(len==0) --skip_flag; else // duplicate
1031 if(len==4) next_frameno=start[0];
1033 if(at_eof) break;
1034 // if(skip_flag) printf("!!!!!!!!!!!!\n");
1035 skip_flag=next_frameno-decoded_frameno;
1036 // find next frame:
1037 while(next_frameno<=decoded_frameno){
1038 int* start;
1039 int len=ds_get_packet(demuxer2->video,(unsigned char**) &start);
1040 if(len<0){ at_eof=1;break;}
1041 if(len==0) --skip_flag; else // duplicate
1042 if(len==4) next_frameno=start[0];
1044 // if(at_eof) break;
1045 // printf("Current fno=%d requested=%d skip=%d \n",decoded_frameno,fno,skip_flag);
1046 } else {
1048 // check frame duplicate/drop:
1050 //printf("\r### %5.3f ###\n",v_timer_corr);
1052 if(v_timer_corr>=(float)mux_v->h.dwScale/mux_v->h.dwRate &&
1053 (skip_limit<0 || skip_flag<skip_limit) ){
1054 v_timer_corr-=(float)mux_v->h.dwScale/mux_v->h.dwRate;
1055 ++skip_flag; // skip
1056 } else
1057 while(v_timer_corr<=-(float)mux_v->h.dwScale/mux_v->h.dwRate &&
1058 (skip_limit<0 || (-skip_flag)<skip_limit) ){
1059 v_timer_corr+=(float)mux_v->h.dwScale/mux_v->h.dwRate;
1060 --skip_flag; // dup
1063 while( (v_pts_corr<=-(float)mux_v->h.dwScale/mux_v->h.dwRate && skip_flag>0)
1064 || (v_pts_corr<=-2*(float)mux_v->h.dwScale/mux_v->h.dwRate) ){
1065 v_pts_corr+=(float)mux_v->h.dwScale/mux_v->h.dwRate;
1066 --skip_flag; // dup
1068 if( (v_pts_corr>=(float)mux_v->h.dwScale/mux_v->h.dwRate && skip_flag<0)
1069 || (v_pts_corr>=2*(float)mux_v->h.dwScale/mux_v->h.dwRate) )
1070 if(skip_flag<=0){ // we can't skip more than 1 frame now
1071 v_pts_corr-=(float)mux_v->h.dwScale/mux_v->h.dwRate;
1072 ++skip_flag; // skip
1075 } // demuxer2
1077 ptimer_start = GetTimerMS();
1079 switch(mux_v->codec){
1080 case VCODEC_COPY:
1081 mux_v->buffer=start;
1082 if(skip_flag<=0) muxer_write_chunk(muxer,mux_v,muxer_f,in_size,(sh_video->ds->flags&1)?0x10:0);
1083 break;
1084 case VCODEC_FRAMENO:
1085 mux_v->buffer=(unsigned char *)&decoded_frameno; // tricky
1086 if(skip_flag<=0) muxer_write_chunk(muxer,mux_v,muxer_f,sizeof(int),0x10);
1087 break;
1088 default:
1089 // decode_video will callback down to ve_*.c encoders, through the video filters
1090 blit_frame=decode_video(sh_video,start,in_size,(skip_flag>0)?1:0);
1091 if(!blit_frame){
1092 badframes++;
1093 if(skip_flag<=0){
1094 // unwanted skipping of a frame, what to do?
1095 if(skip_limit==0){
1096 // skipping not allowed -> write empty frame:
1097 muxer_write_chunk(muxer,mux_v,muxer_f,0,0);
1098 } else {
1099 // skipping allowed -> skip it and distriubute timer error:
1100 v_timer_corr-=(float)mux_v->h.dwScale/mux_v->h.dwRate;
1106 videosamples++;
1107 videorate+=(GetTimerMS() - ptimer_start);
1109 if(skip_flag<0){
1110 // duplicate frame
1111 if(!tv_param_on && !verbose) printf(MSGTR_DuplicateFrames,-skip_flag);
1112 while(skip_flag<0){
1113 duplicatedframes++;
1114 muxer_write_chunk(muxer,mux_v,muxer_f,0,0);
1115 ++skip_flag;
1117 } else
1118 if(skip_flag>0){
1119 // skip frame
1120 if(!tv_param_on && !verbose) printf(MSGTR_SkipFrame);
1121 skippedframes++;
1122 --skip_flag;
1125 if(sh_audio && !demuxer2){
1126 float AV_delay,x;
1127 // A-V sync!
1128 #if 0
1129 if(pts_from_bps){
1130 unsigned int samples=(sh_audio->audio.dwSampleSize)?
1131 ((ds_tell(d_audio)-sh_audio->a_in_buffer_len)/sh_audio->audio.dwSampleSize) :
1132 (d_audio->block_no); // <- used for VBR audio
1133 // printf("samples=%d \n",samples);
1134 a_pts=samples*(float)sh_audio->audio.dwScale/(float)sh_audio->audio.dwRate;
1135 delay_corrected=1;
1136 } else
1137 #endif
1139 // PTS = (last timestamp) + (bytes after last timestamp)/(bytes per sec)
1140 a_pts=d_audio->pts;
1141 if(!delay_corrected) if(a_pts) delay_corrected=1;
1142 //printf("*** %5.3f ***\n",a_pts);
1143 a_pts+=(ds_tell_pts(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps;
1145 v_pts=d_video->pts;
1146 // av = compensated (with out buffering delay) A-V diff
1147 AV_delay=(a_pts-v_pts); AV_delay-=mux_a->timer-(mux_v->timer-(v_timer_corr+v_pts_corr));
1148 // compensate input video timer by av:
1149 x=AV_delay*0.1f;
1150 if(x<-max_pts_correction) x=-max_pts_correction; else
1151 if(x> max_pts_correction) x= max_pts_correction;
1152 if(default_max_pts_correction>=0)
1153 max_pts_correction=default_max_pts_correction;
1154 else
1155 max_pts_correction=sh_video->frametime*0.10; // +-10% of time
1156 // sh_video->timer-=x;
1157 c_total+=x;
1158 v_pts_corr+=x;
1161 // printf("A:%6.1f V:%6.1f A-V:%7.3f oAV:%7.3f diff:%7.3f ct:%7.3f vpc:%7.3f \r",
1162 // a_pts,v_pts,a_pts-v_pts,
1163 // (float)(mux_a->timer-mux_v->timer),
1164 // AV_delay, c_total, v_pts_corr );
1165 // printf("V:%6.1f \r", d_video->pts );
1167 #if 0
1168 mp_msg(MSGT_AVSYNC,MSGL_STATUS,"A:%6.1f V:%6.1f A-V:%7.3f ct:%7.3f %3d/%3d %2d%% %2d%% %4.1f%% %d%%\r",
1169 a_pts,v_pts,a_pts-v_pts,c_total,
1170 (int)sh_video->num_frames,(int)sh_video->num_frames_decoded,
1171 (sh_video->timer>0.5)?(int)(100.0*video_time_usage/(double)sh_video->timer):0,
1172 (sh_video->timer>0.5)?(int)(100.0*vout_time_usage/(double)sh_video->timer):0,
1173 (sh_video->timer>0.5)?(100.0*audio_time_usage/(double)sh_video->timer):0
1174 ,cache_fill_status
1176 #endif
1178 { float t=(GetTimerMS()-timer_start)*0.001f;
1179 float len=(demuxer->movi_end-demuxer->movi_start);
1180 float p=len>1000 ? (float)(demuxer->filepos-demuxer->movi_start) / len : 0;
1181 #if 0
1182 if(!len && sh_audio && sh_audio->audio.dwLength>100){
1183 p=(sh_audio->audio.dwSampleSize? ds_tell(sh_audio->ds)/sh_audio->audio.dwSampleSize : sh_audio->ds->block_no)
1184 / (float)(sh_audio->audio.dwLength);
1186 #endif
1187 #if 0
1188 mp_msg(MSGT_AVSYNC,MSGL_STATUS,"%d < %d < %d \r",
1189 (int)demuxer->movi_start,
1190 (int)demuxer->filepos,
1191 (int)demuxer->movi_end);
1192 #else
1193 if(verbose>0) {
1194 mp_msg(MSGT_AVSYNC,MSGL_STATUS,"Pos:%6.1fs %6df (%2d%%) %3dfps Trem:%4dmin %3dmb A-V:%5.3f [%d:%d] A/Vms %d/%d D/B/S %d/%d/%d \r",
1195 mux_v->timer, decoded_frameno, (int)(p*100),
1196 (t>1) ? (int)(decoded_frameno/t+0.5) : 0,
1197 (p>0.001) ? (int)((t/p-t)/60) : 0,
1198 (p>0.001) ? (int)(ftello(muxer_f)/p/1024/1024) : 0,
1199 v_pts_corr,
1200 (mux_v->timer>1) ? (int)(mux_v->size/mux_v->timer/125) : 0,
1201 (mux_a && mux_a->timer>1) ? (int)(mux_a->size/mux_a->timer/125) : 0,
1202 audiorate/audiosamples, videorate/videosamples,
1203 duplicatedframes, badframes, skippedframes
1205 } else
1206 mp_msg(MSGT_AVSYNC,MSGL_STATUS,"Pos:%6.1fs %6df (%2d%%) %3dfps Trem:%4dmin %3dmb A-V:%5.3f [%d:%d]\r",
1207 mux_v->timer, decoded_frameno, (int)(p*100),
1208 (t>1) ? (int)(decoded_frameno/t+0.5) : 0,
1209 (p>0.001) ? (int)((t/p-t)/60) : 0,
1210 (p>0.001) ? (int)(ftello(muxer_f)/p/1024/1024) : 0,
1211 v_pts_corr,
1212 (mux_v->timer>1) ? (int)(mux_v->size/mux_v->timer/125) : 0,
1213 (mux_a && mux_a->timer>1) ? (int)(mux_a->size/mux_a->timer/125) : 0
1215 #endif
1217 fflush(stdout);
1219 #ifdef USE_SUB
1220 // find sub
1221 if(subtitles && d_video->pts>0){
1222 float pts=d_video->pts;
1223 if(sub_fps==0) sub_fps=sh_video->fps;
1224 if (pts > sub_last_pts || pts < sub_last_pts-1.0 ) {
1225 find_sub(subtitles,sub_uses_time?(100*(pts+sub_delay)):((pts+sub_delay)*sub_fps)); // FIXME! frame counter...
1226 sub_last_pts = pts;
1229 #endif
1231 #ifdef USE_DVDREAD
1232 // DVD sub:
1233 if(vo_spudec||vobsub_writer){
1234 unsigned char* packet=NULL;
1235 int len;
1236 while((len=ds_get_packet_sub(d_dvdsub,&packet))>0){
1237 mp_msg(MSGT_MENCODER,MSGL_V,"\rDVD sub: len=%d v_pts=%5.3f s_pts=%5.3f \n",len,d_video->pts,d_dvdsub->pts);
1238 if (vo_spudec)
1239 spudec_assemble(vo_spudec,packet,len,90000*d_dvdsub->pts);
1240 if (vobsub_writer)
1241 vobsub_out_output(vobsub_writer,packet,len,mux_v->timer + d_dvdsub->pts - d_video->pts);
1243 if (vo_spudec) {
1244 spudec_heartbeat(vo_spudec,90000*d_video->pts);
1245 vo_osd_changed(OSDTYPE_SPU);
1248 #endif
1250 if(ferror(muxer_f)) {
1251 mp_msg(MSGT_MENCODER,MSGL_FATAL,MSGTR_ErrorWritingFile, out_filename);
1252 mencoder_exit(1, NULL);
1255 } // while(!at_eof)
1257 #ifdef HAVE_MP3LAME
1258 // fixup CBR mp3 audio header:
1259 if(sh_audio && mux_a->codec==ACODEC_VBRMP3 && !lame_param_vbr){
1260 mux_a->h.dwSampleSize=1;
1261 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->nBlockSize=
1262 (mux_a->size+(mux_a->h.dwLength>>1))/mux_a->h.dwLength;
1263 mux_a->h.dwLength=mux_a->size;
1264 mux_a->h.dwRate=mux_a->wf->nAvgBytesPerSec;
1265 mux_a->h.dwScale=1;
1266 mux_a->wf->nBlockAlign=1;
1267 printf("\n\nCBR audio: %ld bytes/sec, %d bytes/block\n",
1268 mux_a->h.dwRate,((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->nBlockSize);
1270 #endif
1272 printf(MSGTR_WritingAVIIndex);
1273 muxer_write_index(muxer,muxer_f);
1274 muxer_f_size=ftello(muxer_f);
1275 printf(MSGTR_FixupAVIHeader);
1276 fseek(muxer_f,0,SEEK_SET);
1277 muxer_write_header(muxer,muxer_f); // update header
1278 if(ferror(muxer_f) || fclose(muxer_f) != 0) {
1279 mp_msg(MSGT_MENCODER,MSGL_FATAL,MSGTR_ErrorWritingFile, out_filename);
1280 mencoder_exit(1, NULL);
1282 if(vobsub_writer)
1283 vobsub_out_close(vobsub_writer);
1285 if(out_video_codec==VCODEC_FRAMENO && mux_v->timer>100){
1286 printf(MSGTR_RecommendedVideoBitrate,"650MB",(int)((650*1024*1024-muxer_f_size)/mux_v->timer/125));
1287 printf(MSGTR_RecommendedVideoBitrate,"700MB",(int)((700*1024*1024-muxer_f_size)/mux_v->timer/125));
1288 printf(MSGTR_RecommendedVideoBitrate,"800MB",(int)((800*1024*1024-muxer_f_size)/mux_v->timer/125));
1289 printf(MSGTR_RecommendedVideoBitrate,"2 x 650MB",(int)((2*650*1024*1024-muxer_f_size)/mux_v->timer/125));
1290 printf(MSGTR_RecommendedVideoBitrate,"2 x 700MB",(int)((2*700*1024*1024-muxer_f_size)/mux_v->timer/125));
1291 printf(MSGTR_RecommendedVideoBitrate,"2 x 800MB",(int)((2*800*1024*1024-muxer_f_size)/mux_v->timer/125));
1294 printf(MSGTR_VideoStreamResult,
1295 (float)(mux_v->size/mux_v->timer*8.0f/1000.0f), (int)(mux_v->size/mux_v->timer), (int)mux_v->size, (float)mux_v->timer, decoded_frameno);
1296 if(sh_audio)
1297 printf(MSGTR_AudioStreamResult,
1298 (float)(mux_a->size/mux_a->timer*8.0f/1000.0f), (int)(mux_a->size/mux_a->timer), (int)mux_a->size, (float)mux_a->timer);
1300 if(sh_video){ uninit_video(sh_video);sh_video=NULL; }
1301 if(demuxer) free_demuxer(demuxer);
1302 if(stream) free_stream(stream); // kill cache thread
1304 return interrupted;
1307 static int parse_end_at(struct config *conf, const char* param)
1310 end_at_type = END_AT_NONE;
1312 /* End at size parsing */
1314 char unit[4];
1316 end_at_type = END_AT_SIZE;
1318 if(sscanf(param, "%lf%3s", &end_at, unit) == 2) {
1319 if(!strcasecmp(unit, "b"))
1321 else if(!strcasecmp(unit, "kb"))
1322 end_at *= 1024;
1323 else if(!strcasecmp(unit, "mb"))
1324 end_at *= 1024*1024;
1325 else
1326 end_at_type = END_AT_NONE;
1328 else
1329 end_at_type = END_AT_NONE;
1332 /* End at time parsing. This has to be last because of
1333 * sscanf("%f", ...) below */
1334 if(end_at_type == END_AT_NONE)
1336 int a,b; float d;
1338 end_at_type = END_AT_TIME;
1340 if (sscanf(param, "%d:%d:%f", &a, &b, &d) == 3)
1341 end_at = 3600*a + 60*b + d;
1342 else if (sscanf(param, "%d:%f", &a, &d) == 2)
1343 end_at = 60*a + d;
1344 else if (sscanf(param, "%f", &d) == 1)
1345 end_at = d;
1346 else
1347 end_at_type = END_AT_NONE;
1350 if(end_at_type == END_AT_NONE)
1351 return ERR_FUNC_ERR;
1353 return 1;
1356 #if 0
1357 /* Flip the image in src and store the result in dst. src and dst may overlap.
1358 width is the size of each line in bytes. */
1359 static uint8_t* flip_upside_down(uint8_t* dst, const uint8_t* src, int width,
1360 int height)
1362 uint8_t* tmp = malloc(width);
1363 int i;
1365 for(i = 0; i < height/2; i++) {
1366 memcpy(tmp, &src[i*width], width);
1367 memcpy(&dst[i * width], &src[(height - i) * width], width);
1368 memcpy(&dst[(height - i) * width], tmp, width);
1371 free(tmp);
1372 return dst;
1374 #endif
1376 #if HAVE_MP3LAME >= 392
1377 /* lame_presets_set
1378 taken out of presets_set in lame-3.93.1/frontend/parse.c and modified */
1379 static int lame_presets_set( lame_t gfp, int fast, int cbr, const char* preset_name )
1381 int mono = 0;
1383 if (strcmp(preset_name, "help") == 0) {
1384 fprintf(stdout, "LAME version %s (%s)\n\n", get_lame_version(), get_lame_url());
1385 lame_presets_longinfo_dm( stdout );
1386 return -1;
1391 //aliases for compatibility with old presets
1393 if (strcmp(preset_name, "phone") == 0) {
1394 preset_name = "16";
1395 mono = 1;
1397 if ( (strcmp(preset_name, "phon+") == 0) ||
1398 (strcmp(preset_name, "lw") == 0) ||
1399 (strcmp(preset_name, "mw-eu") == 0) ||
1400 (strcmp(preset_name, "sw") == 0)) {
1401 preset_name = "24";
1402 mono = 1;
1404 if (strcmp(preset_name, "mw-us") == 0) {
1405 preset_name = "40";
1406 mono = 1;
1408 if (strcmp(preset_name, "voice") == 0) {
1409 preset_name = "56";
1410 mono = 1;
1412 if (strcmp(preset_name, "fm") == 0) {
1413 preset_name = "112";
1415 if ( (strcmp(preset_name, "radio") == 0) ||
1416 (strcmp(preset_name, "tape") == 0)) {
1417 preset_name = "112";
1419 if (strcmp(preset_name, "hifi") == 0) {
1420 preset_name = "160";
1422 if (strcmp(preset_name, "cd") == 0) {
1423 preset_name = "192";
1425 if (strcmp(preset_name, "studio") == 0) {
1426 preset_name = "256";
1429 #if HAVE_MP3LAME >= 393
1430 if (strcmp(preset_name, "medium") == 0) {
1432 if (fast > 0)
1433 lame_set_preset(gfp, MEDIUM_FAST);
1434 else
1435 lame_set_preset(gfp, MEDIUM);
1437 return 0;
1439 #endif
1441 if (strcmp(preset_name, "standard") == 0) {
1443 if (fast > 0)
1444 lame_set_preset(gfp, STANDARD_FAST);
1445 else
1446 lame_set_preset(gfp, STANDARD);
1448 return 0;
1451 else if (strcmp(preset_name, "extreme") == 0){
1453 if (fast > 0)
1454 lame_set_preset(gfp, EXTREME_FAST);
1455 else
1456 lame_set_preset(gfp, EXTREME);
1458 return 0;
1461 else if (((strcmp(preset_name, "insane") == 0) ||
1462 (strcmp(preset_name, "320" ) == 0)) && (fast < 1)) {
1464 lame_set_preset(gfp, INSANE);
1466 return 0;
1469 // Generic ABR Preset
1470 if (((atoi(preset_name)) > 0) && (fast < 1)) {
1471 if ((atoi(preset_name)) >= 8 && (atoi(preset_name)) <= 320){
1472 lame_set_preset(gfp, atoi(preset_name));
1474 if (cbr == 1 )
1475 lame_set_VBR(gfp, vbr_off);
1477 if (mono == 1 ) {
1478 lame_set_mode(gfp, MONO);
1481 return 0;
1484 else {
1485 fprintf(stderr, "LAME version %s (%s)\n\n", get_lame_version(), get_lame_url());
1486 fprintf(stderr,"Error: The bitrate specified is out of the valid range for this preset\n"
1487 "\n"
1488 "When using this mode you must enter a value between \"8\" and \"320\"\n"
1489 "\n"
1490 "For further information try: \"-lameopts preset=help\"\n"
1492 return -1;
1498 fprintf(stderr, "LAME version %s (%s)\n\n", get_lame_version(), get_lame_url());
1499 fprintf(stderr,"Error: You did not enter a valid profile and/or options with preset\n"
1500 "\n"
1501 "Available profiles are:\n"
1502 "\n"
1503 " <fast> standard\n"
1504 " <fast> extreme\n"
1505 " insane\n"
1506 " <cbr> (ABR Mode) - The ABR Mode is implied. To use it,\n"
1507 " simply specify a bitrate. For example:\n"
1508 " \"preset=185\" activates this\n"
1509 " preset and uses 185 as an average kbps.\n"
1510 "\n"
1511 " Some examples:\n"
1512 "\n"
1513 " \"-lameopts fast:preset=standard \"\n"
1514 " or \"-lameopts cbr:preset=192 \"\n"
1515 " or \"-lameopts preset=172 \"\n"
1516 " or \"-lameopts preset=extreme \"\n"
1517 "\n"
1518 "For further information try: \"-lameopts preset=help\"\n"
1520 mencoder_exit(1, "error parsing cmdline");
1522 #endif
1524 #if HAVE_MP3LAME >= 392
1525 /* lame_presets_longinfo_dm
1526 taken out of presets_longinfo_dm in lame-3.93.1/frontend/parse.c and modified */
1527 static void lame_presets_longinfo_dm ( FILE* msgfp )
1529 fprintf ( msgfp,
1530 "\n"
1531 "The preset switches are designed to provide the highest possible quality.\n"
1532 "\n"
1533 "They have for the most part been subject to and tuned via rigorous double blind\n"
1534 "listening tests to verify and achieve this objective.\n"
1535 "\n"
1536 "These are continually updated to coincide with the latest developments that\n"
1537 "occur and as a result should provide you with nearly the best quality\n"
1538 "currently possible from LAME.\n"
1539 "\n"
1540 "To activate these presets:\n"
1541 "\n"
1542 " For VBR modes (generally highest quality):\n"
1543 "\n"
1544 " \"preset=standard\" This preset should generally be transparent\n"
1545 " to most people on most music and is already\n"
1546 " quite high in quality.\n"
1547 "\n"
1548 " \"preset=extreme\" If you have extremely good hearing and similar\n"
1549 " equipment, this preset will generally provide\n"
1550 " slightly higher quality than the \"standard\"\n"
1551 " mode.\n"
1552 "\n"
1553 " For CBR 320kbps (highest quality possible from the preset switches):\n"
1554 "\n"
1555 " \"preset=insane\" This preset will usually be overkill for most\n"
1556 " people and most situations, but if you must\n"
1557 " have the absolute highest quality with no\n"
1558 " regard to filesize, this is the way to go.\n"
1559 "\n"
1560 " For ABR modes (high quality per given bitrate but not as high as VBR):\n"
1561 "\n"
1562 " \"preset=<kbps>\" Using this preset will usually give you good\n"
1563 " quality at a specified bitrate. Depending on the\n"
1564 " bitrate entered, this preset will determine the\n"
1565 " optimal settings for that particular situation.\n"
1566 " While this approach works, it is not nearly as\n"
1567 " flexible as VBR, and usually will not attain the\n"
1568 " same level of quality as VBR at higher bitrates.\n"
1569 "\n"
1570 "The following options are also available for the corresponding profiles:\n"
1571 "\n"
1572 " <fast> standard\n"
1573 " <fast> extreme\n"
1574 " insane\n"
1575 " <cbr> (ABR Mode) - The ABR Mode is implied. To use it,\n"
1576 " simply specify a bitrate. For example:\n"
1577 " \"preset=185\" activates this\n"
1578 " preset and uses 185 as an average kbps.\n"
1579 "\n"
1580 " \"fast\" - Enables the new fast VBR for a particular profile. The\n"
1581 " disadvantage to the speed switch is that often times the\n"
1582 " bitrate will be slightly higher than with the normal mode\n"
1583 " and quality may be slightly lower also.\n"
1584 " Warning: with the current version fast presets might result in too\n"
1585 " high bitrate compared to regular presets.\n"
1586 "\n"
1587 " \"cbr\" - If you use the ABR mode (read above) with a significant\n"
1588 " bitrate such as 80, 96, 112, 128, 160, 192, 224, 256, 320,\n"
1589 " you can use the \"cbr\" option to force CBR mode encoding\n"
1590 " instead of the standard abr mode. ABR does provide higher\n"
1591 " quality but CBR may be useful in situations such as when\n"
1592 " streaming an mp3 over the internet may be important.\n"
1593 "\n"
1594 " For example:\n"
1595 "\n"
1596 " \"-lameopts fast:preset=standard \"\n"
1597 " or \"-lameopts cbr:preset=192 \"\n"
1598 " or \"-lameopts preset=172 \"\n"
1599 " or \"-lameopts preset=extreme \"\n"
1600 "\n"
1601 "\n"
1602 "A few aliases are available for ABR mode:\n"
1603 "phone => 16kbps/mono phon+/lw/mw-eu/sw => 24kbps/mono\n"
1604 "mw-us => 40kbps/mono voice => 56kbps/mono\n"
1605 "fm/radio/tape => 112kbps hifi => 160kbps\n"
1606 "cd => 192kbps studio => 256kbps");
1607 mencoder_exit(0, NULL);
1609 #endif