import xml.etree.ElementTree as ET
import os

# structure:
# <packet>
#   <proto.../>
#   <proto.../>
#   <proto.../>
#   <proto name="usb" showname="USB isochronous packet"...>
#       <field.../>
#       <field.../>
#       <field name="usb.iso.data" showname="ISO Data [...]: 0200ff..." show="02:00:ff:..." value="0200ff..."/>
#   </proto>
# </packet>

def parseXML(xmlfile):
    packets=[]
    tree = ET.parse(xmlfile)
    myroot = tree.getroot()
    for pkt in myroot:
        # "pkt" should have tag "packet"
        for proto in pkt:
            # looking for the USB Isochronous Packet showname
            if 'showname' in proto.attrib.keys():
                if proto.attrib['showname'] == 'USB isochronous packet':
                    for field in proto:
                        # looking for the "usb.iso.data" field
                        if field.attrib['name'] == 'usb.iso.data':
                            hexstr = bytes.fromhex(field.attrib['value'])
                            packets.append(hexstr)
    return packets

packets = parseXML(r"C:\Users\david\Desktop\afsds.pdml")
saved_frames_folder = r"C:\Users\david\Desktop\imgs2"
img = bytearray()

n=0
# img_id = packets[0][1] & 0x01
# completely ignoring the frame id from USB
inside_jpeg = False
save_file = os.path.join(saved_frames_folder, "dumped_frame")
# for i in range(len(packets)):
    # if (packets[i][1] & 0x01) != img_id:
    #     # on to the next image, so dump what we have so far
        
    #     fil = open(f'{save_file}_{n}.jpg','wb')
    #     fil.write(img)
    #     fil.close()
    #     img = bytearray()
    #     img_id = packets[i][1] & 0x01
    #     n = n + 1
    # img = img + packets[i][2:]
i = 0
while True:
    if(i >= len(packets)):
        break
    # look for first SOI 
    soi_pos = -1
    soi_packet = -1
    while soi_pos < 0:
        soi_pos = packets[i][2:].find(b'\xff\xd8')
        if(soi_pos < 0):
            i = i + 1
            if(i >= len(packets)):
                break
        else: 
            soi_pos = soi_pos + 2 # correct for actual packet size
            soi_packet = i
    # look for first EOI or repeated SOI
    eoi_pos = -1
    next_soi_pos = -1
    while eoi_pos < 0:
        if i == soi_packet:
            eoi_pos = packets[i][soi_pos+2:].find(b'\xff\xd9')
            if(eoi_pos >= 0):
                eoi_pos = eoi_pos + soi_pos+2
            next_soi_pos = packets[i][soi_pos+2:].find(b'\xff\xd8')
            if(next_soi_pos >= 0):
                next_soi_pos = next_soi_pos + soi_pos+2
        else:
            eoi_pos = packets[i][2:].find(b'\xff\xd9')
            if(eoi_pos >= 0):
                eoi_pos = eoi_pos + 2
            next_soi_pos = packets[i][2:].find(b'\xff\xd8')
            if(next_soi_pos >= 0):
                next_soi_pos = next_soi_pos + 2
        # if we have both soi and eoi, check that eoi is first
        if (eoi_pos >= 0) and (next_soi_pos >= 0):
            if eoi_pos < next_soi_pos:
                # this is a good image, print it out!
                with open(f'{save_file}_{n}.jpg','wb') as imgfil:
                    n = n + 1
                    if i == soi_packet:
                        imgfil.write(packets[i][soi_pos:(eoi_pos+2)])
                        print(f'Image {n} SOI position = {soi_pos}, packet {i}. EOI position = {eoi_pos}, packet {i} with length {len(packets[i])}')
                    else:
                        imgfil.write(packets[soi_packet][soi_pos:])
                        k = soi_packet+1
                        while k < i:
                            imgfil.write(packets[k][2:])
                            k = k + 1
                        imgfil.write(packets[k][2:(eoi_pos+2)])
                        print(f'Image {n} SOI position = {soi_pos}, packet {soi_packet}. EOI position = {eoi_pos}, packet {i} with length {len(packets[i])}')
                    
            else:
                # uh oh, repeated soi
                # try creating image using this section
                with open(f'{save_file}_{n}.jpg','wb') as imgfil:
                    n = n + 1
                    imgfil.write(packets[i][next_soi_pos:(eoi_pos+2)])
                    print(f'Image {n} SOI position = {next_soi_pos}, packet {i}. EOI position = {eoi_pos}, packet {i} with length {len(packets[i])}')
        elif (eoi_pos >= 0):
            # only got eoi, so this is a good image but we'll need to look for the next soi
            # in the next packet
            i = i + 1
            if(i >= len(packets)):
                break
        elif (next_soi_pos >= 0):
            # repeated SOI but no EOI. definitely an error, but let's just continue trying for an image
            # at the top of this loop
            break
        else:
            # no SOI, no EOI
            # keep trying with next packet
            i = i + 1
            if(i >= len(packets)):
                break

# at the very end, dump the last chunk we have
# fil = open(f'{save_file}_{n}.jpg','wb')
# fil.write(img)
# fil.close()