]>
Commit | Line | Data |
---|---|---|
38953fb5 KS |
1 | use std::rc::Rc; |
2 | use std::cell::RefCell; | |
3 | use nihav_core::formats::*; | |
4 | use nihav_core::codecs::*; | |
3234da61 KS |
5 | |
6 | struct PCMDecoder { chmap: NAChannelMap } | |
7 | ||
8 | impl PCMDecoder { | |
9 | fn new() -> Self { | |
10 | PCMDecoder { chmap: NAChannelMap::new() } | |
11 | } | |
12 | } | |
13 | ||
14 | const CHMAP_MONO: [NAChannelType; 1] = [NAChannelType::C]; | |
15 | const CHMAP_STEREO: [NAChannelType; 2] = [NAChannelType::L, NAChannelType::R]; | |
16 | ||
17 | fn get_default_chmap(nch: u8) -> NAChannelMap { | |
18 | let mut chmap = NAChannelMap::new(); | |
19 | match nch { | |
20 | 1 => chmap.add_channels(&CHMAP_MONO), | |
21 | 2 => chmap.add_channels(&CHMAP_STEREO), | |
22 | _ => (), | |
23 | } | |
24 | chmap | |
25 | } | |
26 | ||
12ccce74 | 27 | fn get_duration(ainfo: &NAAudioInfo, duration: Option<u64>, data_size: usize) -> u64 { |
3234da61 | 28 | if duration == None { |
12ccce74 KS |
29 | let size_bits = (data_size as u64) * 8; |
30 | let blk_size = (ainfo.get_channels() as u64) * (ainfo.get_format().get_bits() as u64); | |
3234da61 KS |
31 | size_bits / blk_size |
32 | } else { | |
12ccce74 | 33 | duration.unwrap() as u64 |
3234da61 KS |
34 | } |
35 | } | |
36 | ||
37 | impl NADecoder for PCMDecoder { | |
38 | fn init(&mut self, info: Rc<NACodecInfo>) -> DecoderResult<()> { | |
39 | if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() { | |
3234da61 KS |
40 | self.chmap = get_default_chmap(ainfo.get_channels()); |
41 | if self.chmap.num_channels() == 0 { return Err(DecoderError::InvalidData); } | |
42 | Ok(()) | |
43 | } else { | |
44 | Err(DecoderError::InvalidData) | |
45 | } | |
46 | } | |
47 | fn decode(&mut self, pkt: &NAPacket) -> DecoderResult<NAFrameRef> { | |
48 | let info = pkt.get_stream().get_info(); | |
49 | if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() { | |
50 | let duration = get_duration(&ainfo, pkt.get_duration(), pkt.get_buffer().len()); | |
3234da61 KS |
51 | let pktbuf = pkt.get_buffer(); |
52 | let mut buf: Vec<u8> = Vec::with_capacity(pktbuf.len()); | |
53 | buf.clone_from(&pktbuf); | |
54 | let abuf = NAAudioBuffer::new_from_buf(ainfo, Rc::new(RefCell::new(buf)), self.chmap.clone()); | |
55 | let mut frm = NAFrame::new_from_pkt(pkt, info, NABufferType::AudioPacked(abuf)); | |
12ccce74 | 56 | frm.set_duration(Some(duration)); |
3234da61 KS |
57 | frm.set_keyframe(true); |
58 | Ok(Rc::new(RefCell::new(frm))) | |
59 | } else { | |
60 | Err(DecoderError::InvalidData) | |
61 | } | |
62 | } | |
63 | } | |
64 | ||
65 | pub fn get_decoder() -> Box<NADecoder> { | |
66 | Box::new(PCMDecoder::new()) | |
67 | } |