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

📄 bitparser.cpp

📁 神龙卡 SDK_84xx_DShow_145_02.zip 这个是 windows 上二个是linux
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/***********************************************************************/
/* bitparser.cpp : Implementation of bit parser
*  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: Contains util functions to parse bit of the payload
/************************************************************************/

#include "pch.h"
#include "manager.h"
#include "splitter.h"	// for SendToHardware function
#include "bitparser.h"


// Set this to save the video/audio payloads to files.
//#define _RECORD_AUDIO_
//#define _RECORD_VIDEO_

///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////

void CMpegProperties::SetPlayAudioChannel(WORD wAudio)
{
	m_wAudioChannelPlay = wAudio;
}

///////////////////////////////////////////////////////////////////

void CMpegProperties::SetPlayVideoChannel(WORD wVideo)
{
	m_wVideoChannelPlay = wVideo;
}

///////////////////////////////////////////////////////////////////

void CMpegProperties::SetAudioType(BYTE bAudioType)
{
	m_bAudioType = bAudioType;
}

///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////

CBitParser::CBitParser(MemManager *pMemManager)
{
#ifdef _RECORD_VIDEO_
	m_pVideoFile = fopen("mmvideo.mpg", "wb");
#endif
#ifdef _RECORD_AUDIO_
	m_pAudioFile = fopen("mmaudio.mpg", "wb");
#endif

	m_pMemManager = pMemManager;
	m_bStopDemux = FALSE;
	// For transport stream
	m_bIsTransport = FALSE;
	m_bProcess = FALSE;

	// Use these parameters to process the buffer
	m_pCBuffer = NULL;
	m_pBuffer = 0;
	m_dwBufferSize = 0;
	m_dwBufferIndex = 0;

	// MediaSample parameters	
	m_bPayloadPtr = 0;
	m_dwPayloadLength = 0;
	m_llPts = m_llDts = 0;
	m_bPtsDtsFlag = 0;
	m_bStreamType = MM_AUDIO;	// Default
	m_ullScr = 0;
	m_lSampleRate = 0;

	m_pPreviousCBuffer = 0;
	m_dwPreviousPacketIndex = 0;
	m_dwRightPayloadLength = 0;
	m_bPacketBetween2Buffers = FALSE;
	m_bPayloadBetween2Buffers = FALSE;
	m_bEndOfBuffer = FALSE;

	m_bAudioType = MM_AUDIO_FORMAT_MPEG1;   // Normal audio type, no AC3/DTS
	m_bSubstreamId = 0;
	m_bNFrameHeaders = 0;
	m_iFirstAccessUnit = 0;

	m_AVId.dwAudioStreamId = 0;
	m_AVId.dwVideoStreamId = 0;
	m_dwAStreamId = 0;
	m_dwVStreamId = 0;
	m_wAudioChannelCount = 0;
	m_wVideoChannelCount = 0;
	m_wAudioChannelPlay = 1;
	m_wVideoChannelPlay = 1;
	m_dwAudioMask = 0x0000;
	m_dwVideoMask = 0x0000;

	// Transport stream
	m_llPcr = 0;
	m_bPcrFlag = FALSE;
	m_wPid = 0;
	m_bContCounter = 0;
	m_bDiscIndicator = 0;
	m_wPrivateStreamPid = 0;
	m_llVideoPts = 0;
	m_llAudioPts = 0;
	m_bVideoPtsFlag = FALSE;
	m_bAudioPtsFlag = FALSE;
	m_wProgramNumber = 1;
	m_bPesPayload = FALSE;

	// Transport stream with more than one program.
	m_wProgramPlay = 1;
	m_wProgramCounter = 0;
	m_ProgDef.iAudioElemStreamId = -1;
	m_ProgDef.iVideoElemStreamId = -1;
	m_ProgDef.iProgramNum = -1;

	// Transport stream buffers
	m_pVideoCBuffer = 0;
	m_pAudioCBuffer = 0;
	m_pVideoBuffer = 0;
	m_pAudioBuffer = 0;
	m_dwVideoBufferLen = 0;
	m_dwAudioBufferLen = 0;
	m_bVideoPesHeader = FALSE;
	m_bAudioPesHeader = FALSE;

	m_bFastForward = FALSE;
	m_pIFrame = new CIFrame();
}

