// File: mmoanis[P]mpegts_demux/MpegTsDemux.cpp
// Function: MpegTsDemuxer::ReadHeader(unsigned char const*&, unsigned char const*, PacketHeader&)
bool MpegTsDemuxer::ReadHeader(Packet::const_iterator &p, Packet::const_iterator e, PacketHeader& header)
{
    if (*p != MPEGTS_SYNC_BYTE) {
        cerr << "[ERROR]: PKT#" << m_pnum << " Sync byte not found." << endl;
        return false;
    }
    p++;

    header.tei = static_cast<bool> (*p&0x80);
    header.pusi = static_cast<bool> (*p&0x40);
    header.tp = static_cast<bool> (*p&0x20);

    header.id = PID((p[0]&0x1F)<<8) | PID(p[1]);
    p += 2;

    header.afc = (((*p&0x30)>>4) == 0x2) || (((*p&0x30)>>4) == 0x3);
    header.payload = (((*p&0x30)>>4) == 0x1) || (((*p&0x30)>>4) == 0x3);
    header.cc = *p&0xF;
    p++;

    // Greedy, just escape the adaptation control field
    if (header.afc) {
        const uint8_t l = *p++;
        p += l;
    }

    return true;
}

// Assembly:
subq $0x48, %rsp
movq %rdi, 0x38(%rsp)
movq %rsi, 0x30(%rsp)
movq %rdx, 0x28(%rsp)
movq %rcx, 0x20(%rsp)
movq 0x38(%rsp), %rax
movq %rax, 0x10(%rsp)
movq 0x30(%rsp), %rax
movq (%rax), %rax
movzbl (%rax), %eax
cmpl $0x47, %eax
je 0x3191
movq 0x9ea7(%rip), %rdi      # 0xcff0
leaq 0x6126(%rip), %rsi      # 0x9276
callq 0x2140
movq %rax, %rdi
movq 0x10(%rsp), %rax
movq 0x90(%rax), %rsi
callq 0x2040
movq %rax, %rdi
leaq 0x6020(%rip), %rsi      # 0x9193
callq 0x2140
movq %rax, %rdi
movq 0x9e3e(%rip), %rsi      # 0xcfc0
callq 0x2180
movb $0x0, 0x47(%rsp)
jmp 0x332f
movq 0x30(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movq 0x30(%rsp), %rax
movq (%rax), %rax
movzbl (%rax), %eax
andl $0x80, %eax
cmpl $0x0, %eax
setne %cl
movq 0x20(%rsp), %rax
andb $0x1, %cl
movb %cl, (%rax)
movq 0x30(%rsp), %rax
movq (%rax), %rax
movzbl (%rax), %eax
andl $0x40, %eax
cmpl $0x0, %eax
setne %cl
movq 0x20(%rsp), %rax
andb $0x1, %cl
movb %cl, 0x1(%rax)
movq 0x30(%rsp), %rax
movq (%rax), %rax
movzbl (%rax), %eax
andl $0x20, %eax
cmpl $0x0, %eax
setne %cl
movq 0x20(%rsp), %rax
andb $0x1, %cl
movb %cl, 0x2(%rax)
movq 0x30(%rsp), %rax
movq (%rax), %rax
movzbl (%rax), %eax
andl $0x1f, %eax
shll $0x8, %eax
movzwl %ax, %eax
movq 0x30(%rsp), %rcx
movq (%rcx), %rcx
movzbl 0x1(%rcx), %ecx
movzwl %cx, %ecx
orl %ecx, %eax
movw %ax, %cx
movq 0x20(%rsp), %rax
movw %cx, 0x4(%rax)
movq 0x30(%rsp), %rax
movq (%rax), %rcx
addq $0x2, %rcx
movq %rcx, (%rax)
movq 0x30(%rsp), %rax
movq (%rax), %rax
movzbl (%rax), %ecx
andl $0x30, %ecx
sarl $0x4, %ecx
movb $0x1, %al
cmpl $0x2, %ecx
movb %al, 0xf(%rsp)
je 0x3275
movq 0x30(%rsp), %rax
movq (%rax), %rax
movzbl (%rax), %eax
andl $0x30, %eax
sarl $0x4, %eax
cmpl $0x3, %eax
sete %al
movb %al, 0xf(%rsp)
movb 0xf(%rsp), %cl
movq 0x20(%rsp), %rax
andb $0x1, %cl
movb %cl, 0x6(%rax)
movq 0x30(%rsp), %rax
movq (%rax), %rax
movzbl (%rax), %ecx
andl $0x30, %ecx
sarl $0x4, %ecx
movb $0x1, %al
cmpl $0x1, %ecx
movb %al, 0xe(%rsp)
je 0x32bb
movq 0x30(%rsp), %rax
movq (%rax), %rax
movzbl (%rax), %eax
andl $0x30, %eax
sarl $0x4, %eax
cmpl $0x3, %eax
sete %al
movb %al, 0xe(%rsp)
movb 0xe(%rsp), %cl
movq 0x20(%rsp), %rax
andb $0x1, %cl
movb %cl, 0x7(%rax)
movq 0x30(%rsp), %rax
movq (%rax), %rax
movzbl (%rax), %eax
andl $0xf, %eax
movb %al, %cl
movq 0x20(%rsp), %rax
movb %cl, 0x8(%rax)
movq 0x30(%rsp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
movq 0x20(%rsp), %rax
testb $0x1, 0x6(%rax)
je 0x332a
movq 0x30(%rsp), %rcx
movq (%rcx), %rax
movq %rax, %rdx
addq $0x1, %rdx
movq %rdx, (%rcx)
movb (%rax), %al
movb %al, 0x1f(%rsp)
movzbl 0x1f(%rsp), %edx
movq 0x30(%rsp), %rax
movq (%rax), %rcx
movslq %edx, %rdx
addq %rdx, %rcx
movq %rcx, (%rax)
movb $0x1, 0x47(%rsp)
movb 0x47(%rsp), %al
andb $0x1, %al
addq $0x48, %rsp
retq
nopw (%rax,%rax)