fftools/ffmpeg_filter: move the MJPEG format selection hack to muxer setup
That, if anywhere, is a more appropriate place for it.
This commit is contained in:
parent
9d5bf2d69e
commit
17702c5f7b
|
@ -270,6 +270,8 @@ enum OFilterFlags {
|
||||||
typedef struct OutputFilterOptions {
|
typedef struct OutputFilterOptions {
|
||||||
// Codec used for encoding, may be NULL
|
// Codec used for encoding, may be NULL
|
||||||
const AVCodec *enc;
|
const AVCodec *enc;
|
||||||
|
// Overrides encoder pixel formats when set.
|
||||||
|
const enum AVPixelFormat *pix_fmts;
|
||||||
|
|
||||||
int64_t ts_offset;
|
int64_t ts_offset;
|
||||||
|
|
||||||
|
|
|
@ -788,34 +788,11 @@ int ofilter_bind_ost(OutputFilter *ofilter, OutputStream *ost,
|
||||||
ofp->height = ost->enc_ctx->height;
|
ofp->height = ost->enc_ctx->height;
|
||||||
if (ost->enc_ctx->pix_fmt != AV_PIX_FMT_NONE) {
|
if (ost->enc_ctx->pix_fmt != AV_PIX_FMT_NONE) {
|
||||||
ofp->format = ost->enc_ctx->pix_fmt;
|
ofp->format = ost->enc_ctx->pix_fmt;
|
||||||
} else if (opts->enc) {
|
} else if (opts->pix_fmts)
|
||||||
|
ofp->formats = opts->pix_fmts;
|
||||||
|
else if (opts->enc)
|
||||||
ofp->formats = opts->enc->pix_fmts;
|
ofp->formats = opts->enc->pix_fmts;
|
||||||
|
|
||||||
// MJPEG encoder exports a full list of supported pixel formats,
|
|
||||||
// but the full-range ones are experimental-only.
|
|
||||||
// Restrict the auto-conversion list unless -strict experimental
|
|
||||||
// has been specified.
|
|
||||||
if (!strcmp(opts->enc->name, "mjpeg")) {
|
|
||||||
// FIXME: YUV420P etc. are actually supported with full color range,
|
|
||||||
// yet the latter information isn't available here.
|
|
||||||
static const enum AVPixelFormat mjpeg_formats[] =
|
|
||||||
{ AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ444P,
|
|
||||||
AV_PIX_FMT_NONE };
|
|
||||||
|
|
||||||
const AVDictionaryEntry *strict = av_dict_get(ost->encoder_opts, "strict", NULL, 0);
|
|
||||||
int strict_val = ost->enc_ctx->strict_std_compliance;
|
|
||||||
|
|
||||||
if (strict) {
|
|
||||||
const AVOption *o = av_opt_find(ost->enc_ctx, strict->key, NULL, 0, 0);
|
|
||||||
av_assert0(o);
|
|
||||||
av_opt_eval_int(ost->enc_ctx, o, strict->value, &strict_val);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strict_val > FF_COMPLIANCE_UNOFFICIAL)
|
|
||||||
ofp->formats = mjpeg_formats;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fgp->disable_conversions |= !!(ofp->flags & OFILTER_FLAG_DISABLE_CONVERT);
|
fgp->disable_conversions |= !!(ofp->flags & OFILTER_FLAG_DISABLE_CONVERT);
|
||||||
|
|
||||||
ofp->fps.last_frame = av_frame_alloc();
|
ofp->fps.last_frame = av_frame_alloc();
|
||||||
|
|
|
@ -1384,6 +1384,30 @@ static int ost_add(Muxer *mux, const OptionsContext *o, enum AVMediaType type,
|
||||||
.flags = OFILTER_FLAG_DISABLE_CONVERT * !!keep_pix_fmt,
|
.flags = OFILTER_FLAG_DISABLE_CONVERT * !!keep_pix_fmt,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// MJPEG encoder exports a full list of supported pixel formats,
|
||||||
|
// but the full-range ones are experimental-only.
|
||||||
|
// Restrict the auto-conversion list unless -strict experimental
|
||||||
|
// has been specified.
|
||||||
|
if (!strcmp(enc->name, "mjpeg")) {
|
||||||
|
// FIXME: YUV420P etc. are actually supported with full color range,
|
||||||
|
// yet the latter information isn't available here.
|
||||||
|
static const enum AVPixelFormat mjpeg_formats[] =
|
||||||
|
{ AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ444P,
|
||||||
|
AV_PIX_FMT_NONE };
|
||||||
|
|
||||||
|
const AVDictionaryEntry *strict = av_dict_get(ost->encoder_opts, "strict", NULL, 0);
|
||||||
|
int strict_val = ost->enc_ctx->strict_std_compliance;
|
||||||
|
|
||||||
|
if (strict) {
|
||||||
|
const AVOption *o = av_opt_find(ost->enc_ctx, strict->key, NULL, 0, 0);
|
||||||
|
av_assert0(o);
|
||||||
|
av_opt_eval_int(ost->enc_ctx, o, strict->value, &strict_val);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strict_val > FF_COMPLIANCE_UNOFFICIAL)
|
||||||
|
opts.pix_fmts = mjpeg_formats;
|
||||||
|
}
|
||||||
|
|
||||||
if (ofilter) {
|
if (ofilter) {
|
||||||
ost->filter = ofilter;
|
ost->filter = ofilter;
|
||||||
ret = ofilter_bind_ost(ofilter, ost, ms->sch_idx_enc, &opts);
|
ret = ofilter_bind_ost(ofilter, ost, ms->sch_idx_enc, &opts);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user