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