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