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

📄 bluraycps.c

📁 SigmDesign SMP8634 media decode chip development SDK
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * * Copyright (c) Sigma Designs, Inc. 2006. All rights reserved. * */#include "cps_context.h"//FIXME: Static CPS context - can only init_cps once.// Is this a BUG or a FEATURE ?static struct cps_context_s g_cps_context = {0,};#if 0#define LOCALDBG ENABLE#else#define LOCALDBG DISABLE#endif/* Helpers *//* Check callback structure is valid */static RMstatus check_callbacks(struct cps_callbacks_s *callbacks){		if(callbacks==NULL) {		RMDBGLOG((ENABLE, "Callbacks Undefined\n"));		return RM_ERROR;	}		#define CHECK_CALLBACK(fn) 		\	if(callbacks->fn==NULL) { 	\		RMDBGLOG((ENABLE, "Undefined callback %s required\n", #fn)); \		return RM_ERROR;	\	}				\		CHECK_CALLBACK(packetcommand_callback);	CHECK_CALLBACK(file_read_callback);	CHECK_CALLBACK(file_size_callback);	CHECK_CALLBACK(file_lba_callback);	CHECK_CALLBACK(nvs_read_callback);	CHECK_CALLBACK(nvs_write_callback);	CHECK_CALLBACK(bdp_app_layer_callback);	CHECK_CALLBACK(bdp_getportinfo_callback);	CHECK_CALLBACK(bdp_discoveryram_callback);	CHECK_CALLBACK(bdp_runnative_callback);	CHECK_CALLBACK(bdp_lock_q_callback);	CHECK_CALLBACK(bdp_unlock_q_callback);	CHECK_CALLBACK(bdp_lock_vm_callback);	CHECK_CALLBACK(bdp_unlock_q_callback);#undef CHECK_CALLBACK		return RM_OK;}/* VM helpers */#define take(cps)     RMDBGLOG((DISABLE,"TAKING vm semaphore!\n"));cps->callbacks->bdp_lock_vm_callback(cps_context->callback_context);RMDBGLOG((DISABLE,"Semaphore locked!\n"));#define release(cps)  RMDBGLOG((DISABLE,"Releasing vm semahpore!\n"));cps->callbacks->bdp_unlock_vm_callback(cps_context->callback_context);RMDBGLOG((DISABLE,"Semaphore released!\n"));#define PRINT_PROGRESS() ;			static RMstatus do_svm_interrupt(struct cps_context_s *cps_context, union SVMINTRP *pIntrp){	RMstatus rc;	RMuint32 id=pIntrp->base.InterruptID;		rc=SVM_QueueInterrupt(cps_context->svm, pIntrp);	if(rc!=RM_OK) return rc;		take(cps_context);	rc=RM_OK;	while(pIntrp->base.InterruptID==id && rc!=RM_ERROR && rc!=RM_INVALIDMODE && rc!=RM_FATAL) {		PRINT_PROGRESS();		RMint32 instrCountdown = 1000;		rc=SVM_VMRun(cps_context->svm, &instrCountdown);	}	release(cps_context);		/* Check interrupt return value, treat all AppLayer returns  as OK */	if( (pIntrp->base.ReturnVal != INTERRUPT_RETURN_OK) && (pIntrp->base.InterruptID != INTRP_ApplicationLayer) ) {			RMDBGLOG((ENABLE,"Interrupt Failed! (0x%08lx)\n",pIntrp->base.ReturnVal));				if( pIntrp->base.ReturnVal == INTERRUPT_RETURN_FATAL ) {			/* The interrupt failed with FATAL, the player must stop! */			RMDBGLOG((ENABLE,"The player must stop BDSVM and AV output!!!!\n"));			return RM_FATAL;		}		else {#if 1 // HACK - treat all non-fatal errors as success.			return RM_OK;#else			/* The player may chose to run the interrupt again, or run another interrupt */			return RM_ERROR;#endif		}	}		/* DEBUG:  */	if( RMFAILED(rc) ) {		RMDBGLOG((ENABLE,"Interrupt failed with \"%s\"(%d)", (rc==RM_INVALIDMODE)?"Invalid mode!\0":		(rc==RM_TIMEOUT)?"Timeout!\0":"Generic Error!\0",rc));	}		return rc;}static RMstatus do_svm_background(struct cps_context_s *cps_context, RMint32* cycles){	RMstatus rc;	take(cps_context);	rc=SVM_VMRun(cps_context->svm, cycles);	release(cps_context);	return rc;}/* CPS API */#define CPS_MEM_AACS_OFFSET		(0)#define CPS_MEM_AACS_SIZE		(3*1024*1024)#define CPS_MEM_SPDC_OFFSET		(CPS_MEM_AACS_OFFSET + CPS_MEM_AACS_SIZE)#define CPS_MEM_SPDC_SIZE               (SVM_MEMORY_SIZE)#define CPS_MEM_SIZE (CPS_MEM_SPDC_SIZE + CPS_MEM_AACS_SIZE)RMuint32 cps_get_memsize(void){	return CPS_MEM_SIZE;}RMstatus init_cps_preloaded(struct cps_context_s **cps_context, RMuint32 chip,		  RMuint32 cps_buffer_physaddr, RMuint32 cps_buffer_virtaddr,		  struct cps_callbacks_s *callbacks, void *callback_context, 		  RMuint32 bdplus_xtask_id, RMuint32 aacs_xtask_id, 		  struct demux_cipher *dmx_cphr){	g_cps_context.bdplus_xtask_slot_id = bdplus_xtask_id;	g_cps_context.aacs_xtask_slot_id = aacs_xtask_id;	g_cps_context.dmx_cphr = dmx_cphr;	g_cps_context.preloaded  = TRUE;	/* CALL Init CPS with globals set */	return init_cps( cps_context, chip, cps_buffer_physaddr, cps_buffer_virtaddr, callbacks, callback_context );}RMstatus init_cps(struct cps_context_s **cps_context, RMuint32 chip,		  RMuint32 cps_buffer_physaddr, RMuint32 cps_buffer_virtaddr,		  struct cps_callbacks_s *callbacks, void *callback_context){	struct cps_context_s *cps;	RMstatus rc;		/* Already opened ? */	if(g_cps_context.callbacks) {		RMDBGLOG((ENABLE,"Error: CPS Callbacks already set, CPS module has already been initialized!\n"));		return RM_ERROR;	}	cps=&g_cps_context;	/* Check callbacks */	rc=check_callbacks(callbacks);	if(rc!=RM_OK)		return rc;	if(cps_context==NULL)		return RM_ERROR;	/* return the allocated context */	cps->callbacks = callbacks;	cps->callback_context = callback_context;	*cps_context = cps;	cps->aacs_passthrough = FALSE;	/*--- Open aacs module : ---*/	if( cps->preloaded ) {		cps->aacs = aacs_open_preloaded(cps_buffer_physaddr + CPS_MEM_AACS_OFFSET,			                        cps_buffer_virtaddr + CPS_MEM_AACS_OFFSET,			                        CPS_MEM_AACS_SIZE, chip, cps->aacs_xtask_slot_id, cps->dmx_cphr);	}	else {		cps->aacs = aacs_open(cps_buffer_physaddr + CPS_MEM_AACS_OFFSET,			              cps_buffer_virtaddr + CPS_MEM_AACS_OFFSET,			              CPS_MEM_AACS_SIZE, chip);	}	if(cps->aacs==NULL) {		RMDBGLOG((ENABLE, "Failed to open aacs module\n"));		rc = RM_ERROR;		goto safe_exit;	}	#ifdef DISABLE_BDPLUS	// FOR non BD+ licensees this must be enabled to allow use of BDROM	// commercial titles.	RMDBGLOG((ENABLE,"XXXX BYPASSING BD+ XXXX\n"));	cps->bdplus_disabled = TRUE;#else	/*--- Open BD+ SVM module : ---*/	cps->bdplus_disabled = FALSE;	if( cps->preloaded ) {		rc=SVM_Init_Preloaded(&cps->svm, &g_spdc_callbacks, cps,				(RMuint8*)(cps_buffer_virtaddr + CPS_MEM_SPDC_OFFSET),				(RMuint32)cps_buffer_physaddr  + CPS_MEM_SPDC_OFFSET, CPS_MEM_SPDC_SIZE, BDPLUS_FLASH_PAGE, cps->bdplus_xtask_slot_id);	}	else {		rc=SVM_Init(&cps->svm, &g_spdc_callbacks, cps, 		            (RMuint8*)(cps_buffer_virtaddr + CPS_MEM_SPDC_OFFSET), 		            (RMuint32)cps_buffer_physaddr  + CPS_MEM_SPDC_OFFSET, CPS_MEM_SPDC_SIZE, BDPLUS_FLASH_PAGE);	}			if( rc != RM_OK ) {		if( rc == RM_NOT_FOUND ) {			/* BD+ not found on disc */			RMDBGLOG((ENABLE,"Failed to find BD+ on disc.  BD+ has been disabled!\n"));			cps->bdplus_disabled = TRUE;		}		else {			RMDBGLOG((ENABLE,"Failed to initialize BD+ with error %d\n",rc));			goto safe_exit;		}	}#endif	rc = RM_OK;safe_exit:		if( rc != RM_OK ) {		term_cps(cps);		return rc;	}		/* Report back that aacs/ or bd+ is disabled */	if( cps->bdplus_disabled ) {		rc |= CPS_BDPLUS_DISABLED;	}		return rc;}RMstatus cps_media_initialize(struct cps_context_s *cps_context, RMuint32 flags){	RMuint32 aacs_flags;	RMuint32 aacs_fs_type = flags & CPS_FLAGS_AACS_FS_TYPE_MASK;		cps_context->media_info_bits_0=0;		switch(flags & CPS_FLAGS_MEDIA_TYPE_MASK) 	{		case CPS_FLAGS_MEDIA_TYPE_BD_ROM:					if( aacs_fs_type ==  CPS_FLAGS_AACS_FS_TYPE_BDROM ) 				aacs_flags = AACS_BD_ROM;			else 				aacs_flags = AACS_BD_ROM | AACS_PASSTHROUGH;			cps_context->media_info_bits_0 |= SPDC_MEDIAINFOBITS0_BD_ROM;			break;					case CPS_FLAGS_MEDIA_TYPE_BD_RE: 			RMDBGLOG((ENABLE,"Media type BD-RE\n"));			if (aacs_fs_type == CPS_FLAGS_AACS_FS_TYPE_BD_RE_20)				aacs_flags = AACS_BD_RE | AACS_BD_RE_20;			else if (aacs_fs_type == CPS_FLAGS_AACS_FS_TYPE_BD_RE_30)				aacs_flags = AACS_BD_RE | AACS_BD_RE_30;			else				aacs_flags = AACS_BD_RE | AACS_PASSTHROUGH;						cps_context->media_info_bits_0 |= SPDC_MEDIAINFOBITS0_BD_RE;				break;		case CPS_FLAGS_MEDIA_TYPE_BD_R:			aacs_flags= AACS_BD_R | AACS_PASSTHROUGH;			RMDBGLOG((ENABLE,"Media type BD-R\n"));			if (aacs_fs_type == CPS_FLAGS_AACS_FS_TYPE_BD_RE_20)				aacs_flags = AACS_BD_R | AACS_BD_RE_20;			else if (aacs_fs_type == CPS_FLAGS_AACS_FS_TYPE_BD_RE_30)				aacs_flags = AACS_BD_R | AACS_BD_RE_30;			else				aacs_flags = AACS_BD_R | AACS_PASSTHROUGH;			cps_context->media_info_bits_0 |= SPDC_MEDIAINFOBITS0_BD_R;			break;		default:			RMDBGLOG((ENABLE, "Unsupported media type %d\n", flags & CPS_FLAGS_MEDIA_TYPE_MASK));

⌨️ 快捷键说明

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