]> git.nihav.org Git - nihav.git/blobdiff - src/codecs/indeo/indeo5.rs
split NihAV into subcrates
[nihav.git] / src / codecs / indeo / indeo5.rs
diff --git a/src/codecs/indeo/indeo5.rs b/src/codecs/indeo/indeo5.rs
deleted file mode 100644 (file)
index c761a8e..0000000
+++ /dev/null
@@ -1,727 +0,0 @@
-use std::cell::Ref;
-use crate::io::bitreader::*;
-use crate::formats;
-use super::super::*;
-use super::ivi::*;
-use super::ivibr::*;
-
-fn calc_quant(glob_q: u32, qd: i16) -> usize {
-    let qq = (glob_q as i16) + (qd as i16);
-    if qq < 0 {
-        0
-    } else if qq > 23 {
-        23
-    } else {
-        qq as usize
-    }
-}
-
-struct Indeo5Parser {
-    mb_cb:          IVICodebook,
-
-    width:          usize,
-    height:         usize,
-    tile_w:         usize,
-    tile_h:         usize,
-    luma_bands:     usize,
-    chroma_bands:   usize,
-
-    is_hpel:        [bool; 5],
-    mb_size:        [usize; 5],
-    blk_size:       [usize; 5],
-}
-
-impl Indeo5Parser {
-    fn new() -> Self {
-        Indeo5Parser {
-            mb_cb:      IVI_CB_ZERO,
-
-            width:          0,
-            height:         0,
-            tile_w:         0,
-            tile_h:         0,
-            luma_bands:     0,
-            chroma_bands:   0,
-
-            is_hpel:    [false; 5],
-            mb_size:    [0; 5],
-            blk_size:   [0; 5],
-        }
-    }
-}
-
-fn skip_extension(br: &mut BitReader) -> DecoderResult<()> {
-    loop {
-        let len             = br.read(8)?;
-        if len == 0 { break; }
-        br.skip(len * 8)?;
-    }
-    Ok(())
-}
-
-impl IndeoXParser for Indeo5Parser {
-#[allow(unused_variables)]
-#[allow(unused_assignments)]
-    fn decode_picture_header(&mut self, br: &mut BitReader) -> DecoderResult<PictureHeader> {
-        let sync                = br.read(5)?;
-        validate!(sync == 0x1F);
-        let ftype_idx           = br.read(3)?;
-        validate!(ftype_idx < 5);
-        let ftype               = INDEO5_FRAME_TYPE[ftype_idx as usize];
-        let fnum                = br.read(8)?;
-        if ftype == IVIFrameType::Intra {
-            let gop_flags       = br.read(8)?;
-            let hdr_size;
-            if (gop_flags & 0x01) != 0 {
-                hdr_size        = br.read(16)?;
-            } else {
-                hdr_size = 0;
-            }
-            if (gop_flags & 0x20) != 0 {
-                br.skip(32)?; // lock word
-            }
-            self.tile_w = 0;
-            self.tile_h = 0;
-            if (gop_flags & 0x40) != 0 {
-                self.tile_w     = 64 << br.read(2)?;
-                self.tile_h = self.tile_w;
-            }
-            validate!(self.tile_w < 256);
-            self.luma_bands     = (br.read(2)? * 3 + 1) as usize;
-            self.chroma_bands   = (br.read(1)? * 3 + 1) as usize;
-            validate!((self.luma_bands == 4) || (self.luma_bands == 1));
-            validate!(self.chroma_bands == 1);
-            let pic_size_idx    = br.read(4)? as usize;
-            let w;
-            let h;
-            if pic_size_idx < 15 {
-                w = INDEO5_PICTURE_SIZE_TAB[pic_size_idx][0];
-                h = INDEO5_PICTURE_SIZE_TAB[pic_size_idx][1];
-            } else {
-                h               = br.read(13)? as usize;
-                w               = br.read(13)? as usize;
-            }
-            validate!((w != 0) && (h != 0));
-            self.width  = w;
-            self.height = h;
-
-            validate!((gop_flags & 0x02) == 0);
-            if self.tile_w == 0 {
-                self.tile_w = w;
-                self.tile_h = h;
-            }
-            for b in 0..self.luma_bands+self.chroma_bands {
-                self.is_hpel[b]     = br.read_bool()?;
-                let mb_scale        = br.read(1)?;
-                self.blk_size[b]    = 8 >> br.read(1)?;
-                self.mb_size[b]     = self.blk_size[b] << (1 - mb_scale);
-                let ext_tr          = br.read_bool()?;
-                validate!(!ext_tr);
-                let end_marker      = br.read(2)?;
-                validate!(end_marker == 0);
-            }
-            if (gop_flags & 0x08) != 0 {
-                let align       = br.read(3)?;
-                validate!(align == 0);
-                if br.read_bool()? {
-                    br.skip(24)?; // transparency color
-                }
-            }
-            br.align();
-            br.skip(23)?;
-            if br.read_bool()? { // gop extension
-                loop {
-                    let v       = br.read(16)?;
-                    if (v & 0x8000) == 0 { break; }
-                }
-            }
-            br.align();
-        }
-        if ftype.is_null() {
-            br.align();
-            return Ok(PictureHeader::new_null(ftype));
-        }
-        let flags               = br.read(8)?;
-        let size;
-        if (flags & 0x01) != 0 {
-            size                = br.read(24)?;
-        } else {
-            size = 0;
-        }
-        let checksum;
-        if (flags & 0x10) != 0 {
-            checksum            = br.read(16)?;
-        } else {
-            checksum = 0;
-        }
-        if (flags & 0x20) != 0 {
-            skip_extension(br)?;
-        }
-        let in_q = (flags & 0x08) != 0;
-        self.mb_cb              = br.read_ivi_codebook_desc(true, (flags & 0x40) != 0)?;
-        br.skip(3)?;
-        br.align();
-
-        Ok(PictureHeader::new(ftype, self.width, self.height, self.tile_w, self.tile_h, false, self.luma_bands, self.chroma_bands, in_q))
-    }
-
-#[allow(unused_variables)]
-    fn decode_band_header(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, plane_no: usize, band_no: usize) -> DecoderResult<BandHeader> {
-        let band_flags      = br.read(8)?;
-
-        if (band_flags & 0x01) != 0 {
-            br.align();
-            return Ok(BandHeader::new_empty(plane_no, band_no));
-        }
-        let inherit_mv = (band_flags & 0x02) != 0;
-        let has_qdelta = (band_flags & 0x04) != 0;
-        let inherit_qd = ((band_flags & 0x08) != 0) || !has_qdelta;
-        let data_size: usize;
-        if (band_flags & 0x80) != 0 {
-            data_size       = br.read(24)? as usize;
-        } else {
-            data_size = 0;
-        }
-        validate!(data_size <= ((br.left() / 8) as usize));
-
-        let num_corr: usize;
-        let mut corr_map: [u8; CORR_MAP_SIZE] = [0; CORR_MAP_SIZE];
-        if (band_flags & 0x10) != 0 {
-            num_corr = br.read(8)? as usize;
-            validate!(num_corr*2 <= CORR_MAP_SIZE);
-            for i in 0..num_corr*2 {
-                corr_map[i] = br.read(8)? as u8;
-            }
-        } else {
-            num_corr = 0;
-        }
-        let rvmap_idx;
-        if (band_flags & 0x40) != 0 {
-            rvmap_idx       = br.read(3)? as usize;
-        } else {
-            rvmap_idx = 8;
-        }
-        let blk_cb = br.read_ivi_codebook_desc(false, (band_flags & 0x80) != 0)?;
-        if br.read_bool()? {
-            br.skip(16)?; // checksum
-        }
-        let band_q          = br.read(5)?;
-        if (band_flags & 0x20) != 0 {
-            skip_extension(br)?;
-        }
-        br.align();
-
-        let tr;
-        let txtype;
-        let band_id = if plane_no == 0 { band_no } else { self.luma_bands };
-        match plane_no {
-            0 => {
-                    let scan = INDEO5_SCAN8X8[band_no];
-                    let qintra;
-                    let qinter;
-                    validate!(self.blk_size[band_id] == 8);
-                    match band_no {
-                        0 => {
-                                tr = IVITransformType::Slant(TSize::T8x8, TDir::TwoD);
-                                if self.luma_bands == 1 {
-                                    qintra = INDEO5_Q8_INTRA[0];
-                                    qinter = INDEO5_Q8_INTER[0];
-                                } else {
-                                    qintra = INDEO5_Q8_INTRA[1];
-                                    qinter = INDEO5_Q8_INTER[1];
-                                }
-                            },
-                        1 => {
-                                tr = IVITransformType::Slant(TSize::T8x8, TDir::Row);
-                                qintra = INDEO5_Q8_INTRA[2];
-                                qinter = INDEO5_Q8_INTER[2];
-                            },
-                        2 => {
-                                tr = IVITransformType::Slant(TSize::T8x8, TDir::Col);
-                                qintra = INDEO5_Q8_INTRA[3];
-                                qinter = INDEO5_Q8_INTER[3];
-                            },
-                        3 => {
-                                tr = IVITransformType::None(TSize::T8x8);
-                                qintra = INDEO5_Q8_INTRA[4];
-                                qinter = INDEO5_Q8_INTER[4];
-                            },
-                        _ => { unreachable!(); }
-                    };
-                    txtype = TxType::Transform8(TxParams8x8::new(qintra, qinter, scan));
-                },
-            1 | 2 => {
-                    validate!(self.blk_size[band_id] == 4);
-                    tr = IVITransformType::Slant(TSize::T4x4, TDir::TwoD);
-                    let scan = INDEO5_SCAN4X4;
-                    let qintra = INDEO5_Q4_INTRA;
-                    let qinter = INDEO5_Q4_INTER;
-                    txtype = TxType::Transform4(TxParams4x4::new(qintra, qinter, scan));
-                },
-            _ => { unreachable!(); }
-        };
-
-        Ok(BandHeader::new(plane_no, band_no, self.mb_size[band_id], self.blk_size[band_id], self.is_hpel[band_id], inherit_mv, has_qdelta, inherit_qd, band_q, rvmap_idx, num_corr, corr_map, blk_cb, tr, txtype))
-    }
-
-    fn decode_mb_info(&mut self, br: &mut BitReader, pic_hdr: &PictureHeader, band: &BandHeader, tile: &mut IVITile, ref_tile: Option<Ref<IVITile>>, mv_scale: u8) -> DecoderResult<()> {
-        let mut mv_x = 0;
-        let mut mv_y = 0;
-        let band_id = if pic_hdr.luma_bands == 4 { band.band_no + 1 } else { 0 };
-        let mut mb_idx = 0;
-        for mb_y in 0..tile.mb_h {
-            for mb_x in 0..tile.mb_w {
-                let mut mb = MB::new(tile.pos_x + mb_x * band.mb_size, tile.pos_y + mb_y * band.mb_size);
-                if !br.read_bool()? {
-                    if pic_hdr.ftype.is_intra() {
-                        mb.mtype = MBType::Intra;
-                    } else if band.inherit_mv {
-                        if let Some(ref tileref) = ref_tile {
-                            mb.mtype = tileref.mb[mb_idx].mtype;
-                        } else {
-                            return Err(DecoderError::MissingReference);
-                        }
-                    } else {
-                        mb.mtype = if br.read_bool()? { MBType::Inter } else { MBType::Intra };
-                    }
-                    if band.mb_size == band.blk_size {
-                        mb.cbp = br.read(1)? as u8;
-                    } else {
-                        mb.cbp = br.read(4)? as u8;
-                    }
-                    let q;
-                    if band.has_qdelta {
-                        if band.inherit_qd {
-                            if let Some(ref tileref) = ref_tile {
-                                mb.qd = tileref.mb[mb_idx].qd;
-                                q = calc_quant(band.quant, mb.qd);
-                            } else {
-                                return Err(DecoderError::MissingReference);
-                            }
-                        } else if (mb.cbp != 0) || ((band.plane_no == 0) && (band.band_no == 0) && pic_hdr.in_q) {
-                            mb.qd = br.read_ivi_cb_s(&self.mb_cb)? as i16;
-                            q = calc_quant(band.quant, mb.qd);
-                        } else {
-                            q = band.quant as usize;
-                        }
-                    } else {
-                        q = band.quant as usize;
-                    }
-
-                    if mb.mtype == MBType::Intra {
-                        if band.blk_size == 8 {
-                            mb.q = INDEO5_QSCALE8_INTRA[band_id][q];
-                        } else {
-                            mb.q = INDEO5_QSCALE4_INTRA[q];
-                        }
-                    } else {
-                        if band.blk_size == 8 {
-                            mb.q = INDEO5_QSCALE8_INTER[band_id][q];
-                        } else {
-                            mb.q = INDEO5_QSCALE4_INTER[q];
-                        }
-                    }
-
-                    if mb.mtype != MBType::Intra {
-                        if band.inherit_mv {
-                            if let Some(ref tileref) = ref_tile {
-                                let mx = tileref.mb[mb_idx].mv_x;
-                                let my = tileref.mb[mb_idx].mv_y;
-                                if mv_scale == 0 {
-                                    mb.mv_x = mx;
-                                    mb.mv_y = my;
-                                } else {
-                                    mb.mv_x = scale_mv(mx, mv_scale);
-                                    mb.mv_y = scale_mv(my, mv_scale);
-                                }
-                            }
-                        } else {
-                            mv_y += br.read_ivi_cb_s(&self.mb_cb)?;
-                            mv_x += br.read_ivi_cb_s(&self.mb_cb)?;
-                            mb.mv_x = mv_x;
-                            mb.mv_y = mv_y;
-                        }
-                    }
-                } else {
-                    validate!(!pic_hdr.ftype.is_intra());
-                    mb.mtype = MBType::Inter;
-                    mb.cbp   = 0;
-                    mb.qd    = 0;
-                    if (band.plane_no == 0) && (band.band_no == 0) && pic_hdr.in_q {
-                        mb.qd = br.read_ivi_cb_s(&self.mb_cb)? as i16;
-                        let q = calc_quant(band.quant, mb.qd);
-                        if mb.mtype == MBType::Intra {
-                            if band.blk_size == 8 {
-                                mb.q = INDEO5_QSCALE8_INTRA[band_id][q];
-                            } else {
-                                mb.q = INDEO5_QSCALE4_INTRA[q];
-                            }
-                        } else {
-                            if band.blk_size == 8 {
-                                mb.q = INDEO5_QSCALE8_INTER[band_id][q];
-                            } else {
-                                mb.q = INDEO5_QSCALE4_INTER[q];
-                            }
-                        }
-                    }
-                    if band.inherit_mv {
-                        if let Some(ref tileref) = ref_tile {
-                            let mx = tileref.mb[mb_idx].mv_x;
-                            let my = tileref.mb[mb_idx].mv_y;
-                            if mv_scale == 0 {
-                                mb.mv_x = mx;
-                                mb.mv_y = my;
-                            } else {
-                                mb.mv_x = scale_mv(mx, mv_scale);
-                                mb.mv_y = scale_mv(my, mv_scale);
-                            }
-                        }
-                    }
-                }
-                tile.mb[mb_idx] = mb;
-                mb_idx += 1;
-            }
-        }
-        br.align();
-        Ok(())
-    }
-
-    fn recombine_plane(&mut self, src: &[i16], sstride: usize, dst: &mut [u8], dstride: usize, w: usize, h: usize) {
-        let mut idx0 = 0;
-        let mut idx1 = w / 2;
-        let mut idx2 = (h / 2) * sstride;
-        let mut idx3 = idx2 + idx1;
-        let mut bidx1 = idx1;
-        let mut bidx3 = idx3;
-        let mut oidx0 = 0;
-        let mut oidx1 = dstride;
-        let filt_lo = |a: i16, b: i16| a + b;
-        let filt_hi = |a: i16, b: i16, c: i16| a - b * 6 + c;
-
-        for _ in 0..(h/2) {
-            let mut b0_1 = src[idx0];
-            let mut b0_2 = src[idx0 + sstride];
-            let mut b1_1 = src[bidx1];
-            let mut b1_2 = src[idx1];
-            let mut b1_3 = filt_hi(b1_1, b1_2, src[idx1 + sstride]);
-            let mut b2_1;
-            let mut b2_2 = src[idx2];
-            let mut b2_3 = b2_2;
-            let mut b2_4;
-            let mut b2_5 = src[idx2 + sstride];
-            let mut b2_6 = b2_5;
-            let mut b3_1;
-            let mut b3_2 = src[bidx3];
-            let mut b3_3 = b3_2;
-            let mut b3_4;
-            let mut b3_5 = src[idx3];
-            let mut b3_6 = b3_5;
-            let mut b3_8 = filt_hi(b3_2, b3_5, src[idx3 + sstride]);
-            let mut b3_9 = b3_8;
-            let mut b3_7;
-
-            for x in 0..(w/2) {
-                b2_1 = b2_2;
-                b2_2 = b2_3;
-                b2_4 = b2_5;
-                b2_5 = b2_6;
-                b3_1 = b3_2;
-                b3_2 = b3_3;
-                b3_4 = b3_5;
-                b3_5 = b3_6;
-                b3_7 = b3_8;
-                b3_8 = b3_9;
-
-                let tmp0 = b0_1;
-                let tmp1 = b0_2;
-                b0_1 = src[idx0 + x + 1];
-                b0_2 = src[idx0 + x + 1 + sstride];
-                let mut p0 =  tmp0                       << 4;
-                let mut p1 = (tmp0 + b0_1)               << 3;
-                let mut p2 = (tmp0 + tmp1)               << 3;
-                let mut p3 = (tmp0 + tmp1 + b0_1 + b0_2) << 2;
-
-                let tmp0 = b1_1;
-                let tmp1 = b1_2;
-                let tmp2 = filt_lo(tmp0, tmp1);
-                let tmp3 = filt_hi(tmp0, tmp1, b1_3);
-                b1_2 = src[ idx1 + x + 1];
-                b1_1 = src[bidx1 + x + 1];
-                b1_3 = filt_hi(b1_1, b1_2, src[idx1 + x + 1 + sstride]);
-                p0 +=  tmp2                << 3;
-                p1 += (tmp2 + b1_1 + b1_2) << 2;
-                p2 +=  tmp3                << 2;
-                p3 += (tmp3 + b1_3)        << 1;
-
-                b2_3 = src[idx2 + x + 1];
-                b2_6 = src[idx2 + x + 1 + sstride];
-                let tmp0 = filt_lo(b2_1, b2_2);
-                let tmp1 = filt_hi(b2_1, b2_2, b2_3);
-                p0 +=  tmp0                              << 3;
-                p1 +=  tmp1                              << 2;
-                p2 += (tmp0 + filt_lo(b2_4, b2_5))       << 2;
-                p3 += (tmp1 + filt_hi(b2_4, b2_5, b2_6)) << 1;
-
-                b3_6 = src[idx3 + x + 1];
-                b3_3 = src[bidx3 + x + 1];
-                b3_9 = filt_hi(b3_3, b3_6, src[idx3 + x + 1 + sstride]);
-                let tmp0 = b3_1 + b3_4;
-                let tmp1 = b3_2 + b3_5;
-                let tmp2 = b3_3 + b3_6;
-                p0 += filt_lo(tmp0, tmp1)       << 2;
-                p1 += filt_hi(tmp0, tmp1, tmp2) << 1;
-                p2 += filt_lo(b3_7, b3_8)       << 1;
-                p3 += filt_hi(b3_7, b3_8, b3_9) << 0;
-
-                dst[oidx0 + x * 2 + 0] = clip8((p0 >> 6) + 128);
-                dst[oidx0 + x * 2 + 1] = clip8((p1 >> 6) + 128);
-                dst[oidx1 + x * 2 + 0] = clip8((p2 >> 6) + 128);
-                dst[oidx1 + x * 2 + 1] = clip8((p3 >> 6) + 128);
-            }
-            bidx1 = idx1;
-            bidx3 = idx3;
-            idx0 += sstride;
-            idx1 += sstride;
-            idx2 += sstride;
-            idx3 += sstride;
-            oidx0 += dstride * 2;
-            oidx1 += dstride * 2;
-        }
-    }
-}
-
-struct Indeo5Decoder {
-    info:   Rc<NACodecInfo>,
-    dec:    IVIDecoder,
-    ip:     Indeo5Parser,
-}
-
-impl Indeo5Decoder {
-    fn new() -> Self {
-        Indeo5Decoder {
-            info:   NACodecInfo::new_dummy(),
-            dec:    IVIDecoder::new(),
-            ip:     Indeo5Parser::new(),
-        }
-    }
-}
-
-impl NADecoder for Indeo5Decoder {
-    fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
-        if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
-            let w = vinfo.get_width();
-            let h = vinfo.get_height();
-            let f = vinfo.is_flipped();
-            let fmt = formats::YUV410_FORMAT;
-            let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, f, fmt));
-            self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()));
-            Ok(())
-        } else {
-            Err(DecoderError::InvalidData)
-        }
-    }
-    fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
-        let src = pkt.get_buffer();
-        let mut br = BitReader::new(src.as_slice(), src.len(), BitReaderMode::LE);
-
-        let bufinfo = self.dec.decode_frame(&mut self.ip, &mut br)?;
-        let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
-        frm.set_keyframe(self.dec.is_intra());
-        frm.set_frame_type(self.dec.get_frame_type());
-        Ok(Rc::new(RefCell::new(frm)))
-    }
-}
-
-const INDEO5_PICTURE_SIZE_TAB: [[usize; 2]; 15] = [
-    [640, 480], [320, 240], [160, 120], [704, 480], [352, 240], [352, 288], [176, 144],
-    [240, 180], [640, 240], [704, 240], [80, 60], [88, 72], [0, 0], [0, 0], [0, 0]
-];
-
-const INDEO5_FRAME_TYPE: [IVIFrameType; 5] = [
-    IVIFrameType::Intra, IVIFrameType::Inter, IVIFrameType::InterScal,
-    IVIFrameType::InterDroppable, IVIFrameType::NULL,
-];
-
-const INDEO5_QUANT8X8_INTRA: [[u16; 64]; 5] = [
-  [
-    0x1a, 0x2e, 0x36, 0x42, 0x46, 0x4a, 0x4e, 0x5a,
-    0x2e, 0x32, 0x3e, 0x42, 0x46, 0x4e, 0x56, 0x6a,
-    0x36, 0x3e, 0x3e, 0x44, 0x4a, 0x54, 0x66, 0x72,
-    0x42, 0x42, 0x44, 0x4a, 0x52, 0x62, 0x6c, 0x7a,
-    0x46, 0x46, 0x4a, 0x52, 0x5e, 0x66, 0x72, 0x8e,
-    0x4a, 0x4e, 0x54, 0x62, 0x66, 0x6e, 0x86, 0xa6,
-    0x4e, 0x56, 0x66, 0x6c, 0x72, 0x86, 0x9a, 0xca,
-    0x5a, 0x6a, 0x72, 0x7a, 0x8e, 0xa6, 0xca, 0xfe,
-  ], [
-    0x26, 0x3a, 0x3e, 0x46, 0x4a, 0x4e, 0x52, 0x5a,
-    0x3a, 0x3e, 0x42, 0x46, 0x4a, 0x4e, 0x56, 0x5e,
-    0x3e, 0x42, 0x46, 0x48, 0x4c, 0x52, 0x5a, 0x62,
-    0x46, 0x46, 0x48, 0x4a, 0x4e, 0x56, 0x5e, 0x66,
-    0x4a, 0x4a, 0x4c, 0x4e, 0x52, 0x5a, 0x62, 0x6a,
-    0x4e, 0x4e, 0x52, 0x56, 0x5a, 0x5e, 0x66, 0x6e,
-    0x52, 0x56, 0x5a, 0x5e, 0x62, 0x66, 0x6a, 0x72,
-    0x5a, 0x5e, 0x62, 0x66, 0x6a, 0x6e, 0x72, 0x76,
-  ], [
-    0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
-    0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
-    0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
-    0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
-    0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
-    0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
-    0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
-    0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
-  ], [
-    0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e,
-    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-    0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,
-    0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4,
-    0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde,
-    0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2,
-    0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6,
-    0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2,
-  ], [
-    0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
-    0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
-    0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
-    0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
-    0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
-    0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
-    0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
-    0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
-  ]
-];
-const INDEO5_QUANT8X8_INTER: [[u16; 64]; 5] = [
-  [
-    0x26, 0x3a, 0x3e, 0x46, 0x4a, 0x4e, 0x52, 0x5a,
-    0x3a, 0x3e, 0x42, 0x46, 0x4a, 0x4e, 0x56, 0x5e,
-    0x3e, 0x42, 0x46, 0x48, 0x4c, 0x52, 0x5a, 0x62,
-    0x46, 0x46, 0x48, 0x4a, 0x4e, 0x56, 0x5e, 0x66,
-    0x4a, 0x4a, 0x4c, 0x4e, 0x52, 0x5a, 0x62, 0x6a,
-    0x4e, 0x4e, 0x52, 0x56, 0x5a, 0x5e, 0x66, 0x6e,
-    0x52, 0x56, 0x5a, 0x5e, 0x62, 0x66, 0x6a, 0x72,
-    0x5a, 0x5e, 0x62, 0x66, 0x6a, 0x6e, 0x72, 0x76,
-  ], [
-    0x26, 0x3a, 0x3e, 0x46, 0x4a, 0x4e, 0x52, 0x5a,
-    0x3a, 0x3e, 0x42, 0x46, 0x4a, 0x4e, 0x56, 0x5e,
-    0x3e, 0x42, 0x46, 0x48, 0x4c, 0x52, 0x5a, 0x62,
-    0x46, 0x46, 0x48, 0x4a, 0x4e, 0x56, 0x5e, 0x66,
-    0x4a, 0x4a, 0x4c, 0x4e, 0x52, 0x5a, 0x62, 0x6a,
-    0x4e, 0x4e, 0x52, 0x56, 0x5a, 0x5e, 0x66, 0x6e,
-    0x52, 0x56, 0x5a, 0x5e, 0x62, 0x66, 0x6a, 0x72,
-    0x5a, 0x5e, 0x62, 0x66, 0x6a, 0x6e, 0x72, 0x76,
-  ], [
-    0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
-    0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
-    0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
-    0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
-    0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
-    0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
-    0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
-    0x4e, 0xaa, 0xf2, 0xd4, 0xde, 0xc2, 0xd6, 0xc2,
-  ], [
-    0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e,
-    0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
-    0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,
-    0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4, 0xd4,
-    0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde, 0xde,
-    0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2,
-    0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6, 0xd6,
-    0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2, 0xc2,
-  ], [
-    0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
-    0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
-    0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
-    0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
-    0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
-    0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
-    0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
-    0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e, 0x5e,
-  ]
-];
-const INDEO5_QUANT4X4_INTRA: [u16; 16] = [
-    0x1e, 0x3e, 0x4a, 0x52,
-    0x3e, 0x4a, 0x52, 0x5e,
-    0x4a, 0x52, 0x5e, 0x7a,
-    0x52, 0x5e, 0x7a, 0x92
-];
-const INDEO5_QUANT4X4_INTER: [u16; 16] = [
-    0x1e, 0x3e, 0x4a, 0x52,
-    0x3e, 0x4a, 0x52, 0x56,
-    0x4a, 0x52, 0x56, 0x5e,
-    0x52, 0x56, 0x5e, 0x66
-];
-const INDEO5_Q8_INTRA: [&[u16; 64]; 5] = [
-    &INDEO5_QUANT8X8_INTRA[0], &INDEO5_QUANT8X8_INTRA[1], &INDEO5_QUANT8X8_INTRA[2],
-    &INDEO5_QUANT8X8_INTRA[3], &INDEO5_QUANT8X8_INTRA[4],
-];
-const INDEO5_Q8_INTER: [&[u16; 64]; 5] = [
-    &INDEO5_QUANT8X8_INTER[0], &INDEO5_QUANT8X8_INTER[1], &INDEO5_QUANT8X8_INTER[2],
-    &INDEO5_QUANT8X8_INTER[3], &INDEO5_QUANT8X8_INTER[4],
-];
-const INDEO5_Q4_INTRA: &[u16; 16] = &INDEO5_QUANT4X4_INTRA;
-const INDEO5_Q4_INTER: &[u16; 16] = &INDEO5_QUANT4X4_INTER;
-
-const INDEO5_SCAN8X8: [&[usize; 64]; 4] = [
-    &IVI_ZIGZAG, &IVI_SCAN_8X8_VER, &IVI_SCAN_8X8_HOR, &IVI_SCAN_8X8_HOR
-];
-const INDEO5_SCAN4X4: &[usize; 16] = &IVI_SCAN_4X4;
-
-const INDEO5_QSCALE8_INTRA: [[u8; 24]; 5] = [
-  [
-    0x0b, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x17, 0x18, 0x1a, 0x1c, 0x1e, 0x20,
-    0x22, 0x24, 0x27, 0x28, 0x2a, 0x2d, 0x2f, 0x31, 0x34, 0x37, 0x39, 0x3c,
-  ], [
-    0x01, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1b, 0x1e, 0x22, 0x25, 0x28, 0x2c,
-    0x30, 0x34, 0x38, 0x3d, 0x42, 0x47, 0x4c, 0x52, 0x58, 0x5e, 0x65, 0x6c,
-  ], [
-    0x13, 0x22, 0x27, 0x2a, 0x2d, 0x33, 0x36, 0x3c, 0x41, 0x45, 0x49, 0x4e,
-    0x53, 0x58, 0x5d, 0x63, 0x69, 0x6f, 0x75, 0x7c, 0x82, 0x88, 0x8e, 0x95,
-  ], [
-    0x13, 0x1f, 0x21, 0x24, 0x27, 0x29, 0x2d, 0x2f, 0x34, 0x37, 0x3a, 0x3d,
-    0x40, 0x44, 0x48, 0x4c, 0x4f, 0x52, 0x56, 0x5a, 0x5e, 0x62, 0x66, 0x6b,
-  ], [
-    0x31, 0x42, 0x47, 0x47, 0x4d, 0x52, 0x58, 0x58, 0x5d, 0x63, 0x67, 0x6b,
-    0x6f, 0x73, 0x78, 0x7c, 0x80, 0x84, 0x89, 0x8e, 0x93, 0x98, 0x9d, 0xa4,
-  ]
-];
-const INDEO5_QSCALE8_INTER: [[u8; 24]; 5] = [
-  [
-    0x0b, 0x11, 0x13, 0x14, 0x15, 0x16, 0x18, 0x1a, 0x1b, 0x1d, 0x20, 0x22,
-    0x23, 0x25, 0x28, 0x2a, 0x2e, 0x32, 0x35, 0x39, 0x3d, 0x41, 0x44, 0x4a,
-  ], [
-    0x07, 0x14, 0x16, 0x18, 0x1b, 0x1e, 0x22, 0x25, 0x29, 0x2d, 0x31, 0x35,
-    0x3a, 0x3f, 0x44, 0x4a, 0x50, 0x56, 0x5c, 0x63, 0x6a, 0x71, 0x78, 0x7e,
-  ], [
-    0x15, 0x25, 0x28, 0x2d, 0x30, 0x34, 0x3a, 0x3d, 0x42, 0x48, 0x4c, 0x51,
-    0x56, 0x5b, 0x60, 0x65, 0x6b, 0x70, 0x76, 0x7c, 0x82, 0x88, 0x8f, 0x97,
-  ], [
-    0x13, 0x1f, 0x20, 0x22, 0x25, 0x28, 0x2b, 0x2d, 0x30, 0x33, 0x36, 0x39,
-    0x3c, 0x3f, 0x42, 0x45, 0x48, 0x4b, 0x4e, 0x52, 0x56, 0x5a, 0x5e, 0x62,
-  ], [
-    0x3c, 0x52, 0x58, 0x5d, 0x63, 0x68, 0x68, 0x6d, 0x73, 0x78, 0x7c, 0x80,
-    0x84, 0x89, 0x8e, 0x93, 0x98, 0x9d, 0xa3, 0xa9, 0xad, 0xb1, 0xb5, 0xba
-  ]
-];
-const INDEO5_QSCALE4_INTRA: [u8; 24] = [
-    0x01, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x13, 0x14,
-    0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20
-];
-const INDEO5_QSCALE4_INTER: [u8; 24] = [
-    0x0b, 0x0d, 0x0d, 0x0e, 0x11, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23
-];
-
-pub fn get_decoder() -> Box<NADecoder> {
-    Box::new(Indeo5Decoder::new())
-}
-
-#[cfg(test)]
-mod test {
-    use crate::test::dec_video::test_file_decoding;
-    #[test]
-    fn test_indeo5() {
-         test_file_decoding("avi", "assets/IV5/sample.avi", /*None*/Some(2), true, false, None);
-//         test_file_decoding("avi", "assets/IV5/W32mdl_1.avi", None/*Some(2)*/, true, false, Some("iv5"));
-//panic!("the end");
-    }
-}