/////////////////////////////////////////////////////////////////////

CBitParser::~CBitParser()
{
#ifdef _RECORD_VIDEO_
	if (m_pVideoFile != NULL)
		fclose(m_pVideoFile);
#endif
#ifdef _RECORD_AUDIO_
	if (m_pAudioFile != NULL)
		fclose(m_pAudioFile);
#endif

	delete m_pIFrame;
}

///////////////////////////////////////////////////////////////////

void CBitParser::StopDemux()
{
	if (m_bStopDemux != TRUE)
	{
		m_bStopDemux = TRUE;
		m_bFastForward = FALSE;
		m_bIsTransport = FALSE;
		m_pIFrame->StopDemux();

		if (m_pCBuffer)   m_pCBuffer->Release();
		if ((m_pPreviousCBuffer != m_pCBuffer) && (m_pPreviousCBuffer != NULL))
			m_pPreviousCBuffer->Release();
		// Transport stream buffers
		if (m_pVideoCBuffer)   m_pVideoCBuffer->Release();
		if (m_pAudioCBuffer)   m_pAudioCBuffer->Release();
	}
}

///////////////////////////////////////////////////////////////////

void CBitParser::ResetDemux()
{
	m_bStopDemux = FALSE;
	m_bProcess = FALSE;
	m_bEndOfBuffer = FALSE;
	m_bPayloadBetween2Buffers = FALSE;
	if (m_bPacketBetween2Buffers)
		m_pPreviousCBuffer->Release();
	m_bPacketBetween2Buffers = FALSE;
	// Transport stream buffers
	m_dwVideoBufferLen = 0;
	m_dwAudioBufferLen = 0;
	m_bVideoPesHeader = FALSE;
	m_bAudioPesHeader = FALSE;
	if (m_pVideoCBuffer)   m_pVideoCBuffer->Release();
	if (m_pAudioCBuffer)   m_pAudioCBuffer->Release();

	m_pIFrame->RestartDemux();
}

/////////////////////////////////////////////////////////////////////////////

void CBitParser::SetFastForward(BOOL bVal)
{
	m_bFastForward = bVal;
	if (!m_bFastForward)
		m_pIFrame->StopDemux();
}

/////////////////////////////////////////////////////////////////////////////

int CBitParser::Process(CBuffer* pCBuffer)
{
	return 0;
}

/////////////////////////////////////////////////////////////////////////////
// Transport stream sample

//#define NO_BUFFER_VIDEO
//#define NO_BUFFER_AUDIO

