On 12 Apr 2014, at 16:36, Luca Barbato <[email protected]> wrote:

> +  //q->param.mfx.TimeStampCalc      = 0; // API 1.3
> +  //q->param.mfx.ExtendedPicStruct  = 0; // API 1.3
> +  //q->param.mfx.BRCParamMultiplier = 0; // API 1.3
> +  //q->param.mfx.SliceGroupsPresent = 0; // API 1.6

These fields are part of a union and are incompatible with TargetUsage, 
GopPicSize etc. Don't leave them here to be commented out accidentally by 
someone.

> +    q->param.mfx.RateControlMethod =
> +        (q->qpi >= 0 && q->qpp >= 0 && q->qpb >= 0) ||
> +        avctx->flags & CODEC_FLAG_QSCALE      ? MFX_RATECONTROL_CQP :
> +        avctx->rc_max_rate &&
> +        avctx->rc_max_rate == avctx->bit_rate ? MFX_RATECONTROL_CBR :
> +                                                MFX_RATECONTROL_VBR;
> +
> +    if (ret == MFX_CODEC_AVC)
> +        av_log(avctx, AV_LOG_VERBOSE, "Codec:AVC\n");
> +    else if (ret == MFX_CODEC_MPEG2)
> +        av_log(avctx, AV_LOG_VERBOSE, "Codec:MPEG2\n");

VC-1? Maybe make this a switch, too.

