// File: lukasz-wiecaszek[P]h264iframedecoder/h264_parser.cpp
// Function: ymn::h264_parser::parse_ref_pic_list_modification(ymn::istream<0>&, ymn::h264::ref_pic_list_modification&)
bool h264_parser::parse_ref_pic_list_modification(istream_be& s, h264::ref_pic_list_modification& rplm)
{
    bool retval = false;

    do {
        s.read_bits(1, rplm.ref_pic_list_modification_flag_lx);
        if (rplm.ref_pic_list_modification_flag_lx) {
            size_t i = 0;
            uint32_t modification_of_pic_nums_idc;
            uint32_t abs_diff_pic_num_minus1;
            uint32_t long_term_pic_num;

            do {
                s.read_exp_golomb_u(modification_of_pic_nums_idc);

                if (modification_of_pic_nums_idc == 0 || modification_of_pic_nums_idc == 1)
                    s.read_exp_golomb_u(abs_diff_pic_num_minus1);
                else
                if (modification_of_pic_nums_idc == 2)
                    s.read_exp_golomb_u(long_term_pic_num);

                if (i < TABLE_ELEMENTS(rplm.m)) {
                    rplm.m[i].modification_of_pic_nums_idc = modification_of_pic_nums_idc;
                    if (modification_of_pic_nums_idc == 0 || modification_of_pic_nums_idc == 1)
                        rplm.m[i].u.abs_diff_pic_num_minus1 = abs_diff_pic_num_minus1;
                    else
                    if (modification_of_pic_nums_idc == 2)
                        rplm.m[i].u.long_term_pic_num = long_term_pic_num;
                }

                i++;
            } while ((s.status() == ISTREAM_STATUS_OK) && (modification_of_pic_nums_idc != 3));
        }

        if (s.status() != ISTREAM_STATUS_OK)
            break;

        rplm.set_valid(true);
        retval = true;
    }while (0);

    return retval;
}

// Assembly:
subq $0x38, %rsp
movq %rdi, 0x30(%rsp)
movq %rsi, 0x28(%rsp)
movq %rdx, 0x20(%rsp)
movb $0x0, 0x1f(%rsp)
movq 0x28(%rsp), %rdi
movq 0x20(%rsp), %rdx
addq $0xc, %rdx
movl $0x1, %esi
callq 0x16f30
movq 0x20(%rsp), %rax
cmpl $0x0, 0xc(%rax)
je 0x13516
movq $0x0, 0x10(%rsp)
movq 0x28(%rsp), %rdi
leaq 0xc(%rsp), %rsi
callq 0x17200
cmpl $0x0, 0xc(%rsp)
je 0x13455
cmpl $0x1, 0xc(%rsp)
jne 0x13466
movq 0x28(%rsp), %rdi
leaq 0x8(%rsp), %rsi
callq 0x17200
jmp 0x1347e
cmpl $0x2, 0xc(%rsp)
jne 0x1347c
movq 0x28(%rsp), %rdi
leaq 0x4(%rsp), %rsi
callq 0x17200
jmp 0x1347e
cmpq $0x4, 0x10(%rsp)
jae 0x134d7
movl 0xc(%rsp), %edx
movq 0x20(%rsp), %rax
movq 0x10(%rsp), %rcx
movl %edx, 0x10(%rax,%rcx,8)
cmpl $0x0, 0xc(%rsp)
je 0x134a6
cmpl $0x1, 0xc(%rsp)
jne 0x134ba
movl 0x8(%rsp), %edx
movq 0x20(%rsp), %rax
movq 0x10(%rsp), %rcx
movl %edx, 0x14(%rax,%rcx,8)
jmp 0x134d5
cmpl $0x2, 0xc(%rsp)
jne 0x134d3
movl 0x4(%rsp), %edx
movq 0x20(%rsp), %rax
movq 0x10(%rsp), %rcx
movl %edx, 0x14(%rax,%rcx,8)
jmp 0x134d5
jmp 0x134d7
movq 0x10(%rsp), %rax
addq $0x1, %rax
movq %rax, 0x10(%rsp)
movq 0x28(%rsp), %rdi
callq 0x17150
movl %eax, %ecx
xorl %eax, %eax
cmpl $0x0, %ecx
movb %al, 0x3(%rsp)
jne 0x13508
cmpl $0x3, 0xc(%rsp)
setne %al
movb %al, 0x3(%rsp)
movb 0x3(%rsp), %al
testb $0x1, %al
jne 0x13438
jmp 0x13516
movq 0x28(%rsp), %rdi
callq 0x17150
cmpl $0x0, %eax
je 0x13527
jmp 0x1353b
movq 0x20(%rsp), %rdi
movl $0x1, %esi
callq 0x17160
movb $0x1, 0x1f(%rsp)
movb 0x1f(%rsp), %al
andb $0x1, %al
addq $0x38, %rsp
retq
nopw %cs:(%rax,%rax)