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