winamp/Src/vlb/programcfg.cpp
2024-09-24 14:54:57 +02:00

303 lines
6.4 KiB
C++

/* $Header: /cvs/root/winamp/vlb/programcfg.cpp,v 1.1 2009/04/28 20:21:10 audiodsp Exp $ */
/***************************************************************************\
*
* Copyright 2000-2002 Dolby Laboratories, Inc. All Rights
* Reserved. Do not copy. Do not distribute.
* Confidential information.
*
* (C) copyright Fraunhofer - IIS (1998)
* All Rights Reserved
*
* filename: programcfg.cpp
* project : MPEG-2 AAC Decoder
* contents/description: program config element
*
\***************************************************************************/
#include "programcfg.h"
CProgramConfig::CProgramConfig ()
: m_ElementInstanceTag (4),
m_Profile (2),
m_SamplingFrequencyIndex (4),
m_NumLfeChannelElements (2),
m_NumAssocDataElements (3),
m_NumValidCcElements (4),
m_MonoMixdownPresent (1),
m_MonoMixdownElementNumber (4),
m_StereoMixdownPresent (1),
m_StereoMixdownElementNumber (4),
m_MatrixMixdownIndexPresent (1),
m_MatrixMixdownIndex (2),
m_PseudoSurroundEnable (1),
m_CommentFieldBytes (8)
{
m_ExplicitMapping = false ;
m_NonMC_ConfigSet = false ;
for (int row = FrontRow ; row < SpeakerRows ; row++)
{
m_NumberOfChannels [row] = 0 ;
m_NumberOfChannelElements [row] = 0 ;
}
}
CProgramConfig::~CProgramConfig ()
{
}
void CProgramConfig::ResetNonMCConfig(void)
{
m_ExplicitMapping = false ;
m_NonMC_ConfigSet = false ;
for (int row = FrontRow ; row < SpeakerRows ; row++)
{
m_NumberOfChannels [row] = 0 ;
m_NumberOfChannelElements [row] = 0 ;
}
}
void CProgramConfig::Read (CDolbyBitStream &bs)
{
int i, row;
m_ElementInstanceTag.Read(bs) ;
m_Profile.Read (bs) ;
m_SamplingFrequencyIndex.Read (bs) ;
for (row = FrontRow ; row < SpeakerRows ; row++)
m_NumberOfChannelElements [row].Read (bs, 4) ;
m_NumLfeChannelElements.Read (bs) ;
m_NumAssocDataElements.Read (bs) ;
m_NumValidCcElements.Read (bs) ;
if (m_MonoMixdownPresent.Read (bs))
{
m_MonoMixdownElementNumber.Read (bs) ;
}
if (m_StereoMixdownPresent.Read (bs))
{
m_StereoMixdownElementNumber.Read (bs) ;
}
if (m_MatrixMixdownIndexPresent.Read (bs))
{
m_MatrixMixdownIndex.Read (bs) ;
m_PseudoSurroundEnable.Read (bs) ;
}
m_NumChannels = 0;
for (row = FrontRow ; row < SpeakerRows ; row++)
{
m_NumberOfChannels [row] = 0 ;
for (i = 0 ; i < m_NumberOfChannelElements [row] ; i++)
{
m_ChannelElementIsCpe [row][i].Read (bs, 1) ;
m_ChannelElementTagSelect [row][i].Read (bs, 4) ;
m_NumberOfChannels [row] += m_ChannelElementIsCpe [row][i] ? 2 : 1 ;
m_NumChannels += m_NumberOfChannels [row];
}
}
for (i = 0 ; i < m_NumLfeChannelElements ; i++)
{
m_LfeElementTagSelect [i].Read (bs, 4) ;
}
for (i = 0 ; i < m_NumAssocDataElements ; i++)
{
m_AssocDataElementTagSelect [i].Read (bs, 4) ;
}
for (i = 0 ; i < m_NumValidCcElements ; i++)
{
m_CcElementIsIndSw [i].Read (bs, 1) ;
m_ValidCcElementTagSelect [i].Read (bs, 4) ;
}
// comment
bs.ByteAlign () ;
m_CommentFieldBytes.Read (bs) ;
CVLBBitSequence text (8) ;
for (i = 0 ; i < m_CommentFieldBytes ; i++)
{
text.Read (bs) ;
if (i < MaximumCommentLength)
{
m_Comment [i] = text ;
}
}
m_ExplicitMapping = true ;
}
// the decoder calls this method with every
// new element id found in the bitstream.
bool CProgramConfig::AddChannel (const int tag, const bool isCPE)
{
if (!m_NonMC_ConfigSet)
{
m_NonMC_Tag = tag ;
m_NonMC_IsCPE = isCPE ;
m_NonMC_ConfigSet = true ;
return true ;
}
else
{
return ((m_NonMC_IsCPE == isCPE) && (m_NonMC_Tag == tag)) ;
}
}
bool CProgramConfig::AddSingleChannel (const int tag)
{
if (m_ExplicitMapping)
{
for (int row = 0 ; row < SpeakerRows ; row++)
{
for (int i = 0 ; i < m_NumberOfChannelElements [row] ; i++)
{
if ((m_ChannelElementTagSelect [row][i] == tag) && !m_ChannelElementIsCpe [row][i])
return true ;
}
}
return false ;
}
return true ;
}
bool CProgramConfig::AddChannelPair (const int tag)
{
if (m_ExplicitMapping)
{
for (int row = FrontRow ; row < SpeakerRows ; row++)
{
for (int i = 0 ; i < m_NumberOfChannelElements [row] ; i++)
{
if ((m_ChannelElementTagSelect [row][i] == tag) && m_ChannelElementIsCpe [row][i])
return true ;
}
}
return false ;
}
return true ;
}
bool CProgramConfig::AddCouplingChannel (const int tag)
{
if (m_ExplicitMapping)
{
for (int i = 0 ; i < m_NumValidCcElements ; i++)
{
if (m_ValidCcElementTagSelect [i] == tag)
{
// inc num_coupling_chan;
return true ;
}
}
return false ;
}
return true ;
}
bool CProgramConfig::AddLowFrequencyChannel (const int tag)
{
if (m_ExplicitMapping)
{
for (int i = 0 ; i < m_NumLfeChannelElements ; i++)
{
if (m_LfeElementTagSelect [i] == tag) return true ;
}
return false ;
}
return true ;
}
bool CProgramConfig::IsChannelLocatedAt (const int row, const int tag)
{
for (int i = 0 ; i < m_NumberOfChannelElements [row] ; i++)
{
if (!m_ChannelElementIsCpe [row][i] && (m_ChannelElementTagSelect [row][i] == tag))
return true ;
}
return false ;
}
bool CProgramConfig::IsChannelPairLocatedAt (const int row, const int tag)
{
for (int i = 0 ; i < m_NumberOfChannelElements [row] ; i++)
{
if (m_ChannelElementIsCpe [row][i] && (m_ChannelElementTagSelect [row][i] == tag))
return true ;
}
return false ;
}
int CProgramConfig::GetNumberOfElements (const int row)
{
return m_NumberOfChannelElements [row] ;
}
int CProgramConfig::GetNumberOfChannels (const int row)
{
return m_NumberOfChannels [row] ;
}
int CProgramConfig::GetElementTag (const int row, const int index)
{
return m_ChannelElementTagSelect [row][index] ;
}
bool CProgramConfig::IsChannelPair (const int row, const int index)
{
return m_ChannelElementIsCpe [row][index] ? true : false ;
}
int CProgramConfig::GetNumberOfLowFrequencyChannels (void)
{
return m_NumLfeChannelElements ;
}
int CProgramConfig::GetLowFrequencyChannelTag (const int index)
{
return m_LfeElementTagSelect [index] ;
}
char* CProgramConfig::GetCommentFieldData (void)
{
char* comment = new char[m_CommentFieldBytes];
for (int i = 0; i < m_CommentFieldBytes; i++)
comment[i] = m_Comment[i];
return comment;
}