in S3_HLS_Buffer_Mgr.c [175:210]
int32_t S3_HLS_Put_To_Buffer(S3_HLS_BUFFER_CTX* ctx, uint8_t* data, uint32_t length) {
BUFFER_DEBUG("Putting Buffer!\n");
if(NULL == ctx) {
BUFFER_DEBUG("Invalid Buffer Context!\n");
return S3_HLS_INVALID_PARAMETER;
}
if(NULL == data && 0 < length) {
BUFFER_DEBUG("Input data address is NULL, but length is not 0\n");
return S3_HLS_INVALID_PARAMETER;
}
// lock is handled outside put if necessary
if(ctx->total_length < ctx->used_length + length) {
BUFFER_DEBUG("Buffer is full, currently used %d, new data %d\n", ctx->used_length, length);
return S3_HLS_BUFFER_OVERFLOW;
}
BUFFER_DEBUG("Copy Buffer!\n");
uint8_t* buffer_end = ctx->buffer_start + ctx->total_length;
uint8_t* current = ctx->used_start + ctx->used_length;
if(current >= buffer_end)
current -= ctx->total_length;
if(buffer_end - current < length) {
// acrossed ring buffer boundary
memcpy(current, data, buffer_end - current);
memcpy(ctx->buffer_start, data + (buffer_end - current), length - (buffer_end - current));
} else {
memcpy(current, data, length);
}
ctx->used_length += length;
return length;
}