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

📄 mvobjdb.cpp

📁 这是DVD中伺服部分的核心代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        return (NULL);
    }

    /* Check for valid movie object id */
    if (ulMvObjID > (ULONG)hMvObj->usNumberOfMvObjs)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("MvObjGetTermInfo: Invalid movie object ID!\n"));
        return (NULL);
    }

    return (&hMvObj->TermInfo[ulMvObjID]);
}

/**
 * MvObjGetNumberOfNavCmds -- Get number of navigation commands in a movie object.
 *
 * @param
 *      ulMvObjID -- Movie Object ID
 *
 * @retval
 *      Pointer to the database field that contains the number of navigation
 *      commands in the specified movie object.
 */
USHORT*  MvObjGetNumberOfNavCmds(ULONG ulMvObjID)
{
    if (hMvObj == NULL)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("MvObjGetNumberOfNavCmds: Database not created!\n"));
        return (NULL);
    }

    /* Check for valid movie object id */
    if (ulMvObjID > (ULONG)hMvObj->usNumberOfMvObjs)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("MvObjGetNumberOfNavCmds: Invalid movie object ID!\n"));
        return (NULL);
    }

    return (&hMvObj->usNumberOfNavCmds[ulMvObjID]);
}

/**
 * MvObjGetNavCmds -- Get the navigation commands from a specified movie object
 *
 * @param
 *      ulMvObjID -- Movie Object ID
 *
 * @retval
 *      Pointer to the database field that contains the navigation commands
 *      of the specified movie object.
 */
MVOBJ_NAV_COMMAND*  MvObjGetNavCmds(ULONG ulMvObjID)
{
    if (hMvObj == NULL)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("MvObjGetNumberOfNavCmds: Database not created!\n"));
        return (NULL);
    }

    /* Check for valid movie object id */
    if (ulMvObjID > (ULONG)hMvObj->usNumberOfMvObjs)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("MvObjGetNumberOfNavCmds: Invalid movie object ID!\n"));
        return (NULL);
    }

    return (hMvObj->NavCmd[ulMvObjID]);
}

/**
 * mvobjLoadIndicator -- Load type indicator and version number from file.
 *
 * @param
 *      file -- file handle (could be main or backup)
 *
 * @retval
 *      MVOBJ_STATUS
 */
static MVOBJ_STATUS  mvobjLoadIndicator(LOADER_FILE_HANDLE file)
{
    MVOBJ_STATUS    tStatus;
    UBYTE           ubData[8];

    /* Read the type indicator and version number from the file */
    if (LoaderFileRead(hMvObj->hLoader, file, (PVOID)ubData, 8, NULL) != LOADER_SUCCESS)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("mvobjLoadIndicator: Failed to read type indicator!\n"));
        tStatus = MVOBJ_FILE_ERROR;
        goto errout;
    }

    /* Check that type indicator is valid */
    if ( (ubData[0] != 'M') || (ubData[1] != 'O') || (ubData[2] != 'B') || (ubData[3] != 'J') )
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("mvobjLoadIndicator: Invalid type indicator!\n"));
        tStatus = MVOBJ_INVALID_FORMAT;
        goto errout;
    }

    /* Check that version number is valid */
    if (GET_INT_FROM_ASCII4( (&ubData[4]) ) < BDROM_SPEC_VERSION)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("mvobjLoadIndicator: Version Number Invalid!\n"));
        tStatus = MVOBJ_INVALID_FORMAT;
        goto errout;
    }

    return (MVOBJ_SUCCESS);

errout:

    return (tStatus);
}

/**
 * mvobjLoadMobjs -- Load movie objects from file.
 *
 * @param
 *      file -- file handle (could be main or backup)
 *
 * @retval
 *      MVOBJ_STATUS
 */
static MVOBJ_STATUS  mvobjLoadMobjs(LOADER_FILE_HANDLE file)
{
    MVOBJ_STATUS    tStatus;
    UBYTE           ubData[16];
    ULONG           ulLength;
    USHORT          i;

    /* Seek To the MovieObjects() */
    if (LoaderFileSeek(hMvObj->hLoader, file, LOADER_SEEK_SET, 40) != LOADER_SUCCESS)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("mvobjLoadMobjs:  Failed to seek in file!\n"));
        tStatus = MVOBJ_FILE_ERROR;
        goto errout;
    }

    /* Read the length, reserved data, and number of movie objects from the file */
    if (LoaderFileRead(hMvObj->hLoader, file, (PVOID)ubData, 10, NULL) != LOADER_SUCCESS)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("MvObjLoad: Failed to read number of mobjs!\n"));
        tStatus = MVOBJ_FILE_ERROR;
        goto errout;
    }

    /* Set the length */
    ulLength = MAKE_DWORD(&ubData[0]);

    /* Set number of movie objects */
    hMvObj->usNumberOfMvObjs = MAKE_WORD(&ubData[8]);

    /* Read each movie object from the file */
    for (i = 0; i < hMvObj->usNumberOfMvObjs; i++)
    {
        /* Load movie object's terminal information */
        tStatus = mvobjLoadMobj_TermInfo(file, &hMvObj->TermInfo[i]);
        if (tStatus != MVOBJ_SUCCESS)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("MvObjLoad: mobj_id = %d, failed to load terminfo!\n", i));
            goto errout;
        }

        /* Load movie object's navigation commands */
        tStatus = mvobjLoadMobj_NavCmds(file, &hMvObj->NavCmd[i], &hMvObj->usNumberOfNavCmds[i]);
        if (tStatus != MVOBJ_SUCCESS)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("MvObjLoad: mobj_id = %d, failed to load navcmds!\n", i));
            goto errout;
        }
    }

    return (MVOBJ_SUCCESS);

