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

📄 pgc_play.cpp

📁 这是DVD中伺服部分的核心代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
        else
        {
            pgc_mode = PGC_POST_CMD;
        }
        pgc_play();
    }
}

#if 0
BOOLEAN next_cell_play(void)
{
    ULONG tt, ptt;
    USHORT done = 0;
    UBYTE retval;

    if (++next_cell == pgc_pgmap[next_pgn])
    {
        next_pgn++;

        for (tt = 0; (tt < ptt_srpti.vts_ttu_n) && !done; tt++)
        {
            for (ptt = 0; (ptt < ttu_srp_num[tt]) && !done; ptt++)
            {
                if ((ptt_srp[tt][ptt].pgcn == next_pgcn) && (ptt_srp[tt][ptt].pgn == next_pgn))
                {
                    if (repeat_mode == REPEAT_PTT)
                    {
                        if (sprm[SPRM_PTTN_ONE_SEQ_PGC] != (ptt + 1))
                        {
                            ptt_search((USHORT) sprm[SPRM_PTTN_ONE_SEQ_PGC]);
                            return (FALSE);
                        }
                    }
                    else
                    {
                        set_sprm(SPRM_PTTN_ONE_SEQ_PGC, (USHORT) (ptt + 1));
                        set_sprm(SPRM_VTS_TTN_TT_DOM, (USHORT) (tt + 1));
                    }
                    done = 1;
                }
            }
        }

        /* update TTN */
        for (ptt = 0; ptt < tt_srpti.tt_srp_n; ptt++)
        {
            if ((tt_srp[ptt].vtsn == next_vtsn) && (tt_srp[ptt].vts_ttn == tt))
            {
                if (repeat_mode == REPEAT_TT)
                {
                    if (sprm[SPRM_TTN_TT_DOM] != (ptt + 1))
                    {
                        retval = title_play((UBYTE) sprm[SPRM_TTN_TT_DOM]);
                        if (retval)
                        {
#if LOADER_ERROR_RECOVER == TRUE
                            if ((0xff != retval) && !parental_prohibit)
                            {
                                disc_error_flag = 1;
                            }
#endif
                            pgc_mode = PGC_STOP;
                        }

                        pgc_play();
                        return (FALSE);
                    }
                }
                else
                {
                    set_sprm(SPRM_TTN_TT_DOM, (USHORT) (ptt + 1));
                    break;
                }
            }
        }

        if ((tt_srp[get_sprm(SPRM_TTN_TT_DOM) - 1].tt_pb_ty & 0x40)     /* One_Random_PGC_Title
                                                                         * or Multi_PGC_Title */
#if CHAP_DISP_MODE == CHAP_DISP_1
            && (tt_srp[get_sprm(SPRM_TTN_TT_DOM) - 1].tt_pb_ty & 0x02)  /* ptt search is
                                                                         * prohibited */
#endif
           )
        {
            time_info->chapter_valid = FALSE;
        }
        else
        {
            time_info->chapter_valid = TRUE;
        }

        if (!done)
        {
            time_info->chapter_valid = FALSE;
        }
    }
    return (TRUE);
}
#endif

