fix the rest of tests
[nihav.git] / nihav-realmedia / src / codecs / rv10.rs
CommitLineData
5641dccf
KS
1use std::rc::Rc;
2use std::cell::RefCell;
3use nihav_core::io::bitreader::*;
4use nihav_core::io::codebook::*;
5use nihav_core::formats;
6use nihav_core::frame::*;
7use nihav_core::codecs::*;
8use nihav_core::codecs::h263::*;
9use nihav_core::codecs::h263::code::H263BlockDSP;
10use nihav_core::codecs::h263::decoder::*;
11use nihav_core::codecs::h263::data::*;
be91b1c3
KS
12
13#[allow(dead_code)]
14struct Tables {
15 intra_mcbpc_cb: Codebook<u8>,
16 inter_mcbpc_cb: Codebook<u8>,
17 cbpy_cb: Codebook<u8>,
18 rl_cb: Codebook<H263RLSym>,
19 aic_rl_cb: Codebook<H263RLSym>,
20 mv_cb: Codebook<u8>,
21 luma_dc_cb: Codebook<u8>,
22 chroma_dc_cb: Codebook<u8>,
23}
24
25struct RealVideo10Decoder {
26 info: Rc<NACodecInfo>,
27 dec: H263BaseDecoder,
28 tables: Tables,
29 w: usize,
30 h: usize,
31 new_ver: bool,
2a2aa421 32 bdsp: H263BlockDSP,
b20ff290 33 mvmode: MVMode,
be91b1c3
KS
34}
35
36struct RealVideo10BR<'a> {
37 br: BitReader<'a>,
38 tables: &'a Tables,
39 num_slices: usize,
40 slice_no: usize,
41 slice_off: Vec<u32>,
42 w: usize,
43 h: usize,
44 mb_w: usize,
45 mb_h: usize,
be91b1c3
KS
46 new_ver: bool,
47 dc_coded: [bool; 3],
48 last_dc: [i16; 3],
b20ff290 49 mvmode: MVMode,
be91b1c3
KS
50}
51
52struct RV10SliceInfo {
53 is_p: bool,
54 qscale: u8,
55 mb_x: usize,
56 mb_y: usize,
57 mb_c: usize,
58}
59
60impl RV10SliceInfo {
61 fn new(is_p: bool, qscale: u8, mb_x: usize, mb_y: usize, mb_c: usize) -> Self {
62 RV10SliceInfo { is_p: is_p, qscale: qscale, mb_x: mb_x, mb_y: mb_y, mb_c: mb_c }
63 }
64}
65
66impl<'a> RealVideo10BR<'a> {
b20ff290 67 fn new(src: &'a [u8], tables: &'a Tables, width: usize, height: usize, new_ver: bool, mvmode: MVMode) -> Self {
be91b1c3
KS
68 let nslices = (src[0] as usize) + 1;
69 let mut slice_offs = Vec::with_capacity(nslices);
70 {
71 let offs = &src[1..][..nslices * 8];
72 let mut br = BitReader::new(offs, offs.len(), BitReaderMode::BE);
73 for _ in 0..nslices {
74 br.skip(32).unwrap();
75 let off = br.read(32).unwrap();
76 slice_offs.push(off);
77 }
78 }
79 let soff = nslices * 8 + 1;
80 RealVideo10BR {
81 br: BitReader::new(&src[soff..], src.len() - soff, BitReaderMode::BE),
82 tables: tables,
83 num_slices: nslices,
84 slice_no: 0,
85 slice_off: slice_offs,
86 w: width,
87 h: height,
88 mb_w: (width + 15) >> 4,
89 mb_h: (height + 15) >> 4,
be91b1c3
KS
90 new_ver: new_ver,
91 dc_coded: [false; 3],
92 last_dc: [0; 3],
b20ff290 93 mvmode: mvmode,
be91b1c3
KS
94 }
95 }
96
2a2aa421
KS
97#[allow(unused_variables)]
98 fn decode_block(&mut self, sstate: &SliceState, quant: u8, intra: bool, coded: bool, blk: &mut [i16; 64], plane_no: usize) -> DecoderResult<()> {
9037cf6b 99 let br = &mut self.br;
be91b1c3
KS
100 let mut idx = 0;
101 if intra {
102 let mut dc;
2a2aa421 103 if !self.new_ver || !sstate.is_iframe {
be91b1c3
KS
104 dc = br.read(8)? as i16;
105 if dc == 255 { dc = 128; }
106 } else {
107 if self.dc_coded[plane_no] {
108 let diff;
109 let bits = br.peek(14);
110 let ret = if plane_no == 0 {
111 br.read_cb(&self.tables.luma_dc_cb)
112 } else {
113 br.read_cb(&self.tables.chroma_dc_cb)
114 };
115 if ret.is_err() {
116 println!("Illegal {} code {:X}", if plane_no==0{"luma"}else{"chroma"},bits);
117 }
118 let val = ret.unwrap() as i16;
119
120 if val != 0 {
121 diff = val - 128;
122 } else {
be91b1c3
KS
123 let code = br.read(2)?;
124 match code {
125 0x0 => { diff = ((br.read(7)? + 1) as i8) as i16; },
126 0x1 => { diff = (br.read(7)? as i16) - 128; },
127 0x2 => {
128 if plane_no == 0 {
129 if br.read_bool()? {
130 diff = ((br.read(8)? + 1) as i8) as i16;
131 } else {
132 diff = (br.read(8)? as i8) as i16;
133 }
134 } else {
135 br.skip(9)?;
136 diff = 1;
137 }
138 },
139 _ => {
140 if plane_no == 0 {
141 br.skip(4)?;
142 diff = 1;
143 } else {
be91b1c3
KS
144 return Err(DecoderError::InvalidData);
145 }
146 },
147 };
be91b1c3
KS
148 }
149 dc = (self.last_dc[plane_no] - diff) & 0xFF;
150 self.last_dc[plane_no] = dc;
151 } else {
152 self.dc_coded[plane_no] = true;
153 dc = self.last_dc[plane_no];
154 }
155 }
be91b1c3
KS
156 blk[0] = dc << 3;
157 idx = 1;
158 }
159 if !coded { return Ok(()); }
160
161 let rl_cb = &self.tables.rl_cb; // could be aic too
162 let q_add = if quant == 0 { 0i16 } else { ((quant - 1) | 1) as i16 };
163 let q = (quant * 2) as i16;
164 while idx < 64 {
165 let code = br.read_cb(rl_cb)?;
166 let run;
167 let mut level;
168 let last;
169 if !code.is_escape() {
170 run = code.get_run();
171 level = code.get_level();
172 last = code.is_last();
173 if br.read_bool()? { level = -level; }
174 level = (level * q) + q_add;
175 } else {
176 last = br.read_bool()?;
177 run = br.read(6)? as u8;
178 level = br.read_s(8)? as i16;
179 if level == -128 {
180 let low = br.read(5)? as i16;
181 let top = br.read_s(6)? as i16;
182 level = (top << 5) | low;
183 }
184 level = (level * q) + q_add;
185 if level < -2048 { level = -2048; }
186 if level > 2047 { level = 2047; }
187 }
188 idx += run;
189 validate!(idx < 64);
190 let oidx = H263_ZIGZAG[idx as usize];
191 blk[oidx] = level;
192 idx += 1;
193 if last { break; }
194 }
195 Ok(())
196 }
197}
198
199fn decode_mv_component(br: &mut BitReader, mv_cb: &Codebook<u8>) -> DecoderResult<i16> {
200 let code = br.read_cb(mv_cb)? as i16;
201 if code == 0 { return Ok(0) }
202 if !br.read_bool()? {
203 Ok(code)
204 } else {
205 Ok(-code)
206 }
207}
208
209fn decode_mv(br: &mut BitReader, mv_cb: &Codebook<u8>) -> DecoderResult<MV> {
210 let xval = decode_mv_component(br, mv_cb)?;
211 let yval = decode_mv_component(br, mv_cb)?;
be91b1c3
KS
212 Ok(MV::new(xval, yval))
213}
214
215impl<'a> BlockDecoder for RealVideo10BR<'a> {
216
217#[allow(unused_variables)]
218 fn decode_pichdr(&mut self) -> DecoderResult<PicInfo> {
219 self.slice_no = 0;
be91b1c3 220 let shdr = self.read_slice_header()?;
be91b1c3
KS
221 validate!((shdr.mb_x == 0) && (shdr.mb_y == 0));
222
2a2aa421 223 let mb_end = shdr.mb_x + shdr.mb_y * self.mb_w + shdr.mb_c;
be91b1c3
KS
224
225 let ftype = if !shdr.is_p { Type::I } else { Type::P };
b20ff290 226 let picinfo = PicInfo::new(self.w, self.h, ftype, self.mvmode, false, false, shdr.qscale, 0, None, None);
be91b1c3
KS
227 Ok(picinfo)
228 }
229
230 #[allow(unused_variables)]
2a2aa421 231 fn decode_slice_header(&mut self, info: &PicInfo) -> DecoderResult<SliceInfo> {
be91b1c3 232 let shdr = self.read_slice_header()?;
be91b1c3 233 self.slice_no += 1;
2a2aa421
KS
234 let mb_end = shdr.mb_x + shdr.mb_y * self.mb_w + shdr.mb_c;
235 let ret = SliceInfo::new(shdr.mb_x, shdr.mb_y, mb_end, shdr.qscale);
be91b1c3
KS
236
237 Ok(ret)
238 }
239
b20ff290 240 fn decode_block_header(&mut self, info: &PicInfo, slice: &SliceInfo, _sstate: &SliceState) -> DecoderResult<BlockInfo> {
9037cf6b 241 let br = &mut self.br;
be91b1c3
KS
242 let mut q = slice.get_quant();
243 match info.get_mode() {
244 Type::I => {
245 let mut cbpc = br.read_cb(&self.tables.intra_mcbpc_cb)?;
246 while cbpc == 8 { cbpc = br.read_cb(&self.tables.intra_mcbpc_cb)?; }
247 let cbpy = br.read_cb(&self.tables.cbpy_cb)?;
248 let cbp = (cbpy << 2) | (cbpc & 3);
249 let dquant = (cbpc & 4) != 0;
250 if dquant {
251 let idx = br.read(2)? as usize;
252 q = ((q as i16) + (H263_DQUANT_TAB[idx] as i16)) as u8;
253 }
be91b1c3
KS
254 Ok(BlockInfo::new(Type::I, cbp, q))
255 },
256 Type::P => {
257 if br.read_bool()? {
be91b1c3
KS
258 return Ok(BlockInfo::new(Type::Skip, 0, info.get_quant()));
259 }
260 let mut cbpc = br.read_cb(&self.tables.inter_mcbpc_cb)?;
261 while cbpc == 20 { cbpc = br.read_cb(&self.tables.inter_mcbpc_cb)?; }
262 let is_intra = (cbpc & 0x04) != 0;
263 let dquant = (cbpc & 0x08) != 0;
264 let is_4x4 = (cbpc & 0x10) != 0;
265 if is_intra {
266 let cbpy = br.read_cb(&self.tables.cbpy_cb)?;
267 let cbp = (cbpy << 2) | (cbpc & 3);
268 if dquant {
269 let idx = br.read(2)? as usize;
270 q = ((q as i16) + (H263_DQUANT_TAB[idx] as i16)) as u8;
271 }
272 let binfo = BlockInfo::new(Type::I, cbp, q);
be91b1c3
KS
273 return Ok(binfo);
274 }
275
276 let mut cbpy = br.read_cb(&self.tables.cbpy_cb)?;
277// if /* !aiv && */(cbpc & 3) != 3 {
278 cbpy ^= 0xF;
279// }
280 let cbp = (cbpy << 2) | (cbpc & 3);
281 if dquant {
282 let idx = br.read(2)? as usize;
283 q = ((q as i16) + (H263_DQUANT_TAB[idx] as i16)) as u8;
284 }
be91b1c3
KS
285 let mut binfo = BlockInfo::new(Type::P, cbp, q);
286 if !is_4x4 {
287 let mvec: [MV; 1] = [decode_mv(br, &self.tables.mv_cb)?];
288 binfo.set_mv(&mvec);
289 } else {
290 let mvec: [MV; 4] = [
291 decode_mv(br, &self.tables.mv_cb)?,
292 decode_mv(br, &self.tables.mv_cb)?,
293 decode_mv(br, &self.tables.mv_cb)?,
294 decode_mv(br, &self.tables.mv_cb)?
295 ];
296 binfo.set_mv(&mvec);
297 }
be91b1c3
KS
298 Ok(binfo)
299 },
300 _ => { println!("wrong info mode"); Err(DecoderError::InvalidData) },
301 }
302 }
303
304 #[allow(unused_variables)]
2a2aa421
KS
305 fn decode_block_intra(&mut self, info: &BlockInfo, sstate: &SliceState, quant: u8, no: usize, coded: bool, blk: &mut [i16; 64]) -> DecoderResult<()> {
306 self.decode_block(sstate, quant, true, coded, blk, if no < 4 { 0 } else { no - 3 })
be91b1c3
KS
307 }
308
309 #[allow(unused_variables)]
2a2aa421
KS
310 fn decode_block_inter(&mut self, info: &BlockInfo, sstate: &SliceState, quant: u8, no: usize, coded: bool, blk: &mut [i16; 64]) -> DecoderResult<()> {
311 self.decode_block(sstate, quant, false, coded, blk, if no < 4 { 0 } else { no - 3 })
be91b1c3
KS
312 }
313
2a2aa421 314 fn is_slice_end(&mut self) -> bool { false }
be91b1c3
KS
315}
316
317impl<'a> RealVideo10BR<'a> {
318 fn read_slice_header(&mut self) -> DecoderResult<RV10SliceInfo> {
319 validate!(self.slice_no < self.num_slices);
320
9037cf6b 321 let br = &mut self.br;
be91b1c3 322 br.seek(self.slice_off[self.slice_no] * 8)?;
be91b1c3
KS
323
324 let marker = br.read(1)?;
325 validate!(marker == 1);
326 let is_p = br.read_bool()?;
327 let pb_frame = br.read_bool()?;
328 validate!(!pb_frame);
329 let qscale = br.read(5)? as u8;
330 validate!(qscale > 0);
331
332 if !is_p && self.new_ver {
333 self.last_dc[0] = br.read(8)? as i16;
334 self.last_dc[1] = br.read(8)? as i16;
335 self.last_dc[2] = br.read(8)? as i16;
336 } else {
337 self.last_dc[0] = 0;
338 self.last_dc[1] = 0;
339 self.last_dc[2] = 0;
340 }
341 self.dc_coded[0] = false;
342 self.dc_coded[1] = false;
343 self.dc_coded[2] = false;
344
345 let mb_x;
346 let mb_y;
347 let mb_count;
2a2aa421 348 if (br.peek(12) == 0) || (self.slice_no > 0) {
be91b1c3
KS
349 mb_x = br.read(6)? as usize;
350 mb_y = br.read(6)? as usize;
351 mb_count = br.read(12)? as usize;
352 } else {
2a2aa421
KS
353 mb_x = 0;
354 mb_y = 0;
355 mb_count = self.mb_w * self.mb_h;
be91b1c3
KS
356 }
357 br.skip(3)?;
be91b1c3
KS
358 validate!(mb_x + mb_y * self.mb_w + mb_count <= self.mb_w * self.mb_h);
359
360 Ok(RV10SliceInfo::new(is_p, qscale, mb_x, mb_y, mb_count))
361 }
362}
363
be91b1c3
KS
364impl RealVideo10Decoder {
365 fn new() -> Self {
366 let mut coderead = H263ShortCodeReader::new(H263_INTRA_MCBPC);
367 let intra_mcbpc_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
368 let mut coderead = H263ShortCodeReader::new(H263_INTER_MCBPC);
369 let inter_mcbpc_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
370 let mut coderead = H263ShortCodeReader::new(H263_CBPY);
371 let cbpy_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
372 let mut coderead = H263RLCodeReader::new(H263_RL_CODES);
373 let rl_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
374 let mut coderead = H263RLCodeReader::new(H263_RL_CODES_AIC);
375 let aic_rl_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
376 let mut coderead = H263ShortCodeReader::new(H263_MV);
377 let mv_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
378 let mut coderead = CodeReader::new(RV10_LUMA_DC_CODES, RV10_LUMA_DC_BITS);
379 let luma_dc_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
380 let mut coderead = CodeReader::new(RV10_CHROMA_DC_CODES, RV10_CHROMA_DC_BITS);
381 let chroma_dc_cb = Codebook::new(&mut coderead, CodebookMode::MSB).unwrap();
1a151e53 382
be91b1c3
KS
383 let tables = Tables {
384 intra_mcbpc_cb: intra_mcbpc_cb,
385 inter_mcbpc_cb: inter_mcbpc_cb,
386 cbpy_cb: cbpy_cb,
387 rl_cb: rl_cb,
388 aic_rl_cb: aic_rl_cb,
389 mv_cb: mv_cb,
390 luma_dc_cb: luma_dc_cb,
391 chroma_dc_cb: chroma_dc_cb,
392 };
393
394 RealVideo10Decoder{
395 info: Rc::new(DUMMY_CODEC_INFO),
b20ff290 396 dec: H263BaseDecoder::new_with_opts(false, false, false),
be91b1c3
KS
397 tables: tables,
398 w: 0,
399 h: 0,
400 new_ver: false,
2a2aa421 401 bdsp: H263BlockDSP::new(),
b20ff290 402 mvmode: MVMode::Long,
be91b1c3
KS
403 }
404 }
405}
406
407impl NADecoder for RealVideo10Decoder {
408 fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> {
409 if let NACodecTypeInfo::Video(vinfo) = info.get_properties() {
410 let w = vinfo.get_width();
411 let h = vinfo.get_height();
412 let fmt = formats::YUV420_FORMAT;
413 let myinfo = NACodecTypeInfo::Video(NAVideoInfo::new(w, h, false, fmt));
414 self.info = Rc::new(NACodecInfo::new_ref(info.get_name(), myinfo, info.get_extradata()));
415 self.w = w;
416 self.h = h;
417
418 let edata = info.get_extradata().unwrap();
419 let src: &[u8] = &edata;
420 let ver = ((src[4] as u32) << 12) | ((src[5] as u32) << 4) | ((src[6] as u32) >> 4);
421 let maj_ver = ver >> 16;
422 let mic_ver = ver & 0xFF;
423println!("ver {:06X} -> {}", ver, mic_ver);
424 validate!(maj_ver == 1);
425 self.new_ver = mic_ver > 1;
b20ff290
KS
426 if (src[3] & 1) != 0 {
427 self.mvmode = MVMode::UMV;
428 }
be91b1c3
KS
429{
430let mut br = BitReader::new(src, src.len(), BitReaderMode::BE);
431println!("edata:");
432println!("{:08X}", br.read(32).unwrap());
433println!("{:08X}", br.read(32).unwrap());
434}
435 Ok(())
436 } else {
437println!("???");
438 Err(DecoderError::InvalidData)
439 }
440 }
441 fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> {
442 let src = pkt.get_buffer();
443
b20ff290
KS
444//println!(" decode frame size {}, {} slices", src.len(), src[0]+1);
445 let mut ibr = RealVideo10BR::new(&src, &self.tables, self.w, self.h, self.new_ver, self.mvmode);
be91b1c3 446
2a2aa421 447 let bufinfo = self.dec.parse_frame(&mut ibr, &self.bdsp)?;
be91b1c3
KS
448
449 let mut frm = NAFrame::new_from_pkt(pkt, self.info.clone(), bufinfo);
450 frm.set_keyframe(self.dec.is_intra());
451 frm.set_frame_type(if self.dec.is_intra() { FrameType::I } else { FrameType::P });
452 Ok(Rc::new(RefCell::new(frm)))
453 }
454}
455
456
457pub fn get_decoder() -> Box<NADecoder> {
458 Box::new(RealVideo10Decoder::new())
459}
460
461#[cfg(test)]
462mod test {
3167c45c
KS
463 use nihav_core::codecs::RegisteredDecoders;
464 use nihav_core::demuxers::RegisteredDemuxers;
465 use nihav_core::test::dec_video::*;
466 use crate::codecs::realmedia_register_all_codecs;
467 use crate::demuxers::realmedia_register_all_demuxers;
be91b1c3
KS
468 #[test]
469 fn test_rv10() {
3167c45c
KS
470 let mut dmx_reg = RegisteredDemuxers::new();
471 realmedia_register_all_demuxers(&mut dmx_reg);
472 let mut dec_reg = RegisteredDecoders::new();
473 realmedia_register_all_codecs(&mut dec_reg);
474
475 test_file_decoding("realmedia", "assets/RV/rv10_dnet_640x352_realvideo_encoder_4.0.rm", Some(1000), true, false, None/*Some("rv10")*/, &dmx_reg, &dec_reg);
be91b1c3
KS
476 }
477}
478
479pub struct CodeReader { codes: &'static [u16], bits: &'static [u8] }
480
481impl CodeReader {
482 pub fn new(codes: &'static [u16], bits: &'static [u8]) -> Self {
483 CodeReader { codes: codes, bits: bits }
484 }
485}
486
487impl CodebookDescReader<u8> for CodeReader {
488 fn bits(&mut self, idx: usize) -> u8 { self.bits[idx] }
489 fn code(&mut self, idx: usize) -> u32 { self.codes[idx] as u32 }
490 fn sym (&mut self, idx: usize) -> u8 { idx as u8 }
491 fn len(&mut self) -> usize { self.bits.len() }
492}
493
494const RV10_LUMA_DC_CODES: &[u16] = &[
495 0x001f, 0x0f00, 0x0f01, 0x0f02, 0x0f03, 0x0f04, 0x0f05, 0x0f06,
496 0x0f07, 0x0f08, 0x0f09, 0x0f0a, 0x0f0b, 0x0f0c, 0x0f0d, 0x0f0e,
497 0x0f0f, 0x0f10, 0x0f11, 0x0f12, 0x0f13, 0x0f14, 0x0f15, 0x0f16,
498 0x0f17, 0x0f18, 0x0f19, 0x0f1a, 0x0f1b, 0x0f1c, 0x0f1d, 0x0f1e,
499 0x0f1f, 0x0f20, 0x0f21, 0x0f22, 0x0f23, 0x0f24, 0x0f25, 0x0f26,
500 0x0f27, 0x0f28, 0x0f29, 0x0f2a, 0x0f2b, 0x0f2c, 0x0f2d, 0x0f2e,
501 0x0f2f, 0x0f30, 0x0f31, 0x0f32, 0x0f33, 0x0f34, 0x0f35, 0x0f36,
502 0x0f37, 0x0f38, 0x0f39, 0x0f3a, 0x0f3b, 0x0f3c, 0x0f3d, 0x0f3e,
503 0x0f3f, 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0386,
504 0x0387, 0x0388, 0x0389, 0x038a, 0x038b, 0x038c, 0x038d, 0x038e,
505 0x038f, 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396,
506 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e,
507 0x039f, 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6,
508 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce,
509 0x00cf, 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056,
510 0x0057, 0x0020, 0x0021, 0x0022, 0x0023, 0x000c, 0x000d, 0x0004,
511 0x0000, 0x0005, 0x000e, 0x000f, 0x0024, 0x0025, 0x0026, 0x0027,
512 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
513 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
514 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
515 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7,
516 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af,
517 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7,
518 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf,
519 0x0f40, 0x0f41, 0x0f42, 0x0f43, 0x0f44, 0x0f45, 0x0f46, 0x0f47,
520 0x0f48, 0x0f49, 0x0f4a, 0x0f4b, 0x0f4c, 0x0f4d, 0x0f4e, 0x0f4f,
521 0x0f50, 0x0f51, 0x0f52, 0x0f53, 0x0f54, 0x0f55, 0x0f56, 0x0f57,
522 0x0f58, 0x0f59, 0x0f5a, 0x0f5b, 0x0f5c, 0x0f5d, 0x0f5e, 0x0f5f,
523 0x0f60, 0x0f61, 0x0f62, 0x0f63, 0x0f64, 0x0f65, 0x0f66, 0x0f67,
524 0x0f68, 0x0f69, 0x0f6a, 0x0f6b, 0x0f6c, 0x0f6d, 0x0f6e, 0x0f6f,
525 0x0f70, 0x0f71, 0x0f72, 0x0f73, 0x0f74, 0x0f75, 0x0f76, 0x0f77,
526 0x0f78, 0x0f79, 0x0f7a, 0x0f7b, 0x0f7c, 0x0f7d, 0x0f7e, 0x0f7f,
527];
528
529const RV10_LUMA_DC_BITS: &[u8] = &[
530 5, 12, 12, 12, 12, 12, 12, 12,
531 12, 12, 12, 12, 12, 12, 12, 12,
532 12, 12, 12, 12, 12, 12, 12, 12,
533 12, 12, 12, 12, 12, 12, 12, 12,
534 12, 12, 12, 12, 12, 12, 12, 12,
535 12, 12, 12, 12, 12, 12, 12, 12,
536 12, 12, 12, 12, 12, 12, 12, 12,
537 12, 12, 12, 12, 12, 12, 12, 12,
538 12, 10, 10, 10, 10, 10, 10, 10,
539 10, 10, 10, 10, 10, 10, 10, 10,
540 10, 10, 10, 10, 10, 10, 10, 10,
541 10, 10, 10, 10, 10, 10, 10, 10,
542 10, 8, 8, 8, 8, 8, 8, 8,
543 8, 8, 8, 8, 8, 8, 8, 8,
544 8, 7, 7, 7, 7, 7, 7, 7,
545 7, 6, 6, 6, 6, 5, 5, 4,
546 2, 4, 5, 5, 6, 6, 6, 6,
547 7, 7, 7, 7, 7, 7, 7, 7,
548 8, 8, 8, 8, 8, 8, 8, 8,
549 8, 8, 8, 8, 8, 8, 8, 8,
550 10, 10, 10, 10, 10, 10, 10, 10,
551 10, 10, 10, 10, 10, 10, 10, 10,
552 10, 10, 10, 10, 10, 10, 10, 10,
553 10, 10, 10, 10, 10, 10, 10, 10,
554 12, 12, 12, 12, 12, 12, 12, 12,
555 12, 12, 12, 12, 12, 12, 12, 12,
556 12, 12, 12, 12, 12, 12, 12, 12,
557 12, 12, 12, 12, 12, 12, 12, 12,
558 12, 12, 12, 12, 12, 12, 12, 12,
559 12, 12, 12, 12, 12, 12, 12, 12,
560 12, 12, 12, 12, 12, 12, 12, 12,
561 12, 12, 12, 12, 12, 12, 12, 12,
562];
563
564const RV10_CHROMA_DC_CODES: &[u16] = &[
565 0x003f, 0x3f00, 0x3f01, 0x3f02, 0x3f03, 0x3f04, 0x3f05, 0x3f06,
566 0x3f07, 0x3f08, 0x3f09, 0x3f0a, 0x3f0b, 0x3f0c, 0x3f0d, 0x3f0e,
567 0x3f0f, 0x3f10, 0x3f11, 0x3f12, 0x3f13, 0x3f14, 0x3f15, 0x3f16,
568 0x3f17, 0x3f18, 0x3f19, 0x3f1a, 0x3f1b, 0x3f1c, 0x3f1d, 0x3f1e,
569 0x3f1f, 0x3f20, 0x3f21, 0x3f22, 0x3f23, 0x3f24, 0x3f25, 0x3f26,
570 0x3f27, 0x3f28, 0x3f29, 0x3f2a, 0x3f2b, 0x3f2c, 0x3f2d, 0x3f2e,
571 0x3f2f, 0x3f30, 0x3f31, 0x3f32, 0x3f33, 0x3f34, 0x3f35, 0x3f36,
572 0x3f37, 0x3f38, 0x3f39, 0x3f3a, 0x3f3b, 0x3f3c, 0x3f3d, 0x3f3e,
573 0x3f3f, 0x0f80, 0x0f81, 0x0f82, 0x0f83, 0x0f84, 0x0f85, 0x0f86,
574 0x0f87, 0x0f88, 0x0f89, 0x0f8a, 0x0f8b, 0x0f8c, 0x0f8d, 0x0f8e,
575 0x0f8f, 0x0f90, 0x0f91, 0x0f92, 0x0f93, 0x0f94, 0x0f95, 0x0f96,
576 0x0f97, 0x0f98, 0x0f99, 0x0f9a, 0x0f9b, 0x0f9c, 0x0f9d, 0x0f9e,
577 0x0f9f, 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6,
578 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce,
579 0x03cf, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6,
580 0x00e7, 0x0030, 0x0031, 0x0032, 0x0033, 0x0008, 0x0009, 0x0002,
581 0x0000, 0x0003, 0x000a, 0x000b, 0x0034, 0x0035, 0x0036, 0x0037,
582 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
583 0x03d0, 0x03d1, 0x03d2, 0x03d3, 0x03d4, 0x03d5, 0x03d6, 0x03d7,
584 0x03d8, 0x03d9, 0x03da, 0x03db, 0x03dc, 0x03dd, 0x03de, 0x03df,
585 0x0fa0, 0x0fa1, 0x0fa2, 0x0fa3, 0x0fa4, 0x0fa5, 0x0fa6, 0x0fa7,
586 0x0fa8, 0x0fa9, 0x0faa, 0x0fab, 0x0fac, 0x0fad, 0x0fae, 0x0faf,
587 0x0fb0, 0x0fb1, 0x0fb2, 0x0fb3, 0x0fb4, 0x0fb5, 0x0fb6, 0x0fb7,
588 0x0fb8, 0x0fb9, 0x0fba, 0x0fbb, 0x0fbc, 0x0fbd, 0x0fbe, 0x0fbf,
589 0x3f40, 0x3f41, 0x3f42, 0x3f43, 0x3f44, 0x3f45, 0x3f46, 0x3f47,
590 0x3f48, 0x3f49, 0x3f4a, 0x3f4b, 0x3f4c, 0x3f4d, 0x3f4e, 0x3f4f,
591 0x3f50, 0x3f51, 0x3f52, 0x3f53, 0x3f54, 0x3f55, 0x3f56, 0x3f57,
592 0x3f58, 0x3f59, 0x3f5a, 0x3f5b, 0x3f5c, 0x3f5d, 0x3f5e, 0x3f5f,
593 0x3f60, 0x3f61, 0x3f62, 0x3f63, 0x3f64, 0x3f65, 0x3f66, 0x3f67,
594 0x3f68, 0x3f69, 0x3f6a, 0x3f6b, 0x3f6c, 0x3f6d, 0x3f6e, 0x3f6f,
595 0x3f70, 0x3f71, 0x3f72, 0x3f73, 0x3f74, 0x3f75, 0x3f76, 0x3f77,
596 0x3f78, 0x3f79, 0x3f7a, 0x3f7b, 0x3f7c, 0x3f7d, 0x3f7e, 0x3f7f,
597];
598
599const RV10_CHROMA_DC_BITS: &[u8] = &[
600 7, 14, 14, 14, 14, 14, 14, 14,
601 14, 14, 14, 14, 14, 14, 14, 14,
602 14, 14, 14, 14, 14, 14, 14, 14,
603 14, 14, 14, 14, 14, 14, 14, 14,
604 14, 14, 14, 14, 14, 14, 14, 14,
605 14, 14, 14, 14, 14, 14, 14, 14,
606 14, 14, 14, 14, 14, 14, 14, 14,
607 14, 14, 14, 14, 14, 14, 14, 14,
608 14, 12, 12, 12, 12, 12, 12, 12,
609 12, 12, 12, 12, 12, 12, 12, 12,
610 12, 12, 12, 12, 12, 12, 12, 12,
611 12, 12, 12, 12, 12, 12, 12, 12,
612 12, 10, 10, 10, 10, 10, 10, 10,
613 10, 10, 10, 10, 10, 10, 10, 10,
614 10, 8, 8, 8, 8, 8, 8, 8,
615 8, 6, 6, 6, 6, 4, 4, 3,
616 2, 3, 4, 4, 6, 6, 6, 6,
617 8, 8, 8, 8, 8, 8, 8, 8,
618 10, 10, 10, 10, 10, 10, 10, 10,
619 10, 10, 10, 10, 10, 10, 10, 10,
620 12, 12, 12, 12, 12, 12, 12, 12,
621 12, 12, 12, 12, 12, 12, 12, 12,
622 12, 12, 12, 12, 12, 12, 12, 12,
623 12, 12, 12, 12, 12, 12, 12, 12,
624 14, 14, 14, 14, 14, 14, 14, 14,
625 14, 14, 14, 14, 14, 14, 14, 14,
626 14, 14, 14, 14, 14, 14, 14, 14,
627 14, 14, 14, 14, 14, 14, 14, 14,
628 14, 14, 14, 14, 14, 14, 14, 14,
629 14, 14, 14, 14, 14, 14, 14, 14,
630 14, 14, 14, 14, 14, 14, 14, 14,
631 14, 14, 14, 14, 14, 14, 14, 14,
632];