blob: 37d09d88be6ed8136d0e06e8146f2cadef35cb37 [file] [log] [blame]
use avm_stats::Frame;
use egui::{RichText, Ui};
use egui_extras::{Column, TableBuilder};
use crate::{app_state::AppState, stream::CurrentFrame};
use crate::views::render_view::RenderView;
// TODO(comc): PSNR, SSIM stats if available.
pub struct FrameInfoViewer;
impl FrameInfoViewer {
fn frame_info(frame: &Frame) -> Option<Vec<(String, String)>> {
let mut info = Vec::new();
let params = frame.frame_params.as_ref()?;
info.push(("Stream".into(), frame.stream_params.as_ref()?.stream_name.to_string()));
info.push(("Width".into(), format!("{}", params.width)));
info.push(("Height".into(), format!("{}", params.height)));
info.push(("Frame Type".into(), frame.frame_type_name()));
info.push(("TIP mode".into(), frame.tip_mode_name()));
info.push(("Decode Index".into(), params.decode_index.to_string()));
info.push(("Display Index".into(), params.display_index.to_string()));
if let Some(superblock_size) = params.superblock_size.as_ref() {
info.push((
"Superblock size".into(),
format!("{}x{}", superblock_size.width, superblock_size.height),
));
}
// TODO(comc): Check why this is false for inter frames.
// info.push(("Show frame".into(), params.show_frame.to_string()));
info.push(("Base QIndex".into(), params.base_qindex.to_string()));
info.push(("Bit depth".into(), params.bit_depth.to_string()));
Some(info)
}
}
impl RenderView for FrameInfoViewer {
fn title(&self) -> String {
"Frame Info".into()
}
fn render(&self, ui: &mut Ui, state: &mut AppState) -> anyhow::Result<()> {
let Some(frame) = state.stream.current_frame() else {
return Ok(());
};
let Some(frame_info) = Self::frame_info(frame) else {
return Ok(());
};
TableBuilder::new(ui)
.column(Column::initial(300.0).resizable(true))
.column(Column::remainder())
.striped(true)
.header(20.0, |mut header| {
header.col(|ui| {
ui.label(RichText::new("Property").strong());
});
header.col(|ui| {
ui.label(RichText::new("Value").strong());
});
})
.body(|mut body| {
for (info_name, info_value) in frame_info {
body.row(20.0, |mut row| {
row.col(|col| {
col.label(info_name);
});
row.col(|col| {
col.label(info_value);
});
});
}
});
Ok(())
}
}