set extension channel config to stereo if PS is present

This commit is contained in:
Martchus 2015-09-24 01:15:27 +02:00
parent faa40944bf
commit 7ae0aee4f7
4 changed files with 40 additions and 5 deletions

View File

@ -50,6 +50,7 @@ AbstractTrack::AbstractTrack(istream &inputStream, ostream &outputStream, uint64
m_bytesPerSecond(0), m_bytesPerSecond(0),
m_channelCount(0), m_channelCount(0),
m_channelConfig(0), m_channelConfig(0),
m_extensionChannelConfig(0),
m_sampleCount(0), m_sampleCount(0),
m_quality(0), m_quality(0),
m_depth(0), m_depth(0),
@ -119,6 +120,27 @@ const char *AbstractTrack::channelConfigString() const
} }
} }
/*!
* \brief Returns the extension channel configuration if available; otherwise returns nullptr.
*/
byte AbstractTrack::extensionChannelConfig() const
{
return m_extensionChannelConfig;
}
/*!
* \brief Returns a string with the extension channel configuration if available; otherwise returns nullptr.
*/
const char *AbstractTrack::extensionChannelConfigString() const
{
switch(m_format.general) {
case GeneralMediaFormat::Aac:
return m_extensionChannelConfig ? Mpeg4ChannelConfigs::channelConfigString(m_extensionChannelConfig) : nullptr;
default:
return nullptr;
}
}
/*! /*!
* \brief Returns a label for the track. * \brief Returns a label for the track.
*/ */

View File

@ -75,6 +75,8 @@ public:
uint16 channelCount() const; uint16 channelCount() const;
byte channelConfig() const; byte channelConfig() const;
const char *channelConfigString() const; const char *channelConfigString() const;
byte extensionChannelConfig() const;
const char *extensionChannelConfigString() const;
uint64 sampleCount() const; uint64 sampleCount() const;
int quality() const; int quality() const;
const Size &pixelSize() const; const Size &pixelSize() const;
@ -129,6 +131,7 @@ protected:
uint32 m_bytesPerSecond; uint32 m_bytesPerSecond;
uint16 m_channelCount; uint16 m_channelCount;
byte m_channelConfig; byte m_channelConfig;
byte m_extensionChannelConfig;
uint16 m_chunkSize; uint16 m_chunkSize;
uint64 m_sampleCount; uint64 m_sampleCount;
int m_quality; int m_quality;

View File

@ -406,6 +406,7 @@ void MatroskaTrack::internalParseHeader()
addNotification(NotificationType::Warning, "Audio specific config has invalid extension sample frequency index.", context); addNotification(NotificationType::Warning, "Audio specific config has invalid extension sample frequency index.", context);
} }
m_channelConfig = audioSpecificConfig->channelConfiguration; m_channelConfig = audioSpecificConfig->channelConfiguration;
m_extensionChannelConfig = audioSpecificConfig->extensionChannelConfiguration;
} }
break; break;
default: default:

View File

