亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mpeg1.cpp

?? 神龍卡 SDK_84xx_DShow_145_02.zip 這個是 windows 上二個是linux
?? CPP
字號:
/***********************************************************************/
/* mpeg1.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 mpeg1 stream. 
/************************************************************************/

#include "pch.h"
#include "manager.h"
#include "splitter.h"

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

CMpeg1::CMpeg1(MemManager *pMemManager) : CBitParser(pMemManager)
{
}

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

CMpeg1::~CMpeg1()
{
	if (!m_bStopDemux)
		StopDemux();
}

///////////////////////////////////////////////////////////////////
/****f* MMDemux/CMpeg1::Process
 * USAGE
 *  void Process(CBuffer *pCBuffer)
 * DESCRIPTION
 *  Processes the mpeg1 stream.
 * PARAMETERS
 *  CBuffer* pCBuffer - a pointer to the CBuffer object which contains
 *    the mpeg1.
 * RETURN VALUE
 *  STOP_DEMUX if the buffer is NULL or StopDemux() is called; otherwise, SUCCESS_DEMUX
/**********************************************************************/
int CMpeg1::Process(CBuffer *pCBuffer)
{
	if (pCBuffer != NULL)
	{
		m_pCBuffer = pCBuffer;

		// Packet is between 2 buffers, newly arrival buffer will use the previous buffer.
		// The GetByte() function will move to new buffer when dwBufferIndex reaches
		// the end of buffer.
		if (m_bPacketBetween2Buffers)
		{	
			m_pBuffer = (BYTE*)m_pPreviousCBuffer->GetBuffer();
			// Last known packet index. This is the last packet of previous buffer.
			m_dwBufferIndex = m_dwPreviousPacketIndex;	
			m_dwBufferSize = m_pPreviousCBuffer->GetActualSize();
		}
		else
		{
			m_dwBufferIndex = 0;
			m_dwBufferSize = m_pCBuffer->GetActualSize();
			m_pBuffer = (BYTE*)m_pCBuffer->GetBuffer();
			// Save this buffer first. If end of buffer occurs, we still have it. When
			// the next buffer arrives, we'll release it. Otherwise, we'll release it if 
			// END_OF_BUFFER exception isn't thrown. We'll also release it if we get
			// PAYLOAD_BETWEEN_2BUFFERS exception.
			m_pPreviousCBuffer = m_pCBuffer;
		}

		// The previous buffer contains pack header, system header, packet header
		// and a portion of payload. Current buffer contains the rest of the
		// payload (usually size < 2048).
		if (m_bPayloadBetween2Buffers)
		{
			if (!GetMorePayload())
			{
				m_pCBuffer->Release();
				return SUCCESS_DEMUX;
			}
			m_bPayloadBetween2Buffers = FALSE;
		}

		int iReturnCode = ParseMpeg1System();
		if (m_bStopDemux)
			return STOP_DEMUX;
		else if (iReturnCode == END_OF_BUFFER)
		{
			m_bPacketBetween2Buffers = TRUE;
			m_bEndOfBuffer = FALSE;
		}
		else
		{
			if (iReturnCode == PAYLOAD_BETWEEN_2BUFFERS)
				m_bPayloadBetween2Buffers = TRUE;
			m_pCBuffer->Release();			
		}
		return SUCCESS_DEMUX;
	}
	else
	{
		return STOP_DEMUX;
	}
}

