Hi,
I am using H.264 HP encoder for C6678 (100.V.H264HP.E.C6678.01.00). I noticed that HP encoder does not release all the input buffers when encoding stream with changing aspect ratio. This behaviour causes memory leak in my transcoder program.
I use the following configuration:
gopStructure = 0;
IDRFrameInterval = 3;
intraFrameInterval = 6;
interFrameInterval = 3;
aspectRatioInfoPresentFlag = 1;
aspectRatioIdc = 255;
I use sampleAspectRatioWidth and sampleAspectRatioHeight dynamic parameters to change aspect ratio (control call with XDM_SETPARAMS command). For tests I change aspect ratio from time to time.
I create new input buffer with new ID before each encoder process call (IDs go in output order of MPEG2 decoder) and free all buffers from freeBufID array after each encoder process call. The logic looks like:
// Create new input encoder buffer
printf("Creating input buffer %d\n", inputId);
inEncoderBufferDescriptor = BufferDescriptorManager_getUnusedBufferDescriptor(inEncoderBufferManager, inputId);
inEncoderArguments->inputID = inputId;
// Process
result = encoderFunctions->process(encoderHandle, &inEncoderBufferDescriptor, &outEncoderBufferDescriptor, inEncoderArguments, outEncoderArguments);
// Free input buffers
int* bufferIdToFreePointer = outEncoderArguments->freeBufID;
while (*bufferIdToFreePointer != 0) {
printf("Free input buffer %d\n", *bufferIdToFreePointer);
BufferDescriptorManager_releaseBufferDescriptor(inEncoderBufferManager, *bufferIdToFreePointer);
bufferIdToFreePointer++;
}
Result:
Creating input buffer 2 Creating input buffer 1 Creating input buffer 4 Free input buffer 2 New aspect ratio: 2 Creating input buffer 3 Creating input buffer 6 Creating input buffer 5 Free input buffer 3 Creating input buffer 8 Free input buffer 8 Creating input buffer 7 Free input buffer 6 New aspect ratio: 3 Creating input buffer 10 Creating input buffer 9 Creating input buffer 12 Free input buffer 10 Creating input buffer 11 Free input buffer 11 Creating input buffer 14 Free input buffer 9 New aspect ratio: 2 Creating input buffer 13 Creating input buffer 16 Creating input buffer 15 Free input buffer 13 Creating input buffer 18 Free input buffer 18 Creating input buffer 17 Free input buffer 16 New aspect ratio: 3 Creating input buffer 20 Creating input buffer 19 Creating input buffer 22 Free input buffer 20 Creating input buffer 21 Free input buffer 21 Creating input buffer 24 Free input buffer 19 New aspect ratio: 2 Creating input buffer 23 Creating input buffer 26 Creating input buffer 25 Free input buffer 23 Creating input buffer 28 Free input buffer 28 Creating input buffer 27 Free input buffer 26 New aspect ratio: 3 Creating input buffer 30 Creating input buffer 29 Creating input buffer 32 Free input buffer 30 Creating input buffer 31 Free input buffer 31 Creating input buffer 34 Free input buffer 29 New aspect ratio: 2 Creating input buffer 33 Creating input buffer 36 Creating input buffer 35 Free input buffer 33 Creating input buffer 38 Free input buffer 38 Creating input buffer 37 Free input buffer 36 New aspect ratio: 3 Creating input buffer 40 Creating input buffer 39 Creating input buffer 42 Free input buffer 40 Creating input buffer 41 Free input buffer 41 Creating input buffer 44 Free input buffer 39 New aspect ratio: 2 Creating input buffer 43 Creating input buffer 46 Creating input buffer 45 Free input buffer 43 Creating input buffer 48 Free input buffer 48 Creating input buffer 47 Free input buffer 46
As you can see not all input buffers that are provided to encoder released.
When I disable functionality that changes aspect ratio, input buffers released correctly:
Creating input buffer 2 Creating input buffer 1 Creating input buffer 4 Free input buffer 2 Creating input buffer 3 Free input buffer 3 Creating input buffer 6 Free input buffer 1 Creating input buffer 5 Free input buffer 4 Creating input buffer 8 Free input buffer 8 Creating input buffer 7 Free input buffer 6 Creating input buffer 10 Free input buffer 5 Creating input buffer 9 Free input buffer 9 Creating input buffer 12 Free input buffer 7 Creating input buffer 11 Free input buffer 10 Creating input buffer 14 Free input buffer 14 Creating input buffer 13 Free input buffer 12 Creating input buffer 16 Free input buffer 11 Creating input buffer 15 Free input buffer 15 Creating input buffer 18 Free input buffer 13 Creating input buffer 17 Free input buffer 16 Creating input buffer 20 Free input buffer 20 Creating input buffer 19 Free input buffer 18 Creating input buffer 22 Free input buffer 17 Creating input buffer 21 Free input buffer 21 Creating input buffer 24 Free input buffer 19 Creating input buffer 23 Free input buffer 22 Creating input buffer 26 Free input buffer 26 Creating input buffer 25 Free input buffer 24 Creating input buffer 28 Free input buffer 23 Creating input buffer 27 Free input buffer 27 Creating input buffer 30 Free input buffer 25 Creating input buffer 29 Free input buffer 28 Creating input buffer 32 Free input buffer 32 Creating input buffer 31 Free input buffer 30 Creating input buffer 34 Free input buffer 29 Creating input buffer 33 Free input buffer 33
Can you explain this behaviour please?
Regards,
Andriy Lysnevych