📄 audio.cpp
字号:
/***********************************************************************/
/* audio.cpp :
* REALmagic Quasar Hardware Library
* Created by Kevin Vo
* Copyright 2000 Sigma Designs Inc.
* 355 Fairview Way, Milpitas, CA 95035-3024 USA. All Rights Reserved.
* Sigma Designs Proprietary and Confidential
* Created on 3/20/01
* Description: Parses the audio elementary stream.
/************************************************************************/
#include "pch.h"
#include "manager.h"
#include "splitter.h"
///////////////////////////////////////////////////////////////////
CMpegAudio::CMpegAudio(MemManager *pMemManager) : CBitParser(pMemManager)
{
m_bAc3Reverse = FALSE;
m_bRun = FALSE;
}
///////////////////////////////////////////////////////////////////
CMpegAudio::~CMpegAudio()
{
if (!m_bStopDemux)
StopDemux();
}
///////////////////////////////////////////////////////////////////
/****f* MMDemux/CMpegAudio::Process
* USAGE
* int Process(CBuffer *pCBuffer)
* DESCRIPTION
* Processes the audio payload.
* PARAMETERS
* CBuffer* pCBuffer - a pointer to the CBuffer object which contains
* the audio payload.
* RETURN VALUE
* STOP_DEMUX if the buffer is NULL; otherwise, SUCCESS_DEMUX
/**********************************************************************/
int CMpegAudio::Process(CBuffer *pCBuffer)
{
int iReturnCode = 0;
if (pCBuffer != NULL)
{
m_pCBuffer = pCBuffer;
m_dwBufferIndex = 0;
m_dwBufferSize = m_pCBuffer->GetActualSize();
m_pBuffer = (BYTE*)m_pCBuffer->GetBuffer();
if (!m_bRun)
{
m_bRun = TRUE;
if (m_bAudioType == MM_AUDIO_FORMAT_AC3)
{
if (IsAc3Reverse(m_pBuffer, m_dwBufferSize))
m_bAc3Reverse = TRUE;
}
}
if (m_bAc3Reverse)
ReverseBytes(m_pBuffer, m_dwBufferSize);
if (m_bAudioType == MM_AUDIO_FORMAT_AC3)
iReturnCode = ParseAc3Audio();
else
iReturnCode = ParseMpegAudio();
if (m_bStopDemux)
return STOP_DEMUX;
else // iReturnCode == SUCCESS_DEMUX
m_pCBuffer->Release();
return SUCCESS_DEMUX;
}
else
{
return STOP_DEMUX;
}
}
////////////////////////////////////////////////////////////////////
int CMpegAudio::ParseMpegAudio()
// PURPOSE: Parses the MpegAudio file.
{
int iPacketDataLength = 2048;
while (!m_bStopDemux)
{
if (m_dwBufferIndex + iPacketDataLength < m_dwBufferSize)
{
m_bPayloadPtr = m_pBuffer + m_dwBufferIndex;
m_dwPayloadLength = iPacketDataLength;
m_bStreamType = MM_AUDIO;
m_llPts = 0;
m_bPtsDtsFlag = FALSE;
// Move ptr to end of this packet
m_dwBufferIndex += iPacketDataLength;
SetMediaSampleParameters();
}
else // Last packet in the buffer
{
m_bPayloadPtr = m_pBuffer + m_dwBufferIndex;
m_dwPayloadLength = m_dwBufferSize - m_dwBufferIndex;
m_bStreamType = MM_AUDIO;
m_llPts = 0;
m_bPtsDtsFlag = FALSE;
SetMediaSampleParameters();
break;
}
}
return SUCCESS_DEMUX;
}
////////////////////////////////////////////////////////////////////
int CMpegAudio::ParseAc3Audio()
// PURPOSE: Parses the Ac3Audio file.
{
DWORD tmpIndex = 0;
INT frameSize = 0;
BYTE byte = 0;
while (!m_bStopDemux)
{
tmpIndex = m_dwBufferIndex;
frameSize = 0;
while (!m_bStopDemux && (tmpIndex + 5) < m_dwBufferSize)
{
if (MAKEWORD(*(m_pBuffer + tmpIndex+1), *(m_pBuffer + tmpIndex)) == AC3_HEADER)
{
// Get frame syncinfo
byte = *(m_pBuffer + tmpIndex + 4);
m_lSampleRate = (byte >> 6) & 0x3;
INT iFrameSizeCode = byte & 0x3F;
if (iFrameSizeCode >= 38)
{
frameSize = 0;
m_lSampleRate = 0;
tmpIndex++;
continue;
}
switch(m_lSampleRate)
{
case 0:
m_lSampleRate = 48000;
frameSize = Ac3FrameSize[iFrameSizeCode].SR48 * 2;
break;
case 1:
m_lSampleRate = 44100;
frameSize = Ac3FrameSize[iFrameSizeCode].SR441 * 2;
break;
case 2:
m_lSampleRate = 32000;
frameSize = Ac3FrameSize[iFrameSizeCode].SR32 * 2;
break;
default:
m_lSampleRate = 0;
break;
}
tmpIndex += frameSize;
if (tmpIndex < m_dwBufferSize)
{
if ( MAKEWORD(*(m_pBuffer+tmpIndex+1),*(m_pBuffer+tmpIndex)) == AC3_HEADER)
{
if (m_bEndOfBuffer)
{
// Second half of previous payload
frameSize = tmpIndex - m_dwBufferIndex;
m_bEndOfBuffer = FALSE;
}
break;
}
frameSize = 0;
m_lSampleRate = 0;
}
else // End of buffer
{
frameSize = 0;
m_bEndOfBuffer = TRUE;
break;
}
}
tmpIndex++;
}
if ((frameSize > 0) && m_dwBufferIndex + frameSize <= m_dwBufferSize)
{
m_bPayloadPtr = m_pBuffer + m_dwBufferIndex;
m_dwPayloadLength = frameSize;
m_bStreamType = MM_AUDIO;
m_llPts = 0;
m_bPtsDtsFlag = FALSE;
// Move ptr to end of this packet
m_dwBufferIndex += frameSize;
SetMediaSampleParameters();
}
else // Last packet in the buffer
{
m_bPayloadPtr = m_pBuffer + m_dwBufferIndex;
m_dwPayloadLength = m_dwBufferSize - m_dwBufferIndex;
m_bStreamType = MM_AUDIO;
m_llPts = 0;
m_bPtsDtsFlag = FALSE;
SetMediaSampleParameters();
break;
}
}
return SUCCESS_DEMUX;
}
///////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -