summaryrefslogtreecommitdiffstats
path: root/libhb/enc_qsv.c
diff options
context:
space:
mode:
authorRodeo <[email protected]>2013-09-01 08:56:50 +0000
committerRodeo <[email protected]>2013-09-01 08:56:50 +0000
commit8270fcfeb84a2c6c051a24fcceea534b939eee58 (patch)
tree92b54f9247185704ccae7a92177412aa8a5fdeeb /libhb/enc_qsv.c
parent4220853ed08a7dd6fb35421a422ff2e7c4bed2b7 (diff)
QSV: choose and re-use a "preferred" implementation instead of using MFX_IMPL_AUTO_ANY.
This fixes a rare issue where hardware support was detected as available and used in encqsvInit, but MFXInit silently fell back to software in qsv_enc_init (still don't know what that's all about though). git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@5759 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'libhb/enc_qsv.c')
-rw-r--r--libhb/enc_qsv.c43
1 files changed, 21 insertions, 22 deletions
diff --git a/libhb/enc_qsv.c b/libhb/enc_qsv.c
index e38a4b510..7ec9a8612 100644
--- a/libhb/enc_qsv.c
+++ b/libhb/enc_qsv.c
@@ -183,9 +183,9 @@ int qsv_enc_init(av_qsv_context *qsv, hb_work_private_t *pv)
av_qsv_add_context_usage(qsv, 0);
// initialize the session
- qsv->impl = MFX_IMPL_AUTO_ANY;
qsv->ver.Major = AV_QSV_MSDK_VERSION_MAJOR;
qsv->ver.Minor = AV_QSV_MSDK_VERSION_MINOR;
+ qsv->impl = hb_qsv_impl_get_preferred();
sts = MFXInit(qsv->impl, &qsv->ver, &qsv->mfx_session);
if (sts != MFX_ERR_NONE)
{
@@ -332,6 +332,20 @@ int qsv_enc_init(av_qsv_context *qsv, hb_work_private_t *pv)
}
qsv_encode->is_init_done = 1;
+ mfxIMPL impl;
+ mfxVersion version;
+ // log actual implementation details now that we know them
+ if ((MFXQueryIMPL (qsv->mfx_session, &impl) == MFX_ERR_NONE) &&
+ (MFXQueryVersion(qsv->mfx_session, &version) == MFX_ERR_NONE))
+ {
+ hb_log("qsv_enc_init: using '%s' implementation, API: %"PRIu16".%"PRIu16"",
+ hb_qsv_impl_get_name(impl), version.Major, version.Minor);
+ }
+ else
+ {
+ hb_log("qsv_enc_init: MFXQueryIMPL/MFXQueryVersion failure");
+ }
+
pv->init_done = 1;
return 0;
}
@@ -708,7 +722,6 @@ int encqsvInit(hb_work_object_t *w, hb_job_t *job)
* this is fine since the actual encode will use the same
* values for all parameters relevant to the H.264 bitstream
*/
- mfxIMPL impl;
mfxStatus err;
mfxVersion version;
mfxVideoParam videoParam;
@@ -717,10 +730,9 @@ int encqsvInit(hb_work_object_t *w, hb_job_t *job)
mfxExtCodingOption option1_buf, *option1 = &option1_buf;
mfxExtCodingOption2 option2_buf, *option2 = &option2_buf;
mfxExtCodingOptionSPSPPS sps_pps_buf, *sps_pps = &sps_pps_buf;
- impl = MFX_IMPL_AUTO_ANY|MFX_IMPL_VIA_ANY;
version.Major = HB_QSV_MINVERSION_MAJOR;
version.Minor = HB_QSV_MINVERSION_MINOR;
- err = MFXInit(impl, &version, &session);
+ err = MFXInit(hb_qsv_impl_get_preferred(), &version, &session);
if (err != MFX_ERR_NONE)
{
hb_error("encqsvInit: MFXInit failed (%d)", err);
@@ -762,6 +774,8 @@ int encqsvInit(hb_work_object_t *w, hb_job_t *job)
videoParam.ExtParam[videoParam.NumExtParam++] = (mfxExtBuffer*)option2;
}
err = MFXVideoENCODE_GetVideoParam(session, &videoParam);
+ MFXVideoENCODE_Close(session);
+ MFXClose(session);
if (err == MFX_ERR_NONE)
{
// remove 32-bit NAL prefix (0x00 0x00 0x00 0x01)
@@ -775,27 +789,12 @@ int encqsvInit(hb_work_object_t *w, hb_job_t *job)
else
{
hb_error("encqsvInit: MFXVideoENCODE_GetVideoParam failed (%d)", err);
- MFXVideoENCODE_Close(session);
- MFXClose (session);
return -1;
}
- // log implementation details before closing this session
- if (pv->is_sys_mem)
- {
- hb_log("encqsvInit: using encode-only path");
- }
- if ((MFXQueryIMPL (session, &impl) == MFX_ERR_NONE) &&
- (MFXQueryVersion(session, &version) == MFX_ERR_NONE))
- {
- hb_log("encqsvInit: using %s implementation (%"PRIu16".%"PRIu16")",
- impl == MFX_IMPL_SOFTWARE ? "software" : "hardware",
- version.Major, version.Minor);
- }
- MFXVideoENCODE_Close(session);
- MFXClose (session);
-
- // log main output settings
+ // log code path and main output settings
+ hb_log("encqsvInit: using %s path",
+ pv->is_sys_mem ? "encode-only" : "full QSV");
hb_log("encqsvInit: TargetUsage %"PRIu16" AsyncDepth %"PRIu16"",
videoParam.mfx.TargetUsage, videoParam.AsyncDepth);
hb_log("encqsvInit: GopRefDist %"PRIu16" GopPicSize %"PRIu16" NumRefFrame %"PRIu16"",