> +    if (q->param.mfx.GopPicSize)
> +        av_log(avctx, AV_LOG_VERBOSE, "GopPicSize:%d\n", 
> q->param.mfx.GopPicSize);
> +    if (q->param.mfx.GopRefDist)
> +        av_log(avctx, AV_LOG_VERBOSE, "GopRefDist:%d\n", 
> q->param.mfx.GopRefDist);
> +    if (q->param.mfx.NumSlice)
> +        av_log(avctx, AV_LOG_VERBOSE, "NumSlice:%d\n", 
> q->param.mfx.NumSlice);
> +    if (q->param.mfx.NumRefFrame)
> +        av_log(avctx, AV_LOG_VERBOSE, "NumRefFrame:%d\n", 
> q->param.mfx.NumRefFrame);
> +
> +    switch (q->param.mfx.RateControlMethod) {
> +    case MFX_RATECONTROL_CBR: // API 1.0
> +        av_log(avctx, AV_LOG_VERBOSE, "RateControlMethod:CBR\n");
> +      //q->param.mfx.InitialDelayInKB;

Remove this please, or make it do something useful. Other cases too.

> +            q->param.mfx.QPI = av_clip(quant, 0, 51);

Are we sure this is correct for MPEG-2 and VC-1 too?

> +#if 0
> +    case MFX_RATECONTROL_LA: // API 1.7
> +        av_log(avctx, AV_LOG_ERROR,
> +               "RateControlMethod:LA is unimplemented.\n");
> +        /*
> +        q->param.mfx.InitialDelayInKB;
> +        q->param.mfx.TargetKbps;
> +        q->param.mfx.MaxKbps;
> +        q->extco2.LookAheadDepth; // API 1.7
> +        q->extco2.Trellis;        // API 1.6
> +        */
> +        return AVERROR(EINVAL);
> +#endif

Do we really want big disabled blocks like this?

> +    if (impl & MFX_IMPL_SOFTWARE)
> +        av_log(avctx, AV_LOG_VERBOSE,
> +               "Using Intel QuickSync encoder software implementation.\n");
> +    else if (impl & MFX_IMPL_HARDWARE)
> +        av_log(avctx, AV_LOG_VERBOSE,
> +               "Using Intel QuickSync encoder hardware accelerated 
> implementation.\n");
> +    else
> +        av_log(avctx, AV_LOG_VERBOSE,
> +               "Unknown Intel QuickSync encoder implementation %d.\n", impl);

You can't do it like this:

typedef mfxI32 mfxIMPL;
#define MFX_IMPL_BASETYPE(x) (0x00ff & (x))

enum  {
    MFX_IMPL_AUTO         = 0x0000,  /* Auto Selection/In or Not Supported/Out 
*/
    MFX_IMPL_SOFTWARE     = 0x0001,  /* Pure Software Implementation */
    MFX_IMPL_HARDWARE     = 0x0002,  /* Hardware Accelerated Implementation 
(default device) */
    MFX_IMPL_AUTO_ANY     = 0x0003,  /* Auto selection of any hardware/software 
implementation */
    MFX_IMPL_HARDWARE_ANY = 0x0004,  /* Auto selection of any hardware 
implementation */
    MFX_IMPL_HARDWARE2    = 0x0005,  /* Hardware accelerated implementation 
(2nd device) */
    MFX_IMPL_HARDWARE3    = 0x0006,  /* Hardware accelerated implementation 
(3rd device) */
    MFX_IMPL_HARDWARE4    = 0x0007,  /* Hardware accelerated implementation 
(4th device) */

    MFX_IMPL_VIA_ANY      = 0x0100,
    MFX_IMPL_VIA_D3D9     = 0x0200,
    MFX_IMPL_VIA_D3D11    = 0x0300,
    MFX_IMPL_VIA_VAAPI    = 0x0400,

    MFX_IMPL_AUDIO        = 0x8000,

    MFX_IMPL_UNSUPPORTED  = 0x0000  /* One of the MFXQueryIMPL returns */
};

(MFX_IMPL_HARDWARE2 & MFX_IMPL_HARDWARE) is false
(MFX_IMPL_HARDWARE2 & MFX_IMPL_SOFTWARE) is true
(MFX_IMPL_HARDWARE4 & MFX_IMPL_SOFTWARE) is true

I would switch(MFX_IMPL_BASETYPE(impl))

…and consider hardware 2..4 too.

> +    { "level", NULL, OFFSET(qsv.level), AV_OPT_TYPE_INT, { .i64 = 
> MFX_LEVEL_UNKNOWN }, 0, INT_MAX, VE, "level" },
> +    { "unknown", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_LEVEL_UNKNOWN }, 
> INT_MIN, INT_MAX, VE, "level" },
> +    { "1"      , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_LEVEL_AVC_1   }, 
> INT_MIN, INT_MAX, VE, "level" },
> +    { "1b"     , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_LEVEL_AVC_1b  }, 
> INT_MIN, INT_MAX, VE, "level" },
> +    { "11"     , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_LEVEL_AVC_11  }, 
> INT_MIN, INT_MAX, VE, "level" },
> +    { "12"     , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_LEVEL_AVC_12  }, 
> INT_MIN, INT_MAX, VE, "level" },
> +    { "13"     , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_LEVEL_AVC_13  }, 
> INT_MIN, INT_MAX, VE, "level" },
> +    { "2"      , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_LEVEL_AVC_2   }, 
> INT_MIN, INT_MAX, VE, "level" },
> +    { "21"     , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_LEVEL_AVC_21  }, 
> INT_MIN, INT_MAX, VE, "level" },
> +    { "22"     , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_LEVEL_AVC_22  }, 
> INT_MIN, INT_MAX, VE, "level" },
> +    { "3"      , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_LEVEL_AVC_3   }, 
> INT_MIN, INT_MAX, VE, "level" },
> +    { "31"     , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_LEVEL_AVC_31  }, 
> INT_MIN, INT_MAX, VE, "level" },
> +    { "32"     , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_LEVEL_AVC_32  }, 
> INT_MIN, INT_MAX, VE, "level" },
> +    { "4"      , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_LEVEL_AVC_4   }, 
> INT_MIN, INT_MAX, VE, "level" },
> +    { "41"     , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_LEVEL_AVC_41  }, 
> INT_MIN, INT_MAX, VE, "level" },
> +    { "42"     , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_LEVEL_AVC_42  }, 
> INT_MIN, INT_MAX, VE, "level" },
> +    { "5"      , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_LEVEL_AVC_5   }, 
> INT_MIN, INT_MAX, VE, "level" },
> +    { "51",     NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_LEVEL_AVC_51  }, 
> INT_MIN, INT_MAX, VE, "level" },
> +    { "52",     NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_LEVEL_AVC_52  }, 
> INT_MIN, INT_MAX, VE, "level" },

Broken alignment.

Also, I'd make the level names 1.1 instead of 11, etc. as the latter can be 
specified directly (MFX_LEVEL_AVC_11 == 11, etc.).

Not sure about 1 vs. 1.0.

> +    { "preset", NULL, OFFSET(qsv.preset), AV_OPT_TYPE_INT, { .i64 = 
> MFX_TARGETUSAGE_BALANCED }, 0, 7, VE },

Maybe use named constants for the limits (MFX_TARGETUSAGE_UNKNOWN, 
MFX_TARGETUSAGE_BEST_SPEED)?

> +    { "fast",   NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 
> MFX_TARGETUSAGE_BEST_SPEED  },   INT_MIN, INT_MAX, VE, "preset" },
> +    { "medium", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 
> MFX_TARGETUSAGE_BALANCED  },     INT_MIN, INT_MAX, VE, "preset" },
> +    { "slow",   NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 
> MFX_TARGETUSAGE_BEST_QUALITY  }, INT_MIN, INT_MAX, VE, "preset" },

I'd call them speed, balanced and quality. Thoughts?

Tim
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to