📄 hdecoder.c
字号:
// Always set as parser suggest value for minimun audio buffer size // while the value calculated base on A/V ratio is less than it if( (AVI_AV_BUF_LEN-dwVBufSize) > dwMinABufSize) { dwMinABufSize = AVI_AV_BUF_LEN - dwVBufSize; } else { dwVBufSize = AVI_AV_BUF_LEN - dwMinABufSize;#ifdef DEBUG_AVI_BUFFER_RATIO DBG_Printf(DBG_THREAD_CHEERDVD, DBG_INFO_PRINTF, "Keep suggest ABuf size: %lx, and re-get VBuf size: %lx\n", dwMinABufSize, dwVBufSize);#endif // #ifdef DEBUG_AVI_BUFFER_RATIO } } // Step 6: do error checking for total A/V buffer size > pre-reserved space. // Then, can calculate the desired audio buffer end address. if((dwVBufSize + dwMinABufSize) > AVI_AV_BUF_LEN) { DBG_Printf(DBG_THREAD_CHEERDVD, DBG_INFO_PRINTF, "Reduce A/V since video end > pre-define\n"); dwMinABufSize = (AVI_AV_BUF_LEN - (AVI_AV_BUF_LEN * bVRatio/100)); // Let min audio size be 0x200 alignment (512 byte) if(dwMinABufSize%0x200) { dwMinABufSize = ((dwMinABufSize/0x200)+1)*0x200; } dwVBufSize = AVI_AV_BUF_LEN - dwMinABufSize; }#endif // #ifdef PARTITION_JUST_ON_AV_RATIO // Step 7: Calculate final A/V buffer start/end address pBitsBuf_Addr->dwA0Start = DS_AD0BUF_ST_AVI; pBitsBuf_Addr->dwA0End = DS_AD0BUF_ST_AVI + dwMinABufSize - dwABuf1Size; pBitsBuf_Addr->dwA1Start = DS_AD0BUF_ST_AVI + dwMinABufSize - dwABuf1Size; pBitsBuf_Addr->dwA1End = DS_AD0BUF_ST_AVI + dwMinABufSize; pBitsBuf_Addr->dwVStart = DS_VDBUF_END_AVI - dwVBufSize; pBitsBuf_Addr->dwVEnd = DS_VDBUF_END_AVI; }#ifdef DEBUG_AVI_BUFFER_RATIO DBG_Printf(DBG_THREAD_CHEERDVD, DBG_INFO_PRINTF, "VRatio: %lx\n", bVRatio); DBG_Printf(DBG_THREAD_CHEERDVD, DBG_INFO_PRINTF, "A0: %lx - %lx; A1: %lx - %lx; V: %lx - %lx\n", pBitsBuf_Addr->dwA0Start, pBitsBuf_Addr->dwA0End, pBitsBuf_Addr->dwA1Start, pBitsBuf_Addr->dwA1End, pBitsBuf_Addr->dwVStart, pBitsBuf_Addr->dwVEnd);#endif // #ifdef DEBUG_AVI_BUFFER_RATIO}#endif // #ifdef SET_AVI_BITS_BUFFER_BY_RATIO// LLY2.01, collect audio buffer setting procedure into a API// ************************************************************************// Function : Set audio buffer related thing,// ex. audio buffer0/ 1 address, PCM buffer ...// Arguments : bMediaAttr, specify the media format// bMode, specify desired buffer mode// Return : None// Side Effect :// ************************************************************************void HAL_SetAudio_Buffer(BYTE bMediaAttr, BYTE bMode){ DWORD dwSaveInt; // Add protection code to check input mode is valid if(bMode>HAL_AUDIOBUF_END || bMode<HAL_AUDIOBUF_BEGIN) { DBG_Printf(DBG_THREAD_CHEERDVD, DBG_INFO_PRINTF, "Err: audio buffer mode is invalid: %lx", bMode); } // LLY2.04, using macro to set AIU uppacker0/1 related address // Notice: it's un-necessary to set read address so remove it. // LLY2.04, remove setting for AIU uppacker0/1 read channel read address // ex. REG_MCU_ACR09/ REG_MCU_ACR11 // Since, it will be handled by PROC2 if(bMediaAttr == ATTR_AVI) //AVI/DivX { // Notice: MPEG/ MP3 audio bytpe will use two different audio buffer. // ie. buffer 1 is handle by PROC1, buffer 2 is handle by PROC2 // Others will use same audio buffer, and buffer size = buffer 1 + buffer 2 // ie. buffer 1 and buffer 2 are all handle by PROC1#ifdef SET_AVI_BITS_BUFFER_BY_RATIO BITS_BUF_ADDR sBitsBufAddr; // LLY2.35, call API to calculate desired AVI audio buffer HAL_Cal_BitsAddr(&sBitsBufAddr); // LLY2.35, only WMA will use two audio buffer#ifndef USE_1BUFF_ONLY_FOR_AUDIO if( (bMode==HAL_AUDIOBUF_WMA)#ifdef USE_2BUFF_FOR_MPEG_AUDIO || (bMode==HAL_AUDIOBUF_MPG) || (bMode==HAL_AUDIOBUF_MP3)#endif // #ifdef USE_2BUFF_FOR_MPEG_AUDIO ) { PARSER_SetOutBufferAddress( PARSER_ES_AUDIO, sBitsBufAddr.dwA0Start, sBitsBufAddr.dwA0End); //set audio buffer/ audio buffer2 start and length MACRO_MCU_SET_AIU_UNPACKER0_READ_BUFFER(sBitsBufAddr.dwA0Start, sBitsBufAddr.dwA0End, sBitsBufAddr.dwA0Start); MACRO_MCU_SET_AIU_UNPACKER1_READ_BUFFER(sBitsBufAddr.dwA1Start, sBitsBufAddr.dwA1End, sBitsBufAddr.dwA1Start);#ifdef DEBUG_AVI_BUFFER_RATIO DBG_Printf(DBG_THREAD_CHEERDVD, DBG_INFO_PRINTF, "A0: %lx - %lx; A1: %lx - %lx\n", sBitsBufAddr.dwA0Start, sBitsBufAddr.dwA0End, sBitsBufAddr.dwA1Start, sBitsBufAddr.dwA1End);#endif // #ifdef DEBUG_AVI_BUFFER_RATIO } else#endif // #ifndef USE_1BUFF_ONLY_FOR_AUDIO { PARSER_SetOutBufferAddress( PARSER_ES_AUDIO, sBitsBufAddr.dwA0Start, sBitsBufAddr.dwA1End ); //set audio buffer/ audio buffer2 start and length MACRO_MCU_SET_AIU_UNPACKER0_READ_BUFFER(sBitsBufAddr.dwA0Start, sBitsBufAddr.dwA1End, sBitsBufAddr.dwA0Start); MACRO_MCU_SET_AIU_UNPACKER1_READ_BUFFER(sBitsBufAddr.dwA0Start, sBitsBufAddr.dwA1End, sBitsBufAddr.dwA0Start);#ifdef DEBUG_AVI_BUFFER_RATIO DBG_Printf(DBG_THREAD_CHEERDVD, DBG_INFO_PRINTF, "A0: %lx - %lx; A1: %lx - %lx\n", sBitsBufAddr.dwA0Start, sBitsBufAddr.dwA1End, sBitsBufAddr.dwA0Start, sBitsBufAddr.dwA1End);#endif // #ifdef DEBUG_AVI_BUFFER_RATIO }#else // #ifdef SET_AVI_BITS_BUFFER_BY_RATIO // LLY2.35, only WMA will use two audio buffer#ifndef USE_1BUFF_ONLY_FOR_AUDIO if( (bMode==HAL_AUDIOBUF_WMA)#ifdef USE_2BUFF_FOR_MPEG_AUDIO || (bMode==HAL_AUDIOBUF_MPG) || (bMode==HAL_AUDIOBUF_MP3)#endif // #ifdef USE_2BUFF_FOR_MPEG_AUDIO ) { PARSER_SetOutBufferAddress( PARSER_ES_AUDIO, DS_AD0BUF_ST_AVI, DS_AD0BUF_END_AVI ); //set audio buffer/ audio buffer2 start and length MACRO_MCU_SET_AIU_UNPACKER0_READ_BUFFER(DS_AD0BUF_ST_AVI, DS_AD0BUF_END_AVI, DS_AD0BUF_ST_AVI); MACRO_MCU_SET_AIU_UNPACKER1_READ_BUFFER(DS_AD1BUF_ST_AVI, DS_AD1BUF_END_AVI, DS_AD1BUF_ST_AVI); } else#endif // #ifndef USE_1BUFF_ONLY_FOR_AUDIO { PARSER_SetOutBufferAddress( PARSER_ES_AUDIO, DS_AD0BUF_ST_AVI, DS_AD1BUF_END_AVI ); //set audio buffer/ audio buffer2 start and length MACRO_MCU_SET_AIU_UNPACKER0_READ_BUFFER(DS_AD0BUF_ST_AVI, DS_AD1BUF_END_AVI, DS_AD0BUF_ST_AVI); MACRO_MCU_SET_AIU_UNPACKER1_READ_BUFFER(DS_AD0BUF_ST_AVI, DS_AD1BUF_END_AVI, DS_AD0BUF_ST_AVI); }#endif // #ifdef SET_AVI_BITS_BUFFER_BY_RATIO } // LLY2.21a, let CDDA go normal case. else if(bMediaAttr & TYPE_CDROM_AUDIO)// || bMediaAttr==ATTR_CDDA) //.MP3/.MP2/.WMA/CDDA/CD-DTS { // Notice: MPEG/ MP3 audio bytpe will use two different audio buffer. // ie. buffer 1 is handle by PROC1, buffer 2 is handle by PROC2 // Others will use same audio buffer, and buffer size = buffer 1 + buffer 2 // ie. buffer 1 and buffer 2 are all handle by PROC1 // LLY2.35, only WMA will use two audio buffer#ifndef USE_1BUFF_ONLY_FOR_AUDIO if( (bMode==HAL_AUDIOBUF_WMA)#ifdef USE_2BUFF_FOR_MPEG_AUDIO || (bMode==HAL_AUDIOBUF_MPG) || (bMode==HAL_AUDIOBUF_MP3)#endif // #ifdef USE_2BUFF_FOR_MPEG_AUDIO ) { PARSER_SetOutBufferAddress( PARSER_ES_AUDIO, DS_AD0BUF_ST_MM, DS_AD0BUF_END_MM ); //set audio buffer/ audio buffer2 start and length MACRO_MCU_SET_AIU_UNPACKER0_READ_BUFFER(DS_AD0BUF_ST_MM, DS_AD0BUF_END_MM, DS_AD0BUF_ST_MM); MACRO_MCU_SET_AIU_UNPACKER1_READ_BUFFER(DS_AD1BUF_ST_MM, DS_AD1BUF_END_MM, DS_AD1BUF_ST_MM); } else#endif // #ifndef USE_1BUFF_ONLY_FOR_AUDIO { PARSER_SetOutBufferAddress( PARSER_ES_AUDIO, DS_AD0BUF_ST_MM, DS_AD1BUF_END_MM ); //set audio buffer/ audio buffer2 start and length MACRO_MCU_SET_AIU_UNPACKER0_READ_BUFFER(DS_AD0BUF_ST_MM, DS_AD1BUF_END_MM, DS_AD0BUF_ST_MM); MACRO_MCU_SET_AIU_UNPACKER1_READ_BUFFER(DS_AD0BUF_ST_MM, DS_AD1BUF_END_MM, DS_AD0BUF_ST_MM); } } // LLY2.01, add CDROM/ DVDROM motion case except AVI else if(bMediaAttr & TYPE_CDROM_AV) // LLY2.10, correct it as TYPE_CDROM_AV { // Notice: MPEG/ MP3 audio bytpe will use two different audio buffer. // ie. buffer 1 is handle by PROC1, buffer 2 is handle by PROC2 // Others will use same audio buffer, and buffer size = buffer 1 + buffer 2 // ie. buffer 1 and buffer 2 are all handle by PROC1 // LLY2.35, only WMA will use two audio buffer#ifndef USE_1BUFF_ONLY_FOR_AUDIO if( (bMode==HAL_AUDIOBUF_WMA)#ifdef USE_2BUFF_FOR_MPEG_AUDIO || (bMode==HAL_AUDIOBUF_MPG) || (bMode==HAL_AUDIOBUF_MP3)#endif // #ifdef USE_2BUFF_FOR_MPEG_AUDIO ) { PARSER_SetOutBufferAddress( PARSER_ES_AUDIO, DS_AD0BUF_ST_MM_MOTION, DS_AD0BUF_END_MM_MOTION ); //set audio buffer/ audio buffer2 start and length MACRO_MCU_SET_AIU_UNPACKER0_READ_BUFFER(DS_AD0BUF_ST_MM_MOTION, DS_AD0BUF_END_MM_MOTION, DS_AD0BUF_ST_MM_MOTION); MACRO_MCU_SET_AIU_UNPACKER1_READ_BUFFER(DS_AD1BUF_ST_MM_MOTION, DS_AD1BUF_END_MM_MOTION, DS_AD1BUF_ST_MM_MOTION); } else#endif // #ifndef USE_1BUFF_ONLY_FOR_AUDIO { PARSER_SetOutBufferAddress( PARSER_ES_AUDIO, DS_AD0BUF_ST_MM_MOTION, DS_AD1BUF_END_MM_MOTION ); //set audio buffer/ audio buffer2 start and length MACRO_MCU_SET_AIU_UNPACKER0_READ_BUFFER(DS_AD0BUF_ST_MM_MOTION, DS_AD1BUF_END_MM_MOTION, DS_AD0BUF_ST_MM_MOTION); MACRO_MCU_SET_AIU_UNPACKER1_READ_BUFFER(DS_AD0BUF_ST_MM_MOTION, DS_AD1BUF_END_MM_MOTION, DS_AD0BUF_ST_MM_MOTION); } } else //DVD/VCD { // LLY2.35, only WMA will use two audio buffer#ifndef USE_1BUFF_ONLY_FOR_AUDIO if( (bMode==HAL_AUDIOBUF_WMA)#ifdef USE_2BUFF_FOR_MPEG_AUDIO || (bMode==HAL_AUDIOBUF_MPG) || (bMode==HAL_AUDIOBUF_MP3)#endif // #ifdef USE_2BUFF_FOR_MPEG_AUDIO ) { PARSER_SetOutBufferAddress( PARSER_ES_AUDIO, DS_AD0BUF_ST, DS_AD0BUF_END ); //set audio buffer/ audio buffer2 start and length MACRO_MCU_SET_AIU_UNPACKER0_READ_BUFFER(DS_AD0BUF_ST, DS_AD0BUF_END, DS_AD0BUF_ST); MACRO_MCU_SET_AIU_UNPACKER1_READ_BUFFER(DS_AD1BUF_ST, DS_AD1BUF_END, DS_AD1BUF_ST); } else // AC3 or DTS or LPCM#endif // #ifndef USE_1BUFF_ONLY_FOR_AUDIO { PARSER_SetOutBufferAddress( PARSER_ES_AUDIO, DS_AD0BUF_ST, DS_AD1BUF_END ); //set audio buffer/ audio buffer2 start and length MACRO_MCU_SET_AIU_UNPACKER0_READ_BUFFER(DS_AD0BUF_ST, DS_AD1BUF_END, DS_AD0BUF_ST); MACRO_MCU_SET_AIU_UNPACKER1_READ_BUFFER(DS_AD0BUF_ST, DS_AD1BUF_END, DS_AD0BUF_ST); } } //set PCM buffer address HAL_WriteAM( HAL_AM_PCMBUF_ADR, DS_PCMBUF_ST); HAL_WriteAM( HAL_AM_PCMBUF_LEN, (DS_PCMBUF_END-DS_PCMBUF_ST)>>11); //keep the Audio buffer size __dwHALABUFFSIZE = (REG_MCU_ACR0A-REG_MCU_ACR0B+DATA_WIDTH)>>2; // Chuan0.80a, Set the threshold: 5/6 buffer size. Unit: 64 bits. // HAL_WriteAM(HAL_AM_SKIP_THRESHOLD, (__dwHALABUFFSIZE*5/6/2)); // Chuan2.17, 909R: Unit: 32 bits * 16 // Notice: must use >= 20060512 audio code // J500KWShih_220, to adjest the threshold for parser temporary space (0x1000) // LLY2.21, reference parser define directly (unit is BYTE) // Notice: it's un-necessary to do 5/6 buffer size since parser has done for it. //HAL_WriteAM(HAL_AM_SKIP_THRESHOLD, (__dwHALABUFFSIZE*5/6/16)); HAL_WriteAM(HAL_AM_SKIP_THRESHOLD, ((__dwHALABUFFSIZE-(PARSER_AUDIO_BUF_GAP/4))/16)); OS_DISABLE_INTERRUPTS( dwSaveInt ); MACRO_PLAT_KEY_LOCK( ); // LLY2.35, only WMA will use two audio buffer#ifndef USE_1BUFF_ONLY_FOR_AUDIO if( (bMode==HAL_AUDIOBUF_WMA)#ifdef USE_2BUFF_FOR_MPEG_AUDIO || (bMode==HAL_AUDIOBUF_MPG) || (bMode==HAL_AUDIOBUF_MP3)#endif // #ifdef USE_2BUFF_FOR_MPEG_AUDIO ) { // Need double check with HHShih ??? REG_MCU_AUDIO_REMCTL = (REG_MCU_AUDIO_REMCTL & ~0x3000) | 0x2000; // clear bit[13:12] _bHALABuf2Def = TRUE; } else#endif // #ifndef USE_1BUFF_ONLY_FOR_AUDIO { // Non-MPEG mode PROC1 will use two audio buffer (buffer 0 for normal, buffer 1 for SPDIF) // So, we must set audio buffer 1 write channel select as BIU mode, ie. disable PROC2 access // And, enable the remain control flag. REG_MCU_AUDIO_REMCTL &= ~0x3000; // clear bit[13:12] REG_MCU_REMEN |= MCU_REMAINDER_ENABLE_AUDIO_BUF1; //hhshih _bHALABuf2Def = FALSE; } MACRO_PLAT_KEY_UNLOCK( ); OS_RESTORE_INTERRUPTS( dwSaveInt );}// ************************************************************************// Function : Set video buffer related thing,// Arguments : bMode, specify desired buffer mode// Return : None// Side Effect :// ************************************************************************void HAL_SetVideo_Buffer(BYTE bMode){ // Add protection code to check input mode is valid if(bMode>HAL_VIDEOBUF_END || bMode<HAL_VIDEOBUF_BEGIN) { DBG_Printf(DBG_THREAD_CHEERDVD, DBG_INFO_PRINTF, "Err: video buffer mode is invalid: %lx", bMode); } if(bMode == HAL_VIDEOBUF_NORMAL) { MACRO_MCU_SET_VLD_READ_BUFFER(DS_VDBUF_ST, DS_VDBUF_END, DS_VDBUF_ST); PARSER_SetOutBufferAddress( PARSER_ES_VIDEO, DS_VDBUF_ST, DS_VDBUF_END ); } else if(bMode == HAL_VIDEOBUF_AVI) {#ifdef SET_AVI_BITS_BUFFER_BY_RATIO BITS_BUF_ADDR sBitsBufAddr; // LLY2.35, call API to calcuate video buffer size HAL_Cal_BitsAddr(&sBitsBufAddr); MACRO_MCU_SET_VLD_READ_BUFFER(sBitsBufAddr.dwVStart, sBitsBufAddr.dwVEnd, sBitsBufAddr.dwVStart); PARSER_SetOutBufferAddress( PARSER_ES_VIDEO, sBitsBufAddr.dwVStart, sBitsBufAddr.dwVEnd );#ifdef DEBUG_AVI_BUFFER_RATIO DBG_Printf(DBG_THREAD_CHEERDVD, DBG_INFO_PRINTF, "VAddr: %lx - %lx\n", sBitsBufAddr.dwVStart, sBitsBufAddr.dwVEnd);#endif // #ifdef DEBUG_AVI_BUFFER_RATIO#else // #ifdef SET_AVI_BITS_BUFFER_BY_RATIO MACRO_MCU_SET_VLD_READ_BUFFER(DS_VDBUF_ST_AVI, DS_VDBUF_END_AVI, DS_VDBUF_ST_AVI); PARSER_SetOutBufferAddress( PARSER_ES_VIDEO, DS_VDBUF_ST_AVI, DS_VDBUF_END_AVI );#endif // #ifdef SET_AVI_BITS_BUFFER_BY_RATIO } else if(bMode == HAL_VIDEOBUF_MM_MOTION) { MACRO_MCU_SET_VLD_READ_BUFFER(DS_VDBUF_ST_MM_MOTION, DS_VDBUF_END_MM_MOTION, DS_VDBUF_ST_MM_MOTION); PARSER_SetOutBufferAddress( PARSER_ES_VIDEO, DS_VDBUF_ST_MM_MOTION, DS_VDBUF_END_MM_MOTION ); } else if(bMode == HAL_VIDEOBUF_MM) { MACRO_MCU_SET_VLD_READ_BUFFER(DS_VDBUF_ST_MM, DS_VDBUF_END_MM, DS_VDBUF_ST_MM); PARSER_SetOutBufferAddress( PARSER_ES_VIDEO, DS_VDBUF_ST_MM, DS_VDBUF_END_MM ); }}//*****************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -