diff --git a/media-converter/src/audioconv.rs b/media-converter/src/audioconv.rs index e845eb2b..77269227 100644 --- a/media-converter/src/audioconv.rs +++ b/media-converter/src/audioconv.rs @@ -198,7 +198,7 @@ static DUMP_FOZDB: Lazy>> = Lazy::new(|| return Mutex::new(None); } - match fossilize::StreamArchive::new(&dump_file_path, OpenOptions::new().write(true).read(true).create(true), AUDIOCONV_FOZ_NUM_TAGS) { + match fossilize::StreamArchive::new(&dump_file_path, OpenOptions::new().write(true).read(true).create(true), false /* read-only? */, AUDIOCONV_FOZ_NUM_TAGS) { Ok(newdb) => Mutex::new(Some(newdb)), Err(_) => Mutex::new(None), } @@ -454,7 +454,7 @@ impl AudioConvState { gst_loggable_error!(CAT, "MEDIACONV_AUDIO_TRANSCODED_FILE is not set!") })?; - let read_fozdb = match fossilize::StreamArchive::new(&read_fozdb_path, OpenOptions::new().read(true), AUDIOCONV_FOZ_NUM_TAGS) { + let read_fozdb = match fossilize::StreamArchive::new(&read_fozdb_path, OpenOptions::new().read(true), true /* read-only? */, AUDIOCONV_FOZ_NUM_TAGS) { Ok(s) => Some(s), Err(_) => None, }; diff --git a/media-converter/src/fossilize.rs b/media-converter/src/fossilize.rs index 511f4602..be3fef5d 100644 --- a/media-converter/src/fossilize.rs +++ b/media-converter/src/fossilize.rs @@ -197,6 +197,7 @@ impl PayloadEntry { pub struct StreamArchive { file: fs::File, + read_only: bool, seen_blobs: Vec>, @@ -210,7 +211,7 @@ pub enum CRCCheck { impl StreamArchive { - pub fn new>(filename: P, fileopts: &OpenOptions, num_tags: usize) -> Result { + pub fn new>(filename: P, fileopts: &OpenOptions, read_only: bool, num_tags: usize) -> Result { let file = fileopts.open(filename)?; @@ -221,6 +222,7 @@ impl StreamArchive { let mut ret = Self { file, + read_only, seen_blobs, write_pos: 0, }; @@ -269,6 +271,10 @@ impl StreamArchive { match res { Ok(p) => { self.write_pos = p; + if tag >= self.seen_blobs.len() && self.read_only { + /* ignore unknown tags for read-only DBs, otherwise panic */ + continue; + } self.seen_blobs[tag].insert(hash, payload_entry); }, diff --git a/media-converter/src/videoconv.rs b/media-converter/src/videoconv.rs index b00d6d6d..0484a0d9 100644 --- a/media-converter/src/videoconv.rs +++ b/media-converter/src/videoconv.rs @@ -124,7 +124,7 @@ static DUMP_FOZDB: Lazy>> = Lazy::new(|| return Mutex::new(None); } - match fossilize::StreamArchive::new(&dump_file_path, OpenOptions::new().write(true).read(true).create(true), VIDEOCONV_FOZ_NUM_TAGS) { + match fossilize::StreamArchive::new(&dump_file_path, OpenOptions::new().write(true).read(true).create(true), false /* read-only? */, VIDEOCONV_FOZ_NUM_TAGS) { Ok(newdb) => Mutex::new(Some(newdb)), Err(_) => Mutex::new(None), } @@ -237,7 +237,7 @@ impl VideoConvState { gst_loggable_error!(CAT, "MEDIACONV_VIDEO_TRANSCODED_FILE is not set!") })?; - let read_fozdb = match fossilize::StreamArchive::new(&read_fozdb_path, OpenOptions::new().read(true), VIDEOCONV_FOZ_NUM_TAGS) { + let read_fozdb = match fossilize::StreamArchive::new(&read_fozdb_path, OpenOptions::new().read(true), true /* read-only? */, VIDEOCONV_FOZ_NUM_TAGS) { Ok(s) => Some(s), Err(_) => None, };