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

📄 cqsrbrd.c

📁 这是一个SIGMA方案的PMP播放器的UCLINUX程序,可播放DVD,VCD,CD MP3...有很好的参考价值.
💻 C
📖 第 1 页 / 共 5 页
字号:
/******************************************************************************//*  cqsrbrd.c : Common code for implementation of the IDecoderBoard interface*  REALmagic Quasar Hardware Library*  Created by Aurelia Popa-Radu*  Copyright Sigma Designs Inc*  Sigma Designs Proprietary and confidential*  Created on 8/27/99*  Description:*******************************************************************************//****h* HwLib/IDecoderBoard_implementation * NAME *	IDecoderBoard_implementation * DESCRIPTION *  CQuasarBoard implementation of the IDecoderBoard interface. *	This is the main interface between the user and this library. * COPYRIGHT *  Copyright Sigma Designs Inc *  Sigma Designs Proprietary and confidential/******************************************************************************/#include "pch.h"//#define AUDIO_PATCH#undef TEST_CC#ifdef TEST_CCDWORD g_Test;DWORD g_VSyncIntCounter = 0;#endif///////////////////////////////////////////////////////////////////////Bitparser - to be included in HwLibint				m_incnt;unsigned char *	m_rdbfr;unsigned long	m_rdbfr_length;unsigned char *	m_rdptr;unsigned char * m_rdmax;int				m_bitcnt;unsigned int	m_bfr;// return next n bits (right adjusted) without advancingunsigned int hwl_showbits (int n){	return m_bfr >> (32-n);}// advance by n bitsvoid hwl_flushbits (int n, int *Err){	int incnt;	if(n<=31)		m_bfr <<= n;	else		m_bfr = 0;	incnt = m_incnt -= n;	if (incnt <= 24)	{		if (m_rdptr < m_rdbfr+(m_rdbfr_length-4))		{			do			{				m_bfr |= *m_rdptr++ << (24 - incnt);				incnt += 8;			}			while (incnt <= 24);		}		else		{			do			{				if (m_rdptr >= m_rdbfr+m_rdbfr_length)				{					(*Err)++;					m_bfr |= 0 << (24 - incnt);				}				else					m_bfr |= *m_rdptr++ << (24 - incnt);				incnt += 8;			}			while (incnt <= 24);		}		m_incnt = incnt;	}}// return next n bits (right adjusted) + advanceunsigned int hwl_getbits (int n, int *Err){	unsigned int l;	l = hwl_showbits (n);	hwl_flushbits (n, Err);	return l;}// hwl_align to the next bytevoid hwl_align (int *Err){	int incnt;	if (m_incnt != 32)	{		incnt = m_incnt%8;		hwl_flushbits (incnt, Err);	}}void BitStream (unsigned char *pBuffer, unsigned long Length, int *Err){	m_rdbfr = pBuffer;	m_rdbfr_length = Length;	m_incnt = 0;	m_rdptr = m_rdbfr + m_rdbfr_length;	m_rdmax = m_rdptr;	m_bitcnt = 0;	m_bfr = 0;	m_rdptr = m_rdbfr;	hwl_flushbits (0, Err);}//////////////////MPEG 4 visual object defines#define VIDEO_OBJECT_SEQUENCE_START_CODE	0x000001B0	// reserved in Mpeg2#define VIDEO_OBJECT_SEQUENCE_END_CODE		0x000001B1	// reserved in Mpeg2#define USER_DATA_START_CODE				0x000001B2	// same as Mpeg2#define GROUP_VOP_START_CODE				0x000001B3	// SEQUENCE_HEADER for Mpeg2#define VIDEO_SESSION_ERROR_CODE			0x000001B4	// SEQUENCE_ERROR_CODE for Mpeg2#define VISUAL_OBJECT_START_CODE			0x000001B5	// EXTENSION_START_CODE for Mpeg2#define VIDEO_OBJECT_START_CODE_BEGIN		0x00000100	// ??#define VOP_START_CODE						0x000001B6	// reserved in Mpeg2// 0x000001B6 - 0x000001B9 reserved for Mpeg4#define FACE_OBJECT_START_CODE				0x000001BA	// PACK_START_CODE for Mpeg2#define FACE_OBJECT_PLANE_START_CODE		0x000001BB	// SYSTEM_START_CODE for Mpeg2#define MESH_OBJECT_START_CODE				0x000001BC	// PROGRAM_STREAM_MAP for Mpeg2#define MESH_OBJECT_PLANE_START_CODE		0x000001BD	// PRIVATE_STREAM_1 for Mpeg2#define STILL_TEXTURE_OBJECT_START_CODE		0x000001BE	// PADDING_STREAM for Mpeg2#define TEXTURE_SPATIAL_LAYER_START_CODE	0x000001BF	// PRIVATE_STREAM_2 for Mpeg2#define TEXTURE_SNR_LAYER_START_CODE		0x000001C0	// AUDIO_STREAM for Mpeg2// 0x000001C1 - 0x000001C5 reserved for Mpeg4// TBD system start codes 0x000001C6 - 0x000001FF	// AUDIO_STREAM for Mpeg2QRESULT ParseDsiInfo(void* pDsiIn, DWORD dwDsiInSize, void* pDsiOut, DWORD dwDsiOutSize){	int Err = 0;	DWORD vop_time_increment_resolution;	DWORD temp;	if( (pDsiIn == NULL) || (dwDsiInSize == 0) )	{		QDbgLog((QLOG_TRACE, QDebugLevelError, TEXT("NULL DSI") ));		return Q_FAIL;	}	BitStream ((BYTE*)pDsiIn, dwDsiInSize, &Err);	temp = hwl_getbits(32,&Err);	// visual_object_sequence_start_code	if( !Err && (temp != VIDEO_OBJECT_SEQUENCE_START_CODE) )	{		if( (temp & 0x000001E0) == VIDEO_OBJECT_START_CODE_BEGIN )	// vweb files			goto VideoObjectLayer;	}	if( Err || (temp != VIDEO_OBJECT_SEQUENCE_START_CODE) )	{		QDbgLog((QLOG_TRACE, QDebugLevelError, TEXT("NO VIDEO_OBJECT_SEQUENCE_START_CODE") ));		return Q_FAIL;	}	temp = hwl_getbits(8,&Err);	// profile_and_level_indication	if( Err )	{		QDbgLog((QLOG_TRACE, QDebugLevelError, TEXT("NO profile_and_level_indication") ));		return Q_FAIL;	}	while( (temp = hwl_showbits(32)) != VISUAL_OBJECT_START_CODE)	{		temp = hwl_getbits(8,&Err);	// USER_DATA_START_CODE, user data		if( Err )		{			QDbgLog((QLOG_TRACE, QDebugLevelError, TEXT("NO VISUAL_OBJECT_START_CODE") ));			return Q_FAIL;		}	}	temp = hwl_getbits(32,&Err);//VISUAL_OBJECT_START_CODE	temp = hwl_getbits(1,&Err);	// is_visual_object_identifier	if( temp )	{		temp = hwl_getbits(4,&Err);	// visual_object_verid should be 0		temp = hwl_getbits(3,&Err);	// visual_object_priority should be 1..7, no 0	}	temp = hwl_getbits(4,&Err);	// visual_object_type should be 1 = video id	if( temp != 1 )	{		QDbgLog((QLOG_TRACE, QDebugLevelError, TEXT("NO visual_object_type == video id") ));		return Q_FAIL;	}	else	{		temp = hwl_getbits(1,&Err);	// video_signal_type		if( temp == 1 )		{			temp = hwl_getbits(3,&Err);	// video_format			temp = hwl_getbits(1,&Err);	// video_range			temp = hwl_getbits(1,&Err);	// colour_description			if( temp == 1 )			{				temp = hwl_getbits(8,&Err);	// colour_primaries				temp = hwl_getbits(8,&Err);	// transfer_characteristics				temp = hwl_getbits(8,&Err);	// matrix_coefficients			}		}	}	hwl_align(&Err);	while( ((temp = hwl_showbits(32)) & 0x000001E0) != 0x00000100 )	{		temp = hwl_getbits(8,&Err);	// USER_DATA_START_CODE, user data		if( Err )		{			QDbgLog((QLOG_TRACE, QDebugLevelError, TEXT("NO video object start code") ));			return Q_FAIL;		}	}	temp = hwl_getbits(32,&Err);	// video_object_start_codeVideoObjectLayer:	temp = hwl_showbits(32);		// video_object_layer_start_code	if( (temp & 0x000001E0) == 0x00000120 )	{		// short_video_header = 0		temp = hwl_getbits(32,&Err);// video_object_layer_start_code		temp = hwl_getbits(1,&Err);	// random_accessible_vol		temp = hwl_getbits(8,&Err);	// video_object_type_indication		temp = hwl_getbits(1,&Err);	// is_object_layer_identifier		if( temp == 1 )		{			temp = hwl_getbits(4,&Err);	// video_object_layer_verid should be 1			temp = hwl_getbits(3,&Err);	// video_object_layer_priority		}		temp = hwl_getbits(4,&Err);	// aspect_ratio_info		if( temp == 0xf )	// extended par		{			temp = hwl_getbits(8,&Err);	// par_width			temp = hwl_getbits(8,&Err);	// par_height		}		temp = hwl_getbits(1,&Err);	// vol_control_parameters		if( temp == 1 )		{			temp = hwl_getbits(2,&Err);	// chroma_format			temp = hwl_getbits(1,&Err);	// low_delay			temp = hwl_getbits(1,&Err);	// vbv_parameters			if( temp == 1 )			{				temp = hwl_getbits(15,&Err);// first_half_bit_rate				temp = hwl_getbits(1,&Err);	// marker_bit				temp = hwl_getbits(15,&Err);// latter_half_bit_rate				temp = hwl_getbits(1,&Err);	// marker_bit				temp = hwl_getbits(15,&Err);// first_half_vbv_buffer_size				temp = hwl_getbits(1,&Err);	// marker_bit				temp = hwl_getbits(3,&Err);	// latter_half_vbv_buffer_size				temp = hwl_getbits(11,&Err);// first_half_vbv_occupancy				temp = hwl_getbits(1,&Err);	// marker_bit				temp = hwl_getbits(15,&Err);// latter_half_vbv_occupancy				temp = hwl_getbits(1,&Err);	// marker_bit			}		}		temp = hwl_getbits(2,&Err);	// video_object_layer_shape		temp = hwl_getbits(1,&Err);	// marker_bit		vop_time_increment_resolution = hwl_getbits(16,&Err);		QDbgLog((QLOG_TRACE, QDebugLevelWarning,			TEXT("DSI vop_time_increment_resolution = %d"),			vop_time_increment_resolution ));				// for now the output is a DWORD = vop_time_increment_resolution		*(DWORD*)pDsiOut = vop_time_increment_resolution;		temp = hwl_getbits(1,&Err);	// marker_bit		temp = hwl_getbits(1,&Err);	// fixed_vop_rate		if(temp)		{			temp = 0;			while( vop_time_increment_resolution )			{				vop_time_increment_resolution >>= 1;				temp++;			}			temp = hwl_getbits(temp,&Err);	// fixed_vop_time_increment		}	}	return Q_OK;}/////////////////////////////////////////////////////////////////////#include "cqsrbrd.h"#include "regs840x.h"#include "regs847x.h"#include "em847x.h"/****v* HwLib/g_HwLibVersion * NAME *	g_HwLibVersion * DESCRIPTION *	g_HwLibVersion can be used to retrieve the revision of the HwLib code  /******************************************************************************/#include "rmver.h"DWORD g_HwLibVersion = RM_HWLIB_VERSION;/****f* HwLib/GetHwLibVersion * USAGE *	DWORD GetHwLibVersion() * DESCRIPTION *	It returns the revision of the HwLib source code. * SEE ALSO *   g_HwLibVersion/******************************************************************************/DWORD GetHwLibVersion(){	return g_HwLibVersion;}/****v* HwLib/g_pIDecoderBoard[MAX_INSTANCES] * NAME *	g_pIDecoderBoard[MAX_INSTANCES] * DESCRIPTION *	Global array of maximum MAX_INSTANCES pointers to DecoderBoard objects. *	Every EM8400 on the PCI bus will add a new object in this array.  /******************************************************************************/IDecoderBoard* g_pIDecoderBoard [MAX_INSTANCES] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};/****v* HwLib/g_ErrorTable * NAME *	g_ErrorTable * DESCRIPTION *	Global Table used by GetLastQError to associate the error code to a string. * SOURCE */ErrorEntry g_ErrorTable[100] ={	{ E_TOO_MANY_INSTANCES,		TEXT("Too many instances already opened")},	{ E_CREATE_INSTANCE_FAILED,	TEXT("CreateInstance failed")},	{ E_INVALID_PROPERTY_BUFFER,TEXT("Invalid Property Buffer")},	{ E_INVALID_PROPERTY_SET,	TEXT("Invalid Property Set")},	{ E_INVALID_PROPERTY_ID,	TEXT("Invalid Property Id")},	{ E_GEN_FAILURE,			TEXT("Hardware failure")},	{ E_NOT_SUPPORTED,			TEXT("Not supported")},	{ E_INVALID_PARAMETER,		TEXT("Invalid parameter")},	{ E_LOAD_MICROCODE_FAILED,	TEXT("Load microcode failed")},	{ E_GET_SYMBOLS_FAILED,		TEXT("Get symbols failed")},	{ E_MICROCODE_FAILED,		TEXT("After microcode load the DM data is not initialized!!!")},	{ E_VIDEO_WRITE_COMMAND_FAILED,	TEXT("VideoWriteCommand failed")},	{ E_AUDIO_WRITE_COMMAND_FAILED,	TEXT("AudioWriteCommand failed")},	{ E_OSD_WRITE_COMMAND_FAILED,	TEXT("OsdWriteCommand failed")},	{ E_TEST_REG_FAILED,		TEXT("Test registers failed")},	{ E_TEST_PM_FAILED,			TEXT("Test program memory failed")},	{ E_TEST_DM_FAILED,			TEXT("Test data memory failed")},	{ E_TEST_DRAM_FAILED,		TEXT("Test dram failed")},	{ E_TEST_NOVA_FAILED,		TEXT("Nova test failed")},	{ E_NOVA_NOT_PRESENT,		TEXT("Nova not present")},

⌨️ 快捷键说明

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