Ejemplo n.º 1
0
 def get_message(self) -> XVIZMessage:
     message = XVIZMessage(StateUpdate(
         update_type=self._update_type,
         updates=[self._get_streamset()],
     ),
                           buffers=[self._stream_buffers])
     return message
Ejemplo n.º 2
0
    def write_message(self, message: XVIZMessage, index: int = None):
        self._check_valid()
        if self._wrap_envelop:
            obj = XVIZEnvelope(message).to_proto()
        else:
            obj = message.to_proto()

        data = BytesIO()
        # write PBE1 header
        data.write(b'\x50\x42\x45\x31')
        data.write(obj.SerializeToString())

        fname = self._get_sequential_name(message, index) + '.pbe'
        self._source.write(data.getvalue(), fname)
Ejemplo n.º 3
0
    def write_message(self, message: XVIZMessage, index: int = None):

        self._check_valid()
        if self._wrap_envelop:
            obj = XVIZEnvelope(message).to_object()
        else:
            obj = message.to_object()
        builder = GLTFBuilder()

        fname = self._get_sequential_name(message, index) + '.glb'

        if isinstance(message.data, StateUpdate):
            # Wrap image data and point cloud
            if self._wrap_envelop:
                dataobj = obj['data']['updates']
            else:
                dataobj = obj['updates']
            if 'primitives' in dataobj:
                for pdata in dataobj['primitives'].values():
                    # process point cloud
                    if 'points' in pdata:
                        for pldata in pdata['points']:
                            if 'points' in pldata:
                                pldata['points'] = array.array(
                                    'f', pldata['points'])

                    # process images
                    if 'images' in pdata:
                        for imdata in pdata['points']:
                            imdata['data'] = ImageWrapper(
                                image=base64.b64decode(imdata['data']),
                                width=imdata['width_px'],
                                height=imdata['height_px'],
                                mime_type=
                                'image/png',  # FIXME: use Pillow to detect type
                            )

        # Encode GLB into file
        packed_data = builder.pack_binary_json(obj)
        if self._use_xviz_extension:
            builder.add_extension(XVIZ_GLTF_EXTENSION, packed_data)
        else:
            builder.add_application_data('xviz', packed_data)

        with self._source.open(fname) as fout:
            builder.flush(fout)
Ejemplo n.º 4
0
Archivo: json.py Proyecto: yxw027/xviz
    def write_message(self, message: XVIZMessage, index: int = None):
        self._check_valid()
        if self._wrap_envelop:
            obj = XVIZEnvelope(message).to_object()
        else:
            obj = message.to_object()

        fname = self._get_sequential_name(message, index) + '.json'

        # Encode GLB into file
        result = []  # These codes are for float truncation
        for part in json.JSONEncoder(separators=(',', ':')).iterencode(obj):
            try:
                rounded = round(float(part), self._json_precision)
            except ValueError:
                pass
            else:
                part = str(rounded)
            result.append(part)
        self._source.write(''.join(result).encode('ascii'), fname)
Ejemplo n.º 5
0
 def get_message(self):
     return XVIZMessage(metadata=self.get_data())
Ejemplo n.º 6
0
    def write_message(self, message: XVIZMessage, index: int = None):

        self._check_valid()
        if self._wrap_envelop:
            obj = XVIZEnvelope(message).to_object()
        else:
            obj = message.to_object()
        builder = GLTFBuilder()

        fname = self._get_sequential_name(message, index) + '.glb'

        if isinstance(message.data, StateUpdate):
            # Wrap image data and point cloud
            if self._wrap_envelop:
                dataobjs = obj['data']['updates']
            else:
                dataobjs = obj['updates']

            for dataobj in dataobjs:
                if 'primitives' in dataobj:
                    for pdata in dataobj['primitives'].values():
                        # convert lists into typed arrays to leverage binary format
                        if 'points' in pdata:
                            for pldata in pdata['points']:
                                num_points = None
                                if 'points' in pldata:
                                    num_points = len(pldata['points']) // 3
                                    pldata['points'] = TypedArrayWrapper(
                                        array=array.array(
                                            'f', pldata['points']),
                                        size=3,
                                    )
                                if 'colors' in pldata:
                                    # infer size from num_points
                                    assert num_points is not None
                                    color_bytes = bytes(pldata['colors'])
                                    size = len(color_bytes) // num_points
                                    assert size in (
                                        3, 4
                                    ), 'expecting size to be 3 or 4, got %s' % size
                                    pldata['colors'] = TypedArrayWrapper(
                                        array=color_bytes,
                                        size=size,
                                    )
                        if 'polylines' in pdata:
                            for pldata in pdata['polylines']:
                                if 'vertices' in pldata:
                                    pldata['vertices'] = TypedArrayWrapper(
                                        array=array.array(
                                            'f', pldata['vertices']),
                                        size=3,
                                    )
                        if 'polygons' in pdata:
                            for pldata in pdata['polygons']:
                                if 'vertices' in pldata:
                                    pldata['vertices'] = TypedArrayWrapper(
                                        array=array.array(
                                            'f', pldata['vertices']),
                                        size=3,
                                    )

                        # process images
                        if 'images' in pdata:
                            for imdata in pdata['images']:
                                imdata['data'] = ImageWrapper(
                                    image=base64.b64decode(imdata['data']),
                                    width=imdata['width_px'],
                                    height=imdata['height_px'],
                                    mime_type=
                                    'image/png',  # FIXME: use Pillow to detect type
                                )

        # Encode GLB into file
        packed_data = builder.pack_binary_json(obj)
        if self._use_xviz_extension:
            builder.add_extension(XVIZ_GLTF_EXTENSION, packed_data)
        else:
            builder.add_application_data('xviz', packed_data)

        with self._source.open(fname, mode='w') as fout:
            builder.flush(fout)
Ejemplo n.º 7
0
Archivo: gltf.py Proyecto: cmpute/xviz
    def write_message(self, message: XVIZMessage, index: int = None):

        self._check_valid()
        if self._wrap_envelop:
            obj = XVIZEnvelope(message).to_object(unravel='partial')
        else:
            obj = message.to_object(unravel='partial')
        builder = GLTFBuilder()

        fname = self._get_sequential_name(message, index) + '.glb'

        if isinstance(message._data, StateUpdate):
            # Wrap image data and point cloud
            if self._wrap_envelop:
                dataobjs = obj['data']['updates']
            else:
                dataobjs = obj['updates']

            for dataobj in dataobjs:
                if 'primitives' in dataobj:
                    for pdata in dataobj['primitives'].values():
                        # convert lists into typed arrays to leverage binary format
                        if 'points' in pdata:
                            for pldata in pdata['points']:
                                num_points = None
                                if 'points' in pldata:
                                    num_points = len(pldata['points']) // 3
                                    pldata['points'] = TypedArrayWrapper(
                                        array=pldata['points'], size=3)
                                if 'colors' in pldata:
                                    # infer size from num_points
                                    assert num_points is not None, "No points are provided in the stream"
                                    color_bytes = bytes(pldata['colors'])
                                    size = len(color_bytes) // num_points
                                    assert size in (
                                        3, 4
                                    ), 'expecting size to be 3 or 4, got %s' % size
                                    pldata['colors'] = TypedArrayWrapper(
                                        array=color_bytes,
                                        size=size,
                                    )
                        if 'polylines' in pdata:
                            for pldata in pdata['polylines']:
                                if 'vertices' in pldata:
                                    pldata['vertices'] = TypedArrayWrapper(
                                        array=array.array(
                                            'f', pldata['vertices']),
                                        size=3,
                                    )
                        if 'polygons' in pdata:
                            for pldata in pdata['polygons']:
                                if 'vertices' in pldata:
                                    pldata['vertices'] = TypedArrayWrapper(
                                        array=array.array(
                                            'f', pldata['vertices']),
                                        size=3,
                                    )

                        # process images
                        if 'images' in pdata:
                            for imdata in pdata['images']:
                                image = imdata['data']
                                data = BytesIO()
                                image.save(data, format=self._image_encoding)
                                mime = mimetypes.types_map[
                                    '.' + self._image_encoding.lower()]

                                imdata['data'] = ImageWrapper(
                                    data=data.getvalue(),
                                    width=image.width,
                                    height=image.height,
                                    mime_type=mime)

        # Encode GLB into file
        packed_data = builder.pack_binary_json(obj)
        if self._use_xviz_extension:
            builder.add_extension(XVIZ_GLTF_EXTENSION, packed_data)
        else:
            builder.add_application_data('xviz', packed_data)

        with self._source.open(fname, mode='w') as fout:
            builder.flush(fout)
Ejemplo n.º 8
0
 def get_message(self):
     message = XVIZMessage(
         StateUpdate(update_type=self._update_type,
                     updates=[self.get_data().data]))
     return message