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

📄 hal.c

📁 ct952 source code use for Digital Frame Photo
💻 C
📖 第 1 页 / 共 5 页
字号:
        DBG_Printf(DBG_THREAD_CHEERDVD, DBG_INFO_PRINTF, "\n# HAL_RESET_SPST");
#endif
        break;

    case    HAL_RESET_AVSPST:
#ifdef  SUPPORT_PRINTF
        DBG_Printf(DBG_THREAD_CHEERDVD, DBG_INFO_PRINTF, "\n# HAL_RESET_AVSPST");
#endif
        // 1. Stop decoder and proc2.
        HAL_PlayCommand(COMMAND_STOP, 0);

        // 2. Stop Source filter.
        SrcFilter_Stop(__dwSFStreamID);

        // 3. Stop Parser.
        HAL_ControlParser(HAL_PARSER_STOP, 0);
        break;
    }
    // Micky2.11a
    if(bType==HAL_RESET_AUDIO || bType==HAL_RESET_AVSPST)
    {
        HAL_ResetAudioDecoder();
        // Micky2.14, below are moved out from HAL_ResetAudioDecoder
        // LLY1.00, set audio sample frequency & channel no for DivX w/ PCM audio stream        // Notice: [1] Must read-back the value first, and only modify [3:0] & [19:16]        //         [2] Must check where to issue the proceudure because the value must be set        //             during DSP reset ~ issue play command.        //         [3] The value will be clear after DSP reset. So, F/W must set it again.        if( (__bAttrPlay==ATTR_AVI) && (__bAudioType == HAL_AUDIO_PCM) )        {
            HAL_SetAudioFrequency(__dwHALAudioFreq);

            // LLY2.55, porting Grievous's code to set audio channel information by write AM directly
            //HAL_SetAudioChannel(__bACHN);
            HAL_WriteAM(HAL_AM_PCM_CH_NUM, __bACHN);

            // Grievous2.60, config bits per sample base on parser given data.
            if(__bBitsPerSample==8)
            {
	            HAL_WriteAM(HAL_AM_PCM_BTYE_PER_SAMPLE, 1); // 8 bits per sample
	        }
	        else
	        {
	            HAL_WriteAM(HAL_AM_PCM_BTYE_PER_SAMPLE, 0); // 16 bits per sample
	        }
        }

        // LLY2.77, disable mechanism while playback AVI: audio STC - STC > 2 sec, audio buffer will be reset
        // Notice: the value will be reset after audio decoder
        if(__bAttrPlay == ATTR_AVI)
        {
            HAL_ControlAVSync(HAL_AVSYNC_2SEC_LIMIT, FALSE);
        }

    }

    // [2-2] Reset Video part
    if(bType==HAL_RESET_VIDEO || bType==HAL_RESET_AVSPST)
    {
        //kevin1.02, avoid thread related potential pitfall (JPEG->MP3 => __bAttrPlay!= MP3, but thread is still in JPEG)
        //if(__bAttrPlay != ATTR_JPG)
        if( !(OS_PeekFlag(&__fThreadInit) & INIT_DEC_THREAD_JPEG_DONE) ) //currently not in JPEG thread
        {
            //fix video flash
//micky0124, HAL_Display(HAL_DISPLAY_ONE_FIELD, 0);
            // must transfer the field control back to display.(in case of someone issue force one field, but doesn't clear it)
            DISP_ForceOneField(FALSE);

            // 1. notify decoder to stop decoding
    		//takes effect at next picture
            COMDEC_Command(MODE_STOP, 0);

            // 2. wait for ACK
            // LLY2.00, collect the waiting ack procedure into a API
            _Wait_Decoder_Stop_CMD_ACK();

            // 1. notify parser to throw bitstream.
            PARSER_ActionFilter( 0, PARSER_ENABLE_VIDEO, FALSE );
            //release CPU resource to other threads
            OS_YieldThread();

            //fix the repeatAB, picture size error
            COMDEC_Command(MODE_UPDATE_SEQ, 0);

            // force to skip B-frame until 2 I/P picture are decoded
            COMDEC_Command(MODE_FORCE_IP, 0);

            // wyc0.85a, don't clear buffer when JPG -> MP3 and CDROM mode.
            if (!(__wDiscType & CDROM_M1) || (__dwClearBuffMode == HAL_CLEAR_SCREEN_MPEG))
            {
                HAL_ReadInfo(HAL_INFO_DISPFRAME_INDEX, &dwCurrentFrame);
                if (dwCurrentFrame == DISP_FRAME0)
                {
                    HAL_ClearScreen(HAL_COLOR_BLACK, HAL_CLEAR_SCREEN_MPEG, HAL_DISP_FRAME1);
                    HAL_ClearScreen(HAL_COLOR_BLACK, HAL_CLEAR_SCREEN_MPEG, HAL_DISP_FRAME2);
                }
                else if (dwCurrentFrame == DISP_FRAME1)
                {
                    // LLY2.21, it's un-necessary to clear frame buffer 0
                    // Since, it use for B-frame, and MPEG decoder will not reference it for next frame.
                    //HAL_ClearScreen(HAL_COLOR_BLACK, HAL_CLEAR_SCREEN_MPEG, HAL_DISP_FRAME0);
                    HAL_ClearScreen(HAL_COLOR_BLACK, HAL_CLEAR_SCREEN_MPEG, HAL_DISP_FRAME2);
                }
                else
                {
                    // LLY2.21, it's un-necessary to clear frame buffer 0
                    // Since, it use for B-frame, and MPEG decoder will not reference it for next frame.
                    //HAL_ClearScreen(HAL_COLOR_BLACK, HAL_CLEAR_SCREEN_MPEG, HAL_DISP_FRAME0);
                    HAL_ClearScreen(HAL_COLOR_BLACK, HAL_CLEAR_SCREEN_MPEG, HAL_DISP_FRAME1);
                }
            }
        }
        else
        {
            // 1. notify parser to throw bitstream.
            PARSER_ActionFilter( 0, PARSER_ENABLE_VIDEO, FALSE );
            //release CPU resource to other threads
            OS_YieldThread();

            HALJPEG_Abort();
        }

        // 3. notify parser to clear write ptr.
        PARSER_BufferReset( PARSER_ES_VIDEO );

    }

    // [2-3] Reset SPST part
    if(bType==HAL_RESET_SPST || bType==HAL_RESET_AVSPST)
    {
        DISP_DisplayCtrl(DISP_SP1, FALSE);
        DISP_DisplayCtrl(DISP_SP2, FALSE);
        SPU_Reset(__dwSPType);
        // Micky0.68, reset SP buffer
        PARSER_BufferReset( PARSER_ES_SP1 );
        PARSER_BufferReset( PARSER_ES_SP2 );

//Alan1.11, for char-based subpicture
#ifdef  SUPPORT_CHAR_SUBPICTURE
        CHAR_SP_Reset();
#endif  // #ifdef SUPPORT_CHAR_SUBPICTURE
    }


    // Step 3: Restore to normal state.
    // [3-1] Recover audio part