USHORT menu_play(UBYTE dest_domain_id, UBYTE mode)
{
    UBYTE  vts_ttn;
    UBYTE  vtsn;
    UBYTE  ttn;
    UBYTE  menu_id;
    USHORT vmgm_pgcn = 0;
    USHORT i;
    USHORT retval = NAV_CONTINUE;
    UBYTE  ret = 0;
    NAV_STATE tmp_nav_state;

    i = 0;
    if (dest_domain_id == VMGM_DOM)
    {
        if (vmgi_mat.vmgm_pgci_ut_sa)
        {
            menu_id = TITLE_MENU;
        }
        else
        {
            /* display "title menu not available, try MENU key" */
            uop_prohibited_msg(0);
            return (0);
        }
    }
    else
    {
        tmp_nav_state = nav_state;
        if (next_vtsn == 0)
        {
            i = 1;
            next_vtsn = tt_srp[0].vtsn;
            vts_ttn = tt_srp[0].vts_ttn;
            next_vts_sa = tt_srp[0].vts_sa;

            ret = get_vtsi_ifo(next_vts_sa);
            if (ret != SUCCESS)
            {
                /* if there was a parse error retry */
                if (ret == FAILURE)
                {
                    int index;

                    /* find the index */
                    for (index = 0; index < tt_srpti.tt_srp_n && index < MAX_NUM_TT; index++)
                    {
                        if (tt_srp[index].vts_sa == next_vts_sa)
                        {
                            /* try new address found by readdir */
                            next_vts_sa = vts_file[tt_srp[index].vtsn - 1].ifo_address;
                            ret = get_vtsi_ifo(next_vts_sa);
                            break;
                        }
                    }
                }
                if (ret != SUCCESS)
                {
                    nav_state = FULL_STOPPED;
                    return (0);
                }
            }
        }
        if (vtsi_mat.vtsm_pgci_ut_sa)
        {
            modify_video_mode = 0;

            abort_drive_reset_channel();

            menu_id = ROOT_MENU;
        }
        else
        {
            /* display "VTS menu not available, try TITLE key" */
            uop_prohibited_msg(0);
            nav_state = tmp_nav_state;
            return (0);
        }
    }

    if (1 == mode)
    {
        power_on_flag = 2;
    }

    nav_state = NORMAL_PLAYING;

    if (0 == i)
    {
       modify_video_mode = 0;
       abort_drive_reset_channel();
    }

    if (repeat_mode != REPEAT_OFF)
    {
       repeat_mode = REPEAT_OFF;
       A_B_count = repeat_count = 0;
       UsrSendRepeatEvent(VDVD_INFO_REPEAT_OFF);
    }

    if (pgc_domain == TT_PGC)
    {
        if (dest_domain_id == VMGM_DOM)
        {
            /* Select vmgm_pgcn based on parental, language and country code */
            vmgm_pgcn = 0;

            for (i = 0; i < vmgm_lui[lang_index].vmgm_pgci_srp_n; i++)
            {
                if ((vmgm_pgci_srp[lang_index][i].vmgm_pgc_cat[0] & 0x80) &&
                    (vmgm_pgci_srp[lang_index][i].vmgm_pgc_cat[0] & 0x02))
                {
                    break;
                }
            }

            if (i && (i != vmgm_lui[lang_index].vmgm_pgci_srp_n))
            {
                dest_domain_id = VMGM_DOM_PGCN;
                vmgm_pgcn = i + 1;
            }
        }

        retval = call_ss(dest_domain_id, menu_id, (UBYTE)(next_cell), vmgm_pgcn);
    }
    else
    {
        /*
         * Select vtsn, vts_ttn and vmgm_pgcn based on parental, language and country code
         */

        vmgm_pgcn = 0;

        ttn = (UBYTE)(get_sprm(SPRM_TTN_TT_DOM));
        vtsn = tt_srp[ttn - 1].vtsn;
        vts_ttn = tt_srp[ttn - 1].vts_ttn;

        retval = jump_ss(dest_domain_id, menu_id, vts_ttn, vtsn, vmgm_pgcn);
    }

    if (retval == NAV_PRE_CMD)
    {
        pgc_mode = PGC_PRE_CMD;
        pgc_play();
        if ( (nav_state != FULL_STOPPED) && (nav_state != STOPPED) )
        {
            return (1);
        }
        else
        {
            return (0);
        }
    }
    else if (retval == NAV_STOP)
    {
        pgc_mode = PGC_STOP;
        pgc_play();
        return (0);
    }

    return (0);

} /* end of function menu_play() */

void pgc_still_expired(void)
{
    DBGPRINT(DBG_ON(DBG_TRACE), ("pgc_still_expired: ENTER\n"));

    if (repeat_mode == REPEAT_OFF)
    {
        nav_state = NORMAL_PLAYING;
        player_state = NORMAL_PLAY;
        /* NO forcedly activated button */
        if (!nvpck[CURRENT].hl_gi.foac_btnn)
        {
            if (playback_mode == PG_SEQUENTIAL)
            {
                pgc_mode = PGC_POST_CMD;
            }
            else
            {
                pgc_mode = PGC_LOOP_COUNT;
            }

            PEiStreamCtrlResume(tPE); /* unfreeze */
            pgc_play();
        }
        else    /* in repeat mode */
        {
            pgc_end_repeat();
        }
    }
}

