in FFmpegInterop/Source/H264AVCSampleProvider.cpp [128:168]
HRESULT H264AVCSampleProvider::WriteNALPacket(DataWriter^ dataWriter, AVPacket* avPacket)
{
HRESULT hr = S_OK;
uint32 index = 0;
uint32 size = 0;
uint32 packetSize = (uint32)avPacket->size;
do
{
// Make sure we have enough data
if (packetSize < (index + 4))
{
hr = E_FAIL;
break;
}
// Grab the size of the blob
size = (avPacket->data[index] << 24) + (avPacket->data[index + 1] << 16) + (avPacket->data[index + 2] << 8) + avPacket->data[index + 3];
// Write the NAL unit to the stream
dataWriter->WriteByte(0);
dataWriter->WriteByte(0);
dataWriter->WriteByte(0);
dataWriter->WriteByte(1);
index += 4;
// Stop if index and size goes beyond packet size or overflow
if (packetSize < (index + size) || (UINT32_MAX - index) < size)
{
hr = E_FAIL;
break;
}
// Write the rest of the packet to the stream
auto vBuffer = ref new Platform::Array<uint8_t>(&(avPacket->data[index]), size);
dataWriter->WriteBytes(vBuffer);
index += size;
} while (index < packetSize);
return hr;
}