#ifndef NO_PROC2
    if(bType==HAL_RESET_AUDIO || bType==HAL_RESET_AVSPST)
    {
        if (__wHALAVIDRHigh & 0x0008) //kevin0.70, bit[3]
        {
            // 6. notify parser not to throw bitstream.
            PARSER_ActionFilter( 0, PARSER_ENABLE_AUDIO, TRUE );
        }
    }
#endif  // #ifndef NO_PROC2

    // [3-2] Recover video part
    if(bType==HAL_RESET_VIDEO || bType==HAL_RESET_AVSPST)
    {
        if (__wHALAVIDRHigh & 0x0004) //kevin0.70, bit[2]
        {
            // 6. notify parser not to throw bitstream.
            PARSER_ActionFilter( 0, PARSER_ENABLE_VIDEO, TRUE );
        }
    }

    // [3-3] Recover SPST part
    if(bType==HAL_RESET_SPST || bType==HAL_RESET_AVSPST)
    {
        // Only turn on sp while nobody set sp off -- LLY0.81
        // Otherwise, SP will appear after call HAL_RESET_SPST
        // __bSP_Disp_OFF: 1 ~ 127 means sp off
        //                 0, 128 ~ 255 means sp on
        if( (__bSP_Disp_OFF==0) || (__bSP_Disp_OFF&0x80) )
        {
            DISP_DisplayCtrl(DISP_SP1, TRUE);
        }
        //kevin0.91
        if( (__bSP2_Disp_OFF==0) || (__bSP2_Disp_OFF&0x80) )
        {
            DISP_DisplayCtrl(DISP_SP2, TRUE);
        }
    }
}



