2 #define VCODEC_FRAMENO 1
5 #define VCODEC_LIBAVCODEC 4
6 #define VCODEC_RAWRGB 6
10 #define VCODEC_QTVIDEO 10
14 #define ACODEC_VBRMP3 2
29 static char* banner_text
=
31 "MEncoder " VERSION MSGTR_MEncoderCopyright
34 #include "cpudetect.h"
36 #include "codec-cfg.h"
40 #include "parser-mecmd.h"
42 #include "cfgparser.h"
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"
67 #include <lame/lame.h>
71 #include "libmpdemux/dvdauth.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 //--------------------------
87 int stream_cache_size
=-1;
88 #ifdef USE_STREAM_CACHE
89 extern int cache_fill_status
;
91 #define cache_fill_status 0
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;
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"
161 char *font_name
=NULL
;
162 float font_factor
=0.75;
168 int suboverlap_enabled
= 1;
171 static subtitle
* subtitles
=NULL
;
172 float sub_last_pts
= -303;
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"
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
);
209 //static int vo_w=0, vo_h=0;
211 //-------------------------- config stuff:
217 m_config_parse_config_file(m_config_t
* config
, char *conffile
);
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"
244 void mencoder_exit(int level
, char *how
)
247 printf("Exiting... (%s)\n", how
);
249 printf("Exiting...\n");
254 void parse_cfgfiles( m_config_t
* conf
)
257 if ((conffile
= get_path("mencoder")) == NULL
) {
258 mp_msg(MSGT_CPLAYER
,MSGL_ERR
,MSGTR_GetpathProblem
);
260 if (m_config_parse_config_file(conf
, conffile
) < 0)
261 mencoder_exit(1,"configfile error");
267 //---------------------------------------------------------------------------
269 static int dec_audio(sh_audio_t
*sh_audio
,unsigned char* buffer
,int total
){
272 while(size
<total
&& !at_eof
){
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
);
292 //---------------------------------------------------------------------------
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
){
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
;
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;
345 lame_global_flags
*lame
;
349 double v_timer_corr
=0;
352 m_entry_t
* filelist
= NULL
;
354 play_tree_t
* playtree
;
355 play_tree_iter_t
* playtree_iter
;
358 char* frameno_filename
="frameno.avi";
360 int decoded_frameno
=0;
363 unsigned int timer_start
;
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 */
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
);
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
);
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
);
392 demuxer2
=demux_open(stream2
,DEMUXER_TYPE_AVI
,-1,-1,-2);
393 if(demuxer2
) printf(MSGTR_UsingPass3ControllFile
,frameno_filename
);
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 ?
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
);
415 playtree_iter
= play_tree_iter_new(playtree
,mconfig
);
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);
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
);
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
);
443 vo_font
=read_font_desc(get_path("font/font.desc"),font_factor
,verbose
>1);
445 vo_font
=read_font_desc(DATADIR
"/font/font.desc",font_factor
,verbose
>1);
452 stream
=open_stream(filename
,vcd_track
,&file_format
);
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
));
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
);
468 stream
->start_pos
+=seek_to_byte
;
471 // current_module="libcss";
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
);
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
);
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
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){
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:
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
);
551 if (vobsub_writer
== NULL
) {
553 if (vobsub_out_id
== NULL
&& stream
->type
== STREAMTYPE_DVD
) {
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;
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
);
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
);
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
);
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
588 // current_module="read_subtitles_file";
590 subtitles
=sub_read_file(sub_name
, sh_video
->fps
);
591 if(!subtitles
) mp_msg(MSGT_CPLAYER
,MSGL_ERR
,MSGTR_CantLoadSub
,sub_name
);
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
);
600 // set up output file:
601 muxer_f
=fopen(out_filename
,"wb");
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
;
625 sh_video
->codec
=NULL
;
626 sh_video
->video_out
=NULL
;
627 sh_video
->vfilter
=NULL
; // fixme!
629 switch(mux_v
->codec
){
632 mux_v
->bih
=sh_video
->bih
;
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
);
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);
660 switch(mux_v
->codec
){
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;
666 sh_video
->vfilter
=vf_open_encoder(NULL
,"rawrgb",(char *)mux_v
); break;
668 sh_video
->vfilter
=vf_open_encoder(NULL
,"vfw",(char *)mux_v
); break;
670 sh_video
->vfilter
=vf_open_encoder(NULL
,"libdv",(char *)mux_v
); break;
672 sh_video
->vfilter
=vf_open_encoder(NULL
,"xvid",(char *)mux_v
); break;
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 ===============
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
){
717 mux_a
->wf
=sh_audio
->wf
;
718 if(!sh_audio
->i_bps
) sh_audio
->i_bps
=mux_a
->wf
->nAvgBytesPerSec
;
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;
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
);
744 printf("CBR PCM audio selected\n");
745 mux_a
->h
.dwSampleSize
=2*sh_audio
->channels
;
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
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");
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;
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
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");
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
);
815 printf(MSGTR_WritingAVIHeader
);
816 muxer_write_header(muxer
,muxer_f
);
821 switch(mux_a
->codec
){
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
);
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
);
851 lame_init_params(lame
);
853 lame_print_config(lame
);
854 lame_print_internals(lame
);
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();
869 if (sscanf(seek_to_sec
, "%d:%d:%f", &a
,&b
,&d
)==3)
871 else if (sscanf(seek_to_sec
, "%d:%f", &a
, &d
)==2)
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");
890 if (audio_density
< 4) {
891 fprintf(stderr
,"Increasing audio density to 4\n");
898 fprintf(stderr
,"Forcing audio preload to 0, max pts correction to 0\n");
900 default_max_pts_correction
= 0;
903 play_n_frames
=play_n_frames_mf
;
911 unsigned char* start
=NULL
;
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
))
919 if(play_n_frames
>=0){
921 if(play_n_frames
<0) break;
926 while(mux_a
->timer
-audio_preload
<mux_v
->timer
){
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
);
941 len
=mux_a
->h
.dwSampleSize
*(mux_a
->h
.dwRate
/audio_density
);
942 len
=dec_audio(sh_audio
,mux_a
->buffer
,len
);
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");
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
);
966 len
=lame_encode_buffer_interleaved(lame
,
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
);
990 len
=lame_encode_buffer_interleaved(lame
,
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
;
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
);
1012 audiorate
+= (GetTimerMS() - ptimer_start
);
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)
1026 while(next_frameno
<decoded_frameno
){
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];
1034 // if(skip_flag) printf("!!!!!!!!!!!!\n");
1035 skip_flag
=next_frameno
-decoded_frameno
;
1037 while(next_frameno
<=decoded_frameno
){
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);
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
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
;
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
;
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
1077 ptimer_start
= GetTimerMS();
1079 switch(mux_v
->codec
){
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);
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);
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);
1094 // unwanted skipping of a frame, what to do?
1096 // skipping not allowed -> write empty frame:
1097 muxer_write_chunk(muxer
,mux_v
,muxer_f
,0,0);
1099 // skipping allowed -> skip it and distriubute timer error:
1100 v_timer_corr
-=(float)mux_v
->h
.dwScale
/mux_v
->h
.dwRate
;
1107 videorate
+=(GetTimerMS() - ptimer_start
);
1111 if(!tv_param_on
&& !verbose
) printf(MSGTR_DuplicateFrames
,-skip_flag
);
1114 muxer_write_chunk(muxer
,mux_v
,muxer_f
,0,0);
1120 if(!tv_param_on
&& !verbose
) printf(MSGTR_SkipFrame
);
1125 if(sh_audio
&& !demuxer2
){
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
;
1139 // PTS = (last timestamp) + (bytes after last timestamp)/(bytes per sec)
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
;
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:
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
;
1155 max_pts_correction
=sh_video
->frametime
*0.10; // +-10% of time
1156 // sh_video->timer-=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 );
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
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;
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
);
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
);
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,
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
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,
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
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...
1233 if(vo_spudec
||vobsub_writer
){
1234 unsigned char* packet
=NULL
;
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
);
1239 spudec_assemble(vo_spudec
,packet
,len
,90000*d_dvdsub
->pts
);
1241 vobsub_out_output(vobsub_writer
,packet
,len
,mux_v
->timer
+ d_dvdsub
->pts
- d_video
->pts
);
1244 spudec_heartbeat(vo_spudec
,90000*d_video
->pts
);
1245 vo_osd_changed(OSDTYPE_SPU
);
1250 if(ferror(muxer_f
)) {
1251 mp_msg(MSGT_MENCODER
,MSGL_FATAL
,MSGTR_ErrorWritingFile
, out_filename
);
1252 mencoder_exit(1, NULL
);
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
;
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
);
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
);
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
);
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
1307 static int parse_end_at(struct config
*conf
, const char* param
)
1310 end_at_type
= END_AT_NONE
;
1312 /* End at size parsing */
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"))
1323 else if(!strcasecmp(unit
, "mb"))
1324 end_at
*= 1024*1024;
1326 end_at_type
= END_AT_NONE
;
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
)
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)
1344 else if (sscanf(param
, "%f", &d
) == 1)
1347 end_at_type
= END_AT_NONE
;
1350 if(end_at_type
== END_AT_NONE
)
1351 return ERR_FUNC_ERR
;
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
,
1362 uint8_t* tmp
= malloc(width
);
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
);
1376 #if HAVE_MP3LAME >= 392
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
)
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
);
1391 //aliases for compatibility with old presets
1393 if (strcmp(preset_name
, "phone") == 0) {
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)) {
1404 if (strcmp(preset_name
, "mw-us") == 0) {
1408 if (strcmp(preset_name
, "voice") == 0) {
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) {
1433 lame_set_preset(gfp
, MEDIUM_FAST
);
1435 lame_set_preset(gfp
, MEDIUM
);
1441 if (strcmp(preset_name
, "standard") == 0) {
1444 lame_set_preset(gfp
, STANDARD_FAST
);
1446 lame_set_preset(gfp
, STANDARD
);
1451 else if (strcmp(preset_name
, "extreme") == 0){
1454 lame_set_preset(gfp
, EXTREME_FAST
);
1456 lame_set_preset(gfp
, EXTREME
);
1461 else if (((strcmp(preset_name
, "insane") == 0) ||
1462 (strcmp(preset_name
, "320" ) == 0)) && (fast
< 1)) {
1464 lame_set_preset(gfp
, INSANE
);
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
));
1475 lame_set_VBR(gfp
, vbr_off
);
1478 lame_set_mode(gfp
, MONO
);
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"
1488 "When using this mode you must enter a value between \"8\" and \"320\"\n"
1490 "For further information try: \"-lameopts preset=help\"\n"
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"
1501 "Available profiles are:\n"
1503 " <fast> standard\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"
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"
1518 "For further information try: \"-lameopts preset=help\"\n"
1520 mencoder_exit(1, "error parsing cmdline");
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
)
1531 "The preset switches are designed to provide the highest possible quality.\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"
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"
1540 "To activate these presets:\n"
1542 " For VBR modes (generally highest quality):\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"
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"
1553 " For CBR 320kbps (highest quality possible from the preset switches):\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"
1560 " For ABR modes (high quality per given bitrate but not as high as VBR):\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"
1570 "The following options are also available for the corresponding profiles:\n"
1572 " <fast> standard\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"
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"
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"
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"
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
);