2 #define VCODEC_FRAMENO 1
5 #define VCODEC_LIBAVCODEC 4
9 #define VCODEC_QTVIDEO 10
15 #define ACODEC_VBRMP3 2
34 #include "cpudetect.h"
36 #include "codec-cfg.h"
39 #include "parser-mecmd.h"
41 #include "libmpdemux/stream.h"
42 #include "libmpdemux/demuxer.h"
43 #include "libmpdemux/stheader.h"
44 #include "libmpdemux/mp3_hdr.h"
45 #include "libmpdemux/muxer.h"
48 #include "libvo/video_out.h"
50 #include "libao2/afmt.h"
52 #include "libmpcodecs/mp_image.h"
53 #include "libmpcodecs/dec_audio.h"
54 #include "libmpcodecs/dec_video.h"
55 #include "libmpcodecs/vf.h"
57 // for MPEGLAYER3WAVEFORMAT:
58 #include "loader/wine/mmreg.h"
62 #include <lame/lame.h>
67 #include "libvo/fastmemcpy.h"
69 #include "osdep/timer.h"
72 // for lavc audio encoding
74 #ifdef USE_LIBAVCODEC_SO
75 #include <ffmpeg/avcodec.h>
77 #include "libavcodec/avcodec.h"
80 static AVCodec
*lavc_acodec
;
81 static AVCodecContext
*lavc_actx
= NULL
;
82 extern char *lavc_param_acodec
;
83 extern int lavc_param_abitrate
;
84 extern int lavc_param_atag
;
85 // tmp buffer for lavc audio encoding (to free!!!!!)
86 static void *lavc_abuf
= NULL
;
87 extern int avcodec_inited
;
89 static uint32_t lavc_find_atag(char *codec
);
92 int vo_doublebuffering
=0;
93 int vo_directrendering
=0;
94 int vo_config_count
=0;
95 int forced_subs_only
=0;
97 //--------------------------
100 int stream_cache_size
=-1;
101 #ifdef USE_STREAM_CACHE
102 extern int cache_fill_status
;
104 #define cache_fill_status 0
111 char* audio_lang
=NULL
;
112 char* dvdsub_lang
=NULL
;
113 static char* spudec_ifo
=NULL
;
115 static char** audio_codec_list
=NULL
; // override audio codec
116 static char** video_codec_list
=NULL
; // override video codec
117 static char** audio_fm_list
=NULL
; // override audio codec family
118 static char** video_fm_list
=NULL
; // override video codec family
120 static int out_audio_codec
=-1;
121 static int out_video_codec
=-1;
123 int out_file_format
=MUXER_TYPE_AVI
; // default to AVI
125 // audio stream skip/resync functions requires only for seeking.
126 // (they should be implemented in the audio codec layer)
127 //void skip_audio_frame(sh_audio_t *sh_audio){}
128 //void resync_audio_stream(sh_audio_t *sh_audio){}
130 int verbose
=0; // must be global!
132 double video_time_usage
=0;
133 double vout_time_usage
=0;
134 double max_video_time_usage
=0;
135 double max_vout_time_usage
=0;
136 double cur_video_time_usage
=0;
137 double cur_vout_time_usage
=0;
141 int delay_corrected
=1;
142 static float default_max_pts_correction
=-1;//0.01f;
143 static float max_pts_correction
=0;//default_max_pts_correction;
144 static float c_total
=0;
146 static float audio_preload
=0.5;
147 static float audio_delay
=0.0;
148 static int audio_density
=2;
151 static float force_ofps
=0; // set to 24 for inverse telecine
152 static int skip_limit
=-1;
154 static int force_srate
=0;
155 static int audio_output_format
=0;
157 char *vobsub_out
=NULL
;
158 unsigned int vobsub_out_index
=0;
159 char *vobsub_out_id
=NULL
;
161 char* out_filename
="test.avi";
163 char *force_fourcc
=NULL
;
165 char* passtmpfile
="divx2pass.log";
167 static int play_n_frames
=-1;
168 static int play_n_frames_mf
=-1;
170 #include "libvo/font_load.h"
171 #include "libvo/sub.h"
174 char *font_name
=NULL
;
175 #ifdef HAVE_FONTCONFIG
176 extern int font_fontconfig
;
178 float font_factor
=0.75;
179 char **sub_name
=NULL
;
184 int suboverlap_enabled
= 1;
187 static sub_data
* subdata
=NULL
;
188 float sub_last_pts
= -303;
193 // infos are empty by default
194 char *info_name
=NULL
;
195 char *info_artist
=NULL
;
196 char *info_genre
=NULL
;
197 char *info_subject
=NULL
;
198 char *info_copyright
=NULL
;
199 char *info_sourceform
=NULL
;
200 char *info_comment
=NULL
;
204 //char *out_audio_codec=NULL; // override audio codec
205 //char *out_video_codec=NULL; // override video codec
207 //#include "libmpeg2/mpeg2.h"
208 //#include "libmpeg2/mpeg2_internal.h"
211 int lame_param_quality
=0; // best
212 int lame_param_algqual
=5; // same as old default
213 int lame_param_vbr
=vbr_default
;
214 int lame_param_mode
=-1; // unset
215 int lame_param_padding
=-1; // unset
216 int lame_param_br
=-1; // unset
217 int lame_param_ratio
=-1; // unset
218 float lame_param_scale
=-1; // unset
219 int lame_param_lowpassfreq
= 0; //auto
220 int lame_param_highpassfreq
= 0; //auto
222 #if HAVE_MP3LAME >= 392
223 int lame_param_fast
=0; // unset
224 static char* lame_param_preset
=NULL
; // unset
225 static int lame_presets_set( lame_t gfp
, int fast
, int cbr
, const char* preset_name
);
226 static void lame_presets_longinfo_dm ( FILE* msgfp
);
230 //static int vo_w=0, vo_h=0;
232 //-------------------------- config stuff:
236 extern int m_config_parse_config_file(m_config_t
* config
, char *conffile
);
238 static int cfg_inc_verbose(m_option_t
*conf
){ ++verbose
; return 0;}
240 static int cfg_include(m_option_t
*conf
, char *filename
){
241 return m_config_parse_config_file(mconfig
, filename
);
244 static char *seek_to_sec
=NULL
;
245 static off_t seek_to_byte
=0;
247 static int parse_end_at(m_option_t
*conf
, const char* param
);
248 //static uint8_t* flip_upside_down(uint8_t* dst, const uint8_t* src, int width, int height);
250 #include "get_path.c"
252 #include "cfg-mplayer-def.h"
253 #include "cfg-mencoder.h"
261 static void mencoder_exit(int level
, char *how
)
264 printf("Exiting... (%s)\n", how
);
266 printf("Exiting...\n");
271 void parse_cfgfiles( m_config_t
* conf
)
274 if ((conffile
= get_path("mencoder")) == NULL
) {
275 mp_msg(MSGT_CPLAYER
,MSGL_ERR
,MSGTR_GetpathProblem
);
277 if (m_config_parse_config_file(conf
, conffile
) < 0)
278 mencoder_exit(1,"configfile error");
284 //---------------------------------------------------------------------------
286 static int dec_audio(sh_audio_t
*sh_audio
,unsigned char* buffer
,int total
){
289 while(size
<total
&& !at_eof
){
291 if(len
>MAX_OUTBURST
) len
=MAX_OUTBURST
;
292 if(len
>sh_audio
->a_out_buffer_size
) len
=sh_audio
->a_out_buffer_size
;
293 if(len
>sh_audio
->a_out_buffer_len
){
294 int ret
=decode_audio(sh_audio
,
295 &sh_audio
->a_out_buffer
[sh_audio
->a_out_buffer_len
],
296 len
-sh_audio
->a_out_buffer_len
,
297 sh_audio
->a_out_buffer_size
-sh_audio
->a_out_buffer_len
);
298 if(ret
>0) sh_audio
->a_out_buffer_len
+=ret
; else at_eof
=1;
300 if(len
>sh_audio
->a_out_buffer_len
) len
=sh_audio
->a_out_buffer_len
;
301 memcpy(buffer
+size
,sh_audio
->a_out_buffer
,len
);
302 sh_audio
->a_out_buffer_len
-=len
; size
+=len
;
303 if(sh_audio
->a_out_buffer_len
>0)
304 memcpy(sh_audio
->a_out_buffer
,&sh_audio
->a_out_buffer
[len
],sh_audio
->a_out_buffer_len
);
309 //---------------------------------------------------------------------------
312 static int interrupted
=0;
314 enum end_at_type_t
{END_AT_NONE
, END_AT_TIME
, END_AT_SIZE
};
315 static enum end_at_type_t end_at_type
= END_AT_NONE
;
316 static double end_at
;
318 static void exit_sighandler(int x
){
320 interrupted
=2; /* 1 means error */
323 static muxer_t
* muxer
=NULL
;
324 static FILE* muxer_f
=NULL
;
326 extern void print_wave_header(WAVEFORMATEX
*h
);
328 int main(int argc
,char* argv
[]){
330 stream_t
* stream
=NULL
;
331 demuxer_t
* demuxer
=NULL
;
332 stream_t
* stream2
=NULL
;
333 demuxer_t
* demuxer2
=NULL
;
334 demux_stream_t
*d_audio
=NULL
;
335 demux_stream_t
*d_video
=NULL
;
336 demux_stream_t
*d_dvdsub
=NULL
;
337 sh_audio_t
*sh_audio
=NULL
;
338 sh_video_t
*sh_video
=NULL
;
339 int file_format
=DEMUXER_TYPE_UNKNOWN
;
341 void *vobsub_writer
=NULL
;
343 uint32_t ptimer_start
;
344 uint32_t audiorate
=0;
345 uint32_t videorate
=0;
346 uint32_t audiosamples
=1;
347 uint32_t videosamples
=1;
348 uint32_t skippedframes
=0;
349 uint32_t duplicatedframes
=0;
350 uint32_t badframes
=0;
352 muxer_stream_t
* mux_a
=NULL
;
353 muxer_stream_t
* mux_v
=NULL
;
354 off_t muxer_f_size
=0;
357 lame_global_flags
*lame
;
361 double v_timer_corr
=0;
363 m_entry_t
* filelist
= NULL
;
365 char* frameno_filename
="frameno.avi";
367 int decoded_frameno
=0;
370 unsigned int timer_start
;
373 mp_msg_set_level(MSGL_STATUS
);
374 mp_msg(MSGT_CPLAYER
,MSGL_INFO
, "MEncoder " VERSION
" (C) 2000-2004 MPlayer Team\n\n");
376 /* Test for cpu capabilities (and corresponding OS support) for optimizing */
377 GetCpuCaps(&gCpuCaps
);
379 mp_msg(MSGT_CPLAYER
,MSGL_INFO
,"CPUflags: Type: %d MMX: %d MMX2: %d 3DNow: %d 3DNow2: %d SSE: %d SSE2: %d\n",
380 gCpuCaps
.cpuType
,gCpuCaps
.hasMMX
,gCpuCaps
.hasMMX2
,
381 gCpuCaps
.has3DNow
, gCpuCaps
.has3DNowExt
,
382 gCpuCaps
.hasSSE
, gCpuCaps
.hasSSE2
);
383 #ifdef RUNTIME_CPUDETECT
384 mp_msg(MSGT_CPLAYER
,MSGL_INFO
, MSGTR_CompiledWithRuntimeDetection
);
386 mp_msg(MSGT_CPLAYER
,MSGL_INFO
, MSGTR_CompiledWithCPUExtensions
);
388 mp_msg(MSGT_CPLAYER
,MSGL_INFO
," MMX");
391 mp_msg(MSGT_CPLAYER
,MSGL_INFO
," MMX2");
394 mp_msg(MSGT_CPLAYER
,MSGL_INFO
," 3DNow");
397 mp_msg(MSGT_CPLAYER
,MSGL_INFO
," 3DNowEx");
400 mp_msg(MSGT_CPLAYER
,MSGL_INFO
," SSE");
403 mp_msg(MSGT_CPLAYER
,MSGL_INFO
," SSE2");
405 mp_msg(MSGT_CPLAYER
,MSGL_INFO
,"\n\n");
412 if(!codecs_file
|| !parse_codec_cfg(codecs_file
)){
413 if(!parse_codec_cfg(get_path("codecs.conf"))){
414 if(!parse_codec_cfg(MPLAYER_CONFDIR
"/codecs.conf")){
415 if(!parse_codec_cfg(NULL
)){
416 mp_msg(MSGT_MENCODER
,MSGL_HINT
,MSGTR_CopyCodecsConf
);
417 mencoder_exit(1,NULL
);
419 mp_msg(MSGT_MENCODER
,MSGL_INFO
,MSGTR_BuiltinCodecsConf
);
424 // FIXME: get rid of -dvd and other tricky options
425 stream2
=open_stream(frameno_filename
,0,&i
);
427 demuxer2
=demux_open(stream2
,DEMUXER_TYPE_AVI
,-1,-1,-2,NULL
);
428 if(demuxer2
) printf(MSGTR_UsingPass3ControllFile
,frameno_filename
);
429 else mp_msg(MSGT_DEMUXER
,MSGL_ERR
,MSGTR_FormatNotRecognized
);
432 mconfig
= m_config_new();
433 m_config_register_options(mconfig
,mencoder_opts
);
434 parse_cfgfiles(mconfig
);
435 filelist
= m_config_parse_me_command_line(mconfig
, argc
, argv
);
436 if(!filelist
) mencoder_exit(1, "error parsing cmdline");
437 m_entry_set_options(mconfig
,&filelist
[0]);
438 filename
= filelist
[0].name
;
441 printf(MSGTR_MissingFilename
);
442 mencoder_exit(1,NULL
);
445 mp_msg_set_level(verbose
+MSGL_STATUS
);
452 #ifdef HAVE_FONTCONFIG
457 vo_font
=read_font_desc(font_name
,font_factor
,verbose
>1);
458 if(!vo_font
) mp_msg(MSGT_CPLAYER
,MSGL_ERR
,MSGTR_CantLoadFont
,font_name
);
461 vo_font
=read_font_desc(get_path("font/font.desc"),font_factor
,verbose
>1);
463 vo_font
=read_font_desc(MPLAYER_DATADIR
"/font/font.desc",font_factor
,verbose
>1);
465 #ifdef HAVE_FONTCONFIG
472 stream
=open_stream(filename
,0,&file_format
);
475 printf(MSGTR_CannotOpenFile_Device
);
476 mencoder_exit(1,NULL
);
479 printf("success: format: %d data: 0x%X - 0x%X\n",file_format
, (int)(stream
->start_pos
),(int)(stream
->end_pos
));
482 if(stream
->type
==STREAMTYPE_DVD
){
483 if(audio_lang
&& audio_id
==-1) audio_id
=dvd_aid_from_lang(stream
,audio_lang
);
484 if(dvdsub_lang
&& dvdsub_id
==-1) dvdsub_id
=dvd_sid_from_lang(stream
,dvdsub_lang
);
488 stream
->start_pos
+=seek_to_byte
;
490 if(stream_cache_size
>0) stream_enable_cache(stream
,stream_cache_size
*1024,0,0);
492 if(demuxer2
) audio_id
=-2; /* do NOT read audio packets... */
494 //demuxer=demux_open(stream,file_format,video_id,audio_id,dvdsub_id);
495 demuxer
=demux_open(stream
,file_format
,audio_id
,video_id
,dvdsub_id
,filename
);
497 mp_msg(MSGT_DEMUXER
,MSGL_ERR
,MSGTR_FormatNotRecognized
);
498 printf(MSGTR_CannotOpenDemuxer
);
499 mencoder_exit(1,NULL
);
502 d_audio
=demuxer2
? demuxer2
->audio
: demuxer
->audio
;
503 d_video
=demuxer
->video
;
504 d_dvdsub
=demuxer
->sub
;
505 sh_audio
=d_audio
->sh
;
506 sh_video
=d_video
->sh
;
510 mp_msg(MSGT_CPLAYER
,MSGL_FATAL
,"Video stream is mandatory!\n");
511 mencoder_exit(1,NULL
);
514 if(!video_read_properties(sh_video
)){
515 printf(MSGTR_CannotReadVideoProperties
);
516 mencoder_exit(1,NULL
);
519 mp_msg(MSGT_MENCODER
,MSGL_INFO
,"[V] filefmt:%d fourcc:0x%X size:%dx%d fps:%5.2f ftime:=%6.4f\n",
520 demuxer
->file_format
,sh_video
->format
, sh_video
->disp_w
,sh_video
->disp_h
,
521 sh_video
->fps
,sh_video
->frametime
525 sh_video
->fps
=force_fps
;
526 sh_video
->frametime
=1.0f
/sh_video
->fps
;
527 mp_msg(MSGT_MENCODER
,MSGL_INFO
,"input fps will be interpreted as %5.2f instead\n", sh_video
->fps
);
530 if(sh_audio
&& out_audio_codec
<0){
532 mp_msg(MSGT_MENCODER
,MSGL_ERR
,"This demuxer doesn't support -nosound yet.\n");
533 mp_msg(MSGT_MENCODER
,MSGL_FATAL
,MSGTR_NoAudioEncoderSelected
);
534 mencoder_exit(1,NULL
);
536 if(sh_video
&& out_video_codec
<0){
537 mp_msg(MSGT_MENCODER
,MSGL_FATAL
,MSGTR_NoVideoEncoderSelected
);
538 mencoder_exit(1,NULL
);
541 if(sh_audio
&& (out_audio_codec
|| seek_to_sec
|| !sh_audio
->wf
)){
542 // Go through the codec.conf and find the best codec...
543 mp_msg(MSGT_CPLAYER
,MSGL_INFO
,"==========================================================================\n");
544 if(!init_best_audio_codec(sh_audio
,audio_codec_list
,audio_fm_list
)){
545 sh_audio
=d_audio
->sh
=NULL
; // failed to init :(
547 mp_msg(MSGT_CPLAYER
,MSGL_INFO
,"==========================================================================\n");
550 // set up video encoder:
553 unsigned int palette
[16], width
, height
;
554 unsigned char tmp
[3] = { 0, 0, 0 };
555 if (spudec_ifo
&& vobsub_parse_ifo(NULL
,spudec_ifo
, palette
, &width
, &height
, 1, dvdsub_id
, tmp
) >= 0)
556 vobsub_writer
= vobsub_out_open(vobsub_out
, palette
, sh_video
->disp_w
, sh_video
->disp_h
,
557 vobsub_out_id
?vobsub_out_id
:(char *)tmp
, vobsub_out_index
);
559 if (vobsub_writer
== NULL
) {
561 if (vobsub_out_id
== NULL
&& stream
->type
== STREAMTYPE_DVD
) {
563 dvd_priv_t
*dvd
= (dvd_priv_t
*)stream
->priv
;
564 for (i
= 0; i
< dvd
->nr_of_subtitles
; ++i
)
565 if (dvd
->subtitles
[i
].id
== dvdsub_id
) {
566 tmp
[0] = (dvd
->subtitles
[i
].language
>> 8) & 0xff;
567 tmp
[1] = dvd
->subtitles
[i
].language
& 0xff;
573 vobsub_writer
=vobsub_out_open(vobsub_out
, stream
->type
==STREAMTYPE_DVD
?((dvd_priv_t
*)(stream
->priv
))->cur_pgc
->palette
:NULL
,
574 sh_video
->disp_w
, sh_video
->disp_h
, vobsub_out_id
, vobsub_out_index
);
580 unsigned int palette
[16], width
, height
;
581 if (vobsub_parse_ifo(NULL
,spudec_ifo
, palette
, &width
, &height
, 1, -1, NULL
) >= 0)
582 vo_spudec
=spudec_new_scaled(palette
, sh_video
->disp_w
, sh_video
->disp_h
);
585 if (vo_spudec
==NULL
) {
586 vo_spudec
=spudec_new_scaled(stream
->type
==STREAMTYPE_DVD
?((dvd_priv_t
*)(stream
->priv
))->cur_pgc
->palette
:NULL
,
587 sh_video
->disp_w
, sh_video
->disp_h
);
593 // after reading video params we should load subtitles because
594 // we know fps so now we can adjust subtitles time to ~6 seconds AST
596 // current_module="read_subtitles_file";
597 if(sub_name
&& sub_name
[0]){
598 subdata
=sub_read_file(sub_name
[0], sh_video
->fps
);
599 if(!subdata
) mp_msg(MSGT_CPLAYER
,MSGL_ERR
,MSGTR_CantLoadSub
,sub_name
[0]);
601 if(sub_auto
) { // auto load sub file ...
602 subdata
=sub_read_file( filename
? sub_filenames( get_path("sub/"), filename
)[0]
603 : "default.sub", sh_video
->fps
);
607 // Apply current settings for forced subs
608 spudec_set_forced_subs_only(vo_spudec
,forced_subs_only
);
610 // set up output file:
611 muxer_f
=fopen(out_filename
,"wb");
613 printf(MSGTR_CannotOpenOutputFile
, out_filename
);
614 mencoder_exit(1,NULL
);
617 muxer
=muxer_new_muxer(out_file_format
,muxer_f
);
619 // ============= VIDEO ===============
621 mux_v
=muxer_new_stream(muxer
,MUXER_TYPE_VIDEO
);
623 mux_v
->buffer_size
=0x200000; // 2MB
624 mux_v
->buffer
=malloc(mux_v
->buffer_size
);
626 mux_v
->source
=sh_video
;
628 mux_v
->h
.dwSampleSize
=0; // VBR
629 #ifdef USE_LIBAVCODEC
631 AVRational q
= av_d2q(force_ofps
?force_ofps
:sh_video
->fps
, 30000);
632 mux_v
->h
.dwScale
= q
.den
;
633 mux_v
->h
.dwRate
= q
.num
;
636 mux_v
->h
.dwScale
=10000;
637 mux_v
->h
.dwRate
=mux_v
->h
.dwScale
*(force_ofps
?force_ofps
:sh_video
->fps
);
640 mux_v
->codec
=out_video_codec
;
643 sh_video
->codec
=NULL
;
644 sh_video
->video_out
=NULL
;
645 sh_video
->vfilter
=NULL
; // fixme!
647 switch(mux_v
->codec
){
650 mux_v
->bih
=sh_video
->bih
;
653 mux_v
->bih
=malloc(sizeof(BITMAPINFOHEADER
));
654 mux_v
->bih
->biSize
=sizeof(BITMAPINFOHEADER
);
655 mux_v
->bih
->biWidth
=sh_video
->disp_w
;
656 mux_v
->bih
->biHeight
=sh_video
->disp_h
;
657 mux_v
->bih
->biCompression
=sh_video
->format
;
658 mux_v
->bih
->biPlanes
=1;
659 mux_v
->bih
->biBitCount
=24; // FIXME!!!
660 mux_v
->bih
->biSizeImage
=mux_v
->bih
->biWidth
*mux_v
->bih
->biHeight
*(mux_v
->bih
->biBitCount
/8);
662 printf("videocodec: framecopy (%dx%d %dbpp fourcc=%x)\n",
663 mux_v
->bih
->biWidth
, mux_v
->bih
->biHeight
,
664 mux_v
->bih
->biBitCount
, mux_v
->bih
->biCompression
);
667 mux_v
->bih
=malloc(sizeof(BITMAPINFOHEADER
));
668 mux_v
->bih
->biSize
=sizeof(BITMAPINFOHEADER
);
669 mux_v
->bih
->biWidth
=sh_video
->disp_w
;
670 mux_v
->bih
->biHeight
=sh_video
->disp_h
;
671 mux_v
->bih
->biPlanes
=1;
672 mux_v
->bih
->biBitCount
=24;
673 mux_v
->bih
->biCompression
=mmioFOURCC('F','r','N','o');
674 mux_v
->bih
->biSizeImage
=mux_v
->bih
->biWidth
*mux_v
->bih
->biHeight
*(mux_v
->bih
->biBitCount
/8);
678 switch(mux_v
->codec
){
680 sh_video
->vfilter
=vf_open_encoder(NULL
,"divx4",(char *)mux_v
); break;
681 case VCODEC_LIBAVCODEC
:
682 sh_video
->vfilter
=vf_open_encoder(NULL
,"lavc",(char *)mux_v
); break;
684 sh_video
->vfilter
=vf_open_encoder(NULL
,"raw",(char *)mux_v
); break;
686 sh_video
->vfilter
=vf_open_encoder(NULL
,"vfw",(char *)mux_v
); break;
688 sh_video
->vfilter
=vf_open_encoder(NULL
,"libdv",(char *)mux_v
); break;
690 sh_video
->vfilter
=vf_open_encoder(NULL
,"xvid",(char *)mux_v
); break;
692 sh_video
->vfilter
=vf_open_encoder(NULL
,"qtvideo",(char *)mux_v
); break;
694 sh_video
->vfilter
=vf_open_encoder(NULL
,"nuv",(char *)mux_v
); break;
697 if(!mux_v
->bih
|| !sh_video
->vfilter
){
698 mp_msg(MSGT_MENCODER
,MSGL_FATAL
,MSGTR_EncoderOpenFailed
);
699 mencoder_exit(1,NULL
);
701 // append 'expand' filter, it fixes stride problems and renders osd:
703 char* vf_args
[] = { "osd", "1", NULL
};
704 sh_video
->vfilter
=vf_open_filter(sh_video
->vfilter
,"expand",vf_args
);
706 sh_video
->vfilter
=append_filters(sh_video
->vfilter
);
708 mp_msg(MSGT_CPLAYER
,MSGL_INFO
,"==========================================================================\n");
709 init_best_video_codec(sh_video
,video_codec_list
,video_fm_list
);
710 mp_msg(MSGT_CPLAYER
,MSGL_INFO
,"==========================================================================\n");
711 if(!sh_video
->inited
) mencoder_exit(1,NULL
);
715 /* force output fourcc to .. */
716 if ((force_fourcc
!= NULL
) && (strlen(force_fourcc
) >= 4))
718 mux_v
->bih
->biCompression
= mmioFOURCC(force_fourcc
[0], force_fourcc
[1],
719 force_fourcc
[2], force_fourcc
[3]);
720 printf(MSGTR_ForcingOutputFourcc
,
721 mux_v
->bih
->biCompression
, (char *)&mux_v
->bih
->biCompression
);
724 //if(demuxer->file_format!=DEMUXER_TYPE_AVI) pts_from_bps=0; // it must be 0 for mpeg/asf!
726 // ============= AUDIO ===============
729 mux_a
=muxer_new_stream(muxer
,MUXER_TYPE_AUDIO
);
731 mux_a
->buffer_size
=0x100000; //16384;
732 mux_a
->buffer
=malloc(mux_a
->buffer_size
);
734 mencoder_exit(1,"memory allocation failed");
736 mux_a
->source
=sh_audio
;
738 mux_a
->codec
=out_audio_codec
;
740 switch(mux_a
->codec
){
743 mux_a
->wf
=sh_audio
->wf
;
744 if(!sh_audio
->i_bps
) sh_audio
->i_bps
=mux_a
->wf
->nAvgBytesPerSec
;
746 mux_a
->wf
= malloc(sizeof(WAVEFORMATEX
));
747 mux_a
->wf
->nBlockAlign
= 1; //mux_a->h.dwSampleSize;
748 mux_a
->wf
->wFormatTag
= sh_audio
->format
;
749 mux_a
->wf
->nChannels
= sh_audio
->channels
;
750 mux_a
->wf
->nSamplesPerSec
= sh_audio
->samplerate
;
751 mux_a
->wf
->nAvgBytesPerSec
=sh_audio
->i_bps
; //mux_a->h.dwSampleSize*mux_a->wf->nSamplesPerSec;
752 mux_a
->wf
->wBitsPerSample
= 16; // FIXME
753 mux_a
->wf
->cbSize
=0; // FIXME for l3codeca.acm
755 if(sh_audio
->audio
.dwScale
){
756 mux_a
->h
.dwSampleSize
=sh_audio
->audio
.dwSampleSize
;
757 mux_a
->h
.dwScale
=sh_audio
->audio
.dwScale
;
758 mux_a
->h
.dwRate
=sh_audio
->audio
.dwRate
;
759 // mux_a->h.dwStart=sh_audio->audio.dwStart;
761 mux_a
->h
.dwSampleSize
=mux_a
->wf
->nBlockAlign
;
762 mux_a
->h
.dwScale
=mux_a
->h
.dwSampleSize
;
763 mux_a
->h
.dwRate
=mux_a
->wf
->nAvgBytesPerSec
;
765 printf("audiocodec: framecopy (format=%x chans=%d rate=%ld bits=%d bps=%ld sample=%ld)\n",
766 mux_a
->wf
->wFormatTag
, mux_a
->wf
->nChannels
, mux_a
->wf
->nSamplesPerSec
,
767 mux_a
->wf
->wBitsPerSample
, mux_a
->wf
->nAvgBytesPerSec
, mux_a
->h
.dwSampleSize
);
770 printf("CBR PCM audio selected\n");
772 mux_a
->h
.dwRate
=force_srate
?force_srate
:sh_audio
->samplerate
;
773 mux_a
->wf
=malloc(sizeof(WAVEFORMATEX
));
774 mux_a
->wf
->wFormatTag
=0x1; // PCM
775 mux_a
->wf
->nChannels
=audio_output_channels
?audio_output_channels
:sh_audio
->channels
;
776 mux_a
->h
.dwSampleSize
=2*mux_a
->wf
->nChannels
;
777 mux_a
->wf
->nBlockAlign
=mux_a
->h
.dwSampleSize
;
778 mux_a
->wf
->nSamplesPerSec
=mux_a
->h
.dwRate
;
779 mux_a
->wf
->nAvgBytesPerSec
=mux_a
->h
.dwSampleSize
*mux_a
->wf
->nSamplesPerSec
;
780 mux_a
->wf
->wBitsPerSample
=16;
781 mux_a
->wf
->cbSize
=0; // FIXME for l3codeca.acm
783 if(!init_audio_filters(sh_audio
,
784 sh_audio
->samplerate
,
785 sh_audio
->channels
, sh_audio
->sample_format
, sh_audio
->samplesize
,
786 mux_a
->wf
->nSamplesPerSec
, mux_a
->wf
->nChannels
,
787 (mux_a
->wf
->wBitsPerSample
==8)? AFMT_U8
:AFMT_S16_LE
,
788 mux_a
->wf
->wBitsPerSample
/8,
789 16384, mux_a
->wf
->nAvgBytesPerSec
)){
790 mp_msg(MSGT_CPLAYER
,MSGL_ERR
,"Couldn't find matching filter / ao format!\n");
795 printf("MP3 audio selected\n");
796 mux_a
->h
.dwSampleSize
=0; // VBR
797 mux_a
->h
.dwRate
=force_srate
?force_srate
:sh_audio
->samplerate
;
798 mux_a
->h
.dwScale
=(mux_a
->h
.dwRate
<32000)?576:1152; // samples/frame
799 if(sizeof(MPEGLAYER3WAVEFORMAT
)!=30) mp_msg(MSGT_MENCODER
,MSGL_WARN
,"sizeof(MPEGLAYER3WAVEFORMAT)==%d!=30, maybe broken C compiler?\n",sizeof(MPEGLAYER3WAVEFORMAT
));
800 mux_a
->wf
=malloc(sizeof(MPEGLAYER3WAVEFORMAT
)); // should be 30
801 mux_a
->wf
->wFormatTag
=0x55; // MP3
802 mux_a
->wf
->nChannels
= (lame_param_mode
<0) ? sh_audio
->channels
:
803 ((lame_param_mode
==3) ? 1 : 2);
804 mux_a
->wf
->nSamplesPerSec
=mux_a
->h
.dwRate
;
805 mux_a
->wf
->nAvgBytesPerSec
=192000/8; // FIXME!
806 mux_a
->wf
->nBlockAlign
=(mux_a
->h
.dwRate
<32000)?576:1152; // required for l3codeca.acm + WMP 6.4
807 mux_a
->wf
->wBitsPerSample
=0; //16;
808 // from NaNdub: (requires for l3codeca.acm)
809 mux_a
->wf
->cbSize
=12;
810 ((MPEGLAYER3WAVEFORMAT
*)(mux_a
->wf
))->wID
=1;
811 ((MPEGLAYER3WAVEFORMAT
*)(mux_a
->wf
))->fdwFlags
=2;
812 ((MPEGLAYER3WAVEFORMAT
*)(mux_a
->wf
))->nBlockSize
=(mux_a
->h
.dwRate
<32000)?576:1152; // ???
813 ((MPEGLAYER3WAVEFORMAT
*)(mux_a
->wf
))->nFramesPerBlock
=1;
814 ((MPEGLAYER3WAVEFORMAT
*)(mux_a
->wf
))->nCodecDelay
=0;
816 if(!init_audio_filters(sh_audio
,
817 sh_audio
->samplerate
,
818 sh_audio
->channels
, sh_audio
->sample_format
, sh_audio
->samplesize
,
819 mux_a
->wf
->nSamplesPerSec
, mux_a
->wf
->nChannels
,
820 #ifdef WORDS_BIGENDIAN
825 4608, mux_a
->h
.dwRate
*mux_a
->wf
->nChannels
*2)){
826 mp_msg(MSGT_CPLAYER
,MSGL_ERR
,"Couldn't find matching filter / ao format!\n");
830 #ifdef USE_LIBAVCODEC
832 if(!lavc_param_acodec
)
834 mp_msg(MSGT_MENCODER
, MSGL_FATAL
, "Audio LAVC, Missing codec name!\n");
840 avcodec_register_all();
844 lavc_acodec
= avcodec_find_encoder_by_name(lavc_param_acodec
);
847 mp_msg(MSGT_MENCODER
, MSGL_FATAL
, "Audio LAVC, couldn't find encoder for codec %s\n", lavc_param_acodec
);
851 lavc_actx
= avcodec_alloc_context();
852 if(lavc_actx
== NULL
)
854 mp_msg(MSGT_MENCODER
, MSGL_FATAL
, "Audio LAVC, couldn't allocate context!\n");
858 if(lavc_param_atag
== 0)
859 lavc_param_atag
= lavc_find_atag(lavc_param_acodec
);
861 // put sample parameters
862 lavc_actx
->channels
= audio_output_channels
? audio_output_channels
: sh_audio
->channels
;
863 lavc_actx
->sample_rate
= force_srate
? force_srate
: sh_audio
->samplerate
;
864 lavc_actx
->bit_rate
= lavc_param_abitrate
* 1000;
867 * Special case for imaadpcm.
868 * The bitrate is only dependant on samplerate.
869 * We have to known frame_size and block_align in advance,
870 * so I just copied the code from libavcodec/adpcm.c
872 * However, ms imaadpcm uses a block_align of 2048,
873 * lavc defaults to 1024
875 if(lavc_param_atag
== 0x11) {
877 int framesize
= (blkalign
- 4 * lavc_actx
->channels
) * 8 / (4 * lavc_actx
->channels
) + 1;
878 lavc_actx
->bit_rate
= lavc_actx
->sample_rate
*8*blkalign
/framesize
;
881 if(avcodec_open(lavc_actx
, lavc_acodec
) < 0)
883 mp_msg(MSGT_MENCODER
, MSGL_FATAL
, "Couldn't open codec %s, br=%d\n", lavc_param_acodec
, lavc_param_abitrate
);
887 if(lavc_param_atag
== 0x11) {
888 lavc_actx
->block_align
= 2048;
889 lavc_actx
->frame_size
= (lavc_actx
->block_align
- 4 * lavc_actx
->channels
) * 8 / (4 * lavc_actx
->channels
) + 1;
892 lavc_abuf
= malloc(lavc_actx
->frame_size
* 2 * lavc_actx
->channels
);
893 if(lavc_abuf
== NULL
)
895 fprintf(stderr
, "Couldn't allocate %d bytes\n", lavc_actx
->frame_size
* 2 * lavc_actx
->channels
);
899 mux_a
->wf
= malloc(sizeof(WAVEFORMATEX
)+lavc_actx
->extradata_size
+256);
900 mux_a
->wf
->wFormatTag
= lavc_param_atag
;
901 mux_a
->wf
->nChannels
= lavc_actx
->channels
;
902 mux_a
->wf
->nSamplesPerSec
= lavc_actx
->sample_rate
;
903 mux_a
->wf
->nAvgBytesPerSec
= (lavc_actx
->bit_rate
/ 8);
904 mux_a
->h
.dwRate
= mux_a
->wf
->nAvgBytesPerSec
;
905 if (lavc_actx
->block_align
) {
906 mux_a
->h
.dwSampleSize
= mux_a
->h
.dwScale
= lavc_actx
->block_align
;
908 mux_a
->h
.dwScale
= (mux_a
->wf
->nAvgBytesPerSec
* lavc_actx
->frame_size
)/ mux_a
->wf
->nSamplesPerSec
; /* for cbr */
910 if ((mux_a
->wf
->nAvgBytesPerSec
*
911 lavc_actx
->frame_size
) % mux_a
->wf
->nSamplesPerSec
) {
912 mux_a
->h
.dwScale
= lavc_actx
->frame_size
;
913 mux_a
->h
.dwRate
= lavc_actx
->sample_rate
;
914 mux_a
->h
.dwSampleSize
= 0; // Blocksize not constant
916 mux_a
->h
.dwSampleSize
= mux_a
->h
.dwScale
;
919 mux_a
->wf
->nBlockAlign
= mux_a
->h
.dwScale
;
920 mux_a
->h
.dwSuggestedBufferSize
= audio_preload
*mux_a
->wf
->nAvgBytesPerSec
;
921 mux_a
->h
.dwSuggestedBufferSize
-= mux_a
->h
.dwSuggestedBufferSize
% mux_a
->wf
->nBlockAlign
;
923 switch (lavc_param_atag
) {
924 case 0x11: /* imaadpcm */
925 mux_a
->wf
->wBitsPerSample
= 4;
926 mux_a
->wf
->cbSize
= 2;
928 * Magic imaadpcm values, currently probably only valid
931 ((unsigned char*)mux_a
->wf
)[sizeof(WAVEFORMATEX
)] = 0xf9;
932 ((unsigned char*)mux_a
->wf
)[sizeof(WAVEFORMATEX
)+1] = 0x07;
935 mux_a
->wf
->cbSize
= 12;
936 mux_a
->wf
->wBitsPerSample
= 0; /* does not apply */
937 ((MPEGLAYER3WAVEFORMAT
*) (mux_a
->wf
))->wID
= 1;
938 ((MPEGLAYER3WAVEFORMAT
*) (mux_a
->wf
))->fdwFlags
= 2;
939 ((MPEGLAYER3WAVEFORMAT
*) (mux_a
->wf
))->nBlockSize
= mux_a
->wf
->nBlockAlign
;
940 ((MPEGLAYER3WAVEFORMAT
*) (mux_a
->wf
))->nFramesPerBlock
= 1;
941 ((MPEGLAYER3WAVEFORMAT
*) (mux_a
->wf
))->nCodecDelay
= 0;
944 mux_a
->wf
->wBitsPerSample
= 0; /* Unknown */
945 if (lavc_actx
->extradata
&& (lavc_actx
->extradata_size
> 0))
947 memcpy(mux_a
->wf
+sizeof(WAVEFORMATEX
), lavc_actx
->extradata
,
948 lavc_actx
->extradata_size
);
949 mux_a
->wf
->cbSize
= lavc_actx
->extradata_size
;
952 mux_a
->wf
->cbSize
= 0;
957 mux_a
->wf
= realloc(mux_a
->wf
, sizeof(WAVEFORMATEX
)+mux_a
->wf
->cbSize
);
960 if (!init_audio_filters(
962 sh_audio
->samplerate
, sh_audio
->channels
,
963 sh_audio
->sample_format
, sh_audio
->samplesize
,
964 mux_a
->wf
->nSamplesPerSec
, mux_a
->wf
->nChannels
,
966 mux_a
->h
.dwSuggestedBufferSize
,
967 mux_a
->h
.dwSuggestedBufferSize
*2)) {
968 mp_msg(MSGT_CPLAYER
, MSGL_ERR
, "Couldn't find matching filter / ao format!\n");
972 mp_msg(MSGT_MENCODER
, MSGL_V
, "FRAME_SIZE: %d, BUFFER_SIZE: %d, TAG: 0x%x\n", lavc_actx
->frame_size
, lavc_actx
->frame_size
* 2 * lavc_actx
->channels
, mux_a
->wf
->wFormatTag
);
978 if (verbose
>1) print_wave_header(mux_a
->wf
);
980 if(audio_delay
!=0.0){
981 mux_a
->h
.dwStart
=audio_delay
*mux_a
->h
.dwRate
/mux_a
->h
.dwScale
;
982 printf("Setting AUDIO DELAY to %5.3f\n",mux_a
->h
.dwStart
*mux_a
->h
.dwScale
/(float)mux_a
->h
.dwRate
);
987 printf(MSGTR_WritingAVIHeader
);
988 if (muxer
->cont_write_header
) muxer_write_header(muxer
);
993 switch(mux_a
->codec
){
998 lame_set_bWriteVbrTag(lame
,0);
999 lame_set_in_samplerate(lame
,mux_a
->wf
->nSamplesPerSec
);
1000 //lame_set_in_samplerate(lame,sh_audio->samplerate); // if resampling done by lame
1001 lame_set_num_channels(lame
,mux_a
->wf
->nChannels
);
1002 lame_set_out_samplerate(lame
,mux_a
->wf
->nSamplesPerSec
);
1003 lame_set_quality(lame
,lame_param_algqual
); // 0 = best q
1004 if(lame_param_vbr
){ // VBR:
1005 lame_set_VBR(lame
,lame_param_vbr
); // vbr mode
1006 lame_set_VBR_q(lame
,lame_param_quality
+1); // 1 = best vbr q 6=~128k
1007 if(lame_param_br
>0) lame_set_VBR_mean_bitrate_kbps(lame
,lame_param_br
);
1009 if(lame_param_br
>0) lame_set_brate(lame
,lame_param_br
);
1011 if(lame_param_mode
>=0) lame_set_mode(lame
,lame_param_mode
); // j-st
1012 if(lame_param_ratio
>0) lame_set_compression_ratio(lame
,lame_param_ratio
);
1013 if(lame_param_scale
>0) {
1014 printf("Setting audio input gain to %f\n", lame_param_scale
);
1015 lame_set_scale(lame
,lame_param_scale
);
1017 if(lame_param_lowpassfreq
>=-1) lame_set_lowpassfreq(lame
,lame_param_lowpassfreq
);
1018 if(lame_param_highpassfreq
>=-1) lame_set_highpassfreq(lame
,lame_param_highpassfreq
);
1019 #if HAVE_MP3LAME >= 392
1020 if(lame_param_preset
!= NULL
){
1021 printf ("\npreset=%s\n\n",lame_param_preset
);
1022 lame_presets_set(lame
,lame_param_fast
, (lame_param_vbr
==0), lame_param_preset
);
1025 lame_init_params(lame
);
1027 lame_print_config(lame
);
1028 lame_print_internals(lame
);
1034 signal(SIGINT
,exit_sighandler
); // Interrupt from keyboard
1035 signal(SIGQUIT
,exit_sighandler
); // Quit from keyboard
1036 signal(SIGTERM
,exit_sighandler
); // kill
1038 timer_start
=GetTimerMS();
1043 if (sscanf(seek_to_sec
, "%d:%d:%f", &a
,&b
,&d
)==3)
1045 else if (sscanf(seek_to_sec
, "%d:%f", &a
, &d
)==2)
1048 sscanf(seek_to_sec
, "%f", &d
);
1050 demux_seek(demuxer
, d
, 1);
1051 // there is 2 way to handle the -ss option in 3-pass mode:
1052 // > 1. do the first pass for the whole file, and use -ss for 2nd/3rd pases only
1053 // > 2. do all the 3 passes with the same -ss value
1054 // this line enables behaviour 1. (and kills 2. at the same time):
1055 // if(demuxer2) demux_seek(demuxer2, d, 1);
1058 if (out_file_format
== MUXER_TYPE_MPEG
)
1060 if (audio_preload
> 0.4) {
1061 fprintf(stderr
,"Limiting audio preload to 0.4s\n");
1062 audio_preload
= 0.4;
1064 if (audio_density
< 4) {
1065 fprintf(stderr
,"Increasing audio density to 4\n");
1070 if(file_format
== DEMUXER_TYPE_TV
)
1072 fprintf(stderr
,"Forcing audio preload to 0, max pts correction to 0\n");
1073 audio_preload
= 0.0;
1074 default_max_pts_correction
= 0;
1077 play_n_frames
=play_n_frames_mf
;
1085 unsigned char* start
=NULL
;
1087 int skip_flag
=0; // 1=skip -1=duplicate
1089 if((end_at_type
== END_AT_SIZE
&& end_at
<= ftello(muxer_f
)) ||
1090 (end_at_type
== END_AT_TIME
&& end_at
< sh_video
->timer
))
1093 if(play_n_frames
>=0){
1095 if(play_n_frames
<0) break;
1100 while(mux_a
->timer
-audio_preload
<mux_v
->timer
){
1103 ptimer_start
= GetTimerMS();
1105 #ifdef USE_LIBAVCODEC
1106 if(mux_a
->codec
== ACODEC_LAVC
){
1109 size
= lavc_actx
->frame_size
* 2 * mux_a
->wf
->nChannels
;
1111 rd_len
= dec_audio(sh_audio
, lavc_abuf
, size
);
1116 mux_a
->buffer_len
+= avcodec_encode_audio(lavc_actx
, mux_a
->buffer
+ mux_a
->buffer_len
, size
, lavc_abuf
);
1117 if (mux_a
->h
.dwSampleSize
) { /* CBR */
1119 * work around peculiar lame behaviour
1121 if (mux_a
->buffer_len
< mux_a
->wf
->nBlockAlign
) {
1124 len
= mux_a
->wf
->nBlockAlign
*(mux_a
->buffer_len
/mux_a
->wf
->nBlockAlign
);
1127 len
= mux_a
->buffer_len
;
1129 if (mux_v
->timer
== 0) mux_a
->h
.dwInitialFrames
++;
1132 if(mux_a
->h
.dwSampleSize
){
1133 // CBR - copy 0.5 sec of audio
1134 switch(mux_a
->codec
){
1135 case ACODEC_COPY
: // copy
1136 len
=mux_a
->wf
->nAvgBytesPerSec
/audio_density
;
1137 len
/=mux_a
->h
.dwSampleSize
;if(len
<1) len
=1;
1138 len
*=mux_a
->h
.dwSampleSize
;
1139 len
=demux_read_data(sh_audio
->ds
,mux_a
->buffer
,len
);
1142 len
=mux_a
->h
.dwSampleSize
*(mux_a
->h
.dwRate
/audio_density
);
1143 len
=dec_audio(sh_audio
,mux_a
->buffer
,len
);
1147 // VBR - encode/copy an audio frame
1148 switch(mux_a
->codec
){
1149 case ACODEC_COPY
: // copy
1150 len
=ds_get_packet(sh_audio
->ds
,(unsigned char**) &mux_a
->buffer
);
1151 // printf("VBR audio framecopy not yet implemented!\n");
1155 while(mux_a
->buffer_len
<4){
1156 unsigned char tmp
[2304];
1157 int len
=dec_audio(sh_audio
,tmp
,2304);
1158 if(len
<=0) break; // eof
1159 /* mono encoding, a bit tricky */
1160 if (mux_a
->wf
->nChannels
== 1)
1162 len
= lame_encode_buffer(lame
, (short *)tmp
, (short *)tmp
, len
/2,
1163 mux_a
->buffer
+mux_a
->buffer_len
, mux_a
->buffer_size
-mux_a
->buffer_len
);
1167 len
=lame_encode_buffer_interleaved(lame
,
1169 mux_a
->buffer
+mux_a
->buffer_len
,mux_a
->buffer_size
-mux_a
->buffer_len
);
1171 if(len
<0) break; // error
1172 mux_a
->buffer_len
+=len
;
1174 if(mux_a
->buffer_len
<4) break;
1175 len
=mp_decode_mp3_header(mux_a
->buffer
);
1176 //printf("%d\n",len);
1177 if(len
<=0) break; // bad frame!
1178 // printf("[%d]\n",mp_mp3_get_lsf(mux_a->buffer));
1179 while(mux_a
->buffer_len
<len
){
1180 unsigned char tmp
[2304];
1181 int len
=dec_audio(sh_audio
,tmp
,2304);
1182 if(len
<=0) break; // eof
1183 /* mono encoding, a bit tricky */
1184 if (mux_a
->wf
->nChannels
== 1)
1186 len
= lame_encode_buffer(lame
, (short *)tmp
, (short *)tmp
, len
/2,
1187 mux_a
->buffer
+mux_a
->buffer_len
, mux_a
->buffer_size
-mux_a
->buffer_len
);
1191 len
=lame_encode_buffer_interleaved(lame
,
1193 mux_a
->buffer
+mux_a
->buffer_len
,mux_a
->buffer_size
-mux_a
->buffer_len
);
1195 if(len
<0) break; // error
1196 mux_a
->buffer_len
+=len
;
1202 if(len
<=0) break; // EOF?
1203 muxer_write_chunk(mux_a
,len
,0x10);
1204 if(!mux_a
->h
.dwSampleSize
&& mux_a
->timer
>0)
1205 mux_a
->wf
->nAvgBytesPerSec
=0.5f
+(double)mux_a
->size
/mux_a
->timer
; // avg bps (VBR)
1206 if(mux_a
->buffer_len
>=len
){
1207 mux_a
->buffer_len
-=len
;
1208 memcpy(mux_a
->buffer
,mux_a
->buffer
+len
,mux_a
->buffer_len
);
1213 audiorate
+= (GetTimerMS() - ptimer_start
);
1219 in_size
=video_read_frame(sh_video
,&frame_time
,&start
,force_fps
);
1220 if(in_size
<0){ at_eof
=1; break; }
1221 sh_video
->timer
+=frame_time
; ++decoded_frameno
;
1223 v_timer_corr
-=frame_time
-(float)mux_v
->h
.dwScale
/mux_v
->h
.dwRate
;
1225 if(demuxer2
){ // 3-pass encoding, read control file (frameno.avi)
1227 while(next_frameno
<decoded_frameno
){
1229 int len
=ds_get_packet(demuxer2
->video
,(unsigned char**) &start
);
1230 if(len
<0){ at_eof
=1;break;}
1231 if(len
==0) --skip_flag
; else // duplicate
1232 if(len
==4) next_frameno
=start
[0];
1235 // if(skip_flag) printf("!!!!!!!!!!!!\n");
1236 skip_flag
=next_frameno
-decoded_frameno
;
1238 while(next_frameno
<=decoded_frameno
){
1240 int len
=ds_get_packet(demuxer2
->video
,(unsigned char**) &start
);
1241 if(len
<0){ at_eof
=1;break;}
1242 if(len
==0) --skip_flag
; else // duplicate
1243 if(len
==4) next_frameno
=start
[0];
1245 // if(at_eof) break;
1246 // printf("Current fno=%d requested=%d skip=%d \n",decoded_frameno,fno,skip_flag);
1249 // check frame duplicate/drop:
1251 //printf("\r### %5.3f ###\n",v_timer_corr);
1253 if(v_timer_corr
>=(float)mux_v
->h
.dwScale
/mux_v
->h
.dwRate
&&
1254 (skip_limit
<0 || skip_flag
<skip_limit
) ){
1255 v_timer_corr
-=(float)mux_v
->h
.dwScale
/mux_v
->h
.dwRate
;
1256 ++skip_flag
; // skip
1258 while(v_timer_corr
<=-(float)mux_v
->h
.dwScale
/mux_v
->h
.dwRate
&&
1259 (skip_limit
<0 || (-skip_flag
)<skip_limit
) ){
1260 v_timer_corr
+=(float)mux_v
->h
.dwScale
/mux_v
->h
.dwRate
;
1264 while( (v_pts_corr
<=-(float)mux_v
->h
.dwScale
/mux_v
->h
.dwRate
&& skip_flag
>0)
1265 || (v_pts_corr
<=-2*(float)mux_v
->h
.dwScale
/mux_v
->h
.dwRate
) ){
1266 v_pts_corr
+=(float)mux_v
->h
.dwScale
/mux_v
->h
.dwRate
;
1269 if( (v_pts_corr
>=(float)mux_v
->h
.dwScale
/mux_v
->h
.dwRate
&& skip_flag
<0)
1270 || (v_pts_corr
>=2*(float)mux_v
->h
.dwScale
/mux_v
->h
.dwRate
) )
1271 if(skip_flag
<=0){ // we can't skip more than 1 frame now
1272 v_pts_corr
-=(float)mux_v
->h
.dwScale
/mux_v
->h
.dwRate
;
1273 ++skip_flag
; // skip
1278 ptimer_start
= GetTimerMS();
1280 switch(mux_v
->codec
){
1282 mux_v
->buffer
=start
;
1283 if(skip_flag
<=0) muxer_write_chunk(mux_v
,in_size
,(sh_video
->ds
->flags
&1)?0x10:0);
1285 case VCODEC_FRAMENO
:
1286 mux_v
->buffer
=(unsigned char *)&decoded_frameno
; // tricky
1287 if(skip_flag
<=0) muxer_write_chunk(mux_v
,sizeof(int),0x10);
1290 // decode_video will callback down to ve_*.c encoders, through the video filters
1291 blit_frame
=decode_video(sh_video
,start
,in_size
,(skip_flag
>0)?1:0);
1295 // unwanted skipping of a frame, what to do?
1297 // skipping not allowed -> write empty frame:
1298 muxer_write_chunk(mux_v
,0,0);
1300 // skipping allowed -> skip it and distriubute timer error:
1301 v_timer_corr
-=(float)mux_v
->h
.dwScale
/mux_v
->h
.dwRate
;
1308 videorate
+=(GetTimerMS() - ptimer_start
);
1312 if(file_format
!= DEMUXER_TYPE_TV
&& !verbose
) printf(MSGTR_DuplicateFrames
,-skip_flag
);
1315 muxer_write_chunk(mux_v
,0,0);
1321 if(file_format
!= DEMUXER_TYPE_TV
&& !verbose
) printf(MSGTR_SkipFrame
);
1326 if(sh_audio
&& !demuxer2
){
1331 unsigned int samples
=(sh_audio
->audio
.dwSampleSize
)?
1332 ((ds_tell(d_audio
)-sh_audio
->a_in_buffer_len
)/sh_audio
->audio
.dwSampleSize
) :
1333 (d_audio
->block_no
); // <- used for VBR audio
1334 // printf("samples=%d \n",samples);
1335 a_pts
=samples
*(float)sh_audio
->audio
.dwScale
/(float)sh_audio
->audio
.dwRate
;
1340 // PTS = (last timestamp) + (bytes after last timestamp)/(bytes per sec)
1342 if(!delay_corrected
) if(a_pts
) delay_corrected
=1;
1343 //printf("*** %5.3f ***\n",a_pts);
1344 a_pts
+=(ds_tell_pts(d_audio
)-sh_audio
->a_in_buffer_len
)/(float)sh_audio
->i_bps
;
1346 v_pts
=sh_video
? sh_video
->pts
: d_video
->pts
;
1347 // av = compensated (with out buffering delay) A-V diff
1348 AV_delay
=(a_pts
-v_pts
); AV_delay
-=mux_a
->timer
-(mux_v
->timer
-(v_timer_corr
+v_pts_corr
));
1349 // compensate input video timer by av:
1351 if(x
<-max_pts_correction
) x
=-max_pts_correction
; else
1352 if(x
> max_pts_correction
) x
= max_pts_correction
;
1353 if(default_max_pts_correction
>=0)
1354 max_pts_correction
=default_max_pts_correction
;
1356 max_pts_correction
=sh_video
->frametime
*0.10; // +-10% of time
1357 // sh_video->timer-=x;
1362 // printf("A:%6.1f V:%6.1f A-V:%7.3f oAV:%7.3f diff:%7.3f ct:%7.3f vpc:%7.3f \r",
1363 // a_pts,v_pts,a_pts-v_pts,
1364 // (float)(mux_a->timer-mux_v->timer),
1365 // AV_delay, c_total, v_pts_corr );
1366 // printf("V:%6.1f \r", d_video->pts );
1369 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",
1370 a_pts
,v_pts
,a_pts
-v_pts
,c_total
,
1371 (int)sh_video
->num_frames
,(int)sh_video
->num_frames_decoded
,
1372 (sh_video
->timer
>0.5)?(int)(100.0*video_time_usage
/(double)sh_video
->timer
):0,
1373 (sh_video
->timer
>0.5)?(int)(100.0*vout_time_usage
/(double)sh_video
->timer
):0,
1374 (sh_video
->timer
>0.5)?(100.0*audio_time_usage
/(double)sh_video
->timer
):0
1379 { float t
=(GetTimerMS()-timer_start
)*0.001f
;
1380 float len
=(demuxer
->movi_end
-demuxer
->movi_start
);
1381 float p
=len
>1000 ? (float)(demuxer
->filepos
-demuxer
->movi_start
) / len
: 0;
1383 if(!len
&& sh_audio
&& sh_audio
->audio
.dwLength
>100){
1384 p
=(sh_audio
->audio
.dwSampleSize
? ds_tell(sh_audio
->ds
)/sh_audio
->audio
.dwSampleSize
: sh_audio
->ds
->block_no
)
1385 / (float)(sh_audio
->audio
.dwLength
);
1389 mp_msg(MSGT_AVSYNC
,MSGL_STATUS
,"%d < %d < %d \r",
1390 (int)demuxer
->movi_start
,
1391 (int)demuxer
->filepos
,
1392 (int)demuxer
->movi_end
);
1396 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",
1397 mux_v
->timer
, decoded_frameno
, (int)(p
*100),
1398 (t
>1) ? (int)(decoded_frameno
/t
+0.5) : 0,
1399 (p
>0.001) ? (int)((t
/p
-t
)/60) : 0,
1400 (p
>0.001) ? (int)(ftello(muxer_f
)/p
/1024/1024) : 0,
1402 (mux_v
->timer
>1) ? (int)(mux_v
->size
/mux_v
->timer
/125) : 0,
1403 (mux_a
&& mux_a
->timer
>1) ? (int)(mux_a
->size
/mux_a
->timer
/125) : 0,
1404 audiorate
/audiosamples
, videorate
/videosamples
,
1405 duplicatedframes
, badframes
, skippedframes
1408 mp_msg(MSGT_AVSYNC
,MSGL_STATUS
,"Pos:%6.1fs %6df (%2d%%) %3dfps Trem:%4dmin %3dmb A-V:%5.3f [%d:%d]\r",
1409 mux_v
->timer
, decoded_frameno
, (int)(p
*100),
1410 (t
>1) ? (int)(decoded_frameno
/t
+0.5) : 0,
1411 (p
>0.001) ? (int)((t
/p
-t
)/60) : 0,
1412 (p
>0.001) ? (int)(ftello(muxer_f
)/p
/1024/1024) : 0,
1414 (mux_v
->timer
>1) ? (int)(mux_v
->size
/mux_v
->timer
/125) : 0,
1415 (mux_a
&& mux_a
->timer
>1) ? (int)(mux_a
->size
/mux_a
->timer
/125) : 0
1424 if(subdata
&& sh_video
->pts
>0){
1425 float pts
=sh_video
->pts
;
1426 if(sub_fps
==0) sub_fps
=sh_video
->fps
;
1427 if (pts
> sub_last_pts
|| pts
< sub_last_pts
-1.0 ) {
1428 find_sub(subdata
, (pts
+sub_delay
) *
1429 (subdata
->sub_uses_time
? 100. : sub_fps
));
1430 // FIXME! frame counter...
1438 if(vo_spudec
||vobsub_writer
){
1439 unsigned char* packet
=NULL
;
1441 while((len
=ds_get_packet_sub(d_dvdsub
,&packet
))>0){
1442 mp_msg(MSGT_MENCODER
,MSGL_V
,"\rDVD sub: len=%d v_pts=%5.3f s_pts=%5.3f \n",len
,sh_video
->pts
,d_dvdsub
->pts
);
1444 spudec_assemble(vo_spudec
,packet
,len
,90000*d_dvdsub
->pts
);
1446 vobsub_out_output(vobsub_writer
,packet
,len
,mux_v
->timer
+ d_dvdsub
->pts
- sh_video
->pts
);
1449 spudec_heartbeat(vo_spudec
,90000*sh_video
->pts
);
1450 vo_osd_changed(OSDTYPE_SPU
);
1455 if(ferror(muxer_f
)) {
1456 mp_msg(MSGT_MENCODER
,MSGL_FATAL
,MSGTR_ErrorWritingFile
, out_filename
);
1457 mencoder_exit(1, NULL
);
1463 // fixup CBR mp3 audio header:
1464 if(sh_audio
&& mux_a
->codec
==ACODEC_VBRMP3
&& !lame_param_vbr
){
1465 mux_a
->h
.dwSampleSize
=1;
1466 ((MPEGLAYER3WAVEFORMAT
*)(mux_a
->wf
))->nBlockSize
=
1467 (mux_a
->size
+(mux_a
->h
.dwLength
>>1))/mux_a
->h
.dwLength
;
1468 mux_a
->h
.dwLength
=mux_a
->size
;
1469 mux_a
->h
.dwRate
=mux_a
->wf
->nAvgBytesPerSec
;
1471 mux_a
->wf
->nBlockAlign
=1;
1472 printf("\n\nCBR audio: %ld bytes/sec, %d bytes/block\n",
1473 mux_a
->h
.dwRate
,((MPEGLAYER3WAVEFORMAT
*)(mux_a
->wf
))->nBlockSize
);
1477 printf(MSGTR_WritingAVIIndex
);
1478 if (muxer
->cont_write_index
) muxer_write_index(muxer
);
1479 muxer_f_size
=ftello(muxer_f
);
1480 printf(MSGTR_FixupAVIHeader
);
1481 fseek(muxer_f
,0,SEEK_SET
);
1482 if (muxer
->cont_write_header
) muxer_write_header(muxer
); // update header
1483 if(ferror(muxer_f
) || fclose(muxer_f
) != 0) {
1484 mp_msg(MSGT_MENCODER
,MSGL_FATAL
,MSGTR_ErrorWritingFile
, out_filename
);
1485 mencoder_exit(1, NULL
);
1488 vobsub_out_close(vobsub_writer
);
1490 if(out_video_codec
==VCODEC_FRAMENO
&& mux_v
->timer
>100){
1491 printf(MSGTR_RecommendedVideoBitrate
,"650MB",(int)((650*1024*1024-muxer_f_size
)/mux_v
->timer
/125));
1492 printf(MSGTR_RecommendedVideoBitrate
,"700MB",(int)((700*1024*1024-muxer_f_size
)/mux_v
->timer
/125));
1493 printf(MSGTR_RecommendedVideoBitrate
,"800MB",(int)((800*1024*1024-muxer_f_size
)/mux_v
->timer
/125));
1494 printf(MSGTR_RecommendedVideoBitrate
,"2 x 650MB",(int)((2*650*1024*1024-muxer_f_size
)/mux_v
->timer
/125));
1495 printf(MSGTR_RecommendedVideoBitrate
,"2 x 700MB",(int)((2*700*1024*1024-muxer_f_size
)/mux_v
->timer
/125));
1496 printf(MSGTR_RecommendedVideoBitrate
,"2 x 800MB",(int)((2*800*1024*1024-muxer_f_size
)/mux_v
->timer
/125));
1499 printf(MSGTR_VideoStreamResult
,
1500 (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
);
1502 printf(MSGTR_AudioStreamResult
,
1503 (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
);
1505 if(sh_video
){ uninit_video(sh_video
);sh_video
=NULL
; }
1506 if(demuxer
) free_demuxer(demuxer
);
1507 if(stream
) free_stream(stream
); // kill cache thread
1509 #ifdef USE_LIBAVCODEC
1510 if(lavc_abuf
!= NULL
)
1517 static int parse_end_at(m_option_t
*conf
, const char* param
)
1520 end_at_type
= END_AT_NONE
;
1522 /* End at size parsing */
1526 end_at_type
= END_AT_SIZE
;
1528 if(sscanf(param
, "%lf%3s", &end_at
, unit
) == 2) {
1529 if(!strcasecmp(unit
, "b"))
1531 else if(!strcasecmp(unit
, "kb"))
1533 else if(!strcasecmp(unit
, "mb"))
1534 end_at
*= 1024*1024;
1536 end_at_type
= END_AT_NONE
;
1539 end_at_type
= END_AT_NONE
;
1542 /* End at time parsing. This has to be last because of
1543 * sscanf("%f", ...) below */
1544 if(end_at_type
== END_AT_NONE
)
1548 end_at_type
= END_AT_TIME
;
1550 if (sscanf(param
, "%d:%d:%f", &a
, &b
, &d
) == 3)
1551 end_at
= 3600*a
+ 60*b
+ d
;
1552 else if (sscanf(param
, "%d:%f", &a
, &d
) == 2)
1554 else if (sscanf(param
, "%f", &d
) == 1)
1557 end_at_type
= END_AT_NONE
;
1560 if(end_at_type
== END_AT_NONE
)
1561 return ERR_FUNC_ERR
;
1567 /* Flip the image in src and store the result in dst. src and dst may overlap.
1568 width is the size of each line in bytes. */
1569 static uint8_t* flip_upside_down(uint8_t* dst
, const uint8_t* src
, int width
,
1572 uint8_t* tmp
= malloc(width
);
1575 for(i
= 0; i
< height
/2; i
++) {
1576 memcpy(tmp
, &src
[i
*width
], width
);
1577 memcpy(&dst
[i
* width
], &src
[(height
- i
) * width
], width
);
1578 memcpy(&dst
[(height
- i
) * width
], tmp
, width
);
1586 #if HAVE_MP3LAME >= 392
1588 taken out of presets_set in lame-3.93.1/frontend/parse.c and modified */
1589 static int lame_presets_set( lame_t gfp
, int fast
, int cbr
, const char* preset_name
)
1593 if (strcmp(preset_name
, "help") == 0) {
1594 fprintf(stdout
, "LAME version %s (%s)\n\n", get_lame_version(), get_lame_url());
1595 lame_presets_longinfo_dm( stdout
);
1601 //aliases for compatibility with old presets
1603 if (strcmp(preset_name
, "phone") == 0) {
1607 if ( (strcmp(preset_name
, "phon+") == 0) ||
1608 (strcmp(preset_name
, "lw") == 0) ||
1609 (strcmp(preset_name
, "mw-eu") == 0) ||
1610 (strcmp(preset_name
, "sw") == 0)) {
1614 if (strcmp(preset_name
, "mw-us") == 0) {
1618 if (strcmp(preset_name
, "voice") == 0) {
1622 if (strcmp(preset_name
, "fm") == 0) {
1623 preset_name
= "112";
1625 if ( (strcmp(preset_name
, "radio") == 0) ||
1626 (strcmp(preset_name
, "tape") == 0)) {
1627 preset_name
= "112";
1629 if (strcmp(preset_name
, "hifi") == 0) {
1630 preset_name
= "160";
1632 if (strcmp(preset_name
, "cd") == 0) {
1633 preset_name
= "192";
1635 if (strcmp(preset_name
, "studio") == 0) {
1636 preset_name
= "256";
1639 #if HAVE_MP3LAME >= 393
1640 if (strcmp(preset_name
, "medium") == 0) {
1643 lame_set_preset(gfp
, MEDIUM_FAST
);
1645 lame_set_preset(gfp
, MEDIUM
);
1651 if (strcmp(preset_name
, "standard") == 0) {
1654 lame_set_preset(gfp
, STANDARD_FAST
);
1656 lame_set_preset(gfp
, STANDARD
);
1661 else if (strcmp(preset_name
, "extreme") == 0){
1664 lame_set_preset(gfp
, EXTREME_FAST
);
1666 lame_set_preset(gfp
, EXTREME
);
1671 else if (((strcmp(preset_name
, "insane") == 0) ||
1672 (strcmp(preset_name
, "320" ) == 0)) && (fast
< 1)) {
1674 lame_set_preset(gfp
, INSANE
);
1679 // Generic ABR Preset
1680 if (((atoi(preset_name
)) > 0) && (fast
< 1)) {
1681 if ((atoi(preset_name
)) >= 8 && (atoi(preset_name
)) <= 320){
1682 lame_set_preset(gfp
, atoi(preset_name
));
1685 lame_set_VBR(gfp
, vbr_off
);
1688 lame_set_mode(gfp
, MONO
);
1695 fprintf(stderr
, "LAME version %s (%s)\n\n", get_lame_version(), get_lame_url());
1696 fprintf(stderr
,"Error: The bitrate specified is out of the valid range for this preset\n"
1698 "When using this mode you must enter a value between \"8\" and \"320\"\n"
1700 "For further information try: \"-lameopts preset=help\"\n"
1708 fprintf(stderr
, "LAME version %s (%s)\n\n", get_lame_version(), get_lame_url());
1709 fprintf(stderr
,"Error: You did not enter a valid profile and/or options with preset\n"
1711 "Available profiles are:\n"
1713 " <fast> standard\n"
1716 " <cbr> (ABR Mode) - The ABR Mode is implied. To use it,\n"
1717 " simply specify a bitrate. For example:\n"
1718 " \"preset=185\" activates this\n"
1719 " preset and uses 185 as an average kbps.\n"
1723 " \"-lameopts fast:preset=standard \"\n"
1724 " or \"-lameopts cbr:preset=192 \"\n"
1725 " or \"-lameopts preset=172 \"\n"
1726 " or \"-lameopts preset=extreme \"\n"
1728 "For further information try: \"-lameopts preset=help\"\n"
1730 mencoder_exit(1, "error parsing cmdline");
1734 #if HAVE_MP3LAME >= 392
1735 /* lame_presets_longinfo_dm
1736 taken out of presets_longinfo_dm in lame-3.93.1/frontend/parse.c and modified */
1737 static void lame_presets_longinfo_dm ( FILE* msgfp
)
1741 "The preset switches are designed to provide the highest possible quality.\n"
1743 "They have for the most part been subject to and tuned via rigorous double blind\n"
1744 "listening tests to verify and achieve this objective.\n"
1746 "These are continually updated to coincide with the latest developments that\n"
1747 "occur and as a result should provide you with nearly the best quality\n"
1748 "currently possible from LAME.\n"
1750 "To activate these presets:\n"
1752 " For VBR modes (generally highest quality):\n"
1754 " \"preset=standard\" This preset should generally be transparent\n"
1755 " to most people on most music and is already\n"
1756 " quite high in quality.\n"
1758 " \"preset=extreme\" If you have extremely good hearing and similar\n"
1759 " equipment, this preset will generally provide\n"
1760 " slightly higher quality than the \"standard\"\n"
1763 " For CBR 320kbps (highest quality possible from the preset switches):\n"
1765 " \"preset=insane\" This preset will usually be overkill for most\n"
1766 " people and most situations, but if you must\n"
1767 " have the absolute highest quality with no\n"
1768 " regard to filesize, this is the way to go.\n"
1770 " For ABR modes (high quality per given bitrate but not as high as VBR):\n"
1772 " \"preset=<kbps>\" Using this preset will usually give you good\n"
1773 " quality at a specified bitrate. Depending on the\n"
1774 " bitrate entered, this preset will determine the\n"
1775 " optimal settings for that particular situation.\n"
1776 " While this approach works, it is not nearly as\n"
1777 " flexible as VBR, and usually will not attain the\n"
1778 " same level of quality as VBR at higher bitrates.\n"
1780 "The following options are also available for the corresponding profiles:\n"
1782 " <fast> standard\n"
1785 " <cbr> (ABR Mode) - The ABR Mode is implied. To use it,\n"
1786 " simply specify a bitrate. For example:\n"
1787 " \"preset=185\" activates this\n"
1788 " preset and uses 185 as an average kbps.\n"
1790 " \"fast\" - Enables the new fast VBR for a particular profile. The\n"
1791 " disadvantage to the speed switch is that often times the\n"
1792 " bitrate will be slightly higher than with the normal mode\n"
1793 " and quality may be slightly lower also.\n"
1794 " Warning: with the current version fast presets might result in too\n"
1795 " high bitrate compared to regular presets.\n"
1797 " \"cbr\" - If you use the ABR mode (read above) with a significant\n"
1798 " bitrate such as 80, 96, 112, 128, 160, 192, 224, 256, 320,\n"
1799 " you can use the \"cbr\" option to force CBR mode encoding\n"
1800 " instead of the standard abr mode. ABR does provide higher\n"
1801 " quality but CBR may be useful in situations such as when\n"
1802 " streaming an mp3 over the internet may be important.\n"
1806 " \"-lameopts fast:preset=standard \"\n"
1807 " or \"-lameopts cbr:preset=192 \"\n"
1808 " or \"-lameopts preset=172 \"\n"
1809 " or \"-lameopts preset=extreme \"\n"
1812 "A few aliases are available for ABR mode:\n"
1813 "phone => 16kbps/mono phon+/lw/mw-eu/sw => 24kbps/mono\n"
1814 "mw-us => 40kbps/mono voice => 56kbps/mono\n"
1815 "fm/radio/tape => 112kbps hifi => 160kbps\n"
1816 "cd => 192kbps studio => 256kbps");
1817 mencoder_exit(0, NULL
);
1821 #ifdef USE_LIBAVCODEC
1822 static uint32_t lavc_find_atag(char *codec
)
1827 if(! strcasecmp(codec
, "mp2"))
1830 if(! strcasecmp(codec
, "mp3"))
1833 if(! strcasecmp(codec
, "ac3"))
1836 if(! strcasecmp(codec
, "adpcm_ima_wav"))
1839 if(! strncasecmp(codec
, "bonk", 4))