📄 hal.c
字号:
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 + -