//************************************************************************
// Description  :   Issue Playable Command to Video/Audio decoders
// Argument     :   bCmdID: command ID
//                  bParam: slow factor 1~5 for COMMAND_SLOW; otherwise, NULL
// Return       :   None
// Side Effect  :   None
//************************************************************************
void    HAL_PlayCommand(BYTE bCmdID, BYTE bParam) //test OK
{
#ifdef SUPPORT_JPEG_AUDIO_PLAYING
    if (__bMMJPEGAudioMode)
    {
        if (bCmdID == COMMAND_STOP)
            return;
    }
    else
#endif //SUPPORT_JPEG_AUDIO_PLAYING
    {
        // LLY0.66, don't issue MPEG decoder relative command while playback JPEG
        if(__bAttrPlay == ATTR_JPG)
            return;
    }

    switch (bCmdID)
    {
        case COMMAND_PLAY:
            COMDEC_Command(MODE_PLAY, 0);
            HAL_WriteAM(HAL_AM_PLAY_COMMAND, 1);
            CHIPS_OpenAudio(TRUE); //kevin1.20, fix command switch bo noise
            break;

        case COMMAND_FREEZE:
            CHIPS_OpenAudio(FALSE); //kevin1.20, fix command switch bo noise
            COMDEC_Command(MODE_FREEZE, 0);
            HAL_WriteAM(HAL_AM_PLAY_COMMAND, 1);
            break;

        case COMMAND_PAUSE:
            CHIPS_OpenAudio(FALSE); //kevin1.20, fix command switch bo noise
            COMDEC_Command(MODE_PAUSE, 0);
            HAL_WriteAM(HAL_AM_PLAY_COMMAND, 6);
            break;

        case COMMAND_STOP:
            CHIPS_OpenAudio(FALSE); //kevin1.20, fix command switch bo noise

            COMDEC_Command(MODE_STOP, 0);
            // LLY2.00, collect the waiting ack procedure into a API
            _Wait_Decoder_Stop_CMD_ACK();

            HAL_WriteAM(HAL_AM_PLAY_COMMAND, 0);
            break;

        case COMMAND_STEP:
            CHIPS_OpenAudio(FALSE); //kevin1.20, fix command switch bo noise
            COMDEC_Command(MODE_STEP, 0);
            //upper layer has to issue "skip the corresponding audio frames"
            HAL_WriteAM(HAL_AM_PLAY_COMMAND, 5); //kevin0.69, Audio will throw data(m/n) by decoder.
            break;

        case COMMAND_FAST:
            CHIPS_OpenAudio(FALSE); //kevin1.20, fix command switch bo noise
            COMDEC_Command(MODE_FF, 0); //IP, switch DISP by Decoder
            //upper layer has to issue "skip the corresponding audio frames"
            HAL_WriteAM(HAL_AM_PLAY_COMMAND, 5); //kevin0.69, Audio will throw data(m/n) by decoder.
            break;

        case COMMAND_SLOW:
            CHIPS_OpenAudio(FALSE); //kevin1.20, fix command switch bo noise
            bParam = bParam * 2;
            COMDEC_Command(MODE_SF, bParam); //IP, switch DISP by Decoder
            //upper layer has to issue "skip the corresponding audio frames"
            HAL_WriteAM(HAL_AM_PLAY_COMMAND, 5); //kevin0.69, Audio will throw data(m/n) by decoder.
            break;

        case COMMAND_SCAN:
            CHIPS_OpenAudio(FALSE); //kevin1.20, fix command switch bo noise
            COMDEC_Command(MODE_SCAN, 0); //IP, switch DISP by Decoder
            //upper layer has to issue "throw audio"
            HAL_WriteAM(HAL_AM_PLAY_COMMAND, 0);
            //wait if (__dwPlayMode == MODE_SCAN_DONE) by upper layer
            break;

        case COMMAND_DIGEST: //behavior???
#ifdef NO_PIP
            COMDEC_Command(MODE_SCAN, 1); //I, switch DISP by Digest
            //upper layer has to issue "?"
            HAL_ControlParser(HAL_PARSER_AUDIO_ID, HAL_THROW_AUDIO);            HAL_Reset(HAL_RESET_AUDIO);            HAL_WriteAM(HAL_AM_PLAY_COMMAND, 0);   //Alan1.10 for digest audio
#else
            // Chuan0.70, Issue FF_IP CMD and stop Audio.
            COMDEC_Command(MODE_FF, 1); //IP, switch DISP by Digest
            //upper layer has to issue "?"
            HAL_WriteAM(HAL_AM_PLAY_COMMAND, 1);   //Alan1.10 for digest audio
            CHIPS_OpenAudio(TRUE); //kevin1.20, fix command switch bo noise
#endif
            break;
//Micky2.04, add more interfaces
        case    COMMAND_V_UPDATE_SEQ:
            COMDEC_Command(MODE_UPDATE_SEQ, 0);
            break;
        case    COMMAND_V_PREDECODE:
            COMDEC_Command(MODE_PREDECODE, bParam);
            break;
        case    COMMAND_V_CLEAR_STILL:
            COMDEC_Command(MODE_CLEAR_STILL, 0);
            break;
        case    COMMAND_V_RELEASE_MODE:
            COMDEC_Command(MODE_RELEASE_MODE, bParam);
            break;
        case    COMMAND_V_ERROR_RATIO:
            COMDEC_Command(MODE_ERROR_RATIO, bParam);
            break;

    }
}


