telemetry-parser 0.2.6

Library to parse real-time metadata embedded in video files or telemetry from other sources.
Documentation
// SPDX-License-Identifier: MIT OR Apache-2.0
// Copyright © 2021 Adrian <adrian.eddy at gmail>

mod sensor_logger;
mod gyro;
mod gf_recorder;
mod sensor_logger_android;
mod sensor_record;

use std::io::*;
use std::sync::{ Arc, atomic::AtomicBool };

use crate::*;

#[derive(Default)]
pub struct PhoneApps {
    pub model: Option<String>,
}

impl PhoneApps {
    pub fn detect<P: AsRef<std::path::Path>>(buffer: &[u8], filepath: P) -> Option<Self> {
        let filename = filepath.as_ref().file_name().map(|x| x.to_string_lossy()).unwrap_or_default();

        if sensor_logger        ::detect(&buffer, &filename) { return Some(Self { model: Some("Sensor Logger"        .to_owned()) }); }
        if gf_recorder          ::detect(&buffer, &filename) { return Some(Self { model: Some("GF Recorder"          .to_owned()) }); }
        if gyro                 ::detect(&buffer, &filename) { return Some(Self { model: Some("Gyro"                 .to_owned()) }); }
        if sensor_logger_android::detect(&buffer, &filename) { return Some(Self { model: Some("Sensor Logger Android".to_owned()) }); }
        if sensor_record        ::detect(&buffer, &filename) { return Some(Self { model: Some("Sensor Record"        .to_owned()) }); }

        None
    }

    pub fn parse<T: Read + Seek, F: Fn(f64)>(&mut self, stream: &mut T, size: usize, _progress_cb: F, _cancel_flag: Arc<AtomicBool>) -> Result<Vec<SampleInfo>> {
        match self.model.as_deref() {
            Some("Sensor Logger")           => sensor_logger        ::parse(stream, size),
            Some("GF Recorder")             => gf_recorder          ::parse(stream, size),
            Some("Gyro")                    => gyro                 ::parse(stream, size),
            Some("Sensor Logger Android")   => sensor_logger_android::parse(stream, size),
            Some("Sensor Record")           => sensor_record        ::parse(stream, size),
            _ => {
                Err(ErrorKind::InvalidInput.into())
            }
        }
    }

    pub fn normalize_imu_orientation(v: String) -> String {
        v
    }

    pub fn camera_type(&self) -> String {
        "Mobile app".to_owned()
    }

    pub fn frame_readout_time(&self) -> Option<f64> {
        None
    }
}