[FFmpeg-devel] [PATCH v3] avcodec/snowenc: fix setting motion_est option
James Almer
jamrial at gmail.com
Sat Aug 26 21:21:43 EEST 2017
Remove usage of FF_MPV_COMMON_OPTS, and set SnowContext.motion_est directly.
Based on code from svq1enc.c
Signed-off-by: James Almer <jamrial at gmail.com>
---
libavcodec/snow.h | 3 ++-
libavcodec/snowenc.c | 11 +++++++----
2 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/libavcodec/snow.h b/libavcodec/snow.h
index f7ed1f82e7..41a3bef4de 100644
--- a/libavcodec/snow.h
+++ b/libavcodec/snow.h
@@ -32,10 +32,11 @@
#include "rangecoder.h"
#include "mathops.h"
-#define FF_MPV_OFFSET(x) (offsetof(MpegEncContext, x) + offsetof(SnowContext, m))
#include "mpegvideo.h"
#include "h264qpel.h"
+#define FF_ME_ITER 3
+
#define MID_STATE 128
#define MAX_PLANES 4
diff --git a/libavcodec/snowenc.c b/libavcodec/snowenc.c
index ca55914d9e..75940437c1 100644
--- a/libavcodec/snowenc.c
+++ b/libavcodec/snowenc.c
@@ -33,8 +33,6 @@
#include "mpegvideo.h"
#include "h263.h"
-#define FF_ME_ITER 50
-
static av_cold int encode_init(AVCodecContext *avctx)
{
SnowContext *s = avctx->priv_data;
@@ -1685,6 +1683,8 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
s->m.unrestricted_mv= 1;
s->m.lambda = s->lambda;
+ s->m.lmin = avctx->mb_lmin;
+ s->m.lmax = avctx->mb_lmax;
s->m.qscale= (s->m.lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7);
s->lambda2= s->m.lambda2= (s->m.lambda*s->m.lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT;
@@ -1919,8 +1919,11 @@ static av_cold int encode_end(AVCodecContext *avctx)
#define OFFSET(x) offsetof(SnowContext, x)
#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
static const AVOption options[] = {
- FF_MPV_COMMON_OPTS
- { "iter", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_ITER }, 0, 0, FF_MPV_OPT_FLAGS, "motion_est" },
+ {"motion_est", "motion estimation algorithm", OFFSET(motion_est), AV_OPT_TYPE_INT, {.i64 = FF_ME_EPZS }, FF_ME_ZERO, FF_ME_ITER, VE, "motion_est" },
+ { "zero", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_ZERO }, 0, 0, VE, "motion_est" },
+ { "epzs", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_EPZS }, 0, 0, VE, "motion_est" },
+ { "xone", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_XONE }, 0, 0, VE, "motion_est" },
+ { "iter", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_ITER }, 0, 0, VE, "motion_est" },
{ "memc_only", "Only do ME/MC (I frames -> ref, P frame -> ME+MC).", OFFSET(memc_only), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
{ "no_bitstream", "Skip final bitstream writeout.", OFFSET(no_bitstream), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
{ "intra_penalty", "Penalty for intra blocks in block decission", OFFSET(intra_penalty), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE },
--
2.13.3
More information about the ffmpeg-devel
mailing list