diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2014-10-06 15:16:26 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2014-10-06 15:16:26 +0000 |
| commit | e9df66f160846240caae085c631db1f42a08136c (patch) | |
| tree | 436f7e8e0f22429441ac8d310314740c30b8a91c /src/plugins/Input/opus/decoder_opus.cpp | |
| parent | 1fa50a73bfa7f915076bf52d913c9a4851efc64c (diff) | |
| download | qmmp-e9df66f160846240caae085c631db1f42a08136c.tar.gz qmmp-e9df66f160846240caae085c631db1f42a08136c.tar.bz2 qmmp-e9df66f160846240caae085c631db1f42a08136c.zip | |
opus: added multichannel support
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@4544 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Input/opus/decoder_opus.cpp')
| -rw-r--r-- | src/plugins/Input/opus/decoder_opus.cpp | 83 |
1 files changed, 79 insertions, 4 deletions
diff --git a/src/plugins/Input/opus/decoder_opus.cpp b/src/plugins/Input/opus/decoder_opus.cpp index 47da8b4e6..e6c6a7733 100644 --- a/src/plugins/Input/opus/decoder_opus.cpp +++ b/src/plugins/Input/opus/decoder_opus.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2013 by Ilya Kotov * + * Copyright (C) 2013-2014 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * @@ -123,10 +123,21 @@ bool DecoderOpus::initialize() m_totalTime = 0; const OpusHead *head = op_head(m_opusfile, -1); - if (head) - m_chan = head->channel_count; + if (!head) + { + qWarning("DecoderOpus: unable to read header"); + return false; + } - configure(48000, m_chan, Qmmp::PCM_S16LE); //opus codec supports 48 kHz only + m_chan = head->channel_count; + + ChannelMap chmap = findChannelMap(m_chan); + if(chmap.isEmpty()) + { + qWarning("DecoderOpus: unsupported number of channels: %d", m_chan); + return false; + } + configure(48000, chmap, Qmmp::PCM_S16LE); //opus codec supports 48 kHz only return true; } @@ -154,3 +165,67 @@ qint64 DecoderOpus::read(char *data, qint64 maxSize) m_bitrate = op_bitrate_instant(m_opusfile) / 1000; return samples * m_chan * 2; } + +//https://tools.ietf.org/id/draft-ietf-codec-oggopus-04.txt +ChannelMap DecoderOpus::findChannelMap(int channels) +{ + ChannelMap map; + switch (channels) + { + case 1: + map << Qmmp::CHAN_FRONT_LEFT; + break; + case 2: + map << Qmmp::CHAN_FRONT_LEFT + << Qmmp::CHAN_FRONT_RIGHT; + break; + case 3: + map << Qmmp::CHAN_FRONT_LEFT + << Qmmp::CHAN_FRONT_CENTER + << Qmmp::CHAN_FRONT_RIGHT; + break; + case 4: + map << Qmmp::CHAN_FRONT_LEFT + << Qmmp::CHAN_FRONT_RIGHT + << Qmmp::CHAN_REAR_LEFT + << Qmmp::CHAN_REAR_RIGHT; + break; + case 5: + map << Qmmp::CHAN_FRONT_LEFT + << Qmmp::CHAN_FRONT_CENTER + << Qmmp::CHAN_FRONT_RIGHT + << Qmmp::CHAN_REAR_LEFT + << Qmmp::CHAN_REAR_RIGHT; + break; + case 6: + map << Qmmp::CHAN_FRONT_LEFT + << Qmmp::CHAN_FRONT_CENTER + << Qmmp::CHAN_FRONT_RIGHT + << Qmmp::CHAN_REAR_LEFT + << Qmmp::CHAN_REAR_RIGHT + << Qmmp::CHAN_LFE; + break; + case 7: + map << Qmmp::CHAN_FRONT_LEFT + << Qmmp::CHAN_FRONT_CENTER + << Qmmp::CHAN_FRONT_RIGHT + << Qmmp::CHAN_SIDE_LEFT + << Qmmp::CHAN_SIDE_RIGHT + << Qmmp::CHAN_REAR_CENTER + << Qmmp::CHAN_LFE; + break; + case 8: + map << Qmmp::CHAN_FRONT_LEFT + << Qmmp::CHAN_FRONT_CENTER + << Qmmp::CHAN_FRONT_RIGHT + << Qmmp::CHAN_SIDE_LEFT + << Qmmp::CHAN_SIDE_RIGHT + << Qmmp::CHAN_REAR_LEFT + << Qmmp::CHAN_REAR_RIGHT + << Qmmp::CHAN_LFE; + break; + default: + ; + } + return map; +} |
