|
35 | 35 | // file, You can obtain one at https://mozilla.org/MPL/2.0/. |
36 | 36 |
|
37 | 37 | use byteorder::WriteBytesExt; |
| 38 | +use fallible_collections::TryReserveError; |
38 | 39 | use mp4parse::unstable::rational_scale; |
39 | 40 | use std::convert::TryFrom; |
40 | 41 | use std::convert::TryInto; |
| 42 | +use std::hash::Hash; |
41 | 43 |
|
42 | 44 | use std::io::Read; |
43 | 45 |
|
@@ -435,6 +437,24 @@ pub struct Mp4parseAvifParser { |
435 | 437 | sample_table: TryHashMap<u32, TryVec<Indice>>, |
436 | 438 | } |
437 | 439 |
|
| 440 | +trait CacheInsertExt<K, V> { |
| 441 | + fn insert_cache_entry(&mut self, key: K, value: V) -> Result<(), TryReserveError>; |
| 442 | +} |
| 443 | + |
| 444 | +impl<K, V> CacheInsertExt<K, V> for TryHashMap<K, V> |
| 445 | +where |
| 446 | + K: Eq + Hash, |
| 447 | +{ |
| 448 | + fn insert_cache_entry(&mut self, key: K, value: V) -> Result<(), TryReserveError> { |
| 449 | + let replaced = self.insert(key, value)?; |
| 450 | + debug_assert!( |
| 451 | + replaced.is_none(), |
| 452 | + "cache entries must never be replaced once published" |
| 453 | + ); |
| 454 | + Ok(()) |
| 455 | + } |
| 456 | +} |
| 457 | + |
438 | 458 | impl Mp4parseAvifParser { |
439 | 459 | fn context(&self) -> &AvifContext { |
440 | 460 | &self.context |
@@ -854,7 +874,7 @@ fn get_track_audio_info( |
854 | 874 | return Err(Mp4parseStatus::Invalid); |
855 | 875 | } |
856 | 876 | Ok(_) => { |
857 | | - opus_header.insert((track_index, desc_i), v)?; |
| 877 | + opus_header.insert_cache_entry((track_index, desc_i), v)?; |
858 | 878 | if let Some(v) = opus_header.get(&(track_index, desc_i)) { |
859 | 879 | if v.len() > u32::MAX as usize { |
860 | 880 | return Err(Mp4parseStatus::Invalid); |
@@ -913,7 +933,7 @@ fn get_track_audio_info( |
913 | 933 |
|
914 | 934 | parser |
915 | 935 | .audio_track_sample_descriptions |
916 | | - .insert(track_index, audio_sample_infos)?; |
| 936 | + .insert_cache_entry(track_index, audio_sample_infos)?; |
917 | 937 | match parser.audio_track_sample_descriptions.get(&track_index) { |
918 | 938 | Some(sample_info) => { |
919 | 939 | if sample_info.len() > u32::MAX as usize { |
@@ -1105,7 +1125,7 @@ fn mp4parse_get_track_video_info_safe( |
1105 | 1125 |
|
1106 | 1126 | parser |
1107 | 1127 | .video_track_sample_descriptions |
1108 | | - .insert(track_index, video_sample_infos)?; |
| 1128 | + .insert_cache_entry(track_index, video_sample_infos)?; |
1109 | 1129 | match parser.video_track_sample_descriptions.get(&track_index) { |
1110 | 1130 | Some(sample_info) => { |
1111 | 1131 | if sample_info.len() > u32::MAX as usize { |
@@ -1481,7 +1501,7 @@ fn get_indice_table( |
1481 | 1501 |
|
1482 | 1502 | if let Some(v) = create_sample_table(track, offset_time) { |
1483 | 1503 | indices.set_indices(&v); |
1484 | | - sample_table_cache.insert(track_id, v)?; |
| 1504 | + sample_table_cache.insert_cache_entry(track_id, v)?; |
1485 | 1505 | return Ok(()); |
1486 | 1506 | } |
1487 | 1507 |
|
|
0 commit comments