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

📄 drmlocal.c

📁 Zoran V966 DVD 解码 Soc芯片的源程序
💻 C
字号:
/*
// $Header: /I76/I76_Common/I76_Reference/Playcore/Nav_Clips/AviDrm/libDrmDecrypt/DrmLocal.c 3     2/15/04 7:41p Lotan $
// Copyright (c) DivXNetworks, Inc. http://www.divxnetworks.com
// All rights reserved.
//
// This software is the confidential and proprietary information of DivXNetworks
// Inc. ("Confidential Information").  You shall not disclose such Confidential
// Information and shall use it only in accordance with the terms of the license
// agreement you entered into with DivXNetworks, Inc.
*/
#include "Playcore\Nav_Clips\AviDrm\libDrmDecrypt\DrmLocal.h"
#include "Playcore\PS\PS.h"
#include "Services\Memory\malloc.h"
#include "Include\cpu_address.h"
#ifdef AVI_DRM_SUPPORT

#include "Playcore\Nav_Clips\AviDrm\LibDrmCommon\DrmErrors.h"
#include "eeprom.h"

//#include <stdio.h>   /* io */
#include <string.h>  /* strcmp */
#include "Playcore\Timing\Timing.h" /* clock */
#include "Services\Include\_heap.h"
#include "dvp_api.h"

#define CLOCKS_PER_SEC 67000UL

BYTE far drmKeyFinal[32];
/*
char drmLocalFileName[256] = "";
*/
//char *drmLocalFileName;
void init_DrmLocalKey(void)
{
	UINT16 i,prev,after;
	UINT16 *pRomBuffer,*pRomBufferAfterXor,*pRomBufferAfterOr;
   pRomBuffer=(UINT16*)MEM_Allocate(SC_POOL, 16*2);
   pRomBufferAfterXor=(UINT16*)MEM_Allocate(SC_POOL,16*2);
   pRomBufferAfterOr=(UINT16*)MEM_Allocate(SC_POOL,16*2);
 	for(i=0;i<16;i++)
	{
	    pRomBuffer[i] = DVP_DRRead(0x282+i);
    }
   for(i=0;i<16;i++)
	{	
      	if(i==0)
         	prev=pRomBuffer[15];
         else
         	prev=pRomBuffer[i-1];
         if(i==16)
         	after=pRomBuffer[0];
         else
         	after=pRomBuffer[i+1];
      	pRomBufferAfterXor[i]=prev^pRomBuffer[i]^after;
	}
    for(i=0;i<16;i++)
     {
      	if(i==0)
         	prev=pRomBufferAfterXor[15];
         else
         	prev=pRomBufferAfterXor[i-1];
         if(i==16)
         	after=pRomBufferAfterXor[0];
         else
         	after=pRomBufferAfterXor[i+1];
      	 pRomBufferAfterOr[i]=(prev<<7)|(after>>7);
         pRomBufferAfterOr[i]=pRomBufferAfterXor[i]&pRomBufferAfterOr[i];
         if(i%2==0)
         {
         	 pRomBufferAfterOr[i]=pRomBufferAfterOr[i]>>1;
         }
         else
         {
         	pRomBufferAfterOr[i]=pRomBufferAfterOr[i]<<1;
         }

		drmKeyFinal[2*i+1]=pRomBufferAfterOr[i]&0xff;
		drmKeyFinal[2*i]=pRomBufferAfterOr[i]>>8;
      }

   MEM_Free(SC_POOL, pRomBuffer);
   MEM_Free(SC_POOL, pRomBufferAfterXor);
   MEM_Free(SC_POOL, pRomBufferAfterOr);
}
static uint8_t localTicker = 1;


UINT8  localGetRapidUpdater(void)
{
	uint8_t result = 0;

	result = (uint8_t) (timing_get_clock() & 0x000000FF);  /* REPLACE_WITH_PLATFORM_DEPENDANT_IMPLEMENTATION if PE_Clips_GetClock() does not update fast enough. */
	result += localTicker;
	localTicker++;

	return result;
}

void localWaitSecond(void)
{
	uint32_t tick = timing_get_clock();//PE_Clips_GetClock();
	uint32_t expire = tick + CLOCKS_PER_SEC;
		
	while (tick < expire)
	{
		tick = timing_get_clock();
	}
}

uint8_t localLoadDrmMemory(DrmMemory *memory)
{
    DrmPackedMemory memoryPacked;
    BOOL returnCode = TRUE;

	PS_LoadDrmMemory((unsigned char *)&memoryPacked,sizeof(DrmPackedMemory));


    if (returnCode == TRUE)
    {
        returnCode = unpackDrmMemory(memoryPacked, memory);
    }
    
    return returnCode;
}

uint8_t localSaveDrmMemory(DrmMemory *memory)
{   
    DrmPackedMemory memoryPacked;
    BOOL returnCode = TRUE;
    
    packDrmMemory(*memory, &memoryPacked);
    
	PS_SaveDrmMemory((unsigned char *)&memoryPacked,sizeof(DrmPackedMemory));


    if (returnCode == TRUE)
    {
        returnCode = unpackDrmMemory(memoryPacked, memory);
    }
	
    return returnCode;
}

uint8_t localGetHardwareKey(uint8_t *hardwareKey)
{
		memcpy(hardwareKey, drmKeyFinal, 32);
		return DRM_ERROR_NONE;
}


#endif // AVI_DRM_SUPPORT

⌨️ 快捷键说明

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