int32_t S3_HLS_TS_Write_To_Buffer()

in S3_HLS_TS.c [164:227]


int32_t S3_HLS_TS_Write_To_Buffer(S3_HLS_BUFFER_CTX* ctx) {
    uint32_t ret = 0;
    uint32_t pid = ts_header[S3_HLS_TS_PID_HIGH_POS] & 0x1F;
    pid *= 256;
    pid += ts_header[S3_HLS_TS_PID_LOW_POS];
    
    ts_header[S3_HLS_TS_COUNTER_INDEX] &= 0xF0;
    switch(pid) {
        case S3_HLS_Video_PID:
            ts_header[S3_HLS_TS_COUNTER_INDEX] |= (m_ts_video_counter & 0x0F);
            break;
        case S3_HLS_Audio_PID:
            ts_header[S3_HLS_TS_COUNTER_INDEX] |= (m_ts_audio_counter & 0x0F);
            break;
    }

    // write to buffer
    uint8_t* first_part_start = ts_header;
    uint32_t first_part_length = 4;
    
    uint8_t* second_part_start = NULL;
    uint32_t second_part_length = 0;
    
    if(ts_header[S3_HLS_TS_ADOPTION_FLAG_POS] & S3_HLS_TS_ADOPTION_FLAG) { // do have adoption field
        first_part_length++; // adoption length field
        if(ts_header[S3_HLS_TS_ADOPTION_LENGTH_POS] > 0) {
            if(ts_header[S3_HLS_TS_PCR_FLAG_POS] & S3_HLS_TS_PCR_FLAG) {
                first_part_length += 7; // adoption flags 1 + pcr 6
            } else {
                first_part_length += 1; // adoption flags 1
            }
        }
        
        if(ts_header[S3_HLS_TS_ADOPTION_LENGTH_POS] > first_part_length - 5) {
            // need to fill remaining fields
            second_part_start = const_fill_word;
            second_part_length = ts_header[S3_HLS_TS_ADOPTION_LENGTH_POS] - (first_part_length - 5);
        }
    } 

    ret = S3_HLS_Put_To_Buffer(ctx, first_part_start, first_part_length);
    if(0 > ret)
        return ret;
    
    int32_t length = ret;
    ret = S3_HLS_Put_To_Buffer(ctx, second_part_start, second_part_length);
    if(0 > ret)
        return ret;
        
    length += ret;
    
    S3_HLS_TS_Reset_Header_Info();
    
    switch(pid) {
        case S3_HLS_Video_PID:
            m_ts_video_counter++;
            break;
        case S3_HLS_Audio_PID:
            m_ts_audio_counter++;
            break;
    }
    
    return  length;
}