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