Hi Petter,
It is based on the "sample_encode".
Input is raw YV12 data from file.
Platform: Windows 7 64-bit
CPU: Sandy Bridge D2
Processor: Intel Core i7-2600 CPU
The example of using:
// Add frame
int32_t PutFrame(uint8_t *pb_src, int32_t src_line_size, int32_t src_width, int32_t src_height, uint32_t fourcc)
{
mfxStatus sts = MFX_ERR_NONE;
CTask *task = NULL;
pTaskPool->GetFreeTask(&task);
int32_t surface_idx = GetFreeSurface(pEncSurfacePool, nSurfacePoolSize);
mfxFrameSurface1 * pEncSurface = pEncSurfacePool + surface_idx;
surface_idx = GetFreeSurface(pVppSurfacePool, nSurfacePoolSize);
mfxFrameSurface1 * pVPPSurface = pVppSurfacePool + surface_idx;
//copy input data (YV12 format) into surface for VPP
//-----------------------------------------------------
mfxU8 *ptrY = pVPPSurface->Data.Y;
uint8_t * src_ptr = pb_src;
for (int i = 0; i < src_height; i++)
{
memcpy(ptrY, src_ptr, src_width);
ptrY += pVPPSurface->Data.Pitch;
src_ptr += src_line_size;
}
int chroma_h = src_height >> 1;
int chroma_w = src_width >> 1;
int chroma_stride = src_line_size >> 1;
uint8_t *pSrcV = pb_src + src_line_size*src_height;
uint8_t *pSrcU = pSrcV + chroma_stride*src_height/2;
mfxU8 *ptrV = pVPPSurface->Data.V;
mfxU8 *ptrU = pVPPSurface->Data.U;
for (int i = 0; i < chroma_h; i++)
{
memcpy(ptrV, pSrcV, chroma_w);
memcpy(ptrU, pSrcU, chroma_w);
pSrcV += chroma_stride;
pSrcU += chroma_stride;
ptrU += pVPPSurface->Data.Pitch >> 1;
ptrV += pVPPSurface->Data.Pitch >> 1;
}
//---Copying END----------------------------------------
sts = MFXVideoVPP_RunFrameVPPAsync(mfx_session, pVPPSurface, pEncSurface, NULL, &task->EncSyncP);
if (sts < MFX_ERR_NONE)
return H264ERROR_FAILED;
for (;;)
{
sts = MFXVideoENCODE_EncodeFrameAsync(mfx_session, NULL, pEncSurface, &task->mfxBS, &task->EncSyncP);
if (MFX_ERR_NOT_ENOUGH_BUFFER == sts)
{
sts = AllocateMFXBufstream(mfx_session, &task->mfxBS);
if (sts < MFX_ERR_NONE)
return H264ERROR_FAILED;
}
else if (sts == MFX_WRN_DEVICE_BUSY)
{
MCSleep(5);
}
else
{
break;
}
}
if (sts < MFX_ERR_NONE && sts != MFX_ERR_MORE_DATA)
return H264ERROR_FAILED;
if (task->EncSyncP != NULL)
pTaskPool->PushNewTask(task);
else
pTaskPool->FreeTask(task);
return H264ERROR_NONE;
}
// Get coded data
ThreadFunc()
{
do
{
CTask * pTask;
pTaskPool->GetNextTask(&pTask);
if (pTask == NULL)
MCThreadReturn;
mfxStatus ret;
do
{
// WAIT_INTERVAL = 10000
ret = MFXVideoCORE_SyncOperation(mfx_session, pTask->EncSyncP, WAIT_INTERVAL);
} while (ret == MFX_WRN_IN_EXECUTION);
if (ret != MFX_ERR_NONE)
{
pTaskPool->FreeTask(pTask);
continue;
}
//Here is writing data (pTask->mfxBS) into a output file...
//.........
//--------------------------------------------------------
pTask->EncSyncP = NULL;
pTask->mfxBS.DataLength = 0;
pTask->mfxBS.DataOffset = 0;
pTaskPool->FreeTask(pTask);
}while (1);
ThreadReturn
}
Thanks,
Marina