// File: /workspace/github_c_makefile_star2_O0/videolan[P]bitstream/examples/dvb_gen_si.c
// Function: generate_sit
static void generate_sit(void) {
    uint8_t *sit = psi_allocate();
    uint8_t *sit_n;
    uint8_t sit_n_counter;
    uint8_t *desc_loop, *desc;
    uint8_t desc_counter;

    // Generate empty SIT
    sit_init(sit);
    psi_set_version(sit, 0);
    psi_set_current(sit);
    sit_set_length(sit, 0);
    sit_set_desclength(sit, 0);
    psi_set_crc(sit);
    output_psi_section(sit, SIT_PID, &cc);

    // Add elementary streams
    sit_init(sit);
    psi_set_version(sit, 1);
    psi_set_current(sit);
    sit_set_length(sit, 0);
    sit_set_desclength(sit, 0);

    {
        // Add descriptors to program descriptors
        sit_set_length(sit, PSI_MAX_SIZE);
        sit_set_desclength(sit, DESCS_MAX_SIZE);

        desc_counter = 0;
        desc_loop = sit_get_descs(sit);

        desc = descs_get_desc(desc_loop, desc_counter++);
        build_desc63(desc);

        // Finish descriptor generation
        desc = descs_get_desc(desc_loop, desc_counter); // Get next descriptor pos
        sit_set_desclength(sit, desc - desc_loop - DESCS_HEADER_SIZE);
        sit_set_length(sit, sit_get_desclength(sit));
    }

    {
        sit_set_length(sit, PSI_MAX_SIZE); // This needed so sit_get_es works

        // Process elementary streams
        sit_n_counter = 0;

        sit_n = sit_get_service(sit, sit_n_counter++);
        sitn_init(sit_n);
        sitn_set_sid(sit_n, sid);
        sitn_set_running(sit_n, 1);
        sitn_set_desclength(sit_n, 0);
        {
            // Add descriptors to transport_stream_n
            desc_counter = 0;
            desc_loop = sitn_get_descs(sit_n);
            descs_set_length(desc_loop, DESCS_MAX_SIZE); // This is needed so descs_get_desc(x, n) works

            desc = descs_get_desc(desc_loop, desc_counter++);
            build_desc05(desc);

            desc = descs_get_desc(desc_loop, desc_counter++);
            build_desc05(desc);

            desc = descs_get_desc(desc_loop, desc_counter++);
            build_desc05(desc);

            // Finish descriptor generation
            desc = descs_get_desc(desc_loop, desc_counter); // Get next descriptor pos
            descs_set_length(desc_loop, desc - desc_loop - DESCS_HEADER_SIZE);
        }

        sit_n = sit_get_service(sit, sit_n_counter++);
        sitn_init(sit_n);
        sitn_set_sid(sit_n, sid + 1000);
        sitn_set_running(sit_n, 3);
        sitn_set_desclength(sit_n, 0);

        // Set transport_stream_loop length
        sit_n = sit_get_service(sit, sit_n_counter); // Get last service
        sit_set_length(sit, sit_n - sit_get_service(sit, 0) + sit_get_desclength(sit));
    }

    psi_set_crc(sit);
    output_psi_section(sit, SIT_PID, &cc);

    free(sit);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
callq 0x4f30
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rdi
callq 0x15e80
movq -0x8(%rbp), %rdi
xorl %esi, %esi
callq 0x4ff0
movq -0x8(%rbp), %rdi
callq 0x5020
movq -0x8(%rbp), %rdi
xorl %esi, %esi
callq 0x15ef0
movq -0x8(%rbp), %rdi
xorl %esi, %esi
callq 0x15f20
movq -0x8(%rbp), %rdi
callq 0x5080
movq -0x8(%rbp), %rdi
movl $0x1f, %esi
leaq 0x1c68c(%rip), %rdx     # 0x210b9
callq 0x5170
movq -0x8(%rbp), %rdi
callq 0x15e80
movq -0x8(%rbp), %rdi
movl $0x1, %esi
callq 0x4ff0
movq -0x8(%rbp), %rdi
callq 0x5020
movq -0x8(%rbp), %rdi
xorl %esi, %esi
callq 0x15ef0
movq -0x8(%rbp), %rdi
xorl %esi, %esi
callq 0x15f20
movq -0x8(%rbp), %rdi
movl $0x3fd, %esi            # imm = 0x3FD
callq 0x15ef0
movq -0x8(%rbp), %rdi
movl $0xfff, %esi            # imm = 0xFFF
callq 0x15f20
movb $0x0, -0x29(%rbp)
movq -0x8(%rbp), %rdi
callq 0x15f60
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rdi
movb -0x29(%rbp), %al
movb %al, %cl
addb $0x1, %cl
movb %cl, -0x29(%rbp)
leaq 0xf85(%rip), %rdx       # 0x5a30
movzbl %al, %esi
callq 0x59c0
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rdi
callq 0x15f80
movq -0x20(%rbp), %rdi
leaq 0xf65(%rip), %rdx       # 0x5a30
movzbl -0x29(%rbp), %esi
callq 0x59c0
movq %rax, -0x28(%rbp)
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rax
movq -0x20(%rbp), %rcx
subq %rcx, %rax
subq $0x2, %rax
movzwl %ax, %esi
callq 0x15f20
movq -0x8(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x8(%rbp), %rdi
callq 0x15fd0
movq -0x50(%rbp), %rdi
movzwl %ax, %esi
callq 0x15ef0
movq -0x8(%rbp), %rdi
movl $0x3fd, %esi            # imm = 0x3FD
callq 0x15ef0
movb $0x0, -0x11(%rbp)
movq -0x8(%rbp), %rdi
movb -0x11(%rbp), %al
movb %al, %cl
addb $0x1, %cl
movb %cl, -0x11(%rbp)
movzbl %al, %esi
callq 0x16000
movq %rax, -0x10(%rbp)
movq -0x10(%rbp), %rdi
callq 0x160f0
movq -0x10(%rbp), %rdi
movzwl 0x1c539(%rip), %esi     # 0x2108a
callq 0x16110
movq -0x10(%rbp), %rdi
movl $0x1, %esi
callq 0x16150
movq -0x10(%rbp), %rdi
xorl %esi, %esi
callq 0x16180
movb $0x0, -0x29(%rbp)
movq -0x10(%rbp), %rdi
callq 0x161d0
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rdi
movl $0xfff, %esi            # imm = 0xFFF
callq 0x5970
movq -0x20(%rbp), %rdi
movb -0x29(%rbp), %al
movb %al, %cl
addb $0x1, %cl
movb %cl, -0x29(%rbp)
leaq 0xe8c(%rip), %rdx       # 0x5a30
movzbl %al, %esi
callq 0x59c0
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rdi
callq 0xe7e0
movq -0x20(%rbp), %rdi
movb -0x29(%rbp), %al
movb %al, %cl
addb $0x1, %cl
movb %cl, -0x29(%rbp)
leaq 0xe61(%rip), %rdx       # 0x5a30
movzbl %al, %esi
callq 0x59c0
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rdi
callq 0xe7e0
movq -0x20(%rbp), %rdi
movb -0x29(%rbp), %al
movb %al, %cl
addb $0x1, %cl
movb %cl, -0x29(%rbp)
leaq 0xe36(%rip), %rdx       # 0x5a30
movzbl %al, %esi
callq 0x59c0
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rdi
callq 0xe7e0
movq -0x20(%rbp), %rdi
leaq 0xe16(%rip), %rdx       # 0x5a30
movzbl -0x29(%rbp), %esi
callq 0x59c0
movq %rax, -0x28(%rbp)
movq -0x20(%rbp), %rdi
movq -0x28(%rbp), %rax
movq -0x20(%rbp), %rcx
subq %rcx, %rax
subq $0x2, %rax
movzwl %ax, %esi
callq 0x5970
movq -0x8(%rbp), %rdi
movb -0x11(%rbp), %al
movb %al, %cl
addb $0x1, %cl
movb %cl, -0x11(%rbp)
movzbl %al, %esi
callq 0x16000
movq %rax, -0x10(%rbp)
movq -0x10(%rbp), %rdi
callq 0x160f0
movq -0x10(%rbp), %rdi
movzwl 0x1c419(%rip), %eax     # 0x2108a
addl $0x3e8, %eax            # imm = 0x3E8
movzwl %ax, %esi
callq 0x16110
movq -0x10(%rbp), %rdi
movl $0x3, %esi
callq 0x16150
movq -0x10(%rbp), %rdi
xorl %esi, %esi
callq 0x16180
movq -0x8(%rbp), %rdi
movzbl -0x11(%rbp), %esi
callq 0x16000
movq %rax, -0x10(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x40(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x8(%rbp), %rdi
xorl %esi, %esi
callq 0x16000
movq %rax, %rcx
movq -0x48(%rbp), %rax
subq %rcx, %rax
movq %rax, -0x38(%rbp)
movq -0x8(%rbp), %rdi
callq 0x15fd0
movq -0x40(%rbp), %rdi
movw %ax, %cx
movq -0x38(%rbp), %rax
movzwl %cx, %ecx
addq %rcx, %rax
movzwl %ax, %esi
callq 0x15ef0
movq -0x8(%rbp), %rdi
callq 0x5080
movq -0x8(%rbp), %rdi
movl $0x1f, %esi
leaq 0x1c3ad(%rip), %rdx     # 0x210b9
callq 0x5170
movq -0x8(%rbp), %rdi
callq 0x1030
addq $0x50, %rsp
popq %rbp
retq