////////////////////////////////////////////////////////////////////
/****f* MMDemux/CMpeg1::ParseMpeg1System
 * USAGE
 *  void ParseMpeg1System()
 * DESCRIPTION
 *  Parses the mpeg1 system stream.
 * PARAMETERS
 *  None.
 * RETURN VALUE
 *  STOP_DEMUX if the buffer is NULL or StopDemux() is called.
 *  SUCCESS_DEMUX 
 *  END_OF_BUFFER - End of buffer is reached while parsing the stream.
 *  PAYLOAD_BETWEEN_2BUFFERS - 
/**********************************************************************/
int CMpeg1::ParseMpeg1System()
{	
	DWORD m_dwCode = 0;
	while (!m_bStopDemux)
	{
		m_dwCode = SyncOnNextStartCode();
		if (m_bEndOfBuffer)
			return END_OF_BUFFER;
		if (m_dwCode == PACK_START_CODE)
		{	
			SkipMpeg1PackHeader();	// Can re-throw an exception if end of buffer
			if (m_bEndOfBuffer)
				return END_OF_BUFFER;
		}
		else if (m_dwCode == SYSTEM_START_CODE)
		{
			SkipSystemHeader();		// Can re-throw an exception if end of buffer
			if (m_bEndOfBuffer)
				return END_OF_BUFFER;
		}
		else if (((m_dwCode & 0xFFFFFFF0) == AUDIO_STREAM) || 
					((m_dwCode & 0xFFFFFFF0) == VIDEO_STREAM))
		{
			GetMpeg1Packet();
			if (m_bEndOfBuffer)
				return END_OF_BUFFER;

			DWORD shiftCount = m_dwCode & 0xF;
			DWORD newMask = 1 << shiftCount;
			if ((m_dwCode & 0xFFFFFFF0) == VIDEO_STREAM)
			{
				m_bStreamType = MM_VIDEO;
				m_dwVStreamId = m_dwCode;
				// Determine the correct video channel to play
				if (m_AVId.dwVideoStreamId == 0)
				{
					if (!((m_dwVideoMask >> shiftCount) & 0x1))
					{
						m_dwVideoMask = m_dwVideoMask | newMask;
						m_wVideoChannelCount++;
						if (m_wVideoChannelCount == m_wVideoChannelPlay)
							m_AVId.dwVideoStreamId = m_dwCode;
						MmDebugLogfile((MmDebugLevelTrace, "mpeg1 video channel %d", m_wVideoChannelCount));
					}
				}
			}
			else
			{
				m_bStreamType = MM_AUDIO;
				m_dwAStreamId = m_dwCode;
				// Determine the correct audio channel to play
				if (m_AVId.dwAudioStreamId == 0)
				{
					if (!((m_dwAudioMask >> shiftCount) & 0x1))
					{
						m_dwAudioMask = m_dwAudioMask | newMask;
						m_wAudioChannelCount++;
						if (m_wAudioChannelCount == m_wAudioChannelPlay)
							m_AVId.dwAudioStreamId = m_dwCode;
						MmDebugLogfile((MmDebugLevelTrace, "mpeg1 audio channel %d", m_wAudioChannelCount));
					}
				}
			}

			// End of buffer. Payload is between 2 buffers.
			if ((m_dwBufferIndex + m_dwPayloadLength) > m_dwBufferSize)
			{
				m_dwRightPayloadLength = m_dwPayloadLength - (m_dwBufferSize - m_dwBufferIndex);
				m_dwPayloadLength = m_dwBufferSize - m_dwBufferIndex;
				// If m_dwPayloadLength = 0, next buffer contains entire payload, send packet
				// when next buffer arrives, including the PTS if exists. Otherwise, send it
				// now then set the Pts flag to FALSE.
				if (m_dwPayloadLength > 0)
				{
					SetMediaSampleParameters();
					m_bPtsDtsFlag = FALSE;		// Next packet contains only payload.
				}
				return PAYLOAD_BETWEEN_2BUFFERS;
			}
			// We have a complete packet
			m_dwBufferIndex += m_dwPayloadLength;	// Move to the end of this packet
			m_dwPreviousPacketIndex = m_dwBufferIndex;
			SetMediaSampleParameters();
		}
	}
	return SUCCESS_DEMUX;
}

