You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-10 06:10:52 +02:00
fftools/ffmpeg: refactor the code checking for bitexact output
Figure out earlier whether the output stream/file should be bitexact and store this information in a flag in OutputFile/OutputStream. Stop accessing the muxer in set_encoder_id(), which will become forbidden in future commits.
This commit is contained in:
@@ -2823,37 +2823,18 @@ static int init_output_stream_streamcopy(OutputStream *ost)
|
|||||||
|
|
||||||
static void set_encoder_id(OutputFile *of, OutputStream *ost)
|
static void set_encoder_id(OutputFile *of, OutputStream *ost)
|
||||||
{
|
{
|
||||||
const AVDictionaryEntry *e;
|
|
||||||
|
|
||||||
uint8_t *encoder_string;
|
uint8_t *encoder_string;
|
||||||
int encoder_string_len;
|
int encoder_string_len;
|
||||||
int format_flags = 0;
|
|
||||||
int codec_flags = ost->enc_ctx->flags;
|
|
||||||
|
|
||||||
if (av_dict_get(ost->st->metadata, "encoder", NULL, 0))
|
if (av_dict_get(ost->st->metadata, "encoder", NULL, 0))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
e = av_dict_get(of->opts, "fflags", NULL, 0);
|
|
||||||
if (e) {
|
|
||||||
const AVOption *o = av_opt_find(of->ctx, "fflags", NULL, 0, 0);
|
|
||||||
if (!o)
|
|
||||||
return;
|
|
||||||
av_opt_eval_flags(of->ctx, o, e->value, &format_flags);
|
|
||||||
}
|
|
||||||
e = av_dict_get(ost->encoder_opts, "flags", NULL, 0);
|
|
||||||
if (e) {
|
|
||||||
const AVOption *o = av_opt_find(ost->enc_ctx, "flags", NULL, 0, 0);
|
|
||||||
if (!o)
|
|
||||||
return;
|
|
||||||
av_opt_eval_flags(ost->enc_ctx, o, e->value, &codec_flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
encoder_string_len = sizeof(LIBAVCODEC_IDENT) + strlen(ost->enc->name) + 2;
|
encoder_string_len = sizeof(LIBAVCODEC_IDENT) + strlen(ost->enc->name) + 2;
|
||||||
encoder_string = av_mallocz(encoder_string_len);
|
encoder_string = av_mallocz(encoder_string_len);
|
||||||
if (!encoder_string)
|
if (!encoder_string)
|
||||||
exit_program(1);
|
exit_program(1);
|
||||||
|
|
||||||
if (!(format_flags & AVFMT_FLAG_BITEXACT) && !(codec_flags & AV_CODEC_FLAG_BITEXACT))
|
if (!of->bitexact && !ost->bitexact)
|
||||||
av_strlcpy(encoder_string, LIBAVCODEC_IDENT " ", encoder_string_len);
|
av_strlcpy(encoder_string, LIBAVCODEC_IDENT " ", encoder_string_len);
|
||||||
else
|
else
|
||||||
av_strlcpy(encoder_string, "Lavc ", encoder_string_len);
|
av_strlcpy(encoder_string, "Lavc ", encoder_string_len);
|
||||||
|
@@ -498,6 +498,7 @@ typedef struct OutputStream {
|
|||||||
int top_field_first;
|
int top_field_first;
|
||||||
int rotate_overridden;
|
int rotate_overridden;
|
||||||
int autoscale;
|
int autoscale;
|
||||||
|
int bitexact;
|
||||||
int bits_per_raw_sample;
|
int bits_per_raw_sample;
|
||||||
double rotate_override_value;
|
double rotate_override_value;
|
||||||
|
|
||||||
@@ -598,6 +599,7 @@ typedef struct OutputFile {
|
|||||||
int64_t start_time; ///< start time in microseconds == AV_TIME_BASE units
|
int64_t start_time; ///< start time in microseconds == AV_TIME_BASE units
|
||||||
|
|
||||||
int shortest;
|
int shortest;
|
||||||
|
int bitexact;
|
||||||
} OutputFile;
|
} OutputFile;
|
||||||
|
|
||||||
extern InputStream **input_streams;
|
extern InputStream **input_streams;
|
||||||
|
@@ -1518,6 +1518,22 @@ static int choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *o
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int check_opt_bitexact(void *ctx, const AVDictionary *opts,
|
||||||
|
const char *opt_name, int flag)
|
||||||
|
{
|
||||||
|
const AVDictionaryEntry *e = av_dict_get(opts, opt_name, NULL, 0);
|
||||||
|
|
||||||
|
if (e) {
|
||||||
|
const AVOption *o = av_opt_find(ctx, opt_name, NULL, 0, 0);
|
||||||
|
int val = 0;
|
||||||
|
if (!o)
|
||||||
|
return 0;
|
||||||
|
av_opt_eval_flags(ctx, o, e->value, &val);
|
||||||
|
return !!(val & flag);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index)
|
static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index)
|
||||||
{
|
{
|
||||||
OutputStream *ost;
|
OutputStream *ost;
|
||||||
@@ -1610,8 +1626,13 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (o->bitexact)
|
if (o->bitexact) {
|
||||||
ost->enc_ctx->flags |= AV_CODEC_FLAG_BITEXACT;
|
ost->enc_ctx->flags |= AV_CODEC_FLAG_BITEXACT;
|
||||||
|
ost->bitexact = 1;
|
||||||
|
} else {
|
||||||
|
ost->bitexact = check_opt_bitexact(ost->enc_ctx, ost->encoder_opts, "flags",
|
||||||
|
AV_CODEC_FLAG_BITEXACT);
|
||||||
|
}
|
||||||
|
|
||||||
MATCH_PER_STREAM_OPT(time_bases, str, time_base, oc, st);
|
MATCH_PER_STREAM_OPT(time_bases, str, time_base, oc, st);
|
||||||
if (time_base) {
|
if (time_base) {
|
||||||
@@ -2424,6 +2445,10 @@ static int open_output_file(OptionsContext *o, const char *filename)
|
|||||||
|
|
||||||
if (o->bitexact) {
|
if (o->bitexact) {
|
||||||
oc->flags |= AVFMT_FLAG_BITEXACT;
|
oc->flags |= AVFMT_FLAG_BITEXACT;
|
||||||
|
of->bitexact = 1;
|
||||||
|
} else {
|
||||||
|
of->bitexact = check_opt_bitexact(oc, of->opts, "fflags",
|
||||||
|
AVFMT_FLAG_BITEXACT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* create streams for all unlabeled output pads */
|
/* create streams for all unlabeled output pads */
|
||||||
|
Reference in New Issue
Block a user