+mod osd;
+use osd::*;
+
+#[repr(u8)]
+#[derive(Clone,Copy,Debug,PartialEq)]
+enum DecodingState {
+ Normal,
+ Waiting,
+ Flush,
+ Prefetch,
+ Error,
+ End,
+}
+
+impl Default for DecodingState {
+ fn default() -> Self { DecodingState::Normal }
+}
+
+impl From<u8> for DecodingState {
+ fn from(val: u8) -> Self {
+ match val {
+ 0 => DecodingState::Normal,
+ 1 => DecodingState::Waiting,
+ 2 => DecodingState::Flush,
+ 3 => DecodingState::Prefetch,
+ 4 => DecodingState::End,
+ _ => DecodingState::Error,
+ }
+ }
+}
+
+struct DecoderState {
+ state: AtomicU8
+}
+
+impl DecoderState {
+ const fn new() -> Self {
+ Self {
+ state: AtomicU8::new(DecodingState::Normal as u8)
+ }
+ }
+ fn set_state(&self, state: DecodingState) {
+ self.state.store(state as u8, Ordering::Release);
+ }
+ fn get_state(&self) -> DecodingState {
+ self.state.load(Ordering::Acquire).into()
+ }
+ fn is_flushing(&self) -> bool {
+ matches!(self.get_state(), DecodingState::Flush | DecodingState::Error)
+ }
+}