summaryrefslogtreecommitdiff
path: root/libavcodec/qsv.c
diff options
context:
space:
mode:
authorMark Thompson <sw@jkqxz.net>2017-03-30 22:06:03 +0100
committerMark Thompson <sw@jkqxz.net>2017-03-30 22:06:03 +0100
commitc0f2a8eac172ce720a513abe1706a026236c0579 (patch)
tree9e88b168279cf1bd024460610ecd219a6f25a1d9 /libavcodec/qsv.c
parent2f18e452f88fc6ed7b0e308d4de5c386ee1b3a12 (diff)
parent00aeedd84105a17f414185bd33ecadebeddb3a27 (diff)
Merge commit '00aeedd84105a17f414185bd33ecadebeddb3a27'
* commit '00aeedd84105a17f414185bd33ecadebeddb3a27': qsv{dec,enc}: use a struct as a memory id with internal memory allocator Merged-by: Mark Thompson <sw@jkqxz.net>
Diffstat (limited to 'libavcodec/qsv.c')
-rw-r--r--libavcodec/qsv.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c
index d9a041cc23..7ba82fa304 100644
--- a/libavcodec/qsv.c
+++ b/libavcodec/qsv.c
@@ -160,6 +160,17 @@ int ff_qsv_map_pixfmt(enum AVPixelFormat format, uint32_t *fourcc)
}
}
+int ff_qsv_find_surface_idx(QSVFramesContext *ctx, QSVFrame *frame)
+{
+ int i;
+ for (i = 0; i < ctx->nb_mids; i++) {
+ QSVMid *mid = &ctx->mids[i];
+ if (mid->handle == frame->surface.Data.MemId)
+ return i;
+ }
+ return AVERROR_BUG;
+}
+
static int qsv_load_plugins(mfxSession session, const char *load_plugins,
void *logctx)
{
@@ -260,6 +271,7 @@ static mfxStatus qsv_frame_alloc(mfxHDL pthis, mfxFrameAllocRequest *req,
QSVFramesContext *ctx = pthis;
mfxFrameInfo *i = &req->Info;
mfxFrameInfo *i1 = &ctx->info;
+ int j;
if (!(req->Type & MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET) ||
!(req->Type & (MFX_MEMTYPE_FROM_DECODE | MFX_MEMTYPE_FROM_ENCODE)) ||
@@ -274,7 +286,13 @@ static mfxStatus qsv_frame_alloc(mfxHDL pthis, mfxFrameAllocRequest *req,
return MFX_ERR_UNSUPPORTED;
}
- resp->mids = ctx->mids;
+ resp->mids = av_mallocz_array(ctx->nb_mids, sizeof(*resp->mids));
+ if (!resp->mids)
+ return MFX_ERR_MEMORY_ALLOC;
+
+ for (j = 0; j < ctx->nb_mids; j++)
+ resp->mids[j] = &ctx->mids[j];
+
resp->NumFrameActual = ctx->nb_mids;
return MFX_ERR_NONE;
@@ -282,6 +300,7 @@ static mfxStatus qsv_frame_alloc(mfxHDL pthis, mfxFrameAllocRequest *req,
static mfxStatus qsv_frame_free(mfxHDL pthis, mfxFrameAllocResponse *resp)
{
+ av_freep(&resp->mids);
return MFX_ERR_NONE;
}
@@ -297,7 +316,8 @@ static mfxStatus qsv_frame_unlock(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr)
static mfxStatus qsv_frame_get_hdl(mfxHDL pthis, mfxMemId mid, mfxHDL *hdl)
{
- *hdl = mid;
+ QSVMid *qsv_mid = (QSVMid*)mid;
+ *hdl = qsv_mid->handle;
return MFX_ERR_NONE;
}
@@ -381,7 +401,7 @@ int ff_qsv_init_session_hwcontext(AVCodecContext *avctx, mfxSession *psession,
qsv_frames_ctx->info = frames_hwctx->surfaces[0].Info;
qsv_frames_ctx->nb_mids = frames_hwctx->nb_surfaces;
for (i = 0; i < frames_hwctx->nb_surfaces; i++)
- qsv_frames_ctx->mids[i] = frames_hwctx->surfaces[i].Data.MemId;
+ qsv_frames_ctx->mids[i].handle = frames_hwctx->surfaces[i].Data.MemId;
err = MFXVideoCORE_SetFrameAllocator(session, &frame_allocator);
if (err != MFX_ERR_NONE)