int32_t S3_HLS_Pes_Write_Audio_Frame()

in S3_HLS_Pes.c [347:469]


int32_t S3_HLS_Pes_Write_Audio_Frame(S3_HLS_BUFFER_CTX* buffer_ctx, S3_HLS_FRAME_PACK* pack) {
    int32_t ret = S3_HLS_OK;

    uint32_t content_length = 0;
    
    AUDIO_DEBUG("[Pes - Audio] Check Cnt\n");
    if(0 == pack->item_count) {
        return S3_HLS_INVALID_PARAMETER;
    }
    
    AUDIO_DEBUG("[Pes - Audio] Try Lock\n");
    if (0 != S3_HLS_Lock_Buffer(buffer_ctx)) // lock failed
        return S3_HLS_LOCK_FAILED;

    AUDIO_DEBUG("[Pes - Audio] Locked\n");
    for(uint32_t cnt = 0; cnt < pack->item_count; cnt++) {
        AUDIO_DEBUG("[Pes - Audio] Packet Item %d, %d, %d\n", pack->item_count, pack->items[cnt].first_part_length, pack->items[cnt].second_part_length);
        if(NULL == pack->items[cnt].first_part_start || (NULL == pack->items[cnt].second_part_start && pack->items[cnt].second_part_length != 0)) {
            ret = S3_HLS_INVALID_PARAMETER;
            goto l_exit;
        }

        content_length += pack->items[cnt].first_part_length + pack->items[cnt].second_part_length;
    }

    content_length += sizeof(audio_pes_header); // calculate total length

    AUDIO_DEBUG("[Pes - Audio] Total Length: %d\n", content_length);
    if(has_error) {
        AUDIO_DEBUG("[Pes - Audio] Prev error detected, skip until next sperate frame!\n");
        goto l_exit;
    }

    S3_HLS_TS_Set_Pid(S3_HLS_Audio_PID);
    
    S3_HLS_TS_Set_Payload_Start();
    
    S3_HLS_TS_Set_Random_Access();

    S3_HLS_TS_Fill_Remaining_Length(content_length);

    AUDIO_DEBUG("[Pes - Audio] Write TS Header\n");
    // write TS header
    ret = S3_HLS_TS_Write_To_Buffer(buffer_ctx);
    
    if(0 > ret) { // write error
        AUDIO_DEBUG("[Pes - Audio] Write Buffer Failed! %d\n", ret);
        goto l_exit;
    }
    
    uint32_t remaining = S3_HLS_TS_PACKET_SIZE - ret;
    
    AUDIO_DEBUG("[Pes - Audio] Write Audio PES Header, Remaining: %d\n", remaining);
    // write PES info
    ret = S3_HLS_Pes_Write_Audio_Pes(buffer_ctx, pack->items[0].timestamp, content_length - sizeof(audio_pes_header));
    if(0 > ret) {
        has_error = 1;
        goto l_exit;
    }
    
    remaining -= ret;
    content_length -= ret;

    uint32_t packet_index = 0;
    uint32_t packet_pos = 0;
    
    AUDIO_DEBUG("[Pes - Audio] Write Audio Content\n");
    while(content_length > 0) { // have data to send
        AUDIO_DEBUG("[Pes - Audio] Remaining Size %d Content Length %d\n", remaining, content_length);
        if(0 == remaining) {
            S3_HLS_TS_Set_Pid(S3_HLS_Audio_PID);
            S3_HLS_TS_Fill_Remaining_Length(content_length);
            ret = S3_HLS_TS_Write_To_Buffer(buffer_ctx);
            if(0 > ret) {
                has_error = 1;
                AUDIO_DEBUG("[Pes - Audio] Write Buffer Failed 2! %d\n", ret);
                goto l_exit;
            }
            
            remaining = S3_HLS_TS_PACKET_SIZE - ret;
        }
        
        if(remaining > 0) {
            // write data to buffer
            uint8_t* start_pos;
            uint32_t write_length;
            
            if(packet_pos >= pack->items[packet_index].first_part_length) { // writing second part
                // need to copy from second part
                start_pos = pack->items[packet_index].second_part_start + (packet_pos - pack->items[packet_index].first_part_length);
                write_length = remaining < (pack->items[packet_index].first_part_length + pack->items[packet_index].second_part_length - packet_pos) ? remaining : (pack->items[packet_index].first_part_length + pack->items[packet_index].second_part_length - packet_pos);
            } else { // writing first part
                start_pos = pack->items[packet_index].first_part_start + packet_pos;
                write_length = remaining < (pack->items[packet_index].first_part_length - packet_pos) ? remaining : (pack->items[packet_index].first_part_length - packet_pos);
            }
            
            ret = S3_HLS_Put_To_Buffer(buffer_ctx, start_pos, write_length);
            
            if(0 > ret) {
                has_error = 1;
                AUDIO_DEBUG("[Pes - Audio] Write Buffer Failed 3! %d\n", ret);
                goto l_exit;
            }

            content_length -= write_length;
            remaining -= write_length;
            
            packet_pos += write_length;
            
            if(packet_pos == pack->items[packet_index].first_part_length + pack->items[packet_index].second_part_length) {
                packet_index++;
                packet_pos = 0;
            }
        }
    }
    
    S3_HLS_Unlock_Buffer(buffer_ctx);
    return S3_HLS_OK;

l_exit:
    S3_HLS_Unlock_Buffer(buffer_ctx);
    return ret;
}