⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 audio.cpp

📁 神龙卡 SDK_84xx_DShow_145_02.zip 这个是 windows 上二个是linux
💻 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 + -