int32_t S3_HLS_Put_To_Buffer()

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;
}