errout:

    return (tStatus);
}

/**
 * mvobjLoadMobj_TermInfo -- Load movie object terminal info.
 *
 * @param
 *      file -- file handle (could be main or backup)
 *      pTermInfo -- pointer to terminal information
 *
 * @retval
 *      MVOBJ_STATUS
 */
static MVOBJ_STATUS  mvobjLoadMobj_TermInfo(LOADER_FILE_HANDLE file, MVOBJ_TERMINFO *pTermInfo)
{
    MVOBJ_STATUS    tStatus;
    UBYTE           ubData[8];

    /* Read the terminal info from the file */
    if (LoaderFileRead(hMvObj->hLoader, file, (PVOID)ubData, 2, NULL) != LOADER_SUCCESS)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("mvobjLoadMobj_TermInfo: Failed to read terminal info!\n"));
        tStatus = MVOBJ_FILE_ERROR;
        goto errout;
    }

    /* Check resume intention flag in terminal info */
    if ( (ubData[0] & 0x80) != 0)
    {
        /* Resume Intention flag is set */
        pTermInfo->fResumeIntentionFlag = TRUE;
    }
    else
    {
        /* Resume Intention flag is not set */
        pTermInfo->fResumeIntentionFlag = FALSE;
    }

    /* Check menu call mask in terminal info */
    if ( (ubData[0] & 0x40) != 0)
    {
        /* Menu call mask is set */
        pTermInfo->fMenuCallMask = TRUE;
    }
    else
    {
        /* Menu call mask is not set */
        pTermInfo->fMenuCallMask = FALSE;
    }

    /* Check title call mask in terminal info */
    if ( (ubData[0] & 0x20) != 0)
    {
        /* Title call mask is set */
        pTermInfo->fTitleSearchMask = TRUE;
    }
    else
    {
        /* Title call mask is not set */
        pTermInfo->fTitleSearchMask = FALSE;
    }

    return (MVOBJ_SUCCESS);

errout:

    return (tStatus);
}

/**
 * mvobjLoadMobj_NavCmds -- Load movie object navigation commands.
 *
 * @param
 *      file -- file handle (could be main or backup)
 *      pNavCmds -- pointer to navigation commands
 *      pusNumberNavCmds -- pointer to number of navigation commands
 *
 * @retval
 *      MVOBJ_STATUS
 */
static MVOBJ_STATUS  mvobjLoadMobj_NavCmds(LOADER_FILE_HANDLE file, MVOBJ_NAV_COMMAND **pNavCmds, USHORT *pusNumberNavCmds)
{
    MVOBJ_STATUS    tStatus;
    UBYTE           ubData[16];
    USHORT          i;

    /* Read the number of navigation commands from the file */
    if (LoaderFileRead(hMvObj->hLoader, file, (PVOID)ubData, 2, NULL) != LOADER_SUCCESS)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("mvobjLoadMobj_NavCmds: Failed to number of navigation commands!\n"));
        tStatus = MVOBJ_FILE_ERROR;
        goto errout;
    }

    /* Set number of navigation commands */
    *pusNumberNavCmds = MAKE_WORD(&ubData[0]);

    if (*pusNumberNavCmds != 0 )
    {
        /* Allocate memory for navigation commands */
        *pNavCmds = (MVOBJ_NAV_COMMAND *)OS_MemAlloc(sizeof(MVOBJ_NAV_COMMAND) * (*pusNumberNavCmds) );
        if (*pNavCmds == NULL)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("mvobjLoadMobj_NavCmds: Failed to allocate memory!\n"));
            tStatus = MVOBJ_FAILURE;
            goto errout;
        }

        /* Read all navigation commands from movie object */
        for (i = 0; i < *pusNumberNavCmds; i++)
        {
            /* Read navigation command from the file */
            if (LoaderFileRead(hMvObj->hLoader, file, (PVOID)ubData, 12, NULL) != LOADER_SUCCESS)
            {
                DBGPRINT(DBG_ON(DBG_ERROR), ("mvobjLoadMobj_NavCmds: Failed to read navigation command!\n"));
                tStatus = MVOBJ_FILE_ERROR;
                goto errout;
            }
            else
            {
                /* Set Navigation command */
                (*pNavCmds)[i].ulOpCode     = MAKE_DWORD(&ubData[0]);
                (*pNavCmds)[i].ulDstOperand = MAKE_DWORD(&ubData[4]);
                (*pNavCmds)[i].ulSrcOperand = MAKE_DWORD(&ubData[8]);
            }
        }
    }

    return (MVOBJ_SUCCESS);

errout:

    if (*pNavCmds != NULL)
    {
        OS_MemFree(*pNavCmds);
        *pNavCmds = NULL;
    }

    return (tStatus);
}

⌨️ 快捷键说明

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