@ -614,6 +614,7 @@ unique_ptr<Mpeg4AudioSpecificConfig> Mp4Track::parseAudioSpecificConfig(StatusPr
switch(audioCfg->extensionAudioObjectType) { switch(audioCfg->extensionAudioObjectType) {
case Ps: case Ps:
audioCfg->psPresent = true; audioCfg->psPresent = true;
audioCfg->extensionChannelConfiguration = Mpeg4ChannelConfigs::FrontLeftFrontRight;
break; break;
} }
// read GA specific config // read GA specific config
@ -622,10 +623,10 @@ unique_ptr<Mpeg4AudioSpecificConfig> Mp4Track::parseAudioSpecificConfig(StatusPr
case TwinVq: case ErAacLc: case ErAacLtp: case ErAacScalable: case TwinVq: case ErAacLc: case ErAacLtp: case ErAacScalable:
case ErTwinVq: case ErBsac: case ErAacLd: case ErTwinVq: case ErBsac: case ErAacLd:
audioCfg->frameLengthFlag = bitReader.readBits<byte>(1); audioCfg->frameLengthFlag = bitReader.readBits<byte>(1);
if((audioCfg->dependsOnCoreCoder = bitReader.readBits<byte>(1))) { if((audioCfg->dependsOnCoreCoder = bitReader.readBit())) {
audioCfg->coreCoderDelay = bitReader.readBits<byte>(14); audioCfg->coreCoderDelay = bitReader.readBits<byte>(14);
} }
audioCfg->extensionFlag = bitReader.readBits<byte>(1); audioCfg->extensionFlag = bitReader.readBit();
if(audioCfg->channelConfiguration == 0) { if(audioCfg->channelConfiguration == 0) {
throw NotImplementedException(); // TODO: parse program_config_element throw NotImplementedException(); // TODO: parse program_config_element
} }
@ -648,7 +649,7 @@ unique_ptr<Mpeg4AudioSpecificConfig> Mp4Track::parseAudioSpecificConfig(StatusPr
default: default:
; ;
} }
if(bitReader.readBits<byte>(1) == 1) { // extension flag 3 if(bitReader.readBit() == 1) { // extension flag 3
throw NotImplementedException(); // TODO throw NotImplementedException(); // TODO
} }
} }
@ -676,7 +677,7 @@ unique_ptr<Mpeg4AudioSpecificConfig> Mp4Track::parseAudioSpecificConfig(StatusPr
uint16 syncExtensionType = bitReader.readBits<uint16>(11); uint16 syncExtensionType = bitReader.readBits<uint16>(11);
if(syncExtensionType == 0x2B7) { if(syncExtensionType == 0x2B7) {
if((audioCfg->extensionAudioObjectType = getAudioObjectType()) == Sbr) { if((audioCfg->extensionAudioObjectType = getAudioObjectType()) == Sbr) {
if((audioCfg->sbrPresent = bitReader.readBits<byte>(1))) { if((audioCfg->sbrPresent = bitReader.readBit())) {
if((audioCfg->extensionSampleFrequencyIndex = bitReader.readBits<byte>(4)) == 0xF) { if((audioCfg->extensionSampleFrequencyIndex = bitReader.readBits<byte>(4)) == 0xF) {
audioCfg->extensionSampleFrequency = bitReader.readBits<uint32>(24); audioCfg->extensionSampleFrequency = bitReader.readBits<uint32>(24);
} }
@ -686,9 +687,16 @@ unique_ptr<Mpeg4AudioSpecificConfig> Mp4Track::parseAudioSpecificConfig(StatusPr
} }
} }
} }
} else if(audioCfg->extensionAudioObjectType == ErBsac) {
if((audioCfg->sbrPresent = bitReader.readBit())) {
if((audioCfg->extensionSampleFrequencyIndex = bitReader.readBits<byte>(4)) == 0xF) {
audioCfg->extensionSampleFrequency = bitReader.readBits<uint32>(24);
}
}
audioCfg->extensionChannelConfiguration = bitReader.readBits<byte>(4);
} }
} else if (syncExtensionType == 0x548) { } else if (syncExtensionType == 0x548) {
audioCfg->psPresent = bitReader.readBits<byte>(1); audioCfg->psPresent = bitReader.readBit();
} }
} }
} catch(ios_base::failure &) { } catch(ios_base::failure &) {
@ -1367,6 +1375,7 @@ void Mp4Track::internalParseHeader()
addNotification(NotificationType::Warning, "Audio specific config has invalid extension sample frequency index.", context); addNotification(NotificationType::Warning, "Audio specific config has invalid extension sample frequency index.", context);
} }
m_channelConfig = m_esInfo->audioSpecificConfig->channelConfiguration; m_channelConfig = m_esInfo->audioSpecificConfig->channelConfiguration;
m_extensionChannelConfig = m_esInfo->audioSpecificConfig->extensionChannelConfiguration;
} }
if(m_esInfo->videoSpecificConfig) { if(m_esInfo->videoSpecificConfig) {
// check the video specific config for useful information // check the video specific config for useful information