Mercurial > mplayer.hg
annotate mencoder.c @ 6110:7bea806b9c5f
Improvment for spu subtitles.
Removed the integreted spudec in vobsub.
Various cleanup/bugfix in vobsub (no more auto palette when a true one is
here)
HW spu rendering moved in spudec because we first need to reassable the
packet before sending them to the hw.
Spudec is now created only if nedded.
author | albeu |
---|---|
date | Fri, 17 May 2002 23:47:27 +0000 |
parents | fa5d0ec52031 |
children | 523014df7d32 |
rev | line source |
---|---|
3384 | 1 #define VCODEC_COPY 0 |
3361
5d70491f438c
new video codec: frameno (just the number of frame - for 3-pass encoding)
arpi
parents:
3357
diff
changeset
|
2 #define VCODEC_FRAMENO 1 |
5553
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
3 // real codecs: |
3361
5d70491f438c
new video codec: frameno (just the number of frame - for 3-pass encoding)
arpi
parents:
3357
diff
changeset
|
4 #define VCODEC_DIVX4 2 |
3504
21fc87d76300
support for RGB/BGR modes (tested with raw and divx4)
alex
parents:
3480
diff
changeset
|
5 #define VCODEC_LIBAVCODEC 4 |
4427
6310422b9557
new video format: yuvrgb. patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4408
diff
changeset
|
6 #define VCODEC_RAWRGB 6 |
4575 | 7 #define VCODEC_VFW 7 |
5578 | 8 #define VCODEC_LIBDV 8 |
3361
5d70491f438c
new video codec: frameno (just the number of frame - for 3-pass encoding)
arpi
parents:
3357
diff
changeset
|
9 |
3385 | 10 #define ACODEC_COPY 0 |
2583 | 11 #define ACODEC_PCM 1 |
12 #define ACODEC_VBRMP3 2 | |
4368 | 13 #define ACODEC_NULL 3 |
2531 | 14 |
15 #include <stdio.h> | |
16 #include <stdlib.h> | |
17 #include <string.h> | |
18 #include <signal.h> | |
5572
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
19 #include <sys/time.h> |
2531 | 20 |
2591 | 21 #include "config.h" |
2531 | 22 #include "mp_msg.h" |
2978 | 23 #include "version.h" |
2531 | 24 #include "help_mp.h" |
25 | |
2978 | 26 static char* banner_text= |
27 "\n\n" | |
4757 | 28 "MEncoder " VERSION "(C) 2000-2002 Arpad Gereoffy (see DOCS!)\n" |
2978 | 29 "\n"; |
30 | |
3323 | 31 #include "cpudetect.h" |
32 | |
2531 | 33 #include "codec-cfg.h" |
4343
b0c8eed7473c
Extended DVD chapter specification. Remove -last-chapter option.
kmkaplan
parents:
4207
diff
changeset
|
34 #include "cfgparser.h" |
2531 | 35 |
36 #include "stream.h" | |
37 #include "demuxer.h" | |
38 #include "stheader.h" | |
4156
22fadd4022b5
playtree-based config patch by Alban Bedel <albeu@free.fr>
arpi
parents:
4088
diff
changeset
|
39 #include "playtree.h" |
2531 | 40 |
41 #include "aviwrite.h" | |
42 | |
43 #include "libvo/video_out.h" | |
44 | |
5607 | 45 #include "libmpcodecs/dec_audio.h" |
46 #include "libmpcodecs/dec_video.h" | |
2574 | 47 |
3357 | 48 #ifdef HAVE_MP3LAME |
2591 | 49 #include <lame/lame.h> |
3357 | 50 #endif |
2583 | 51 |
3521 | 52 #ifdef HAVE_LIBCSS |
53 #include "libmpdemux/dvdauth.h" | |
54 #endif | |
55 | |
3236 | 56 #include <inttypes.h> |
57 | |
3385 | 58 #include "fastmemcpy.h" |
59 | |
4388 | 60 /************************************************************************** |
61 Video accelerated architecture | |
62 **************************************************************************/ | |
5553
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
63 vo_vaa_t vo_vaa; // FIXME! remove me! |
5511 | 64 int vo_doublebuffering=0; |
65 int vo_directrendering=0; | |
66 int vo_config_count=0; | |
4388 | 67 |
2583 | 68 //-------------------------- |
69 | |
2531 | 70 // cache2: |
2618 | 71 static int stream_cache_size=0; |
2531 | 72 #ifdef USE_STREAM_CACHE |
73 extern int cache_fill_status; | |
74 #else | |
75 #define cache_fill_status 0 | |
76 #endif | |
77 | |
2618 | 78 int vcd_track=0; |
79 int audio_id=-1; | |
80 int video_id=-1; | |
81 int dvdsub_id=-1; | |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
5386
diff
changeset
|
82 int vobsub_id=-1; |
5436 | 83 char* audio_lang=NULL; |
84 char* dvdsub_lang=NULL; | |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
5386
diff
changeset
|
85 static char* spudec_ifo=NULL; |
2618 | 86 |
4355 | 87 static int has_audio=1; |
2531 | 88 char *audio_codec=NULL; // override audio codec |
89 char *video_codec=NULL; // override video codec | |
90 int audio_family=-1; // override audio codec family | |
91 int video_family=-1; // override video codec family | |
92 | |
5904 | 93 // libvo opts: (defiend at libmpcodecs/vd.c) |
94 extern int screen_size_xy; | |
95 extern float movie_aspect; | |
96 extern int softzoom; | |
97 extern int flip; | |
98 | |
99 | |
3357 | 100 #ifdef HAVE_MP3LAME |
2661 | 101 int out_audio_codec=ACODEC_VBRMP3; |
3357 | 102 #else |
103 int out_audio_codec=ACODEC_PCM; | |
104 #endif | |
105 | |
4620 | 106 int out_video_codec= |
5995 | 107 #ifdef USE_LIBAVCODEC |
108 VCODEC_LIBAVCODEC; | |
109 #else | |
4620 | 110 #ifdef HAVE_DIVX4ENCORE |
111 VCODEC_DIVX4; | |
112 #else | |
5569 | 113 VCODEC_COPY; |
4620 | 114 #endif |
115 #endif | |
116 | |
2531 | 117 // audio stream skip/resync functions requires only for seeking. |
118 // (they should be implemented in the audio codec layer) | |
119 //void skip_audio_frame(sh_audio_t *sh_audio){} | |
120 //void resync_audio_stream(sh_audio_t *sh_audio){} | |
121 | |
2618 | 122 int verbose=0; // must be global! |
2531 | 123 double video_time_usage=0; |
124 double vout_time_usage=0; | |
4834 | 125 double max_video_time_usage=0; |
126 double max_vout_time_usage=0; | |
4838 | 127 double cur_video_time_usage=0; |
128 double cur_vout_time_usage=0; | |
2531 | 129 static double audio_time_usage=0; |
130 static int total_time_usage_start=0; | |
4844
76acf5bbda78
exclude benchmark stuff execution from normal playback
nick
parents:
4838
diff
changeset
|
131 int benchmark=0; |
2531 | 132 |
2605 | 133 // A-V sync: |
134 int delay_corrected=1; | |
135 static float default_max_pts_correction=-1;//0.01f; | |
136 static float max_pts_correction=0;//default_max_pts_correction; | |
137 static float c_total=0; | |
138 | |
2613 | 139 float force_fps=0; |
140 float force_ofps=0; // set to 24 for inverse telecine | |
5629 | 141 static int skip_limit=-1; |
2531 | 142 |
2618 | 143 int force_srate=0; |
144 | |
2626 | 145 char* out_filename="test.avi"; |
146 | |
3657
af1f8e2d693a
added libavcodec support (mjpeg,h263,rv10,mpeg1 codecs tested&working) and added -ffourcc option (force fourcc in ouput)
alex
parents:
3563
diff
changeset
|
147 char *force_fourcc=NULL; |
af1f8e2d693a
added libavcodec support (mjpeg,h263,rv10,mpeg1 codecs tested&working) and added -ffourcc option (force fourcc in ouput)
alex
parents:
3563
diff
changeset
|
148 |
5553
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
149 int pass=0; |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
150 char* passtmpfile="divx2pass.log"; |
3377
4723f6fd750a
do not fault if 2pass VbrControl can't open the logfile
alex
parents:
3363
diff
changeset
|
151 int pass_working=0; |
2643 | 152 |
153 static int play_n_frames=-1; | |
154 | |
5669
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
155 #include "libvo/font_load.h" |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
156 #include "libvo/sub.h" |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
157 |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
158 // sub: |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
159 char *font_name=NULL; |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
160 float font_factor=0.75; |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
161 char *sub_name=NULL; |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
162 float sub_delay=0; |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
163 float sub_fps=0; |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
164 int sub_auto = 0; |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
165 |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
166 #ifdef USE_SUB |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
167 static subtitle* subtitles=NULL; |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
168 float sub_last_pts = -303; |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
169 #endif |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
170 |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
171 |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
172 |
2661 | 173 //char *out_audio_codec=NULL; // override audio codec |
174 //char *out_video_codec=NULL; // override video codec | |
2626 | 175 |
2591 | 176 //#include "libmpeg2/mpeg2.h" |
177 //#include "libmpeg2/mpeg2_internal.h" | |
178 | |
3357 | 179 #ifdef HAVE_MP3LAME |
2626 | 180 int lame_param_quality=0; // best |
5922
30eea1bd1b64
fixed bogus overloaded "q" parameter for lame mp3 encoding
rfelker
parents:
5904
diff
changeset
|
181 int lame_param_algqual=5; // same as old default |
2626 | 182 int lame_param_vbr=vbr_default; |
183 int lame_param_mode=-1; // unset | |
184 int lame_param_padding=-1; // unset | |
185 int lame_param_br=-1; // unset | |
186 int lame_param_ratio=-1; // unset | |
5848
48a0667742b9
volume setting with lame - patch by silicon@falcon.sch.bme.hu
arpi
parents:
5685
diff
changeset
|
187 float lame_param_scale=-1; // unset |
3357 | 188 #endif |
2626 | 189 |
3236 | 190 static int vo_w=0, vo_h=0; |
5270 | 191 static int input_pitch, input_bpp; |
192 | |
2618 | 193 //-------------------------- config stuff: |
194 | |
4156
22fadd4022b5
playtree-based config patch by Alban Bedel <albeu@free.fr>
arpi
parents:
4088
diff
changeset
|
195 m_config_t* mconfig; |
22fadd4022b5
playtree-based config patch by Alban Bedel <albeu@free.fr>
arpi
parents:
4088
diff
changeset
|
196 |
2618 | 197 static int cfg_inc_verbose(struct config *conf){ ++verbose; return 0;} |
198 | |
199 static int cfg_include(struct config *conf, char *filename){ | |
4156
22fadd4022b5
playtree-based config patch by Alban Bedel <albeu@free.fr>
arpi
parents:
4088
diff
changeset
|
200 return m_config_parse_config_file(mconfig, filename); |
2618 | 201 } |
202 | |
4620 | 203 static char *seek_to_sec=NULL; |
204 static off_t seek_to_byte=0; | |
205 | |
4159
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
206 static int parse_end_at(struct config *conf, const char* param); |
4427
6310422b9557
new video format: yuvrgb. patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4408
diff
changeset
|
207 static uint8_t* flip_upside_down(uint8_t* dst, const uint8_t* src, int width, int height); |
4159
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
208 |
2618 | 209 #include "get_path.c" |
210 | |
211 #include "cfg-mplayer-def.h" | |
212 #include "cfg-mencoder.h" | |
213 | |
4088 | 214 #ifdef USE_DVDREAD |
215 #include "spudec.h" | |
216 #endif | |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
5386
diff
changeset
|
217 #include "vobsub.h" |
4088 | 218 |
4743 | 219 /* FIXME */ |
220 void mencoder_exit(int level, char *how) | |
221 { | |
222 if (how) | |
223 printf("Exiting... (%s)\n", how); | |
224 else | |
225 printf("Exiting...\n"); | |
226 | |
227 exit(level); | |
228 } | |
229 | |
4488 | 230 void parse_cfgfiles( m_config_t* conf ) |
231 { | |
232 char *conffile; | |
233 if ((conffile = get_path("mencoder")) == NULL) { | |
234 mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_GetpathProblem); | |
235 } else { | |
236 if (m_config_parse_config_file(conf, conffile) < 0) | |
4743 | 237 mencoder_exit(1,"configfile error"); |
4488 | 238 free(conffile); |
239 } | |
240 } | |
241 | |
5572
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
242 |
2591 | 243 //--------------------------------------------------------------------------- |
244 | |
245 int dec_audio(sh_audio_t *sh_audio,unsigned char* buffer,int total){ | |
246 int size=0; | |
247 int eof=0; | |
248 while(size<total && !eof){ | |
249 int len=total-size; | |
250 if(len>MAX_OUTBURST) len=MAX_OUTBURST; | |
251 if(len>sh_audio->a_buffer_size) len=sh_audio->a_buffer_size; | |
252 if(len>sh_audio->a_buffer_len){ | |
253 int ret=decode_audio(sh_audio, | |
254 &sh_audio->a_buffer[sh_audio->a_buffer_len], | |
255 len-sh_audio->a_buffer_len, | |
256 sh_audio->a_buffer_size-sh_audio->a_buffer_len); | |
257 if(ret>0) sh_audio->a_buffer_len+=ret; else eof=1; | |
258 } | |
259 if(len>sh_audio->a_buffer_len) len=sh_audio->a_buffer_len; | |
260 memcpy(buffer+size,sh_audio->a_buffer,len); | |
261 sh_audio->a_buffer_len-=len; size+=len; | |
262 if(sh_audio->a_buffer_len>0) | |
263 memcpy(sh_audio->a_buffer,&sh_audio->a_buffer[len],sh_audio->a_buffer_len); | |
264 } | |
265 return size; | |
266 } | |
267 | |
4767 | 268 extern void me_register_options(m_config_t* cfg); |
269 | |
2591 | 270 //--------------------------------------------------------------------------- |
2531 | 271 |
272 static int eof=0; | |
3320
ac8b70dd5e45
use return 1; if interrupted - patch by Artur Skawina <skawina@geocities.com>
arpi
parents:
3240
diff
changeset
|
273 static int interrupted=0; |
2531 | 274 |
4159
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
275 enum end_at_type_t {END_AT_NONE, END_AT_TIME, END_AT_SIZE}; |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
276 static enum end_at_type_t end_at_type = END_AT_NONE; |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
277 static int end_at; |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
278 |
2531 | 279 static void exit_sighandler(int x){ |
280 eof=1; | |
3320
ac8b70dd5e45
use return 1; if interrupted - patch by Artur Skawina <skawina@geocities.com>
arpi
parents:
3240
diff
changeset
|
281 interrupted=1; |
2531 | 282 } |
283 | |
5553
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
284 aviwrite_t* muxer=NULL; |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
285 FILE* muxer_f=NULL; |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
286 |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
287 // callback for ve_*.c: |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
288 void mencoder_write_chunk(aviwrite_stream_t *s,int len,unsigned int flags){ |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
289 aviwrite_write_chunk(muxer,s,muxer_f,len,flags); |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
290 } |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
291 |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
292 |
2618 | 293 int main(int argc,char* argv[], char *envp[]){ |
2531 | 294 |
295 stream_t* stream=NULL; | |
296 demuxer_t* demuxer=NULL; | |
4367
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
297 stream_t* stream2=NULL; |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
298 demuxer_t* demuxer2=NULL; |
2531 | 299 demux_stream_t *d_audio=NULL; |
300 demux_stream_t *d_video=NULL; | |
301 demux_stream_t *d_dvdsub=NULL; | |
302 sh_audio_t *sh_audio=NULL; | |
303 sh_video_t *sh_video=NULL; | |
304 int file_format=DEMUXER_TYPE_UNKNOWN; | |
5149 | 305 int i; |
2531 | 306 |
5572
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
307 uint32_t ptimer_start; |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
308 uint32_t audiorate=0; |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
309 uint32_t videorate=0; |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
310 uint32_t audiosamples=1; |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
311 uint32_t videosamples=1; |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
312 uint32_t skippedframes=0; |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
313 uint32_t duplicatedframes=0; |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
314 |
2531 | 315 aviwrite_stream_t* mux_a=NULL; |
316 aviwrite_stream_t* mux_v=NULL; | |
5572
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
317 off_t muxer_f_size=0; |
2531 | 318 |
3357 | 319 #ifdef HAVE_MP3LAME |
2591 | 320 lame_global_flags *lame; |
3357 | 321 #endif |
2583 | 322 |
2653 | 323 float audio_preload=0.5; |
2581 | 324 |
2613 | 325 double v_pts_corr=0; |
326 double v_timer_corr=0; | |
2605 | 327 |
4156
22fadd4022b5
playtree-based config patch by Alban Bedel <albeu@free.fr>
arpi
parents:
4088
diff
changeset
|
328 play_tree_t* playtree; |
22fadd4022b5
playtree-based config patch by Alban Bedel <albeu@free.fr>
arpi
parents:
4088
diff
changeset
|
329 play_tree_iter_t* playtree_iter; |
2618 | 330 char* filename=NULL; |
4367
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
331 char* frameno_filename="frameno.avi"; |
2618 | 332 |
3361
5d70491f438c
new video codec: frameno (just the number of frame - for 3-pass encoding)
arpi
parents:
3357
diff
changeset
|
333 int decoded_frameno=0; |
4367
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
334 int next_frameno=-1; |
3361
5d70491f438c
new video codec: frameno (just the number of frame - for 3-pass encoding)
arpi
parents:
3357
diff
changeset
|
335 |
4387 | 336 unsigned int timer_start; |
337 | |
5223 | 338 mp_msg_init(); |
339 mp_msg_set_level(MSGL_STATUS); | |
2978 | 340 mp_msg(MSGT_CPLAYER,MSGL_INFO,"%s",banner_text); |
2622 | 341 |
3323 | 342 /* Test for cpu capabilities (and corresponding OS support) for optimizing */ |
343 #ifdef ARCH_X86 | |
344 GetCpuCaps(&gCpuCaps); | |
345 mp_msg(MSGT_CPLAYER,MSGL_INFO,"CPUflags: Type: %d MMX: %d MMX2: %d 3DNow: %d 3DNow2: %d SSE: %d SSE2: %d\n", | |
346 gCpuCaps.cpuType,gCpuCaps.hasMMX,gCpuCaps.hasMMX2, | |
347 gCpuCaps.has3DNow, gCpuCaps.has3DNowExt, | |
348 gCpuCaps.hasSSE, gCpuCaps.hasSSE2); | |
349 #endif | |
350 | |
5889 | 351 // check codec.conf |
352 if(!parse_codec_cfg(get_path("codecs.conf"))){ | |
353 if(!parse_codec_cfg(CONFDIR"/codecs.conf")){ | |
354 mp_msg(MSGT_MENCODER,MSGL_HINT,MSGTR_CopyCodecsConf); | |
355 mencoder_exit(1,NULL); | |
356 } | |
357 } | |
358 | |
5669
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
359 // check font |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
360 #ifdef USE_OSD |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
361 if(font_name){ |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
362 vo_font=read_font_desc(font_name,font_factor,verbose>1); |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
363 if(!vo_font) mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_CantLoadFont,font_name); |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
364 } else { |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
365 // try default: |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
366 vo_font=read_font_desc(get_path("font/font.desc"),font_factor,verbose>1); |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
367 if(!vo_font) |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
368 vo_font=read_font_desc(DATADIR"/font/font.desc",font_factor,verbose>1); |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
369 } |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
370 #endif |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
371 |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
372 vo_init_osd(); |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
373 |
4367
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
374 // FIXME: get rid of -dvd and other tricky options and config/playtree |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
375 stream2=open_stream(frameno_filename,0,&i); |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
376 if(stream2){ |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
377 demuxer2=demux_open(stream2,DEMUXER_TYPE_AVI,-1,-1,-2); |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
378 if(demuxer2) printf("Using pass3 control file: %s\n",frameno_filename); |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
379 } |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
380 |
4156
22fadd4022b5
playtree-based config patch by Alban Bedel <albeu@free.fr>
arpi
parents:
4088
diff
changeset
|
381 playtree = play_tree_new(); |
22fadd4022b5
playtree-based config patch by Alban Bedel <albeu@free.fr>
arpi
parents:
4088
diff
changeset
|
382 mconfig = m_config_new(playtree); |
22fadd4022b5
playtree-based config patch by Alban Bedel <albeu@free.fr>
arpi
parents:
4088
diff
changeset
|
383 m_config_register_options(mconfig,mencoder_opts); |
4767 | 384 me_register_options(mconfig); |
4488 | 385 parse_cfgfiles(mconfig); |
4156
22fadd4022b5
playtree-based config patch by Alban Bedel <albeu@free.fr>
arpi
parents:
4088
diff
changeset
|
386 |
4743 | 387 if(m_config_parse_command_line(mconfig, argc, argv, envp) < 0) mencoder_exit(1, "error parsing cmdline"); |
4156
22fadd4022b5
playtree-based config patch by Alban Bedel <albeu@free.fr>
arpi
parents:
4088
diff
changeset
|
388 playtree = play_tree_cleanup(playtree); |
22fadd4022b5
playtree-based config patch by Alban Bedel <albeu@free.fr>
arpi
parents:
4088
diff
changeset
|
389 if(playtree) { |
22fadd4022b5
playtree-based config patch by Alban Bedel <albeu@free.fr>
arpi
parents:
4088
diff
changeset
|
390 playtree_iter = play_tree_iter_new(playtree,mconfig); |
22fadd4022b5
playtree-based config patch by Alban Bedel <albeu@free.fr>
arpi
parents:
4088
diff
changeset
|
391 if(playtree_iter) { |
22fadd4022b5
playtree-based config patch by Alban Bedel <albeu@free.fr>
arpi
parents:
4088
diff
changeset
|
392 if(play_tree_iter_step(playtree_iter,0,0) != PLAY_TREE_ITER_ENTRY) { |
22fadd4022b5
playtree-based config patch by Alban Bedel <albeu@free.fr>
arpi
parents:
4088
diff
changeset
|
393 play_tree_iter_free(playtree_iter); |
22fadd4022b5
playtree-based config patch by Alban Bedel <albeu@free.fr>
arpi
parents:
4088
diff
changeset
|
394 playtree_iter = NULL; |
22fadd4022b5
playtree-based config patch by Alban Bedel <albeu@free.fr>
arpi
parents:
4088
diff
changeset
|
395 } |
22fadd4022b5
playtree-based config patch by Alban Bedel <albeu@free.fr>
arpi
parents:
4088
diff
changeset
|
396 filename = play_tree_iter_get_file(playtree_iter,1); |
22fadd4022b5
playtree-based config patch by Alban Bedel <albeu@free.fr>
arpi
parents:
4088
diff
changeset
|
397 } |
22fadd4022b5
playtree-based config patch by Alban Bedel <albeu@free.fr>
arpi
parents:
4088
diff
changeset
|
398 } |
22fadd4022b5
playtree-based config patch by Alban Bedel <albeu@free.fr>
arpi
parents:
4088
diff
changeset
|
399 |
22fadd4022b5
playtree-based config patch by Alban Bedel <albeu@free.fr>
arpi
parents:
4088
diff
changeset
|
400 if(!filename && !vcd_track && !dvd_title && !tv_param_on){ |
2618 | 401 printf("\nMissing filename!\n\n"); |
4743 | 402 mencoder_exit(1,NULL); |
2618 | 403 } |
404 | |
5223 | 405 mp_msg_set_level(verbose+MSGL_STATUS); |
2600 | 406 |
2618 | 407 stream=open_stream(filename,vcd_track,&file_format); |
2531 | 408 |
409 if(!stream){ | |
410 printf("Cannot open file/device\n"); | |
4743 | 411 mencoder_exit(1,NULL); |
2531 | 412 } |
413 | |
414 printf("success: format: %d data: 0x%X - 0x%X\n",file_format, (int)(stream->start_pos),(int)(stream->end_pos)); | |
415 | |
5436 | 416 #ifdef USE_DVDREAD |
417 if(stream->type==STREAMTYPE_DVD){ | |
418 if(audio_lang && audio_id==-1) audio_id=dvd_aid_from_lang(stream,audio_lang); | |
419 if(dvdsub_lang && dvdsub_id==-1) dvdsub_id=dvd_sid_from_lang(stream,dvdsub_lang); | |
420 } | |
421 #endif | |
422 | |
5626
b7b40e65c070
-sb option re-added (noticed by Alexandre Oliva <oliva@lsd.ic.unicamp.br>)
arpi
parents:
5607
diff
changeset
|
423 stream->start_pos+=seek_to_byte; |
2531 | 424 |
3979 | 425 #ifdef HAVE_LIBCSS |
426 // current_module="libcss"; | |
427 if (dvdimportkey) { | |
428 if (dvd_import_key(dvdimportkey)) { | |
429 mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_ErrorDVDkey); | |
4743 | 430 mencoder_exit(1,NULL); |
3979 | 431 } |
432 mp_msg(MSGT_CPLAYER,MSGL_INFO,MSGTR_CmdlineDVDkey); | |
433 } | |
434 if (dvd_auth_device) { | |
435 // if (dvd_auth(dvd_auth_device,f)) { | |
436 if (dvd_auth(dvd_auth_device,filename)) { | |
437 mp_msg(MSGT_CPLAYER,MSGL_FATAL,"Error in DVD auth...\n"); | |
4743 | 438 mencoder_exit(1,NULL); |
3979 | 439 } |
440 mp_msg(MSGT_CPLAYER,MSGL_INFO,MSGTR_DVDauthOk); | |
441 } | |
442 #endif | |
443 | |
5626
b7b40e65c070
-sb option re-added (noticed by Alexandre Oliva <oliva@lsd.ic.unicamp.br>)
arpi
parents:
5607
diff
changeset
|
444 if(stream_cache_size) stream_enable_cache(stream,stream_cache_size*1024,0,0); |
b7b40e65c070
-sb option re-added (noticed by Alexandre Oliva <oliva@lsd.ic.unicamp.br>)
arpi
parents:
5607
diff
changeset
|
445 |
4367
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
446 if(!has_audio || demuxer2) audio_id=-2; /* do NOT read audio packets... */ |
4355 | 447 |
2882 | 448 //demuxer=demux_open(stream,file_format,video_id,audio_id,dvdsub_id); |
449 demuxer=demux_open(stream,file_format,audio_id,video_id,dvdsub_id); | |
2531 | 450 if(!demuxer){ |
451 printf("Cannot open demuxer\n"); | |
4743 | 452 mencoder_exit(1,NULL); |
2531 | 453 } |
454 | |
4367
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
455 d_audio=demuxer2 ? demuxer2->audio : demuxer->audio; |
2531 | 456 d_video=demuxer->video; |
457 d_dvdsub=demuxer->sub; | |
458 sh_audio=d_audio->sh; | |
459 sh_video=d_video->sh; | |
460 | |
461 if(!video_read_properties(sh_video)){ | |
462 printf("Couldn't read video properties\n"); | |
4743 | 463 mencoder_exit(1,NULL); |
2531 | 464 } |
465 | |
2622 | 466 mp_msg(MSGT_MENCODER,MSGL_INFO,"[V] filefmt:%d fourcc:0x%X size:%dx%d fps:%5.2f ftime:=%6.4f\n", |
2531 | 467 demuxer->file_format,sh_video->format, sh_video->disp_w,sh_video->disp_h, |
468 sh_video->fps,sh_video->frametime | |
469 ); | |
2581 | 470 |
4620 | 471 if(sh_audio && (out_audio_codec || seek_to_sec || !sh_audio->wf)){ |
2581 | 472 // Go through the codec.conf and find the best codec... |
473 sh_audio->codec=NULL; | |
2622 | 474 if(audio_family!=-1) mp_msg(MSGT_MENCODER,MSGL_INFO,MSGTR_TryForceAudioFmt,audio_family); |
2581 | 475 while(1){ |
476 sh_audio->codec=find_codec(sh_audio->format,NULL,sh_audio->codec,1); | |
477 if(!sh_audio->codec){ | |
478 if(audio_family!=-1) { | |
479 sh_audio->codec=NULL; /* re-search */ | |
2622 | 480 mp_msg(MSGT_MENCODER,MSGL_ERR,MSGTR_CantFindAfmtFallback); |
2581 | 481 audio_family=-1; |
482 continue; | |
483 } | |
2622 | 484 mp_msg(MSGT_MENCODER,MSGL_ERR,MSGTR_CantFindAudioCodec,sh_audio->format); |
485 mp_msg(MSGT_MENCODER,MSGL_HINT, MSGTR_TryUpgradeCodecsConfOrRTFM,get_path("codecs.conf")); | |
2581 | 486 sh_audio=d_audio->sh=NULL; |
487 break; | |
488 } | |
489 if(audio_codec && strcmp(sh_audio->codec->name,audio_codec)) continue; | |
490 else if(audio_family!=-1 && sh_audio->codec->driver!=audio_family) continue; | |
2622 | 491 mp_msg(MSGT_MENCODER,MSGL_INFO,"%s audio codec: [%s] drv:%d (%s)\n",audio_codec?"Forcing":"Detected",sh_audio->codec->name,sh_audio->codec->driver,sh_audio->codec->info); |
2581 | 492 break; |
493 } | |
494 } | |
495 | |
4620 | 496 if(sh_audio && (out_audio_codec || seek_to_sec || !sh_audio->wf)){ |
2622 | 497 mp_msg(MSGT_MENCODER,MSGL_V,"Initializing audio codec...\n"); |
2581 | 498 if(!init_audio(sh_audio)){ |
2622 | 499 mp_msg(MSGT_MENCODER,MSGL_ERR,MSGTR_CouldntInitAudioCodec); |
2581 | 500 sh_audio=d_audio->sh=NULL; |
501 } else { | |
2622 | 502 mp_msg(MSGT_MENCODER,MSGL_INFO,"AUDIO: srate=%d chans=%d bps=%d sfmt=0x%X ratio: %d->%d\n",sh_audio->samplerate,sh_audio->channels,sh_audio->samplesize, |
2581 | 503 sh_audio->sample_format,sh_audio->i_bps,sh_audio->o_bps); |
504 } | |
505 } | |
506 | |
2531 | 507 // set up video encoder: |
508 | |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
5386
diff
changeset
|
509 if (spudec_ifo) { |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
5386
diff
changeset
|
510 unsigned int palette[16], width, height; |
6110 | 511 if (vobsub_parse_ifo(NULL,spudec_ifo, palette, &width, &height, 1) >= 0) |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
5386
diff
changeset
|
512 vo_spudec=spudec_new_scaled(palette, sh_video->disp_w, sh_video->disp_h); |
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
5386
diff
changeset
|
513 } |
5392
d7c586ebbacf
Fix bug noticed by Hajba Szilard in message <20020329151644.A23301@revai.hu>
kmkaplan
parents:
5390
diff
changeset
|
514 #ifdef USE_DVDREAD |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
5386
diff
changeset
|
515 if (vo_spudec==NULL) { |
4557 | 516 vo_spudec=spudec_new_scaled(stream->type==STREAMTYPE_DVD?((dvd_priv_t *)(stream->priv))->cur_pgc->palette:NULL, |
4088 | 517 sh_video->disp_w, sh_video->disp_h); |
5388
3af2729c5c87
* New command line switch for mplayer & mencoder:
kmkaplan
parents:
5386
diff
changeset
|
518 } |
4088 | 519 #endif |
520 | |
5669
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
521 #ifdef USE_SUB |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
522 // after reading video params we should load subtitles because |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
523 // we know fps so now we can adjust subtitles time to ~6 seconds AST |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
524 // check .sub |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
525 // current_module="read_subtitles_file"; |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
526 if(sub_name){ |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
527 subtitles=sub_read_file(sub_name, sh_video->fps); |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
528 if(!subtitles) mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_CantLoadSub,sub_name); |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
529 } else |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
530 if(sub_auto) { // auto load sub file ... |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
531 subtitles=sub_read_file( filename ? sub_filename( get_path("sub/"), filename ) |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
532 : "default.sub", sh_video->fps ); |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
533 } |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
534 #endif |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
535 |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
536 |
2531 | 537 // set up output file: |
2626 | 538 muxer_f=fopen(out_filename,"wb"); |
2887
bc648c6a464a
fixes a segfault if file specified in -o can't be accessed
pl
parents:
2884
diff
changeset
|
539 if(!muxer_f) { |
bc648c6a464a
fixes a segfault if file specified in -o can't be accessed
pl
parents:
2884
diff
changeset
|
540 printf("Cannot open output file '%s'\n", out_filename); |
4743 | 541 mencoder_exit(1,NULL); |
2887
bc648c6a464a
fixes a segfault if file specified in -o can't be accessed
pl
parents:
2884
diff
changeset
|
542 } |
bc648c6a464a
fixes a segfault if file specified in -o can't be accessed
pl
parents:
2884
diff
changeset
|
543 |
2531 | 544 muxer=aviwrite_new_muxer(); |
2581 | 545 |
546 // ============= VIDEO =============== | |
547 | |
2531 | 548 mux_v=aviwrite_new_stream(muxer,AVIWRITE_TYPE_VIDEO); |
549 | |
4575 | 550 mux_v->buffer_size=0x200000; // 2MB |
2531 | 551 mux_v->buffer=malloc(mux_v->buffer_size); |
552 | |
553 mux_v->source=sh_video; | |
554 | |
555 mux_v->h.dwSampleSize=0; // VBR | |
556 mux_v->h.dwScale=10000; | |
2613 | 557 mux_v->h.dwRate=mux_v->h.dwScale*(force_ofps?force_ofps:sh_video->fps); |
2531 | 558 |
2661 | 559 mux_v->codec=out_video_codec; |
2574 | 560 |
5553
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
561 mux_v->bih=NULL; |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
562 sh_video->codec=NULL; |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
563 sh_video->video_out=NULL; |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
564 sh_video->vfilter=NULL; // fixme! |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
565 |
2531 | 566 switch(mux_v->codec){ |
3384 | 567 case VCODEC_COPY: |
568 if (sh_video->bih) | |
569 mux_v->bih=sh_video->bih; | |
570 else | |
571 { | |
572 mux_v->bih=malloc(sizeof(BITMAPINFOHEADER)); | |
573 mux_v->bih->biSize=sizeof(BITMAPINFOHEADER); | |
574 mux_v->bih->biWidth=sh_video->disp_w; | |
575 mux_v->bih->biHeight=sh_video->disp_h; | |
576 mux_v->bih->biCompression=sh_video->format; | |
577 mux_v->bih->biPlanes=1; | |
578 mux_v->bih->biBitCount=24; // FIXME!!! | |
579 mux_v->bih->biSizeImage=mux_v->bih->biWidth*mux_v->bih->biHeight*(mux_v->bih->biBitCount/8); | |
580 } | |
581 printf("videocodec: framecopy (%dx%d %dbpp fourcc=%x)\n", | |
582 mux_v->bih->biWidth, mux_v->bih->biHeight, | |
583 mux_v->bih->biBitCount, mux_v->bih->biCompression); | |
2531 | 584 break; |
3361
5d70491f438c
new video codec: frameno (just the number of frame - for 3-pass encoding)
arpi
parents:
3357
diff
changeset
|
585 case VCODEC_FRAMENO: |
5d70491f438c
new video codec: frameno (just the number of frame - for 3-pass encoding)
arpi
parents:
3357
diff
changeset
|
586 mux_v->bih=malloc(sizeof(BITMAPINFOHEADER)); |
5d70491f438c
new video codec: frameno (just the number of frame - for 3-pass encoding)
arpi
parents:
3357
diff
changeset
|
587 mux_v->bih->biSize=sizeof(BITMAPINFOHEADER); |
5d70491f438c
new video codec: frameno (just the number of frame - for 3-pass encoding)
arpi
parents:
3357
diff
changeset
|
588 mux_v->bih->biWidth=vo_w; |
5d70491f438c
new video codec: frameno (just the number of frame - for 3-pass encoding)
arpi
parents:
3357
diff
changeset
|
589 mux_v->bih->biHeight=vo_h; |
5d70491f438c
new video codec: frameno (just the number of frame - for 3-pass encoding)
arpi
parents:
3357
diff
changeset
|
590 mux_v->bih->biPlanes=1; |
5d70491f438c
new video codec: frameno (just the number of frame - for 3-pass encoding)
arpi
parents:
3357
diff
changeset
|
591 mux_v->bih->biBitCount=24; |
5d70491f438c
new video codec: frameno (just the number of frame - for 3-pass encoding)
arpi
parents:
3357
diff
changeset
|
592 mux_v->bih->biCompression=mmioFOURCC('F','r','N','o'); |
5d70491f438c
new video codec: frameno (just the number of frame - for 3-pass encoding)
arpi
parents:
3357
diff
changeset
|
593 mux_v->bih->biSizeImage=mux_v->bih->biWidth*mux_v->bih->biHeight*(mux_v->bih->biBitCount/8); |
5d70491f438c
new video codec: frameno (just the number of frame - for 3-pass encoding)
arpi
parents:
3357
diff
changeset
|
594 break; |
5553
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
595 default: |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
596 |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
597 switch(mux_v->codec){ |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
598 case VCODEC_DIVX4: |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
599 sh_video->vfilter=vf_open_encoder(NULL,"divx4",mux_v); break; |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
600 case VCODEC_LIBAVCODEC: |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
601 sh_video->vfilter=vf_open_encoder(NULL,"lavc",mux_v); break; |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
602 case VCODEC_RAWRGB: |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
603 sh_video->vfilter=vf_open_encoder(NULL,"rawrgb",mux_v); break; |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
604 case VCODEC_VFW: |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
605 sh_video->vfilter=vf_open_encoder(NULL,"vfw",mux_v); break; |
5578 | 606 case VCODEC_LIBDV: |
607 sh_video->vfilter=vf_open_encoder(NULL,"libdv",mux_v); break; | |
4743 | 608 } |
5553
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
609 if(!mux_v->bih || !sh_video->vfilter){ |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
610 mp_msg(MSGT_MENCODER,MSGL_FATAL,"Failed to open the encoder\n"); |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
611 mencoder_exit(1,NULL); |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
612 } |
5669
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
613 // append 'expand' filter, it fixes stride problems and renders osd: |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
614 sh_video->vfilter=vf_open_filter(sh_video->vfilter,"expand","-1:-1:-1:-1:1"); |
5553
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
615 sh_video->vfilter=append_filters(sh_video->vfilter); |
3377
4723f6fd750a
do not fault if 2pass VbrControl can't open the logfile
alex
parents:
3363
diff
changeset
|
616 |
5553
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
617 mp_msg(MSGT_CPLAYER,MSGL_INFO,"==========================================================================\n"); |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
618 // Go through the codec.conf and find the best codec... |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
619 sh_video->inited=0; |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
620 codecs_reset_selection(0); |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
621 if(video_codec){ |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
622 // forced codec by name: |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
623 mp_msg(MSGT_CPLAYER,MSGL_INFO,"Forced video codec: %s\n",video_codec); |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
624 init_video(sh_video,video_codec,-1,-1); |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
625 } else { |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
626 int status; |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
627 // try in stability order: UNTESTED, WORKING, BUGGY, BROKEN |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
628 if(video_family>=0) mp_msg(MSGT_CPLAYER,MSGL_INFO,MSGTR_TryForceVideoFmt,video_family); |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
629 for(status=CODECS_STATUS__MAX;status>=CODECS_STATUS__MIN;--status){ |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
630 if(video_family>=0) // try first the preferred codec family: |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
631 if(init_video(sh_video,NULL,video_family,status)) break; |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
632 if(init_video(sh_video,NULL,-1,status)) break; |
4365
9e20866c3250
added better fourcc handling for lavc, exiting if no lavc video codec name specified
alex
parents:
4355
diff
changeset
|
633 } |
5553
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
634 } |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
635 if(!sh_video->inited){ |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
636 mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_CantFindVideoCodec,sh_video->format); |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
637 mp_msg(MSGT_CPLAYER,MSGL_HINT, MSGTR_TryUpgradeCodecsConfOrRTFM,get_path("codecs.conf")); |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
638 mencoder_exit(1,NULL); |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
639 } |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
640 mp_msg(MSGT_CPLAYER,MSGL_INFO,"%s video codec: [%s] drv:%d prio:%d (%s)\n", |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
641 video_codec?mp_gettext("Forcing"):mp_gettext("Detected"),sh_video->codec->name,sh_video->codec->driver,sh_video->codec->priority!=-1?sh_video->codec->priority:0,sh_video->codec->info); |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
642 mp_msg(MSGT_CPLAYER,MSGL_INFO,"==========================================================================\n"); |
3657
af1f8e2d693a
added libavcodec support (mjpeg,h263,rv10,mpeg1 codecs tested&working) and added -ffourcc option (force fourcc in ouput)
alex
parents:
3563
diff
changeset
|
643 |
af1f8e2d693a
added libavcodec support (mjpeg,h263,rv10,mpeg1 codecs tested&working) and added -ffourcc option (force fourcc in ouput)
alex
parents:
3563
diff
changeset
|
644 } |
af1f8e2d693a
added libavcodec support (mjpeg,h263,rv10,mpeg1 codecs tested&working) and added -ffourcc option (force fourcc in ouput)
alex
parents:
3563
diff
changeset
|
645 |
af1f8e2d693a
added libavcodec support (mjpeg,h263,rv10,mpeg1 codecs tested&working) and added -ffourcc option (force fourcc in ouput)
alex
parents:
3563
diff
changeset
|
646 /* force output fourcc to .. */ |
4365
9e20866c3250
added better fourcc handling for lavc, exiting if no lavc video codec name specified
alex
parents:
4355
diff
changeset
|
647 if ((force_fourcc != NULL) && (strlen(force_fourcc) >= 4)) |
3657
af1f8e2d693a
added libavcodec support (mjpeg,h263,rv10,mpeg1 codecs tested&working) and added -ffourcc option (force fourcc in ouput)
alex
parents:
3563
diff
changeset
|
648 { |
af1f8e2d693a
added libavcodec support (mjpeg,h263,rv10,mpeg1 codecs tested&working) and added -ffourcc option (force fourcc in ouput)
alex
parents:
3563
diff
changeset
|
649 mux_v->bih->biCompression = mmioFOURCC(force_fourcc[0], force_fourcc[1], |
af1f8e2d693a
added libavcodec support (mjpeg,h263,rv10,mpeg1 codecs tested&working) and added -ffourcc option (force fourcc in ouput)
alex
parents:
3563
diff
changeset
|
650 force_fourcc[2], force_fourcc[3]); |
af1f8e2d693a
added libavcodec support (mjpeg,h263,rv10,mpeg1 codecs tested&working) and added -ffourcc option (force fourcc in ouput)
alex
parents:
3563
diff
changeset
|
651 printf("Forcing output fourcc to %x [%.4s]\n", |
4365
9e20866c3250
added better fourcc handling for lavc, exiting if no lavc video codec name specified
alex
parents:
4355
diff
changeset
|
652 mux_v->bih->biCompression, (char *)&mux_v->bih->biCompression); |
2531 | 653 } |
654 | |
4370 | 655 if(demuxer->file_format!=DEMUXER_TYPE_AVI) pts_from_bps=0; // it must be 0 for mpeg/asf! |
656 | |
2581 | 657 // ============= AUDIO =============== |
658 if(sh_audio){ | |
659 | |
660 mux_a=aviwrite_new_stream(muxer,AVIWRITE_TYPE_AUDIO); | |
661 | |
662 mux_a->buffer_size=0x100000; //16384; | |
663 mux_a->buffer=malloc(mux_a->buffer_size); | |
664 | |
665 mux_a->source=sh_audio; | |
666 | |
2661 | 667 mux_a->codec=out_audio_codec; |
2581 | 668 |
669 switch(mux_a->codec){ | |
3385 | 670 case ACODEC_COPY: |
4369 | 671 if (sh_audio->wf){ |
3385 | 672 mux_a->wf=sh_audio->wf; |
4370 | 673 if(!sh_audio->i_bps) sh_audio->i_bps=mux_a->wf->nAvgBytesPerSec; |
4369 | 674 } else { |
3385 | 675 mux_a->wf = malloc(sizeof(WAVEFORMATEX)); |
4370 | 676 mux_a->wf->nBlockAlign = 1; //mux_a->h.dwSampleSize; |
4369 | 677 mux_a->wf->wFormatTag = sh_audio->format; |
3385 | 678 mux_a->wf->nChannels = sh_audio->channels; |
679 mux_a->wf->nSamplesPerSec = sh_audio->samplerate; | |
4369 | 680 mux_a->wf->nAvgBytesPerSec=sh_audio->i_bps; //mux_a->h.dwSampleSize*mux_a->wf->nSamplesPerSec; |
3480 | 681 mux_a->wf->wBitsPerSample = 16; // FIXME |
3385 | 682 mux_a->wf->cbSize=0; // FIXME for l3codeca.acm |
683 } | |
4370 | 684 if(sh_audio->audio.dwScale){ |
685 mux_a->h.dwSampleSize=sh_audio->audio.dwSampleSize; | |
686 mux_a->h.dwScale=sh_audio->audio.dwScale; | |
687 mux_a->h.dwRate=sh_audio->audio.dwRate; | |
688 } else { | |
689 mux_a->h.dwSampleSize=mux_a->wf->nBlockAlign; | |
690 mux_a->h.dwScale=mux_a->h.dwSampleSize; | |
691 mux_a->h.dwRate=mux_a->wf->nAvgBytesPerSec; | |
692 } | |
693 printf("audiocodec: framecopy (format=%x chans=%d rate=%d bits=%d bps=%d sample=%d)\n", | |
3385 | 694 mux_a->wf->wFormatTag, mux_a->wf->nChannels, mux_a->wf->nSamplesPerSec, |
4370 | 695 mux_a->wf->wBitsPerSample, mux_a->wf->nAvgBytesPerSec, mux_a->h.dwSampleSize); |
2581 | 696 break; |
2583 | 697 case ACODEC_PCM: |
698 printf("CBR PCM audio selected\n"); | |
699 mux_a->h.dwSampleSize=2*sh_audio->channels; | |
700 mux_a->h.dwScale=1; | |
701 mux_a->h.dwRate=sh_audio->samplerate; | |
702 mux_a->wf=malloc(sizeof(WAVEFORMATEX)); | |
703 mux_a->wf->nBlockAlign=mux_a->h.dwSampleSize; | |
704 mux_a->wf->wFormatTag=0x1; // PCM | |
705 mux_a->wf->nChannels=sh_audio->channels; | |
706 mux_a->wf->nSamplesPerSec=sh_audio->samplerate; | |
707 mux_a->wf->nAvgBytesPerSec=mux_a->h.dwSampleSize*mux_a->wf->nSamplesPerSec; | |
708 mux_a->wf->wBitsPerSample=16; | |
709 mux_a->wf->cbSize=0; // FIXME for l3codeca.acm | |
710 break; | |
2581 | 711 case ACODEC_VBRMP3: |
3385 | 712 printf("MP3 audio selected\n"); |
2581 | 713 mux_a->h.dwSampleSize=0; // VBR |
5685 | 714 mux_a->h.dwRate=force_srate?force_srate:sh_audio->samplerate; |
715 mux_a->h.dwScale=(mux_a->h.dwRate<32000)?576:1152; // samples/frame | |
2635
c1e24e01601b
fixed AVI header creation - now should be compatible with NaNdub
arpi
parents:
2627
diff
changeset
|
716 if(sizeof(MPEGLAYER3WAVEFORMAT)!=30) mp_msg(MSGT_MENCODER,MSGL_WARN,"sizeof(MPEGLAYER3WAVEFORMAT)==%d!=30, maybe broken C compiler?\n",sizeof(MPEGLAYER3WAVEFORMAT)); |
c1e24e01601b
fixed AVI header creation - now should be compatible with NaNdub
arpi
parents:
2627
diff
changeset
|
717 mux_a->wf=malloc(sizeof(MPEGLAYER3WAVEFORMAT)); // should be 30 |
2581 | 718 mux_a->wf->wFormatTag=0x55; // MP3 |
719 mux_a->wf->nChannels=sh_audio->channels; | |
2639 | 720 mux_a->wf->nSamplesPerSec=force_srate?force_srate:sh_audio->samplerate; |
2635
c1e24e01601b
fixed AVI header creation - now should be compatible with NaNdub
arpi
parents:
2627
diff
changeset
|
721 mux_a->wf->nAvgBytesPerSec=192000/8; // FIXME! |
5685 | 722 mux_a->wf->nBlockAlign=(mux_a->h.dwRate<32000)?576:1152; // requires for l3codeca.acm + WMP 6.4 |
2635
c1e24e01601b
fixed AVI header creation - now should be compatible with NaNdub
arpi
parents:
2627
diff
changeset
|
723 mux_a->wf->wBitsPerSample=0; //16; |
c1e24e01601b
fixed AVI header creation - now should be compatible with NaNdub
arpi
parents:
2627
diff
changeset
|
724 // from NaNdub: (requires for l3codeca.acm) |
c1e24e01601b
fixed AVI header creation - now should be compatible with NaNdub
arpi
parents:
2627
diff
changeset
|
725 mux_a->wf->cbSize=12; |
c1e24e01601b
fixed AVI header creation - now should be compatible with NaNdub
arpi
parents:
2627
diff
changeset
|
726 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->wID=1; |
c1e24e01601b
fixed AVI header creation - now should be compatible with NaNdub
arpi
parents:
2627
diff
changeset
|
727 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->fdwFlags=2; |
5685 | 728 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->nBlockSize=(mux_a->h.dwRate<32000)?576:1152; // ??? |
2635
c1e24e01601b
fixed AVI header creation - now should be compatible with NaNdub
arpi
parents:
2627
diff
changeset
|
729 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->nFramesPerBlock=1; |
c1e24e01601b
fixed AVI header creation - now should be compatible with NaNdub
arpi
parents:
2627
diff
changeset
|
730 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->nCodecDelay=0; |
2581 | 731 break; |
732 } | |
733 } | |
734 | |
2840
808fe0767cf8
fix typos - patch by Colin Marquardt <colin@marquardt-home.de>
pl
parents:
2825
diff
changeset
|
735 printf("Writing AVI header...\n"); |
2531 | 736 aviwrite_write_header(muxer,muxer_f); |
737 | |
5553
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
738 decoded_frameno=0; |
2531 | 739 |
2600 | 740 if(sh_audio) |
2583 | 741 switch(mux_a->codec){ |
3357 | 742 #ifdef HAVE_MP3LAME |
2583 | 743 case ACODEC_VBRMP3: |
744 | |
745 lame=lame_init(); | |
2591 | 746 lame_set_bWriteVbrTag(lame,0); |
2583 | 747 lame_set_in_samplerate(lame,sh_audio->samplerate); |
748 lame_set_num_channels(lame,mux_a->wf->nChannels); | |
2639 | 749 lame_set_out_samplerate(lame,mux_a->wf->nSamplesPerSec); |
5922
30eea1bd1b64
fixed bogus overloaded "q" parameter for lame mp3 encoding
rfelker
parents:
5904
diff
changeset
|
750 lame_set_quality(lame,lame_param_algqual); // 0 = best q |
2626 | 751 if(lame_param_vbr){ // VBR: |
752 lame_set_VBR(lame,lame_param_vbr); // vbr mode | |
753 lame_set_VBR_q(lame,lame_param_quality+1); // 1 = best vbr q 6=~128k | |
754 if(lame_param_br>0) lame_set_VBR_mean_bitrate_kbps(lame,lame_param_br); | |
755 } else { // CBR: | |
756 if(lame_param_br>0) lame_set_brate(lame,lame_param_br); | |
757 } | |
758 if(lame_param_mode>=0) lame_set_mode(lame,lame_param_mode); // j-st | |
759 if(lame_param_ratio>0) lame_set_compression_ratio(lame,lame_param_ratio); | |
5848
48a0667742b9
volume setting with lame - patch by silicon@falcon.sch.bme.hu
arpi
parents:
5685
diff
changeset
|
760 if(lame_param_scale>0) { |
48a0667742b9
volume setting with lame - patch by silicon@falcon.sch.bme.hu
arpi
parents:
5685
diff
changeset
|
761 printf("Setting audio input gain to %f\n", lame_param_scale); |
48a0667742b9
volume setting with lame - patch by silicon@falcon.sch.bme.hu
arpi
parents:
5685
diff
changeset
|
762 lame_set_scale(lame,lame_param_scale); |
48a0667742b9
volume setting with lame - patch by silicon@falcon.sch.bme.hu
arpi
parents:
5685
diff
changeset
|
763 } |
2583 | 764 lame_init_params(lame); |
2622 | 765 if(verbose){ |
2626 | 766 lame_print_config(lame); |
767 lame_print_internals(lame); | |
2622 | 768 } |
3357 | 769 break; |
770 #endif | |
2583 | 771 } |
772 | |
2531 | 773 signal(SIGINT,exit_sighandler); // Interrupt from keyboard |
774 signal(SIGQUIT,exit_sighandler); // Quit from keyboard | |
775 signal(SIGTERM,exit_sighandler); // kill | |
776 | |
4387 | 777 timer_start=GetTimerMS(); |
778 | |
4620 | 779 if (seek_to_sec) { |
780 int a,b; float d; | |
781 | |
782 if (sscanf(seek_to_sec, "%d:%d:%f", &a,&b,&d)==3) | |
783 d += 3600*a + 60*b; | |
784 else if (sscanf(seek_to_sec, "%d:%f", &a, &d)==2) | |
785 d += 60*a; | |
786 else | |
787 sscanf(seek_to_sec, "%f", &d); | |
788 | |
789 demux_seek(demuxer, d, 1); | |
790 } | |
791 | |
5572
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
792 if(tv_param_on == 1) |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
793 { |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
794 fprintf(stderr,"Forcing audio preload to 0, max pts correction to 0\n"); |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
795 audio_preload = 0.0; |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
796 default_max_pts_correction = 0; |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
797 } |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
798 |
2531 | 799 while(!eof){ |
800 | |
2571 | 801 float frame_time=0; |
2531 | 802 int blit_frame=0; |
803 float a_pts=0; | |
804 float v_pts=0; | |
2574 | 805 unsigned char* start=NULL; |
806 int in_size; | |
2613 | 807 int skip_flag=0; // 1=skip -1=duplicate |
2531 | 808 |
5572
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
809 if((end_at_type == END_AT_SIZE && end_at <= ftello(muxer_f)) || |
4159
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
810 (end_at_type == END_AT_TIME && end_at < sh_video->timer)) |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
811 break; |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
812 |
2643 | 813 if(play_n_frames>=0){ |
814 --play_n_frames; | |
815 if(play_n_frames<0) break; | |
816 } | |
817 | |
2581 | 818 if(sh_audio){ |
819 // get audio: | |
2583 | 820 while(mux_a->timer-audio_preload<mux_v->timer){ |
2653 | 821 int len=0; |
5572
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
822 |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
823 ptimer_start = GetTimerMS(); |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
824 |
2581 | 825 if(mux_a->h.dwSampleSize){ |
2605 | 826 // CBR - copy 0.5 sec of audio |
2583 | 827 switch(mux_a->codec){ |
3385 | 828 case ACODEC_COPY: // copy |
4370 | 829 len=mux_a->wf->nAvgBytesPerSec/2; |
2583 | 830 len/=mux_a->h.dwSampleSize;if(len<1) len=1; |
831 len*=mux_a->h.dwSampleSize; | |
832 len=demux_read_data(sh_audio->ds,mux_a->buffer,len); | |
833 break; | |
834 case ACODEC_PCM: | |
835 len=mux_a->h.dwSampleSize*(mux_a->h.dwRate/2); | |
2591 | 836 len=dec_audio(sh_audio,mux_a->buffer,len); |
2583 | 837 break; |
838 } | |
2581 | 839 } else { |
2605 | 840 // VBR - encode/copy an audio frame |
841 switch(mux_a->codec){ | |
3385 | 842 case ACODEC_COPY: // copy |
4367
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
843 len=ds_get_packet(sh_audio->ds,(unsigned char**) &mux_a->buffer); |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
844 // printf("VBR audio framecopy not yet implemented!\n"); |
2605 | 845 break; |
3357 | 846 #ifdef HAVE_MP3LAME |
2605 | 847 case ACODEC_VBRMP3: |
2591 | 848 while(mux_a->buffer_len<4){ |
849 unsigned char tmp[2304]; | |
850 int len=dec_audio(sh_audio,tmp,2304); | |
851 if(len<=0) break; // eof | |
852 len=lame_encode_buffer_interleaved(lame, | |
853 tmp,len/4, | |
854 mux_a->buffer+mux_a->buffer_len,mux_a->buffer_size-mux_a->buffer_len); | |
855 if(len<0) break; // error | |
856 mux_a->buffer_len+=len; | |
857 } | |
858 if(mux_a->buffer_len<4) break; | |
859 len=mp_decode_mp3_header(mux_a->buffer); | |
2639 | 860 //printf("%d\n",len); |
2591 | 861 if(len<=0) break; // bad frame! |
5685 | 862 // printf("[%d]\n",mp_mp3_get_lsf(mux_a->buffer)); |
2591 | 863 while(mux_a->buffer_len<len){ |
864 unsigned char tmp[2304]; | |
865 int len=dec_audio(sh_audio,tmp,2304); | |
866 if(len<=0) break; // eof | |
867 len=lame_encode_buffer_interleaved(lame, | |
868 tmp,len/4, | |
869 mux_a->buffer+mux_a->buffer_len,mux_a->buffer_size-mux_a->buffer_len); | |
870 if(len<0) break; // error | |
871 mux_a->buffer_len+=len; | |
872 } | |
2605 | 873 break; |
3357 | 874 #endif |
2605 | 875 } |
2581 | 876 } |
2583 | 877 if(len<=0) break; // EOF? |
878 aviwrite_write_chunk(muxer,mux_a,muxer_f,len,0); | |
2655 | 879 if(!mux_a->h.dwSampleSize && mux_a->timer>0) |
3354 | 880 mux_a->wf->nAvgBytesPerSec=0.5f+(double)mux_a->size/mux_a->timer; // avg bps (VBR) |
2591 | 881 if(mux_a->buffer_len>=len){ |
882 mux_a->buffer_len-=len; | |
883 memcpy(mux_a->buffer,mux_a->buffer+len,mux_a->buffer_len); | |
884 } | |
5572
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
885 |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
886 |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
887 audiosamples++; |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
888 audiorate+= (GetTimerMS() - ptimer_start); |
2581 | 889 } |
890 } | |
891 | |
892 // get video frame! | |
5572
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
893 |
2581 | 894 in_size=video_read_frame(sh_video,&frame_time,&start,force_fps); |
895 if(in_size<0){ eof=1; break; } | |
3361
5d70491f438c
new video codec: frameno (just the number of frame - for 3-pass encoding)
arpi
parents:
3357
diff
changeset
|
896 sh_video->timer+=frame_time; ++decoded_frameno; |
5572
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
897 |
2613 | 898 v_timer_corr-=frame_time-(float)mux_v->h.dwScale/mux_v->h.dwRate; |
2531 | 899 |
5553
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
900 if(demuxer2){ // 3-pass encoding, read control file (frameno.avi) |
4367
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
901 // find our frame: |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
902 while(next_frameno<decoded_frameno){ |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
903 int* start; |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
904 int len=ds_get_packet(demuxer2->video,(unsigned char**) &start); |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
905 if(len<0){ eof=1;break;} |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
906 if(len==0) --skip_flag; else // duplicate |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
907 if(len==4) next_frameno=start[0]; |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
908 } |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
909 if(eof) break; |
5572
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
910 // if(skip_flag) printf("!!!!!!!!!!!!\n"); |
4367
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
911 skip_flag=next_frameno-decoded_frameno; |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
912 // find next frame: |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
913 while(next_frameno<=decoded_frameno){ |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
914 int* start; |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
915 int len=ds_get_packet(demuxer2->video,(unsigned char**) &start); |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
916 if(len<0){ eof=1;break;} |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
917 if(len==0) --skip_flag; else // duplicate |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
918 if(len==4) next_frameno=start[0]; |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
919 } |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
920 // if(eof) break; |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
921 // printf("Current fno=%d requested=%d skip=%d \n",decoded_frameno,fno,skip_flag); |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
922 } else { |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
923 |
2613 | 924 // check frame duplicate/drop: |
925 | |
5629 | 926 if(v_timer_corr>=(float)mux_v->h.dwScale/mux_v->h.dwRate && |
927 (skip_limit<0 || skip_flag<skip_limit) ){ | |
2613 | 928 v_timer_corr-=(float)mux_v->h.dwScale/mux_v->h.dwRate; |
929 ++skip_flag; // skip | |
930 } else | |
5629 | 931 while(v_timer_corr<=-(float)mux_v->h.dwScale/mux_v->h.dwRate && |
932 (skip_limit<0 || (-skip_flag)<skip_limit) ){ | |
2613 | 933 v_timer_corr+=(float)mux_v->h.dwScale/mux_v->h.dwRate; |
934 --skip_flag; // dup | |
935 } | |
2531 | 936 |
2613 | 937 while( (v_pts_corr<=-(float)mux_v->h.dwScale/mux_v->h.dwRate && skip_flag>0) |
938 || (v_pts_corr<=-2*(float)mux_v->h.dwScale/mux_v->h.dwRate) ){ | |
939 v_pts_corr+=(float)mux_v->h.dwScale/mux_v->h.dwRate; | |
940 --skip_flag; // dup | |
941 } | |
942 if( (v_pts_corr>=(float)mux_v->h.dwScale/mux_v->h.dwRate && skip_flag<0) | |
943 || (v_pts_corr>=2*(float)mux_v->h.dwScale/mux_v->h.dwRate) ) | |
944 if(skip_flag<=0){ // we can't skip more than 1 frame now | |
945 v_pts_corr-=(float)mux_v->h.dwScale/mux_v->h.dwRate; | |
946 ++skip_flag; // skip | |
947 } | |
948 | |
4367
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
949 } // demuxer2 |
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
950 |
5572
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
951 ptimer_start = GetTimerMS(); |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
952 |
2531 | 953 switch(mux_v->codec){ |
3384 | 954 case VCODEC_COPY: |
2574 | 955 mux_v->buffer=start; |
2639 | 956 if(skip_flag<=0) aviwrite_write_chunk(muxer,mux_v,muxer_f,in_size,(sh_video->ds->flags&1)?0x10:0); |
2574 | 957 break; |
5553
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
958 case VCODEC_FRAMENO: |
3361
5d70491f438c
new video codec: frameno (just the number of frame - for 3-pass encoding)
arpi
parents:
3357
diff
changeset
|
959 mux_v->buffer=&decoded_frameno; // tricky |
3363
1459912caea5
set all frames to keyframes for -ovc frameno - allow seeking in resulting audio-only avi
arpi
parents:
3362
diff
changeset
|
960 if(skip_flag<=0) aviwrite_write_chunk(muxer,mux_v,muxer_f,sizeof(int),0x10); |
4575 | 961 break; |
5553
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
962 default: |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
963 // decode_video will callback down to ve_*.c encoders, through the video filters |
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
964 blit_frame=decode_video(sh_video,start,in_size,(skip_flag>0)?1:0); |
2639 | 965 if(skip_flag>0) break; |
5553
38697931adf4
video codecs moved to libmpencoders, crop/scale removed, use -vop for that
arpi
parents:
5546
diff
changeset
|
966 if(!blit_frame) aviwrite_write_chunk(muxer,mux_v,muxer_f,0,0); // empty. |
2531 | 967 } |
2613 | 968 |
5572
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
969 videosamples++; |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
970 videorate+=(GetTimerMS() - ptimer_start); |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
971 |
2613 | 972 if(skip_flag<0){ |
2605 | 973 // duplicate frame |
5572
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
974 if(!tv_param_on && !verbose) printf("\nduplicate %d frame(s)!!! \n",-skip_flag); |
2613 | 975 while(skip_flag<0){ |
5572
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
976 duplicatedframes++; |
2613 | 977 aviwrite_write_chunk(muxer,mux_v,muxer_f,0,0); |
978 ++skip_flag; | |
979 } | |
2639 | 980 } else |
981 if(skip_flag>0){ | |
2605 | 982 // skip frame |
5572
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
983 if(!tv_param_on && !verbose) printf("\nskip frame!!! \n"); |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
984 skippedframes++; |
2613 | 985 --skip_flag; |
2605 | 986 } |
987 | |
4367
c2be4fb65cee
3-pass encoding support (reads frame skip/dup control and audio stream from frameno.avi)
arpi
parents:
4365
diff
changeset
|
988 if(sh_audio && !demuxer2){ |
2605 | 989 float AV_delay,x; |
990 // A-V sync! | |
991 if(pts_from_bps){ | |
992 unsigned int samples=(sh_audio->audio.dwSampleSize)? | |
993 ((ds_tell(d_audio)-sh_audio->a_in_buffer_len)/sh_audio->audio.dwSampleSize) : | |
994 (d_audio->pack_no); // <- used for VBR audio | |
4378 | 995 // printf("samples=%d \n",samples); |
2605 | 996 a_pts=samples*(float)sh_audio->audio.dwScale/(float)sh_audio->audio.dwRate; |
997 delay_corrected=1; | |
998 } else { | |
999 // PTS = (last timestamp) + (bytes after last timestamp)/(bytes per sec) | |
1000 a_pts=d_audio->pts; | |
1001 if(!delay_corrected) if(a_pts) delay_corrected=1; | |
1002 //printf("*** %5.3f ***\n",a_pts); | |
1003 a_pts+=(ds_tell_pts(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps; | |
1004 } | |
1005 v_pts=d_video->pts; | |
1006 // av = compensated (with out buffering delay) A-V diff | |
2613 | 1007 AV_delay=(a_pts-v_pts); AV_delay-=mux_a->timer-(mux_v->timer-(v_timer_corr+v_pts_corr)); |
2605 | 1008 // compensate input video timer by av: |
1009 x=AV_delay*0.1f; | |
1010 if(x<-max_pts_correction) x=-max_pts_correction; else | |
1011 if(x> max_pts_correction) x= max_pts_correction; | |
1012 if(default_max_pts_correction>=0) | |
1013 max_pts_correction=default_max_pts_correction; | |
1014 else | |
1015 max_pts_correction=sh_video->frametime*0.10; // +-10% of time | |
1016 // sh_video->timer-=x; | |
1017 c_total+=x; | |
2613 | 1018 v_pts_corr+=x; |
4387 | 1019 } |
2605 | 1020 |
4387 | 1021 // printf("A:%6.1f V:%6.1f A-V:%7.3f oAV:%7.3f diff:%7.3f ct:%7.3f vpc:%7.3f \r", |
1022 // a_pts,v_pts,a_pts-v_pts, | |
1023 // (float)(mux_a->timer-mux_v->timer), | |
1024 // AV_delay, c_total, v_pts_corr ); | |
1025 // printf("V:%6.1f \r", d_video->pts ); | |
2605 | 1026 |
1027 #if 0 | |
1028 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", | |
1029 a_pts,v_pts,a_pts-v_pts,c_total, | |
1030 (int)sh_video->num_frames,(int)sh_video->num_frames_decoded, | |
1031 (sh_video->timer>0.5)?(int)(100.0*video_time_usage/(double)sh_video->timer):0, | |
1032 (sh_video->timer>0.5)?(int)(100.0*vout_time_usage/(double)sh_video->timer):0, | |
1033 (sh_video->timer>0.5)?(100.0*audio_time_usage/(double)sh_video->timer):0 | |
1034 ,cache_fill_status | |
1035 ); | |
1036 #endif | |
1037 | |
4387 | 1038 { float t=(GetTimerMS()-timer_start)*0.001f; |
1039 float len=(demuxer->movi_end-demuxer->movi_start); | |
1040 float p=len>1000 ? (float)(demuxer->filepos-demuxer->movi_start) / len : 0; | |
4393 | 1041 if(!len && sh_audio && sh_audio->audio.dwLength>100){ |
1042 p=(sh_audio->audio.dwSampleSize? ds_tell(sh_audio->ds)/sh_audio->audio.dwSampleSize : sh_audio->ds->pack_no) | |
1043 / (float)(sh_audio->audio.dwLength); | |
1044 } | |
4392
b50b2b0c65ea
status print fixes - DVD estimation worx, print remaining time instead of total
arpi
parents:
4388
diff
changeset
|
1045 #if 0 |
b50b2b0c65ea
status print fixes - DVD estimation worx, print remaining time instead of total
arpi
parents:
4388
diff
changeset
|
1046 mp_msg(MSGT_AVSYNC,MSGL_STATUS,"%d < %d < %d \r", |
b50b2b0c65ea
status print fixes - DVD estimation worx, print remaining time instead of total
arpi
parents:
4388
diff
changeset
|
1047 (int)demuxer->movi_start, |
b50b2b0c65ea
status print fixes - DVD estimation worx, print remaining time instead of total
arpi
parents:
4388
diff
changeset
|
1048 (int)demuxer->filepos, |
b50b2b0c65ea
status print fixes - DVD estimation worx, print remaining time instead of total
arpi
parents:
4388
diff
changeset
|
1049 (int)demuxer->movi_end); |
b50b2b0c65ea
status print fixes - DVD estimation worx, print remaining time instead of total
arpi
parents:
4388
diff
changeset
|
1050 #else |
5572
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
1051 if(verbose) { |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
1052 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/S %d/%d \r", |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
1053 mux_v->timer, decoded_frameno, (int)(p*100), |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
1054 (t>1) ? (int)(decoded_frameno/t) : 0, |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
1055 (p>0.001) ? (int)((t/p-t)/60) : 0, |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
1056 (p>0.001) ? (int)(ftello(muxer_f)/p/1024/1024) : 0, |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
1057 v_pts_corr, |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
1058 (mux_v->timer>1) ? (int)(mux_v->size/mux_v->timer/125) : 0, |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
1059 (mux_a && mux_a->timer>1) ? (int)(mux_a->size/mux_a->timer/125) : 0, |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
1060 audiorate/audiosamples, videorate/videosamples, |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
1061 duplicatedframes, skippedframes |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
1062 ); |
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
1063 } else |
4394 | 1064 mp_msg(MSGT_AVSYNC,MSGL_STATUS,"Pos:%6.1fs %6df (%2d%%) %3dfps Trem:%4dmin %3dmb A-V:%5.3f [%d:%d]\r", |
4387 | 1065 mux_v->timer, decoded_frameno, (int)(p*100), |
1066 (t>1) ? (int)(decoded_frameno/t) : 0, | |
4392
b50b2b0c65ea
status print fixes - DVD estimation worx, print remaining time instead of total
arpi
parents:
4388
diff
changeset
|
1067 (p>0.001) ? (int)((t/p-t)/60) : 0, |
4387 | 1068 (p>0.001) ? (int)(ftell(muxer_f)/p/1024/1024) : 0, |
4394 | 1069 v_pts_corr, |
1070 (mux_v->timer>1) ? (int)(mux_v->size/mux_v->timer/125) : 0, | |
4427
6310422b9557
new video format: yuvrgb. patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4408
diff
changeset
|
1071 (mux_a && mux_a->timer>1) ? (int)(mux_a->size/mux_a->timer/125) : 0 |
4387 | 1072 ); |
4392
b50b2b0c65ea
status print fixes - DVD estimation worx, print remaining time instead of total
arpi
parents:
4388
diff
changeset
|
1073 #endif |
4387 | 1074 } |
2605 | 1075 fflush(stdout); |
1076 | |
5669
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
1077 #ifdef USE_SUB |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
1078 // find sub |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
1079 if(subtitles && d_video->pts>0){ |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
1080 float pts=d_video->pts; |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
1081 if(sub_fps==0) sub_fps=sh_video->fps; |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
1082 if (pts > sub_last_pts || pts < sub_last_pts-1.0 ) { |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
1083 find_sub(subtitles,sub_uses_time?(100*(pts+sub_delay)):((pts+sub_delay)*sub_fps)); // FIXME! frame counter... |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
1084 sub_last_pts = pts; |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
1085 } |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
1086 } |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
1087 #endif |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
1088 |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
1089 #ifdef USE_DVDREAD |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
1090 // DVD sub: |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
1091 if(vo_spudec){ |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
1092 unsigned char* packet=NULL; |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
1093 int len; |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
1094 while((len=ds_get_packet_sub(d_dvdsub,&packet))>0){ |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
1095 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); |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
1096 spudec_assemble(vo_spudec,packet,len,90000*d_dvdsub->pts); |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
1097 } |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
1098 spudec_heartbeat(vo_spudec,90000*d_video->pts); |
5670 | 1099 vo_osd_changed(OSDTYPE_SPU); |
5669
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
1100 } |
391931fa79a6
enabled new OSD code in -vop expand, subtitles rendering support to mencoder
arpi
parents:
5629
diff
changeset
|
1101 #endif |
2531 | 1102 |
1103 | |
1104 } // while(!eof) | |
1105 | |
3357 | 1106 #ifdef HAVE_MP3LAME |
1107 // fixup CBR mp3 audio header: | |
3354 | 1108 if(sh_audio && mux_a->codec==ACODEC_VBRMP3 && !lame_param_vbr){ |
1109 mux_a->h.dwSampleSize=1; | |
5673 | 1110 ((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->nBlockSize= |
1111 (mux_a->size+(mux_a->h.dwLength>>1))/mux_a->h.dwLength; | |
1112 mux_a->h.dwLength=mux_a->size; | |
3354 | 1113 mux_a->h.dwRate=mux_a->wf->nAvgBytesPerSec; |
1114 mux_a->h.dwScale=1; | |
5673 | 1115 mux_a->wf->nBlockAlign=1; |
1116 printf("\n\nCBR audio: %d bytes/sec, %d bytes/block\n", | |
1117 mux_a->h.dwRate,((MPEGLAYER3WAVEFORMAT*)(mux_a->wf))->nBlockSize); | |
3354 | 1118 } |
3357 | 1119 #endif |
3354 | 1120 |
2840
808fe0767cf8
fix typos - patch by Colin Marquardt <colin@marquardt-home.de>
pl
parents:
2825
diff
changeset
|
1121 printf("\nWriting AVI index...\n"); |
2531 | 1122 aviwrite_write_index(muxer,muxer_f); |
5572
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
1123 muxer_f_size=ftello(muxer_f); |
2622 | 1124 printf("Fixup AVI header...\n"); |
2531 | 1125 fseek(muxer_f,0,SEEK_SET); |
1126 aviwrite_write_header(muxer,muxer_f); // update header | |
4377 | 1127 fclose(muxer_f); |
4368 | 1128 |
1129 if(out_video_codec==VCODEC_FRAMENO && mux_v->timer>100){ | |
4392
b50b2b0c65ea
status print fixes - DVD estimation worx, print remaining time instead of total
arpi
parents:
4388
diff
changeset
|
1130 printf("Recommended video bitrate for 650MB CD: %d\n",(int)((650*1024*1024-muxer_f_size)/mux_v->timer/125)); |
b50b2b0c65ea
status print fixes - DVD estimation worx, print remaining time instead of total
arpi
parents:
4388
diff
changeset
|
1131 printf("Recommended video bitrate for 700MB CD: %d\n",(int)((700*1024*1024-muxer_f_size)/mux_v->timer/125)); |
b50b2b0c65ea
status print fixes - DVD estimation worx, print remaining time instead of total
arpi
parents:
4388
diff
changeset
|
1132 printf("Recommended video bitrate for 800MB CD: %d\n",(int)((800*1024*1024-muxer_f_size)/mux_v->timer/125)); |
4368 | 1133 } |
1134 | |
4355 | 1135 printf("\nVideo stream: %8.3f kbit/s (%d bps) size: %d bytes %5.3f secs %d frames\n", |
5572
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
1136 (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); |
3361
5d70491f438c
new video codec: frameno (just the number of frame - for 3-pass encoding)
arpi
parents:
3357
diff
changeset
|
1137 if(sh_audio) |
5d70491f438c
new video codec: frameno (just the number of frame - for 3-pass encoding)
arpi
parents:
3357
diff
changeset
|
1138 printf("\nAudio stream: %8.3f kbit/s (%d bps) size: %d bytes %5.3f secs\n", |
5572
8cd761968f35
BSD-BT848 TV update patch by Charles Henrich <henrich@sigbus.com>
arpi
parents:
5569
diff
changeset
|
1139 (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); |
3361
5d70491f438c
new video codec: frameno (just the number of frame - for 3-pass encoding)
arpi
parents:
3357
diff
changeset
|
1140 |
2618 | 1141 if(stream) free_stream(stream); // kill cache thread |
1142 | |
3320
ac8b70dd5e45
use return 1; if interrupted - patch by Artur Skawina <skawina@geocities.com>
arpi
parents:
3240
diff
changeset
|
1143 return interrupted; |
2531 | 1144 } |
4159
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1145 |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1146 static int parse_end_at(struct config *conf, const char* param) |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1147 { |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1148 int i; |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1149 |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1150 end_at_type = END_AT_NONE; |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1151 |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1152 /* End at size parsing */ |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1153 { |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1154 char unit[4]; |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1155 |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1156 end_at_type = END_AT_SIZE; |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1157 |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1158 if(sscanf(param, "%d%3s", &end_at, unit) == 2) { |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1159 if(!strcasecmp(unit, "b")) |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1160 ; |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1161 else if(!strcasecmp(unit, "kb")) |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1162 end_at *= 1024; |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1163 else if(!strcasecmp(unit, "mb")) |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1164 end_at *= 1024*1024; |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1165 else |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1166 end_at_type = END_AT_NONE; |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1167 } |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1168 else |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1169 end_at_type = END_AT_NONE; |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1170 } |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1171 |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1172 /* End at time parsing. This has to be last because of |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1173 * sscanf("%f", ...) below */ |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1174 if(end_at_type == END_AT_NONE) |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1175 { |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1176 int a,b; float d; |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1177 |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1178 end_at_type = END_AT_TIME; |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1179 |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1180 if (sscanf(param, "%d:%d:%f", &a, &b, &d) == 3) |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1181 end_at = 3600*a + 60*b + d; |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1182 else if (sscanf(param, "%d:%f", &a, &d) == 2) |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1183 end_at = 60*a + d; |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1184 else if (sscanf(param, "%f", &d) == 1) |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1185 end_at = d; |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1186 else |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1187 end_at_type = END_AT_NONE; |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1188 } |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1189 |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1190 if(end_at_type == END_AT_NONE) |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1191 return ERR_FUNC_ERR; |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1192 |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1193 return 1; |
42fec596fe7c
-endpos option, patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4156
diff
changeset
|
1194 } |
4427
6310422b9557
new video format: yuvrgb. patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4408
diff
changeset
|
1195 |
6310422b9557
new video format: yuvrgb. patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4408
diff
changeset
|
1196 /* Flip the image in src and store the result in dst. src and dst may overlap. |
6310422b9557
new video format: yuvrgb. patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4408
diff
changeset
|
1197 width is the size of each line in bytes. */ |
6310422b9557
new video format: yuvrgb. patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4408
diff
changeset
|
1198 static uint8_t* flip_upside_down(uint8_t* dst, const uint8_t* src, int width, |
6310422b9557
new video format: yuvrgb. patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4408
diff
changeset
|
1199 int height) |
6310422b9557
new video format: yuvrgb. patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4408
diff
changeset
|
1200 { |
6310422b9557
new video format: yuvrgb. patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4408
diff
changeset
|
1201 uint8_t* tmp = malloc(width); |
6310422b9557
new video format: yuvrgb. patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4408
diff
changeset
|
1202 int i; |
6310422b9557
new video format: yuvrgb. patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4408
diff
changeset
|
1203 |
6310422b9557
new video format: yuvrgb. patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4408
diff
changeset
|
1204 for(i = 0; i < height/2; i++) { |
6310422b9557
new video format: yuvrgb. patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4408
diff
changeset
|
1205 memcpy(tmp, &src[i*width], width); |
6310422b9557
new video format: yuvrgb. patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4408
diff
changeset
|
1206 memcpy(&dst[i * width], &src[(height - i) * width], width); |
6310422b9557
new video format: yuvrgb. patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4408
diff
changeset
|
1207 memcpy(&dst[(height - i) * width], tmp, width); |
6310422b9557
new video format: yuvrgb. patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4408
diff
changeset
|
1208 } |
6310422b9557
new video format: yuvrgb. patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4408
diff
changeset
|
1209 |
6310422b9557
new video format: yuvrgb. patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4408
diff
changeset
|
1210 free(tmp); |
6310422b9557
new video format: yuvrgb. patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4408
diff
changeset
|
1211 return dst; |
6310422b9557
new video format: yuvrgb. patch by Fredrik Kuivinen <freku045@student.liu.se>
arpi
parents:
4408
diff
changeset
|
1212 } |
5270 | 1213 |