/////////////////////////////////////////////////////////////////////////////
/****f* MMDemux/CMpeg1::SkipMpeg1PackHeader
 * USAGE
 *  void SkipMpeg1PackHeader()
 * DESCRIPTION
 *  Parses the mpeg1 pack header.
 * PARAMETERS
 *  None.
 * RETURN VALUE
 *  None.
/**********************************************************************/
void CMpeg1::SkipMpeg1PackHeader()
{
	m_ullScr = 0;
	// System clock reference bytes and marker bits (5 bytes - 33 bits).
	m_ullScr = (GetByte() >> 1) & 0x7;				// 3 bits, bits 3-1
	m_ullScr = (m_ullScr << 8) & GetByte();			// 8 bits
	m_ullScr = (m_ullScr << 7) & (GetByte() >> 1);	// 7 bits, bits 7-1
	m_ullScr = (m_ullScr << 8) & GetByte();			// 8 bits
	m_ullScr = (m_ullScr << 7) & (GetByte() >> 1);	// 7 bits, bits 7-1

	// Multiplex rate  and marker bits (3 bytes).
	GetWord();
	GetByte();
}

////////////////////////////////////////////////////////////////////
/****f* MMDemux/CMpeg1::GetMpeg1Packet
 * USAGE
 *  void GetMpeg1Packet()
 * DESCRIPTION
 *  Parses the mpeg1 packet header.
 * PARAMETERS
 *  None.
 * RETURN VALUE
 *  None.
/**********************************************************************/
void CMpeg1::GetMpeg1Packet()
{
	INT wPacketHeaderLength = 0;
	INT wPacketLength = 0;
	BYTE byte = FALSE;

	m_bPtsDtsFlag = FALSE;
	m_llPts = 0;

	// Get packet Length, 2 bytes
	wPacketLength = (WORD)GetWord();

	byte = (BYTE)ShowByte();
	if (byte != PRIVATE_STREAM_2)
	{
		// Stuffing bytes
		byte = (BYTE)ShowByte();
		while (byte >> 7)
		{
			GetByte();
			wPacketHeaderLength++;
			byte = (BYTE)ShowByte();
		}

		// StdBufferScale and StdBufferSize, 2 bytes
		byte = (BYTE)ShowByte();
		if ((byte >> 6) == 0x1)
		{
			GetWord();
			wPacketHeaderLength += 2;
		}

		// Get PTS and DTS
		byte = (BYTE)ShowByte();
		if ((byte >> 4) == 0x2)	// '10' PTS presents
		{
			m_llPts = (LONGLONG(GetByte() & 0x0E) << 29);
			m_llPts += (LONGLONG(GetByte()) << 22);
			m_llPts += (LONGLONG(GetByte() & 0xFE) << 14);
			m_llPts += (LONGLONG(GetByte()) << 7);
			m_llPts += (LONGLONG(GetByte() >> 1));
			wPacketHeaderLength += 5;
			m_bPtsDtsFlag = TRUE;
		}
		else if((byte >> 4) == 0x3)	// '11' PTS and DTS present
		{
			m_llPts = (LONGLONG(GetByte() & 0x0E) << 29);
			m_llPts += (LONGLONG(GetByte()) << 22);
			m_llPts += (LONGLONG(GetByte() & 0xFE) << 14);
			m_llPts += (LONGLONG(GetByte()) << 7);
			m_llPts += (LONGLONG(GetByte() >> 1));

			// Get DTS, same as getting PTS
			m_llDts = (LONGLONG(GetByte() & 0x0E) << 29);
			m_llDts += (LONGLONG(GetByte()) << 22);
			m_llDts += (LONGLONG(GetByte() & 0xFE) << 14);
			m_llDts += (LONGLONG(GetByte()) << 7);
			m_llDts += (LONGLONG(GetByte() >> 1));
			wPacketHeaderLength += 10;
			m_bPtsDtsFlag = TRUE;
		}
		else	// Neither PTS or DTS flags were set, set to 0xF
		{
			GetByte();
			wPacketHeaderLength++;
		}
	}
	// Pointer of the beginning of payload
	m_bPayloadPtr = m_pBuffer + m_dwBufferIndex;
	// Actual packet data size
	m_dwPayloadLength = wPacketLength - wPacketHeaderLength;
}

/////////////////////////////////////////////////////////////////////////////
/****f* MMDemux/CMpeg1::SkipSystemHeader
 * USAGE
 *  void SkipSystemHeader
 * DESCRIPTION
 *  Parses the mpeg1 system header
 * PARAMETERS
 *  None.
 * RETURN VALUE
 *  None.
/**********************************************************************/
void CMpeg1::SkipSystemHeader()
{
	BYTE byte = 0;
	WORD wHeaderLength = 0;

	wHeaderLength = (WORD)GetWord();

	// Rate bound and marker bits (3 bytes).
	GetWord();
	GetByte();
	// Audio bound, fixed flag, CSPS flag.
	GetByte();
	// System audio clock flag, system video clock flag, marker bit, video bound bits.
	GetByte();
	// Reserved byte
	GetByte();

	// Skip Std_buffer_bound_scale and Std_buffer_size_bound
	while (TRUE)
	{
		byte = (BYTE)ShowByte();
		if ((byte >> 7) == 1)	// first bit is 1, skip 3 bytes
		{		
			GetByte();	// Stream Id
			GetWord();  // buffer bound scale and buffer size bound
		}
		else
			break;
	}
}

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

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美午夜精品久久久| 东方欧美亚洲色图在线| 最近中文字幕一区二区三区| 精品国产一区久久| 欧美mv日韩mv| 久久久久久久久蜜桃| 日韩三级伦理片妻子的秘密按摩| 7777精品伊人久久久大香线蕉超级流畅 | 国产精品美女久久久久久2018| 久久网站最新地址| 中文字幕的久久| 亚洲视频在线一区| 亚洲自拍欧美精品| 日韩精品一区第一页| 蜜臀av一区二区| 国产成人日日夜夜| 成人性色生活片| 91丨porny丨户外露出| 欧美色偷偷大香| 日韩一区二区三区四区| 精品91自产拍在线观看一区| 日本一区二区视频在线观看| 日韩伦理电影网| 日产欧产美韩系列久久99| 久久精品国内一区二区三区| 国产一二三精品| 色吧成人激情小说| 91精品国产91久久久久久一区二区| 日韩三级伦理片妻子的秘密按摩| 久久久久久日产精品| 一区二区三区视频在线看| 免费视频一区二区| av电影天堂一区二区在线观看| 欧美私模裸体表演在线观看| 精品久久久久久久人人人人传媒| 一区二区中文字幕在线| 日本伊人精品一区二区三区观看方式| 国产成人一级电影| 欧美精品丝袜中出| ...av二区三区久久精品| 日韩精品免费视频人成| 9色porny自拍视频一区二区| 宅男噜噜噜66一区二区66| 中文在线一区二区| 青青草精品视频| 在线视频欧美精品| 日本一区二区视频在线| 免费看欧美美女黄的网站| zzijzzij亚洲日本少妇熟睡| 欧美日韩一区二区三区在线| 欧美国产1区2区| 九九久久精品视频| 欧美丝袜丝nylons| 亚洲裸体在线观看| 春色校园综合激情亚洲| 精品国产乱子伦一区| 亚洲mv大片欧洲mv大片精品| 成人一区二区三区在线观看| 日韩欧美在线一区二区三区| 一区二区三区日韩欧美| 北岛玲一区二区三区四区| 久久日韩粉嫩一区二区三区| 视频一区免费在线观看| 欧美日韩一区二区三区免费看 | 国产91丝袜在线播放九色| 欧美一区二区三区播放老司机| 亚洲乱码国产乱码精品精的特点 | 午夜免费久久看| 欧洲av一区二区嗯嗯嗯啊| 国产精品国产三级国产普通话99| 国产精品一区二区无线| 26uuu色噜噜精品一区二区| 日韩电影在线免费看| 欧美疯狂做受xxxx富婆| 亚洲成在线观看| 欧美男女性生活在线直播观看 | 欧美丰满一区二区免费视频| 亚洲一区二区三区激情| 91黄色小视频| 性做久久久久久免费观看| 欧美日韩精品免费观看视频| 五月天视频一区| 69堂国产成人免费视频| 日本色综合中文字幕| 欧美一区二区黄色| 久久精品国产网站| 国产日韩欧美不卡| 91免费精品国自产拍在线不卡| 国产精品第四页| 在线看日本不卡| 爽好久久久欧美精品| 日韩欧美成人激情| 成人激情免费视频| 亚洲一区二区三区视频在线播放| 欧美人xxxx| 国产成人综合亚洲网站| 中文字幕日韩av资源站| 日本精品一区二区三区高清 | 青青草原综合久久大伊人精品| 精品国产99国产精品| 成人性视频免费网站| 亚洲另类在线一区| 日韩亚洲欧美在线| 99视频国产精品| 天天射综合影视| 欧美国产激情一区二区三区蜜月| 成人av免费网站| 免费在线成人网| 中文字幕一区二区三区精华液| 精品视频免费看| 国产成人精品免费网站| 亚洲午夜电影在线| 国产女人18毛片水真多成人如厕| 色婷婷激情综合| 韩国精品久久久| 亚洲成在线观看| 欧美激情在线一区二区三区| 精品视频999| caoporen国产精品视频| 男男成人高潮片免费网站| 最好看的中文字幕久久| 日韩亚洲欧美一区二区三区| 99精品1区2区| 国产精品综合在线视频| 亚洲成a人片综合在线| 中日韩av电影| 26uuu亚洲综合色| 91精品国产综合久久久久久久| 99久免费精品视频在线观看| 久久国产免费看| 日韩专区一卡二卡| 一区二区三区欧美久久| 国产精品久久久久婷婷| 久久亚洲精品小早川怜子| 欧美一区二区三区在线看| 欧美在线一区二区| 97se狠狠狠综合亚洲狠狠| 国产成人在线电影| 国产精一区二区三区| 久久国内精品自在自线400部| 五月婷婷激情综合| 亚洲第一av色| 亚洲午夜成aⅴ人片| 玉足女爽爽91| 亚洲黄色小说网站| 亚洲精品美腿丝袜| 亚洲男人电影天堂| 亚洲婷婷综合久久一本伊一区 | 日本丰满少妇一区二区三区| 国产成人av一区| 国产成人夜色高潮福利影视| 国产一区二区三区综合| 紧缚捆绑精品一区二区| 精彩视频一区二区| 国产91丝袜在线播放0| 成人一二三区视频| 91丨九色丨蝌蚪丨老版| 色婷婷久久久久swag精品| 一本久道中文字幕精品亚洲嫩| 91免费看视频| 欧美天堂一区二区三区| 欧美日韩国产区一| 日韩欧美专区在线| 欧美精品一区二区三区久久久 | 色狠狠av一区二区三区| 在线观看亚洲成人| 欧美日韩激情一区二区三区| 制服丝袜亚洲精品中文字幕| 日韩一区二区免费电影| 国产午夜精品久久久久久久| 中文字幕欧美激情| 一区二区三区国产豹纹内裤在线| 亚洲电影在线播放| 久久国产精品免费| 成人ar影院免费观看视频| 在线看国产日韩| 日韩欧美自拍偷拍| 最新成人av在线| 蜜臀a∨国产成人精品| 风间由美中文字幕在线看视频国产欧美 | 视频一区二区欧美| 国产在线播放一区二区三区| www.欧美精品一二区| 欧美日韩高清在线| 国产亚洲欧美一区在线观看| 一区二区三区蜜桃| 精品一区二区三区视频在线观看| 成人永久看片免费视频天堂| 在线观看日韩电影| 亚洲精品在线观看网站| 日韩毛片在线免费观看| 日韩va欧美va亚洲va久久| 国产高清久久久| 欧美三级日韩在线| 中文字幕欧美日本乱码一线二线| 日韩中文字幕一区二区三区| 成人一级黄色片| 精品久久久久久久人人人人传媒| 亚洲男人电影天堂| 丰满少妇久久久久久久|