All the known marker segments parsers are now methods. #94
This commit is contained in:
parent
e53a9a9157
commit
40e91dae7f
1 changed files with 202 additions and 203 deletions
|
|
@ -165,7 +165,7 @@ class Codestream(object):
|
||||||
segment = self._parse_plt_segment(fptr)
|
segment = self._parse_plt_segment(fptr)
|
||||||
|
|
||||||
elif marker_id == 0xff5c:
|
elif marker_id == 0xff5c:
|
||||||
segment = _parse_qcd_segment(fptr)
|
segment = self._parse_qcd_segment(fptr)
|
||||||
|
|
||||||
elif marker_id == 0xff5d:
|
elif marker_id == 0xff5d:
|
||||||
segment = self._parse_qcc_segment(fptr)
|
segment = self._parse_qcc_segment(fptr)
|
||||||
|
|
@ -177,38 +177,25 @@ class Codestream(object):
|
||||||
segment = self._parse_pod_segment(fptr)
|
segment = self._parse_pod_segment(fptr)
|
||||||
|
|
||||||
elif marker_id == 0xff60:
|
elif marker_id == 0xff60:
|
||||||
segment = _parse_ppm_segment(fptr)
|
segment = self._parse_ppm_segment(fptr)
|
||||||
|
|
||||||
elif marker_id == 0xff61:
|
elif marker_id == 0xff61:
|
||||||
segment = _parse_ppt_segment(fptr)
|
segment = self._parse_ppt_segment(fptr)
|
||||||
|
|
||||||
elif marker_id == 0xff63:
|
elif marker_id == 0xff63:
|
||||||
segment = _parse_crg_segment(fptr, self._csiz)
|
segment = self._parse_crg_segment(fptr)
|
||||||
|
|
||||||
elif marker_id == 0xff64:
|
elif marker_id == 0xff64:
|
||||||
segment = _parse_cme_segment(fptr)
|
segment = self._parse_cme_segment(fptr)
|
||||||
|
|
||||||
elif marker_id == 0xff90:
|
elif marker_id == 0xff90:
|
||||||
# Need to keep easy access to tile offsets and lengths for when
|
segment = self._parse_sot_segment(fptr)
|
||||||
# we encounter start-of-data marker segments.
|
|
||||||
|
|
||||||
segment = _parse_sot_segment(fptr)
|
|
||||||
self._tile_offset.append(segment.offset)
|
|
||||||
if segment.psot == 0:
|
|
||||||
tile_part_length = (self.offset + self.length -
|
|
||||||
segment.offset - 2)
|
|
||||||
else:
|
|
||||||
tile_part_length = segment.psot
|
|
||||||
self._tile_length.append(tile_part_length)
|
|
||||||
|
|
||||||
elif marker_id == 0xff93:
|
elif marker_id == 0xff93:
|
||||||
# start of data. Need to seek past the current tile part.
|
segment = self._parse_sod_segment(fptr)
|
||||||
# The last SOT marker segment has the info that we need.
|
|
||||||
segment = _parse_sod_segment(fptr)
|
|
||||||
|
|
||||||
elif marker_id == 0xffd9:
|
elif marker_id == 0xffd9:
|
||||||
# end of codestream
|
segment = self._parse_eoc_segment(fptr)
|
||||||
segment = _parse_eoc_segment(fptr)
|
|
||||||
|
|
||||||
elif marker_id in _VALID_MARKERS:
|
elif marker_id in _VALID_MARKERS:
|
||||||
# It's a reserved marker that I don't know anything about.
|
# It's a reserved marker that I don't know anything about.
|
||||||
|
|
@ -277,6 +264,29 @@ class Codestream(object):
|
||||||
msg += ''.join(strs)
|
msg += ''.join(strs)
|
||||||
return msg
|
return msg
|
||||||
|
|
||||||
|
def _parse_cme_segment(self, fptr):
|
||||||
|
"""Parse the CME marker segment.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
fptr : file
|
||||||
|
Open file object.
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
CME segment instance.
|
||||||
|
"""
|
||||||
|
offset = fptr.tell() - 2
|
||||||
|
|
||||||
|
read_buffer = fptr.read(4)
|
||||||
|
data = struct.unpack('>HH', read_buffer)
|
||||||
|
length = data[0]
|
||||||
|
rcme = data[1]
|
||||||
|
ccme = fptr.read(length - 4)
|
||||||
|
|
||||||
|
return CMEsegment(rcme, ccme, length, offset)
|
||||||
|
|
||||||
|
|
||||||
def _parse_coc_segment(self, fptr):
|
def _parse_coc_segment(self, fptr):
|
||||||
"""Parse the COC marker segment.
|
"""Parse the COC marker segment.
|
||||||
|
|
||||||
|
|
@ -350,6 +360,49 @@ class Codestream(object):
|
||||||
return CODsegment(scod, spcod, length, offset)
|
return CODsegment(scod, spcod, length, offset)
|
||||||
|
|
||||||
|
|
||||||
|
def _parse_crg_segment(self, fptr):
|
||||||
|
"""Parse the CRG marker segment.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
fptr : file
|
||||||
|
Open file object.
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
CRG segment instance.
|
||||||
|
"""
|
||||||
|
offset = fptr.tell() - 2
|
||||||
|
|
||||||
|
read_buffer = fptr.read(2)
|
||||||
|
length, = struct.unpack('>H', read_buffer)
|
||||||
|
|
||||||
|
read_buffer = fptr.read(4 * self._csiz)
|
||||||
|
data = struct.unpack('>' + 'HH' * self._csiz, read_buffer)
|
||||||
|
xcrg = data[0::2]
|
||||||
|
ycrg = data[1::2]
|
||||||
|
|
||||||
|
return CRGsegment(xcrg, ycrg, length, offset)
|
||||||
|
|
||||||
|
|
||||||
|
def _parse_eoc_segment(self, fptr):
|
||||||
|
"""Parse the EOC (end-of-codestream) marker segment.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
fptr : file
|
||||||
|
Open file object.
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
EOC Segment instance.
|
||||||
|
"""
|
||||||
|
offset = fptr.tell() - 2
|
||||||
|
length = 0
|
||||||
|
|
||||||
|
return EOCsegment(length, offset)
|
||||||
|
|
||||||
|
|
||||||
def _parse_plt_segment(self, fptr):
|
def _parse_plt_segment(self, fptr):
|
||||||
"""Parse the PLT segment.
|
"""Parse the PLT segment.
|
||||||
|
|
||||||
|
|
@ -420,6 +473,57 @@ class Codestream(object):
|
||||||
|
|
||||||
return PODsegment(pod_params, length, offset)
|
return PODsegment(pod_params, length, offset)
|
||||||
|
|
||||||
|
def _parse_ppm_segment(self, fptr):
|
||||||
|
"""Parse the PPM segment.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
fptr : file
|
||||||
|
Open file object.
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
PPM segment instance.
|
||||||
|
"""
|
||||||
|
offset = fptr.tell() - 2
|
||||||
|
|
||||||
|
read_buffer = fptr.read(3)
|
||||||
|
length, zppm = struct.unpack('>HB', read_buffer)
|
||||||
|
|
||||||
|
numbytes = length - 3
|
||||||
|
read_buffer = fptr.read(numbytes)
|
||||||
|
|
||||||
|
return PPMsegment(zppm, read_buffer, length, offset)
|
||||||
|
|
||||||
|
|
||||||
|
def _parse_ppt_segment(self, fptr):
|
||||||
|
"""Parse the PPT segment.
|
||||||
|
|
||||||
|
The packet headers are not parsed, i.e. they remain "uninterpreted"
|
||||||
|
raw data beffers.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
fptr : file
|
||||||
|
Open file object.
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
PPT segment instance.
|
||||||
|
"""
|
||||||
|
offset = fptr.tell() - 2
|
||||||
|
|
||||||
|
read_buffer = fptr.read(3)
|
||||||
|
length, zppt = struct.unpack('>HB', read_buffer)
|
||||||
|
length = length
|
||||||
|
zppt = zppt
|
||||||
|
|
||||||
|
numbytes = length - 3
|
||||||
|
ippt = fptr.read(numbytes)
|
||||||
|
|
||||||
|
return PPTsegment(zppt, ippt, length, offset)
|
||||||
|
|
||||||
|
|
||||||
def _parse_qcc_segment(self, fptr):
|
def _parse_qcc_segment(self, fptr):
|
||||||
"""Parse the QCC segment.
|
"""Parse the QCC segment.
|
||||||
|
|
||||||
|
|
@ -456,6 +560,26 @@ class Codestream(object):
|
||||||
|
|
||||||
return QCCsegment(cqcc, sqcc, spqcc, length, offset)
|
return QCCsegment(cqcc, sqcc, spqcc, length, offset)
|
||||||
|
|
||||||
|
def _parse_qcd_segment(self, fptr):
|
||||||
|
"""Parse the QCD segment.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
fptr : file
|
||||||
|
Open file object.
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
QCD Segment instance.
|
||||||
|
"""
|
||||||
|
offset = fptr.tell() - 2
|
||||||
|
|
||||||
|
read_buffer = fptr.read(3)
|
||||||
|
length, sqcd = struct.unpack('>HB', read_buffer)
|
||||||
|
spqcd = fptr.read(length - 3)
|
||||||
|
|
||||||
|
return QCDsegment(sqcd, spqcd, length, offset)
|
||||||
|
|
||||||
def _parse_rgn_segment(self, fptr):
|
def _parse_rgn_segment(self, fptr):
|
||||||
"""Parse the RGN segment.
|
"""Parse the RGN segment.
|
||||||
|
|
||||||
|
|
@ -519,6 +643,63 @@ class Codestream(object):
|
||||||
return segment
|
return segment
|
||||||
|
|
||||||
|
|
||||||
|
def _parse_sod_segment(self, fptr):
|
||||||
|
"""Parse the SOD (start-of-data) segment.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
fptr : file
|
||||||
|
Open file object.
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
SOD segment instance.
|
||||||
|
"""
|
||||||
|
offset = fptr.tell() - 2
|
||||||
|
length = 0
|
||||||
|
|
||||||
|
return SODsegment(length, offset)
|
||||||
|
|
||||||
|
|
||||||
|
def _parse_sot_segment(self, fptr):
|
||||||
|
"""Parse the SOT segment.
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
fptr : file
|
||||||
|
Open file object.
|
||||||
|
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
SOT segment instance.
|
||||||
|
"""
|
||||||
|
offset = fptr.tell() - 2
|
||||||
|
|
||||||
|
read_buffer = fptr.read(10)
|
||||||
|
data = struct.unpack('>HHIBB', read_buffer)
|
||||||
|
|
||||||
|
length = data[0]
|
||||||
|
isot = data[1]
|
||||||
|
psot = data[2]
|
||||||
|
tpsot = data[3]
|
||||||
|
tnsot = data[4]
|
||||||
|
|
||||||
|
segment = SOTsegment(isot, psot, tpsot, tnsot, length, offset)
|
||||||
|
|
||||||
|
# Need to keep easy access to tile offsets and lengths for when
|
||||||
|
# we encounter start-of-data marker segments.
|
||||||
|
|
||||||
|
self._tile_offset.append(segment.offset)
|
||||||
|
if segment.psot == 0:
|
||||||
|
tile_part_length = (self.offset + self.length -
|
||||||
|
segment.offset - 2)
|
||||||
|
else:
|
||||||
|
tile_part_length = segment.psot
|
||||||
|
self._tile_length.append(tile_part_length)
|
||||||
|
|
||||||
|
return segment
|
||||||
|
|
||||||
|
|
||||||
def _parse_tlm_segment(self, fptr):
|
def _parse_tlm_segment(self, fptr):
|
||||||
"""Parse the TLM segment.
|
"""Parse the TLM segment.
|
||||||
|
|
||||||
|
|
@ -1584,188 +1765,6 @@ def _print_quantization_style(sqcc):
|
||||||
return msg
|
return msg
|
||||||
|
|
||||||
|
|
||||||
def _parse_sot_segment(fptr):
|
|
||||||
"""Parse the SOT segment.
|
|
||||||
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
fptr : file
|
|
||||||
Open file object.
|
|
||||||
|
|
||||||
Returns
|
|
||||||
-------
|
|
||||||
SOT segment instance.
|
|
||||||
"""
|
|
||||||
offset = fptr.tell() - 2
|
|
||||||
|
|
||||||
read_buffer = fptr.read(10)
|
|
||||||
data = struct.unpack('>HHIBB', read_buffer)
|
|
||||||
|
|
||||||
length = data[0]
|
|
||||||
isot = data[1]
|
|
||||||
psot = data[2]
|
|
||||||
tpsot = data[3]
|
|
||||||
tnsot = data[4]
|
|
||||||
|
|
||||||
return SOTsegment(isot, psot, tpsot, tnsot, length, offset)
|
|
||||||
|
|
||||||
|
|
||||||
def _parse_sod_segment(fptr):
|
|
||||||
"""Parse the SOD segment.
|
|
||||||
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
fptr : file
|
|
||||||
Open file object.
|
|
||||||
|
|
||||||
Returns
|
|
||||||
-------
|
|
||||||
SOD segment instance.
|
|
||||||
"""
|
|
||||||
offset = fptr.tell() - 2
|
|
||||||
length = 0
|
|
||||||
|
|
||||||
return SODsegment(length, offset)
|
|
||||||
|
|
||||||
|
|
||||||
def _parse_qcd_segment(fptr):
|
|
||||||
"""Parse the QCD segment.
|
|
||||||
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
fptr : file
|
|
||||||
Open file object.
|
|
||||||
|
|
||||||
Returns
|
|
||||||
-------
|
|
||||||
QCD Segment instance.
|
|
||||||
"""
|
|
||||||
offset = fptr.tell() - 2
|
|
||||||
|
|
||||||
read_buffer = fptr.read(3)
|
|
||||||
length, sqcd = struct.unpack('>HB', read_buffer)
|
|
||||||
spqcd = fptr.read(length - 3)
|
|
||||||
|
|
||||||
return QCDsegment(sqcd, spqcd, length, offset)
|
|
||||||
|
|
||||||
|
|
||||||
def _parse_ppt_segment(fptr):
|
|
||||||
"""Parse the PPT segment.
|
|
||||||
|
|
||||||
The packet headers are not parsed, i.e. they remain "uninterpreted"
|
|
||||||
raw data beffers.
|
|
||||||
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
fptr : file
|
|
||||||
Open file object.
|
|
||||||
|
|
||||||
Returns
|
|
||||||
-------
|
|
||||||
PPT segment instance.
|
|
||||||
"""
|
|
||||||
offset = fptr.tell() - 2
|
|
||||||
|
|
||||||
read_buffer = fptr.read(3)
|
|
||||||
length, zppt = struct.unpack('>HB', read_buffer)
|
|
||||||
length = length
|
|
||||||
zppt = zppt
|
|
||||||
|
|
||||||
numbytes = length - 3
|
|
||||||
ippt = fptr.read(numbytes)
|
|
||||||
|
|
||||||
return PPTsegment(zppt, ippt, length, offset)
|
|
||||||
|
|
||||||
|
|
||||||
def _parse_ppm_segment(fptr):
|
|
||||||
"""Parse the PPM segment.
|
|
||||||
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
fptr : file
|
|
||||||
Open file object.
|
|
||||||
|
|
||||||
Returns
|
|
||||||
-------
|
|
||||||
PPM segment instance.
|
|
||||||
"""
|
|
||||||
offset = fptr.tell() - 2
|
|
||||||
|
|
||||||
read_buffer = fptr.read(3)
|
|
||||||
length, zppm = struct.unpack('>HB', read_buffer)
|
|
||||||
|
|
||||||
numbytes = length - 3
|
|
||||||
read_buffer = fptr.read(numbytes)
|
|
||||||
|
|
||||||
return PPMsegment(zppm, read_buffer, length, offset)
|
|
||||||
|
|
||||||
|
|
||||||
def _parse_crg_segment(fptr, csiz):
|
|
||||||
"""Parse the CRG marker segment.
|
|
||||||
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
fptr : file
|
|
||||||
Open file object.
|
|
||||||
|
|
||||||
Returns
|
|
||||||
-------
|
|
||||||
CRG segment instance.
|
|
||||||
"""
|
|
||||||
offset = fptr.tell() - 2
|
|
||||||
|
|
||||||
read_buffer = fptr.read(2)
|
|
||||||
length, = struct.unpack('>H', read_buffer)
|
|
||||||
|
|
||||||
read_buffer = fptr.read(4 * csiz)
|
|
||||||
data = struct.unpack('>' + 'HH' * csiz, read_buffer)
|
|
||||||
xcrg = data[0::2]
|
|
||||||
ycrg = data[1::2]
|
|
||||||
|
|
||||||
return CRGsegment(xcrg, ycrg, length, offset)
|
|
||||||
|
|
||||||
|
|
||||||
def _parse_eoc_segment(fptr):
|
|
||||||
"""Parse the EOC marker segment.
|
|
||||||
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
fptr : file
|
|
||||||
Open file object.
|
|
||||||
|
|
||||||
Returns
|
|
||||||
-------
|
|
||||||
EOC Segment instance.
|
|
||||||
"""
|
|
||||||
offset = fptr.tell() - 2
|
|
||||||
length = 0
|
|
||||||
|
|
||||||
return EOCsegment(length, offset)
|
|
||||||
|
|
||||||
|
|
||||||
def _parse_cme_segment(fptr):
|
|
||||||
"""Parse the CME marker segment.
|
|
||||||
|
|
||||||
Parameters
|
|
||||||
----------
|
|
||||||
fptr : file
|
|
||||||
Open file object.
|
|
||||||
|
|
||||||
Returns
|
|
||||||
-------
|
|
||||||
CME segment instance.
|
|
||||||
"""
|
|
||||||
offset = fptr.tell() - 2
|
|
||||||
|
|
||||||
read_buffer = fptr.read(4)
|
|
||||||
data = struct.unpack('>HH', read_buffer)
|
|
||||||
length = data[0]
|
|
||||||
rcme = data[1]
|
|
||||||
ccme = fptr.read(length - 4)
|
|
||||||
|
|
||||||
return CMEsegment(rcme, ccme, length, offset)
|
|
||||||
|
|
||||||
|
|
||||||
def _parse_generic_segment(fptr, marker_id):
|
def _parse_generic_segment(fptr, marker_id):
|
||||||
"""Parse a generic marker segment.
|
"""Parse a generic marker segment.
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue