Track surfaces locked by QSV

This commit is contained in:
palana 2013-05-15 18:26:00 +02:00
parent 29234349a5
commit 08ee4d267d

View File

@ -150,7 +150,8 @@ class QSVEncoder : public VideoEncoder
}; };
List<encode_task> encode_tasks; List<encode_task> encode_tasks;
CircularList<unsigned> encoded_tasks, CircularList<unsigned> msdk_locked_tasks,
encoded_tasks,
queued_tasks, queued_tasks,
idle_tasks; idle_tasks;
@ -265,7 +266,7 @@ public:
memcpy(&query, &params, sizeof(params)); memcpy(&query, &params, sizeof(params));
enc->GetVideoParam(&query); enc->GetVideoParam(&query);
unsigned num_surf = max(6, req.NumFrameSuggested+1); unsigned num_surf = max(6, req.NumFrameSuggested + params.AsyncDepth);
encode_tasks.SetSize(num_surf); encode_tasks.SetSize(num_surf);
@ -362,7 +363,6 @@ public:
auto& sp = task.sp; auto& sp = task.sp;
if(MFXVideoCORE_SyncOperation(session, sp, wait) != MFX_ERR_NONE) if(MFXVideoCORE_SyncOperation(session, sp, wait) != MFX_ERR_NONE)
return; return;
sp = nullptr;
mfxBitstream& bs = task.bs; mfxBitstream& bs = task.bs;
@ -555,12 +555,29 @@ public:
packets[i].lpPacket = CurrentPackets[i].Packet.Array(); packets[i].lpPacket = CurrentPackets[i].Packet.Array();
packets[i].size = CurrentPackets[i].Packet.Num(); packets[i].size = CurrentPackets[i].Packet.Num();
} }
task.frame->FrameOrder = 0;
task.frame->Locked = false; msdk_locked_tasks << encoded_tasks[0];
idle_tasks << encoded_tasks[0];
encoded_tasks.Remove(0); encoded_tasks.Remove(0);
} }
void CleanupLockedTasks()
{
for(unsigned i = 0; i < msdk_locked_tasks.Num();)
{
encode_task& task = encode_tasks[msdk_locked_tasks[i]];
if(task.surf.Data.Locked)
{
i++;
continue;
}
task.frame->FrameOrder = 0;
task.frame->Locked = false;
task.sp = nullptr;
idle_tasks << msdk_locked_tasks[i];
msdk_locked_tasks.Remove(i);
}
}
void QueueEncodeTask(mfxFrameSurface1& pic) void QueueEncodeTask(mfxFrameSurface1& pic)
{ {
encode_task& task = encode_tasks[idle_tasks[0]]; encode_task& task = encode_tasks[idle_tasks[0]];
@ -602,6 +619,8 @@ public:
} }
profileOut; profileOut;
CleanupLockedTasks();
mfxFrameSurface1& pic = *(mfxFrameSurface1*)picInPtr; mfxFrameSurface1& pic = *(mfxFrameSurface1*)picInPtr;
QueueEncodeTask(pic); QueueEncodeTask(pic);
@ -616,7 +635,7 @@ public:
{ {
auto sts = enc->EncodeFrameAsync(task.keyframe ? &ctrl : nullptr, &surf, &bs, &sp); auto sts = enc->EncodeFrameAsync(task.keyframe ? &ctrl : nullptr, &surf, &bs, &sp);
if(sts == MFX_ERR_NONE || sp) if(sts == MFX_ERR_NONE || (MFX_ERR_NONE < sts && sp))
break; break;
if(sts == MFX_WRN_DEVICE_BUSY) if(sts == MFX_WRN_DEVICE_BUSY)
{ {