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

📄 hw_init.c

📁 这是DVD中伺服部分的核心代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/************************************************************************/
/************************************************************************/
/**                                                                    **/
/************************************************************************/
/************************************************************************/
void start_dvd(UBYTE still_val, UBYTE spstn, UBYTE *sp_plt, UBYTE astn, UBYTE *a_atr, UBYTE *v_atr)
{
    PE_ISTREAMCTRL_AUDIO_ATTRIBUTES audio_attributes;
    PE_ISTREAMCTRL_STATE            tPEState;

    DBGPRINT(DBG_ON(DBG_TRACE), ("start_dvd()\n"));

    /* Get the PE run state */
    PEiStreamCtrlGetState(tPE, &tPEState);

    /* If PE is not stopped, do it now.  Video demux cannot be configure while running. */
    if (tPEState == PE_ISTREAMCTRL_STATE_RUN)
    {
        /* stop the decoder */
        PEiStreamCtrlStop(tPE, TRUE);
    }

    /* stop spu decode */
    stop_spu();

    /* Disable SPU processing */
    spu_set_id(0);

    /* initialize the SPU palette */
    PEiConfigureSetSubPicPalette(tPE, (PE_ICONFIGURE_SPU_PALETTE*)sp_plt, 48);

    /* Start SPU processing if available */
    if (spstn & SPU_STREAM_AVAILABLE)
    {
        /* enable SPU stream processing and set SPU stream number */
        spu_set_id( (UCHAR)(spstn | SPU_SUBSTREAM_ID) );

        /* start the SPU decoder just after channel reset */
        pause_spu();
    }

    /* re-config video mode if it has changed */
    if ( ((video_mode[0])        != (v_atr[0])        ) ||
         ((video_mode[1] & 0x3c) != (v_atr[1] & 0x3c) ) ||
         TV_Type_Changed                                 )
    {
        /* updated video mode */
        TV_Type_Changed    = 0;
        temp_video_mode[0] = v_atr[0];
        temp_video_mode[1] = v_atr[1];
        modify_video_mode  = 1;

        switch (v_atr[0] & VIDEO_COMPRESSION)
        {
        case MPEG_1_COMPLIENT:
            if (PEiStreamCtrlDemuxAddVideoPS(tPE, VIDEO_PES_ID, INPUT_MAIN, VIDEO_TYPE_MPEG1) != PE_SUCCESS)
            {
                DBGPRINT(DBG_ON(DBG_ERROR), ("%s:%u - PEiStreamCtrlDemuxAddVideoPS FAILED\n", __FILE__, __LINE__));
            }
            break;
        case MPEG_2_COMPLIENT:
            if (PEiStreamCtrlDemuxAddVideoPS(tPE, VIDEO_PES_ID, INPUT_MAIN, VIDEO_TYPE_MPEG2) != PE_SUCCESS)
            {
                DBGPRINT(DBG_ON(DBG_ERROR), ("%s:%u - PEiStreamCtrlDemuxAddVideoPS FAILED\n", __FILE__, __LINE__));
            }
            break;
        }

        switch (v_atr[1] & PICTURE_RESOLUTION)
        {
        case RESOLUTION_0:
            if ( (v_atr[0] & TV_SYSTEM) == TV_525_60 )
            {
                DBGPRINT(DBG_ON(DBG_TRACE), ("start_dvd: 720x480\n"));
                PEiStreamCtrlSetVideoSrcResolution(tPE, 720, 480);
            }
            else
            {
                DBGPRINT(DBG_ON(DBG_TRACE), ("start_dvd: 720x576\n"));
                PEiStreamCtrlSetVideoSrcResolution(tPE, 720, 576);
            }
            break;
        case RESOLUTION_1:
            if ( (v_atr[0] & TV_SYSTEM) == TV_525_60 )
            {
                DBGPRINT(DBG_ON(DBG_TRACE), ("start_dvd: 704x480\n"));
                PEiStreamCtrlSetVideoSrcResolution(tPE, 720, 480); /* 704 x 480 */
            }
            else
            {
                DBGPRINT(DBG_ON(DBG_TRACE), ("start_dvd: 704x576\n"));
                PEiStreamCtrlSetVideoSrcResolution(tPE, 720, 576); /* 704 x 576 */
            }
            break;
        case RESOLUTION_2:
            if ( (v_atr[0] & TV_SYSTEM) == TV_525_60 )
            {
                DBGPRINT(DBG_ON(DBG_TRACE), ("start_dvd: 352x480\n"));
                PEiStreamCtrlSetVideoSrcResolution(tPE, 720, 480); /* 352 x 480 */
            }
            else
            {
                DBGPRINT(DBG_ON(DBG_TRACE), ("start_dvd: 352x576\n"));
                PEiStreamCtrlSetVideoSrcResolution(tPE, 720, 576); /* 352 x 576 */
            }
            break;
        case RESOLUTION_3:
            if ( (v_atr[0] & TV_SYSTEM) == TV_525_60 )
            {
                DBGPRINT(DBG_ON(DBG_TRACE), ("start_dvd: 352x240\n"));
                PEiStreamCtrlSetVideoSrcResolution(tPE, 720, 480); /* 352 x 240 */
            }
            else
            {
                DBGPRINT(DBG_ON(DBG_TRACE), ("start_dvd: 352x288\n"));
                PEiStreamCtrlSetVideoSrcResolution(tPE, 720, 576); /* 352 x 288 */
            }
            break;
        default:
            DbgPrint(("start_dvd: Invalid PICTURE_RESOLUTION\n"));
            break;
        }
    }

    if (nav_state != FAST_FORWARD)
    {
        if (pgc_domain == TT_PGC)
        {
            nav_state = NORMAL_PLAYING;
        }
    }

    highlight_expire = cell_still_expire = button_sl_expire = pgc_still_expire = 0xffffffff;

    num_of_times = vobu_button_hl = 0;

    /* setup the audio demux here based on the astn (audio stream number (PID)) and the audio format */
    switch (a_atr[0] & AUDIO_CODING)
    {
    case AC_3_CODING:

        /* parse the audio attributes info from the vmgi_mat */
        get_audio_attributes(&audio_attributes);

        /* configure for AC3 audio */
        if (PEiStreamCtrlDemuxAddAudioPS(tPE, PRIVATE_STREAM_1, (AC3_SUB_ID | astn), INPUT_MAIN, AUDIO_TYPE_AC3, &audio_attributes) != PE_SUCCESS)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("%s:%u - PEiStreamCtrlDemuxAddAudioPS FAILED\n", __FILE__, __LINE__));
        }
        break;

    case MPEG_1_2_CODING:

        /* parse the audio attributes info from the vmgi_mat */
        get_audio_attributes(&audio_attributes);

        /* configure for MPEG audio */
        if (PEiStreamCtrlDemuxAddAudioPS(tPE, (MPEG_1_2_AUDIO_PES_ID | astn), NO_SUB_ID, INPUT_MAIN, AUDIO_TYPE_MPEG1, &audio_attributes) != PE_SUCCESS)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("%s:%u - PEiStreamCtrlDemuxAddAudioPS FAILED\n", __FILE__, __LINE__));
        }
        break;

    case LINEAR_PCM_AUDIO:

        /* parse the audio attributes info from the vmgi_mat */
        get_audio_attributes(&audio_attributes);

        /* configure for LPCM */
        if (PEiStreamCtrlDemuxAddAudioPS(tPE, PRIVATE_STREAM_1, (PCM_SUB_ID | astn), INPUT_MAIN, AUDIO_TYPE_PCM, &audio_attributes) != PE_SUCCESS)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("%s:%u - PEiStreamCtrlDemuxAddAudioPS FAILED\n", __FILE__, __LINE__));
        }
        break;

    case DTS_AUDIO:

        /* parse the audio attributes info from the vmgi_mat */
        get_audio_attributes(&audio_attributes);

        /* configure for DTS audio */
        if (PEiStreamCtrlDemuxAddAudioPS(tPE, PRIVATE_STREAM_1, DTS_SUB_ID | astn, INPUT_MAIN, AUDIO_TYPE_DTS, &audio_attributes) != PE_SUCCESS)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("%s:%u - PEiStreamCtrlDemuxAddAudioPS FAILED\n", __FILE__, __LINE__));
        }
        break;

    default:
        DBGPRINT(DBG_ON(DBG_ERROR), ("%s: ERROR: Audio decoding mode is not supported.\n", __FUNCTION__));
        break;
    }

    play_ni();
}

void dvd(void)
{
    WAIT_NEXT_CMD = 0;

    if (DISK_TYPE == 0)
    {
        P_H_SIZE = 720;     /* Horizontal Size = 720     */
        P_V_SIZE = 480;     /* Vertical Size   = 480     */
    }
    else
    {
        P_H_SIZE = 720;     /* Horizontal Size = 720     */
        P_V_SIZE = 576;     /* Vertical Size   = 576     */
    }

    audio_mode[0] = 0xFF;
    audio_mode[1] = 0xFF;
}

⌨️ 快捷键说明

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