mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-09-24 15:54:12 +00:00
280 lines
7.6 KiB
C++
280 lines
7.6 KiB
C++
/* $Header: /cvs/root/winamp/vlb/channel.h,v 1.1 2009/04/28 20:21:08 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: channel.h
|
|
* project : MPEG-2 AAC Decoder
|
|
* contents/description: independent channel stream object
|
|
*
|
|
***************************************************************************/
|
|
|
|
#ifndef __CHANNEL_H__
|
|
#define __CHANNEL_H__
|
|
|
|
#include "block.h"
|
|
#include "bitsequence.h"
|
|
#include "channelinfo.h"
|
|
#include "overlapadd.h"
|
|
#include "stereo.h"
|
|
|
|
#ifdef MAIN_PROFILE
|
|
#include "prediction.h"
|
|
#endif
|
|
|
|
#include "dolby_imdct.h"
|
|
#include "DolbyPayload.h"
|
|
#include "audio_io.h"
|
|
#include "audio_io_dsp.h"
|
|
|
|
class CDolbyBitStream ;
|
|
class CStreamInfo ;
|
|
class AudioIODSP ;
|
|
|
|
/** Base Class For Channel Elements.
|
|
|
|
This abstract base class defines the interface and some common internal
|
|
helper functions for channel elements.
|
|
*/
|
|
|
|
class CChannelElement
|
|
{
|
|
|
|
public :
|
|
|
|
CChannelElement (CDolbyBitStream &bs) ;
|
|
virtual ~CChannelElement () ;
|
|
|
|
/** Data type for time-domain output samples.
|
|
|
|
Change this to float if you prefer the decoder core to deliver its time
|
|
domain output data as floating point rather than 16 bit short integer.
|
|
*/
|
|
|
|
typedef short PcmType ;
|
|
|
|
/** Main serialization method.
|
|
|
|
This method completely retrieves the channel element's state from the
|
|
associated bitstream object. All syntactic element members will be
|
|
called to perform their respective bitstream parsing and read in
|
|
their values from the MPEG stream.
|
|
|
|
This interface method must be implemented by any derived class.
|
|
|
|
@param info This container objects holds relevant information on
|
|
the current stream's sampling rate, profile etc. which
|
|
is required to correctly interpret some bitfields.
|
|
*/
|
|
|
|
virtual void Read (const CStreamInfo &) = 0 ;
|
|
|
|
/** Main decoding method.
|
|
|
|
This is the actual workhorse function, it performs all processing
|
|
required for reconstruction of one complete frame of output data.
|
|
All active tools will be called to perform their work on the
|
|
spectral coefficients of our \Ref{CBlock} member object(s) and frequency
|
|
to time domain transform will be performed on all subwindows.
|
|
|
|
@param pcmbuf The output array to hold one frame of decoded data.
|
|
@param stride The interleave stride used to write the audio chunks.
|
|
*/
|
|
|
|
virtual void Decode (AudioIOControl *poAudioIO, CStreamInfo &info, int stride = 1) = 0 ;
|
|
|
|
/** Number of channels information method.
|
|
|
|
This method simply returns the number of output channels that the
|
|
implementing class will provide.
|
|
|
|
@return Number of channels.
|
|
*/
|
|
|
|
virtual int GetNumberOfChannels (void)
|
|
{
|
|
return 0 ;
|
|
}
|
|
|
|
/** Pseudo-EQ configuration method.
|
|
|
|
This is really just a gimmick and not encouraged for use in any
|
|
serious application. A coefficient mask can be provided that will
|
|
be applied to the spectral bins of our \Ref{CBlock} Members. Will
|
|
introduce bad aliasing artefacts.
|
|
|
|
@param wantEQ Flag to turn pseudo-EQ on/off. False by default.
|
|
@param Mask An array of CBlock::EqualizationMaskLength coefficients.
|
|
*/
|
|
|
|
void SetEqualization (bool wantEQ, float Mask []) ;
|
|
|
|
protected :
|
|
|
|
CBlock *ReadICS (CChannelInfo &ics_info, unsigned long *memory) ;
|
|
|
|
enum
|
|
{
|
|
BlockMemorySize = ((sizeof (CLongBlock) > sizeof (CShortBlock)) ?
|
|
sizeof (CLongBlock) : sizeof (CShortBlock)) /
|
|
sizeof (unsigned long) + 1
|
|
} ;
|
|
|
|
protected :
|
|
|
|
CDolbyBitStream &m_bs ;
|
|
|
|
CVLBBitSequence m_GlobalGain ;
|
|
|
|
bool m_WantEqualizer ;
|
|
bool m_WantSpectralData ;
|
|
|
|
float m_EqualizerMask [CBlock::EqualizationMaskLength] ;
|
|
|
|
AudioIODSP * m_poAudioDSP;
|
|
|
|
} ;
|
|
|
|
/** SCE Single Channel Element.
|
|
|
|
This class holds the data for one single audio channel, as represented
|
|
by the ID_SCE bitstream element, and defines its parsing and decoding order.
|
|
|
|
It consists of one \Ref{CBlock} member that holds the actual spectral bins for
|
|
a long block or a short block, and a time domain overlap-add buffer.
|
|
This class implements the \Ref{CChannelElement} interface.
|
|
*/
|
|
|
|
#ifdef MAIN_PROFILE
|
|
/* If MAIN_PROFILE is enabled, ID_SCE also includes an
|
|
instance of the \Ref{CPrediction} class to hold the state information for the
|
|
optional main profile backward-adaptive prediction tool. The predictor state
|
|
and overlap-add buffers are persistent between calls, so instances of this
|
|
class are not stateless and should only be used for one specific element
|
|
instance tag.
|
|
|
|
*/
|
|
#endif
|
|
|
|
class CSingleChannel : public CChannelElement
|
|
{
|
|
|
|
public :
|
|
|
|
CSingleChannel (CDolbyBitStream &bs) ;
|
|
~CSingleChannel () ;
|
|
|
|
virtual void Read (const CStreamInfo &) ;
|
|
virtual void Decode (AudioIOControl *poAudioIO, CStreamInfo &info, int stride = 1) ;
|
|
void DecodeDolby (AudioIOControl *poAudioIO,
|
|
DOLBY_PAYLOAD_STRUCT *psDSEInfo,
|
|
CStreamInfo &info,
|
|
int stride = 1) ;
|
|
virtual int GetNumberOfChannels (void)
|
|
{
|
|
return 1 ;
|
|
}
|
|
|
|
//MSV:
|
|
CBlock* GetBlock(){return m_Block;}
|
|
CChannelInfo *GetChannelInfo(){return &m_IcsInfo;}
|
|
protected :
|
|
|
|
CChannelInfo m_IcsInfo ;
|
|
CBlock *m_Block ;
|
|
|
|
COverlapAddBuffer m_Previous ;
|
|
|
|
#ifdef MAIN_PROFILE
|
|
CPrediction m_Prediction ;
|
|
#endif
|
|
|
|
unsigned long m_BlockMemory [CChannelElement::BlockMemorySize] ;
|
|
private:
|
|
IMDCTObject *poIMDCTObject;
|
|
IMDCTObject *poNormalIMDCTObject;
|
|
float **ppfData;
|
|
short **ppshData;
|
|
} ;
|
|
|
|
/** CPE Channel Pair Element.
|
|
|
|
This class holds the data for one pair of audio channels, as represented
|
|
by the ID_CPE bitstream element, and defines their parsing and decoding order.
|
|
|
|
It consists of a Left/Right-Pair of \Ref{CBlock} members that hold the actual
|
|
spectral bins for a long block or a short window sequence, a pair of
|
|
time domain overlap-add buffers and prediction tools, plus a joint stereo
|
|
processing tool and associated side information. The predictor state
|
|
and overlap-add buffers are persistent between calls, so instances of this
|
|
class are state-dependent and should only be used for one specific element
|
|
instance tag.
|
|
|
|
This class implements the \Ref{CChannelElement} interface.
|
|
|
|
*/
|
|
|
|
class CChannelPair : public CChannelElement
|
|
{
|
|
|
|
public :
|
|
|
|
CChannelPair (CDolbyBitStream &bs) ;
|
|
~CChannelPair () ;
|
|
|
|
virtual void Read (const CStreamInfo &) ;
|
|
virtual void Decode (AudioIOControl *poAudioIO, CStreamInfo &info, int stride = 1) ;
|
|
void DecodeDolby (AudioIOControl *poAudioIO,
|
|
DOLBY_PAYLOAD_STRUCT *psDSEInfo,
|
|
CStreamInfo &info,
|
|
int stride = 1) ;
|
|
virtual int GetNumberOfChannels (void)
|
|
{
|
|
return CChannelPair::Channels ;
|
|
}
|
|
|
|
//MSV:
|
|
CBlock* GetLeftBlock(){return m_Block[0];}
|
|
CBlock* GetRightBlock(){return m_Block[1];}
|
|
CChannelInfo *GetChannelInfo(){return m_IcsInfo;}
|
|
protected :
|
|
|
|
enum
|
|
{
|
|
L = 0,
|
|
R = 1,
|
|
Channels = 2
|
|
} ;
|
|
|
|
CVLBBitSequence m_CommonWindow ;
|
|
|
|
CChannelInfo m_IcsInfo [Channels] ;
|
|
CBlock *m_Block [Channels] ;
|
|
|
|
COverlapAddBuffer m_Previous [Channels] ;
|
|
|
|
#ifdef MAIN_PROFILE
|
|
CPrediction m_Prediction [Channels] ;
|
|
#endif
|
|
|
|
CJointStereo m_JointStereo ;
|
|
|
|
unsigned long m_BlockMemory [Channels][CChannelElement::BlockMemorySize] ;
|
|
private:
|
|
IMDCTObject **ppoIMDCTObject;
|
|
IMDCTObject **ppoNormalIMDCTObject;
|
|
float **ppfData;
|
|
short **ppshData;
|
|
} ;
|
|
|
|
DECLARE_EXCEPTION(EIllegalProfile, AAC_ILLEGAL_PROFILE, "Illegal Profile") ;
|
|
|
|
#endif
|
|
|
|
|