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