hevc_parser 0.6.0

HEVC format parser, incomplete
Documentation
use anyhow::Result;
use std::cmp::min;

use super::BsIoVecReader;

#[derive(Default, Debug, PartialEq, Clone, Eq)]
pub struct ScalingListData {
    scaling_list_pred_mode_flag: Vec<Vec<bool>>,
    scaling_list_pred_matrix_id_delta: Vec<Vec<u64>>,
    scaling_list_dc_coef_minus8: Vec<Vec<i64>>,
    scaling_list_delta_coef: Vec<Vec<Vec<i64>>>,
}

impl ScalingListData {
    pub fn parse(bs: &mut BsIoVecReader) -> Result<ScalingListData> {
        let mut scl = ScalingListData::default();

        scl.scaling_list_pred_mode_flag.resize(4, Vec::new());
        scl.scaling_list_pred_matrix_id_delta.resize(4, Vec::new());
        scl.scaling_list_dc_coef_minus8.resize(2, Vec::new());
        scl.scaling_list_delta_coef.resize(4, Vec::new());

        for size_id in 0..4 {
            let matrix_size = if size_id == 3 { 2 } else { 6 };

            scl.scaling_list_pred_mode_flag[size_id].resize(matrix_size, false);
            scl.scaling_list_pred_matrix_id_delta[size_id].resize(matrix_size, 0);
            scl.scaling_list_delta_coef[size_id].resize(matrix_size, Vec::new());

            if size_id >= 2 {
                scl.scaling_list_dc_coef_minus8[size_id - 2].resize(matrix_size, 0);
            }

            for matrix_id in 0..matrix_size {
                scl.scaling_list_pred_mode_flag[size_id][matrix_id] = bs.get()?;

                if !scl.scaling_list_pred_mode_flag[size_id][matrix_id] {
                    scl.scaling_list_pred_matrix_id_delta[size_id][matrix_id] = bs.get_ue()?;
                } else {
                    let _next_coef = 8;
                    let coef_num = min(64, 1 << (4 + (size_id << 1)));

                    if size_id > 1 {
                        scl.scaling_list_dc_coef_minus8[size_id - 2][matrix_id] = bs.get_se()?;
                    }

                    scl.scaling_list_delta_coef[size_id][matrix_id].resize(coef_num, 0);

                    for i in 0..coef_num {
                        scl.scaling_list_delta_coef[size_id][matrix_id][i] = bs.get_se()?;
                    }
                }
            }
        }

        Ok(scl)
    }
}