def callBackMetadata(self, currentTime, nextTime): """ Metadata CallBack """ try: t = callBackMetadataThread(cmds=[ '-i', self.fileName, '-ss', currentTime, '-to', nextTime, '-map', 'data-re', '-f', 'data', '-' ]) t.start() t.join(1) if t.is_alive(): t.p.terminate() t.join() if t.stdout == b'': return for packet in StreamParser(t.stdout): try: self.addMetadata(packet.MetadataList()) UpdateLayers(packet, parent=self, mosaic=self.createingMosaic) self.iface.mapCanvas().refresh() QApplication.processEvents() return except Exception as e: None except Exception as e: qgsu.showUserAndLogMessage(QCoreApplication.translate( "QgsFmvPlayer", "Metadata Callback Failed! : "), str(e), level=QGis.Info)
def test_singlepacket(self): # Example from MISB ST 0902.5 with open("./data/DynamicConstantMISMMSPacketData.bin", "rb") as f: packet = f.read() from QGIS_FMV.klvdata.streamparser import StreamParser for packet in StreamParser(packet): # packet.structure() pass
def packetStreamParser(self, stdout_data): ''' Common packet process''' for packet in StreamParser(stdout_data): try: if isinstance(packet, UnknownElement): qgsu.showUserAndLogMessage( "Error interpreting klv data, metadata cannot be read.", "the parser did not recognize KLV data", level=QGis.Warning, onlyLog=True) continue data = packet.MetadataList() self.data = data if self.metadataDlg.isVisible( ): # Only add metada to table if this QDockWidget is visible (speed plugin) self.metadataDlg.menuSave.setEnabled(True) self.addMetadata(data) UpdateLayers(packet, parent=self, mosaic=self.createingMosaic) QApplication.processEvents() return except Exception: None
def getVideoLocationInfo(videoPath): """ Get basic location info about the video """ location = [] try: p = _spawn([ '-i', videoPath, '-ss', '00:00:00', '-to', '00:00:01', '-map', 'data-re', '-f', 'data', '-' ]) stdout_data, _ = p.communicate() if stdout_data == b'': return for packet in StreamParser(stdout_data): packet.MetadataList() frameCenterLat = packet.GetFrameCenterLatitude() frameCenterLon = packet.GetFrameCenterLongitude() location = [frameCenterLat, frameCenterLon] qgsu.showUserAndLogMessage(QCoreApplication.translate( "QgsFmvUtils", "Got Location: lon: " + str(frameCenterLon) + " lat: " + str(frameCenterLat)), onlyLog=True) break else: qgsu.showUserAndLogMessage(QCoreApplication.translate( "QgsFmvUtils", "This video doesn't have Metadata ! : "), level=QGis.Info) except Exception as e: qgsu.showUserAndLogMessage(QCoreApplication.translate( "QgsFmvUtils", "Video info callback failed! : "), str(e), level=QGis.Info) return location
from QGIS_FMV.klvdata.element import UnknownElement from QGIS_FMV.klvdata.streamparser import StreamParser import sys from qgis.PyQt.QtWidgets import QApplication app = QApplication([""]) print('Number of arguments:', len(sys.argv), 'arguments.') if len(sys.argv) == 2: print("data: " + sys.argv[1]) stdout_data = open(sys.argv[1], 'rb').read() for packet in StreamParser(stdout_data): if isinstance(packet, UnknownElement): print("Error interpreting klv data, metadata cannot be read.") continue data = packet.MetadataList() print("First Precision Time Stamp:" + str(data[2]))
def getVideoLocationInfo(videoPath, dataFile=False): """ Get basic location info about the video """ location = [] try: if dataFile == False: p = _spawn([ '-i', videoPath, '-ss', '00:00:00', '-to', '00:00:01', '-map', 'data-re', '-f', 'data', '-' ]) stdout_data, _ = p.communicate() ################ else: global listOfMetadata stdout_data = listOfMetadata[0] ################ if stdout_data == b'': return for packet in StreamParser(stdout_data): if isinstance(packet, UnknownElement): qgsu.showUserAndLogMessage( "Error interpreting klv data, metadata cannot be read.", "the parser did not recognize KLV data", level=QGis.Warning) continue packet.MetadataList() frameCenterLat = packet.FrameCenterLatitude frameCenterLon = packet.FrameCenterLongitude loc = "-" if Reverse_geocoding_url != "": try: url = QUrl( Reverse_geocoding_url.format(str(frameCenterLat), str(frameCenterLon))) request = QNetworkRequest(url) reply = QgsNetworkAccessManager.instance().get(request) loop = QEventLoop() reply.finished.connect(loop.quit) loop.exec_() reply.finished.disconnect(loop.quit) loop = None result = reply.readAll() data = json.loads(result.data()) if "village" in data["address"] and "state" in data[ "address"]: loc = data["address"]["village"] + \ ", " + data["address"]["state"] elif "town" in data["address"] and "state" in data[ "address"]: loc = data["address"]["town"] + \ ", " + data["address"]["state"] else: loc = data["display_name"] except Exception: qgsu.showUserAndLogMessage( "", "getVideoLocationInfo: failed to get address from reverse geocoding service.", onlyLog=True) location = [frameCenterLat, frameCenterLon, loc] qgsu.showUserAndLogMessage( "", "Got Location: lon: " + str(frameCenterLon) + " lat: " + str(frameCenterLat) + " location: " + str(loc), onlyLog=True) break else: qgsu.showUserAndLogMessage( QCoreApplication.translate( "QgsFmvUtils", "This video doesn't have Metadata ! : ")) except Exception as e: qgsu.showUserAndLogMessage( QCoreApplication.translate("QgsFmvUtils", "Video info callback failed! : "), str(e)) return location
def getVideoLocationInfo(videoPath, islocal=False, klv_folder=None, klv_index=0): """ Get basic location info about the video """ location = [] try: if islocal: dataFile = os.path.join(klv_folder, "0.0.klv") f = open(dataFile, 'rb') stdout_data = f.read() else: p = _spawn([ '-i', videoPath, '-ss', '00:00:00', '-to', '00:00:01', '-map', '0:d:' + str(klv_index), '-f', 'data', '-' ]) stdout_data, _ = p.communicate() # qgsu.showUserAndLogMessage("Video Loc info raw result", stdout_data, onlyLog=True) if stdout_data == b'': # qgsu.showUserAndLogMessage("Error interpreting klv data, metadata cannot be read.", "the parser did not recognize KLV data", level=QGis.Warning) return for packet in StreamParser(stdout_data): if isinstance(packet, UnknownElement): qgsu.showUserAndLogMessage( "Error interpreting klv data, metadata cannot be read.", "the parser did not recognize KLV data", level=QGis.Warning) continue packet.MetadataList() centerLat = packet.FrameCenterLatitude centerLon = packet.FrameCenterLongitude # Target maybe unavailable because of horizontal view if centerLat is None and centerLon is None: centerLat = packet.SensorLatitude centerLon = packet.SensorLongitude loc = "-" if Reverse_geocoding_url != "": try: url = QUrl( Reverse_geocoding_url.format(str(centerLat), str(centerLon))) request = QNetworkRequest(url) reply = QgsNetworkAccessManager.instance().get(request) loop = QEventLoop() reply.finished.connect(loop.quit) loop.exec_() reply.finished.disconnect(loop.quit) loop = None result = reply.readAll() data = json.loads(result.data()) if "village" in data["address"] and "state" in data[ "address"]: loc = data["address"]["village"] + \ ", " + data["address"]["state"] elif "town" in data["address"] and "state" in data[ "address"]: loc = data["address"]["town"] + \ ", " + data["address"]["state"] else: loc = data["display_name"] except Exception: qgsu.showUserAndLogMessage( "", "getVideoLocationInfo: failed to get address from reverse geocoding service.", onlyLog=True) location = [centerLat, centerLon, loc] qgsu.showUserAndLogMessage("", "Got Location: lon: " + str(centerLon) + " lat: " + str(centerLat) + " location: " + str(loc), onlyLog=True) break else: qgsu.showUserAndLogMessage( QCoreApplication.translate( "QgsFmvUtils", "This video doesn't have Metadata ! : ")) except Exception as e: qgsu.showUserAndLogMessage( QCoreApplication.translate("QgsFmvUtils", "Video info callback failed! : "), str(e)) return location