Good day.
Yes it seems that this code doesn't work properly.
I made some modifications and tested it with small buffer setting, works fine now.
You need to separate buffer allocations for each slice and update destructor:
[cpp]
template
Status H264CoreEncoder_Init(void* state, BaseCodecParams* init, MemoryAllocator* pMemAlloc)
{
...
//Ipp32u bsSize = core_enc->m_PaddedSize.width; // small buffer test
Ipp32u bsSize = core_enc->m_PaddedSize.width * core_enc->m_PaddedSize.height * sizeof(PIXTYPE);
bsSize += (bsSize >> 1) + 4096;
// TBD: see if buffer size can be reduced
core_enc->m_pbitstreams = (H264BsReal**)H264_Malloc(numOfSliceEncs * sizeof(H264BsReal*));
if(!core_enc->m_pbitstreams)
return UMC_ERR_ALLOC;
for (i = 0; i < numOfSliceEncs; i++)
{
Ipp8u* pTmpBuffer = (Ipp8u*)H264_Malloc(bsSize + DATA_ALIGN);
if(!pTmpBuffer)
return UMC_ERR_ALLOC;
core_enc->m_pbitstreams = (H264BsReal*)H264_Malloc(sizeof(H264BsReal));
if (!core_enc->m_pbitstreams)
return UMC_ERR_ALLOC;
H264BsReal_Create(core_enc->m_pbitstreams, pTmpBuffer, bsSize, core_enc->m_params.chroma_format_idc, status);
if (status != UMC_OK)
return status;
core_enc->m_Slices.m_pbitstream = (H264BsBase*)core_enc->m_pbitstreams;
}
core_enc->m_bs1 = core_enc->m_pbitstreams[0]; // core_enc->m_bs1 is the main stream.
...
}
...
template
Status H264CoreEncoder_Close(void* state)
{
...
if (core_enc->m_pbitstreams)
{
Ipp32s i;
for (i = 0; i < core_enc->m_params.num_slices*((core_enc->m_params.coding_type == 1) + 1); i++)
{ //TODO fix for PicAFF/AFRM
if (core_enc->m_pbitstreams)
{
H264_Free(core_enc->m_pbitstreams->m_base.m_pbsBase);
H264_Free(core_enc->m_pbitstreams);
core_enc->m_pbitstreams = NULL;
}
}
H264_Free(core_enc->m_pbitstreams);
core_enc->m_pbitstreams = NULL;
...
}
[/cpp]
And fix data shifts in reallocator:
[cpp]
template
Status H264CoreEncoder_Compress_Slice(void* state, H264Slice *curr_slice, bool is_first_mb)
{
...
#ifdef ALT_BITSTREAM_ALLOC
//Expand buffer if it is nearly full
Ipp32u bytesInBuffer = H264BsBase_GetBsSize(&(pBitstream->m_base));
if (bytesInBuffer >= 3 * (pBitstream->m_base.m_maxBsSize >> 2))
{
pBitstream->m_base.m_maxBsSize <<= 1;
size_t iRBSPShift = pBitstream->m_pbsRBSPBase - pBitstream->m_base.m_pbsBase;
Ipp8u* tmpBitstreamBuf = (Ipp8u*)H264_Malloc(pBitstream->m_base.m_maxBsSize + DATA_ALIGN);
ippsSet_8u(0, (Ipp8u*)tmpBitstreamBuf, pBitstream->m_base.m_maxBsSize);
ippsCopy_8u(pBitstream->m_base.m_pbsBase,tmpBitstreamBuf,bytesInBuffer);
H264_Free(pBitstream->m_base.m_pbsBase);
pBitstream->m_base.m_pbsBase = tmpBitstreamBuf;
pBitstream->m_pbsRBSPBase = tmpBitstreamBuf + iRBSPShift;
pBitstream->m_base.m_pbs = pBitstream->m_base.m_pbsBase + ((pBitstream->m_base.m_bitOffset)?bytesInBuffer - 1:bytesInBuffer);
}
#endif
...
}
[/cpp]