lavc: Move frame_skip_* to codec private options
These options are only used by mpegvideoenc and vpx. They are very codec-specific options, so deprecate the global variants. Add an allowed value to the private options for frame_skip_cmp which seems to have been forgotten, but perfectly working. The libvpx frame dropping feature uses one of such option (frame_skip_threshold) without the other three. For this reason rename the option to something more consistent with the other libvpx variables. Signed-off-by: Vittorio Giovara <vittorio.giovara@gmail.com>
This commit is contained in:
@@ -2369,33 +2369,23 @@ typedef struct AVCodecContext {
|
|||||||
int lmax;
|
int lmax;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
#if FF_API_PRIVATE_OPT
|
||||||
* frame skip threshold
|
/** @deprecated use encoder private options instead */
|
||||||
* - encoding: Set by user.
|
attribute_deprecated
|
||||||
* - decoding: unused
|
|
||||||
*/
|
|
||||||
int frame_skip_threshold;
|
int frame_skip_threshold;
|
||||||
|
|
||||||
/**
|
/** @deprecated use encoder private options instead */
|
||||||
* frame skip factor
|
attribute_deprecated
|
||||||
* - encoding: Set by user.
|
|
||||||
* - decoding: unused
|
|
||||||
*/
|
|
||||||
int frame_skip_factor;
|
int frame_skip_factor;
|
||||||
|
|
||||||
/**
|
/** @deprecated use encoder private options instead */
|
||||||
* frame skip exponent
|
attribute_deprecated
|
||||||
* - encoding: Set by user.
|
|
||||||
* - decoding: unused
|
|
||||||
*/
|
|
||||||
int frame_skip_exp;
|
int frame_skip_exp;
|
||||||
|
|
||||||
/**
|
/** @deprecated use encoder private options instead */
|
||||||
* frame skip comparison function
|
attribute_deprecated
|
||||||
* - encoding: Set by user.
|
|
||||||
* - decoding: unused
|
|
||||||
*/
|
|
||||||
int frame_skip_cmp;
|
int frame_skip_cmp;
|
||||||
|
#endif /* FF_API_PRIVATE_OPT */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* trellis RD quantization
|
* trellis RD quantization
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ typedef struct VP8EncoderContext {
|
|||||||
int error_resilient;
|
int error_resilient;
|
||||||
int crf;
|
int crf;
|
||||||
int static_thresh;
|
int static_thresh;
|
||||||
|
int drop_threshold;
|
||||||
} VP8Context;
|
} VP8Context;
|
||||||
|
|
||||||
/** String mappings for enum vp8e_enc_control_id */
|
/** String mappings for enum vp8e_enc_control_id */
|
||||||
@@ -257,7 +258,14 @@ static av_cold int vpx_init(AVCodecContext *avctx,
|
|||||||
enccfg.rc_min_quantizer = avctx->qmin;
|
enccfg.rc_min_quantizer = avctx->qmin;
|
||||||
if (avctx->qmax > 0)
|
if (avctx->qmax > 0)
|
||||||
enccfg.rc_max_quantizer = avctx->qmax;
|
enccfg.rc_max_quantizer = avctx->qmax;
|
||||||
enccfg.rc_dropframe_thresh = avctx->frame_skip_threshold;
|
|
||||||
|
#if FF_API_PRIVATE_OPT
|
||||||
|
FF_DISABLE_DEPRECATION_WARNINGS
|
||||||
|
if (avctx->frame_skip_threshold)
|
||||||
|
ctx->drop_threshold = avctx->frame_skip_threshold;
|
||||||
|
FF_ENABLE_DEPRECATION_WARNINGS
|
||||||
|
#endif
|
||||||
|
enccfg.rc_dropframe_thresh = ctx->drop_threshold;
|
||||||
|
|
||||||
//0-100 (0 => CBR, 100 => VBR)
|
//0-100 (0 => CBR, 100 => VBR)
|
||||||
enccfg.rc_2pass_vbr_bias_pct = round(avctx->qcompress * 100);
|
enccfg.rc_2pass_vbr_bias_pct = round(avctx->qcompress * 100);
|
||||||
@@ -594,6 +602,7 @@ static const AVOption options[] = {
|
|||||||
#endif
|
#endif
|
||||||
{ "crf", "Select the quality for constant quality mode", offsetof(VP8Context, crf), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 63, VE },
|
{ "crf", "Select the quality for constant quality mode", offsetof(VP8Context, crf), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 63, VE },
|
||||||
{ "static-thresh", "A change threshold on blocks below which they will be skipped by the encoder", OFFSET(static_thresh), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE },
|
{ "static-thresh", "A change threshold on blocks below which they will be skipped by the encoder", OFFSET(static_thresh), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE },
|
||||||
|
{ "drop-threshold", "Frame drop threshold", offsetof(VP8Context, drop_threshold), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, VE },
|
||||||
{ NULL }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -528,6 +528,12 @@ typedef struct MpegEncContext {
|
|||||||
AVFrame *tmp_frames[MAX_B_FRAMES + 2];
|
AVFrame *tmp_frames[MAX_B_FRAMES + 2];
|
||||||
int b_frame_strategy;
|
int b_frame_strategy;
|
||||||
int b_sensitivity;
|
int b_sensitivity;
|
||||||
|
|
||||||
|
/* frame skip options for encoding */
|
||||||
|
int frame_skip_threshold;
|
||||||
|
int frame_skip_factor;
|
||||||
|
int frame_skip_exp;
|
||||||
|
int frame_skip_cmp;
|
||||||
} MpegEncContext;
|
} MpegEncContext;
|
||||||
|
|
||||||
/* mpegvideo_enc common options */
|
/* mpegvideo_enc common options */
|
||||||
@@ -538,9 +544,26 @@ typedef struct MpegEncContext {
|
|||||||
#define FF_MPV_FLAG_NAQ 0x0010
|
#define FF_MPV_FLAG_NAQ 0x0010
|
||||||
#define FF_MPV_FLAG_MV0 0x0020
|
#define FF_MPV_FLAG_MV0 0x0020
|
||||||
|
|
||||||
|
#define FF_MPV_OPT_CMP_FUNC \
|
||||||
|
{ "sad", "Sum of absolute differences, fast", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_SAD }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \
|
||||||
|
{ "sse", "Sum of squared errors", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_SSE }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \
|
||||||
|
{ "satd", "Sum of absolute Hadamard transformed differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_SATD }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \
|
||||||
|
{ "dct", "Sum of absolute DCT transformed differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_DCT }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \
|
||||||
|
{ "psnr", "Sum of squared quantization errors, low quality", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_PSNR }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \
|
||||||
|
{ "bit", "Number of bits needed for the block", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_BIT }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \
|
||||||
|
{ "rd", "Rate distortion optimal, slow", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_RD }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \
|
||||||
|
{ "zero", "Zero", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_ZERO }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \
|
||||||
|
{ "vsad", "Sum of absolute vertical differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_VSAD }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \
|
||||||
|
{ "vsse", "Sum of squared vertical differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_VSSE }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \
|
||||||
|
{ "nsse", "Noise preserving sum of squared differences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_NSSE }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \
|
||||||
|
{ "dct264", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_DCT264 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \
|
||||||
|
{ "dctmax", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_DCTMAX }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \
|
||||||
|
{ "chroma", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_CMP_CHROMA }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }
|
||||||
|
|
||||||
#define FF_MPV_OFFSET(x) offsetof(MpegEncContext, x)
|
#define FF_MPV_OFFSET(x) offsetof(MpegEncContext, x)
|
||||||
#define FF_MPV_OPT_FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM)
|
#define FF_MPV_OPT_FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM)
|
||||||
#define FF_MPV_COMMON_OPTS \
|
#define FF_MPV_COMMON_OPTS \
|
||||||
|
FF_MPV_OPT_CMP_FUNC, \
|
||||||
{ "mpv_flags", "Flags common for all mpegvideo-based encoders.", FF_MPV_OFFSET(mpv_flags), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "mpv_flags" },\
|
{ "mpv_flags", "Flags common for all mpegvideo-based encoders.", FF_MPV_OFFSET(mpv_flags), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "mpv_flags" },\
|
||||||
{ "skip_rd", "RD optimal MB level residual skipping", 0, AV_OPT_TYPE_CONST, { .i64 = FF_MPV_FLAG_SKIP_RD }, 0, 0, FF_MPV_OPT_FLAGS, "mpv_flags" },\
|
{ "skip_rd", "RD optimal MB level residual skipping", 0, AV_OPT_TYPE_CONST, { .i64 = FF_MPV_FLAG_SKIP_RD }, 0, 0, FF_MPV_OPT_FLAGS, "mpv_flags" },\
|
||||||
{ "strict_gop", "Strictly enforce gop size", 0, AV_OPT_TYPE_CONST, { .i64 = FF_MPV_FLAG_STRICT_GOP }, 0, 0, FF_MPV_OPT_FLAGS, "mpv_flags" },\
|
{ "strict_gop", "Strictly enforce gop size", 0, AV_OPT_TYPE_CONST, { .i64 = FF_MPV_FLAG_STRICT_GOP }, 0, 0, FF_MPV_OPT_FLAGS, "mpv_flags" },\
|
||||||
@@ -579,6 +602,10 @@ typedef struct MpegEncContext {
|
|||||||
{"b_strategy", "Strategy to choose between I/P/B-frames", FF_MPV_OFFSET(b_frame_strategy), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 2, FF_MPV_OPT_FLAGS }, \
|
{"b_strategy", "Strategy to choose between I/P/B-frames", FF_MPV_OFFSET(b_frame_strategy), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 2, FF_MPV_OPT_FLAGS }, \
|
||||||
{"b_sensitivity", "Adjust sensitivity of b_frame_strategy 1", FF_MPV_OFFSET(b_sensitivity), AV_OPT_TYPE_INT, {.i64 = 40 }, 1, INT_MAX, FF_MPV_OPT_FLAGS }, \
|
{"b_sensitivity", "Adjust sensitivity of b_frame_strategy 1", FF_MPV_OFFSET(b_sensitivity), AV_OPT_TYPE_INT, {.i64 = 40 }, 1, INT_MAX, FF_MPV_OPT_FLAGS }, \
|
||||||
{"brd_scale", "Downscale frames for dynamic B-frame decision", FF_MPV_OFFSET(brd_scale), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 3, FF_MPV_OPT_FLAGS }, \
|
{"brd_scale", "Downscale frames for dynamic B-frame decision", FF_MPV_OFFSET(brd_scale), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 3, FF_MPV_OPT_FLAGS }, \
|
||||||
|
{"skip_threshold", "Frame skip threshold", FF_MPV_OFFSET(frame_skip_threshold), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \
|
||||||
|
{"skip_factor", "Frame skip factor", FF_MPV_OFFSET(frame_skip_factor), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \
|
||||||
|
{"skip_exp", "Frame skip exponent", FF_MPV_OFFSET(frame_skip_exp), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \
|
||||||
|
{"skip_cmp", "Frame skip compare function", FF_MPV_OFFSET(frame_skip_cmp), AV_OPT_TYPE_INT, {.i64 = FF_CMP_DCTMAX }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, "cmp_func" }, \
|
||||||
|
|
||||||
extern const AVOption ff_mpv_generic_options[];
|
extern const AVOption ff_mpv_generic_options[];
|
||||||
|
|
||||||
|
|||||||
@@ -780,8 +780,21 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
|||||||
|
|
||||||
s->quant_precision = 5;
|
s->quant_precision = 5;
|
||||||
|
|
||||||
|
#if FF_API_PRIVATE_OPT
|
||||||
|
FF_DISABLE_DEPRECATION_WARNINGS
|
||||||
|
if (avctx->frame_skip_threshold)
|
||||||
|
s->frame_skip_threshold = avctx->frame_skip_threshold;
|
||||||
|
if (avctx->frame_skip_factor)
|
||||||
|
s->frame_skip_factor = avctx->frame_skip_factor;
|
||||||
|
if (avctx->frame_skip_exp)
|
||||||
|
s->frame_skip_exp = avctx->frame_skip_exp;
|
||||||
|
if (avctx->frame_skip_cmp != FF_CMP_DCTMAX)
|
||||||
|
s->frame_skip_cmp = avctx->frame_skip_cmp;
|
||||||
|
FF_ENABLE_DEPRECATION_WARNINGS
|
||||||
|
#endif
|
||||||
|
|
||||||
ff_set_cmp(&s->mecc, s->mecc.ildct_cmp, s->avctx->ildct_cmp);
|
ff_set_cmp(&s->mecc, s->mecc.ildct_cmp, s->avctx->ildct_cmp);
|
||||||
ff_set_cmp(&s->mecc, s->mecc.frame_skip_cmp, s->avctx->frame_skip_cmp);
|
ff_set_cmp(&s->mecc, s->mecc.frame_skip_cmp, s->frame_skip_cmp);
|
||||||
|
|
||||||
if (CONFIG_H261_ENCODER && s->out_format == FMT_H261)
|
if (CONFIG_H261_ENCODER && s->out_format == FMT_H261)
|
||||||
ff_h261_encode_init(s);
|
ff_h261_encode_init(s);
|
||||||
@@ -1149,7 +1162,7 @@ static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
|
|||||||
uint8_t *rptr = ref->f->data[plane] + 8 * (x + y * stride);
|
uint8_t *rptr = ref->f->data[plane] + 8 * (x + y * stride);
|
||||||
int v = s->mecc.frame_skip_cmp[1](s, dptr, rptr, stride, 8);
|
int v = s->mecc.frame_skip_cmp[1](s, dptr, rptr, stride, 8);
|
||||||
|
|
||||||
switch (s->avctx->frame_skip_exp) {
|
switch (s->frame_skip_exp) {
|
||||||
case 0: score = FFMAX(score, v); break;
|
case 0: score = FFMAX(score, v); break;
|
||||||
case 1: score += FFABS(v); break;
|
case 1: score += FFABS(v); break;
|
||||||
case 2: score += v * v; break;
|
case 2: score += v * v; break;
|
||||||
@@ -1163,9 +1176,9 @@ static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
|
|||||||
if (score)
|
if (score)
|
||||||
score64 = score;
|
score64 = score;
|
||||||
|
|
||||||
if (score64 < s->avctx->frame_skip_threshold)
|
if (score64 < s->frame_skip_threshold)
|
||||||
return 1;
|
return 1;
|
||||||
if (score64 < ((s->avctx->frame_skip_factor * (int64_t)s->lambda) >> 8))
|
if (score64 < ((s->frame_skip_factor * (int64_t) s->lambda) >> 8))
|
||||||
return 1;
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1320,7 +1333,7 @@ static int select_input_picture(MpegEncContext *s)
|
|||||||
} else {
|
} else {
|
||||||
int b_frames = 0;
|
int b_frames = 0;
|
||||||
|
|
||||||
if (s->avctx->frame_skip_threshold || s->avctx->frame_skip_factor) {
|
if (s->frame_skip_threshold || s->frame_skip_factor) {
|
||||||
if (s->picture_in_gop_number < s->gop_size &&
|
if (s->picture_in_gop_number < s->gop_size &&
|
||||||
skip_check(s, s->input_picture[0], s->next_picture_ptr)) {
|
skip_check(s, s->input_picture[0], s->next_picture_ptr)) {
|
||||||
// FIXME check that te gop check above is +-1 correct
|
// FIXME check that te gop check above is +-1 correct
|
||||||
|
|||||||
@@ -363,10 +363,12 @@ static const AVOption avcodec_options[] = {
|
|||||||
{"dts_hd_ma", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_PROFILE_DTS_HD_MA }, INT_MIN, INT_MAX, A|E, "profile"},
|
{"dts_hd_ma", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_PROFILE_DTS_HD_MA }, INT_MIN, INT_MAX, A|E, "profile"},
|
||||||
{"level", NULL, OFFSET(level), AV_OPT_TYPE_INT, {.i64 = FF_LEVEL_UNKNOWN }, INT_MIN, INT_MAX, V|A|E, "level"},
|
{"level", NULL, OFFSET(level), AV_OPT_TYPE_INT, {.i64 = FF_LEVEL_UNKNOWN }, INT_MIN, INT_MAX, V|A|E, "level"},
|
||||||
{"unknown", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_LEVEL_UNKNOWN }, INT_MIN, INT_MAX, V|A|E, "level"},
|
{"unknown", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_LEVEL_UNKNOWN }, INT_MIN, INT_MAX, V|A|E, "level"},
|
||||||
|
#if FF_API_PRIVATE_OPT
|
||||||
{"skip_threshold", "frame skip threshold", OFFSET(frame_skip_threshold), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E},
|
{"skip_threshold", "frame skip threshold", OFFSET(frame_skip_threshold), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E},
|
||||||
{"skip_factor", "frame skip factor", OFFSET(frame_skip_factor), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E},
|
{"skip_factor", "frame skip factor", OFFSET(frame_skip_factor), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E},
|
||||||
{"skip_exp", "frame skip exponent", OFFSET(frame_skip_exp), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E},
|
{"skip_exp", "frame skip exponent", OFFSET(frame_skip_exp), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E},
|
||||||
{"skipcmp", "frame skip compare function", OFFSET(frame_skip_cmp), AV_OPT_TYPE_INT, {.i64 = FF_CMP_DCTMAX }, INT_MIN, INT_MAX, V|E, "cmp_func"},
|
{"skipcmp", "frame skip compare function", OFFSET(frame_skip_cmp), AV_OPT_TYPE_INT, {.i64 = FF_CMP_DCTMAX }, INT_MIN, INT_MAX, V|E, "cmp_func"},
|
||||||
|
#endif
|
||||||
#if FF_API_MPV_OPT
|
#if FF_API_MPV_OPT
|
||||||
{"border_mask", "deprecated, use encoder private options instead", OFFSET(border_masking), AV_OPT_TYPE_FLOAT, {.dbl = DEFAULT }, -FLT_MAX, FLT_MAX, V|E},
|
{"border_mask", "deprecated, use encoder private options instead", OFFSET(border_masking), AV_OPT_TYPE_FLOAT, {.dbl = DEFAULT }, -FLT_MAX, FLT_MAX, V|E},
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user