- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi
I am trying to encode H264 stream. Sometimes, m_mfxSession->SyncOperation return MFX_ERR_NOT_ENOUGH_BUFFER.
I allocating mfxBitstream buffers according the the value in mfxVideoParam.mfx.BufferSizeInKB * 1000.
Trying to increase the buffer (up to 10MB !) doesn't help and SyncOperation keeps on returning MFX_ERR_NOT_ENOUGH_BUFFER
I attached a code snippet that waits for the bitstream
mfxStatus intel_h264_encoder::PutBS() { mfxStatus sts = MFX_ERR_NONE; ExtendedBS *pBitstreamEx = m_BSPool.front(); sts = m_mfxSession.SyncOperation(pBitstreamEx->Syncp, MSDK_WAIT_INTERVAL); int i = 0; while (sts == MFX_ERR_NOT_ENOUGH_BUFFER) { LOG << "intel_h264_encoder::PutBS - sync op failed due to NOT ENOUGH BUFFER, extending buffer. #i=" << i++ << " profile=" << m_profile.profile_name; mfxStatus allocateBufferSts = AllocateSufficientBuffer(&pBitstreamEx->Bitstream); if (allocateBufferSts == MFX_ERR_NONE) { LOG << "intel_h264_encoder::PutBS - buffer extended, trying to sync again #i=" << i << " profile=" << m_profile.profile_name; sts = m_mfxSession.SyncOperation(pBitstreamEx->Syncp, MSDK_WAIT_INTERVAL); if (sts == MFX_ERR_NONE) LOG << "intel_h264_encoder::PutBS - sync op OK after buffer extension" << " profile=" << m_profile.profile_name; } else if (allocateBufferSts == MFX_ERR_MEMORY_ALLOC) // { LOG << "intel_h264_encoder::PutBS - buffer extended to maximum=" << pBitstreamEx->Bitstream.MaxLength << ", GOING TO FAIL #i=" << i << " profile=" << m_profile.profile_name; // set original error code sts = MFX_ERR_NOT_ENOUGH_BUFFER; break; } } if (sts < MFX_ERR_NONE) { LOG << "intel_h264_encoder::PutBS - sync op failed. sts=" << sts << " profile=" << m_profile.profile_name; pBitstreamEx->Bitstream.DataLength = 0; pBitstreamEx->Bitstream.DataOffset = 0; m_BSPool.pop_front(); m_pBSStore->Release(pBitstreamEx); return sts; } // don't send samples if draining the encoder if (m_run) { m_encoded_frames++; int64_t pts = pBitstreamEx->Bitstream.TimeStamp; int64_t dts = pBitstreamEx->Bitstream.DecodeTimeStamp; bool b = compressed_frame_ready(pBitstreamEx->Bitstream.Data, pts, dts); } pBitstreamEx->Bitstream.DataLength = 0; pBitstreamEx->Bitstream.DataOffset = 0; m_BSPool.pop_front(); m_pBSStore->Release(pBitstreamEx); return sts; } //
My question are:
why SyncOperation return NOT_ENOUGH_BUFFER error?
Should I increase the allocated buffer size (double it to BufferSizeInKB * 2 * 1000 maybe ) ?
Can I increase the buffer once I got a valid sync point but SyncOperation fail with NOT_ENOUGH_BUFFER (like I do in the above code)
How should I recover from this situation?
If i will not perform SyncOperation on that SyncPoint, all the subsequent calls will fail with MFX_ERR_ABORT
It seems that the only solution is to reset the encoder.
Any help will be appreciated!
Thanks
Koby
Link Copied
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page