You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-04 22:03:09 +02:00
avcodec/mpegvideo: Move frame_skip_* fields to MPVMainEncContext
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
@ -510,13 +510,6 @@ typedef struct MpegEncContext {
|
|||||||
|
|
||||||
int error_rate;
|
int error_rate;
|
||||||
|
|
||||||
/* frame skip options for encoding */
|
|
||||||
int frame_skip_threshold;
|
|
||||||
int frame_skip_factor;
|
|
||||||
int frame_skip_exp;
|
|
||||||
int frame_skip_cmp;
|
|
||||||
me_cmp_func frame_skip_cmp_fn;
|
|
||||||
|
|
||||||
int scenechange_threshold;
|
int scenechange_threshold;
|
||||||
int noise_reduction;
|
int noise_reduction;
|
||||||
|
|
||||||
|
@ -307,8 +307,9 @@ av_cold void ff_dct_encode_init(MpegEncContext *s)
|
|||||||
s->dct_quantize = dct_quantize_trellis_c;
|
s->dct_quantize = dct_quantize_trellis_c;
|
||||||
}
|
}
|
||||||
|
|
||||||
static av_cold int me_cmp_init(MpegEncContext *s, AVCodecContext *avctx)
|
static av_cold int me_cmp_init(MPVMainEncContext *const m, AVCodecContext *avctx)
|
||||||
{
|
{
|
||||||
|
MpegEncContext *const s = &m->s;
|
||||||
MECmpContext mecc;
|
MECmpContext mecc;
|
||||||
me_cmp_func me_cmp[6];
|
me_cmp_func me_cmp[6];
|
||||||
int ret;
|
int ret;
|
||||||
@ -317,10 +318,10 @@ static av_cold int me_cmp_init(MpegEncContext *s, AVCodecContext *avctx)
|
|||||||
ret = ff_me_init(&s->me, avctx, &mecc, 1);
|
ret = ff_me_init(&s->me, avctx, &mecc, 1);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
ret = ff_set_cmp(&mecc, me_cmp, s->frame_skip_cmp, 1);
|
ret = ff_set_cmp(&mecc, me_cmp, m->frame_skip_cmp, 1);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
s->frame_skip_cmp_fn = me_cmp[1];
|
m->frame_skip_cmp_fn = me_cmp[1];
|
||||||
if (avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT) {
|
if (avctx->flags & AV_CODEC_FLAG_INTERLACED_DCT) {
|
||||||
ret = ff_set_cmp(&mecc, me_cmp, avctx->ildct_cmp, 1);
|
ret = ff_set_cmp(&mecc, me_cmp, avctx->ildct_cmp, 1);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@ -898,7 +899,7 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
|
|||||||
s->alternate_scan);
|
s->alternate_scan);
|
||||||
|
|
||||||
if (avctx->flags & AV_CODEC_FLAG_PSNR || avctx->mb_decision == FF_MB_DECISION_RD ||
|
if (avctx->flags & AV_CODEC_FLAG_PSNR || avctx->mb_decision == FF_MB_DECISION_RD ||
|
||||||
s->frame_skip_threshold || s->frame_skip_factor) {
|
m->frame_skip_threshold || m->frame_skip_factor) {
|
||||||
s->frame_reconstruction_bitfield = (1 << AV_PICTURE_TYPE_I) |
|
s->frame_reconstruction_bitfield = (1 << AV_PICTURE_TYPE_I) |
|
||||||
(1 << AV_PICTURE_TYPE_P) |
|
(1 << AV_PICTURE_TYPE_P) |
|
||||||
(1 << AV_PICTURE_TYPE_B);
|
(1 << AV_PICTURE_TYPE_B);
|
||||||
@ -922,7 +923,7 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
|
|||||||
ff_fdctdsp_init(&s->fdsp, avctx);
|
ff_fdctdsp_init(&s->fdsp, avctx);
|
||||||
ff_mpegvideoencdsp_init(&s->mpvencdsp, avctx);
|
ff_mpegvideoencdsp_init(&s->mpvencdsp, avctx);
|
||||||
ff_pixblockdsp_init(&s->pdsp, avctx);
|
ff_pixblockdsp_init(&s->pdsp, avctx);
|
||||||
ret = me_cmp_init(s, avctx);
|
ret = me_cmp_init(m, avctx);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
@ -1402,8 +1403,10 @@ fail:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int skip_check(MpegEncContext *s, const MPVPicture *p, const MPVPicture *ref)
|
static int skip_check(MPVMainEncContext *const m,
|
||||||
|
const MPVPicture *p, const MPVPicture *ref)
|
||||||
{
|
{
|
||||||
|
MpegEncContext *const s = &m->s;
|
||||||
int x, y, plane;
|
int x, y, plane;
|
||||||
int score = 0;
|
int score = 0;
|
||||||
int64_t score64 = 0;
|
int64_t score64 = 0;
|
||||||
@ -1416,9 +1419,9 @@ static int skip_check(MpegEncContext *s, const MPVPicture *p, const MPVPicture *
|
|||||||
int off = p->shared ? 0 : 16;
|
int off = p->shared ? 0 : 16;
|
||||||
const uint8_t *dptr = p->f->data[plane] + 8 * (x + y * stride) + off;
|
const uint8_t *dptr = p->f->data[plane] + 8 * (x + y * stride) + off;
|
||||||
const uint8_t *rptr = ref->f->data[plane] + 8 * (x + y * stride);
|
const uint8_t *rptr = ref->f->data[plane] + 8 * (x + y * stride);
|
||||||
int v = s->frame_skip_cmp_fn(s, dptr, rptr, stride, 8);
|
int v = m->frame_skip_cmp_fn(s, dptr, rptr, stride, 8);
|
||||||
|
|
||||||
switch (FFABS(s->frame_skip_exp)) {
|
switch (FFABS(m->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: score64 += v * (int64_t)v; break;
|
case 2: score64 += v * (int64_t)v; break;
|
||||||
@ -1432,13 +1435,13 @@ static int skip_check(MpegEncContext *s, const MPVPicture *p, const MPVPicture *
|
|||||||
|
|
||||||
if (score)
|
if (score)
|
||||||
score64 = score;
|
score64 = score;
|
||||||
if (s->frame_skip_exp < 0)
|
if (m->frame_skip_exp < 0)
|
||||||
score64 = pow(score64 / (double)(s->mb_width * s->mb_height),
|
score64 = pow(score64 / (double)(s->mb_width * s->mb_height),
|
||||||
-1.0/s->frame_skip_exp);
|
-1.0/m->frame_skip_exp);
|
||||||
|
|
||||||
if (score64 < s->frame_skip_threshold)
|
if (score64 < m->frame_skip_threshold)
|
||||||
return 1;
|
return 1;
|
||||||
if (score64 < ((s->frame_skip_factor * (int64_t) s->lambda) >> 8))
|
if (score64 < ((m->frame_skip_factor * (int64_t) s->lambda) >> 8))
|
||||||
return 1;
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1626,10 +1629,10 @@ static int set_bframe_chain_length(MPVMainEncContext *const m)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* set next picture type & ordering */
|
/* set next picture type & ordering */
|
||||||
if (s->frame_skip_threshold || s->frame_skip_factor) {
|
if (m->frame_skip_threshold || m->frame_skip_factor) {
|
||||||
if (s->picture_in_gop_number < s->gop_size &&
|
if (s->picture_in_gop_number < s->gop_size &&
|
||||||
s->next_pic.ptr &&
|
s->next_pic.ptr &&
|
||||||
skip_check(s, s->input_picture[0], s->next_pic.ptr)) {
|
skip_check(m, s->input_picture[0], s->next_pic.ptr)) {
|
||||||
// FIXME check that the gop check above is +-1 correct
|
// FIXME check that the gop check above is +-1 correct
|
||||||
av_refstruct_unref(&s->input_picture[0]);
|
av_refstruct_unref(&s->input_picture[0]);
|
||||||
|
|
||||||
|
@ -45,6 +45,13 @@ typedef struct MPVMainEncContext {
|
|||||||
int b_sensitivity;
|
int b_sensitivity;
|
||||||
int brd_scale;
|
int brd_scale;
|
||||||
|
|
||||||
|
/* frame skip options */
|
||||||
|
int frame_skip_threshold;
|
||||||
|
int frame_skip_factor;
|
||||||
|
int frame_skip_exp;
|
||||||
|
int frame_skip_cmp;
|
||||||
|
me_cmp_func frame_skip_cmp_fn;
|
||||||
|
|
||||||
/* bit rate control */
|
/* bit rate control */
|
||||||
int64_t total_bits;
|
int64_t total_bits;
|
||||||
int frame_bits; ///< bits used for the current frame
|
int frame_bits; ///< bits used for the current frame
|
||||||
@ -134,10 +141,10 @@ FF_MPV_OPT_CMP_FUNC, \
|
|||||||
{"border_mask", "increase the quantizer for macroblocks close to borders", FF_MPV_OFFSET(border_masking), AV_OPT_TYPE_FLOAT, {.dbl = 0 }, -FLT_MAX, FLT_MAX, FF_MPV_OPT_FLAGS}, \
|
{"border_mask", "increase the quantizer for macroblocks close to borders", FF_MPV_OFFSET(border_masking), AV_OPT_TYPE_FLOAT, {.dbl = 0 }, -FLT_MAX, FLT_MAX, FF_MPV_OPT_FLAGS}, \
|
||||||
{"lmin", "minimum Lagrange factor (VBR)", FF_MPV_OFFSET(lmin), AV_OPT_TYPE_INT, {.i64 = 2*FF_QP2LAMBDA }, 0, INT_MAX, FF_MPV_OPT_FLAGS }, \
|
{"lmin", "minimum Lagrange factor (VBR)", FF_MPV_OFFSET(lmin), AV_OPT_TYPE_INT, {.i64 = 2*FF_QP2LAMBDA }, 0, INT_MAX, FF_MPV_OPT_FLAGS }, \
|
||||||
{"lmax", "maximum Lagrange factor (VBR)", FF_MPV_OFFSET(lmax), AV_OPT_TYPE_INT, {.i64 = 31*FF_QP2LAMBDA }, 0, INT_MAX, FF_MPV_OPT_FLAGS }, \
|
{"lmax", "maximum Lagrange factor (VBR)", FF_MPV_OFFSET(lmax), AV_OPT_TYPE_INT, {.i64 = 31*FF_QP2LAMBDA }, 0, INT_MAX, 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_threshold", "Frame skip threshold", FF_MPV_MAIN_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_factor", "Frame skip factor", FF_MPV_MAIN_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_exp", "Frame skip exponent", FF_MPV_MAIN_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, .unit = "cmp_func" }, \
|
{"skip_cmp", "Frame skip compare function", FF_MPV_MAIN_OFFSET(frame_skip_cmp), AV_OPT_TYPE_INT, {.i64 = FF_CMP_DCTMAX }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS, .unit = "cmp_func" }, \
|
||||||
{"sc_threshold", "Scene change threshold", FF_MPV_OFFSET(scenechange_threshold), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \
|
{"sc_threshold", "Scene change threshold", FF_MPV_OFFSET(scenechange_threshold), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \
|
||||||
{"noise_reduction", "Noise reduction", FF_MPV_OFFSET(noise_reduction), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \
|
{"noise_reduction", "Noise reduction", FF_MPV_OFFSET(noise_reduction), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \
|
||||||
{"ps", "RTP payload size in bytes", FF_MPV_OFFSET(rtp_payload_size), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \
|
{"ps", "RTP payload size in bytes", FF_MPV_OFFSET(rtp_payload_size), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS }, \
|
||||||
|
Reference in New Issue
Block a user