[FFmpeg-devel] [PATCH] ffmpeg: fail on experimental encoders if -strict > experimental
Janne Grunau
janne-ffmpeg
Wed May 26 00:48:00 CEST 2010
Hi,
not sure if I'm abusing -strict too much. Even the exprimental encoders should
produce standard compliant output.
Depends on the CODEC_CAP_EXPERIMENTAL patch
Janne
-------------- next part --------------
commit f7be47f7a94abe9a5a318034ea932b35eee37e7a
Author: Janne Grunau <janne at grunau.be>
Date: Mon May 24 23:15:19 2010 +0200
ffmpeg: fail if encoder is experimental and -strict > experimental
diff --git a/ffmpeg.c b/ffmpeg.c
index 63f0e6b..6eb7aa9 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -3068,7 +3068,7 @@ static int opt_input_ts_offset(const char *opt, const char *arg)
return 0;
}
-static enum CodecID find_codec_or_die(const char *name, int type, int encoder)
+static enum CodecID find_codec_or_die(const char *name, int type, int encoder, int strict)
{
const char *codec_string = encoder ? "encoder" : "decoder";
AVCodec *codec;
@@ -3086,6 +3086,12 @@ static enum CodecID find_codec_or_die(const char *name, int type, int encoder)
fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
av_exit(1);
}
+ if(codec->caps & CODEC_CAP_EXPERIMENTAL && strict > FF_COMPLIANCE_EXPERIMENTAL) {
+ fprintf(stderr, "%s \"%s\" is experimental and might produce bad "
+ "results. Add \"-strict experimental\" if you want to use it.\n",
+ codec_string, codec->name);
+ av_exit(1);
+ }
return codec->id;
}
@@ -3133,9 +3139,9 @@ static void opt_input_file(const char *filename)
set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM);
- 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 = find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0, 0);
+ ic->audio_codec_id = find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0, 0);
+ ic->subtitle_codec_id= find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0, 0);
ic->flags |= AVFMT_FLAG_NONBLOCK;
if(pgmyuv_compatibility_hack)
@@ -3364,7 +3370,8 @@ static void new_video_stream(AVFormatContext *oc)
AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
if (video_codec_name) {
- codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1);
+ codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
+ video_enc->strict_std_compliance);
codec = avcodec_find_encoder_by_name(video_codec_name);
output_codecs[nb_ocodecs] = codec;
} else {
@@ -3495,7 +3502,8 @@ static void new_audio_stream(AVFormatContext *oc)
set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
if (audio_codec_name) {
- codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1);
+ codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
+ audio_enc->strict_std_compliance);
codec = avcodec_find_encoder_by_name(audio_codec_name);
output_codecs[nb_ocodecs] = codec;
} else {
@@ -3555,7 +3563,8 @@ static void new_subtitle_stream(AVFormatContext *oc)
st->stream_copy = 1;
} else {
set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM);
- subtitle_enc->codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1);
+ subtitle_enc->codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
+ subtitle_enc->strict_std_compliance);
output_codecs[nb_ocodecs] = avcodec_find_encoder_by_name(subtitle_codec_name);
}
nb_ocodecs++;
More information about the ffmpeg-devel
mailing list