set extension channel config to stereo if PS is present
This commit is contained in:
parent
faa40944bf
commit
7ae0aee4f7
|
@ -50,6 +50,7 @@ AbstractTrack::AbstractTrack(istream &inputStream, ostream &outputStream, uint64
|
|||
m_bytesPerSecond(0),
|
||||
m_channelCount(0),
|
||||
m_channelConfig(0),
|
||||
m_extensionChannelConfig(0),
|
||||
m_sampleCount(0),
|
||||
m_quality(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.
|
||||
*/
|
||||
|
|
|
@ -75,6 +75,8 @@ public:
|
|||
uint16 channelCount() const;
|
||||
byte channelConfig() const;
|
||||
const char *channelConfigString() const;
|
||||
byte extensionChannelConfig() const;
|
||||
const char *extensionChannelConfigString() const;
|
||||
uint64 sampleCount() const;
|
||||
int quality() const;
|
||||
const Size &pixelSize() const;
|
||||
|
@ -129,6 +131,7 @@ protected:
|
|||
uint32 m_bytesPerSecond;
|
||||
uint16 m_channelCount;
|
||||
byte m_channelConfig;
|
||||
byte m_extensionChannelConfig;
|
||||
uint16 m_chunkSize;
|
||||
uint64 m_sampleCount;
|
||||
int m_quality;
|
||||
|
|
|
@ -406,6 +406,7 @@ void MatroskaTrack::internalParseHeader()
|
|||
addNotification(NotificationType::Warning, "Audio specific config has invalid extension sample frequency index.", context);
|
||||
}
|
||||
m_channelConfig = audioSpecificConfig->channelConfiguration;
|
||||
m_extensionChannelConfig = audioSpecificConfig->extensionChannelConfiguration;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -614,6 +614,7 @@ unique_ptr<Mpeg4AudioSpecificConfig> Mp4Track::parseAudioSpecificConfig(StatusPr
|
|||
switch(audioCfg->extensionAudioObjectType) {
|
||||
case Ps:
|
||||
audioCfg->psPresent = true;
|
||||
audioCfg->extensionChannelConfiguration = Mpeg4ChannelConfigs::FrontLeftFrontRight;
|
||||
break;
|
||||
}
|
||||
// read GA specific config
|
||||
|
@ -622,10 +623,10 @@ unique_ptr<Mpeg4AudioSpecificConfig> Mp4Track::parseAudioSpecificConfig(StatusPr
|
|||
case TwinVq: case ErAacLc: case ErAacLtp: case ErAacScalable:
|
||||
case ErTwinVq: case ErBsac: case ErAacLd:
|
||||
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->extensionFlag = bitReader.readBits<byte>(1);
|
||||
audioCfg->extensionFlag = bitReader.readBit();
|
||||
if(audioCfg->channelConfiguration == 0) {
|
||||
throw NotImplementedException(); // TODO: parse program_config_element
|
||||
}
|
||||
|
@ -648,7 +649,7 @@ unique_ptr<Mpeg4AudioSpecificConfig> Mp4Track::parseAudioSpecificConfig(StatusPr
|
|||
default:
|
||||
;
|
||||
}
|
||||
if(bitReader.readBits<byte>(1) == 1) { // extension flag 3
|
||||
if(bitReader.readBit() == 1) { // extension flag 3
|
||||
throw NotImplementedException(); // TODO
|
||||
}
|
||||
}
|
||||
|
@ -676,7 +677,7 @@ unique_ptr<Mpeg4AudioSpecificConfig> Mp4Track::parseAudioSpecificConfig(StatusPr
|
|||
uint16 syncExtensionType = bitReader.readBits<uint16>(11);
|
||||
if(syncExtensionType == 0x2B7) {
|
||||
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) {
|
||||
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) {
|
||||
audioCfg->psPresent = bitReader.readBits<byte>(1);
|
||||
audioCfg->psPresent = bitReader.readBit();
|
||||
}
|
||||
}
|
||||
} catch(ios_base::failure &) {
|
||||
|
@ -1367,6 +1375,7 @@ void Mp4Track::internalParseHeader()
|
|||
addNotification(NotificationType::Warning, "Audio specific config has invalid extension sample frequency index.", context);
|
||||
}
|
||||
m_channelConfig = m_esInfo->audioSpecificConfig->channelConfiguration;
|
||||
m_extensionChannelConfig = m_esInfo->audioSpecificConfig->extensionChannelConfiguration;
|
||||
}
|
||||
if(m_esInfo->videoSpecificConfig) {
|
||||
// check the video specific config for useful information
|
||||
|
|
Loading…
Reference in New Issue