Merge commit '4b6b1082a73907c7c3de2646c6398bc61320f2c6'
* commit '4b6b1082a73907c7c3de2646c6398bc61320f2c6': lavc: Deprecate avctx.me_method Conflicts: doc/encoders.texi libavcodec/avcodec.h libavcodec/libx264.c libavcodec/motion_est.c libavcodec/options_table.h libavcodec/version.h Merged-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
		@@ -645,7 +645,9 @@ typedef struct AVCodecDescriptor {
 | 
			
		||||
/**
 | 
			
		||||
 * @ingroup lavc_encoding
 | 
			
		||||
 * motion estimation type.
 | 
			
		||||
 * @deprecated use codec private option instead
 | 
			
		||||
 */
 | 
			
		||||
#if FF_API_MOTION_EST
 | 
			
		||||
enum Motion_Est_ID {
 | 
			
		||||
    ME_ZERO = 1,    ///< no search, that is use 0,0 vector whenever one is needed
 | 
			
		||||
    ME_FULL,
 | 
			
		||||
@@ -658,6 +660,7 @@ enum Motion_Est_ID {
 | 
			
		||||
    ME_TESA,        ///< transformed exhaustive search algorithm
 | 
			
		||||
    ME_ITER=50,     ///< iterative search
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @ingroup lavc_decoding
 | 
			
		||||
@@ -1485,14 +1488,13 @@ typedef struct AVCodecContext {
 | 
			
		||||
     */
 | 
			
		||||
    enum AVPixelFormat pix_fmt;
 | 
			
		||||
 | 
			
		||||
#if FF_API_MOTION_EST
 | 
			
		||||
    /**
 | 
			
		||||
     * Motion estimation algorithm used for video coding.
 | 
			
		||||
     * 1 (zero), 2 (full), 3 (log), 4 (phods), 5 (epzs), 6 (x1), 7 (hex),
 | 
			
		||||
     * 8 (umh), 9 (iter), 10 (tesa) [7, 8, 10 are x264 specific, 9 is snow specific]
 | 
			
		||||
     * - encoding: MUST be set by user.
 | 
			
		||||
     * - decoding: unused
 | 
			
		||||
     * This option does nothing
 | 
			
		||||
     * @deprecated use codec private options instead
 | 
			
		||||
     */
 | 
			
		||||
    int me_method;
 | 
			
		||||
    attribute_deprecated int me_method;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * If non NULL, 'draw_horiz_band' is called by the libavcodec
 | 
			
		||||
 
 | 
			
		||||
@@ -81,6 +81,7 @@ typedef struct X264Context {
 | 
			
		||||
    char *stats;
 | 
			
		||||
    int nal_hrd;
 | 
			
		||||
    int avcintra_class;
 | 
			
		||||
    int motion_est;
 | 
			
		||||
    char *x264_params;
 | 
			
		||||
} X264Context;
 | 
			
		||||
 | 
			
		||||
@@ -470,17 +471,6 @@ static av_cold int X264_init(AVCodecContext *avctx)
 | 
			
		||||
    if (avctx->chromaoffset)
 | 
			
		||||
        x4->params.analyse.i_chroma_qp_offset = avctx->chromaoffset;
 | 
			
		||||
 | 
			
		||||
    if (avctx->me_method == ME_EPZS)
 | 
			
		||||
        x4->params.analyse.i_me_method = X264_ME_DIA;
 | 
			
		||||
    else if (avctx->me_method == ME_HEX)
 | 
			
		||||
        x4->params.analyse.i_me_method = X264_ME_HEX;
 | 
			
		||||
    else if (avctx->me_method == ME_UMH)
 | 
			
		||||
        x4->params.analyse.i_me_method = X264_ME_UMH;
 | 
			
		||||
    else if (avctx->me_method == ME_FULL)
 | 
			
		||||
        x4->params.analyse.i_me_method = X264_ME_ESA;
 | 
			
		||||
    else if (avctx->me_method == ME_TESA)
 | 
			
		||||
        x4->params.analyse.i_me_method = X264_ME_TESA;
 | 
			
		||||
 | 
			
		||||
    if (avctx->gop_size >= 0)
 | 
			
		||||
        x4->params.i_keyint_max         = avctx->gop_size;
 | 
			
		||||
    if (avctx->max_b_frames >= 0)
 | 
			
		||||
@@ -633,6 +623,25 @@ static av_cold int X264_init(AVCodecContext *avctx)
 | 
			
		||||
    if (x4->nal_hrd >= 0)
 | 
			
		||||
        x4->params.i_nal_hrd = x4->nal_hrd;
 | 
			
		||||
 | 
			
		||||
    if (x4->motion_est >= 0) {
 | 
			
		||||
        x4->params.analyse.i_me_method = x4->motion_est;
 | 
			
		||||
#if FF_API_MOTION_EST
 | 
			
		||||
FF_DISABLE_DEPRECATION_WARNINGS
 | 
			
		||||
    } else {
 | 
			
		||||
        if (avctx->me_method == ME_EPZS)
 | 
			
		||||
            x4->params.analyse.i_me_method = X264_ME_DIA;
 | 
			
		||||
        else if (avctx->me_method == ME_HEX)
 | 
			
		||||
            x4->params.analyse.i_me_method = X264_ME_HEX;
 | 
			
		||||
        else if (avctx->me_method == ME_UMH)
 | 
			
		||||
            x4->params.analyse.i_me_method = X264_ME_UMH;
 | 
			
		||||
        else if (avctx->me_method == ME_FULL)
 | 
			
		||||
            x4->params.analyse.i_me_method = X264_ME_ESA;
 | 
			
		||||
        else if (avctx->me_method == ME_TESA)
 | 
			
		||||
            x4->params.analyse.i_me_method = X264_ME_TESA;
 | 
			
		||||
FF_ENABLE_DEPRECATION_WARNINGS
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (x4->profile)
 | 
			
		||||
        if (x264_param_apply_profile(&x4->params, x4->profile) < 0) {
 | 
			
		||||
            int i;
 | 
			
		||||
@@ -854,6 +863,12 @@ static const AVOption options[] = {
 | 
			
		||||
    { "vbr",           NULL, 0, AV_OPT_TYPE_CONST, {.i64 = X264_NAL_HRD_VBR},  INT_MIN, INT_MAX, VE, "nal-hrd" },
 | 
			
		||||
    { "cbr",           NULL, 0, AV_OPT_TYPE_CONST, {.i64 = X264_NAL_HRD_CBR},  INT_MIN, INT_MAX, VE, "nal-hrd" },
 | 
			
		||||
    { "avcintra-class","AVC-Intra class 50/100/200",                      OFFSET(avcintra_class),AV_OPT_TYPE_INT,     { .i64 = -1 }, -1, 200   , VE},
 | 
			
		||||
    { "motion-est",   "Set motion estimation method",                     OFFSET(motion_est),    AV_OPT_TYPE_INT,    { .i64 = -1 }, -1, X264_ME_TESA, VE, "motion-est"},
 | 
			
		||||
    { "dia",           NULL, 0, AV_OPT_TYPE_CONST, { .i64 = X264_ME_DIA },  INT_MIN, INT_MAX, VE, "motion-est" },
 | 
			
		||||
    { "hex",           NULL, 0, AV_OPT_TYPE_CONST, { .i64 = X264_ME_HEX },  INT_MIN, INT_MAX, VE, "motion-est" },
 | 
			
		||||
    { "umh",           NULL, 0, AV_OPT_TYPE_CONST, { .i64 = X264_ME_UMH },  INT_MIN, INT_MAX, VE, "motion-est" },
 | 
			
		||||
    { "esa",           NULL, 0, AV_OPT_TYPE_CONST, { .i64 = X264_ME_ESA },  INT_MIN, INT_MAX, VE, "motion-est" },
 | 
			
		||||
    { "tesa",          NULL, 0, AV_OPT_TYPE_CONST, { .i64 = X264_ME_TESA }, INT_MIN, INT_MAX, VE, "motion-est" },
 | 
			
		||||
    { "x264-params",  "Override the x264 configuration using a :-separated list of key=value parameters", OFFSET(x264_params), AV_OPT_TYPE_STRING, { 0 }, 0, 0, VE },
 | 
			
		||||
    { NULL },
 | 
			
		||||
};
 | 
			
		||||
@@ -876,7 +891,9 @@ static const AVCodecDefault x264_defaults[] = {
 | 
			
		||||
    { "trellis",          "-1" },
 | 
			
		||||
    { "nr",               "-1" },
 | 
			
		||||
    { "me_range",         "-1" },
 | 
			
		||||
#if FF_API_MOTION_EST
 | 
			
		||||
    { "me_method",        "-1" },
 | 
			
		||||
#endif
 | 
			
		||||
    { "subq",             "-1" },
 | 
			
		||||
    { "b_strategy",       "-1" },
 | 
			
		||||
    { "keyint_min",       "-1" },
 | 
			
		||||
 
 | 
			
		||||
@@ -53,6 +53,7 @@ typedef struct XavsContext {
 | 
			
		||||
    int direct_pred;
 | 
			
		||||
    int aud;
 | 
			
		||||
    int fast_pskip;
 | 
			
		||||
    int motion_est;
 | 
			
		||||
    int mbtree;
 | 
			
		||||
    int mixed_refs;
 | 
			
		||||
 | 
			
		||||
@@ -269,6 +270,8 @@ static av_cold int XAVS_init(AVCodecContext *avctx)
 | 
			
		||||
        x4->params.analyse.i_direct_mv_pred   = x4->direct_pred;
 | 
			
		||||
    if (x4->fast_pskip >= 0)
 | 
			
		||||
        x4->params.analyse.b_fast_pskip       = x4->fast_pskip;
 | 
			
		||||
    if (x4->motion_est >= 0)
 | 
			
		||||
        x4->params.analyse.i_me_method        = x4->motion_est;
 | 
			
		||||
    if (x4->mixed_refs >= 0)
 | 
			
		||||
        x4->params.analyse.b_mixed_references = x4->mixed_refs;
 | 
			
		||||
    if (x4->b_bias != INT_MIN)
 | 
			
		||||
@@ -276,6 +279,32 @@ static av_cold int XAVS_init(AVCodecContext *avctx)
 | 
			
		||||
    if (x4->cplxblur >= 0)
 | 
			
		||||
        x4->params.rc.f_complexity_blur = x4->cplxblur;
 | 
			
		||||
 | 
			
		||||
#if FF_API_MOTION_EST
 | 
			
		||||
FF_DISABLE_DEPRECATION_WARNINGS
 | 
			
		||||
    if (x4->motion_est < 0) {
 | 
			
		||||
        switch (avctx->me_method) {
 | 
			
		||||
        case  ME_EPZS:
 | 
			
		||||
            x4->params.analyse.i_me_method = XAVS_ME_DIA;
 | 
			
		||||
            break;
 | 
			
		||||
        case  ME_HEX:
 | 
			
		||||
            x4->params.analyse.i_me_method = XAVS_ME_HEX;
 | 
			
		||||
            break;
 | 
			
		||||
        case  ME_UMH:
 | 
			
		||||
            x4->params.analyse.i_me_method = XAVS_ME_UMH;
 | 
			
		||||
            break;
 | 
			
		||||
        case  ME_FULL:
 | 
			
		||||
            x4->params.analyse.i_me_method = XAVS_ME_ESA;
 | 
			
		||||
            break;
 | 
			
		||||
        case  ME_TESA:
 | 
			
		||||
            x4->params.analyse.i_me_method = XAVS_ME_TESA;
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            x4->params.analyse.i_me_method = XAVS_ME_HEX;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
FF_ENABLE_DEPRECATION_WARNINGS
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    x4->params.i_bframe          = avctx->max_b_frames;
 | 
			
		||||
    /* cabac is not included in AVS JiZhun Profile */
 | 
			
		||||
    x4->params.b_cabac           = 0;
 | 
			
		||||
@@ -312,26 +341,6 @@ static av_cold int XAVS_init(AVCodecContext *avctx)
 | 
			
		||||
    x4->params.i_fps_den            = avctx->time_base.num;
 | 
			
		||||
    x4->params.analyse.inter        = XAVS_ANALYSE_I8x8 |XAVS_ANALYSE_PSUB16x16| XAVS_ANALYSE_BSUB16x16;
 | 
			
		||||
 | 
			
		||||
    switch (avctx->me_method) {
 | 
			
		||||
         case  ME_EPZS:
 | 
			
		||||
               x4->params.analyse.i_me_method = XAVS_ME_DIA;
 | 
			
		||||
               break;
 | 
			
		||||
         case  ME_HEX:
 | 
			
		||||
               x4->params.analyse.i_me_method = XAVS_ME_HEX;
 | 
			
		||||
               break;
 | 
			
		||||
         case  ME_UMH:
 | 
			
		||||
               x4->params.analyse.i_me_method = XAVS_ME_UMH;
 | 
			
		||||
               break;
 | 
			
		||||
         case  ME_FULL:
 | 
			
		||||
               x4->params.analyse.i_me_method = XAVS_ME_ESA;
 | 
			
		||||
               break;
 | 
			
		||||
         case  ME_TESA:
 | 
			
		||||
               x4->params.analyse.i_me_method = XAVS_ME_TESA;
 | 
			
		||||
               break;
 | 
			
		||||
         default:
 | 
			
		||||
               x4->params.analyse.i_me_method = XAVS_ME_HEX;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    x4->params.analyse.i_me_range = avctx->me_range;
 | 
			
		||||
    x4->params.analyse.i_subpel_refine    = avctx->me_subpel_quality;
 | 
			
		||||
 | 
			
		||||
@@ -422,6 +431,13 @@ static const AVOption options[] = {
 | 
			
		||||
    { "mbtree",        "Use macroblock tree ratecontrol.",                OFFSET(mbtree),        AV_OPT_TYPE_INT,    {.i64 = -1 }, -1, 1, VE},
 | 
			
		||||
    { "mixed-refs",    "One reference per partition, as opposed to one reference per macroblock", OFFSET(mixed_refs), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 1, VE },
 | 
			
		||||
    { "fast-pskip",    NULL,                                              OFFSET(fast_pskip),    AV_OPT_TYPE_INT,    {.i64 = -1 }, -1, 1, VE},
 | 
			
		||||
    { "motion-est",   "Set motion estimation method",                     OFFSET(motion_est),    AV_OPT_TYPE_INT,    { .i64 = -1 }, -1, XAVS_ME_TESA, VE, "motion-est"},
 | 
			
		||||
    { "dia",           NULL,      0,    AV_OPT_TYPE_CONST, { .i64 = XAVS_ME_DIA },               INT_MIN, INT_MAX, VE, "motion-est" },
 | 
			
		||||
    { "hex",           NULL,      0,    AV_OPT_TYPE_CONST, { .i64 = XAVS_ME_HEX },               INT_MIN, INT_MAX, VE, "motion-est" },
 | 
			
		||||
    { "umh",           NULL,      0,    AV_OPT_TYPE_CONST, { .i64 = XAVS_ME_UMH },               INT_MIN, INT_MAX, VE, "motion-est" },
 | 
			
		||||
    { "esa",           NULL,      0,    AV_OPT_TYPE_CONST, { .i64 = XAVS_ME_ESA },               INT_MIN, INT_MAX, VE, "motion-est" },
 | 
			
		||||
    { "tesa",          NULL,      0,    AV_OPT_TYPE_CONST, { .i64 = XAVS_ME_TESA },              INT_MIN, INT_MAX, VE, "motion-est" },
 | 
			
		||||
 | 
			
		||||
    { NULL },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -77,6 +77,7 @@ struct xvid_context {
 | 
			
		||||
    int ssim;                      /**< SSIM information display mode */
 | 
			
		||||
    int ssim_acc;                  /**< SSIM accuracy. 0: accurate. 4: fast. */
 | 
			
		||||
    int gmc;
 | 
			
		||||
    int me_quality;                /**< Motion estimation quality. 0: fast 6: best. */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -392,27 +393,46 @@ static av_cold int xvid_encode_init(AVCodecContext *avctx)
 | 
			
		||||
 | 
			
		||||
    /* Decide which ME quality setting to use */
 | 
			
		||||
    x->me_flags = 0;
 | 
			
		||||
    switch (x->me_quality) {
 | 
			
		||||
    case 6:
 | 
			
		||||
    case 5:
 | 
			
		||||
        x->me_flags |= XVID_ME_EXTSEARCH16 |
 | 
			
		||||
                       XVID_ME_EXTSEARCH8;
 | 
			
		||||
    case 4:
 | 
			
		||||
    case 3:
 | 
			
		||||
        x->me_flags |= XVID_ME_ADVANCEDDIAMOND8 |
 | 
			
		||||
                       XVID_ME_HALFPELREFINE8   |
 | 
			
		||||
                       XVID_ME_CHROMA_PVOP      |
 | 
			
		||||
                       XVID_ME_CHROMA_BVOP;
 | 
			
		||||
    case 2:
 | 
			
		||||
    case 1:
 | 
			
		||||
        x->me_flags |= XVID_ME_ADVANCEDDIAMOND16 |
 | 
			
		||||
                       XVID_ME_HALFPELREFINE16;
 | 
			
		||||
#if FF_API_MOTION_EST
 | 
			
		||||
FF_DISABLE_DEPRECATION_WARNINGS
 | 
			
		||||
        break;
 | 
			
		||||
    default:
 | 
			
		||||
        switch (avctx->me_method) {
 | 
			
		||||
        case ME_FULL:   /* Quality 6 */
 | 
			
		||||
             x->me_flags |= XVID_ME_EXTSEARCH16 |
 | 
			
		||||
                            XVID_ME_EXTSEARCH8;
 | 
			
		||||
 | 
			
		||||
        case ME_EPZS:   /* Quality 4 */
 | 
			
		||||
             x->me_flags |= XVID_ME_ADVANCEDDIAMOND8 |
 | 
			
		||||
                            XVID_ME_HALFPELREFINE8   |
 | 
			
		||||
                            XVID_ME_CHROMA_PVOP      |
 | 
			
		||||
                            XVID_ME_CHROMA_BVOP;
 | 
			
		||||
 | 
			
		||||
        case ME_LOG:    /* Quality 2 */
 | 
			
		||||
        case ME_PHODS:
 | 
			
		||||
        case ME_X1:
 | 
			
		||||
             x->me_flags |= XVID_ME_ADVANCEDDIAMOND16 |
 | 
			
		||||
                            XVID_ME_HALFPELREFINE16;
 | 
			
		||||
 | 
			
		||||
        case ME_ZERO:   /* Quality 0 */
 | 
			
		||||
        default:
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
FF_ENABLE_DEPRECATION_WARNINGS
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Decide how we should decide blocks */
 | 
			
		||||
    switch (avctx->mb_decision) {
 | 
			
		||||
@@ -863,6 +883,7 @@ static const AVOption options[] = {
 | 
			
		||||
    { "frame",       NULL,                                                0, AV_OPT_TYPE_CONST, { .i64 = 2 }, INT_MIN, INT_MAX, VE, "ssim" },
 | 
			
		||||
    { "ssim_acc",    "SSIM accuracy",                   OFFSET(ssim_acc),    AV_OPT_TYPE_INT,   { .i64 = 2 },       0,       4, VE         },
 | 
			
		||||
    { "gmc",         "use GMC",                         OFFSET(gmc),         AV_OPT_TYPE_INT,   { .i64 = 0 },       0,       1, VE         },
 | 
			
		||||
    { "me_quality",  "Motion estimation quality",       OFFSET(me_quality),  AV_OPT_TYPE_INT,   { .i64 = 0 },       0,       6, VE         },
 | 
			
		||||
    { NULL },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -312,11 +312,26 @@ int ff_init_me(MpegEncContext *s){
 | 
			
		||||
        av_log(s->avctx, AV_LOG_ERROR, "ME_MAP size is too small for SAB diamond\n");
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if FF_API_MOTION_EST
 | 
			
		||||
    //special case of snow is needed because snow uses its own iterative ME code
 | 
			
		||||
    if(s->me_method!=ME_ZERO && s->me_method!=ME_EPZS && s->me_method!=ME_X1 && s->avctx->codec_id != AV_CODEC_ID_SNOW){
 | 
			
		||||
        av_log(s->avctx, AV_LOG_ERROR, "me_method is only allowed to be set to zero and epzs; for hex,umh,full and others see dia_size\n");
 | 
			
		||||
FF_DISABLE_DEPRECATION_WARNINGS
 | 
			
		||||
    if (s->motion_est == FF_ME_EPZS) {
 | 
			
		||||
        if (s->me_method == ME_ZERO)
 | 
			
		||||
            s->motion_est = FF_ME_ZERO;
 | 
			
		||||
        else if (s->me_method == ME_EPZS)
 | 
			
		||||
            s->motion_est = FF_ME_EPZS;
 | 
			
		||||
        else if (s->me_method == ME_X1)
 | 
			
		||||
            s->motion_est = FF_ME_XONE;
 | 
			
		||||
        else if (s->avctx->codec_id != AV_CODEC_ID_SNOW) {
 | 
			
		||||
            av_log(s->avctx, AV_LOG_ERROR,
 | 
			
		||||
                   "me_method is only allowed to be set to zero and epzs; "
 | 
			
		||||
                   "for hex,umh,full and others see dia_size\n");
 | 
			
		||||
            return -1;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
FF_ENABLE_DEPRECATION_WARNINGS
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    c->avctx= s->avctx;
 | 
			
		||||
 | 
			
		||||
@@ -891,7 +906,7 @@ void ff_estimate_p_frame_motion(MpegEncContext * s,
 | 
			
		||||
{
 | 
			
		||||
    MotionEstContext * const c= &s->me;
 | 
			
		||||
    uint8_t *pix, *ppix;
 | 
			
		||||
    int sum, mx, my, dmin;
 | 
			
		||||
    int sum, mx = 0, my = 0, dmin = 0;
 | 
			
		||||
    int varc;            ///< the variance of the block (sum of squared (p[y][x]-average))
 | 
			
		||||
    int vard;            ///< sum of squared differences with the estimated motion vector
 | 
			
		||||
    int P[10][2];
 | 
			
		||||
@@ -923,52 +938,43 @@ void ff_estimate_p_frame_motion(MpegEncContext * s,
 | 
			
		||||
    pic->mb_var [s->mb_stride * mb_y + mb_x] = (varc+128)>>8;
 | 
			
		||||
    c->mb_var_sum_temp += (varc+128)>>8;
 | 
			
		||||
 | 
			
		||||
    switch(s->me_method) {
 | 
			
		||||
    case ME_ZERO:
 | 
			
		||||
    default:
 | 
			
		||||
        mx   = 0;
 | 
			
		||||
        my   = 0;
 | 
			
		||||
        dmin = 0;
 | 
			
		||||
        break;
 | 
			
		||||
    case ME_X1:
 | 
			
		||||
    case ME_EPZS:
 | 
			
		||||
       {
 | 
			
		||||
    if (s->motion_est != FF_ME_ZERO) {
 | 
			
		||||
        const int mot_stride = s->b8_stride;
 | 
			
		||||
        const int mot_xy = s->block_index[0];
 | 
			
		||||
 | 
			
		||||
        P_LEFT[0] = s->current_picture.motion_val[0][mot_xy - 1][0];
 | 
			
		||||
        P_LEFT[1] = s->current_picture.motion_val[0][mot_xy - 1][1];
 | 
			
		||||
 | 
			
		||||
            if(P_LEFT[0]       > (c->xmax<<shift)) P_LEFT[0]       = (c->xmax<<shift);
 | 
			
		||||
        if (P_LEFT[0] > (c->xmax << shift))
 | 
			
		||||
            P_LEFT[0] =  c->xmax << shift;
 | 
			
		||||
 | 
			
		||||
            if(!s->first_slice_line) {
 | 
			
		||||
        if (!s->first_slice_line) {
 | 
			
		||||
            P_TOP[0]      = s->current_picture.motion_val[0][mot_xy - mot_stride    ][0];
 | 
			
		||||
            P_TOP[1]      = s->current_picture.motion_val[0][mot_xy - mot_stride    ][1];
 | 
			
		||||
            P_TOPRIGHT[0] = s->current_picture.motion_val[0][mot_xy - mot_stride + 2][0];
 | 
			
		||||
            P_TOPRIGHT[1] = s->current_picture.motion_val[0][mot_xy - mot_stride + 2][1];
 | 
			
		||||
                if(P_TOP[1]      > (c->ymax<<shift)) P_TOP[1]     = (c->ymax<<shift);
 | 
			
		||||
                if(P_TOPRIGHT[0] < (c->xmin<<shift)) P_TOPRIGHT[0]= (c->xmin<<shift);
 | 
			
		||||
                if(P_TOPRIGHT[1] > (c->ymax<<shift)) P_TOPRIGHT[1]= (c->ymax<<shift);
 | 
			
		||||
            if (P_TOP[1] > (c->ymax << shift))
 | 
			
		||||
                P_TOP[1] =  c->ymax << shift;
 | 
			
		||||
            if (P_TOPRIGHT[0] < (c->xmin << shift))
 | 
			
		||||
                P_TOPRIGHT[0] =  c->xmin << shift;
 | 
			
		||||
            if (P_TOPRIGHT[1] > (c->ymax << shift))
 | 
			
		||||
                P_TOPRIGHT[1] =  c->ymax << shift;
 | 
			
		||||
 | 
			
		||||
                P_MEDIAN[0]= mid_pred(P_LEFT[0], P_TOP[0], P_TOPRIGHT[0]);
 | 
			
		||||
                P_MEDIAN[1]= mid_pred(P_LEFT[1], P_TOP[1], P_TOPRIGHT[1]);
 | 
			
		||||
            P_MEDIAN[0] = mid_pred(P_LEFT[0], P_TOP[0], P_TOPRIGHT[0]);
 | 
			
		||||
            P_MEDIAN[1] = mid_pred(P_LEFT[1], P_TOP[1], P_TOPRIGHT[1]);
 | 
			
		||||
 | 
			
		||||
                if(s->out_format == FMT_H263){
 | 
			
		||||
            if (s->out_format == FMT_H263) {
 | 
			
		||||
                c->pred_x = P_MEDIAN[0];
 | 
			
		||||
                c->pred_y = P_MEDIAN[1];
 | 
			
		||||
                }else { /* mpeg1 at least */
 | 
			
		||||
                    c->pred_x= P_LEFT[0];
 | 
			
		||||
                    c->pred_y= P_LEFT[1];
 | 
			
		||||
            } else { /* mpeg1 at least */
 | 
			
		||||
                c->pred_x = P_LEFT[0];
 | 
			
		||||
                c->pred_y = P_LEFT[1];
 | 
			
		||||
            }
 | 
			
		||||
            }else{
 | 
			
		||||
                c->pred_x= P_LEFT[0];
 | 
			
		||||
                c->pred_y= P_LEFT[1];
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        } else {
 | 
			
		||||
            c->pred_x = P_LEFT[0];
 | 
			
		||||
            c->pred_y = P_LEFT[1];
 | 
			
		||||
        }
 | 
			
		||||
        dmin = ff_epzs_motion_search(s, &mx, &my, P, 0, 0, s->p_mv_table, (1<<16)>>shift, 0, 16);
 | 
			
		||||
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* At this point (mx,my) are full-pell and the relative displacement */
 | 
			
		||||
@@ -1128,7 +1134,7 @@ static int estimate_motion_b(MpegEncContext *s, int mb_x, int mb_y,
 | 
			
		||||
                             int16_t (*mv_table)[2], int ref_index, int f_code)
 | 
			
		||||
{
 | 
			
		||||
    MotionEstContext * const c= &s->me;
 | 
			
		||||
    int mx, my, dmin;
 | 
			
		||||
    int mx = 0, my = 0, dmin = 0;
 | 
			
		||||
    int P[10][2];
 | 
			
		||||
    const int shift= 1+s->quarter_sample;
 | 
			
		||||
    const int mot_stride = s->mb_stride;
 | 
			
		||||
@@ -1143,15 +1149,7 @@ static int estimate_motion_b(MpegEncContext *s, int mb_x, int mb_y,
 | 
			
		||||
 | 
			
		||||
    get_limits(s, 16*mb_x, 16*mb_y);
 | 
			
		||||
 | 
			
		||||
    switch(s->me_method) {
 | 
			
		||||
    case ME_ZERO:
 | 
			
		||||
    default:
 | 
			
		||||
        mx   = 0;
 | 
			
		||||
        my   = 0;
 | 
			
		||||
        dmin = 0;
 | 
			
		||||
        break;
 | 
			
		||||
    case ME_X1:
 | 
			
		||||
    case ME_EPZS:
 | 
			
		||||
    if (s->motion_est != FF_ME_ZERO) {
 | 
			
		||||
        P_LEFT[0] = mv_table[mot_xy - 1][0];
 | 
			
		||||
        P_LEFT[1] = mv_table[mot_xy - 1][1];
 | 
			
		||||
 | 
			
		||||
@@ -1180,8 +1178,6 @@ static int estimate_motion_b(MpegEncContext *s, int mb_x, int mb_y,
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        dmin = ff_epzs_motion_search(s, &mx, &my, P, 0, ref_index, s->p_mv_table, mv_scale, 0, 16);
 | 
			
		||||
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    dmin= c->sub_motion_search(s, &mx, &my, dmin, 0, ref_index, 0, 16);
 | 
			
		||||
@@ -1620,7 +1616,7 @@ void ff_estimate_b_frame_motion(MpegEncContext * s,
 | 
			
		||||
/* find best f_code for ME which do unlimited searches */
 | 
			
		||||
int ff_get_best_fcode(MpegEncContext * s, int16_t (*mv_table)[2], int type)
 | 
			
		||||
{
 | 
			
		||||
    if(s->me_method>=ME_EPZS){
 | 
			
		||||
    if (s->motion_est != FF_ME_ZERO) {
 | 
			
		||||
        int score[8];
 | 
			
		||||
        int i, y, range= s->avctx->me_range ? s->avctx->me_range : (INT_MAX/2);
 | 
			
		||||
        uint8_t * fcode_tab= s->fcode_tab;
 | 
			
		||||
 
 | 
			
		||||
@@ -31,6 +31,10 @@ struct MpegEncContext;
 | 
			
		||||
 | 
			
		||||
#define MAX_MV 4096
 | 
			
		||||
 | 
			
		||||
#define FF_ME_ZERO 0
 | 
			
		||||
#define FF_ME_EPZS 1
 | 
			
		||||
#define FF_ME_XONE 2
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Motion estimation context.
 | 
			
		||||
 */
 | 
			
		||||
 
 | 
			
		||||
@@ -262,7 +262,10 @@ typedef struct MpegEncContext {
 | 
			
		||||
    int16_t (*b_field_mv_table[2][2][2])[2];///< MV table (4MV per MB) interlaced b-frame encoding
 | 
			
		||||
    uint8_t (*p_field_select_table[2]);
 | 
			
		||||
    uint8_t (*b_field_select_table[2][2]);
 | 
			
		||||
#if FF_API_MOTION_EST
 | 
			
		||||
    int me_method;                       ///< ME algorithm
 | 
			
		||||
#endif
 | 
			
		||||
    int motion_est;                      ///< ME algorithm
 | 
			
		||||
    int mv_dir;
 | 
			
		||||
#define MV_DIR_FORWARD   1
 | 
			
		||||
#define MV_DIR_BACKWARD  2
 | 
			
		||||
@@ -598,6 +601,10 @@ typedef struct MpegEncContext {
 | 
			
		||||
{"ibias", "intra quant bias",                                       FF_MPV_OFFSET(intra_quant_bias), AV_OPT_TYPE_INT, {.i64 = FF_DEFAULT_QUANT_BIAS }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS },   \
 | 
			
		||||
{"pbias", "inter quant bias",                                       FF_MPV_OFFSET(inter_quant_bias), AV_OPT_TYPE_INT, {.i64 = FF_DEFAULT_QUANT_BIAS }, INT_MIN, INT_MAX, FF_MPV_OPT_FLAGS },   \
 | 
			
		||||
{"rc_strategy", "ratecontrol method",                               FF_MPV_OFFSET(rc_strategy), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 1, FF_MPV_OPT_FLAGS },   \
 | 
			
		||||
{"motion_est", "motion estimation algorithm",                       FF_MPV_OFFSET(motion_est), AV_OPT_TYPE_INT, {.i64 = FF_ME_EPZS }, FF_ME_ZERO, FF_ME_XONE, FF_MPV_OPT_FLAGS, "motion_est" },   \
 | 
			
		||||
{ "zero", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_ZERO }, 0, 0, FF_MPV_OPT_FLAGS, "motion_est" }, \
 | 
			
		||||
{ "epzs", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_EPZS }, 0, 0, FF_MPV_OPT_FLAGS, "motion_est" }, \
 | 
			
		||||
{ "xone", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_XONE }, 0, 0, FF_MPV_OPT_FLAGS, "motion_est" }, \
 | 
			
		||||
 | 
			
		||||
extern const AVOption ff_mpv_generic_options[];
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -370,7 +370,11 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
 | 
			
		||||
        s->intra_only = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if FF_API_MOTION_EST
 | 
			
		||||
FF_DISABLE_DEPRECATION_WARNINGS
 | 
			
		||||
    s->me_method = avctx->me_method;
 | 
			
		||||
FF_ENABLE_DEPRECATION_WARNINGS
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    /* Fixed QSCALE */
 | 
			
		||||
    s->fixed_qscale = !!(avctx->flags & CODEC_FLAG_QSCALE);
 | 
			
		||||
 
 | 
			
		||||
@@ -90,6 +90,7 @@ static const AVOption avcodec_options[] = {
 | 
			
		||||
{"showall", "Show all frames before the first keyframe", 0, AV_OPT_TYPE_CONST, {.i64 = CODEC_FLAG2_SHOW_ALL }, INT_MIN, INT_MAX, V|D, "flags2"},
 | 
			
		||||
{"export_mvs", "export motion vectors through frame side data", 0, AV_OPT_TYPE_CONST, {.i64 = CODEC_FLAG2_EXPORT_MVS}, INT_MIN, INT_MAX, V|D, "flags2"},
 | 
			
		||||
{"skip_manual", "do not skip samples and export skip information as frame side data", 0, AV_OPT_TYPE_CONST, {.i64 = CODEC_FLAG2_SKIP_MANUAL}, INT_MIN, INT_MAX, V|D, "flags2"},
 | 
			
		||||
#if FF_API_MOTION_EST
 | 
			
		||||
{"me_method", "set motion estimation method", OFFSET(me_method), AV_OPT_TYPE_INT, {.i64 = ME_EPZS }, INT_MIN, INT_MAX, V|E, "me_method"},
 | 
			
		||||
{"zero", "zero motion estimation (fastest)", 0, AV_OPT_TYPE_CONST, {.i64 = ME_ZERO }, INT_MIN, INT_MAX, V|E, "me_method" },
 | 
			
		||||
{"full", "full motion estimation (slowest)", 0, AV_OPT_TYPE_CONST, {.i64 = ME_FULL }, INT_MIN, INT_MAX, V|E, "me_method" },
 | 
			
		||||
@@ -103,6 +104,7 @@ static const AVOption avcodec_options[] = {
 | 
			
		||||
{"hex", "hex motion estimation", 0, AV_OPT_TYPE_CONST, {.i64 = ME_HEX }, INT_MIN, INT_MAX, V|E, "me_method" },
 | 
			
		||||
{"umh", "umh motion estimation", 0, AV_OPT_TYPE_CONST, {.i64 = ME_UMH }, INT_MIN, INT_MAX, V|E, "me_method" },
 | 
			
		||||
{"iter", "iter motion estimation", 0, AV_OPT_TYPE_CONST, {.i64 = ME_ITER }, INT_MIN, INT_MAX, V|E, "me_method" },
 | 
			
		||||
#endif
 | 
			
		||||
{"time_base", NULL, OFFSET(time_base), AV_OPT_TYPE_RATIONAL, {.dbl = 0}, INT_MIN, INT_MAX},
 | 
			
		||||
{"g", "set the group of picture (GOP) size", OFFSET(gop_size), AV_OPT_TYPE_INT, {.i64 = 12 }, INT_MIN, INT_MAX, V|E},
 | 
			
		||||
{"ar", "set audio sampling rate (in Hz)", OFFSET(sample_rate), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, 0, INT_MAX, A|D|E},
 | 
			
		||||
 
 | 
			
		||||
@@ -280,7 +280,20 @@ static int svq1_encode_plane(SVQ1EncContext *s, int plane,
 | 
			
		||||
        s->m.b8_stride                     = 2 * s->m.mb_width + 1;
 | 
			
		||||
        s->m.f_code                        = 1;
 | 
			
		||||
        s->m.pict_type                     = s->pict_type;
 | 
			
		||||
#if FF_API_MOTION_EST
 | 
			
		||||
FF_DISABLE_DEPRECATION_WARNINGS
 | 
			
		||||
        s->m.me_method                     = s->avctx->me_method;
 | 
			
		||||
        if (s->motion_est == FF_ME_EPZS) {
 | 
			
		||||
            if (s->avctx->me_method == ME_ZERO)
 | 
			
		||||
                s->motion_est = FF_ME_ZERO;
 | 
			
		||||
            else if (s->avctx->me_method == ME_EPZS)
 | 
			
		||||
                s->motion_est = FF_ME_EPZS;
 | 
			
		||||
            else if (s->avctx->me_method == ME_X1)
 | 
			
		||||
                s->motion_est = FF_ME_XONE;
 | 
			
		||||
        }
 | 
			
		||||
FF_ENABLE_DEPRECATION_WARNINGS
 | 
			
		||||
#endif
 | 
			
		||||
        s->m.motion_est                    = s->motion_est;
 | 
			
		||||
        s->m.me.scene_change_score         = 0;
 | 
			
		||||
        // s->m.out_format                    = FMT_H263;
 | 
			
		||||
        // s->m.unrestricted_mv               = 1;
 | 
			
		||||
@@ -652,12 +665,31 @@ FF_ENABLE_DEPRECATION_WARNINGS
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define OFFSET(x) offsetof(struct SVQ1EncContext, x)
 | 
			
		||||
#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
 | 
			
		||||
static const AVOption options[] = {
 | 
			
		||||
    { "motion-est", "Motion estimation algorithm", OFFSET(motion_est), AV_OPT_TYPE_INT, { .i64 = FF_ME_EPZS }, FF_ME_ZERO, FF_ME_XONE, VE, "motion-est"},
 | 
			
		||||
        { "zero", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_ZERO }, 0, 0, FF_MPV_OPT_FLAGS, "motion-est" },
 | 
			
		||||
        { "epzs", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_EPZS }, 0, 0, FF_MPV_OPT_FLAGS, "motion-est" },
 | 
			
		||||
        { "xone", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = FF_ME_XONE }, 0, 0, FF_MPV_OPT_FLAGS, "motion-est" },
 | 
			
		||||
 | 
			
		||||
    { NULL },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const AVClass svq1enc_class = {
 | 
			
		||||
    .class_name = "svq1enc",
 | 
			
		||||
    .item_name  = av_default_item_name,
 | 
			
		||||
    .option     = options,
 | 
			
		||||
    .version    = LIBAVUTIL_VERSION_INT,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
AVCodec ff_svq1_encoder = {
 | 
			
		||||
    .name           = "svq1",
 | 
			
		||||
    .long_name      = NULL_IF_CONFIG_SMALL("Sorenson Vector Quantizer 1 / Sorenson Video 1 / SVQ1"),
 | 
			
		||||
    .type           = AVMEDIA_TYPE_VIDEO,
 | 
			
		||||
    .id             = AV_CODEC_ID_SVQ1,
 | 
			
		||||
    .priv_data_size = sizeof(SVQ1EncContext),
 | 
			
		||||
    .priv_class     = &svq1enc_class,
 | 
			
		||||
    .init           = svq1_encode_init,
 | 
			
		||||
    .encode2        = svq1_encode_frame,
 | 
			
		||||
    .close          = svq1_encode_end,
 | 
			
		||||
 
 | 
			
		||||
@@ -74,6 +74,8 @@ typedef struct SVQ1EncContext {
 | 
			
		||||
 | 
			
		||||
    uint8_t *scratchbuf;
 | 
			
		||||
 | 
			
		||||
    int motion_est;
 | 
			
		||||
 | 
			
		||||
    int (*ssd_int8_vs_int16)(const int8_t *pix1, const int16_t *pix2,
 | 
			
		||||
                             intptr_t size);
 | 
			
		||||
} SVQ1EncContext;
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,7 @@
 | 
			
		||||
 | 
			
		||||
#define LIBAVCODEC_VERSION_MAJOR 56
 | 
			
		||||
#define LIBAVCODEC_VERSION_MINOR  55
 | 
			
		||||
#define LIBAVCODEC_VERSION_MICRO 100
 | 
			
		||||
#define LIBAVCODEC_VERSION_MICRO 101
 | 
			
		||||
 | 
			
		||||
#define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
 | 
			
		||||
                                               LIBAVCODEC_VERSION_MINOR, \
 | 
			
		||||
@@ -199,5 +199,8 @@
 | 
			
		||||
#ifndef FF_API_CODED_FRAME
 | 
			
		||||
#define FF_API_CODED_FRAME       (LIBAVCODEC_VERSION_MAJOR < 59)
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef FF_API_MOTION_EST
 | 
			
		||||
#define FF_API_MOTION_EST        (LIBAVCODEC_VERSION_MAJOR < 59)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* AVCODEC_VERSION_H */
 | 
			
		||||
 
 | 
			
		||||
@@ -227,6 +227,7 @@ AVCodec ff_wmv2_encoder = {
 | 
			
		||||
    .type           = AVMEDIA_TYPE_VIDEO,
 | 
			
		||||
    .id             = AV_CODEC_ID_WMV2,
 | 
			
		||||
    .priv_data_size = sizeof(Wmv2Context),
 | 
			
		||||
    .priv_class     = &wmv2_class,
 | 
			
		||||
    .init           = wmv2_encode_init,
 | 
			
		||||
    .encode2        = ff_mpv_encode_picture,
 | 
			
		||||
    .close          = ff_mpv_encode_end,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user