// File: /workspace/github_c_makefile_star2_O0/dwbuiten[P]obuparse/obuparse.c
// Function: obp_parse_tile_list
int obp_parse_tile_list(uint8_t *buf, size_t buf_size, OBPTileList *tile_list, OBPError *err)
{
    size_t pos = 0;

    if (buf_size < 4) {
        snprintf(err->error, err->size, "Tile list OBU must be at least 4 bytes.");
        return -1;
    }

    tile_list->output_frame_width_in_tiles_minus_1  = buf[0];
    tile_list->output_frame_height_in_tiles_minus_1 = buf[1];
    tile_list->tile_count_minus_1                   = (((uint16_t) buf[2]) << 8) | buf[3];
    pos += 4;

    for (uint16_t i = 0; i < tile_list->tile_count_minus_1; i++) {
        if (pos + 5 > buf_size) {
            snprintf(err->error, err->size, "Tile list OBU malformed: Not enough bytes for next tile_list_entry().");
            return -1;
        }

        tile_list->tile_list_entry[i].anchor_frame_idx       = buf[pos];
        tile_list->tile_list_entry[i].anchor_tile_row        = buf[pos + 1];
        tile_list->tile_list_entry[i].anchor_tile_col        = buf[pos + 2];
        tile_list->tile_list_entry[i].tile_data_size_minus_1 = (((uint16_t) buf[pos + 3]) << 8) | buf[pos + 4];
        pos += 5;

        size_t N = 8 * (((size_t) tile_list->tile_list_entry[i].tile_data_size_minus_1) + 1);

        if (pos + N > buf_size) {
            snprintf(err->error, err->size, "Tile list OBU malformed: Not enough bytes for next tile_list_entry()'s data.");
            return -1;
        }

        tile_list->tile_list_entry[i].coded_tile_data      = buf + pos;
        tile_list->tile_list_entry[i].coded_tile_data_size = N;
        pos += N;
    }

    return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq %rcx, -0x28(%rbp)
movq $0x0, -0x30(%rbp)
cmpq $0x4, -0x18(%rbp)
jae 0x3f50
movq -0x28(%rbp), %rax
movq (%rax), %rdi
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rsi
leaq 0xb238(%rip), %rdx      # 0xf175
movb $0x0, %al
callq 0x1030
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
jmp 0x414b
movq -0x10(%rbp), %rax
movb (%rax), %cl
movq -0x20(%rbp), %rax
movb %cl, (%rax)
movq -0x10(%rbp), %rax
movb 0x1(%rax), %cl
movq -0x20(%rbp), %rax
movb %cl, 0x1(%rax)
movq -0x10(%rbp), %rax
movzbl 0x2(%rax), %eax
movzwl %ax, %eax
shll $0x8, %eax
movq -0x10(%rbp), %rcx
movzbl 0x3(%rcx), %ecx
orl %ecx, %eax
movw %ax, %cx
movq -0x20(%rbp), %rax
movw %cx, 0x2(%rax)
movq -0x30(%rbp), %rax
addq $0x4, %rax
movq %rax, -0x30(%rbp)
movw $0x0, -0x32(%rbp)
movzwl -0x32(%rbp), %eax
movq -0x20(%rbp), %rcx
movzwl 0x2(%rcx), %ecx
cmpl %ecx, %eax
jge 0x4144
movq -0x30(%rbp), %rax
addq $0x5, %rax
cmpq -0x18(%rbp), %rax
jbe 0x3fea
movq -0x28(%rbp), %rax
movq (%rax), %rdi
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rsi
leaq 0xb1c6(%rip), %rdx      # 0xf19d
movb $0x0, %al
callq 0x1030
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
jmp 0x414b
movq -0x10(%rbp), %rax
movq -0x30(%rbp), %rcx
movb (%rax,%rcx), %cl
movq -0x20(%rbp), %rax
addq $0x8, %rax
movzwl -0x32(%rbp), %edx
imulq $0x18, %rdx, %rdx
addq %rdx, %rax
movb %cl, (%rax)
movq -0x10(%rbp), %rax
movq -0x30(%rbp), %rcx
movb 0x1(%rax,%rcx), %cl
movq -0x20(%rbp), %rax
addq $0x8, %rax
movzwl -0x32(%rbp), %edx
imulq $0x18, %rdx, %rdx
addq %rdx, %rax
movb %cl, 0x1(%rax)
movq -0x10(%rbp), %rax
movq -0x30(%rbp), %rcx
movb 0x2(%rax,%rcx), %cl
movq -0x20(%rbp), %rax
addq $0x8, %rax
movzwl -0x32(%rbp), %edx
imulq $0x18, %rdx, %rdx
addq %rdx, %rax
movb %cl, 0x2(%rax)
movq -0x10(%rbp), %rax
movq -0x30(%rbp), %rcx
movzbl 0x3(%rax,%rcx), %eax
movzwl %ax, %eax
shll $0x8, %eax
movq -0x10(%rbp), %rcx
movq -0x30(%rbp), %rdx
movzbl 0x4(%rcx,%rdx), %ecx
orl %ecx, %eax
movw %ax, %cx
movq -0x20(%rbp), %rax
addq $0x8, %rax
movzwl -0x32(%rbp), %edx
imulq $0x18, %rdx, %rdx
addq %rdx, %rax
movw %cx, 0x4(%rax)
movq -0x30(%rbp), %rax
addq $0x5, %rax
movq %rax, -0x30(%rbp)
movq -0x20(%rbp), %rax
addq $0x8, %rax
movzwl -0x32(%rbp), %ecx
imulq $0x18, %rcx, %rcx
addq %rcx, %rax
movzwl 0x4(%rax), %eax
addq $0x1, %rax
shlq $0x3, %rax
movq %rax, -0x40(%rbp)
movq -0x30(%rbp), %rax
addq -0x40(%rbp), %rax
cmpq -0x18(%rbp), %rax
jbe 0x40ed
movq -0x28(%rbp), %rax
movq (%rax), %rdi
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rsi
leaq 0xb106(%rip), %rdx      # 0xf1e3
movb $0x0, %al
callq 0x1030
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
jmp 0x414b
movq -0x10(%rbp), %rcx
addq -0x30(%rbp), %rcx
movq -0x20(%rbp), %rax
addq $0x8, %rax
movzwl -0x32(%rbp), %edx
imulq $0x18, %rdx, %rdx
addq %rdx, %rax
movq %rcx, 0x8(%rax)
movq -0x40(%rbp), %rcx
movq -0x20(%rbp), %rax
addq $0x8, %rax
movzwl -0x32(%rbp), %edx
imulq $0x18, %rdx, %rdx
addq %rdx, %rax
movq %rcx, 0x10(%rax)
movq -0x40(%rbp), %rax
addq -0x30(%rbp), %rax
movq %rax, -0x30(%rbp)
movw -0x32(%rbp), %ax
addw $0x1, %ax
movw %ax, -0x32(%rbp)
jmp 0x3f9f
movl $0x0, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x40, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)