codekingpro/portable-devtools
114k
1# This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild2 3import kaitaistruct4from kaitaistruct import KaitaiStruct, KaitaiStream, BytesIO5from enum import Enum6 7 8if getattr(kaitaistruct, 'API_VERSION', (0, 9)) < (0, 9):9 raise Exception("Incompatible Kaitai Struct Python API: 0.9 or later is required, but you have %s" % (kaitaistruct.__version__))10 11from . import exif12class Jpeg(KaitaiStruct):13 """JPEG File Interchange Format, or JFIF, or, more colloquially known14 as just "JPEG" or "JPG", is a popular 2D bitmap image file format,15 offering lossy compression which works reasonably well with16 photographic images.17 18 Format is organized as a container format, serving multiple19 "segments", each starting with a magic and a marker. JFIF standard20 dictates order and mandatory apperance of segments:21 22 * SOI23 * APP0 (with JFIF magic)24 * APP0 (with JFXX magic, optional)25 * everything else26 * SOS27 * JPEG-compressed stream28 * EOI29 """30 31 class ComponentId(Enum):32 y = 133 cb = 234 cr = 335 i = 436 q = 537 def __init__(self, _io, _parent=None, _root=None):38 self._io = _io39 self._parent = _parent40 self._root = _root if _root else self41 self._read()42 43 def _read(self):44 self.segments = []45 i = 046 while not self._io.is_eof():47 self.segments.append(Jpeg.Segment(self._io, self, self._root))48 i += 149 50 51 class Segment(KaitaiStruct):52 53 class MarkerEnum(Enum):54 tem = 155 sof0 = 19256 sof1 = 19357 sof2 = 19458 sof3 = 19559 dht = 19660 sof5 = 19761 sof6 = 19862 sof7 = 19963 soi = 21664 eoi = 21765 sos = 21866 dqt = 21967 dnl = 22068 dri = 22169 dhp = 22270 app0 = 22471 app1 = 22572 app2 = 22673 app3 = 22774 app4 = 22875 app5 = 22976 app6 = 23077 app7 = 23178 app8 = 23279 app9 = 23380 app10 = 23481 app11 = 23582 app12 = 23683 app13 = 23784 app14 = 23885 app15 = 23986 com = 25487 def __init__(self, _io, _parent=None, _root=None):88 self._io = _io89 self._parent = _parent90 self._root = _root if _root else self91 self._read()92 93 def _read(self):94 self.magic = self._io.read_bytes(1)95 if not self.magic == b"\xFF":96 raise kaitaistruct.ValidationNotEqualError(b"\xFF", self.magic, self._io, u"/types/segment/seq/0")97 self.marker = KaitaiStream.resolve_enum(Jpeg.Segment.MarkerEnum, self._io.read_u1())98 if ((self.marker != Jpeg.Segment.MarkerEnum.soi) and (self.marker != Jpeg.Segment.MarkerEnum.eoi)) :99 self.length = self._io.read_u2be()100 101 if ((self.marker != Jpeg.Segment.MarkerEnum.soi) and (self.marker != Jpeg.Segment.MarkerEnum.eoi)) :102 _on = self.marker103 if _on == Jpeg.Segment.MarkerEnum.app1:104 self._raw_data = self._io.read_bytes((self.length - 2))105 _io__raw_data = KaitaiStream(BytesIO(self._raw_data))106 self.data = Jpeg.SegmentApp1(_io__raw_data, self, self._root)107 elif _on == Jpeg.Segment.MarkerEnum.app0:108 self._raw_data = self._io.read_bytes((self.length - 2))109 _io__raw_data = KaitaiStream(BytesIO(self._raw_data))110 self.data = Jpeg.SegmentApp0(_io__raw_data, self, self._root)111 elif _on == Jpeg.Segment.MarkerEnum.sof0:112 self._raw_data = self._io.read_bytes((self.length - 2))113 _io__raw_data = KaitaiStream(BytesIO(self._raw_data))114 self.data = Jpeg.SegmentSof0(_io__raw_data, self, self._root)115 elif _on == Jpeg.Segment.MarkerEnum.sos:116 self._raw_data = self._io.read_bytes((self.length - 2))117 _io__raw_data = KaitaiStream(BytesIO(self._raw_data))118 self.data = Jpeg.SegmentSos(_io__raw_data, self, self._root)119 else:120 self.data = self._io.read_bytes((self.length - 2))121 122 if self.marker == Jpeg.Segment.MarkerEnum.sos:123 self.image_data = self._io.read_bytes_full()124 125 126 127 class SegmentSos(KaitaiStruct):128 def __init__(self, _io, _parent=None, _root=None):129 self._io = _io130 self._parent = _parent131 self._root = _root if _root else self132 self._read()133 134 def _read(self):135 self.num_components = self._io.read_u1()136 self.components = []137 for i in range(self.num_components):138 self.components.append(Jpeg.SegmentSos.Component(self._io, self, self._root))139 140 self.start_spectral_selection = self._io.read_u1()141 self.end_spectral = self._io.read_u1()142 self.appr_bit_pos = self._io.read_u1()143 144 class Component(KaitaiStruct):145 def __init__(self, _io, _parent=None, _root=None):146 self._io = _io147 self._parent = _parent148 self._root = _root if _root else self149 self._read()150 151 def _read(self):152 self.id = KaitaiStream.resolve_enum(Jpeg.ComponentId, self._io.read_u1())153 self.huffman_table = self._io.read_u1()154 155 156 157 class SegmentApp1(KaitaiStruct):158 def __init__(self, _io, _parent=None, _root=None):159 self._io = _io160 self._parent = _parent161 self._root = _root if _root else self162 self._read()163 164 def _read(self):165 self.magic = (self._io.read_bytes_term(0, False, True, True)).decode(u"ASCII")166 _on = self.magic167 if _on == u"Exif":168 self.body = Jpeg.ExifInJpeg(self._io, self, self._root)169 170 171 class SegmentSof0(KaitaiStruct):172 def __init__(self, _io, _parent=None, _root=None):173 self._io = _io174 self._parent = _parent175 self._root = _root if _root else self176 self._read()177 178 def _read(self):179 self.bits_per_sample = self._io.read_u1()180 self.image_height = self._io.read_u2be()181 self.image_width = self._io.read_u2be()182 self.num_components = self._io.read_u1()183 self.components = []184 for i in range(self.num_components):185 self.components.append(Jpeg.SegmentSof0.Component(self._io, self, self._root))186 187 188 class Component(KaitaiStruct):189 def __init__(self, _io, _parent=None, _root=None):190 self._io = _io191 self._parent = _parent192 self._root = _root if _root else self193 self._read()194 195 def _read(self):196 self.id = KaitaiStream.resolve_enum(Jpeg.ComponentId, self._io.read_u1())197 self.sampling_factors = self._io.read_u1()198 self.quantization_table_id = self._io.read_u1()199 200 @property201 def sampling_x(self):202 if hasattr(self, '_m_sampling_x'):203 return self._m_sampling_x204 205 self._m_sampling_x = ((self.sampling_factors & 240) >> 4)206 return getattr(self, '_m_sampling_x', None)207 208 @property209 def sampling_y(self):210 if hasattr(self, '_m_sampling_y'):211 return self._m_sampling_y212 213 self._m_sampling_y = (self.sampling_factors & 15)214 return getattr(self, '_m_sampling_y', None)215 216 217 218 class ExifInJpeg(KaitaiStruct):219 def __init__(self, _io, _parent=None, _root=None):220 self._io = _io221 self._parent = _parent222 self._root = _root if _root else self223 self._read()224 225 def _read(self):226 self.extra_zero = self._io.read_bytes(1)227 if not self.extra_zero == b"\x00":228 raise kaitaistruct.ValidationNotEqualError(b"\x00", self.extra_zero, self._io, u"/types/exif_in_jpeg/seq/0")229 self._raw_data = self._io.read_bytes_full()230 _io__raw_data = KaitaiStream(BytesIO(self._raw_data))231 self.data = exif.Exif(_io__raw_data)232 233 234 class SegmentApp0(KaitaiStruct):235 236 class DensityUnit(Enum):237 no_units = 0238 pixels_per_inch = 1239 pixels_per_cm = 2240 def __init__(self, _io, _parent=None, _root=None):241 self._io = _io242 self._parent = _parent243 self._root = _root if _root else self244 self._read()245 246 def _read(self):247 self.magic = (self._io.read_bytes(5)).decode(u"ASCII")248 self.version_major = self._io.read_u1()249 self.version_minor = self._io.read_u1()250 self.density_units = KaitaiStream.resolve_enum(Jpeg.SegmentApp0.DensityUnit, self._io.read_u1())251 self.density_x = self._io.read_u2be()252 self.density_y = self._io.read_u2be()253 self.thumbnail_x = self._io.read_u1()254 self.thumbnail_y = self._io.read_u1()255 self.thumbnail = self._io.read_bytes(((self.thumbnail_x * self.thumbnail_y) * 3))256 257 258 259 