// wyc1.20-909, change bID from BYTE to DWORD because PARSER_ChangeID use DWORD as parameter.
//  *****************************************************************************************
//  Function    :   HAL_ControlParser
//  Description :   Use to control parser as desired action
//  Arguments   :   bPackType, specify the desired parser action
//                  bID, specify the desired ID
//  Return      :   TRUE, the action is success
//                  FALSE, the action is fail
//  *****************************************************************************************
// LLY2.36, add return value to tell caller the desired action is ok or fail
//void    HAL_ControlParser(BYTE bPacketType, DWORD bID)
BYTE    HAL_ControlParser(BYTE bPacketType, DWORD bID)
{
    DWORD dwTimer, dwTemp=0;
    switch(bPacketType)
    {
        case    HAL_PARSER_STOP:
            PARSER_Command(0, PARSER_CMD_STOP, 0);
            dwTimer=OS_GetSysTimer();
            while( (OS_GetSysTimer() - dwTimer) < COUNT_50_MSEC)
            {
                dwTemp=PARSER_QueryEvent(0, PARSER_EVENT_COMPLETED, TRUE);//FALSE);

                // Parser stop command ok
                if(dwTemp)
                {
                    break;
                }

                // release the CPU
                OS_YieldThread();
            }

            // Parser stop command fail
            if(!dwTemp)
            {
                DBG_Printf(DBG_THREAD_CHEERDVD, DBG_INFO_PRINTF, "Parser stop fail\n");
                return FALSE;
            }
            return TRUE;

        case    HAL_PARSER_VIDEO_ID:
            if(bID == HAL_THROW_VIDEO)
            {
                __wHALAVIDRHigh &= ~0x0004; //kevin0.70, bit[2]
                PARSER_ActionFilter( 0, PARSER_ENABLE_VIDEO, FALSE );
            }
            else
            {
                // LLY0.72, don't specify packet ID for AVI/ DivX file.
                if(__bAttrPlay == ATTR_AVI)
                {
                    PARSER_ChangeID(0, PARSER_ES_VIDEO, bID);
                }
                else
                {

⌨️ 快捷键说明

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