On 12/04/14 18:13, Tim Walker wrote:
> 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?
Absolutely not, good point =)
>
>> +#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?
No, we want to merge it using the current stable api at the time, so
hopefully that block would be active code.
>
>> + 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.
You are right.
>> + { "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.).
Sure.
> 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)?
Sounds good.
>> + { "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?
Sure.
Thanks a lot for the input =)
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel