%PDF- %PDF-
Direktori : /home/waritko/build/Bento4/Source/Python/bento4/ |
Current File : //home/waritko/build/Bento4/Source/Python/bento4/inspectors.py |
from bento4 import * from ctypes import CFUNCTYPE, c_char_p, byref, c_int, c_float, string_at from xml.etree.ElementTree import Element, SubElement from base64 import b16encode class AtomInspector(object): def __init__(self, bt4inspector): self.bt4inspector = bt4inspector super(AtomInspector, self).__init__() def __del__(self): lb4.AP4_AtomInspector_Destroy(self.bt4inspector) class PrintInspector(AtomInspector): def __init__(self, stream): self.stream = stream bt4inspector = lb4.AP4_PrintInspector_Create(stream.bt4stream) super(PrintInspector, self).__init__(bt4inspector) class InspectorDelegate(Structure): pass start_element_proto = CFUNCTYPE(None, POINTER(InspectorDelegate), c_char_p, c_char_p) end_element_proto = CFUNCTYPE(None, POINTER(InspectorDelegate)) add_int_field_proto = CFUNCTYPE(None, POINTER(InspectorDelegate), c_char_p, Ap4UI64, c_int) add_float_field_proto = CFUNCTYPE(None, POINTER(InspectorDelegate), c_char_p, c_float, c_int) add_string_field_proto = CFUNCTYPE(None, POINTER(InspectorDelegate), c_char_p, c_char_p, c_int) add_bytes_field_proto = CFUNCTYPE(None, POINTER(InspectorDelegate), c_char_p, c_void_p, Ap4Size, c_int) InspectorDelegate._fields_ = [("start_element", start_element_proto), ("end_element", end_element_proto), ("add_int_field", add_int_field_proto), ("add_float_field", add_float_field_proto), ("add_string_field", add_string_field_proto), ("add_bytes_field", add_bytes_field_proto), ("destroy", c_void_p), # must be set to None ("oid", c_int)] # object id # global dict of objects constructed with a delegate pyinspector_objects = {} # # redirection functions # def delegate_start_element(pdelegate, name, extra): pyinspector = pyinspector_objects[pdelegate[0].oid] pyinspector.c_start_element(name, extra) def delegate_end_element(pdelegate): pyinspector = pyinspector_objects[pdelegate[0].oid] pyinspector.c_end_element() def delegate_add_int_field(pdelegate, name, value, hint): pyinspector = pyinspector_objects[pdelegate[0].oid] pyinspector.c_add_int_field(name, value, hint) def delegate_add_float_field(pdelegate, name, value, hint): pyinspector = pyinspector_objects[pdelegate[0].oid] pyinspector.c_add_float_field(name, value, hint) def delegate_add_string_field(pdelegate, name, value, hint): pyinspector = pyinspector_objects[pdelegate[0].oid] pyinspector.c_add_string_field(name, value, hint) def delegate_add_bytes_field(pdelegate, name, bytes, byte_count, hint): pyinspector = pyinspector_objects[pdelegate[0].oid] pyinspector.c_add_bytes_field(name, bytes, byte_count, hint) class PyInspector(AtomInspector): def __init__(self, pyinspector): self.delegate = InspectorDelegate( start_element=start_element_proto(delegate_start_element), end_element=end_element_proto(delegate_end_element), add_int_field=add_int_field_proto(delegate_add_int_field), add_float_field=add_float_field_proto(delegate_add_float_field), add_string_field=add_string_field_proto(delegate_add_string_field), add_bytes_field=add_bytes_field_proto(delegate_add_bytes_field), destroy=None, oid=id(pyinspector)) pyinspector_objects[id(pyinspector)] = pyinspector bt4inspector = lb4.AP4_AtomInspector_FromDelegate(byref(self.delegate)) super(PyInspector, self).__init__(bt4inspector) def c_start_element(self, name, extra): pass def c_end_element(self): pass def c_add_int_field(self, name, value, hint): pass def c_add_float_field(self, name, value, hint): pass def c_add_string_field(self, name, value, hint): pass def c_add_bytes_field(self, name, bytes, byte_count, hint): pass class XmlInspector(PyInspector): def __init__(self): self.root = Element("Mp4File") self.current = (None, self.root) # parent, element super(XmlInspector, self).__init__(self) def c_start_element(self, name, extra): parent, element = self.current new_element = SubElement(element, "Atom", name=name[1:-1]) if extra: a = extra.split('=') if len(a) == 2: new_element.attrib[a[0]] = a[1] self.current = ((parent, element), new_element) def c_end_element(self): (grandparent, parent), element = self.current self.current = (grandparent, parent) def c_add_int_field(self, name, value, hint): int_element = SubElement(self.current[1], "Field", name=name, type='int') int_element.text = str(value) def c_add_float_field(self, name, value, hint): float_element = SubElement(self.current[1], "Field", name=name, type='float') float_element.text = str(value) def c_add_string_field(self, name, value, hint): str_element = SubElement(self.current[1], "Field", name=name, type='string') str_element.text = value def c_add_bytes_field(self, name, bytes, byte_count, hint): bytes_element = SubElement(self.current[1], "Field", name=name, type='bytes') bytes_element.text = b16encode(string_at(bytes, byte_count))