@ -251,6 +251,7 @@ typedef struct OutputStream {
int64_t sws_flags ;
AVDictionary * opts ;
int is_past_recording_time ;
int stream_copy ;
} OutputStream ;
@ -410,7 +411,6 @@ static void reset_options(OptionsContext *o, int is_input)
if ( is_input ) o - > recording_time = bak . recording_time ;
else o - > recording_time = INT64_MAX ;
o - > mux_preload = 0.5 ;
o - > mux_max_delay = 0.7 ;
o - > limit_filesize = UINT64_MAX ;
o - > chapters_input_file = INT_MAX ;
@ -1414,7 +1414,7 @@ static void print_report(OutputFile *output_files,
float q = - 1 ;
ost = & ost_table [ i ] ;
enc = ost - > st - > codec ;
if ( ! ost - > st - > st ream_copy & & enc - > coded_frame )
if ( ! ost - > stream_copy & & enc - > coded_frame )
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 ) ;
@ -2066,7 +2066,7 @@ static int transcode_init(OutputFile *output_files, int nb_output_files,
codec - > bits_per_raw_sample = icodec - > bits_per_raw_sample ;
codec - > chroma_sample_location = icodec - > chroma_sample_location ;
if ( ost - > st - > st ream_copy) {
if ( ost - > stream_copy ) {
uint64_t extra_size = ( uint64_t ) icodec - > extradata_size + FF_INPUT_BUFFER_PADDING_SIZE ;
if ( extra_size > INT_MAX ) {
@ -2161,9 +2161,8 @@ static int transcode_init(OutputFile *output_files, int nb_output_files,
if ( ! ost - > fifo ) {
return AVERROR ( ENOMEM ) ;
}
if ( ! codec - > sample_rate ) {
if ( ! codec - > sample_rate )
codec - > sample_rate = icodec - > sample_rate ;
}
choose_sample_rate ( ost - > st , ost - > enc ) ;
codec - > time_base = ( AVRational ) { 1 , codec - > sample_rate } ;
if ( codec - > sample_fmt = = AV_SAMPLE_FMT_NONE )
@ -2377,7 +2376,7 @@ static int transcode_init(OutputFile *output_files, int nb_output_files,
av_log ( NULL , AV_LOG_INFO , " [sync #%d.%d] " ,
ost - > sync_ist - > file_index ,
ost - > sync_ist - > st - > index ) ;
if ( ost - > st - > st ream_copy)
if ( ost - > stream_copy )
av_log ( NULL , AV_LOG_INFO , " (copy) " ) ;
else
av_log ( NULL , AV_LOG_INFO , " (%s -> %s) " , input_streams [ ost - > source_index ] . dec ?
@ -2701,7 +2700,7 @@ static int transcode(OutputFile *output_files, int nb_output_files,
for ( i = 0 ; i < nb_output_streams ; i + + ) {
ost = & output_streams [ i ] ;
if ( ost ) {
if ( ost - > st - > st ream_copy)
if ( ost - > stream_copy )
av_freep ( & ost - > st - > codec - > extradata ) ;
if ( ost - > logfile ) {
fclose ( ost - > logfile ) ;
@ -2944,13 +2943,11 @@ static int opt_recording_timestamp(OptionsContext *o, const char *opt, const cha
return 0 ;
}
static enum CodecID find_codec_or_die ( const char * name , enum AVMediaType type , int encoder )
static AVCodec * find_codec_or_die ( const char * name , enum AVMediaType type , int encoder )
{
const char * codec_string = encoder ? " encoder " : " decoder " ;
AVCodec * codec ;
if ( ! name )
return CODEC_ID_NONE ;
codec = encoder ?
avcodec_find_encoder_by_name ( name ) :
avcodec_find_decoder_by_name ( name ) ;
@ -2962,29 +2959,20 @@ static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, i
av_log ( NULL , AV_LOG_FATAL , " Invalid %s type '%s' \n " , codec_string , name ) ;
exit_program ( 1 ) ;
}
return codec - > id ;
return codec ;
}
static AVCodec * choose_codec ( OptionsContext * o , AVFormatContext * s , AVStream * st , enum AVMediaType type )
static AVCodec * choose_decoder ( OptionsContext * o , AVFormatContext * s , AVStream * st )
{
char * codec_name = NULL ;
MATCH_PER_STREAM_OPT ( codec_names , str , codec_name , s , st ) ;
if ( ! codec_name ) {
if ( s - > oformat ) {
st - > codec - > codec_id = av_guess_codec ( s - > oformat , NULL , s - > filename , NULL , type ) ;
return avcodec_find_encoder ( st - > codec - > codec_id ) ;
}
} else if ( ! strcmp ( codec_name , " copy " ) )
st - > stream_copy = 1 ;
else {
st - > codec - > codec_id = find_codec_or_die ( codec_name , type , s - > iformat = = NULL ) ;
return s - > oformat ? avcodec_find_encoder_by_name ( codec_name ) :
avcodec_find_decoder_by_name ( codec_name ) ;
}
return NULL ;
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 ) ;
}
/**
@ -3020,9 +3008,7 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
st - > codec - > codec_tag = tag ;
}
ist - > dec = choose_codec ( o , ic , st , dec - > codec_type ) ;
if ( ! ist - > dec )
ist - > dec = avcodec_find_decoder ( dec - > codec_id ) ;
ist - > dec = choose_decoder ( o , ic , st ) ;
switch ( dec - > codec_type ) {
case AVMEDIA_TYPE_AUDIO :
@ -3115,12 +3101,12 @@ static int opt_input_file(OptionsContext *o, const char *opt, const char *filena
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 ) ;
ic - > video_codec_id =
find_codec_or_die ( video_codec_name , AVMEDIA_TYPE_VIDEO , 0 ) ;
ic - > audio_codec_id =
find_codec_or_die ( audio_codec_name , AVMEDIA_TYPE_AUDIO , 0 ) ;
ic - > subtitle_codec_id =
find_codec_or_die ( subtitle_codec_name , AVMEDIA_TYPE_SUBTITLE , 0 ) ;
ic - > video_codec_id = video_codec_name ?
find_codec_or_die ( video_codec_name , AVMEDIA_TYPE_VIDEO , 0 ) - > id : CODEC_ID_NONE ;
ic - > audio_codec_id = audio_codec_name ?
find_codec_or_die ( audio_codec_name , AVMEDIA_TYPE_AUDIO , 0 ) - > id : CODEC_ID_NONE ;
ic - > subtitle_codec_id = subtitle_codec_name ?
find_codec_or_die ( subtitle_codec_name , AVMEDIA_TYPE_SUBTITLE , 0 ) - > id : CODEC_ID_NONE ;
ic - > flags | = AVFMT_FLAG_NONBLOCK ;
if ( loop_input ) {
@ -3138,7 +3124,7 @@ static int opt_input_file(OptionsContext *o, const char *opt, const char *filena
/* apply forced codec ids */
for ( i = 0 ; i < ic - > nb_streams ; i + + )
choose_codec ( o , ic , ic - > streams [ i ] , ic - > streams [ i ] - > codec - > codec_type ) ;
choose_decoder ( o , ic , ic - > streams [ i ] ) ;
/* Set AVCodecContext options for avformat_find_stream_info */
opts = setup_find_stream_info_opts ( ic , codec_opts ) ;
@ -3253,6 +3239,23 @@ static int get_preset_file_2(const char *preset_name, const char *codec_name, AV
return ret ;
}
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 " ) )
ost - > stream_copy = 1 ;
else {
ost - > enc = find_codec_or_die ( codec_name , ost - > st - > codec - > codec_type , 1 ) ;
ost - > st - > codec - > codec_id = ost - > enc - > id ;
}
}
static OutputStream * new_output_stream ( OptionsContext * o , AVFormatContext * oc , enum AVMediaType type )
{
OutputStream * ost ;
@ -3280,7 +3283,7 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
ost - > index = idx ;
ost - > st = st ;
st - > codec - > codec_type = type ;
ost - > enc = choose_codec ( o , oc , st , type ) ;
choose_encoder ( o , oc , o st) ;
if ( ost - > enc ) {
ost - > opts = filter_codec_opts ( codec_opts , ost - > enc - > id , oc , st ) ;
}
@ -3381,7 +3384,7 @@ static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
st = ost - > st ;
video_enc = st - > codec ;
if ( ! st - > stream_copy ) {
if ( ! o st- > stream_copy ) {
const char * p = NULL ;
char * forced_key_frames = NULL , * frame_rate = NULL , * frame_size = NULL ;
char * frame_aspect_ratio = NULL , * frame_pix_fmt = NULL ;
@ -3502,7 +3505,7 @@ static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
audio_enc = st - > codec ;
audio_enc - > codec_type = AVMEDIA_TYPE_AUDIO ;
if ( ! st - > stream_copy ) {
if ( ! o st- > stream_copy ) {
char * sample_fmt = NULL ;
MATCH_PER_STREAM_OPT ( audio_channels , i , audio_enc - > channels , oc , st ) ;
@ -3525,12 +3528,10 @@ static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
static OutputStream * new_data_stream ( OptionsContext * o , AVFormatContext * oc )
{
AVStream * st ;
OutputStream * ost ;
ost = new_output_stream ( o , oc , AVMEDIA_TYPE_DATA ) ;
st = ost - > st ;
if ( ! st - > stream_copy ) {
if ( ! ost - > stream_copy ) {
av_log ( NULL , AV_LOG_FATAL , " Data stream encoding not supported yet (only streamcopy) \n " ) ;
exit_program ( 1 ) ;
}
@ -3541,7 +3542,7 @@ static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
static OutputStream * new_attachment_stream ( OptionsContext * o , AVFormatContext * oc )
{
OutputStream * ost = new_output_stream ( o , oc , AVMEDIA_TYPE_ATTACHMENT ) ;
ost - > st - > st ream_copy = 1 ;
ost - > stream_copy = 1 ;
return ost ;
}
@ -3646,9 +3647,9 @@ static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const ch
memcpy ( st - > info , ic - > streams [ i ] - > info , sizeof ( * st - > info ) ) ;
avcodec_copy_context ( st - > codec , ic - > streams [ i ] - > codec ) ;
if ( st - > codec - > codec_type = = AVMEDIA_TYPE_AUDIO & & ! st - > stream_copy )
if ( st - > codec - > codec_type = = AVMEDIA_TYPE_AUDIO & & ! o st- > stream_copy )
choose_sample_fmt ( st , codec ) ;
else if ( st - > codec - > codec_type = = AVMEDIA_TYPE_VIDEO & & ! st - > stream_copy )
else if ( st - > codec - > codec_type = = AVMEDIA_TYPE_VIDEO & & ! o st- > stream_copy )
choose_pixel_fmt ( st , codec ) ;
}
@ -3812,7 +3813,11 @@ static void opt_output_file(void *optctx, const char *filename)
}
}
oc - > preload = ( int ) ( o - > mux_preload * AV_TIME_BASE ) ;
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 ) ;
}
oc - > max_delay = ( int ) ( o - > mux_max_delay * AV_TIME_BASE ) ;
if ( loop_output > = 0 ) {