|
@@ -128,7 +128,7 @@ static char *video_rc_override_string=NULL; |
|
|
static char *video_rc_eq="tex^qComp"; |
|
|
static char *video_rc_eq="tex^qComp"; |
|
|
static int video_disable = 0; |
|
|
static int video_disable = 0; |
|
|
static int video_discard = 0; |
|
|
static int video_discard = 0; |
|
|
static int video_codec_id = CODEC_ID_NONE; |
|
|
|
|
|
|
|
|
static char *video_codec_name = NULL; |
|
|
static int video_codec_tag = 0; |
|
|
static int video_codec_tag = 0; |
|
|
static int same_quality = 0; |
|
|
static int same_quality = 0; |
|
|
static int do_deinterlace = 0; |
|
|
static int do_deinterlace = 0; |
|
@@ -146,12 +146,12 @@ static int audio_sample_rate = 44100; |
|
|
static float audio_qscale = QSCALE_NONE; |
|
|
static float audio_qscale = QSCALE_NONE; |
|
|
static int audio_disable = 0; |
|
|
static int audio_disable = 0; |
|
|
static int audio_channels = 1; |
|
|
static int audio_channels = 1; |
|
|
static int audio_codec_id = CODEC_ID_NONE; |
|
|
|
|
|
|
|
|
static char *audio_codec_name = NULL; |
|
|
static int audio_codec_tag = 0; |
|
|
static int audio_codec_tag = 0; |
|
|
static char *audio_language = NULL; |
|
|
static char *audio_language = NULL; |
|
|
|
|
|
|
|
|
static int subtitle_disable = 0; |
|
|
static int subtitle_disable = 0; |
|
|
static int subtitle_codec_id = CODEC_ID_NONE; |
|
|
|
|
|
|
|
|
static char *subtitle_codec_name = NULL; |
|
|
static char *subtitle_language = NULL; |
|
|
static char *subtitle_language = NULL; |
|
|
|
|
|
|
|
|
static float mux_preload= 0.5; |
|
|
static float mux_preload= 0.5; |
|
@@ -2368,32 +2368,20 @@ static void opt_video_standard(const char *arg) |
|
|
video_standard = av_strdup(arg); |
|
|
video_standard = av_strdup(arg); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static void opt_codec(int *pstream_copy, int *pcodec_id, |
|
|
|
|
|
|
|
|
static void opt_codec(int *pstream_copy, char **pcodec_name, |
|
|
int codec_type, const char *arg) |
|
|
int codec_type, const char *arg) |
|
|
{ |
|
|
{ |
|
|
AVCodec *p; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
av_freep(pcodec_name); |
|
|
if (!strcmp(arg, "copy")) { |
|
|
if (!strcmp(arg, "copy")) { |
|
|
*pstream_copy = 1; |
|
|
*pstream_copy = 1; |
|
|
} else { |
|
|
} else { |
|
|
p = first_avcodec; |
|
|
|
|
|
while (p) { |
|
|
|
|
|
if (!strcmp(p->name, arg) && p->type == codec_type) |
|
|
|
|
|
break; |
|
|
|
|
|
p = p->next; |
|
|
|
|
|
} |
|
|
|
|
|
if (p == NULL) { |
|
|
|
|
|
fprintf(stderr, "Unknown codec '%s'\n", arg); |
|
|
|
|
|
exit(1); |
|
|
|
|
|
} else { |
|
|
|
|
|
*pcodec_id = p->id; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
*pcodec_name = av_strdup(arg); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static void opt_audio_codec(const char *arg) |
|
|
static void opt_audio_codec(const char *arg) |
|
|
{ |
|
|
{ |
|
|
opt_codec(&audio_stream_copy, &audio_codec_id, CODEC_TYPE_AUDIO, arg); |
|
|
|
|
|
|
|
|
opt_codec(&audio_stream_copy, &audio_codec_name, CODEC_TYPE_AUDIO, arg); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static void opt_audio_tag(const char *arg) |
|
|
static void opt_audio_tag(const char *arg) |
|
@@ -2439,12 +2427,12 @@ static void add_frame_hooker(const char *arg) |
|
|
|
|
|
|
|
|
static void opt_video_codec(const char *arg) |
|
|
static void opt_video_codec(const char *arg) |
|
|
{ |
|
|
{ |
|
|
opt_codec(&video_stream_copy, &video_codec_id, CODEC_TYPE_VIDEO, arg); |
|
|
|
|
|
|
|
|
opt_codec(&video_stream_copy, &video_codec_name, CODEC_TYPE_VIDEO, arg); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static void opt_subtitle_codec(const char *arg) |
|
|
static void opt_subtitle_codec(const char *arg) |
|
|
{ |
|
|
{ |
|
|
opt_codec(&subtitle_stream_copy, &subtitle_codec_id, CODEC_TYPE_SUBTITLE, arg); |
|
|
|
|
|
|
|
|
opt_codec(&subtitle_stream_copy, &subtitle_codec_name, CODEC_TYPE_SUBTITLE, arg); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static void opt_map(const char *arg) |
|
|
static void opt_map(const char *arg) |
|
@@ -2507,6 +2495,26 @@ static void opt_input_ts_offset(const char *arg) |
|
|
input_ts_offset = parse_date(arg, 1); |
|
|
input_ts_offset = parse_date(arg, 1); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static enum CodecID find_codec_or_die(const char *name, int type, int encoder) |
|
|
|
|
|
{ |
|
|
|
|
|
AVCodec *codec; |
|
|
|
|
|
|
|
|
|
|
|
if(!name) |
|
|
|
|
|
return CODEC_ID_NONE; |
|
|
|
|
|
codec = encoder ? |
|
|
|
|
|
avcodec_find_encoder_by_name(name) : |
|
|
|
|
|
avcodec_find_decoder_by_name(name); |
|
|
|
|
|
if(!codec) { |
|
|
|
|
|
av_log(NULL, AV_LOG_ERROR, "Unknown codec '%s'\n", name); |
|
|
|
|
|
exit(1); |
|
|
|
|
|
} |
|
|
|
|
|
if(codec->type != type) { |
|
|
|
|
|
av_log(NULL, AV_LOG_ERROR, "Invalid codec type '%s'\n", name); |
|
|
|
|
|
exit(1); |
|
|
|
|
|
} |
|
|
|
|
|
return codec->id; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
static void opt_input_file(const char *filename) |
|
|
static void opt_input_file(const char *filename) |
|
|
{ |
|
|
{ |
|
|
AVFormatContext *ic; |
|
|
AVFormatContext *ic; |
|
@@ -2534,8 +2542,8 @@ static void opt_input_file(const char *filename) |
|
|
ap->pix_fmt = frame_pix_fmt; |
|
|
ap->pix_fmt = frame_pix_fmt; |
|
|
ap->channel = video_channel; |
|
|
ap->channel = video_channel; |
|
|
ap->standard = video_standard; |
|
|
ap->standard = video_standard; |
|
|
ap->video_codec_id = video_codec_id; |
|
|
|
|
|
ap->audio_codec_id = audio_codec_id; |
|
|
|
|
|
|
|
|
ap->video_codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 0); |
|
|
|
|
|
ap->audio_codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 0); |
|
|
if(pgmyuv_compatibility_hack) |
|
|
if(pgmyuv_compatibility_hack) |
|
|
ap->video_codec_id= CODEC_ID_PGMYUV; |
|
|
ap->video_codec_id= CODEC_ID_PGMYUV; |
|
|
|
|
|
|
|
@@ -2740,8 +2748,8 @@ static void new_video_stream(AVFormatContext *oc) |
|
|
AVCodec *codec; |
|
|
AVCodec *codec; |
|
|
|
|
|
|
|
|
codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO); |
|
|
codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, CODEC_TYPE_VIDEO); |
|
|
if (video_codec_id != CODEC_ID_NONE) |
|
|
|
|
|
codec_id = video_codec_id; |
|
|
|
|
|
|
|
|
if (video_codec_name) |
|
|
|
|
|
codec_id = find_codec_or_die(video_codec_name, CODEC_TYPE_VIDEO, 1); |
|
|
|
|
|
|
|
|
video_enc->codec_id = codec_id; |
|
|
video_enc->codec_id = codec_id; |
|
|
codec = avcodec_find_encoder(codec_id); |
|
|
codec = avcodec_find_encoder(codec_id); |
|
@@ -2849,7 +2857,7 @@ static void new_video_stream(AVFormatContext *oc) |
|
|
|
|
|
|
|
|
/* reset some key parameters */ |
|
|
/* reset some key parameters */ |
|
|
video_disable = 0; |
|
|
video_disable = 0; |
|
|
video_codec_id = CODEC_ID_NONE; |
|
|
|
|
|
|
|
|
av_freep(&video_codec_name); |
|
|
video_stream_copy = 0; |
|
|
video_stream_copy = 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@@ -2896,8 +2904,8 @@ static void new_audio_stream(AVFormatContext *oc) |
|
|
av_set_double(audio_enc, opt_names[i], d); |
|
|
av_set_double(audio_enc, opt_names[i], d); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (audio_codec_id != CODEC_ID_NONE) |
|
|
|
|
|
codec_id = audio_codec_id; |
|
|
|
|
|
|
|
|
if (audio_codec_name) |
|
|
|
|
|
codec_id = find_codec_or_die(audio_codec_name, CODEC_TYPE_AUDIO, 1); |
|
|
audio_enc->codec_id = codec_id; |
|
|
audio_enc->codec_id = codec_id; |
|
|
|
|
|
|
|
|
if (audio_qscale > QSCALE_NONE) { |
|
|
if (audio_qscale > QSCALE_NONE) { |
|
@@ -2917,7 +2925,7 @@ static void new_audio_stream(AVFormatContext *oc) |
|
|
|
|
|
|
|
|
/* reset some key parameters */ |
|
|
/* reset some key parameters */ |
|
|
audio_disable = 0; |
|
|
audio_disable = 0; |
|
|
audio_codec_id = CODEC_ID_NONE; |
|
|
|
|
|
|
|
|
av_freep(&audio_codec_name); |
|
|
audio_stream_copy = 0; |
|
|
audio_stream_copy = 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@@ -2945,7 +2953,7 @@ static void new_subtitle_stream(AVFormatContext *oc) |
|
|
if(d==d && (opt->flags&AV_OPT_FLAG_SUBTITLE_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM)) |
|
|
if(d==d && (opt->flags&AV_OPT_FLAG_SUBTITLE_PARAM) && (opt->flags&AV_OPT_FLAG_ENCODING_PARAM)) |
|
|
av_set_double(subtitle_enc, opt_names[i], d); |
|
|
av_set_double(subtitle_enc, opt_names[i], d); |
|
|
} |
|
|
} |
|
|
subtitle_enc->codec_id = subtitle_codec_id; |
|
|
|
|
|
|
|
|
subtitle_enc->codec_id = find_codec_or_die(subtitle_codec_name, CODEC_TYPE_SUBTITLE, 1); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (subtitle_language) { |
|
|
if (subtitle_language) { |
|
@@ -2955,7 +2963,7 @@ static void new_subtitle_stream(AVFormatContext *oc) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
subtitle_disable = 0; |
|
|
subtitle_disable = 0; |
|
|
subtitle_codec_id = CODEC_ID_NONE; |
|
|
|
|
|
|
|
|
av_freep(&subtitle_codec_name); |
|
|
subtitle_stream_copy = 0; |
|
|
subtitle_stream_copy = 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@@ -3025,9 +3033,9 @@ static void opt_output_file(const char *filename) |
|
|
exit(1); |
|
|
exit(1); |
|
|
} |
|
|
} |
|
|
} else { |
|
|
} else { |
|
|
use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_id != CODEC_ID_NONE; |
|
|
|
|
|
use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_id != CODEC_ID_NONE; |
|
|
|
|
|
use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_id != CODEC_ID_NONE; |
|
|
|
|
|
|
|
|
use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name; |
|
|
|
|
|
use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name; |
|
|
|
|
|
use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name; |
|
|
|
|
|
|
|
|
/* disable if no corresponding type found and at least one |
|
|
/* disable if no corresponding type found and at least one |
|
|
input file */ |
|
|
input file */ |
|
@@ -3863,6 +3871,10 @@ int main(int argc, char **argv) |
|
|
|
|
|
|
|
|
av_free(opt_names); |
|
|
av_free(opt_names); |
|
|
|
|
|
|
|
|
|
|
|
av_free(video_codec_name); |
|
|
|
|
|
av_free(audio_codec_name); |
|
|
|
|
|
av_free(subtitle_codec_name); |
|
|
|
|
|
|
|
|
av_free(video_standard); |
|
|
av_free(video_standard); |
|
|
|
|
|
|
|
|
#ifdef CONFIG_POWERPC_PERF |
|
|
#ifdef CONFIG_POWERPC_PERF |
|
|