void nv_tmr_expired(void)
{
    USHORT nav_cmd;

    DBGPRINT(DBG_ON(DBG_TRACE), ("nv_tmr_expired: ENTER\n"));

    cell_still_expire = 0xffffffff;

    abort_drive_reset_channel();

    next_pgcn = get_sprm(SPRM_TT_PGCN_NV_TMR);
    nav_cmd = get_pgc();

    if (nav_cmd == NAV_PRE_CMD)
    {
        pgc_mode = PGC_PRE_CMD;
        pgc_play();
    }
}

void cell_still_expired(void)
{
    UBYTE c_cmd = c_pbi[next_cell - 1].c_cat[3];
    USHORT retval, i;

    DBGPRINT(DBG_ON(DBG_TRACE), ("\n cell_still_expired()...\n"));

    nav_state = NORMAL_PLAYING;

    /* prevent the execution of cell commands during trick play */
    if ( (player_state != FORWARD) && (player_state != REVERSE) )
    {
        player_state = NORMAL_PLAY;
        if (0 != pgc_cmdti.c_cmd_n && c_cmd)
        {
            for (i = 0; i < SIZEOF_CMD; i++)
            {
                button_cmd_buff[0][i] = c_cmd_buff[c_cmd - 1][i];
            }

            if (!(retval = button_cell_cmd(CELL_CMD)))  /* cell */
            {
                DBGPRINT(DEBUG_PGC_PLAY, ("\n cell_still_expired()...return 1\n"));
                return;
            }
        }
    }

    if (playback_mode == PG_SEQUENTIAL) /* sequencal */
    {
        /* CELL_V1 */
        if (next_cell == pgc_gi.pgc_cnt[3])
        {
            pgc_mode = PGC_POST_CMD;
            DBGPRINT(DBG_ON(DBG_TRACE), ("\n cell_still_expired() - pgc_play(1)\n"));
            pgc_play();
        }
        else
        {
            /* check for any repeat mode before do normal cell play */
            retval = check_for_repeat();
            if (retval == 0)
            {
                next_cell = next_cell_v1;
                next_pgn = next_pgn_v1;
                vob_init();
                DBGPRINT(DBG_ON(DBG_TRACE), ("cell_still_expired: - cell_play, LINE=%d\n", __LINE__));
                cell_play(1);
            }
#if LOADER_ERROR_RECOVER == TRUE
            else if ((0xff != retval) && !parental_prohibit)
            {
                disc_error_handle();
            }
#endif
        }
        /******************/
    }
    else        /* random/shuffle */
    {
        if ((pgc_pgmap[next_pgn] == (next_cell + 1)) || (pgc_gi.pgc_cnt[3] == next_cell))
        {
            pgc_mode = PGC_LOOP_COUNT;
            vob_init();
            DBGPRINT(DBG_ON(DBG_TRACE), ("cell_still_expired: - pgc_play, LINE=%d\n", __LINE__));
            pgc_play();
        }
        else
        {
            /* CELL_V1 */
            next_cell = next_cell_v1;
            next_pgn = next_pgn_v1;

            vob_init();
            DBGPRINT(DBG_ON(DBG_TRACE), ("cell_still_expired: - cell_play, LINE=%d\n", __LINE__));
            cell_play(1);
            /*******************/
        }
    }
} /* end of function cell_still_expired */

void vobu_still_off(void)
{
    DBGPRINT(DBG_ON(DBG_TRACE), ("vobu_still_off: ENTER\n"));

    nav_state = NORMAL_PLAYING;
    player_state = NORMAL_PLAY;

    during_search = 0;

    /* unfreeze */
    PEiStreamCtrlResume(tPE);

} /* end of function vobu_still_off() */


/************************************************************************/
/************************************************************************/
/**                                                                    **/
/**                procedure button_cell_cmd()                         **/
/**                                                                    **/
/** PURPOSE: To perform a cell command.                                **/
/**                                                                    **/
/************************************************************************/
/************************************************************************/
USHORT button_cell_cmd(UBYTE which_cmd)
{
    USHORT nav_cmd;
    USHORT retval = 1;

    change_hl_forbidden = 0;

    DBGPRINT(DBG_ON(DBG_TRACE), ("button_cell_cmd() --ENTER\n"));

    nav_cmd = (dvd_cmd((UBYTE *) & button_cmd_buff[0][0], which_cmd) & 0xff00);

    if (nav_cmd == NAV_STOP)
    {
        DBGPRINT(DBG_ON(DBG_TRACE), ("button_cell_cmd() --NAV_STOP\n"));

⌨️ 快捷键说明

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