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

📄 hdecoder.c

📁 ct952 source code use for Digital Frame Photo
💻 C
📖 第 1 页 / 共 5 页
字号:
            // 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 + -