2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								/*
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  avconv  main 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Copyright  ( c )  2000 - 2011  The  libav  developers . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  This  file  is  part  of  Libav . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Libav  is  free  software ;  you  can  redistribute  it  and / or 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  modify  it  under  the  terms  of  the  GNU  Lesser  General  Public 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  License  as  published  by  the  Free  Software  Foundation ;  either 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  version  2.1  of  the  License ,  or  ( at  your  option )  any  later  version . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Libav  is  distributed  in  the  hope  that  it  will  be  useful , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  but  WITHOUT  ANY  WARRANTY ;  without  even  the  implied  warranty  of 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  MERCHANTABILITY  or  FITNESS  FOR  A  PARTICULAR  PURPOSE .   See  the  GNU 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Lesser  General  Public  License  for  more  details . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  You  should  have  received  a  copy  of  the  GNU  Lesser  General  Public 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  License  along  with  Libav ;  if  not ,  write  to  the  Free  Software 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Foundation ,  Inc . ,  51  Franklin  Street ,  Fifth  Floor ,  Boston ,  MA  02110 - 1301  USA 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "config.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <ctype.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <string.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <math.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <stdlib.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <errno.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <signal.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <limits.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <unistd.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "libavformat/avformat.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "libavdevice/avdevice.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "libswscale/swscale.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "libavutil/opt.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "libavcodec/audioconvert.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "libavutil/audioconvert.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "libavutil/parseutils.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "libavutil/samplefmt.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "libavutil/colorspace.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "libavutil/fifo.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "libavutil/intreadwrite.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "libavutil/dict.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "libavutil/mathematics.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "libavutil/pixdesc.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "libavutil/avstring.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "libavutil/libm.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "libavformat/os_support.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# if CONFIG_AVFILTER 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#  include "libavfilter / avfilter.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#  include "libavfilter / avfiltergraph.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#  include "libavfilter / vsrc_buffer.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# if HAVE_SYS_RESOURCE_H 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <sys/types.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <sys/time.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <sys/resource.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# elif HAVE_GETPROCESSTIMES 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <windows.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# if HAVE_GETPROCESSMEMORYINFO 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <windows.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <psapi.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# if HAVE_SYS_SELECT_H 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <sys/select.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <time.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "cmdutils.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "libavutil/avassert.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const  char  program_name [ ]  =  " avconv " ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const  int  program_birth_year  =  2000 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* select an input stream for an output stream */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								typedef  struct  StreamMap  {  
						 
					
						
							
								
									
										
										
										
											2011-07-29 15:21:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int  disabled ;            /** 1 is this mapping is disabled by a negative map */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    int  file_index ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  stream_index ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  sync_file_index ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  sync_stream_index ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  StreamMap ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  select  an  input  file  for  an  output  file 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								typedef  struct  MetadataMap  {  
						 
					
						
							
								
									
										
										
										
											2011-08-05 13:15:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int   file ;       ///< file index
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    char  type ;       ///< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int   index ;      ///< stream/chapter/program number
 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  MetadataMap ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  const  OptionDef  options [ ] ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  video_discard  =  0 ;  
						 
					
						
							
								
									
										
										
										
											2011-08-09 11:32:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  same_quant  =  0 ;  
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								static  int  do_deinterlace  =  0 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  intra_dc_precision  =  8 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  qp_hist  =  0 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  file_overwrite  =  0 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  do_benchmark  =  0 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  do_hex_dump  =  0 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  do_pkt_dump  =  0 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  do_pass  =  0 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  char  * pass_logfilename_prefix  =  NULL ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  video_sync_method =  - 1 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  audio_sync_method =  0 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  float  audio_drift_threshold =  0.1 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  copy_ts =  0 ;  
						 
					
						
							
								
									
										
										
										
											2011-11-29 11:10:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  copy_tb  =  1 ;  
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								static  int  opt_shortest  =  0 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  char  * vstats_filename ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  FILE  * vstats_file ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  audio_volume  =  256 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  exit_on_error  =  0 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  using_stdin  =  0 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int64_t  video_size  =  0 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int64_t  audio_size  =  0 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int64_t  extra_size  =  0 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  nb_frames_dup  =  0 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  nb_frames_drop  =  0 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  input_sync ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  float  dts_delta_threshold  =  10 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-09 15:57:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  print_stats  =  1 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								static  uint8_t  * audio_buf ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  uint8_t  * audio_out ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  unsigned  int  allocated_audio_out_size ,  allocated_audio_buf_size ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-27 10:21:39 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  * samples ;  
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 18:40:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								typedef  struct  InputStream  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  file_index ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVStream  * st ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  discard ;              /* true if stream data should be discarded */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  decoding_needed ;      /* true if the packets must be decoded in 'raw_fifo' */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVCodec  * dec ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int64_t        start ;      /* time when read started */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int64_t        next_pts ;   /* synthetic pts for cases where pkt.pts
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                is  not  defined  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int64_t        pts ;        /* current pts */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    PtsCorrectionContext  pts_ctx ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    double  ts_scale ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  is_start ;             /* is 1 at the start and after a discontinuity */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  showed_multi_packet_warning ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVDictionary  * opts ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  InputStream ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								typedef  struct  InputFile  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVFormatContext  * ctx ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  eof_reached ;       /* true if eof reached */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  ist_index ;         /* index of first stream in ist_table */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  buffer_size ;       /* current total buffer size */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int64_t  ts_offset ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 12:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int  nb_streams ;        /* number of stream that avconv is aware of; may be different
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                             from  ctx . nb_streams  if  new  streams  appear  during  av_read_frame ( )  */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int  rate_emu ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 18:40:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  InputFile ;  
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								typedef  struct  OutputStream  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  file_index ;           /* file index */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  index ;                /* stream index in the output file */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  source_index ;         /* InputStream index */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVStream  * st ;             /* stream in the output file */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  encoding_needed ;      /* true if encoding needed for this stream */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  frame_number ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* input pts and corresponding output pts
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								       for  A / V  sync  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    //double sync_ipts;        /* dts from the AVPacket of the demuxer in second units */
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    struct  InputStream  * sync_ist ;  /* input stream to sync against */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int64_t  sync_opts ;        /* output frame counter, could be changed to some true timestamp */  //FIXME look at frame_number
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVBitStreamFilterContext  * bitstream_filters ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVCodec  * enc ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int64_t  max_frames ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* video only */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  video_resample ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVFrame  pict_tmp ;       /* temporary image for resampling */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    struct  SwsContext  * img_resample_ctx ;  /* for image resampling */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  resample_height ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  resample_width ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  resample_pix_fmt ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVRational  frame_rate ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int  force_fps ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-02 18:03:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int  top_field_first ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    float  frame_aspect_ratio ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* forced key frames */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int64_t  * forced_kf_pts ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  forced_kf_count ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  forced_kf_index ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* audio only */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  audio_resample ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ReSampleContext  * resample ;  /* for audio resampling */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  resample_sample_fmt ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  resample_channels ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  resample_sample_rate ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  reformat_pair ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVAudioConvert  * reformat_ctx ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVFifoBuffer  * fifo ;      /* for compression: one audio fifo per codec */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    FILE  * logfile ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# if CONFIG_AVFILTER 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVFilterContext  * output_video_filter ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVFilterContext  * input_video_filter ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVFilterBufferRef  * picref ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    char  * avfilter ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVFilterGraph  * graph ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 10:27:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int64_t  sws_flags ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVDictionary  * opts ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  is_past_recording_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  stream_copy ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  char  * attachment_filename ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  copy_initial_nonkeyframes ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  OutputStream ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 09:56:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								typedef  struct  OutputFile  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVFormatContext  * ctx ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVDictionary  * opts ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 10:21:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int  ost_index ;        /* index of the first stream in output_streams */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 11:42:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int64_t  recording_time ;  /* desired length of the resulting file in microseconds */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 11:42:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int64_t  start_time ;      /* start time in microseconds */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-19 17:52:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    uint64_t  limit_filesize ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 09:56:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  OutputFile ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								static  InputStream  * input_streams  =  NULL ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int          nb_input_streams  =  0 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  InputFile    * input_files    =  NULL ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int          nb_input_files    =  0 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 10:21:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  OutputStream  * output_streams  =  NULL ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int         nb_output_streams  =  0 ;  
						 
					
						
							
								
									
										
										
										
											2011-08-17 09:56:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  OutputFile    * output_files    =  NULL ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int         nb_output_files    =  0 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 17:21:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								typedef  struct  OptionsContext  {  
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    /* input/output options */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int64_t  start_time ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    const  char  * format ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    SpecifierOpt  * codec_names ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int         nb_codec_names ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    SpecifierOpt  * audio_channels ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int         nb_audio_channels ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    SpecifierOpt  * audio_sample_rate ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int         nb_audio_sample_rate ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    SpecifierOpt  * frame_rates ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int         nb_frame_rates ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    SpecifierOpt  * frame_sizes ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int         nb_frame_sizes ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    SpecifierOpt  * frame_pix_fmts ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int         nb_frame_pix_fmts ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    /* input options */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int64_t  input_ts_offset ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int  rate_emu ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    SpecifierOpt  * ts_scale ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int         nb_ts_scale ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-02 21:50:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    SpecifierOpt  * dump_attachment ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int         nb_dump_attachment ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 17:21:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    /* output options */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    StreamMap  * stream_maps ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int      nb_stream_maps ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    /* first item specifies output metadata, second is input */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    MetadataMap  ( * meta_data_maps ) [ 2 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  nb_meta_data_maps ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  metadata_global_manual ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  metadata_streams_manual ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  metadata_chapters_manual ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-30 07:10:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    const  char  * * attachments ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int        nb_attachments ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int  chapters_input_file ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int64_t  recording_time ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    uint64_t  limit_filesize ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:51:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    float  mux_preload ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    float  mux_max_delay ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:51:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int  video_disable ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  audio_disable ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  subtitle_disable ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  data_disable ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-02 22:07:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    /* indexed by output file stream index */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int    * streamid_map ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  nb_streamid_map ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    SpecifierOpt  * metadata ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int         nb_metadata ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    SpecifierOpt  * max_frames ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int         nb_max_frames ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:45:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    SpecifierOpt  * bitstream_filters ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int         nb_bitstream_filters ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:51:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    SpecifierOpt  * codec_tags ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int         nb_codec_tags ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:51:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    SpecifierOpt  * sample_fmts ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int         nb_sample_fmts ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 10:04:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    SpecifierOpt  * qscale ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int         nb_qscale ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    SpecifierOpt  * forced_key_frames ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int         nb_forced_key_frames ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    SpecifierOpt  * force_fps ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int         nb_force_fps ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    SpecifierOpt  * frame_aspect_ratios ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int         nb_frame_aspect_ratios ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-02 16:06:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    SpecifierOpt  * rc_overrides ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int         nb_rc_overrides ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-02 17:57:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    SpecifierOpt  * intra_matrices ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int         nb_intra_matrices ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    SpecifierOpt  * inter_matrices ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int         nb_inter_matrices ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-02 18:03:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    SpecifierOpt  * top_field_first ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int         nb_top_field_first ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-10 11:52:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    SpecifierOpt  * presets ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int         nb_presets ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 10:26:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    SpecifierOpt  * copy_initial_nonkeyframes ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int         nb_copy_initial_nonkeyframes ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-02 21:11:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# if CONFIG_AVFILTER 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    SpecifierOpt  * filters ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int         nb_filters ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2011-08-28 17:21:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  OptionsContext ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\ 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{ \ 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  i ,  ret ; \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  o - > nb_  # #  name ;  i + + )  { \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        char  * spec  =  o - > name [ i ] . specifier ; \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ( ret  =  check_stream_specifier ( fmtctx ,  st ,  spec ) )  >  0 ) \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            outvar  =  o - > name [ i ] . u . type ; \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else  if  ( ret  <  0 ) \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 17:21:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  reset_options ( OptionsContext  * o )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  OptionDef  * po  =  options ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* all OPT_SPEC and OPT_STRING can be freed in generic way */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    while  ( po - > name )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        void  * dst  =  ( uint8_t * ) o  +  po - > u . off ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( po - > flags  &  OPT_SPEC )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            SpecifierOpt  * * so  =  dst ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            int  i ,  * count  =  ( int * ) ( so  +  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  ( i  =  0 ;  i  <  * count ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                av_freep ( & ( * so ) [ i ] . specifier ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( po - > flags  &  OPT_STRING ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    av_freep ( & ( * so ) [ i ] . u . str ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            av_freep ( so ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            * count  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }  else  if  ( po - > flags  &  OPT_OFFSET  & &  po - > flags  &  OPT_STRING ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            av_freep ( dst ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        po + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    av_freep ( & o - > stream_maps ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    av_freep ( & o - > meta_data_maps ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-02 22:07:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    av_freep ( & o - > streamid_map ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 17:21:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    memset ( o ,  0 ,  sizeof ( * o ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:51:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    o - > mux_max_delay   =  0.7 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    o - > recording_time  =  INT64_MAX ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    o - > limit_filesize  =  UINT64_MAX ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    o - > chapters_input_file  =  INT_MAX ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 17:21:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    uninit_opts ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    init_opts ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# if CONFIG_AVFILTER 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  configure_video_filters ( InputStream  * ist ,  OutputStream  * ost )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVFilterContext  * last_filter ,  * filter ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /** filter graph containing all filters including input & output */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVCodecContext  * codec  =  ost - > st - > codec ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVCodecContext  * icodec  =  ist - > st - > codec ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    FFSinkContext  ffsink_ctx  =  {  . pix_fmt  =  codec - > pix_fmt  } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVRational  sample_aspect_ratio ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    char  args [ 255 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ost - > graph  =  avfilter_graph_alloc ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ist - > st - > sample_aspect_ratio . num ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        sample_aspect_ratio  =  ist - > st - > sample_aspect_ratio ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        sample_aspect_ratio  =  ist - > st - > codec - > sample_aspect_ratio ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    snprintf ( args ,  255 ,  " %d:%d:%d:%d:%d:%d:%d " ,  ist - > st - > codec - > width , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								             ist - > st - > codec - > height ,  ist - > st - > codec - > pix_fmt ,  1 ,  AV_TIME_BASE , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								             sample_aspect_ratio . num ,  sample_aspect_ratio . den ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret  =  avfilter_graph_create_filter ( & ost - > input_video_filter ,  avfilter_get_by_name ( " buffer " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                       " src " ,  args ,  NULL ,  ost - > graph ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ret  <  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret  =  avfilter_graph_create_filter ( & ost - > output_video_filter ,  & ffsink , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                       " out " ,  NULL ,  & ffsink_ctx ,  ost - > graph ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ret  <  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    last_filter  =  ost - > input_video_filter ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( codec - > width   ! =  icodec - > width  | |  codec - > height  ! =  icodec - > height )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        snprintf ( args ,  255 ,  " %d:%d:flags=0x%X " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                 codec - > width , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                 codec - > height , 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-03 21:10:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                 ( unsigned ) ost - > sws_flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  ( ( ret  =  avfilter_graph_create_filter ( & filter ,  avfilter_get_by_name ( " scale " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                NULL ,  args ,  NULL ,  ost - > graph ) )  <  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ( ret  =  avfilter_link ( last_filter ,  0 ,  filter ,  0 ) )  <  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        last_filter  =  filter ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-03 21:10:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    snprintf ( args ,  sizeof ( args ) ,  " flags=0x%X " ,  ( unsigned ) ost - > sws_flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    ost - > graph - > scale_sws_opts  =  av_strdup ( args ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ost - > avfilter )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        AVFilterInOut  * outputs  =  av_malloc ( sizeof ( AVFilterInOut ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        AVFilterInOut  * inputs   =  av_malloc ( sizeof ( AVFilterInOut ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        outputs - > name     =  av_strdup ( " in " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        outputs - > filter_ctx  =  last_filter ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        outputs - > pad_idx  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        outputs - > next     =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        inputs - > name     =  av_strdup ( " out " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        inputs - > filter_ctx  =  ost - > output_video_filter ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        inputs - > pad_idx  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        inputs - > next     =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ( ret  =  avfilter_graph_parse ( ost - > graph ,  ost - > avfilter ,  inputs ,  outputs ,  NULL ) )  <  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_freep ( & ost - > avfilter ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ( ret  =  avfilter_link ( last_filter ,  0 ,  ost - > output_video_filter ,  0 ) )  <  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ( ret  =  avfilter_graph_config ( ost - > graph ,  NULL ) )  <  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    codec - > width   =  ost - > output_video_filter - > inputs [ 0 ] - > w ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    codec - > height  =  ost - > output_video_filter - > inputs [ 0 ] - > h ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    codec - > sample_aspect_ratio  =  ost - > st - > sample_aspect_ratio  = 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-18 12:09:17 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ost - > frame_aspect_ratio  ?  // overridden by the -aspect cli option
 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        av_d2q ( ost - > frame_aspect_ratio * codec - > height / codec - > width ,  255 )  : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost - > output_video_filter - > inputs [ 0 ] - > sample_aspect_ratio ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif  /* CONFIG_AVFILTER */ 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  term_exit ( void )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    av_log ( NULL ,  AV_LOG_QUIET ,  " " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  volatile  int  received_sigterm  =  0 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  volatile  int  received_nb_signals  =  0 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								sigterm_handler ( int  sig )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    received_sigterm  =  sig ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    received_nb_signals + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    term_exit ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  term_init ( void )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    signal ( SIGINT  ,  sigterm_handler ) ;  /* Interrupt (ANSI).  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    signal ( SIGTERM ,  sigterm_handler ) ;  /* Termination (ANSI).  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ifdef SIGXCPU 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    signal ( SIGXCPU ,  sigterm_handler ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 23:22:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  decode_interrupt_cb ( void  * ctx )  
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  received_nb_signals  >  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 23:22:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  const  AVIOInterruptCB  int_cb  =  {  decode_interrupt_cb ,  NULL  } ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 07:03:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  exit_program ( int  ret )  
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* close files */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for ( i = 0 ; i < nb_output_files ; i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 09:56:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        AVFormatContext  * s  =  output_files [ i ] . ctx ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  ( ! ( s - > oformat - > flags  &  AVFMT_NOFILE )  & &  s - > pb ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            avio_close ( s - > pb ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        avformat_free_context ( s ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 09:56:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        av_dict_free ( & output_files [ i ] . opts ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for ( i = 0 ; i < nb_input_files ; i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_close_input_file ( input_files [ i ] . ctx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  nb_input_streams ;  i + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_dict_free ( & input_streams [ i ] . opts ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( vstats_file ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        fclose ( vstats_file ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    av_free ( vstats_filename ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    av_freep ( & input_streams ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    av_freep ( & input_files ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 10:21:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    av_freep ( & output_streams ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 09:56:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    av_freep ( & output_files ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    uninit_opts ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    av_free ( audio_buf ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    av_free ( audio_out ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    allocated_audio_buf_size =  allocated_audio_out_size =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    av_free ( samples ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# if CONFIG_AVFILTER 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    avfilter_uninit ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2011-11-06 02:47:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    avformat_network_deinit ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( received_sigterm )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_INFO ,  " Received signal %d: terminating. \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								               ( int )  received_sigterm ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        exit  ( 255 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    exit ( ret ) ;  /* not all OS-es handle main() return value */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  assert_avoptions ( AVDictionary  * m )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVDictionaryEntry  * t ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ( t  =  av_dict_get ( m ,  " " ,  NULL ,  AV_DICT_IGNORE_SUFFIX ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-12 21:51:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_FATAL ,  " Option %s not found. \n " ,  t - > key ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  assert_codec_experimental ( AVCodecContext  * c ,  int  encoder )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  char  * codec_string  =  encoder  ?  " encoder "  :  " decoder " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVCodec  * codec ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( c - > codec - > capabilities  &  CODEC_CAP_EXPERIMENTAL  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        c - > strict_std_compliance  >  FF_COMPLIANCE_EXPERIMENTAL )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-12 21:51:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_FATAL ,  " %s '%s' is experimental and might produce bad  " 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                " results. \n Add '-strict experimental' if you want to use it. \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                codec_string ,  c - > codec - > name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        codec  =  encoder  ?  avcodec_find_encoder ( c - > codec - > id )  :  avcodec_find_decoder ( c - > codec - > id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! ( codec - > capabilities  &  CODEC_CAP_EXPERIMENTAL ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-12 21:51:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_FATAL ,  " Or use the non experimental %s '%s'. \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                   codec_string ,  codec - > name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  choose_sample_fmt ( AVStream  * st ,  AVCodec  * codec )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if ( codec  & &  codec - > sample_fmts ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        const  enum  AVSampleFormat  * p =  codec - > sample_fmts ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for ( ;  * p ! = - 1 ;  p + + ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if ( * p  = =  st - > codec - > sample_fmt ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( * p  = =  - 1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_WARNING , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                   " Incompatible sample format '%s' for codec '%s', auto-selecting format '%s' \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                   av_get_sample_fmt_name ( st - > codec - > sample_fmt ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                   codec - > name , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                   av_get_sample_fmt_name ( codec - > sample_fmts [ 0 ] ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            st - > codec - > sample_fmt  =  codec - > sample_fmts [ 0 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Update  the  requested  input  sample  format  based  on  the  output  sample  format . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  This  is  currently  only  used  to  request  float  output  from  decoders  which 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  support  multiple  sample  formats ,  one  of  which  is  AV_SAMPLE_FMT_FLT . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Ideally  this  will  be  removed  in  the  future  when  decoders  do  not  do  format 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  conversion  and  only  output  in  their  native  format . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  update_sample_fmt ( AVCodecContext  * dec ,  AVCodec  * dec_codec ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                              AVCodecContext  * enc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* if sample formats match or a decoder sample format has already been
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								       requested ,  just  return  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( enc - > sample_fmt  = =  dec - > sample_fmt  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        dec - > request_sample_fmt  >  AV_SAMPLE_FMT_NONE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* if decoder supports more than one output format */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( dec_codec  & &  dec_codec - > sample_fmts  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        dec_codec - > sample_fmts [ 0 ]  ! =  AV_SAMPLE_FMT_NONE  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        dec_codec - > sample_fmts [ 1 ]  ! =  AV_SAMPLE_FMT_NONE )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        const  enum  AVSampleFormat  * p ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        int  min_dec  =  - 1 ,  min_inc  =  - 1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* find a matching sample format in the encoder */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( p  =  dec_codec - > sample_fmts ;  * p  ! =  AV_SAMPLE_FMT_NONE ;  p + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( * p  = =  enc - > sample_fmt )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                dec - > request_sample_fmt  =  * p ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            }  else  if  ( * p  >  enc - > sample_fmt )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                min_inc  =  FFMIN ( min_inc ,  * p  -  enc - > sample_fmt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            }  else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                min_dec  =  FFMIN ( min_dec ,  enc - > sample_fmt  -  * p ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* if none match, provide the one that matches quality closest */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        dec - > request_sample_fmt  =  min_inc  >  0  ?  enc - > sample_fmt  +  min_inc  : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                  enc - > sample_fmt  -  min_dec ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  choose_sample_rate ( AVStream  * st ,  AVCodec  * codec )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if ( codec  & &  codec - > supported_samplerates ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        const  int  * p =  codec - > supported_samplerates ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        int  best = 0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        int  best_dist = INT_MAX ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for ( ;  * p ;  p + + ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            int  dist =  abs ( st - > codec - > sample_rate  -  * p ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if ( dist  <  best_dist ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                best_dist =  dist ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                best =  * p ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if ( best_dist ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            av_log ( st - > codec ,  AV_LOG_WARNING ,  " Requested sampling rate unsupported using closest supported (%d) \n " ,  best ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        st - > codec - > sample_rate =  best ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  choose_pixel_fmt ( AVStream  * st ,  AVCodec  * codec )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if ( codec  & &  codec - > pix_fmts ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        const  enum  PixelFormat  * p =  codec - > pix_fmts ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if ( st - > codec - > strict_std_compliance  < =  FF_COMPLIANCE_UNOFFICIAL ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if ( st - > codec - > codec_id = = CODEC_ID_MJPEG ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                p =  ( const  enum  PixelFormat [ ] ) { PIX_FMT_YUVJ420P ,  PIX_FMT_YUVJ422P ,  PIX_FMT_YUV420P ,  PIX_FMT_YUV422P ,  PIX_FMT_NONE } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } else  if ( st - > codec - > codec_id = = CODEC_ID_LJPEG ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                p =  ( const  enum  PixelFormat [ ] ) { PIX_FMT_YUVJ420P ,  PIX_FMT_YUVJ422P ,  PIX_FMT_YUVJ444P ,  PIX_FMT_YUV420P ,  PIX_FMT_YUV422P ,  PIX_FMT_YUV444P ,  PIX_FMT_BGRA ,  PIX_FMT_NONE } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-22 10:38:37 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  ( ;  * p  ! =  PIX_FMT_NONE ;  p + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            if ( * p  = =  st - > codec - > pix_fmt ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-22 10:38:37 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( * p  = =  PIX_FMT_NONE )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            if ( st - > codec - > pix_fmt  ! =  PIX_FMT_NONE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                av_log ( NULL ,  AV_LOG_WARNING , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        " Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s' \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        av_pix_fmt_descriptors [ st - > codec - > pix_fmt ] . name , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        codec - > name , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        av_pix_fmt_descriptors [ codec - > pix_fmts [ 0 ] ] . name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            st - > codec - > pix_fmt  =  codec - > pix_fmts [ 0 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  double  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								get_sync_ipts ( const  OutputStream  * ost )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  InputStream  * ist  =  ost - > sync_ist ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 11:42:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    OutputFile  * of  =  & output_files [ ost - > file_index ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  ( double ) ( ist - > pts  -  of - > start_time ) / AV_TIME_BASE ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  write_frame ( AVFormatContext  * s ,  AVPacket  * pkt ,  AVCodecContext  * avctx ,  AVBitStreamFilterContext  * bsfc ) {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    while ( bsfc ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        AVPacket  new_pkt =  * pkt ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        int  a =  av_bitstream_filter_filter ( bsfc ,  avctx ,  NULL , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                          & new_pkt . data ,  & new_pkt . size , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                          pkt - > data ,  pkt - > size , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                          pkt - > flags  &  AV_PKT_FLAG_KEY ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if ( a > 0 ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            av_free_packet ( pkt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            new_pkt . destruct =  av_destruct_packet ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }  else  if ( a < 0 ) { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_ERROR ,  " %s failed for stream %d, codec %s " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                   bsfc - > filter - > name ,  pkt - > stream_index , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                   avctx - > codec  ?  avctx - > codec - > name  :  " copy " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            print_error ( " " ,  a ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( exit_on_error ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        * pkt =  new_pkt ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        bsfc =  bsfc - > next ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret =  av_interleaved_write_frame ( s ,  pkt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if ( ret  <  0 ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        print_error ( " av_interleaved_write_frame() " ,  ret ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-28 15:19:39 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  generate_silence ( uint8_t *  buf ,  enum  AVSampleFormat  sample_fmt ,  size_t  size )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  fill_char  =  0x00 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( sample_fmt  = =  AV_SAMPLE_FMT_U8 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        fill_char  =  0x80 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    memset ( buf ,  fill_char ,  size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								static  void  do_audio_out ( AVFormatContext  * s ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                         OutputStream  * ost , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                         InputStream  * ist , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                         unsigned  char  * buf ,  int  size ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    uint8_t  * buftmp ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int64_t  audio_out_size ,  audio_buf_size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int64_t  allocated_for_size =  size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  size_out ,  frame_bytes ,  ret ,  resample_changed ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVCodecContext  * enc =  ost - > st - > codec ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVCodecContext  * dec =  ist - > st - > codec ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  osize  =  av_get_bytes_per_sample ( enc - > sample_fmt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  isize  =  av_get_bytes_per_sample ( dec - > sample_fmt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  int  coded_bps  =  av_get_bits_per_sample ( enc - > codec - > id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								need_realloc :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    audio_buf_size =  ( allocated_for_size  +  isize * dec - > channels  -  1 )  /  ( isize * dec - > channels ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    audio_buf_size =  ( audio_buf_size * enc - > sample_rate  +  dec - > sample_rate )  /  dec - > sample_rate ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    audio_buf_size =  audio_buf_size * 2  +  10000 ;  //safety factors for the deprecated resampling API
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    audio_buf_size =  FFMAX ( audio_buf_size ,  enc - > frame_size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    audio_buf_size * =  osize * enc - > channels ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    audio_out_size =  FFMAX ( audio_buf_size ,  enc - > frame_size  *  osize  *  enc - > channels ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if ( coded_bps  >  8 * osize ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        audio_out_size =  audio_out_size  *  coded_bps  /  ( 8 * osize ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    audio_out_size  + =  FF_MIN_BUFFER_SIZE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if ( audio_out_size  >  INT_MAX  | |  audio_buf_size  >  INT_MAX ) { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_FATAL ,  " Buffer sizes too large \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    av_fast_malloc ( & audio_buf ,  & allocated_audio_buf_size ,  audio_buf_size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    av_fast_malloc ( & audio_out ,  & allocated_audio_out_size ,  audio_out_size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! audio_buf  | |  ! audio_out ) { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_FATAL ,  " Out of memory in do_audio_out \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( enc - > channels  ! =  dec - > channels  | |  enc - > sample_rate  ! =  dec - > sample_rate ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost - > audio_resample  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    resample_changed  =  ost - > resample_sample_fmt   ! =  dec - > sample_fmt  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                       ost - > resample_channels     ! =  dec - > channels    | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                       ost - > resample_sample_rate  ! =  dec - > sample_rate ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ( ost - > audio_resample  & &  ! ost - > resample )  | |  resample_changed )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( resample_changed )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 13:00:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_INFO ,  " Input stream #%d:%d frame changed from rate:%d fmt:%s ch:%d to rate:%d fmt:%s ch:%d \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                   ist - > file_index ,  ist - > st - > index , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                   ost - > resample_sample_rate ,  av_get_sample_fmt_name ( ost - > resample_sample_fmt ) ,  ost - > resample_channels , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                   dec - > sample_rate ,  av_get_sample_fmt_name ( dec - > sample_fmt ) ,  dec - > channels ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ost - > resample_sample_fmt   =  dec - > sample_fmt ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ost - > resample_channels     =  dec - > channels ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ost - > resample_sample_rate  =  dec - > sample_rate ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ost - > resample ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                audio_resample_close ( ost - > resample ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( audio_sync_method  < =  1  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ost - > resample_sample_fmt   = =  enc - > sample_fmt  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ost - > resample_channels     = =  enc - > channels    & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ost - > resample_sample_rate  = =  enc - > sample_rate )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ost - > resample  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ost - > audio_resample  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }  else  if  ( ost - > audio_resample )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( dec - > sample_fmt  ! =  AV_SAMPLE_FMT_S16 ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                av_log ( NULL ,  AV_LOG_WARNING ,  " Using s16 intermediate sample format for resampling \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            ost - > resample  =  av_audio_resample_init ( enc - > channels ,     dec - > channels , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                   enc - > sample_rate ,  dec - > sample_rate , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                   enc - > sample_fmt ,   dec - > sample_fmt , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                   16 ,  10 ,  0 ,  0.8 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ! ost - > resample )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                av_log ( NULL ,  AV_LOG_FATAL ,  " Can not resample %d channels @ %d Hz to %d channels @ %d Hz \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                       dec - > channels ,  dec - > sample_rate , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                       enc - > channels ,  enc - > sample_rate ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b)) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! ost - > audio_resample  & &  dec - > sample_fmt ! = enc - > sample_fmt  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        MAKE_SFMT_PAIR ( enc - > sample_fmt , dec - > sample_fmt ) ! = ost - > reformat_pair )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ost - > reformat_ctx ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            av_audio_convert_free ( ost - > reformat_ctx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost - > reformat_ctx  =  av_audio_convert_alloc ( enc - > sample_fmt ,  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                   dec - > sample_fmt ,  1 ,  NULL ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! ost - > reformat_ctx )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_FATAL ,  " Cannot convert %s sample format to %s sample format \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                   av_get_sample_fmt_name ( dec - > sample_fmt ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                   av_get_sample_fmt_name ( enc - > sample_fmt ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost - > reformat_pair = MAKE_SFMT_PAIR ( enc - > sample_fmt , dec - > sample_fmt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if ( audio_sync_method ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        double  delta  =  get_sync_ipts ( ost )  *  enc - > sample_rate  -  ost - > sync_opts 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-28 15:19:39 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                -  av_fifo_size ( ost - > fifo ) / ( enc - > channels  *  osize ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        int  idelta  =  delta  *  dec - > sample_rate  /  enc - > sample_rate ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        int  byte_delta  =  idelta  *  isize  *  dec - > channels ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        //FIXME resample delay
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if ( fabs ( delta )  >  50 ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if ( ist - > is_start  | |  fabs ( delta )  >  audio_drift_threshold * enc - > sample_rate ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if ( byte_delta  <  0 ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    byte_delta =  FFMAX ( byte_delta ,  - size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    size  + =  byte_delta ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    buf   - =  byte_delta ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-28 15:19:39 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    av_log ( NULL ,  AV_LOG_VERBOSE ,  " discarding %d audio samples \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                           - byte_delta  /  ( isize  *  dec - > channels ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    if ( ! size ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ist - > is_start = 0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } else { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    static  uint8_t  * input_tmp =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    input_tmp =  av_realloc ( input_tmp ,  byte_delta  +  size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if ( byte_delta  >  allocated_for_size  -  size ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        allocated_for_size =  byte_delta  +  ( int64_t ) size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        goto  need_realloc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ist - > is_start = 0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-28 15:19:39 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    generate_silence ( input_tmp ,  dec - > sample_fmt ,  byte_delta ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    memcpy ( input_tmp  +  byte_delta ,  buf ,  size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    buf =  input_tmp ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    size  + =  byte_delta ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-28 15:19:39 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    av_log ( NULL ,  AV_LOG_VERBOSE ,  " adding %d audio samples of silence \n " ,  idelta ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } else  if ( audio_sync_method > 1 ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                int  comp =  av_clip ( delta ,  - audio_sync_method ,  audio_sync_method ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                av_assert0 ( ost - > audio_resample ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                av_log ( NULL ,  AV_LOG_VERBOSE ,  " compensating audio timestamp drift:%f compensation:%d in:%d \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                       delta ,  comp ,  enc - > sample_rate ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								//                fprintf(stderr, "drift:%f len:%d opts:%"PRId64" ipts:%"PRId64" fifo:%d\n", delta, -1, ost->sync_opts, (int64_t)(get_sync_ipts(ost) * enc->sample_rate), av_fifo_size(ost->fifo)/(ost->st->codec->channels * 2));
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                av_resample_compensate ( * ( struct  AVResampleContext * * ) ost - > resample ,  comp ,  enc - > sample_rate ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost - > sync_opts =  lrintf ( get_sync_ipts ( ost )  *  enc - > sample_rate ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-28 15:19:39 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        -  av_fifo_size ( ost - > fifo ) / ( enc - > channels  *  osize ) ;  //FIXME wrong
 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ost - > audio_resample )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        buftmp  =  audio_buf ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        size_out  =  audio_resample ( ost - > resample , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                  ( short  * ) buftmp ,  ( short  * ) buf , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                  size  /  ( dec - > channels  *  isize ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        size_out  =  size_out  *  enc - > channels  *  osize ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        buftmp  =  buf ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        size_out  =  size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! ost - > audio_resample  & &  dec - > sample_fmt ! = enc - > sample_fmt )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        const  void  * ibuf [ 6 ] =  { buftmp } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        void  * obuf [ 6 ] =  { audio_buf } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        int  istride [ 6 ] =  { isize } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        int  ostride [ 6 ] =  { osize } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        int  len =  size_out / istride [ 0 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( av_audio_convert ( ost - > reformat_ctx ,  obuf ,  ostride ,  ibuf ,  istride ,  len ) < 0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            printf ( " av_audio_convert() failed \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( exit_on_error ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        buftmp  =  audio_buf ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        size_out  =  len * osize ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* now encode as many frames as possible */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( enc - > frame_size  >  1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* output resampled raw samples */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( av_fifo_realloc2 ( ost - > fifo ,  av_fifo_size ( ost - > fifo )  +  size_out )  <  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_FATAL ,  " av_fifo_realloc2() failed \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_fifo_generic_write ( ost - > fifo ,  buftmp ,  size_out ,  NULL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        frame_bytes  =  enc - > frame_size  *  osize  *  enc - > channels ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        while  ( av_fifo_size ( ost - > fifo )  > =  frame_bytes )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            AVPacket  pkt ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            av_init_packet ( & pkt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            av_fifo_generic_read ( ost - > fifo ,  audio_buf ,  frame_bytes ,  NULL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ret  =  avcodec_encode_audio ( enc ,  audio_out ,  audio_out_size , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                       ( short  * ) audio_buf ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ret  <  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                av_log ( NULL ,  AV_LOG_FATAL ,  " Audio encoding failed \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            audio_size  + =  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            pkt . stream_index =  ost - > index ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            pkt . data =  audio_out ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            pkt . size =  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if ( enc - > coded_frame  & &  enc - > coded_frame - > pts  ! =  AV_NOPTS_VALUE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                pkt . pts =  av_rescale_q ( enc - > coded_frame - > pts ,  enc - > time_base ,  ost - > st - > time_base ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            pkt . flags  | =  AV_PKT_FLAG_KEY ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            write_frame ( s ,  & pkt ,  enc ,  ost - > bitstream_filters ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ost - > sync_opts  + =  enc - > frame_size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        AVPacket  pkt ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_init_packet ( & pkt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost - > sync_opts  + =  size_out  /  ( osize  *  enc - > channels ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* output a pcm frame */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* determine the size of the coded buffer */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        size_out  / =  osize ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( coded_bps ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            size_out  =  size_out * coded_bps / 8 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if ( size_out  >  audio_out_size ) { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_FATAL ,  " Internal error, buffer size too small \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ret  =  avcodec_encode_audio ( enc ,  audio_out ,  size_out , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                   ( short  * ) buftmp ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ret  <  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_FATAL ,  " Audio encoding failed \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        audio_size  + =  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        pkt . stream_index =  ost - > index ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        pkt . data =  audio_out ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        pkt . size =  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if ( enc - > coded_frame  & &  enc - > coded_frame - > pts  ! =  AV_NOPTS_VALUE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            pkt . pts =  av_rescale_q ( enc - > coded_frame - > pts ,  enc - > time_base ,  ost - > st - > time_base ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        pkt . flags  | =  AV_PKT_FLAG_KEY ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        write_frame ( s ,  & pkt ,  enc ,  ost - > bitstream_filters ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  pre_process_video_frame ( InputStream  * ist ,  AVPicture  * picture ,  void  * * bufp )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVCodecContext  * dec ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVPicture  * picture2 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVPicture  picture_tmp ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    uint8_t  * buf  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    dec  =  ist - > st - > codec ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* deinterlace : must be done before any resize */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( do_deinterlace )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        int  size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* create temporary picture */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        size  =  avpicture_get_size ( dec - > pix_fmt ,  dec - > width ,  dec - > height ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        buf  =  av_malloc ( size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! buf ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        picture2  =  & picture_tmp ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        avpicture_fill ( picture2 ,  buf ,  dec - > pix_fmt ,  dec - > width ,  dec - > height ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if ( avpicture_deinterlace ( picture2 ,  picture , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                 dec - > pix_fmt ,  dec - > width ,  dec - > height )  <  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            /* if error, do not deinterlace */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_WARNING ,  " Deinterlacing failed \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            av_free ( buf ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            buf  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            picture2  =  picture ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        picture2  =  picture ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( picture  ! =  picture2 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        * picture  =  * picture2 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    * bufp  =  buf ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  do_subtitle_out ( AVFormatContext  * s ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            OutputStream  * ost , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            InputStream  * ist , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            AVSubtitle  * sub , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            int64_t  pts ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    static  uint8_t  * subtitle_out  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  subtitle_out_max_size  =  1024  *  1024 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  subtitle_out_size ,  nb ,  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVCodecContext  * enc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVPacket  pkt ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( pts  = =  AV_NOPTS_VALUE )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_ERROR ,  " Subtitle packets must have a pts \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  ( exit_on_error ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    enc  =  ost - > st - > codec ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! subtitle_out )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        subtitle_out  =  av_malloc ( subtitle_out_max_size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* Note: DVB subtitle need one packet to draw them and one other
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								       packet  to  clear  them  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* XXX: signal it in the codec context ? */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( enc - > codec_id  = =  CODEC_ID_DVB_SUBTITLE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        nb  =  2 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        nb  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for ( i  =  0 ;  i  <  nb ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        sub - > pts  =  av_rescale_q ( pts ,  ist - > st - > time_base ,  AV_TIME_BASE_Q ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // start_display_time is required to be 0
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        sub - > pts               + =  av_rescale_q ( sub - > start_display_time ,  ( AVRational ) { 1 ,  1000 } ,  AV_TIME_BASE_Q ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        sub - > end_display_time  - =  sub - > start_display_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        sub - > start_display_time  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        subtitle_out_size  =  avcodec_encode_subtitle ( enc ,  subtitle_out , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                    subtitle_out_max_size ,  sub ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( subtitle_out_size  <  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_FATAL ,  " Subtitle encoding failed \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_init_packet ( & pkt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        pkt . stream_index  =  ost - > index ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        pkt . data  =  subtitle_out ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        pkt . size  =  subtitle_out_size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        pkt . pts  =  av_rescale_q ( sub - > pts ,  AV_TIME_BASE_Q ,  ost - > st - > time_base ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( enc - > codec_id  = =  CODEC_ID_DVB_SUBTITLE )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            /* XXX: the pts correction is handled here. Maybe handling
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								               it  in  the  codec  would  be  better  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( i  = =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                pkt . pts  + =  90  *  sub - > start_display_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                pkt . pts  + =  90  *  sub - > end_display_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        write_frame ( s ,  & pkt ,  ost - > st - > codec ,  ost - > bitstream_filters ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  bit_buffer_size =  1024 * 256 ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  uint8_t  * bit_buffer =  NULL ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-16 18:43:27 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  do_video_resample ( OutputStream  * ost ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                              InputStream  * ist , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                              AVFrame  * in_picture , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                              AVFrame  * * out_picture ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-08-16 18:43:27 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int  resample_changed  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVCodecContext  * dec  =  ist - > st - > codec ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    * out_picture  =  in_picture ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    resample_changed  =  ost - > resample_width    ! =  dec - > width   | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                       ost - > resample_height   ! =  dec - > height  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                       ost - > resample_pix_fmt  ! =  dec - > pix_fmt ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( resample_changed )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_INFO , 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 13:00:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								               " Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								               ist - > file_index ,  ist - > st - > index , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								               ost - > resample_width ,  ost - > resample_height ,  av_get_pix_fmt_name ( ost - > resample_pix_fmt ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								               dec - > width          ,  dec - > height          ,  av_get_pix_fmt_name ( dec - > pix_fmt ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if ( ! ost - > video_resample ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 16:44:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ost - > video_resample  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# if !CONFIG_AVFILTER 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ost - > video_resample )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-16 18:43:27 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        * out_picture  =  & ost - > pict_tmp ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  ( resample_changed )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            /* initialize a new scaler context */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            sws_freeContext ( ost - > img_resample_ctx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ost - > img_resample_ctx  =  sws_getContext ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ist - > st - > codec - > width , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ist - > st - > codec - > height , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ist - > st - > codec - > pix_fmt , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ost - > st - > codec - > width , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ost - > st - > codec - > height , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ost - > st - > codec - > pix_fmt , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ost - > sws_flags ,  NULL ,  NULL ,  NULL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ost - > img_resample_ctx  = =  NULL )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                av_log ( NULL ,  AV_LOG_FATAL ,  " Cannot get resampling context \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-16 18:43:27 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        sws_scale ( ost - > img_resample_ctx ,  in_picture - > data ,  in_picture - > linesize , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								              0 ,  ost - > resample_height ,  ( * out_picture ) - > data ,  ( * out_picture ) - > linesize ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 16:44:04 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( resample_changed )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        avfilter_graph_free ( & ost - > graph ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( configure_video_filters ( ist ,  ost ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_FATAL ,  " Error reinitializing filters! \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 16:44:04 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2011-08-13 16:44:04 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( resample_changed )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost - > resample_width    =  dec - > width ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost - > resample_height   =  dec - > height ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost - > resample_pix_fmt  =  dec - > pix_fmt ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-16 18:43:27 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  do_video_out ( AVFormatContext  * s ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                         OutputStream  * ost , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                         InputStream  * ist , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                         AVFrame  * in_picture , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                         int  * frame_size ,  float  quality ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-08-16 19:06:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int  nb_frames ,  i ,  ret ,  format_video_sync ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-16 18:43:27 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    AVFrame  * final_picture ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 19:28:42 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    AVCodecContext  * enc ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-16 18:43:27 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    double  sync_ipts ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    enc  =  ost - > st - > codec ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    sync_ipts  =  get_sync_ipts ( ost )  /  av_q2d ( enc - > time_base ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* by default, we output a single frame */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    nb_frames  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    * frame_size  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-16 19:06:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    format_video_sync  =  video_sync_method ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( format_video_sync  <  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:46:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        format_video_sync  =  ( s - > oformat - > flags  &  AVFMT_NOTIMESTAMPS )  ?  0  : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            ( s - > oformat - > flags  &  AVFMT_VARIABLE_FPS )  ?  2  :  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-16 19:06:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( format_video_sync )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-16 18:43:27 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        double  vdelta  =  sync_ipts  -  ost - > sync_opts ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( vdelta  <  - 1.1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            nb_frames  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-16 19:06:46 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        else  if  ( format_video_sync  = =  2 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-16 18:43:27 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if ( vdelta < = - 0.6 ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                nb_frames = 0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } else  if ( vdelta > 0.6 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ost - > sync_opts =  lrintf ( sync_ipts ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } else  if  ( vdelta  >  1.1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            nb_frames  =  lrintf ( vdelta ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//fprintf(stderr, "vdelta:%f, ost->sync_opts:%"PRId64", ost->sync_ipts:%f nb_frames:%d\n", vdelta, ost->sync_opts, get_sync_ipts(ost), nb_frames);
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( nb_frames  = =  0 ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            + + nb_frames_drop ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_VERBOSE ,  " *** drop! \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-16 18:43:27 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } else  if  ( nb_frames  >  1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            nb_frames_dup  + =  nb_frames  -  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_VERBOSE ,  " *** %d dup! \n " ,  nb_frames - 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-16 18:43:27 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost - > sync_opts =  lrintf ( sync_ipts ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    nb_frames  =  FFMIN ( nb_frames ,  ost - > max_frames  -  ost - > frame_number ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-16 18:43:27 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( nb_frames  < =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    do_video_resample ( ost ,  ist ,  in_picture ,  & final_picture ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* duplicates frame if needed */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for ( i = 0 ; i < nb_frames ; i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        AVPacket  pkt ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_init_packet ( & pkt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        pkt . stream_index =  ost - > index ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( s - > oformat - > flags  &  AVFMT_RAWPICTURE )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            /* raw pictures are written as AVPicture structure to
 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-18 12:09:17 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								               avoid  any  copies .  We  support  temporarily  the  older 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								               method .  */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 19:28:42 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            enc - > coded_frame - > interlaced_frame  =  in_picture - > interlaced_frame ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            enc - > coded_frame - > top_field_first   =  in_picture - > top_field_first ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            pkt . data =  ( uint8_t  * ) final_picture ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            pkt . size =   sizeof ( AVPicture ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            pkt . pts =  av_rescale_q ( ost - > sync_opts ,  enc - > time_base ,  ost - > st - > time_base ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            pkt . flags  | =  AV_PKT_FLAG_KEY ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            write_frame ( s ,  & pkt ,  ost - > st - > codec ,  ost - > bitstream_filters ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            AVFrame  big_picture ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            big_picture =  * final_picture ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            /* better than nothing: use input picture interlaced
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								               settings  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            big_picture . interlaced_frame  =  in_picture - > interlaced_frame ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ost - > st - > codec - > flags  &  ( CODEC_FLAG_INTERLACED_DCT | CODEC_FLAG_INTERLACED_ME ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-02 18:03:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ( ost - > top_field_first  = =  - 1 ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    big_picture . top_field_first  =  in_picture - > top_field_first ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                else 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-02 18:03:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    big_picture . top_field_first  =  ! ! ost - > top_field_first ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-09 11:32:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            /* handles same_quant here. This is not correct because it may
 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								               not  be  a  global  option  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            big_picture . quality  =  quality ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-02 17:06:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( ! enc - > me_threshold ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                big_picture . pict_type  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//            big_picture.pts = AV_NOPTS_VALUE;
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            big_picture . pts =  ost - > sync_opts ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//            big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ost - > forced_kf_index  <  ost - > forced_kf_count  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                big_picture . pts  > =  ost - > forced_kf_pts [ ost - > forced_kf_index ] )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                big_picture . pict_type  =  AV_PICTURE_TYPE_I ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ost - > forced_kf_index + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ret  =  avcodec_encode_video ( enc , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                       bit_buffer ,  bit_buffer_size , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                       & big_picture ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ret  <  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                av_log ( NULL ,  AV_LOG_FATAL ,  " Video encoding failed \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if ( ret > 0 ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                pkt . data =  bit_buffer ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                pkt . size =  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if ( enc - > coded_frame - > pts  ! =  AV_NOPTS_VALUE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    pkt . pts =  av_rescale_q ( enc - > coded_frame - > pts ,  enc - > time_base ,  ost - > st - > time_base ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   pkt . pts  ! =  AV_NOPTS_VALUE  ?  av_rescale ( pkt . pts ,  enc - > time_base . den ,  AV_TIME_BASE * ( int64_t ) enc - > time_base . num )  :  - 1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   pkt . dts  ! =  AV_NOPTS_VALUE  ?  av_rescale ( pkt . dts ,  enc - > time_base . den ,  AV_TIME_BASE * ( int64_t ) enc - > time_base . num )  :  - 1 ) ; */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if ( enc - > coded_frame - > key_frame ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    pkt . flags  | =  AV_PKT_FLAG_KEY ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                write_frame ( s ,  & pkt ,  ost - > st - > codec ,  ost - > bitstream_filters ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                * frame_size  =  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                video_size  + =  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                //        enc->frame_number-1, ret, enc->pict_type);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                /* if two pass, output log */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( ost - > logfile  & &  enc - > stats_out )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    fprintf ( ost - > logfile ,  " %s " ,  enc - > stats_out ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost - > sync_opts + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost - > frame_number + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  double  psnr ( double  d ) {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  - 10.0 * log ( d ) / log ( 10.0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  do_video_stats ( AVFormatContext  * os ,  OutputStream  * ost ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                           int  frame_size ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVCodecContext  * enc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  frame_number ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    double  ti1 ,  bitrate ,  avg_bitrate ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* this is executed just the first time do_video_stats is called */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! vstats_file )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        vstats_file  =  fopen ( vstats_filename ,  " w " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! vstats_file )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            perror ( " fopen " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    enc  =  ost - > st - > codec ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( enc - > codec_type  = =  AVMEDIA_TYPE_VIDEO )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        frame_number  =  ost - > frame_number ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        fprintf ( vstats_file ,  " frame= %5d q= %2.1f  " ,  frame_number ,  enc - > coded_frame - > quality / ( float ) FF_QP2LAMBDA ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( enc - > flags & CODEC_FLAG_PSNR ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            fprintf ( vstats_file ,  " PSNR= %6.2f  " ,  psnr ( enc - > coded_frame - > error [ 0 ] / ( enc - > width * enc - > height * 255.0 * 255.0 ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        fprintf ( vstats_file , " f_size= %6d  " ,  frame_size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* compute pts value */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ti1  =  ost - > sync_opts  *  av_q2d ( enc - > time_base ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ti1  <  0.01 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ti1  =  0.01 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        bitrate  =  ( frame_size  *  8 )  /  av_q2d ( enc - > time_base )  /  1000.0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        avg_bitrate  =  ( double ) ( video_size  *  8 )  /  ti1  /  1000.0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        fprintf ( vstats_file ,  " s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s  " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ( double ) video_size  /  1024 ,  ti1 ,  bitrate ,  avg_bitrate ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        fprintf ( vstats_file ,  " type= %c \n " ,  av_get_picture_type_char ( enc - > coded_frame - > pict_type ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 09:56:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  print_report ( OutputFile  * output_files ,  
						 
					
						
							
								
									
										
										
										
											2011-08-17 10:21:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                         OutputStream  * ost_table ,  int  nb_ostreams , 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 18:46:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                         int  is_last_report ,  int64_t  timer_start ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    char  buf [ 1024 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    OutputStream  * ost ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVFormatContext  * oc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int64_t  total_size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVCodecContext  * enc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  frame_number ,  vid ,  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    double  bitrate ,  ti1 ,  pts ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    static  int64_t  last_time  =  - 1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    static  int  qp_histogram [ 52 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-09 15:57:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ! print_stats  & &  ! is_last_report ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    if  ( ! is_last_report )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        int64_t  cur_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* display the report every 0.5 seconds */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        cur_time  =  av_gettime ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( last_time  = =  - 1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            last_time  =  cur_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ( cur_time  -  last_time )  <  500000 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        last_time  =  cur_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 09:56:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    oc  =  output_files [ 0 ] . ctx ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    total_size  =  avio_size ( oc - > pb ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if ( total_size < 0 )  // FIXME improve avio_size() so it works with non seekable output too
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        total_size =  avio_tell ( oc - > pb ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    buf [ 0 ]  =  ' \0 ' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ti1  =  1e10 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    vid  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for ( i = 0 ; i < nb_ostreams ; i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        float  q  =  - 1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 10:21:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ost  =  & ost_table [ i ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        enc  =  ost - > st - > codec ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-23 11:22:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! ost - > stream_copy  & &  enc - > coded_frame ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            q  =  enc - > coded_frame - > quality / ( float ) FF_QP2LAMBDA ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( vid  & &  enc - > codec_type  = =  AVMEDIA_TYPE_VIDEO )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            snprintf ( buf  +  strlen ( buf ) ,  sizeof ( buf )  -  strlen ( buf ) ,  " q=%2.1f  " ,  q ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! vid  & &  enc - > codec_type  = =  AVMEDIA_TYPE_VIDEO )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            float  t  =  ( av_gettime ( ) - timer_start )  /  1000000.0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            frame_number  =  ost - > frame_number ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            snprintf ( buf  +  strlen ( buf ) ,  sizeof ( buf )  -  strlen ( buf ) ,  " frame=%5d fps=%3d q=%3.1f  " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                     frame_number ,  ( t > 1 ) ? ( int ) ( frame_number / t + 0.5 )  :  0 ,  q ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if ( is_last_report ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                snprintf ( buf  +  strlen ( buf ) ,  sizeof ( buf )  -  strlen ( buf ) ,  " L " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if ( qp_hist ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                int  j ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                int  qp  =  lrintf ( q ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if ( qp > = 0  & &  qp < FF_ARRAY_ELEMS ( qp_histogram ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    qp_histogram [ qp ] + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                for ( j = 0 ;  j < 32 ;  j + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    snprintf ( buf  +  strlen ( buf ) ,  sizeof ( buf )  -  strlen ( buf ) ,  " %X " ,  ( int ) lrintf ( log ( qp_histogram [ j ] + 1 ) / log ( 2 ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( enc - > flags & CODEC_FLAG_PSNR ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                int  j ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                double  error ,  error_sum = 0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                double  scale ,  scale_sum = 0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                char  type [ 3 ] =  { ' Y ' , ' U ' , ' V ' } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                snprintf ( buf  +  strlen ( buf ) ,  sizeof ( buf )  -  strlen ( buf ) ,  " PSNR= " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                for ( j = 0 ;  j < 3 ;  j + + ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if ( is_last_report ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        error =  enc - > error [ j ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        scale =  enc - > width * enc - > height * 255.0 * 255.0 * frame_number ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } else { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        error =  enc - > coded_frame - > error [ j ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        scale =  enc - > width * enc - > height * 255.0 * 255.0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if ( j )  scale / = 4 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    error_sum  + =  error ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    scale_sum  + =  scale ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    snprintf ( buf  +  strlen ( buf ) ,  sizeof ( buf )  -  strlen ( buf ) ,  " %c:%2.2f  " ,  type [ j ] ,  psnr ( error / scale ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                snprintf ( buf  +  strlen ( buf ) ,  sizeof ( buf )  -  strlen ( buf ) ,  " *:%2.2f  " ,  psnr ( error_sum / scale_sum ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            vid  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* compute min output value */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        pts  =  ( double ) ost - > st - > pts . val  *  av_q2d ( ost - > st - > time_base ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ( pts  <  ti1 )  & &  ( pts  >  0 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ti1  =  pts ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ti1  <  0.01 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ti1  =  0.01 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    bitrate  =  ( double ) ( total_size  *  8 )  /  ti1  /  1000.0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    snprintf ( buf  +  strlen ( buf ) ,  sizeof ( buf )  -  strlen ( buf ) , 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            " size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ( double ) total_size  /  1024 ,  ti1 ,  bitrate ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( nb_frames_dup  | |  nb_frames_drop ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        snprintf ( buf  +  strlen ( buf ) ,  sizeof ( buf )  -  strlen ( buf ) ,  "  dup=%d drop=%d " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                nb_frames_dup ,  nb_frames_drop ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-09 16:32:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    av_log ( NULL ,  AV_LOG_INFO ,  " %s     \r " ,  buf ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    fflush ( stderr ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( is_last_report )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        int64_t  raw =  audio_size  +  video_size  +  extra_size ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_INFO ,  " \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_INFO ,  " video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%% \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								               video_size / 1024.0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								               audio_size / 1024.0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								               extra_size / 1024.0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								               100.0 * ( total_size  -  raw ) / raw 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-19 17:52:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  flush_encoders ( OutputStream  * ost_table ,  int  nb_ostreams )  
						 
					
						
							
								
									
										
										
										
											2011-08-18 08:55:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  i ,  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  nb_ostreams ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-16 11:19:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        OutputStream    * ost  =  & ost_table [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        AVCodecContext  * enc  =  ost - > st - > codec ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        AVFormatContext  * os  =  output_files [ ost - > file_index ] . ctx ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-19 17:52:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! ost - > encoding_needed ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-16 11:19:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ost - > st - > codec - > codec_type  = =  AVMEDIA_TYPE_AUDIO  & &  enc - > frame_size  < = 1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ost - > st - > codec - > codec_type  = =  AVMEDIA_TYPE_VIDEO  & &  ( os - > oformat - > flags  &  AVFMT_RAWPICTURE ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for ( ; ; )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            AVPacket  pkt ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            int  fifo_bytes ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            av_init_packet ( & pkt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            pkt . stream_index =  ost - > index ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            switch  ( ost - > st - > codec - > codec_type )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            case  AVMEDIA_TYPE_AUDIO : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                fifo_bytes  =  av_fifo_size ( ost - > fifo ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ret  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                /* encode any samples remaining in fifo */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( fifo_bytes  >  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    int  osize  =  av_get_bytes_per_sample ( enc - > sample_fmt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    int  fs_tmp  =  enc - > frame_size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    av_fifo_generic_read ( ost - > fifo ,  audio_buf ,  fifo_bytes ,  NULL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  ( enc - > codec - > capabilities  &  CODEC_CAP_SMALL_LAST_FRAME )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        enc - > frame_size  =  fifo_bytes  /  ( osize  *  enc - > channels ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    }  else  {  /* pad */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        int  frame_bytes  =  enc - > frame_size * osize * enc - > channels ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        if  ( allocated_audio_buf_size  <  frame_bytes ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-18 08:55:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-16 11:19:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        generate_silence ( audio_buf + fifo_bytes ,  enc - > sample_fmt ,  frame_bytes  -  fifo_bytes ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-18 08:55:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-16 11:19:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ret  =  avcodec_encode_audio ( enc ,  bit_buffer ,  bit_buffer_size ,  ( short  * ) audio_buf ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    pkt . duration  =  av_rescale ( ( int64_t ) enc - > frame_size * ost - > st - > time_base . den , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                              ost - > st - > time_base . num ,  enc - > sample_rate ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    enc - > frame_size  =  fs_tmp ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( ret  < =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ret  =  avcodec_encode_audio ( enc ,  bit_buffer ,  bit_buffer_size ,  NULL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-18 08:55:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-16 11:19:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ( ret  <  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    av_log ( NULL ,  AV_LOG_FATAL ,  " Audio encoding failed \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-16 11:19:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                audio_size  + =  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                pkt . flags  | =  AV_PKT_FLAG_KEY ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            case  AVMEDIA_TYPE_VIDEO : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ret  =  avcodec_encode_video ( enc ,  bit_buffer ,  bit_buffer_size ,  NULL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( ret  <  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    av_log ( NULL ,  AV_LOG_FATAL ,  " Video encoding failed \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-16 11:19:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                video_size  + =  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if ( enc - > coded_frame  & &  enc - > coded_frame - > key_frame ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    pkt . flags  | =  AV_PKT_FLAG_KEY ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( ost - > logfile  & &  enc - > stats_out )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    fprintf ( ost - > logfile ,  " %s " ,  enc - > stats_out ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ret = - 1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-18 08:55:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-16 11:19:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ret  < =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            pkt . data  =  bit_buffer ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            pkt . size  =  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( enc - > coded_frame  & &  enc - > coded_frame - > pts  ! =  AV_NOPTS_VALUE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                pkt . pts =  av_rescale_q ( enc - > coded_frame - > pts ,  enc - > time_base ,  ost - > st - > time_base ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            write_frame ( os ,  & pkt ,  ost - > st - > codec ,  ost - > bitstream_filters ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-18 08:55:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-21 13:48:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/*
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Check  whether  a  packet  from  ist  should  be  written  into  ost  at  this  time 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  check_output_constraints ( InputStream  * ist ,  OutputStream  * ost )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    OutputFile  * of  =  & output_files [ ost - > file_index ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  ist_index   =  ist  -  input_streams ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ost - > source_index  ! =  ist_index ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( of - > start_time  & &  ist - > pts  <  of - > start_time ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( of - > recording_time  ! =  INT64_MAX  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_compare_ts ( ist - > pts ,  AV_TIME_BASE_Q ,  of - > recording_time  +  of - > start_time , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                      ( AVRational ) { 1 ,  1000000 } )  > =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost - > is_past_recording_time  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  do_streamcopy ( InputStream  * ist ,  OutputStream  * ost ,  const  AVPacket  * pkt )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    OutputFile  * of  =  & output_files [ ost - > file_index ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int64_t  ost_tb_start_time  =  av_rescale_q ( of - > start_time ,  AV_TIME_BASE_Q ,  ost - > st - > time_base ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVPacket  opkt ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    av_init_packet ( & opkt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ( ! ost - > frame_number  & &  ! ( pkt - > flags  &  AV_PKT_FLAG_KEY ) )  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ! ost - > copy_initial_nonkeyframes ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* force the input stream PTS */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ost - > st - > codec - > codec_type  = =  AVMEDIA_TYPE_AUDIO ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        audio_size  + =  pkt - > size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else  if  ( ost - > st - > codec - > codec_type  = =  AVMEDIA_TYPE_VIDEO )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        video_size  + =  pkt - > size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost - > sync_opts + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    opkt . stream_index  =  ost - > index ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( pkt - > pts  ! =  AV_NOPTS_VALUE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        opkt . pts  =  av_rescale_q ( pkt - > pts ,  ist - > st - > time_base ,  ost - > st - > time_base )  -  ost_tb_start_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        opkt . pts  =  AV_NOPTS_VALUE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( pkt - > dts  = =  AV_NOPTS_VALUE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        opkt . dts  =  av_rescale_q ( ist - > pts ,  AV_TIME_BASE_Q ,  ost - > st - > time_base ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        opkt . dts  =  av_rescale_q ( pkt - > dts ,  ist - > st - > time_base ,  ost - > st - > time_base ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    opkt . dts  - =  ost_tb_start_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    opkt . duration  =  av_rescale_q ( pkt - > duration ,  ist - > st - > time_base ,  ost - > st - > time_base ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    opkt . flags     =  pkt - > flags ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if (    ost - > st - > codec - > codec_id  ! =  CODEC_ID_H264 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								       & &  ost - > st - > codec - > codec_id  ! =  CODEC_ID_MPEG1VIDEO 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								       & &  ost - > st - > codec - > codec_id  ! =  CODEC_ID_MPEG2VIDEO 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								       )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( av_parser_change ( ist - > st - > parser ,  ost - > st - > codec ,  & opkt . data ,  & opkt . size ,  pkt - > data ,  pkt - > size ,  pkt - > flags  &  AV_PKT_FLAG_KEY ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            opkt . destruct  =  av_destruct_packet ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        opkt . data  =  pkt - > data ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        opkt . size  =  pkt - > size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    write_frame ( of - > ctx ,  & opkt ,  ost - > st - > codec ,  ost - > bitstream_filters ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ost - > st - > codec - > frame_number + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ost - > frame_number + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    av_free_packet ( & opkt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-21 14:05:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  rate_emu_sleep ( InputStream  * ist )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( input_files [ ist - > file_index ] . rate_emu )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        int64_t  pts  =  av_rescale ( ist - > pts ,  1000000 ,  AV_TIME_BASE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        int64_t  now  =  av_gettime ( )  -  ist - > start ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( pts  >  now ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            usleep ( pts  -  now ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-21 14:39:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  transcode_audio ( InputStream  * ist ,  AVPacket  * pkt ,  int  * got_output )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    static  unsigned  int  samples_size  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  bps  =  av_get_bytes_per_sample ( ist - > st - > codec - > sample_fmt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    uint8_t  * decoded_data_buf   =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int       decoded_data_size  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  i ,  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( pkt  & &  samples_size  <  FFMAX ( pkt - > size  *  bps ,  AVCODEC_MAX_AUDIO_FRAME_SIZE ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_free ( samples ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        samples_size  =  FFMAX ( pkt - > size  *  bps ,  AVCODEC_MAX_AUDIO_FRAME_SIZE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        samples       =  av_malloc ( samples_size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    decoded_data_size  =  samples_size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret  =  avcodec_decode_audio3 ( ist - > st - > codec ,  samples ,  & decoded_data_size , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                pkt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ret  <  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    * got_output   =  decoded_data_size  >  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* Some bug in mpeg audio decoder gives */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* decoded_data_size < 0, it seems they are overflows */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! * got_output )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* no audio frame */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-21 21:30:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  ret ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-21 14:39:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    decoded_data_buf  =  ( uint8_t  * ) samples ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ist - > next_pts    + =  ( ( int64_t ) AV_TIME_BASE / bps  *  decoded_data_size )  / 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                       ( ist - > st - > codec - > sample_rate  *  ist - > st - > codec - > channels ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    // preprocess audio (volume)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( audio_volume  ! =  256 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        switch  ( ist - > st - > codec - > sample_fmt )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  AV_SAMPLE_FMT_U8 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            uint8_t  * volp  =  samples ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  ( i  =  0 ;  i  <  ( decoded_data_size  /  sizeof ( * volp ) ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                int  v  =  ( ( ( * volp  -  128 )  *  audio_volume  +  128 )  > >  8 )  +  128 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                * volp + +  =  av_clip_uint8 ( v ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  AV_SAMPLE_FMT_S16 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            int16_t  * volp  =  samples ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  ( i  =  0 ;  i  <  ( decoded_data_size  /  sizeof ( * volp ) ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                int  v  =  ( ( * volp )  *  audio_volume  +  128 )  > >  8 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                * volp + +  =  av_clip_int16 ( v ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  AV_SAMPLE_FMT_S32 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            int32_t  * volp  =  samples ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  ( i  =  0 ;  i  <  ( decoded_data_size  /  sizeof ( * volp ) ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                int64_t  v  =  ( ( ( int64_t ) * volp  *  audio_volume  +  128 )  > >  8 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                * volp + +  =  av_clipl_int32 ( v ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  AV_SAMPLE_FMT_FLT : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            float  * volp  =  samples ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            float  scale  =  audio_volume  /  256.f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  ( i  =  0 ;  i  <  ( decoded_data_size  /  sizeof ( * volp ) ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                * volp + +  * =  scale ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  AV_SAMPLE_FMT_DBL : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            double  * volp  =  samples ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            double  scale  =  audio_volume  /  256. ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  ( i  =  0 ;  i  <  ( decoded_data_size  /  sizeof ( * volp ) ) ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                * volp + +  * =  scale ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_FATAL , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                   " Audio volume adjustment on sample format %s is not supported. \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                   av_get_sample_fmt_name ( ist - > st - > codec - > sample_fmt ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    rate_emu_sleep ( ist ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  nb_output_streams ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        OutputStream  * ost  =  & output_streams [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! check_output_constraints ( ist ,  ost )  | |  ! ost - > encoding_needed ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        do_audio_out ( output_files [ ost - > file_index ] . ctx ,  ost ,  ist , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                     decoded_data_buf ,  decoded_data_size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-21 21:30:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  ret ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-21 14:39:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-21 14:39:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  transcode_video ( InputStream  * ist ,  AVPacket  * pkt ,  int  * got_output ,  int64_t  * pkt_pts )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVFrame  * decoded_frame ,  * filtered_frame  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    void  * buffer_to_free  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  i ,  ret  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    float  quality ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# if CONFIG_AVFILTER 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  frame_available  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! ( decoded_frame  =  avcodec_alloc_frame ( ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  AVERROR ( ENOMEM ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    pkt - > pts   =  * pkt_pts ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    pkt - > dts   =  ist - > pts ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    * pkt_pts   =  AV_NOPTS_VALUE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret  =  avcodec_decode_video2 ( ist - > st - > codec , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                decoded_frame ,  got_output ,  pkt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ret  <  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        goto  fail ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    quality  =  same_quant  ?  decoded_frame - > quality  :  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! * got_output )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* no picture yet */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_freep ( & decoded_frame ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-21 21:30:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  ret ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-21 14:39:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ist - > next_pts  =  ist - > pts  =  guess_correct_pts ( & ist - > pts_ctx ,  decoded_frame - > pkt_pts , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                 decoded_frame - > pkt_dts ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-28 11:15:06 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( pkt - > duration ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ist - > next_pts  + =  av_rescale_q ( pkt - > duration ,  ist - > st - > time_base ,  AV_TIME_BASE_Q ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else  if  ( ist - > st - > codec - > time_base . num  ! =  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-21 14:39:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        int  ticks       =  ist - > st - > parser  ?  ist - > st - > parser - > repeat_pict  +  1  : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                           ist - > st - > codec - > ticks_per_frame ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ist - > next_pts  + =  ( ( int64_t ) AV_TIME_BASE  * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                          ist - > st - > codec - > time_base . num  *  ticks )  / 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                          ist - > st - > codec - > time_base . den ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    pkt - > size  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    pre_process_video_frame ( ist ,  ( AVPicture  * ) decoded_frame ,  & buffer_to_free ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    rate_emu_sleep ( ist ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  nb_output_streams ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        OutputStream  * ost  =  & output_streams [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        int  frame_size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! check_output_constraints ( ist ,  ost )  | |  ! ost - > encoding_needed ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# if CONFIG_AVFILTER 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ost - > input_video_filter )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            AVRational  sar ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ist - > st - > sample_aspect_ratio . num ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                sar  =  ist - > st - > sample_aspect_ratio ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                sar  =  ist - > st - > codec - > sample_aspect_ratio ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            av_vsrc_buffer_add_frame ( ost - > input_video_filter ,  decoded_frame ,  ist - > pts ,  sar ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ! ( filtered_frame  =  avcodec_alloc_frame ( ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ret  =  AVERROR ( ENOMEM ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                goto  fail ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            frame_available  =  avfilter_poll_frame ( ost - > output_video_filter - > inputs [ 0 ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        while  ( frame_available )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            AVRational  ist_pts_tb ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ost - > output_video_filter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                get_filtered_video_frame ( ost - > output_video_filter ,  filtered_frame ,  & ost - > picref ,  & ist_pts_tb ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ost - > picref ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ist - > pts  =  av_rescale_q ( ost - > picref - > pts ,  ist_pts_tb ,  AV_TIME_BASE_Q ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ost - > picref - > video  & &  ! ost - > frame_aspect_ratio ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ost - > st - > codec - > sample_aspect_ratio  =  ost - > picref - > video - > pixel_aspect ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            filtered_frame  =  decoded_frame ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            do_video_out ( output_files [ ost - > file_index ] . ctx ,  ost ,  ist ,  filtered_frame ,  & frame_size , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                         same_quant  ?  quality  :  ost - > st - > codec - > global_quality ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( vstats_filename  & &  frame_size ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                do_video_stats ( output_files [ ost - > file_index ] . ctx ,  ost ,  frame_size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# if CONFIG_AVFILTER 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            frame_available  =  ost - > output_video_filter  & &  avfilter_poll_frame ( ost - > output_video_filter - > inputs [ 0 ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ost - > picref ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                avfilter_unref_buffer ( ost - > picref ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_freep ( & filtered_frame ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								fail :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    av_free ( buffer_to_free ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    av_freep ( & decoded_frame ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-21 14:39:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  transcode_subtitles ( InputStream  * ist ,  AVPacket  * pkt ,  int  * got_output )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVSubtitle  subtitle ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  i ,  ret  =  avcodec_decode_subtitle2 ( ist - > st - > codec , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                          & subtitle ,  got_output ,  pkt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ret  <  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! * got_output ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-21 21:30:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  ret ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-21 14:39:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    rate_emu_sleep ( ist ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  nb_output_streams ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        OutputStream  * ost  =  & output_streams [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! check_output_constraints ( ist ,  ost )  | |  ! ost - > encoding_needed ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        do_subtitle_out ( output_files [ ost - > file_index ] . ctx ,  ost ,  ist ,  & subtitle ,  pkt - > pts ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    avsubtitle_free ( & subtitle ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-21 21:30:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  ret ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-21 14:39:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								/* pkt = NULL means EOF (needed to flush decoder buffers) */  
						 
					
						
							
								
									
										
										
										
											2011-11-22 07:17:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  output_packet ( InputStream  * ist ,  
						 
					
						
							
								
									
										
										
										
											2011-08-17 10:21:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                         OutputStream  * ost_table ,  int  nb_ostreams , 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                         const  AVPacket  * pkt ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-11-22 07:13:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int  i ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    int  got_output ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int64_t  pkt_pts  =  AV_NOPTS_VALUE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVPacket  avpkt ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-22 07:16:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ist - > next_pts  = =  AV_NOPTS_VALUE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ist - > next_pts  =  ist - > pts ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( pkt  = =  NULL )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* EOF handling */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_init_packet ( & avpkt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        avpkt . data  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        avpkt . size  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        goto  handle_eof ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        avpkt  =  * pkt ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if ( pkt - > dts  ! =  AV_NOPTS_VALUE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ist - > next_pts  =  ist - > pts  =  av_rescale_q ( pkt - > dts ,  ist - > st - > time_base ,  AV_TIME_BASE_Q ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if ( pkt - > pts  ! =  AV_NOPTS_VALUE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        pkt_pts  =  av_rescale_q ( pkt - > pts ,  ist - > st - > time_base ,  AV_TIME_BASE_Q ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    //while we have more to decode or while the decoder did output something on EOF
 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-21 14:05:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    while  ( ist - > decoding_needed  & &  ( avpkt . size  >  0  | |  ( ! pkt  & &  got_output ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-22 07:13:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        int  ret  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    handle_eof : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-22 07:16:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ist - > pts  =  ist - > next_pts ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( avpkt . size  & &  avpkt . size  ! =  pkt - > size )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  ist - > showed_multi_packet_warning  ?  AV_LOG_VERBOSE  :  AV_LOG_WARNING , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                   " Multiple frames in a packet from stream %d \n " ,  pkt - > stream_index ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-22 07:16:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ist - > showed_multi_packet_warning  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-21 14:06:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        switch ( ist - > st - > codec - > codec_type )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-21 15:37:40 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        case  AVMEDIA_TYPE_AUDIO : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ret  =  transcode_audio     ( ist ,  & avpkt ,  & got_output ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  AVMEDIA_TYPE_VIDEO : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ret  =  transcode_video     ( ist ,  & avpkt ,  & got_output ,  & pkt_pts ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  AVMEDIA_TYPE_SUBTITLE : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ret  =  transcode_subtitles ( ist ,  & avpkt ,  & got_output ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-21 14:06:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  - 1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-23 16:17:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ret  <  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  ret ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-24 00:18:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        // touch data and size only if not EOF
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( pkt )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            avpkt . data  + =  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            avpkt . size  - =  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-21 15:37:40 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! got_output )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-21 21:30:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-21 15:37:40 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-21 13:48:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    /* handle stream copy */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-21 14:05:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ! ist - > decoding_needed )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        rate_emu_sleep ( ist ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-28 11:47:02 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ist - > pts  =  ist - > next_pts ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-21 14:05:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        switch  ( ist - > st - > codec - > codec_type )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  AVMEDIA_TYPE_AUDIO : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ist - > next_pts  + =  ( ( int64_t ) AV_TIME_BASE  *  ist - > st - > codec - > frame_size )  / 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                             ist - > st - > codec - > sample_rate ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  AVMEDIA_TYPE_VIDEO : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ist - > st - > codec - > time_base . num  ! =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                int  ticks  =  ist - > st - > parser  ?  ist - > st - > parser - > repeat_pict + 1  :  ist - > st - > codec - > ticks_per_frame ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ist - > next_pts  + =  ( ( int64_t ) AV_TIME_BASE  * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                  ist - > st - > codec - > time_base . num  *  ticks )  / 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                  ist - > st - > codec - > time_base . den ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-21 13:48:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  pkt  & &  i  <  nb_ostreams ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-22 07:13:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        OutputStream  * ost  =  & ost_table [ i ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-21 13:48:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! check_output_constraints ( ist ,  ost )  | |  ost - > encoding_needed ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        do_streamcopy ( ist ,  ost ,  pkt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 09:56:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  print_sdp ( OutputFile  * output_files ,  int  n )  
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    char  sdp [ 2048 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 09:56:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVFormatContext  * * avc  =  av_malloc ( sizeof ( * avc ) * n ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! avc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  n ;  i + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        avc [ i ]  =  output_files [ i ] . ctx ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    av_sdp_create ( avc ,  n ,  sdp ,  sizeof ( sdp ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    printf ( " SDP: \n %s \n " ,  sdp ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    fflush ( stdout ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 09:56:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    av_freep ( & avc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-06 08:49:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  init_input_stream ( int  ist_index ,  OutputStream  * output_streams ,  int  nb_output_streams ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                             char  * error ,  int  error_len ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    InputStream  * ist  =  & input_streams [ ist_index ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ist - > decoding_needed )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        AVCodec  * codec  =  ist - > dec ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! codec )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 13:00:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            snprintf ( error ,  error_len ,  " Decoder (codec id %d) not found for input stream #%d:%d " , 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-06 08:49:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ist - > st - > codec - > codec_id ,  ist - > file_index ,  ist - > st - > index ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  AVERROR ( EINVAL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* update requested sample format for the decoder based on the
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								           corresponding  encoder  sample  format  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( i  =  0 ;  i  <  nb_output_streams ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            OutputStream  * ost  =  & output_streams [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ost - > source_index  = =  ist_index )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                update_sample_fmt ( ist - > st - > codec ,  codec ,  ost - > st - > codec ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( avcodec_open2 ( ist - > st - > codec ,  codec ,  & ist - > opts )  <  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 13:00:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            snprintf ( error ,  error_len ,  " Error while opening decoder for input stream #%d:%d " , 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-06 08:49:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    ist - > file_index ,  ist - > st - > index ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  AVERROR ( EINVAL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        assert_codec_experimental ( ist - > st - > codec ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        assert_avoptions ( ist - > opts ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ist - > pts  =  ist - > st - > avg_frame_rate . num  ?  -  ist - > st - > codec - > has_b_frames * AV_TIME_BASE  /  av_q2d ( ist - > st - > avg_frame_rate )  :  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ist - > next_pts  =  AV_NOPTS_VALUE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    init_pts_correction ( & ist - > pts_ctx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ist - > is_start  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-19 14:45:02 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  transcode_init ( OutputFile  * output_files ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                          int  nb_output_files , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                          InputFile  * input_files , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                          int  nb_input_files ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-08-31 22:24:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int  ret  =  0 ,  i ,  j ,  k ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:23:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    AVFormatContext  * oc ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    AVCodecContext  * codec ,  * icodec ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 10:21:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    OutputStream  * ost ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    InputStream  * ist ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    char  error [ 1024 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  want_sdp  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 10:27:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    /* init framerate emulation */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  nb_input_files ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        InputFile  * ifile  =  & input_files [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ifile - > rate_emu ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  ( j  =  0 ;  j  <  ifile - > nb_streams ;  j + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                input_streams [ j  +  ifile - > ist_index ] . start  =  av_gettime ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* output stream init */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  nb_output_files ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:23:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        oc  =  output_files [ i ] . ctx ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! oc - > nb_streams  & &  ! ( oc - > oformat - > flags  &  AVFMT_NOSTREAMS ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            av_dump_format ( oc ,  i ,  oc - > filename ,  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_ERROR ,  " Output file #%d does not contain any stream \n " ,  i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-19 14:45:02 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  AVERROR ( EINVAL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* for each output stream, we compute the right encoding parameters */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 10:21:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  nb_output_streams ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost  =  & output_streams [ i ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        oc   =  output_files [ ost - > file_index ] . ctx ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        ist  =  & input_streams [ ost - > source_index ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-30 07:10:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ost - > attachment_filename ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        codec   =  ost - > st - > codec ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        icodec  =  ist - > st - > codec ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ost - > st - > disposition           =  ist - > st - > disposition ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        codec - > bits_per_raw_sample     =  icodec - > bits_per_raw_sample ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        codec - > chroma_sample_location  =  icodec - > chroma_sample_location ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-23 11:22:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ost - > stream_copy )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            uint64_t  extra_size  =  ( uint64_t ) icodec - > extradata_size  +  FF_INPUT_BUFFER_PADDING_SIZE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-19 11:26:21 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( extra_size  >  INT_MAX )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-19 14:45:02 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                return  AVERROR ( EINVAL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-19 11:26:21 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            /* if stream_copy is selected, no need to decode or encode */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            codec - > codec_id    =  icodec - > codec_id ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            codec - > codec_type  =  icodec - > codec_type ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( ! codec - > codec_tag )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( ! oc - > oformat - > codec_tag  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                     av_codec_get_id  ( oc - > oformat - > codec_tag ,  icodec - > codec_tag )  = =  codec - > codec_id  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                     av_codec_get_tag ( oc - > oformat - > codec_tag ,  icodec - > codec_id )  < =  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    codec - > codec_tag  =  icodec - > codec_tag ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            codec - > bit_rate        =  icodec - > bit_rate ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            codec - > rc_max_rate     =  icodec - > rc_max_rate ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            codec - > rc_buffer_size  =  icodec - > rc_buffer_size ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            codec - > extradata       =  av_mallocz ( extra_size ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-19 11:26:21 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( ! codec - > extradata )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-19 14:45:02 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                return  AVERROR ( ENOMEM ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-19 11:26:21 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            memcpy ( codec - > extradata ,  icodec - > extradata ,  icodec - > extradata_size ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            codec - > extradata_size  =  icodec - > extradata_size ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-29 11:10:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( ! copy_tb )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                codec - > time_base       =  icodec - > time_base ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                codec - > time_base . num  * =  icodec - > ticks_per_frame ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                av_reduce ( & codec - > time_base . num ,  & codec - > time_base . den , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                          codec - > time_base . num ,  codec - > time_base . den ,  INT_MAX ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            }  else 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                codec - > time_base  =  ist - > st - > time_base ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            switch ( codec - > codec_type )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            case  AVMEDIA_TYPE_AUDIO : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if ( audio_volume  ! =  256 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    av_log ( NULL ,  AV_LOG_FATAL ,  " -acodec copy and -vol are incompatible (frames are not decoded) \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                codec - > channel_layout      =  icodec - > channel_layout ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                codec - > sample_rate         =  icodec - > sample_rate ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                codec - > channels            =  icodec - > channels ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                codec - > frame_size          =  icodec - > frame_size ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                codec - > audio_service_type  =  icodec - > audio_service_type ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                codec - > block_align         =  icodec - > block_align ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            case  AVMEDIA_TYPE_VIDEO : 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                codec - > pix_fmt             =  icodec - > pix_fmt ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                codec - > width               =  icodec - > width ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                codec - > height              =  icodec - > height ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                codec - > has_b_frames        =  icodec - > has_b_frames ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                if  ( ! codec - > sample_aspect_ratio . num )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    codec - > sample_aspect_ratio    = 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    ost - > st - > sample_aspect_ratio  = 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ist - > st - > sample_aspect_ratio . num  ?  ist - > st - > sample_aspect_ratio  : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ist - > st - > codec - > sample_aspect_ratio . num  ? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ist - > st - > codec - > sample_aspect_ratio  :  ( AVRational ) { 0 ,  1 } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            case  AVMEDIA_TYPE_SUBTITLE : 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                codec - > width   =  icodec - > width ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                codec - > height  =  icodec - > height ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            case  AVMEDIA_TYPE_DATA : 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-27 10:37:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            case  AVMEDIA_TYPE_ATTACHMENT : 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                abort ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ! ost - > enc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ost - > enc  =  avcodec_find_encoder ( ost - > st - > codec - > codec_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-27 08:16:26 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ist - > decoding_needed  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ost - > encoding_needed  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            switch ( codec - > codec_type )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            case  AVMEDIA_TYPE_AUDIO : 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ost - > fifo  =  av_fifo_alloc ( 1024 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-19 11:26:21 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ( ! ost - > fifo )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-19 14:45:02 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    return  AVERROR ( ENOMEM ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-19 11:26:21 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                ost - > reformat_pair  =  MAKE_SFMT_PAIR ( AV_SAMPLE_FMT_NONE , AV_SAMPLE_FMT_NONE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-22 18:29:14 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ( ! codec - > sample_rate ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    codec - > sample_rate  =  icodec - > sample_rate ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                choose_sample_rate ( ost - > st ,  ost - > enc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                codec - > time_base  =  ( AVRational ) { 1 ,  codec - > sample_rate } ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                if  ( codec - > sample_fmt  = =  AV_SAMPLE_FMT_NONE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    codec - > sample_fmt  =  icodec - > sample_fmt ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                choose_sample_fmt ( ost - > st ,  ost - > enc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                if  ( ! codec - > channels ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    codec - > channels  =  icodec - > channels ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                codec - > channel_layout  =  icodec - > channel_layout ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( av_get_channel_layout_nb_channels ( codec - > channel_layout )  ! =  codec - > channels ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    codec - > channel_layout  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ost - > audio_resample        =  codec - >  sample_rate  ! =  icodec - > sample_rate  | |  audio_sync_method  >  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                icodec - > request_channels   =  codec - >  channels ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                ost - > resample_sample_fmt   =  icodec - > sample_fmt ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ost - > resample_sample_rate  =  icodec - > sample_rate ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ost - > resample_channels     =  icodec - > channels ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            case  AVMEDIA_TYPE_VIDEO : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( codec - > pix_fmt  = =  PIX_FMT_NONE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    codec - > pix_fmt  =  icodec - > pix_fmt ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                choose_pixel_fmt ( ost - > st ,  ost - > enc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( ost - > st - > codec - > pix_fmt  = =  PIX_FMT_NONE )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    av_log ( NULL ,  AV_LOG_FATAL ,  " Video pixel format is unknown, stream cannot be encoded \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( ! codec - > width  | |  ! codec - > height )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    codec - > width   =  icodec - > width ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    codec - > height  =  icodec - > height ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ost - > video_resample  =  codec - > width    ! =  icodec - > width   | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                      codec - > height   ! =  icodec - > height  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                      codec - > pix_fmt  ! =  icodec - > pix_fmt ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( ost - > video_resample )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# if !CONFIG_AVFILTER 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    avcodec_get_frame_defaults ( & ost - > pict_tmp ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if ( avpicture_alloc ( ( AVPicture * ) & ost - > pict_tmp ,  codec - > pix_fmt , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                       codec - > width ,  codec - > height ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        av_log ( NULL ,  AV_LOG_FATAL ,  " Cannot allocate temp picture, check pix fmt \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ost - > img_resample_ctx  =  sws_getContext ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        icodec - > width , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        icodec - > height , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        icodec - > pix_fmt , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        codec - > width , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        codec - > height , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        codec - > pix_fmt , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ost - > sws_flags ,  NULL ,  NULL ,  NULL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  ( ost - > img_resample_ctx  = =  NULL )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        av_log ( NULL ,  AV_LOG_FATAL ,  " Cannot get resampling context \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    codec - > bits_per_raw_sample =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ost - > resample_height   =  icodec - > height ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ost - > resample_width    =  icodec - > width ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ost - > resample_pix_fmt  =  icodec - > pix_fmt ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( ! ost - > frame_rate . num ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ost - > frame_rate  =  ist - > st - > r_frame_rate . num  ?  ist - > st - > r_frame_rate  :  ( AVRational ) { 25 , 1 } ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ( ost - > enc  & &  ost - > enc - > supported_framerates  & &  ! ost - > force_fps )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    int  idx  =  av_find_nearest_q_idx ( ost - > frame_rate ,  ost - > enc - > supported_framerates ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ost - > frame_rate  =  ost - > enc - > supported_framerates [ idx ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                codec - > time_base  =  ( AVRational ) { ost - > frame_rate . den ,  ost - > frame_rate . num } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# if CONFIG_AVFILTER 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( configure_video_filters ( ist ,  ost ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    av_log ( NULL ,  AV_LOG_FATAL ,  " Error opening filters! \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    exit ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            case  AVMEDIA_TYPE_SUBTITLE : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                abort ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            /* two pass mode */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-27 08:21:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( ( codec - > flags  &  ( CODEC_FLAG_PASS1  |  CODEC_FLAG_PASS2 ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                char  logfilename [ 1024 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                FILE  * f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                snprintf ( logfilename ,  sizeof ( logfilename ) ,  " %s-%d.log " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                         pass_logfilename_prefix  ?  pass_logfilename_prefix  :  DEFAULT_PASS_LOGFILENAME_PREFIX , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                         i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( codec - > flags  &  CODEC_FLAG_PASS1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    f  =  fopen ( logfilename ,  " wb " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  ( ! f )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        av_log ( NULL ,  AV_LOG_FATAL ,  " Cannot write log file '%s' for pass-1 encoding: %s \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                               logfilename ,  strerror ( errno ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ost - > logfile  =  f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    char   * logbuffer ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    size_t  logbuffer_size ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-07 11:49:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    if  ( cmdutils_read_file ( logfilename ,  & logbuffer ,  & logbuffer_size )  <  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        av_log ( NULL ,  AV_LOG_FATAL ,  " Error reading log file '%s' for pass-2 encoding \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                               logfilename ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    codec - > stats_in  =  logbuffer ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if ( codec - > codec_type  = =  AVMEDIA_TYPE_VIDEO ) { 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            int         size  =  codec - > width  *  codec - > height ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            bit_buffer_size  =  FFMAX ( bit_buffer_size ,  6 * size  +  200 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! bit_buffer ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        bit_buffer  =  av_malloc ( bit_buffer_size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! bit_buffer )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_ERROR ,  " Cannot allocate %d bytes output buffer \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								               bit_buffer_size ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-19 14:45:02 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  AVERROR ( ENOMEM ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* open each encoder */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 10:21:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  nb_output_streams ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost  =  & output_streams [ i ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  ( ost - > encoding_needed )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            AVCodec       * codec  =  ost - > enc ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            AVCodecContext  * dec  =  input_streams [ ost - > source_index ] . st - > codec ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ! codec )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 13:00:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                snprintf ( error ,  sizeof ( error ) ,  " Encoder (codec id %d) not found for output stream #%d:%d " , 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                         ost - > st - > codec - > codec_id ,  ost - > file_index ,  ost - > index ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ret  =  AVERROR ( EINVAL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                goto  dump_format ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( dec - > subtitle_header )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ost - > st - > codec - > subtitle_header  =  av_malloc ( dec - > subtitle_header_size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( ! ost - > st - > codec - > subtitle_header )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ret  =  AVERROR ( ENOMEM ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    goto  dump_format ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                memcpy ( ost - > st - > codec - > subtitle_header ,  dec - > subtitle_header ,  dec - > subtitle_header_size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ost - > st - > codec - > subtitle_header_size  =  dec - > subtitle_header_size ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( avcodec_open2 ( ost - > st - > codec ,  codec ,  & ost - > opts )  <  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 13:00:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                snprintf ( error ,  sizeof ( error ) ,  " Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height " , 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                        ost - > file_index ,  ost - > index ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ret  =  AVERROR ( EINVAL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                goto  dump_format ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            assert_codec_experimental ( ost - > st - > codec ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            assert_avoptions ( ost - > opts ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ost - > st - > codec - > bit_rate  & &  ost - > st - > codec - > bit_rate  <  1000 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                av_log ( NULL ,  AV_LOG_WARNING ,  " The bitrate parameter is set too low. " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                             " It takes bits/s as argument, not kbits/s \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            extra_size  + =  ost - > st - > codec - > extradata_size ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-02 17:06:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ost - > st - > codec - > me_threshold ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                input_streams [ ost - > source_index ] . st - > codec - > debug  | =  FF_DEBUG_MV ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-06 08:49:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    /* init input streams */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  nb_input_streams ;  i + + ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 03:46:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ( ret  =  init_input_stream ( i ,  output_streams ,  nb_output_streams ,  error ,  sizeof ( error ) ) )  <  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-06 08:49:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            goto  dump_format ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 22:24:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    /* discard unused programs */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  nb_input_files ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        InputFile  * ifile  =  & input_files [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( j  =  0 ;  j  <  ifile - > ctx - > nb_programs ;  j + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            AVProgram  * p  =  ifile - > ctx - > programs [ j ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            int  discard   =  AVDISCARD_ALL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  ( k  =  0 ;  k  <  p - > nb_stream_indexes ;  k + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( ! input_streams [ ifile - > ist_index  +  p - > stream_index [ k ] ] . discard )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    discard  =  AVDISCARD_DEFAULT ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            p - > discard  =  discard ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    /* open files and write file headers */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 09:56:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  nb_output_files ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:23:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        oc  =  output_files [ i ] . ctx ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        oc - > interrupt_callback  =  int_cb ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( avformat_write_header ( oc ,  & output_files [ i ] . opts )  <  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            snprintf ( error ,  sizeof ( error ) ,  " Could not write header for output file #%d (incorrect codec parameters ?) " ,  i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ret  =  AVERROR ( EINVAL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            goto  dump_format ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 09:56:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        assert_avoptions ( output_files [ i ] . opts ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:23:55 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( strcmp ( oc - > oformat - > name ,  " rtp " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            want_sdp  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 dump_format : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* dump the file output parameters - cannot be done before in case
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								       of  stream  copy  */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-20 12:32:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  nb_output_files ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 09:56:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        av_dump_format ( output_files [ i ] . ctx ,  i ,  output_files [ i ] . ctx - > filename ,  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* dump the stream mapping */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    av_log ( NULL ,  AV_LOG_INFO ,  " Stream mapping: \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  nb_output_streams ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost  =  & output_streams [ i ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-30 07:10:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ost - > attachment_filename )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            /* an attached file */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_INFO ,  "   File %s -> Stream #%d:%d \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                   ost - > attachment_filename ,  ost - > file_index ,  ost - > index ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 13:00:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_INFO ,  "   Stream #%d:%d -> #%d:%d " , 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								               input_streams [ ost - > source_index ] . file_index , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								               input_streams [ ost - > source_index ] . st - > index , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								               ost - > file_index , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								               ost - > index ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ost - > sync_ist  ! =  & input_streams [ ost - > source_index ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 13:00:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_INFO ,  "  [sync #%d:%d] " , 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                   ost - > sync_ist - > file_index , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                   ost - > sync_ist - > st - > index ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-23 11:22:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ost - > stream_copy ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_INFO ,  "  (copy) " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_INFO ,  "  (%s -> %s) " ,  input_streams [ ost - > source_index ] . dec  ? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                   input_streams [ ost - > source_index ] . dec - > name  :  " ? " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                   ost - > enc  ?  ost - > enc - > name  :  " ? " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_INFO ,  " \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ret )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_ERROR ,  " %s \n " ,  error ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-19 14:45:02 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  ret ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( want_sdp )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        print_sdp ( output_files ,  nb_output_files ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-19 14:45:02 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/*
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  The  following  code  is  the  main  loop  of  the  file  converter 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  transcode ( OutputFile  * output_files ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                     int  nb_output_files , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                     InputFile  * input_files , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                     int  nb_input_files ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  ret ,  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVFormatContext  * is ,  * os ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    OutputStream  * ost ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    InputStream  * ist ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    uint8_t  * no_packet ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  no_packet_count = 0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int64_t  timer_start ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! ( no_packet  =  av_mallocz ( nb_input_files ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret  =  transcode_init ( output_files ,  nb_output_files ,  input_files ,  nb_input_files ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ret  <  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        goto  fail ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    av_log ( NULL ,  AV_LOG_INFO ,  " Press ctrl-c to stop encoding \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    term_init ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    timer_start  =  av_gettime ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for ( ;  received_sigterm  = =  0 ; )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        int  file_index ,  ist_index ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        AVPacket  pkt ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-16 14:41:16 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        int64_t  ipts_min ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        double  opts_min ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-16 14:41:16 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ipts_min  =  INT64_MAX ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        opts_min =  1e100 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* select the stream that we must read now by looking at the
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								           smallest  output  pts  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        file_index  =  - 1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 10:21:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  ( i  =  0 ;  i  <  nb_output_streams ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-19 17:52:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            OutputFile  * of ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-16 14:41:16 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            int64_t  ipts ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            double   opts ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 10:21:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ost  =  & output_streams [ i ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-19 17:52:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            of  =  & output_files [ ost - > file_index ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 09:56:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            os  =  output_files [ ost - > file_index ] . ctx ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            ist  =  & input_streams [ ost - > source_index ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-19 17:52:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( ost - > is_past_recording_time  | |  no_packet [ ist - > file_index ]  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ( os - > pb  & &  avio_tell ( os - > pb )  > =  of - > limit_filesize ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-19 17:52:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            opts  =  ost - > st - > pts . val  *  av_q2d ( ost - > st - > time_base ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-16 14:41:16 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ipts  =  ist - > pts ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            if  ( ! input_files [ ist - > file_index ] . eof_reached ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if ( ipts  <  ipts_min )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ipts_min  =  ipts ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if ( input_sync  )  file_index  =  ist - > file_index ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if ( opts  <  opts_min )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    opts_min  =  opts ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if ( ! input_sync )  file_index  =  ist - > file_index ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( ost - > frame_number  > =  ost - > max_frames )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                int  j ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-23 14:40:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                for  ( j  =  0 ;  j  <  of - > ctx - > nb_streams ;  j + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    output_streams [ of - > ost_index  +  j ] . is_past_recording_time  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* if none, if is finished */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( file_index  <  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if ( no_packet_count ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                no_packet_count = 0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 10:27:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                memset ( no_packet ,  0 ,  nb_input_files ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                usleep ( 10000 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* read a frame from it and output it in the fifo */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        is  =  input_files [ file_index ] . ctx ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ret =  av_read_frame ( is ,  & pkt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if ( ret  = =  AVERROR ( EAGAIN ) ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            no_packet [ file_index ] = 1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            no_packet_count + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ret  <  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            input_files [ file_index ] . eof_reached  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( opt_shortest ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        no_packet_count = 0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 10:27:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        memset ( no_packet ,  0 ,  nb_input_files ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( do_pkt_dump )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            av_pkt_dump_log2 ( NULL ,  AV_LOG_DEBUG ,  & pkt ,  do_hex_dump , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                             is - > streams [ pkt . stream_index ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* the following test is needed in case new streams appear
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								           dynamically  in  stream  :  we  ignore  them  */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 12:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( pkt . stream_index  > =  input_files [ file_index ] . nb_streams ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            goto  discard_packet ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ist_index  =  input_files [ file_index ] . ist_index  +  pkt . stream_index ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ist  =  & input_streams [ ist_index ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ist - > discard ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            goto  discard_packet ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( pkt . dts  ! =  AV_NOPTS_VALUE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            pkt . dts  + =  av_rescale_q ( input_files [ ist - > file_index ] . ts_offset ,  AV_TIME_BASE_Q ,  ist - > st - > time_base ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( pkt . pts  ! =  AV_NOPTS_VALUE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            pkt . pts  + =  av_rescale_q ( input_files [ ist - > file_index ] . ts_offset ,  AV_TIME_BASE_Q ,  ist - > st - > time_base ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if ( pkt . pts  ! =  AV_NOPTS_VALUE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            pkt . pts  * =  ist - > ts_scale ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if ( pkt . dts  ! =  AV_NOPTS_VALUE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            pkt . dts  * =  ist - > ts_scale ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//        fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n", ist->next_pts, pkt.dts, input_files[ist->file_index].ts_offset, ist->st->codec->codec_type);
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( pkt . dts  ! =  AV_NOPTS_VALUE  & &  ist - > next_pts  ! =  AV_NOPTS_VALUE 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            & &  ( is - > iformat - > flags  &  AVFMT_TS_DISCONT ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            int64_t  pkt_dts =  av_rescale_q ( pkt . dts ,  ist - > st - > time_base ,  AV_TIME_BASE_Q ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            int64_t  delta =  pkt_dts  -  ist - > next_pts ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if ( ( FFABS ( delta )  >  1LL * dts_delta_threshold * AV_TIME_BASE  | |  pkt_dts + 1 < ist - > pts ) & &  ! copy_ts ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                input_files [ ist - > file_index ] . ts_offset  - =  delta ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                av_log ( NULL ,  AV_LOG_DEBUG ,  " timestamp discontinuity % " PRId64 " , new offset= % " PRId64 " \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                       delta ,  input_files [ ist - > file_index ] . ts_offset ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                pkt . dts - =  av_rescale_q ( delta ,  AV_TIME_BASE_Q ,  ist - > st - > time_base ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if ( pkt . pts  ! =  AV_NOPTS_VALUE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    pkt . pts - =  av_rescale_q ( delta ,  AV_TIME_BASE_Q ,  ist - > st - > time_base ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-22 07:17:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( output_packet ( ist ,  output_streams ,  nb_output_streams ,  & pkt )  <  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 13:00:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_ERROR ,  " Error while decoding stream #%d:%d \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                   ist - > file_index ,  ist - > st - > index ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            if  ( exit_on_error ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            av_free_packet ( & pkt ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-23 13:47:31 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    discard_packet : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_free_packet ( & pkt ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* dump report by using the output first video and audio streams */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 18:46:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        print_report ( output_files ,  output_streams ,  nb_output_streams ,  0 ,  timer_start ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* at the end of stream, we must flush the decoder buffers */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  nb_input_streams ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ist  =  & input_streams [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ist - > decoding_needed )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-22 07:17:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            output_packet ( ist ,  output_streams ,  nb_output_streams ,  NULL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-19 17:52:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    flush_encoders ( output_streams ,  nb_output_streams ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    term_exit ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* write the trailer if needed and close file */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for ( i = 0 ; i < nb_output_files ; i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 09:56:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        os  =  output_files [ i ] . ctx ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        av_write_trailer ( os ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* dump report by using the first video and audio streams */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 18:46:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    print_report ( output_files ,  output_streams ,  nb_output_streams ,  1 ,  timer_start ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* close each encoder */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 10:21:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  nb_output_streams ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost  =  & output_streams [ i ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  ( ost - > encoding_needed )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            av_freep ( & ost - > st - > codec - > stats_in ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            avcodec_close ( ost - > st - > codec ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# if CONFIG_AVFILTER 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        avfilter_graph_free ( & ost - > graph ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* close each decoder */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  nb_input_streams ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ist  =  & input_streams [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ist - > decoding_needed )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            avcodec_close ( ist - > st - > codec ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* finished ! */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 fail : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    av_freep ( & bit_buffer ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 10:27:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    av_freep ( & no_packet ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 10:21:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( output_streams )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( i  =  0 ;  i  <  nb_output_streams ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ost  =  & output_streams [ i ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            if  ( ost )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-23 11:22:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ( ost - > stream_copy ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    av_freep ( & ost - > st - > codec - > extradata ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( ost - > logfile )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    fclose ( ost - > logfile ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ost - > logfile  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                av_fifo_free ( ost - > fifo ) ;  /* works even if fifo is not
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                             initialized  but  set  to  zero  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                av_freep ( & ost - > st - > codec - > subtitle_header ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                av_free ( ost - > pict_tmp . data [ 0 ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                av_free ( ost - > forced_kf_pts ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( ost - > video_resample ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    sws_freeContext ( ost - > img_resample_ctx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( ost - > resample ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    audio_resample_close ( ost - > resample ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( ost - > reformat_ctx ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    av_audio_convert_free ( ost - > reformat_ctx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                av_dict_free ( & ost - > opts ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  double  parse_frame_aspect_ratio ( const  char  * arg )  
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  x  =  0 ,  y  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    double  ar  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  char  * p ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    char  * end ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    p  =  strchr ( arg ,  ' : ' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( p )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        x  =  strtol ( arg ,  & end ,  10 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( end  = =  p ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            y  =  strtol ( end + 1 ,  & end ,  10 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( x  >  0  & &  y  >  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ar  =  ( double ) x  /  ( double ) y ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ar  =  strtod ( arg ,  NULL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! ar )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_FATAL ,  " Incorrect aspect ratio specification. \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  ar ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  opt_audio_codec ( OptionsContext  * o ,  const  char  * opt ,  const  char  * arg )  
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  parse_option ( o ,  " codec:a " ,  arg ,  options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  opt_video_codec ( OptionsContext  * o ,  const  char  * opt ,  const  char  * arg )  
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  parse_option ( o ,  " codec:v " ,  arg ,  options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  opt_subtitle_codec ( OptionsContext  * o ,  const  char  * opt ,  const  char  * arg )  
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  parse_option ( o ,  " codec:s " ,  arg ,  options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  opt_data_codec ( OptionsContext  * o ,  const  char  * opt ,  const  char  * arg )  
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  parse_option ( o ,  " codec:d " ,  arg ,  options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 17:21:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  opt_map ( OptionsContext  * o ,  const  char  * opt ,  const  char  * arg )  
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-07-29 15:21:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    StreamMap  * m  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  i ,  negative  =  0 ,  file_idx ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  sync_file_idx  =  - 1 ,  sync_stream_idx ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    char  * p ,  * sync ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    char  * map ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 15:21:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( * arg  = =  ' - ' )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        negative  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        arg + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    map  =  av_strdup ( arg ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 15:21:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    /* parse sync stream first, just pick first matching stream */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( sync  =  strchr ( map ,  ' , ' ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        * sync  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        sync_file_idx  =  strtol ( sync  +  1 ,  & sync ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( sync_file_idx  > =  nb_input_files  | |  sync_file_idx  <  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-12 21:51:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_FATAL ,  " Invalid sync file index: %d. \n " ,  sync_file_idx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 15:21:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( * sync ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            sync + + ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 12:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  ( i  =  0 ;  i  <  input_files [ sync_file_idx ] . nb_streams ;  i + + ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 15:21:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( check_stream_specifier ( input_files [ sync_file_idx ] . ctx , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                       input_files [ sync_file_idx ] . ctx - > streams [ i ] ,  sync )  = =  1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                sync_stream_idx  =  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 12:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( i  = =  input_files [ sync_file_idx ] . nb_streams )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-12 21:51:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_FATAL ,  " Sync stream specification in map %s does not  " 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 15:21:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                       " match any streams. \n " ,  arg ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 15:21:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    file_idx  =  strtol ( map ,  & p ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( file_idx  > =  nb_input_files  | |  file_idx  <  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-12 21:51:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_FATAL ,  " Invalid input file index: %d. \n " ,  file_idx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 15:21:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 15:21:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( negative ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* disable some already defined maps */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 17:21:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  ( i  =  0 ;  i  <  o - > nb_stream_maps ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            m  =  & o - > stream_maps [ i ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-29 07:58:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( file_idx  = =  m - > file_index  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                check_stream_specifier ( input_files [ m - > file_index ] . ctx , 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 15:21:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                       input_files [ m - > file_index ] . ctx - > streams [ m - > stream_index ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                       * p  = =  ' : '  ?  p  +  1  :  p )  >  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                m - > disabled  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 12:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  ( i  =  0 ;  i  <  input_files [ file_idx ] . nb_streams ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 15:21:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( check_stream_specifier ( input_files [ file_idx ] . ctx ,  input_files [ file_idx ] . ctx - > streams [ i ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        * p  = =  ' : '  ?  p  +  1  :  p )  < =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 17:21:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            o - > stream_maps  =  grow_array ( o - > stream_maps ,  sizeof ( * o - > stream_maps ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                        & o - > nb_stream_maps ,  o - > nb_stream_maps  +  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            m  =  & o - > stream_maps [ o - > nb_stream_maps  -  1 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 15:21:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            m - > file_index    =  file_idx ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            m - > stream_index  =  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( sync_file_idx  > =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                m - > sync_file_index    =  sync_file_idx ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                m - > sync_stream_index  =  sync_stream_idx ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                m - > sync_file_index    =  file_idx ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                m - > sync_stream_index  =  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! m )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-12 21:51:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_FATAL ,  " Stream map '%s' matches no streams. \n " ,  arg ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 15:21:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    av_freep ( & map ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-30 07:10:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  opt_attach ( OptionsContext  * o ,  const  char  * opt ,  const  char  * arg )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    o - > attachments  =  grow_array ( o - > attachments ,  sizeof ( * o - > attachments ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                & o - > nb_attachments ,  o - > nb_attachments  +  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    o - > attachments [ o - > nb_attachments  -  1 ]  =  arg ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 13:07:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  parse_meta_type ( char  * arg ,  char  * type ,  int  * index )  
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( * arg )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-05 11:39:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        * type  =  * arg ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        switch  ( * arg )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  ' g ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  ' s ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  ' c ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  ' p ' : 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 13:07:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( * ( + + arg )  = =  ' : ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                * index  =  strtol ( + + arg ,  NULL ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        default : 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_FATAL ,  " Invalid metadata type %c. \n " ,  * arg ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        * type  =  ' g ' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  opt_map_metadata ( OptionsContext  * o ,  const  char  * opt ,  const  char  * arg )  
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    MetadataMap  * m ,  * m1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    char  * p ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    o - > meta_data_maps  =  grow_array ( o - > meta_data_maps ,  sizeof ( * o - > meta_data_maps ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                   & o - > nb_meta_data_maps ,  o - > nb_meta_data_maps  +  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    m  =  & o - > meta_data_maps [ o - > nb_meta_data_maps  -  1 ] [ 1 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    m - > file  =  strtol ( arg ,  & p ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    parse_meta_type ( * p  ?  p  +  1  :  p ,  & m - > type ,  & m - > index ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    m1  =  & o - > meta_data_maps [ o - > nb_meta_data_maps  -  1 ] [ 0 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 13:07:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( p  =  strchr ( opt ,  ' : ' ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        parse_meta_type ( p  +  1 ,  & m1 - > type ,  & m1 - > index ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 13:07:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        m1 - > type  =  ' g ' ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( m - > type  = =  ' g '  | |  m1 - > type  = =  ' g ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        o - > metadata_global_manual  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    if  ( m - > type  = =  ' s '  | |  m1 - > type  = =  ' s ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        o - > metadata_streams_manual  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    if  ( m - > type  = =  ' c '  | |  m1 - > type  = =  ' c ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        o - > metadata_chapters_manual  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-23 11:10:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  AVCodec  * find_codec_or_die ( const  char  * name ,  enum  AVMediaType  type ,  int  encoder )  
						 
					
						
							
								
									
										
										
										
											2011-08-13 08:08:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  char  * codec_string  =  encoder  ?  " encoder "  :  " decoder " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVCodec  * codec ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    codec  =  encoder  ? 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        avcodec_find_encoder_by_name ( name )  : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        avcodec_find_decoder_by_name ( name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if ( ! codec )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-12 21:51:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_FATAL ,  " Unknown %s '%s' \n " ,  codec_string ,  name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 08:08:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if ( codec - > type  ! =  type )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-12 21:51:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_FATAL ,  " Invalid %s type '%s' \n " ,  codec_string ,  name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 08:08:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-23 11:10:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  codec ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 08:08:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-23 11:10:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  AVCodec  * choose_decoder ( OptionsContext  * o ,  AVFormatContext  * s ,  AVStream  * st )  
						 
					
						
							
								
									
										
										
										
											2011-08-13 08:08:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    char  * codec_name  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    MATCH_PER_STREAM_OPT ( codec_names ,  str ,  codec_name ,  s ,  st ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-23 11:10:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( codec_name )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        AVCodec  * codec  =  find_codec_or_die ( codec_name ,  st - > codec - > codec_type ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        st - > codec - > codec_id  =  codec - > id ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  codec ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  avcodec_find_decoder ( st - > codec - > codec_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 08:08:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-05 19:38:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/**
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Add  all  the  streams  from  the  given  input  file  to  the  global 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  list  of  input  streams . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  add_input_streams ( OptionsContext  * o ,  AVFormatContext  * ic )  
						 
					
						
							
								
									
										
										
										
											2011-07-05 19:38:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int  i ,  rfps ,  rfps_base ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-05 19:38:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  ic - > nb_streams ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        AVStream  * st  =  ic - > streams [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        AVCodecContext  * dec  =  st - > codec ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        InputStream  * ist ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        input_streams  =  grow_array ( input_streams ,  sizeof ( * input_streams ) ,  & nb_input_streams ,  nb_input_streams  +  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ist  =  & input_streams [ nb_input_streams  -  1 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ist - > st  =  st ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ist - > file_index  =  nb_input_files ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ist - > discard  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ist - > opts  =  filter_codec_opts ( codec_opts ,  ist - > st - > codec - > codec_id ,  ic ,  st ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 10:32:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ist - > ts_scale  =  1.0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        MATCH_PER_STREAM_OPT ( ts_scale ,  dbl ,  ist - > ts_scale ,  ic ,  st ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-05 19:38:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-23 11:10:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ist - > dec  =  choose_decoder ( o ,  ic ,  st ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-05 19:38:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        switch  ( dec - > codec_type )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  AVMEDIA_TYPE_AUDIO : 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:51:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( o - > audio_disable ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-05 19:38:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                st - > discard =  AVDISCARD_ALL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  AVMEDIA_TYPE_VIDEO : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            rfps       =  ic - > streams [ i ] - > r_frame_rate . num ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            rfps_base  =  ic - > streams [ i ] - > r_frame_rate . den ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( dec - > lowres )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                dec - > flags  | =  CODEC_FLAG_EMU_EDGE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                dec - > height  > > =  dec - > lowres ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                dec - > width   > > =  dec - > lowres ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( dec - > time_base . den  ! =  rfps * dec - > ticks_per_frame  | |  dec - > time_base . num  ! =  rfps_base )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                av_log ( NULL ,  AV_LOG_INFO , " \n Seems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d) \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                       i ,  ( float ) dec - > time_base . den  /  dec - > time_base . num ,  dec - > time_base . den ,  dec - > time_base . num , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                       ( float ) rfps  /  rfps_base ,  rfps ,  rfps_base ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-05 19:38:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:51:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( o - > video_disable ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-05 19:38:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                st - > discard =  AVDISCARD_ALL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            else  if ( video_discard ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                st - > discard =  video_discard ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  AVMEDIA_TYPE_DATA : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  AVMEDIA_TYPE_SUBTITLE : 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:51:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( o - > subtitle_disable ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-05 19:38:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                st - > discard  =  AVDISCARD_ALL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  AVMEDIA_TYPE_ATTACHMENT : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  AVMEDIA_TYPE_UNKNOWN : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            abort ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-02 21:50:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  assert_file_overwrite ( const  char  * filename )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! file_overwrite  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ( strchr ( filename ,  ' : ' )  = =  NULL  | |  filename [ 1 ]  = =  ' : '  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								         av_strstart ( filename ,  " file: " ,  NULL ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( avio_check ( filename ,  0 )  = =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ! using_stdin )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                fprintf ( stderr , " File '%s' already exists. Overwrite ? [y/N]  " ,  filename ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                fflush ( stderr ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( ! read_yesno ( ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    fprintf ( stderr ,  " Not overwriting - exiting \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                fprintf ( stderr , " File '%s' already exists. Exiting. \n " ,  filename ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  dump_attachment ( AVStream  * st ,  const  char  * filename )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVIOContext  * out  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVDictionaryEntry  * e ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! st - > codec - > extradata_size )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_WARNING ,  " No extradata to dump in stream #%d:%d. \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								               nb_input_files  -  1 ,  st - > index ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! * filename  & &  ( e  =  av_dict_get ( st - > metadata ,  " filename " ,  NULL ,  0 ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        filename  =  e - > value ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! * filename )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_FATAL ,  " No filename specified and no 'filename' tag " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								               " in stream #%d:%d. \n " ,  nb_input_files  -  1 ,  st - > index ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    assert_file_overwrite ( filename ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 23:22:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ( ret  =  avio_open2 ( & out ,  filename ,  AVIO_FLAG_WRITE ,  & int_cb ,  NULL ) )  <  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-02 21:50:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_FATAL ,  " Could not open file %s for writing. \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								               filename ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    avio_write ( out ,  st - > codec - > extradata ,  st - > codec - > extradata_size ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    avio_flush ( out ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    avio_close ( out ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 17:21:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  opt_input_file ( OptionsContext  * o ,  const  char  * opt ,  const  char  * filename )  
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVFormatContext  * ic ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVInputFormat  * file_iformat  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-05 19:38:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int  err ,  i ,  ret ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    int64_t  timestamp ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    uint8_t  buf [ 128 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVDictionary  * * opts ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  orig_nb_streams ;                      // number of streams before avformat_find_stream_info
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( o - > format )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! ( file_iformat  =  av_find_input_format ( o - > format ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_FATAL ,  " Unknown input format: '%s' \n " ,  o - > format ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! strcmp ( filename ,  " - " ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        filename  =  " pipe: " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    using_stdin  | =  ! strncmp ( filename ,  " pipe: " ,  5 )  | | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ! strcmp ( filename ,  " /dev/stdin " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* get default parameters from command line */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ic  =  avformat_alloc_context ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! ic )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        print_error ( filename ,  AVERROR ( ENOMEM ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( o - > nb_audio_sample_rate )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        snprintf ( buf ,  sizeof ( buf ) ,  " %d " ,  o - > audio_sample_rate [ o - > nb_audio_sample_rate  -  1 ] . u . i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        av_dict_set ( & format_opts ,  " sample_rate " ,  buf ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( o - > nb_audio_channels )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        snprintf ( buf ,  sizeof ( buf ) ,  " %d " ,  o - > audio_channels [ o - > nb_audio_channels  -  1 ] . u . i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        av_dict_set ( & format_opts ,  " channels " ,  buf ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( o - > nb_frame_rates )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_dict_set ( & format_opts ,  " framerate " ,  o - > frame_rates [ o - > nb_frame_rates  -  1 ] . u . str ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( o - > nb_frame_sizes )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_dict_set ( & format_opts ,  " video_size " ,  o - > frame_sizes [ o - > nb_frame_sizes  -  1 ] . u . str ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( o - > nb_frame_pix_fmts ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_dict_set ( & format_opts ,  " pixel_format " ,  o - > frame_pix_fmts [ o - > nb_frame_pix_fmts  -  1 ] . u . str ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ic - > flags  | =  AVFMT_FLAG_NONBLOCK ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 23:22:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ic - > interrupt_callback  =  int_cb ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* open the input file with generic libav function */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    err  =  avformat_open_input ( & ic ,  filename ,  file_iformat ,  & format_opts ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( err  <  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        print_error ( filename ,  err ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    assert_avoptions ( format_opts ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-08 14:29:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    /* apply forced codec ids */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  ic - > nb_streams ;  i + + ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-23 11:10:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        choose_decoder ( o ,  ic ,  ic - > streams [ i ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-08 14:29:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    /* Set AVCodecContext options for avformat_find_stream_info */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    opts  =  setup_find_stream_info_opts ( ic ,  codec_opts ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    orig_nb_streams  =  ic - > nb_streams ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* If not enough info to get the stream parameters, we decode the
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								       first  frames  to  get  it .  ( used  in  mpeg  case  for  example )  */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret  =  avformat_find_stream_info ( ic ,  opts ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ret  <  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_FATAL ,  " %s: could not find codec parameters \n " ,  filename ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        av_close_input_file ( ic ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    timestamp  =  o - > start_time ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    /* add the stream start time */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ic - > start_time  ! =  AV_NOPTS_VALUE ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        timestamp  + =  ic - > start_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* if seeking requested, we execute it */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( o - > start_time  ! =  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        ret  =  av_seek_frame ( ic ,  - 1 ,  timestamp ,  AVSEEK_FLAG_BACKWARD ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ret  <  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_WARNING ,  " %s: could not seek to position %0.3f \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                   filename ,  ( double ) timestamp  /  AV_TIME_BASE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* update the current parameters so that they match the one of the input stream */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    add_input_streams ( o ,  ic ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* dump the file content */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    av_dump_format ( ic ,  nb_input_files ,  filename ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    input_files  =  grow_array ( input_files ,  sizeof ( * input_files ) ,  & nb_input_files ,  nb_input_files  +  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    input_files [ nb_input_files  -  1 ] . ctx         =  ic ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    input_files [ nb_input_files  -  1 ] . ist_index   =  nb_input_streams  -  ic - > nb_streams ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    input_files [ nb_input_files  -  1 ] . ts_offset   =  o - > input_ts_offset  -  ( copy_ts  ?  0  :  timestamp ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 12:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    input_files [ nb_input_files  -  1 ] . nb_streams  =  ic - > nb_streams ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-22 11:10:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    input_files [ nb_input_files  -  1 ] . rate_emu    =  o - > rate_emu ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-02 21:50:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  o - > nb_dump_attachment ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        int  j ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( j  =  0 ;  j  <  ic - > nb_streams ;  j + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            AVStream  * st  =  ic - > streams [ j ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( check_stream_specifier ( ic ,  st ,  o - > dump_attachment [ i ] . specifier )  = =  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                dump_attachment ( st ,  o - > dump_attachment [ i ] . u . str ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  orig_nb_streams ;  i + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_dict_free ( & opts [ i ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    av_freep ( & opts ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 17:21:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    reset_options ( o ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 07:55:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  parse_forced_key_frames ( char  * kf ,  OutputStream  * ost ,  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                    AVCodecContext  * avctx ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    char  * p ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  n  =  1 ,  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int64_t  t ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( p  =  kf ;  * p ;  p + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( * p  = =  ' , ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            n + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ost - > forced_kf_count  =  n ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ost - > forced_kf_pts  =  av_malloc ( sizeof ( * ost - > forced_kf_pts )  *  n ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! ost - > forced_kf_pts )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_FATAL ,  " Could not allocate forced key frames array. \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  n ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        p  =  i  ?  strchr ( p ,  ' , ' )  +  1  :  kf ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        t  =  parse_time_or_die ( " force_key_frames " ,  p ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost - > forced_kf_pts [ i ]  =  av_rescale_q ( t ,  AV_TIME_BASE_Q ,  avctx - > time_base ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-10 11:52:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  uint8_t  * get_line ( AVIOContext  * s )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVIOContext  * line ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    uint8_t  * buf ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    char  c ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( avio_open_dyn_buf ( & line )  <  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_FATAL ,  " Could not alloc buffer for reading preset. \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    while  ( ( c  =  avio_r8 ( s ) )  & &  c  ! =  ' \n ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        avio_w8 ( line ,  c ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    avio_w8 ( line ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    avio_close_dyn_buf ( line ,  & buf ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  buf ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  get_preset_file_2 ( const  char  * preset_name ,  const  char  * codec_name ,  AVIOContext  * * s )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  i ,  ret  =  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    char  filename [ 1000 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  char  * base [ 3 ]  =  {  getenv ( " AVCONV_DATADIR " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            getenv ( " HOME " ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            AVCONV_DATADIR , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  FF_ARRAY_ELEMS ( base )  & &  ret ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! base [ i ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( codec_name )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            snprintf ( filename ,  sizeof ( filename ) ,  " %s%s/%s-%s.avpreset " ,  base [ i ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                     i  ! =  1  ?  " "  :  " /.avconv " ,  codec_name ,  preset_name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 23:22:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ret  =  avio_open2 ( s ,  filename ,  AVIO_FLAG_READ ,  & int_cb ,  NULL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-10 11:52:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ret )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            snprintf ( filename ,  sizeof ( filename ) ,  " %s%s/%s.avpreset " ,  base [ i ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                     i  ! =  1  ?  " "  :  " /.avconv " ,  preset_name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 23:22:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ret  =  avio_open2 ( s ,  filename ,  AVIO_FLAG_READ ,  & int_cb ,  NULL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-10 11:52:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  ret ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-23 11:10:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  choose_encoder ( OptionsContext  * o ,  AVFormatContext  * s ,  OutputStream  * ost )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    char  * codec_name  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    MATCH_PER_STREAM_OPT ( codec_names ,  str ,  codec_name ,  s ,  ost - > st ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! codec_name )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost - > st - > codec - > codec_id  =  av_guess_codec ( s - > oformat ,  NULL ,  s - > filename , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                  NULL ,  ost - > st - > codec - > codec_type ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost - > enc  =  avcodec_find_encoder ( ost - > st - > codec - > codec_id ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else  if  ( ! strcmp ( codec_name ,  " copy " ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-23 11:22:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ost - > stream_copy  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-23 11:10:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost - > enc  =  find_codec_or_die ( codec_name ,  ost - > st - > codec - > codec_type ,  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost - > st - > codec - > codec_id  =  ost - > enc - > id ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  OutputStream  * new_output_stream ( OptionsContext  * o ,  AVFormatContext  * oc ,  enum  AVMediaType  type )  
						 
					
						
							
								
									
										
										
										
											2011-08-13 08:08:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    OutputStream  * ost ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-18 11:43:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    AVStream  * st  =  avformat_new_stream ( oc ,  NULL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-10 11:52:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int  idx       =  oc - > nb_streams  -  1 ,  ret  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:51:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    char  * bsf  =  NULL ,  * next ,  * codec_tag  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:45:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    AVBitStreamFilterContext  * bsfc ,  * bsfc_prev  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 10:04:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    double  qscale  =  - 1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-10 11:52:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    char  * buf  =  NULL ,  * arg  =  NULL ,  * preset  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVIOContext  * s  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 08:08:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! st )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-12 21:51:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_FATAL ,  " Could not alloc stream. \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 08:08:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-06-18 11:43:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( oc - > nb_streams  -  1  <  o - > nb_streamid_map ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        st - > id  =  o - > streamid_map [ oc - > nb_streams  -  1 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 10:21:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    output_streams  =  grow_array ( output_streams ,  sizeof ( * output_streams ) ,  & nb_output_streams , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                nb_output_streams  +  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ost  =  & output_streams [ nb_output_streams  -  1 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 08:23:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ost - > file_index  =  nb_output_files ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 08:08:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ost - > index  =  idx ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ost - > st     =  st ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    st - > codec - > codec_type  =  type ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-23 11:10:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    choose_encoder ( o ,  oc ,  ost ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 08:08:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ost - > enc )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost - > opts   =  filter_codec_opts ( codec_opts ,  ost - > enc - > id ,  oc ,  st ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    avcodec_get_context_defaults3 ( st - > codec ,  ost - > enc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    st - > codec - > codec_type  =  type ;  // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-10 11:52:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    MATCH_PER_STREAM_OPT ( presets ,  str ,  preset ,  oc ,  st ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( preset  & &  ( ! ( ret  =  get_preset_file_2 ( preset ,  ost - > enc - > name ,  & s ) ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        do   { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            buf  =  get_line ( s ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ! buf [ 0 ]  | |  buf [ 0 ]  = =  ' # ' )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                av_free ( buf ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ! ( arg  =  strchr ( buf ,  ' = ' ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                av_log ( NULL ,  AV_LOG_FATAL ,  " Invalid line found in the preset file. \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            * arg + +  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            av_dict_set ( & ost - > opts ,  buf ,  arg ,  AV_DICT_DONT_OVERWRITE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            av_free ( buf ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }  while  ( ! s - > eof_reached ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        avio_close ( s ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ret )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_FATAL , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								               " Preset %s specified for stream %d:%d, but could not be opened. \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								               preset ,  ost - > file_index ,  ost - > index ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 10:32:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ost - > max_frames  =  INT64_MAX ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    MATCH_PER_STREAM_OPT ( max_frames ,  i64 ,  ost - > max_frames ,  oc ,  st ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:45:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    MATCH_PER_STREAM_OPT ( bitstream_filters ,  str ,  bsf ,  oc ,  st ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    while  ( bsf )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( next  =  strchr ( bsf ,  ' , ' ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            * next + +  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! ( bsfc  =  av_bitstream_filter_init ( bsf ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-12 21:51:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_FATAL ,  " Unknown bitstream filter %s \n " ,  bsf ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:45:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( bsfc_prev ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            bsfc_prev - > next  =  bsfc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ost - > bitstream_filters  =  bsfc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        bsfc_prev  =  bsfc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        bsf        =  next ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:51:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    MATCH_PER_STREAM_OPT ( codec_tags ,  str ,  codec_tag ,  oc ,  st ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( codec_tag )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        uint32_t  tag  =  strtol ( codec_tag ,  & next ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( * next ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            tag  =  AV_RL32 ( codec_tag ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        st - > codec - > codec_tag  =  tag ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 10:04:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    MATCH_PER_STREAM_OPT ( qscale ,  dbl ,  qscale ,  oc ,  st ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( qscale  > =  0  | |  same_quant )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        st - > codec - > flags  | =  CODEC_FLAG_QSCALE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        st - > codec - > global_quality  =  FF_QP2LAMBDA  *  qscale ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-27 07:42:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( oc - > oformat - > flags  &  AVFMT_GLOBALHEADER ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        st - > codec - > flags  | =  CODEC_FLAG_GLOBAL_HEADER ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-03 21:10:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    av_opt_get_int ( sws_opts ,  " sws_flags " ,  0 ,  & ost - > sws_flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 08:08:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  ost ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-02 17:57:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  parse_matrix_coeffs ( uint16_t  * dest ,  const  char  * str )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    const  char  * p  =  str ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for ( i  =  0 ; ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        dest [ i ]  =  atoi ( p ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if ( i  = =  63 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        p  =  strchr ( p ,  ' , ' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if ( ! p )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_FATAL ,  " Syntax error in matrix  \" %s \"  at coeff %d \n " ,  str ,  i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-02 17:57:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        p + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  OutputStream  * new_video_stream ( OptionsContext  * o ,  AVFormatContext  * oc )  
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVStream  * st ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    OutputStream  * ost ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVCodecContext  * video_enc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ost  =  new_output_stream ( o ,  oc ,  AVMEDIA_TYPE_VIDEO ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    st   =  ost - > st ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    video_enc  =  st - > codec ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-23 11:22:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ! ost - > stream_copy )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-02 16:06:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        const  char  * p  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        char  * forced_key_frames  =  NULL ,  * frame_rate  =  NULL ,  * frame_size  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        char  * frame_aspect_ratio  =  NULL ,  * frame_pix_fmt  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-02 21:11:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        char  * intra_matrix  =  NULL ,  * inter_matrix  =  NULL ,  * filters  =  NULL ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 10:32:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        int  i ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        MATCH_PER_STREAM_OPT ( frame_rates ,  str ,  frame_rate ,  oc ,  st ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( frame_rate  & &  av_parse_video_rate ( & ost - > frame_rate ,  frame_rate )  <  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-12 21:51:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_FATAL ,  " Invalid framerate value: %s \n " ,  frame_rate ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        MATCH_PER_STREAM_OPT ( frame_sizes ,  str ,  frame_size ,  oc ,  st ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( frame_size  & &  av_parse_video_size ( & video_enc - > width ,  & video_enc - > height ,  frame_size )  <  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-12 21:51:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_FATAL ,  " Invalid frame size: %s. \n " ,  frame_size ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        MATCH_PER_STREAM_OPT ( frame_aspect_ratios ,  str ,  frame_aspect_ratio ,  oc ,  st ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( frame_aspect_ratio ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ost - > frame_aspect_ratio  =  parse_frame_aspect_ratio ( frame_aspect_ratio ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        MATCH_PER_STREAM_OPT ( frame_pix_fmts ,  str ,  frame_pix_fmt ,  oc ,  st ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( frame_pix_fmt  & &  ( video_enc - > pix_fmt  =  av_get_pix_fmt ( frame_pix_fmt ) )  = =  PIX_FMT_NONE )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-12 21:51:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_FATAL ,  " Unknown pixel format requested: %s. \n " ,  frame_pix_fmt ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        st - > sample_aspect_ratio  =  video_enc - > sample_aspect_ratio ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-02 17:57:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        MATCH_PER_STREAM_OPT ( intra_matrices ,  str ,  intra_matrix ,  oc ,  st ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( intra_matrix )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ! ( video_enc - > intra_matrix  =  av_mallocz ( sizeof ( * video_enc - > intra_matrix )  *  64 ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-12 21:51:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                av_log ( NULL ,  AV_LOG_FATAL ,  " Could not allocate memory for intra matrix. \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-02 17:57:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            parse_matrix_coeffs ( video_enc - > intra_matrix ,  intra_matrix ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        MATCH_PER_STREAM_OPT ( inter_matrices ,  str ,  inter_matrix ,  oc ,  st ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( inter_matrix )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( ! ( video_enc - > inter_matrix  =  av_mallocz ( sizeof ( * video_enc - > inter_matrix )  *  64 ) ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-12 21:51:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                av_log ( NULL ,  AV_LOG_FATAL ,  " Could not allocate memory for inter matrix. \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-02 17:57:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            parse_matrix_coeffs ( video_enc - > inter_matrix ,  inter_matrix ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-02 16:06:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        MATCH_PER_STREAM_OPT ( rc_overrides ,  str ,  p ,  oc ,  st ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        for ( i = 0 ;  p ;  i + + ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            int  start ,  end ,  q ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            int  e = sscanf ( p ,  " %d,%d,%d " ,  & start ,  & end ,  & q ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if ( e ! = 3 ) { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                av_log ( NULL ,  AV_LOG_FATAL ,  " error parsing rc_override \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_enc - > rc_override = 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                av_realloc ( video_enc - > rc_override , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                           sizeof ( RcOverride ) * ( i + 1 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_enc - > rc_override [ i ] . start_frame =  start ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_enc - > rc_override [ i ] . end_frame   =  end ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if ( q > 0 ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                video_enc - > rc_override [ i ] . qscale =  q ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                video_enc - > rc_override [ i ] . quality_factor =  1.0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            else { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                video_enc - > rc_override [ i ] . qscale =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                video_enc - > rc_override [ i ] . quality_factor =  - q / 100.0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            p =  strchr ( p ,  ' / ' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if ( p )  p + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        video_enc - > rc_override_count = i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! video_enc - > rc_initial_buffer_occupancy ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            video_enc - > rc_initial_buffer_occupancy  =  video_enc - > rc_buffer_size * 3 / 4 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        video_enc - > intra_dc_precision =  intra_dc_precision  -  8 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* two pass mode */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( do_pass )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( do_pass  = =  1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                video_enc - > flags  | =  CODEC_FLAG_PASS1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                video_enc - > flags  | =  CODEC_FLAG_PASS2 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        MATCH_PER_STREAM_OPT ( forced_key_frames ,  str ,  forced_key_frames ,  oc ,  st ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  ( forced_key_frames ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            parse_forced_key_frames ( forced_key_frames ,  ost ,  video_enc ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 10:32:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        MATCH_PER_STREAM_OPT ( force_fps ,  i ,  ost - > force_fps ,  oc ,  st ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-02 18:03:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 10:32:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ost - > top_field_first  =  - 1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        MATCH_PER_STREAM_OPT ( top_field_first ,  i ,  ost - > top_field_first ,  oc ,  st ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-02 21:11:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 10:26:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        MATCH_PER_STREAM_OPT ( copy_initial_nonkeyframes ,  i ,  ost - > copy_initial_nonkeyframes ,  oc  , st ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-02 21:11:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# if CONFIG_AVFILTER 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        MATCH_PER_STREAM_OPT ( filters ,  str ,  filters ,  oc ,  st ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( filters ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ost - > avfilter  =  av_strdup ( filters ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 08:36:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  ost ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  OutputStream  * new_audio_stream ( OptionsContext  * o ,  AVFormatContext  * oc )  
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVStream  * st ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    OutputStream  * ost ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVCodecContext  * audio_enc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ost  =  new_output_stream ( o ,  oc ,  AVMEDIA_TYPE_AUDIO ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    st   =  ost - > st ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    audio_enc  =  st - > codec ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    audio_enc - > codec_type  =  AVMEDIA_TYPE_AUDIO ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-23 11:22:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ! ost - > stream_copy )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:51:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        char  * sample_fmt  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        MATCH_PER_STREAM_OPT ( audio_channels ,  i ,  audio_enc - > channels ,  oc ,  st ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:51:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        MATCH_PER_STREAM_OPT ( sample_fmts ,  str ,  sample_fmt ,  oc ,  st ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( sample_fmt  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ( audio_enc - > sample_fmt  =  av_get_sample_fmt ( sample_fmt ) )  = =  AV_SAMPLE_FMT_NONE )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-12 21:51:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_FATAL ,  " Invalid sample format '%s' \n " ,  sample_fmt ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:51:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        MATCH_PER_STREAM_OPT ( audio_sample_rate ,  i ,  audio_enc - > sample_rate ,  oc ,  st ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 08:36:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  ost ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  OutputStream  * new_data_stream ( OptionsContext  * o ,  AVFormatContext  * oc )  
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    OutputStream  * ost ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ost  =  new_output_stream ( o ,  oc ,  AVMEDIA_TYPE_DATA ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-23 11:22:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ! ost - > stream_copy )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_FATAL ,  " Data stream encoding not supported yet (only streamcopy) \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 08:36:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  ost ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-27 10:37:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  OutputStream  * new_attachment_stream ( OptionsContext  * o ,  AVFormatContext  * oc )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    OutputStream  * ost  =  new_output_stream ( o ,  oc ,  AVMEDIA_TYPE_ATTACHMENT ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-23 11:22:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ost - > stream_copy  =  1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-27 10:37:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  ost ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  OutputStream  * new_subtitle_stream ( OptionsContext  * o ,  AVFormatContext  * oc )  
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVStream  * st ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    OutputStream  * ost ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVCodecContext  * subtitle_enc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ost  =  new_output_stream ( o ,  oc ,  AVMEDIA_TYPE_SUBTITLE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    st   =  ost - > st ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    subtitle_enc  =  st - > codec ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    subtitle_enc - > codec_type  =  AVMEDIA_TYPE_SUBTITLE ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 08:36:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  ost ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* arg format is "output-stream-index:streamid-value". */  
						 
					
						
							
								
									
										
										
										
											2011-09-02 22:07:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  opt_streamid ( OptionsContext  * o ,  const  char  * opt ,  const  char  * arg )  
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  idx ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    char  * p ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    char  idx_str [ 16 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    av_strlcpy ( idx_str ,  arg ,  sizeof ( idx_str ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    p  =  strchr ( idx_str ,  ' : ' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! p )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_FATAL , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								               " Invalid value '%s' for option '%s', required syntax is 'index:value' \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								               arg ,  opt ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    * p + +  =  ' \0 ' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    idx  =  parse_number_or_die ( opt ,  idx_str ,  OPT_INT ,  0 ,  INT_MAX ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-02 22:07:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    o - > streamid_map  =  grow_array ( o - > streamid_map ,  sizeof ( * o - > streamid_map ) ,  & o - > nb_streamid_map ,  idx + 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    o - > streamid_map [ idx ]  =  parse_number_or_die ( opt ,  p ,  OPT_INT ,  0 ,  INT_MAX ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  copy_chapters ( InputFile  * ifile ,  OutputFile  * ofile ,  int  copy_metadata )  
						 
					
						
							
								
									
										
										
										
											2011-08-13 07:56:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    AVFormatContext  * is  =  ifile - > ctx ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AVFormatContext  * os  =  ofile - > ctx ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 07:56:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  is - > nb_chapters ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        AVChapter  * in_ch  =  is - > chapters [ i ] ,  * out_ch ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        int64_t  ts_off    =  av_rescale_q ( ofile - > start_time  -  ifile - > ts_offset , 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 07:56:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                      AV_TIME_BASE_Q ,  in_ch - > time_base ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        int64_t  rt        =  ( ofile - > recording_time  = =  INT64_MAX )  ?  INT64_MAX  : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                           av_rescale_q ( ofile - > recording_time ,  AV_TIME_BASE_Q ,  in_ch - > time_base ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 07:56:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( in_ch - > end  <  ts_off ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( rt  ! =  INT64_MAX  & &  in_ch - > start  >  rt  +  ts_off ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        out_ch  =  av_mallocz ( sizeof ( AVChapter ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! out_ch ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  AVERROR ( ENOMEM ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        out_ch - > id         =  in_ch - > id ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        out_ch - > time_base  =  in_ch - > time_base ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        out_ch - > start      =  FFMAX ( 0 ,   in_ch - > start  -  ts_off ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        out_ch - > end        =  FFMIN ( rt ,  in_ch - > end    -  ts_off ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( copy_metadata ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 07:56:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_dict_copy ( & out_ch - > metadata ,  in_ch - > metadata ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        os - > nb_chapters + + ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        os - > chapters  =  av_realloc ( os - > chapters ,  sizeof ( AVChapter ) * os - > nb_chapters ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! os - > chapters ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  AVERROR ( ENOMEM ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        os - > chapters [ os - > nb_chapters  -  1 ]  =  out_ch ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  read_avserver_streams ( OptionsContext  * o ,  AVFormatContext  * s ,  const  char  * filename )  
						 
					
						
							
								
									
										
										
										
											2011-08-13 08:08:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    int  i ,  err ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 23:22:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    AVFormatContext  * ic  =  avformat_alloc_context ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 08:08:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 23:22:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ic - > interrupt_callback  =  int_cb ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 08:08:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    err  =  avformat_open_input ( & ic ,  filename ,  NULL ,  NULL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( err  <  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  err ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* copy stream format */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for ( i = 0 ; i < ic - > nb_streams ; i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        AVStream  * st ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        OutputStream  * ost ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        AVCodec  * codec ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        codec  =  avcodec_find_encoder ( ic - > streams [ i ] - > codec - > codec_id ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ost    =  new_output_stream ( o ,  s ,  codec - > type ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 08:08:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        st     =  ost - > st ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // FIXME: a more elegant solution is needed
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        memcpy ( st ,  ic - > streams [ i ] ,  sizeof ( AVStream ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        st - > info  =  NULL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        avcodec_copy_context ( st - > codec ,  ic - > streams [ i ] - > codec ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-23 11:22:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( st - > codec - > codec_type  = =  AVMEDIA_TYPE_AUDIO  & &  ! ost - > stream_copy ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 08:08:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            choose_sample_fmt ( st ,  codec ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-23 11:22:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        else  if  ( st - > codec - > codec_type  = =  AVMEDIA_TYPE_VIDEO  & &  ! ost - > stream_copy ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-13 08:08:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            choose_pixel_fmt ( st ,  codec ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    av_close_input_file ( ic ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 14:43:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  void  opt_output_file ( void  * optctx ,  const  char  * filename )  
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-08-28 17:21:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    OptionsContext  * o  =  optctx ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    AVFormatContext  * oc ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 08:36:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int  i ,  err ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    AVOutputFormat  * file_oformat ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 08:36:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    OutputStream  * ost ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    InputStream   * ist ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! strcmp ( filename ,  " - " ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        filename  =  " pipe: " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    oc  =  avformat_alloc_context ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! oc )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        print_error ( filename ,  AVERROR ( ENOMEM ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( o - > format )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        file_oformat  =  av_guess_format ( o - > format ,  NULL ,  NULL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  ( ! file_oformat )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_FATAL ,  " Requested output format '%s' is not a suitable output format \n " ,  o - > format ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        file_oformat  =  av_guess_format ( NULL ,  filename ,  NULL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! file_oformat )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_FATAL ,  " Unable to find a suitable output format for '%s' \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                   filename ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    oc - > oformat  =  file_oformat ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 23:22:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    oc - > interrupt_callback  =  int_cb ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    av_strlcpy ( oc - > filename ,  filename ,  sizeof ( oc - > filename ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! strcmp ( file_oformat - > name ,  " ffm " )  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_strstart ( filename ,  " http: " ,  NULL ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* special case for files sent to avserver: we get the stream
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								           parameters  from  avserver  */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        int  err  =  read_avserver_streams ( o ,  oc ,  filename ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  ( err  <  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            print_error ( filename ,  err ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 17:21:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    }  else  if  ( ! o - > nb_stream_maps )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 08:36:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        /* pick the "best" stream of each type */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define NEW_STREAM(type, index)\ 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( index  > =  0 )  { \
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ost  =  new_  # #  type  # #  _stream ( o ,  oc ) ; \
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 08:36:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ost - > source_index  =  index ; \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ost - > sync_ist      =  & input_streams [ index ] ; \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            input_streams [ index ] . discard  =  0 ; \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* video: highest resolution */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:51:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! o - > video_disable  & &  oc - > oformat - > video_codec  ! =  CODEC_ID_NONE )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 08:36:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            int  area  =  0 ,  idx  =  - 1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  ( i  =  0 ;  i  <  nb_input_streams ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ist  =  & input_streams [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( ist - > st - > codec - > codec_type  = =  AVMEDIA_TYPE_VIDEO  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ist - > st - > codec - > width  *  ist - > st - > codec - > height  >  area )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    area  =  ist - > st - > codec - > width  *  ist - > st - > codec - > height ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    idx  =  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            NEW_STREAM ( video ,  idx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* audio: most channels */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:51:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! o - > audio_disable  & &  oc - > oformat - > audio_codec  ! =  CODEC_ID_NONE )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 08:36:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            int  channels  =  0 ,  idx  =  - 1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  ( i  =  0 ;  i  <  nb_input_streams ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ist  =  & input_streams [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( ist - > st - > codec - > codec_type  = =  AVMEDIA_TYPE_AUDIO  & & 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ist - > st - > codec - > channels  >  channels )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    channels  =  ist - > st - > codec - > channels ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    idx  =  i ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            NEW_STREAM ( audio ,  idx ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* subtitles: pick first */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:51:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ! o - > subtitle_disable  & &  oc - > oformat - > subtitle_codec  ! =  CODEC_ID_NONE )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 08:36:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            for  ( i  =  0 ;  i  <  nb_input_streams ;  i + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( input_streams [ i ] . st - > codec - > codec_type  = =  AVMEDIA_TYPE_SUBTITLE )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    NEW_STREAM ( subtitle ,  i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* do something with data? */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    }  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 17:21:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  ( i  =  0 ;  i  <  o - > nb_stream_maps ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            StreamMap  * map  =  & o - > stream_maps [ i ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 08:36:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 15:21:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( map - > disabled ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                continue ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 08:36:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-16 20:59:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ist  =  & input_streams [ input_files [ map - > file_index ] . ist_index  +  map - > stream_index ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 08:36:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            switch  ( ist - > st - > codec - > codec_type )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            case  AVMEDIA_TYPE_VIDEO :     ost  =  new_video_stream ( o ,  oc ) ;     break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            case  AVMEDIA_TYPE_AUDIO :     ost  =  new_audio_stream ( o ,  oc ) ;     break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            case  AVMEDIA_TYPE_SUBTITLE :  ost  =  new_subtitle_stream ( o ,  oc ) ;  break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            case  AVMEDIA_TYPE_DATA :      ost  =  new_data_stream ( o ,  oc ) ;      break ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-27 10:37:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            case  AVMEDIA_TYPE_ATTACHMENT :  ost  =  new_attachment_stream ( o ,  oc ) ;  break ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 08:36:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            default : 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 13:00:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                av_log ( NULL ,  AV_LOG_FATAL ,  " Cannot map stream #%d:%d - unsupported type. \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 08:36:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                       map - > file_index ,  map - > stream_index ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-16 20:59:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ost - > source_index  =  input_files [ map - > file_index ] . ist_index  +  map - > stream_index ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 08:36:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ost - > sync_ist  =  & input_streams [ input_files [ map - > sync_file_index ] . ist_index  + 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                           map - > sync_stream_index ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ist - > discard  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-30 07:10:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    /* handle attached files */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  o - > nb_attachments ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        AVIOContext  * pb ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        uint8_t  * attachment ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        const  char  * p ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        int64_t  len ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 23:22:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ( err  =  avio_open2 ( & pb ,  o - > attachments [ i ] ,  AVIO_FLAG_READ ,  & int_cb ,  NULL ) )  <  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-30 07:10:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_FATAL ,  " Could not open attachment file %s. \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                   o - > attachments [ i ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ( len  =  avio_size ( pb ) )  < =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_FATAL ,  " Could not get size of the attachment %s. \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                   o - > attachments [ i ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! ( attachment  =  av_malloc ( len ) ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_FATAL ,  " Attachment %s too large to fit into memory. \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                   o - > attachments [ i ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        avio_read ( pb ,  attachment ,  len ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost  =  new_attachment_stream ( o ,  oc ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost - > stream_copy                =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost - > source_index               =  - 1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost - > attachment_filename        =  o - > attachments [ i ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost - > st - > codec - > extradata       =  attachment ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ost - > st - > codec - > extradata_size  =  len ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        p  =  strrchr ( o - > attachments [ i ] ,  ' / ' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_dict_set ( & ost - > st - > metadata ,  " filename " ,  ( p  & &  * p )  ?  p  +  1  :  o - > attachments [ i ] ,  AV_DICT_DONT_OVERWRITE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        avio_close ( pb ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 09:56:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    output_files  =  grow_array ( output_files ,  sizeof ( * output_files ) ,  & nb_output_files ,  nb_output_files  +  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    output_files [ nb_output_files  -  1 ] . ctx        =  oc ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 10:21:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    output_files [ nb_output_files  -  1 ] . ost_index  =  nb_output_streams  -  oc - > nb_streams ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    output_files [ nb_output_files  -  1 ] . recording_time  =  o - > recording_time ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    output_files [ nb_output_files  -  1 ] . start_time      =  o - > start_time ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    output_files [ nb_output_files  -  1 ] . limit_filesize  =  o - > limit_filesize ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 09:56:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    av_dict_copy ( & output_files [ nb_output_files  -  1 ] . opts ,  format_opts ,  0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* check filename in case of an image number is expected */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( oc - > oformat - > flags  &  AVFMT_NEEDNUMBER )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! av_filename_number_test ( oc - > filename ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            print_error ( oc - > filename ,  AVERROR ( EINVAL ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( ! ( oc - > oformat - > flags  &  AVFMT_NOFILE ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* test if it already exists to avoid loosing precious files */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-02 21:50:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        assert_file_overwrite ( filename ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* open the file */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 23:22:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( ( err  =  avio_open2 ( & oc - > pb ,  filename ,  AVIO_FLAG_WRITE , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                              & oc - > interrupt_callback , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                              & output_files [ nb_output_files  -  1 ] . opts ) )  <  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            print_error ( filename ,  err ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-10-09 15:04:38 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( o - > mux_preload )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        uint8_t  buf [ 64 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        snprintf ( buf ,  sizeof ( buf ) ,  " %d " ,  ( int ) ( o - > mux_preload * AV_TIME_BASE ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_dict_set ( & output_files [ nb_output_files  -  1 ] . opts ,  " preload " ,  buf ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:51:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    oc - > max_delay  =  ( int ) ( o - > mux_max_delay  *  AV_TIME_BASE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    oc - > flags  | =  AVFMT_FLAG_NONBLOCK ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 21:39:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    /* copy chapters */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( o - > chapters_input_file  > =  nb_input_files )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( o - > chapters_input_file  = =  INT_MAX )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 21:39:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            /* copy chapters from the first input file that has them*/ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            o - > chapters_input_file  =  - 1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 21:39:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            for  ( i  =  0 ;  i  <  nb_input_files ;  i + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( input_files [ i ] . ctx - > nb_chapters )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    o - > chapters_input_file  =  i ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 21:39:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-12 21:51:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_FATAL ,  " Invalid input file index %d in chapter mapping. \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                   o - > chapters_input_file ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 21:39:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( o - > chapters_input_file  > =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        copy_chapters ( & input_files [ o - > chapters_input_file ] ,  & output_files [ nb_output_files  -  1 ] , 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-05 14:11:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                      ! o - > metadata_chapters_manual ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 21:39:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 13:07:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    /* copy metadata */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  o - > nb_meta_data_maps ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 13:07:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        AVFormatContext  * files [ 2 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        AVDictionary     * * meta [ 2 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        int  j ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# define METADATA_CHECK_INDEX(index, nb_elems, desc)\ 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ( index )  <  0  | |  ( index )  > =  ( nb_elems ) )  { \
							 
						 
					
						
							
								
									
										
										
										
											2011-09-12 21:51:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_FATAL ,  " Invalid %s index %d while processing metadata maps \n " , \
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 13:07:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                     ( desc ) ,  ( index ) ) ; \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        int  in_file_index  =  o - > meta_data_maps [ i ] [ 1 ] . file ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 13:07:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( in_file_index  <  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        METADATA_CHECK_INDEX ( in_file_index ,  nb_input_files ,  " input file " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        files [ 0 ]  =  oc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        files [ 1 ]  =  input_files [ in_file_index ] . ctx ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( j  =  0 ;  j  <  2 ;  j + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            MetadataMap  * map  =  & o - > meta_data_maps [ i ] [ j ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 13:07:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            switch  ( map - > type )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            case  ' g ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                meta [ j ]  =  & files [ j ] - > metadata ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            case  ' s ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                METADATA_CHECK_INDEX ( map - > index ,  files [ j ] - > nb_streams ,  " stream " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                meta [ j ]  =  & files [ j ] - > streams [ map - > index ] - > metadata ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            case  ' c ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                METADATA_CHECK_INDEX ( map - > index ,  files [ j ] - > nb_chapters ,  " chapter " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                meta [ j ]  =  & files [ j ] - > chapters [ map - > index ] - > metadata ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            case  ' p ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                METADATA_CHECK_INDEX ( map - > index ,  files [ j ] - > nb_programs ,  " program " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                meta [ j ]  =  & files [ j ] - > programs [ map - > index ] - > metadata ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_dict_copy ( meta [ 0 ] ,  * meta [ 1 ] ,  AV_DICT_DONT_OVERWRITE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* copy global metadata by default */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ! o - > metadata_global_manual  & &  nb_input_files ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 13:07:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        av_dict_copy ( & oc - > metadata ,  input_files [ 0 ] . ctx - > metadata , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                     AV_DICT_DONT_OVERWRITE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( ! o - > metadata_streams_manual ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 10:21:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  ( i  =  output_files [ nb_output_files  -  1 ] . ost_index ;  i  <  nb_output_streams ;  i + + )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-30 07:10:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            InputStream  * ist ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( output_streams [ i ] . source_index  <  0 )          /* this is true e.g. for attached files */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ist  =  & input_streams [ output_streams [ i ] . source_index ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-17 10:21:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_dict_copy ( & output_streams [ i ] . st - > metadata ,  ist - > st - > metadata ,  AV_DICT_DONT_OVERWRITE ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 13:07:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    /* process manually set metadata */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  ( i  =  0 ;  i  <  o - > nb_metadata ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        AVDictionary  * * m ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        char  type ,  * val ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        int  index  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        val  =  strchr ( o - > metadata [ i ] . u . str ,  ' = ' ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( ! val )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-12 21:51:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_FATAL ,  " No '=' character in metadata string %s. \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                   o - > metadata [ i ] . u . str ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        * val + +  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        parse_meta_type ( o - > metadata [ i ] . specifier ,  & type ,  & index ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        switch  ( type )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  ' g ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            m  =  & oc - > metadata ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  ' s ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( index  <  0  | |  index  > =  oc - > nb_streams )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-12 21:51:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                av_log ( NULL ,  AV_LOG_FATAL ,  " Invalid stream index %d in metadata specifier. \n " ,  index ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-05 14:12:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            m  =  & oc - > streams [ index ] - > metadata ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        case  ' c ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( index  <  0  | |  index  > =  oc - > nb_chapters )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-12 21:51:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                av_log ( NULL ,  AV_LOG_FATAL ,  " Invalid chapter index %d in metadata specifier. \n " ,  index ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-05 14:12:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            m  =  & oc - > chapters [ index ] - > metadata ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        default : 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-12 21:51:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_FATAL ,  " Invalid metadata specifier %s. \n " ,  o - > metadata [ i ] . specifier ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_dict_set ( m ,  o - > metadata [ i ] . u . str ,  * val  ?  val  :  NULL ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 17:21:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    reset_options ( o ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								/* same option as mencoder */  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  opt_pass ( const  char  * opt ,  const  char  * arg )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    do_pass  =  parse_number_or_die ( opt ,  arg ,  OPT_INT ,  1 ,  2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int64_t  getutime ( void )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# if HAVE_GETRUSAGE 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    struct  rusage  rusage ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    getrusage ( RUSAGE_SELF ,  & rusage ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  ( rusage . ru_utime . tv_sec  *  1000000LL )  +  rusage . ru_utime . tv_usec ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# elif HAVE_GETPROCESSTIMES 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    HANDLE  proc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    FILETIME  c ,  e ,  k ,  u ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    proc  =  GetCurrentProcess ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    GetProcessTimes ( proc ,  & c ,  & e ,  & k ,  & u ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  ( ( int64_t )  u . dwHighDateTime  < <  32  |  u . dwLowDateTime )  /  10 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  av_gettime ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int64_t  getmaxrss ( void )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    struct  rusage  rusage ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    getrusage ( RUSAGE_SELF ,  & rusage ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  ( int64_t ) rusage . ru_maxrss  *  1024 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# elif HAVE_GETPROCESSMEMORYINFO 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    HANDLE  proc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    PROCESS_MEMORY_COUNTERS  memcounters ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    proc  =  GetCurrentProcess ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    memcounters . cb  =  sizeof ( memcounters ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    GetProcessMemoryInfo ( proc ,  & memcounters ,  sizeof ( memcounters ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  memcounters . PeakPagefileUsage ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# else 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 10:04:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  opt_audio_qscale ( OptionsContext  * o ,  const  char  * opt ,  const  char  * arg )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  parse_option ( o ,  " q:a " ,  arg ,  options ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								static  void  show_usage ( void )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    printf ( " Hyper fast Audio and Video encoder \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    printf ( " usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}... \n " ,  program_name ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    printf ( " \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  void  show_help ( void )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-10-04 14:50:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    int  flags  =  AV_OPT_FLAG_DECODING_PARAM  |  AV_OPT_FLAG_ENCODING_PARAM ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    av_log_set_callback ( log_callback_help ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    show_usage ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    show_help_options ( options ,  " Main options: \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                      OPT_EXPERT  |  OPT_AUDIO  |  OPT_VIDEO  |  OPT_SUBTITLE  |  OPT_GRAB ,  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    show_help_options ( options ,  " \n Advanced options: \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                      OPT_EXPERT  |  OPT_AUDIO  |  OPT_VIDEO  |  OPT_SUBTITLE  |  OPT_GRAB , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                      OPT_EXPERT ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    show_help_options ( options ,  " \n Video options: \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                      OPT_EXPERT  |  OPT_AUDIO  |  OPT_VIDEO  |  OPT_GRAB , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                      OPT_VIDEO ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    show_help_options ( options ,  " \n Advanced Video options: \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                      OPT_EXPERT  |  OPT_AUDIO  |  OPT_VIDEO  |  OPT_GRAB , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                      OPT_VIDEO  |  OPT_EXPERT ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    show_help_options ( options ,  " \n Audio options: \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                      OPT_EXPERT  |  OPT_AUDIO  |  OPT_VIDEO  |  OPT_GRAB , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                      OPT_AUDIO ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    show_help_options ( options ,  " \n Advanced Audio options: \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                      OPT_EXPERT  |  OPT_AUDIO  |  OPT_VIDEO  |  OPT_GRAB , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                      OPT_AUDIO  |  OPT_EXPERT ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    show_help_options ( options ,  " \n Subtitle options: \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                      OPT_SUBTITLE  |  OPT_GRAB , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                      OPT_SUBTITLE ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    show_help_options ( options ,  " \n Audio/Video grab options: \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                      OPT_GRAB , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                      OPT_GRAB ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    printf ( " \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-04 14:50:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    show_help_children ( avcodec_get_class ( ) ,  flags ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    show_help_children ( avformat_get_class ( ) ,  flags ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    show_help_children ( sws_get_class ( ) ,  flags ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  opt_target ( OptionsContext  * o ,  const  char  * opt ,  const  char  * arg )  
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    enum  {  PAL ,  NTSC ,  FILM ,  UNKNOWN  }  norm  =  UNKNOWN ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    static  const  char  * const  frame_rates [ ]  =  { " 25 " ,  " 30000/1001 " ,  " 24000/1001 " } ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if ( ! strncmp ( arg ,  " pal- " ,  4 ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        norm  =  PAL ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        arg  + =  4 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else  if ( ! strncmp ( arg ,  " ntsc- " ,  5 ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        norm  =  NTSC ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        arg  + =  5 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else  if ( ! strncmp ( arg ,  " film- " ,  5 ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        norm  =  FILM ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        arg  + =  5 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        /* Try to determine PAL/NTSC by peeking in the input files */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if ( nb_input_files )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            int  i ,  j ,  fr ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  ( j  =  0 ;  j  <  nb_input_files ;  j + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                for  ( i  =  0 ;  i  <  input_files [ j ] . nb_streams ;  i + + )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    AVCodecContext  * c  =  input_files [ j ] . ctx - > streams [ i ] - > codec ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if ( c - > codec_type  ! =  AVMEDIA_TYPE_VIDEO ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    fr  =  c - > time_base . den  *  1000  /  c - > time_base . num ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if ( fr  = =  25000 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        norm  =  PAL ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                        break ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    }  else  if ( ( fr  = =  29970 )  | |  ( fr  = =  23976 ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        norm  =  NTSC ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        break ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if ( norm  ! =  UNKNOWN ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    break ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( norm  ! =  UNKNOWN ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            av_log ( NULL ,  AV_LOG_INFO ,  " Assuming %s for target. \n " ,  norm  = =  PAL  ?  " PAL "  :  " NTSC " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if ( norm  = =  UNKNOWN )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_FATAL ,  " Could not determine norm (PAL/NTSC/NTSC-Film) for target. \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_FATAL ,  " Please prefix target with  \" pal- \" ,  \" ntsc- \"  or  \" film- \" , \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_FATAL ,  " or set a framerate with  \" -r xxx \" . \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if ( ! strcmp ( arg ,  " vcd " ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        opt_video_codec ( o ,  " c:v " ,  " mpeg1video " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        opt_audio_codec ( o ,  " c:a " ,  " mp2 " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        parse_option ( o ,  " f " ,  " vcd " ,  options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        parse_option ( o ,  " s " ,  norm  = =  PAL  ?  " 352x288 "  :  " 352x240 " ,  options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        parse_option ( o ,  " r " ,  frame_rates [ norm ] ,  options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        opt_default ( " g " ,  norm  = =  PAL  ?  " 15 "  :  " 18 " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        opt_default ( " b " ,  " 1150000 " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        opt_default ( " maxrate " ,  " 1150000 " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        opt_default ( " minrate " ,  " 1150000 " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        opt_default ( " bufsize " ,  " 327680 " ) ;  // 40*1024*8;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-09 13:56:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        opt_default ( " b:a " ,  " 224000 " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        parse_option ( o ,  " ar " ,  " 44100 " ,  options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        parse_option ( o ,  " ac " ,  " 2 " ,  options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        opt_default ( " packetsize " ,  " 2324 " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        opt_default ( " muxrate " ,  " 1411200 " ) ;  // 2352 * 75 * 8;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        /* We have to offset the PTS, so that it is consistent with the SCR.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								           SCR  starts  at  36000 ,  but  the  first  two  packs  contain  only  padding 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								           and  the  first  pack  from  the  other  stream ,  respectively ,  may  also  have 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								           been  written  before . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								           So  the  real  data  starts  at  SCR  36000 + 3 * 1200.  */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:51:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        o - > mux_preload  =  ( 36000 + 3 * 1200 )  /  90000.0 ;  //0.44
 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    }  else  if ( ! strcmp ( arg ,  " svcd " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        opt_video_codec ( o ,  " c:v " ,  " mpeg2video " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        opt_audio_codec ( o ,  " c:a " ,  " mp2 " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        parse_option ( o ,  " f " ,  " svcd " ,  options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        parse_option ( o ,  " s " ,  norm  = =  PAL  ?  " 480x576 "  :  " 480x480 " ,  options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        parse_option ( o ,  " r " ,  frame_rates [ norm ] ,  options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        opt_default ( " g " ,  norm  = =  PAL  ?  " 15 "  :  " 18 " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        opt_default ( " b " ,  " 2040000 " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        opt_default ( " maxrate " ,  " 2516000 " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        opt_default ( " minrate " ,  " 0 " ) ;  //1145000;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        opt_default ( " bufsize " ,  " 1835008 " ) ;  //224*1024*8;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        opt_default ( " flags " ,  " +scan_offset " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-09 13:56:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        opt_default ( " b:a " ,  " 224000 " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        parse_option ( o ,  " ar " ,  " 44100 " ,  options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        opt_default ( " packetsize " ,  " 2324 " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else  if ( ! strcmp ( arg ,  " dvd " ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        opt_video_codec ( o ,  " c:v " ,  " mpeg2video " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        opt_audio_codec ( o ,  " c:a " ,  " ac3 " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        parse_option ( o ,  " f " ,  " dvd " ,  options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        parse_option ( o ,  " s " ,  norm  = =  PAL  ?  " 720x576 "  :  " 720x480 " ,  options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        parse_option ( o ,  " r " ,  frame_rates [ norm ] ,  options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        opt_default ( " g " ,  norm  = =  PAL  ?  " 15 "  :  " 18 " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        opt_default ( " b " ,  " 6000000 " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        opt_default ( " maxrate " ,  " 9000000 " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        opt_default ( " minrate " ,  " 0 " ) ;  //1500000;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        opt_default ( " bufsize " ,  " 1835008 " ) ;  //224*1024*8;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        opt_default ( " packetsize " ,  " 2048 " ) ;   // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        opt_default ( " muxrate " ,  " 10080000 " ) ;  // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-09 13:56:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        opt_default ( " b:a " ,  " 448000 " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        parse_option ( o ,  " ar " ,  " 48000 " ,  options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else  if ( ! strncmp ( arg ,  " dv " ,  2 ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        parse_option ( o ,  " f " ,  " dv " ,  options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        parse_option ( o ,  " s " ,  norm  = =  PAL  ?  " 720x576 "  :  " 720x480 " ,  options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        parse_option ( o ,  " pix_fmt " ,  ! strncmp ( arg ,  " dv50 " ,  4 )  ?  " yuv422p "  : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                          norm  = =  PAL  ?  " yuv420p "  :  " yuv411p " ,  options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        parse_option ( o ,  " r " ,  frame_rates [ norm ] ,  options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        parse_option ( o ,  " ar " ,  " 48000 " ,  options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        parse_option ( o ,  " ac " ,  " 2 " ,  options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_ERROR ,  " Unknown target: %s \n " ,  arg ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        return  AVERROR ( EINVAL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  opt_vstats_file ( const  char  * opt ,  const  char  * arg )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    av_free  ( vstats_filename ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    vstats_filename = av_strdup  ( arg ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  opt_vstats ( const  char  * opt ,  const  char  * arg )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    char  filename [ 40 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    time_t  today2  =  time ( NULL ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    struct  tm  * today  =  localtime ( & today2 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    snprintf ( filename ,  sizeof ( filename ) ,  " vstats_%02d%02d%02d.log " ,  today - > tm_hour ,  today - > tm_min , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								             today - > tm_sec ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  opt_vstats_file ( opt ,  filename ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  opt_video_frames ( OptionsContext  * o ,  const  char  * opt ,  const  char  * arg )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  parse_option ( o ,  " frames:v " ,  arg ,  options ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  opt_audio_frames ( OptionsContext  * o ,  const  char  * opt ,  const  char  * arg )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  parse_option ( o ,  " frames:a " ,  arg ,  options ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  opt_data_frames ( OptionsContext  * o ,  const  char  * opt ,  const  char  * arg )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  parse_option ( o ,  " frames:d " ,  arg ,  options ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:51:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  opt_video_tag ( OptionsContext  * o ,  const  char  * opt ,  const  char  * arg )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  parse_option ( o ,  " tag:v " ,  arg ,  options ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  opt_audio_tag ( OptionsContext  * o ,  const  char  * opt ,  const  char  * arg )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  parse_option ( o ,  " tag:a " ,  arg ,  options ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  int  opt_subtitle_tag ( OptionsContext  * o ,  const  char  * opt ,  const  char  * arg )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  parse_option ( o ,  " tag:s " ,  arg ,  options ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-02 21:11:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  int  opt_video_filters ( OptionsContext  * o ,  const  char  * opt ,  const  char  * arg )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  parse_option ( o ,  " filter:v " ,  arg ,  options ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# define OFFSET(x) offsetof(OptionsContext, x) 
  
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								static  const  OptionDef  options [ ]  =  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* main options */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "cmdutils_common_opts.h" 
  
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " f " ,  HAS_ARG  |  OPT_STRING  |  OPT_OFFSET ,  { . off  =  OFFSET ( format ) } ,  " force format " ,  " fmt "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 17:21:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " i " ,  HAS_ARG  |  OPT_FUNC2 ,  { ( void * ) opt_input_file } ,  " input file name " ,  " filename "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    {  " y " ,  OPT_BOOL ,  { ( void * ) & file_overwrite } ,  " overwrite output files "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " c " ,  HAS_ARG  |  OPT_STRING  |  OPT_SPEC ,  { . off  =  OFFSET ( codec_names ) } ,  " codec name " ,  " codec "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    {  " codec " ,  HAS_ARG  |  OPT_STRING  |  OPT_SPEC ,  { . off  =  OFFSET ( codec_names ) } ,  " codec name " ,  " codec "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-10 11:52:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " pre " ,  HAS_ARG  |  OPT_STRING  |  OPT_SPEC ,  { . off  =  OFFSET ( presets ) } ,  " preset name " ,  " preset "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 17:21:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " map " ,  HAS_ARG  |  OPT_EXPERT  |  OPT_FUNC2 ,  { ( void * ) opt_map } ,  " set input stream mapping " ,  " file.stream[:syncfile.syncstream] "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " map_metadata " ,  HAS_ARG  |  OPT_EXPERT  |  OPT_FUNC2 ,  { ( void * ) opt_map_metadata } ,  " set metadata information of outfile from infile " , 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								      " outfile[,metadata]:infile[,metadata] "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " map_chapters " ,   OPT_INT  |  HAS_ARG  |  OPT_EXPERT  |  OPT_OFFSET ,  { . off  =  OFFSET ( chapters_input_file ) } ,   " set chapters mapping " ,  " input_file_index "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " t " ,  HAS_ARG  |  OPT_TIME  |  OPT_OFFSET ,  { . off  =  OFFSET ( recording_time ) } ,  " record or transcode  \" duration \"  seconds of audio/video " ,  " duration "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " fs " ,  HAS_ARG  |  OPT_INT64  |  OPT_OFFSET ,  { . off  =  OFFSET ( limit_filesize ) } ,  " set the limit file size in bytes " ,  " limit_size "  } ,  //
 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " ss " ,  HAS_ARG  |  OPT_TIME  |  OPT_OFFSET ,  { . off  =  OFFSET ( start_time ) } ,  " set the start time offset " ,  " time_off "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    {  " itsoffset " ,  HAS_ARG  |  OPT_TIME  |  OPT_OFFSET ,  { . off  =  OFFSET ( input_ts_offset ) } ,  " set the input ts offset " ,  " time_off "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " itsscale " ,  HAS_ARG  |  OPT_DOUBLE  |  OPT_SPEC ,  { . off  =  OFFSET ( ts_scale ) } ,  " set the input ts scale " ,  " scale "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " metadata " ,  HAS_ARG  |  OPT_STRING  |  OPT_SPEC ,  { . off  =  OFFSET ( metadata ) } ,  " add metadata " ,  " string=string "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " dframes " ,  HAS_ARG  |  OPT_FUNC2 ,  { ( void * ) opt_data_frames } ,  " set the number of data frames to record " ,  " number "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    {  " benchmark " ,  OPT_BOOL  |  OPT_EXPERT ,  { ( void * ) & do_benchmark } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      " add timings for benchmarking "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    {  " timelimit " ,  HAS_ARG ,  { ( void * ) opt_timelimit } ,  " set max runtime in seconds " ,  " limit "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    {  " dump " ,  OPT_BOOL  |  OPT_EXPERT ,  { ( void * ) & do_pkt_dump } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      " dump each input packet "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    {  " hex " ,  OPT_BOOL  |  OPT_EXPERT ,  { ( void * ) & do_hex_dump } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      " when dumping packets, also dump the payload "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " re " ,  OPT_BOOL  |  OPT_EXPERT  |  OPT_OFFSET ,  { . off  =  OFFSET ( rate_emu ) } ,  " read input at native frame rate " ,  " "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 18:20:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " target " ,  HAS_ARG  |  OPT_FUNC2 ,  { ( void * ) opt_target } ,  " specify target file type ( \" vcd \" ,  \" svcd \" ,  \" dvd \" ,  \" dv \" ,  \" dv50 \" ,  \" pal-vcd \" ,  \" ntsc-svcd \" , ...) " ,  " type "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    {  " vsync " ,  HAS_ARG  |  OPT_INT  |  OPT_EXPERT ,  { ( void * ) & video_sync_method } ,  " video sync method " ,  " "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    {  " async " ,  HAS_ARG  |  OPT_INT  |  OPT_EXPERT ,  { ( void * ) & audio_sync_method } ,  " audio sync method " ,  " "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    {  " adrift_threshold " ,  HAS_ARG  |  OPT_FLOAT  |  OPT_EXPERT ,  { ( void * ) & audio_drift_threshold } ,  " audio drift threshold " ,  " threshold "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    {  " copyts " ,  OPT_BOOL  |  OPT_EXPERT ,  { ( void * ) & copy_ts } ,  " copy timestamps "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    {  " copytb " ,  OPT_BOOL  |  OPT_EXPERT ,  { ( void * ) & copy_tb } ,  " copy input stream time base when stream copying "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    {  " shortest " ,  OPT_BOOL  |  OPT_EXPERT ,  { ( void * ) & opt_shortest } ,  " finish encoding within shortest input "  } ,  //
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    {  " dts_delta_threshold " ,  HAS_ARG  |  OPT_FLOAT  |  OPT_EXPERT ,  { ( void * ) & dts_delta_threshold } ,  " timestamp discontinuity delta threshold " ,  " threshold "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    {  " xerror " ,  OPT_BOOL ,  { ( void * ) & exit_on_error } ,  " exit on error " ,  " error "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 10:26:56 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " copyinkf " ,  OPT_BOOL  |  OPT_EXPERT  |  OPT_SPEC ,  { . off  =  OFFSET ( copy_initial_nonkeyframes ) } ,  " copy initial non-keyframes "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " frames " ,  OPT_INT64  |  HAS_ARG  |  OPT_SPEC ,  { . off  =  OFFSET ( max_frames ) } ,  " set the number of frames to record " ,  " number "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:51:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " tag " ,    OPT_STRING  |  HAS_ARG  |  OPT_SPEC ,  { . off  =  OFFSET ( codec_tags ) } ,  " force codec tag/fourcc " ,  " fourcc/tag "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 10:04:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " q " ,  HAS_ARG  |  OPT_EXPERT  |  OPT_DOUBLE  |  OPT_SPEC ,  { . off  =  OFFSET ( qscale ) } ,  " use fixed quality scale (VBR) " ,  " q "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    {  " qscale " ,  HAS_ARG  |  OPT_EXPERT  |  OPT_DOUBLE  |  OPT_SPEC ,  { . off  =  OFFSET ( qscale ) } ,  " use fixed quality scale (VBR) " ,  " q "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-02 21:11:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# if CONFIG_AVFILTER 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    {  " filter " ,  HAS_ARG  |  OPT_STRING  |  OPT_SPEC ,  { . off  =  OFFSET ( filters ) } ,  " set stream filterchain " ,  " filter_list "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2011-10-09 15:57:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " stats " ,  OPT_BOOL ,  { & print_stats } ,  " print progress report during encoding " ,  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-10-30 07:10:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " attach " ,  HAS_ARG  |  OPT_FUNC2 ,  { ( void * ) opt_attach } ,  " add an attachment to the output file " ,  " filename "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-02 21:50:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " dump_attachment " ,  HAS_ARG  |  OPT_STRING  |  OPT_SPEC ,  { . off  =  OFFSET ( dump_attachment ) } ,  " extract an attachment into a file " ,  " filename "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* video options */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " vframes " ,  HAS_ARG  |  OPT_VIDEO  |  OPT_FUNC2 ,  { ( void * ) opt_video_frames } ,  " set the number of video frames to record " ,  " number "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " r " ,  HAS_ARG  |  OPT_VIDEO  |  OPT_STRING  |  OPT_SPEC ,  { . off  =  OFFSET ( frame_rates ) } ,  " set frame rate (Hz value, fraction or abbreviation) " ,  " rate "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " s " ,  HAS_ARG  |  OPT_VIDEO  |  OPT_STRING  |  OPT_SPEC ,  { . off  =  OFFSET ( frame_sizes ) } ,  " set frame size (WxH or abbreviation) " ,  " size "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " aspect " ,  HAS_ARG  |  OPT_VIDEO  |  OPT_STRING  |  OPT_SPEC ,  { . off  =  OFFSET ( frame_aspect_ratios ) } ,  " set aspect ratio (4:3, 16:9 or 1.3333, 1.7777) " ,  " aspect "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " pix_fmt " ,  HAS_ARG  |  OPT_EXPERT  |  OPT_VIDEO  |  OPT_STRING  |  OPT_SPEC ,  { . off  =  OFFSET ( frame_pix_fmts ) } ,  " set pixel format " ,  " format "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:51:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " vn " ,  OPT_BOOL  |  OPT_VIDEO  |  OPT_OFFSET ,  { . off  =  OFFSET ( video_disable ) } ,  " disable video "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    {  " vdt " ,  OPT_INT  |  HAS_ARG  |  OPT_EXPERT  |  OPT_VIDEO ,  { ( void * ) & video_discard } ,  " discard threshold " ,  " n "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-02 16:06:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " rc_override " ,  HAS_ARG  |  OPT_EXPERT  |  OPT_VIDEO  |  OPT_STRING  |  OPT_SPEC ,  { . off  =  OFFSET ( rc_overrides ) } ,  " rate control override for specific intervals " ,  " override "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " vcodec " ,  HAS_ARG  |  OPT_VIDEO  |  OPT_FUNC2 ,  { ( void * ) opt_video_codec } ,  " force video codec ('copy' to copy stream) " ,  " codec "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-09 11:32:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " same_quant " ,  OPT_BOOL  |  OPT_VIDEO ,  { ( void * ) & same_quant } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								      " use same quantizer as source (implies VBR) "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    {  " pass " ,  HAS_ARG  |  OPT_VIDEO ,  { ( void * ) opt_pass } ,  " select the pass number (1 or 2) " ,  " n "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    {  " passlogfile " ,  HAS_ARG  |  OPT_STRING  |  OPT_VIDEO ,  { ( void * ) & pass_logfilename_prefix } ,  " select two pass log file name prefix " ,  " prefix "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    {  " deinterlace " ,  OPT_BOOL  |  OPT_EXPERT  |  OPT_VIDEO ,  { ( void * ) & do_deinterlace } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      " deinterlace pictures "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    {  " vstats " ,  OPT_EXPERT  |  OPT_VIDEO ,  { ( void * ) & opt_vstats } ,  " dump video coding statistics to file "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    {  " vstats_file " ,  HAS_ARG  |  OPT_EXPERT  |  OPT_VIDEO ,  { ( void * ) opt_vstats_file } ,  " dump video coding statistics to file " ,  " file "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# if CONFIG_AVFILTER 
  
						 
					
						
							
								
									
										
										
										
											2011-09-02 21:11:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " vf " ,  HAS_ARG  |  OPT_VIDEO  |  OPT_FUNC2 ,  { ( void * ) opt_video_filters } ,  " video filters " ,  " filter list "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2011-09-02 17:57:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " intra_matrix " ,  HAS_ARG  |  OPT_EXPERT  |  OPT_VIDEO  |  OPT_STRING  |  OPT_SPEC ,  { . off  =  OFFSET ( intra_matrices ) } ,  " specify intra matrix coeffs " ,  " matrix "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    {  " inter_matrix " ,  HAS_ARG  |  OPT_EXPERT  |  OPT_VIDEO  |  OPT_STRING  |  OPT_SPEC ,  { . off  =  OFFSET ( inter_matrices ) } ,  " specify inter matrix coeffs " ,  " matrix "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-02 18:03:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " top " ,  HAS_ARG  |  OPT_EXPERT  |  OPT_VIDEO  |  OPT_INT |  OPT_SPEC ,  { . off  =  OFFSET ( top_field_first ) } ,  " top=1/bottom=0/auto=-1 field first " ,  " "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    {  " dc " ,  OPT_INT  |  HAS_ARG  |  OPT_EXPERT  |  OPT_VIDEO ,  { ( void * ) & intra_dc_precision } ,  " intra_dc_precision " ,  " precision "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:51:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " vtag " ,  HAS_ARG  |  OPT_EXPERT  |  OPT_VIDEO  |  OPT_FUNC2 ,  { ( void * ) opt_video_tag } ,  " force video tag/fourcc " ,  " fourcc/tag "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    {  " qphist " ,  OPT_BOOL  |  OPT_EXPERT  |  OPT_VIDEO ,  {  ( void  * ) & qp_hist  } ,  " show QP histogram "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " force_fps " ,  OPT_BOOL  |  OPT_EXPERT  |  OPT_VIDEO  |  OPT_SPEC ,  { . off  =  OFFSET ( force_fps ) } ,  " force the selected framerate, disable the best supported framerate selection "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-02 22:07:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " streamid " ,  HAS_ARG  |  OPT_EXPERT  |  OPT_FUNC2 ,  { ( void * ) opt_streamid } ,  " set the value of an outfile streamid " ,  " streamIndex:value "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " force_key_frames " ,  OPT_STRING  |  HAS_ARG  |  OPT_EXPERT  |  OPT_VIDEO  |  OPT_SPEC ,  { . off  =  OFFSET ( forced_key_frames ) } ,  " force key frames at specified timestamps " ,  " timestamps "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* audio options */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " aframes " ,  HAS_ARG  |  OPT_AUDIO  |  OPT_FUNC2 ,  { ( void * ) opt_audio_frames } ,  " set the number of audio frames to record " ,  " number "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 10:04:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " aq " ,  HAS_ARG  |  OPT_AUDIO  |  OPT_FUNC2 ,  { ( void * ) opt_audio_qscale } ,  " set audio quality (codec-specific) " ,  " quality " ,  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " ar " ,  HAS_ARG  |  OPT_AUDIO  |  OPT_INT  |  OPT_SPEC ,  { . off  =  OFFSET ( audio_sample_rate ) } ,  " set audio sampling rate (in Hz) " ,  " rate "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-01 08:20:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " ac " ,  HAS_ARG  |  OPT_AUDIO  |  OPT_INT  |  OPT_SPEC ,  { . off  =  OFFSET ( audio_channels ) } ,  " set number of audio channels " ,  " channels "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:51:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " an " ,  OPT_BOOL  |  OPT_AUDIO  |  OPT_OFFSET ,  { . off  =  OFFSET ( audio_disable ) } ,  " disable audio "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " acodec " ,  HAS_ARG  |  OPT_AUDIO  |  OPT_FUNC2 ,  { ( void * ) opt_audio_codec } ,  " force audio codec ('copy' to copy stream) " ,  " codec "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:51:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " atag " ,  HAS_ARG  |  OPT_EXPERT  |  OPT_AUDIO  |  OPT_FUNC2 ,  { ( void * ) opt_audio_tag } ,  " force audio tag/fourcc " ,  " fourcc/tag "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    {  " vol " ,  OPT_INT  |  HAS_ARG  |  OPT_AUDIO ,  { ( void * ) & audio_volume } ,  " change audio volume (256=normal) "  ,  " volume "  } ,  //
 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:51:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " sample_fmt " ,  HAS_ARG  |  OPT_EXPERT  |  OPT_AUDIO  |  OPT_SPEC  |  OPT_STRING ,  { . off  =  OFFSET ( sample_fmts ) } ,  " set sample format " ,  " format "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* subtitle options */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:51:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " sn " ,  OPT_BOOL  |  OPT_SUBTITLE  |  OPT_OFFSET ,  { . off  =  OFFSET ( subtitle_disable ) } ,  " disable subtitle "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " scodec " ,  HAS_ARG  |  OPT_SUBTITLE  |  OPT_FUNC2 ,  { ( void * ) opt_subtitle_codec } ,  " force subtitle codec ('copy' to copy stream) " ,  " codec "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:51:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " stag " ,  HAS_ARG  |  OPT_EXPERT  |  OPT_SUBTITLE  |  OPT_FUNC2 ,  { ( void * ) opt_subtitle_tag } ,  " force subtitle tag/fourcc " ,  " fourcc/tag "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* grab options */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    {  " isync " ,  OPT_BOOL  |  OPT_EXPERT  |  OPT_GRAB ,  { ( void * ) & input_sync } ,  " sync read on input " ,  " "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* muxer options */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:51:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " muxdelay " ,  OPT_FLOAT  |  HAS_ARG  |  OPT_EXPERT    |  OPT_OFFSET ,  { . off  =  OFFSET ( mux_max_delay ) } ,  " set the maximum demux-decode delay " ,  " seconds "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    {  " muxpreload " ,  OPT_FLOAT  |  HAS_ARG  |  OPT_EXPERT  |  OPT_OFFSET ,  { . off  =  OFFSET ( mux_preload ) } ,    " set the initial demux-decode delay " ,  " seconds "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-31 08:45:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " bsf " ,  HAS_ARG  |  OPT_STRING  |  OPT_SPEC ,  { . off  =  OFFSET ( bitstream_filters ) } ,  " A comma-separated list of bitstream filters " ,  " bitstream_filters "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* data codec support */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 09:16:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    {  " dcodec " ,  HAS_ARG  |  OPT_DATA  |  OPT_FUNC2 ,  { ( void * ) opt_data_codec } ,  " force data codec ('copy' to copy stream) " ,  " codec "  } , 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    {  " default " ,  HAS_ARG  |  OPT_AUDIO  |  OPT_VIDEO  |  OPT_EXPERT ,  { ( void * ) opt_default } ,  " generic catch all option " ,  " "  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    {  NULL ,  } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								int  main ( int  argc ,  char  * * argv )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-08-28 17:21:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    OptionsContext  o  =  {  0  } ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    int64_t  ti ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 17:21:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    reset_options ( & o ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    av_log_set_flags ( AV_LOG_SKIP_REPEATED ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-26 08:15:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    parse_loglevel ( argc ,  argv ,  options ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    avcodec_register_all ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# if CONFIG_AVDEVICE 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    avdevice_register_all ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# if CONFIG_AVFILTER 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    avfilter_register_all ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    av_register_all ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-11-06 02:47:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    avformat_network_init ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    show_banner ( ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* parse options */ 
							 
						 
					
						
							
								
									
										
										
										
											2011-08-28 17:21:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    parse_options ( & o ,  argc ,  argv ,  options ,  opt_output_file ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if ( nb_output_files  < =  0  & &  nb_input_files  = =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        show_usage ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_WARNING ,  " Use -h to get full help or, even better, run 'man %s' \n " ,  program_name ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /* file converter / grab */ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( nb_output_files  < =  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        fprintf ( stderr ,  " At least one output file must be specified \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( nb_input_files  = =  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-13 07:31:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        av_log ( NULL ,  AV_LOG_FATAL ,  " At least one input file must be specified \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ti  =  getutime ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-29 08:36:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  ( transcode ( output_files ,  nb_output_files ,  input_files ,  nb_input_files )  <  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        exit_program ( 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ti  =  getutime ( )  -  ti ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( do_benchmark )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        int  maxrss  =  getmaxrss ( )  /  1024 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        printf ( " bench: utime=%0.3fs maxrss=%ikB \n " ,  ti  /  1000000.0 ,  maxrss ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-08-29 07:03:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    exit_program ( 0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-07-27 20:56:59 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}