void CBitParser::TransportSample()
{
	CIMediaSample *pMedia = 0;

	if (!m_bPesPayload)
		return;
	else if ((m_wPid != m_ProgDef.iVideoElemStreamId) && (m_wPid != m_ProgDef.iAudioElemStreamId))
		 return;

	if ((m_dwPayloadLength > 0) && (m_dwPayloadLength <= 184))
	{
		switch (m_bStreamType)
		{
			case MM_VIDEO:
#ifdef _RECORD_VIDEO_
				SavePayload();
#endif
#ifdef NO_BUFFER_VIDEO
				m_pMemManager->GetMediaSample(m_pCBuffer, &pMedia);
				pMedia->SetPayload(m_bPayloadPtr);
				pMedia->SetActualDataLength(m_dwPayloadLength);
				pMedia->SetPts(m_llPts, m_bPtsDtsFlag);
				pMedia->SetMediaType(m_bStreamType);
				pMedia->SetScr(m_llPcr);

				m_llPcr = 0;
				m_bPtsDtsFlag = FALSE;
				SendToHardware (pMedia);
				pMedia->Release();
#else   // BUFFER_VIDEO
				if (m_bVideoPesHeader)
				{
					// New PES packet. Send payload of previous packet. This payload won't
					// contain info about PTS, DTS, Pes header and Pes length.
					if (m_dwVideoBufferLen > 0)
					{
						m_pMemManager->GetMediaSample(m_pVideoCBuffer, &pMedia);
						pMedia->SetPayload(m_pVideoBuffer);
						pMedia->SetActualDataLength(m_dwVideoBufferLen);
						pMedia->SetPts(0, FALSE);
						pMedia->SetMediaType(m_bStreamType);
						pMedia->SetScr(m_llPcr);
						m_llPcr = 0;

						SendToHardware (pMedia);
						pMedia->Release();

						m_pVideoCBuffer->Release();
						m_pVideoCBuffer = m_pMemManager->GetTSBuffer();
						m_pVideoBuffer = (BYTE*)m_pVideoCBuffer->GetBuffer();
						m_dwVideoBufferLen = 0;
					}
					// Completely new PES payload. This one usually has a length of < 184. Send
					// it rightaway to avoid overwritten of PTS, DTS, Pes header and Pes length.
					// No need to copy to temporary transport buffer!
					m_pMemManager->GetMediaSample(m_pCBuffer, &pMedia);
					pMedia->SetPayload(m_bPayloadPtr);
					pMedia->SetActualDataLength(m_dwPayloadLength);
					pMedia->SetPts(m_llVideoPts, m_bVideoPtsFlag);
					pMedia->SetMediaType(m_bStreamType);
					pMedia->SetScr(m_llPcr);
					m_llPcr = 0;

					SendToHardware (pMedia);
					pMedia->Release();

					m_bVideoPesHeader = FALSE;
					m_bVideoPtsFlag = FALSE;

					m_pVideoCBuffer->Release();
					m_pVideoCBuffer = m_pMemManager->GetTSBuffer();
					m_pVideoBuffer = (BYTE*)m_pVideoCBuffer->GetBuffer();
					m_dwVideoBufferLen = 0;
				}
				else
				{
					memcpy (m_pVideoBuffer + m_dwVideoBufferLen, m_bPayloadPtr, m_dwPayloadLength);
					m_dwVideoBufferLen += m_dwPayloadLength;
					if ((m_dwVideoBufferLen + 184) >= m_pVideoCBuffer->GetActualSize())
					{
						m_pMemManager->GetMediaSample(m_pVideoCBuffer, &pMedia);
						pMedia->SetPayload(m_pVideoBuffer);
						pMedia->SetActualDataLength(m_dwVideoBufferLen);
						pMedia->SetPts(m_llVideoPts, m_bVideoPtsFlag);
						pMedia->SetMediaType(m_bStreamType);
						pMedia->SetScr(m_llPcr);
						m_llPcr = 0;

						SendToHardware (pMedia);
						pMedia->Release();
						
						m_pVideoCBuffer->Release();
						m_pVideoCBuffer = m_pMemManager->GetTSBuffer();
						m_pVideoBuffer = (BYTE*)m_pVideoCBuffer->GetBuffer();
						m_dwVideoBufferLen = 0;
					}
				}
#endif
				break;
			case MM_AUDIO:
#ifdef _RECORD_AUDIO_
				SavePayload();
#endif
#ifdef NO_BUFFER_AUDIO
				m_pMemManager->GetMediaSample(m_pCBuffer, &pMedia);
				pMedia->SetPayload(m_bPayloadPtr);
				pMedia->SetActualDataLength(m_dwPayloadLength);
				pMedia->SetPts(m_llPts, m_bPtsDtsFlag);
				pMedia->SetMediaType(m_bStreamType);
				pMedia->SetScr(m_llPcr);
				m_llPcr = 0;
				m_bPtsDtsFlag = FALSE;

				pMedia->SetNFrameHeaders(0);
				pMedia->SetFirstAccessUnit(0);
				if (m_bAudioType == MM_AUDIO_FORMAT_AC3)
				{
					if (SetFirstAccessUnitPtr(m_bPayloadPtr, m_dwPayloadLength, &m_iFirstAccessUnit))
						pMedia->SetPtsDtsFlag(TRUE);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -