chunk header
This commit is contained in:
		
							parent
							
								
									153402755f
								
							
						
					
					
						commit
						c6abdac270
					
				@ -5,7 +5,7 @@ use regex::Regex;
 | 
				
			|||||||
use ros_message::{MessagePath, Msg};
 | 
					use ros_message::{MessagePath, Msg};
 | 
				
			||||||
use rsbag::{
 | 
					use rsbag::{
 | 
				
			||||||
    index::{BagIndex, ConnInfo},
 | 
					    index::{BagIndex, ConnInfo},
 | 
				
			||||||
    reader::IoReader,
 | 
					    reader::{BagReader, MmapReader},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn parse_msgdef(message_name: &str, msgdef: &str) -> rsbag::Result<Msg> {
 | 
					fn parse_msgdef(message_name: &str, msgdef: &str) -> rsbag::Result<Msg> {
 | 
				
			||||||
@ -53,10 +53,16 @@ fn main() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    let bag_path = &args[1];
 | 
					    let bag_path = &args[1];
 | 
				
			||||||
    let bag_file = File::open(bag_path).expect("Could not open bag file");
 | 
					    let bag_file = File::open(bag_path).expect("Could not open bag file");
 | 
				
			||||||
    let mut bag_reader = IoReader::new(bag_file);
 | 
					    let mut bag_reader = MmapReader::new(bag_file).unwrap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let index = match BagIndex::read_all(&mut bag_reader) {
 | 
				
			||||||
 | 
					        Ok(index) => index,
 | 
				
			||||||
 | 
					        Err(err) => {
 | 
				
			||||||
 | 
					            error!("bag parse error: {}", err);
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    match BagIndex::read_all(&mut bag_reader) {
 | 
					 | 
				
			||||||
        Ok(index) => {
 | 
					 | 
				
			||||||
    for conn in &index.connections {
 | 
					    for conn in &index.connections {
 | 
				
			||||||
        match parse_message_definitions(conn) {
 | 
					        match parse_message_definitions(conn) {
 | 
				
			||||||
            Ok(msgs) => {
 | 
					            Ok(msgs) => {
 | 
				
			||||||
@ -74,7 +80,13 @@ fn main() {
 | 
				
			|||||||
            Err(err) => error!("could not parse message definition: {}", err),
 | 
					            Err(err) => error!("could not parse message definition: {}", err),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let mut total_size = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for chunk in &index.chunks {
 | 
				
			||||||
 | 
					        let chunk_header = bag_reader.read_chunk_header(chunk.pos).unwrap();
 | 
				
			||||||
 | 
					        total_size += chunk_header.uncompressed_size;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
        Err(err) => error!("bag parse error: {}", err),
 | 
					
 | 
				
			||||||
    }
 | 
					    info!("total uncompressed size: {}", total_size);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										38
									
								
								src/chunk.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								src/chunk.rs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,38 @@
 | 
				
			|||||||
 | 
					use std::str::FromStr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use crate::{parse::Header, Error, Result};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Clone, Copy, Debug)]
 | 
				
			||||||
 | 
					pub enum Compression {
 | 
				
			||||||
 | 
					    None,
 | 
				
			||||||
 | 
					    Bz2,
 | 
				
			||||||
 | 
					    Lz4,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl FromStr for Compression {
 | 
				
			||||||
 | 
					    type Err = Error;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn from_str(s: &str) -> Result<Self, Self::Err> {
 | 
				
			||||||
 | 
					        Ok(match s {
 | 
				
			||||||
 | 
					            "none" => Compression::None,
 | 
				
			||||||
 | 
					            "bz2" => Compression::Bz2,
 | 
				
			||||||
 | 
					            "lz4" => Compression::Lz4,
 | 
				
			||||||
 | 
					            _ => return Err(Error::UnsupportedCompression(s.to_string())),
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Debug)]
 | 
				
			||||||
 | 
					pub struct ChunkHeader {
 | 
				
			||||||
 | 
					    pub compression: Compression,
 | 
				
			||||||
 | 
					    pub uncompressed_size: u32,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl ChunkHeader {
 | 
				
			||||||
 | 
					    pub fn from_header(header: Header) -> Result<Self> {
 | 
				
			||||||
 | 
					        Ok(Self {
 | 
				
			||||||
 | 
					            compression: header.read_string(b"compression")?.parse()?,
 | 
				
			||||||
 | 
					            uncompressed_size: header.read_u32(b"size")?,
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -13,6 +13,8 @@ pub enum Error {
 | 
				
			|||||||
    UnsupportedVersion(parse::Version),
 | 
					    UnsupportedVersion(parse::Version),
 | 
				
			||||||
    #[error("unsupported encryptor: {0}")]
 | 
					    #[error("unsupported encryptor: {0}")]
 | 
				
			||||||
    UnsupportedEncryptor(String),
 | 
					    UnsupportedEncryptor(String),
 | 
				
			||||||
 | 
					    #[error("unsupported compression: {0}")]
 | 
				
			||||||
 | 
					    UnsupportedCompression(String),
 | 
				
			||||||
    #[error("unexpected EOF")]
 | 
					    #[error("unexpected EOF")]
 | 
				
			||||||
    Eof,
 | 
					    Eof,
 | 
				
			||||||
    #[error("invalid header op: {0}")]
 | 
					    #[error("invalid header op: {0}")]
 | 
				
			||||||
 | 
				
			|||||||
@ -2,5 +2,6 @@ mod error;
 | 
				
			|||||||
pub mod index;
 | 
					pub mod index;
 | 
				
			||||||
pub mod parse;
 | 
					pub mod parse;
 | 
				
			||||||
pub mod reader;
 | 
					pub mod reader;
 | 
				
			||||||
 | 
					pub mod chunk;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub use error::{Error, Result};
 | 
					pub use error::{Error, Result};
 | 
				
			||||||
 | 
				
			|||||||
@ -2,6 +2,7 @@ use std::io::SeekFrom;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
use nom::number::streaming::le_u32;
 | 
					use nom::number::streaming::le_u32;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use crate::chunk::ChunkHeader;
 | 
				
			||||||
use crate::error::{Error, Result};
 | 
					use crate::error::{Error, Result};
 | 
				
			||||||
use crate::index::{ChunkInfo, ConnInfo};
 | 
					use crate::index::{ChunkInfo, ConnInfo};
 | 
				
			||||||
use crate::parse::{self, Header, Op, Version};
 | 
					use crate::parse::{self, Header, Op, Version};
 | 
				
			||||||
@ -59,4 +60,10 @@ pub trait BagReader {
 | 
				
			|||||||
        self.skip_data()?;
 | 
					        self.skip_data()?;
 | 
				
			||||||
        ChunkInfo::from_header(header)
 | 
					        ChunkInfo::from_header(header)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn read_chunk_header(&mut self, pos: u64) -> Result<ChunkHeader> {
 | 
				
			||||||
 | 
					        self.seek(SeekFrom::Start(pos))?;
 | 
				
			||||||
 | 
					        let header = self.read_header_op(Op::Chunk)?;
 | 
				
			||||||
 | 
					        ChunkHeader::from_header(header)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user