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

📄 mvobjdb.cpp

📁 这是DVD中伺服部分的核心代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*****************************************************************************
******************************************************************************
**                                                                          **
**  Copyright (c) 2005-2006 Videon Central, Inc.                            **
**  All rights reserved.                                                    **
**                                                                          **
**  The computer program contained herein contains proprietary information  **
**  which is the property of Videon Central, Inc.  The program may be used  **
**  and/or copied only with the written permission of Videon Central, Inc.  **
**  or in accordance with the terms and conditions stipulated in the        **
**  agreement/contract under which the programs have been supplied.         **
**                                                                          **
******************************************************************************
*****************************************************************************/
/**
 * @file mvobjdb.cpp
 *
 * API to the Movie Object Database.
 * The Movie Object Database handles the storage of and access to Movie Object data.
 *
 * $Id: mvobjdb.cpp,v 1.15 2007/01/05 02:41:10 rbehe Exp $
 */

#include <string.h>
#include "vdvd_types.h"
#include "mvobjdb.h"
#include "mvplaylistdb.h"
#include "loader_app.h"
#include "osapi.h"
#include "utility.h"
#include "dbgprint.h"
#ifdef DMALLOC
#include "dmalloc.h"
#endif

/* Debug macros */
#define DBG_MVOBJ   DBG_ERROR
#define DBG_ON(x)   (DBG_MVOBJ >= x)

/**
 * Local handle
 */
typedef struct tagMVOBJ_HANDLE
{
    LOADER_HANDLE       hLoader;
    USHORT              usNumberOfMvObjs;
    MVOBJ_TERMINFO      TermInfo[MVOBJ_MAX_MOVIE_OBJECTS];
    USHORT              usNumberOfNavCmds[MVOBJ_MAX_MOVIE_OBJECTS];
    MVOBJ_NAV_COMMAND   *NavCmd[MVOBJ_MAX_MOVIE_OBJECTS];
} MVOBJ_HANDLE;

/**
 * Local variables
 */
static MVOBJ_HANDLE  *hMvObj = NULL;

/**
 * Local functions.
 */
static MVOBJ_STATUS  mvobjLoadIndicator(LOADER_FILE_HANDLE file);
static MVOBJ_STATUS  mvobjLoadMobjs(LOADER_FILE_HANDLE file);
static MVOBJ_STATUS  mvobjLoadMobj_TermInfo(LOADER_FILE_HANDLE file, MVOBJ_TERMINFO *pTermInfo);
static MVOBJ_STATUS  mvobjLoadMobj_NavCmds(LOADER_FILE_HANDLE file, MVOBJ_NAV_COMMAND **pNavCmds, USHORT *pusNumberNavCmds);

/**
 * MvObjCreate -- Create the movie object database
 *
 * @param
 *      tLoader -- handle to the loader.
 *
 * @retval
 *      MVOBJ_STATUS
 */
MVOBJ_STATUS  MvObjCreate(LOADER_HANDLE tLoader)
{
    MVOBJ_STATUS tStatus = MVOBJ_SUCCESS;

    /* validate parameter */
    if (tLoader == NULL)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("MvObjCreate: Null pointer!\n"));
        return (MVOBJ_NULL_PTR);
    }

    /* If database is already created, return a failure */
    if (hMvObj != NULL)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("MvObjCreate: Database already created!\n"));
        tStatus = MVOBJ_FAILURE;
    }
    else
    {
        /* Allocate local handle */
        hMvObj = (MVOBJ_HANDLE *)OS_MemAlloc(sizeof(MVOBJ_HANDLE) );
        if (hMvObj == NULL)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("MvObjCreate: Failed to allocate handle!\n"));
            tStatus = MVOBJ_FAILURE;
        }
        else
        {
            /* Initialize data */
            memset(hMvObj, 0, sizeof(MVOBJ_HANDLE));

            /* Keep loader handle */
            hMvObj->hLoader = tLoader;
        }
    }

    return (tStatus);
}

/**
 * MvObjDelete -- Delete the movie object database
 *
 * @param
 *      none
 *
 * @retval
 *      MVOBJ_STATUS
 */
MVOBJ_STATUS  MvObjDelete(void)
{
    MVOBJ_STATUS tStatus = MVOBJ_SUCCESS;

    /* If database has not been created, return a failure */
    if (hMvObj == NULL)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("MvObjDelete: Database not created!\n"));
        tStatus = MVOBJ_FAILURE;
    }
    else
    {
        /* free navigation commands */
        for (int i = 0; i < MVOBJ_MAX_MOVIE_OBJECTS; i++)
        {
            if (hMvObj->NavCmd[i] != NULL)
            {
                OS_MemFree(hMvObj->NavCmd[i]);
                hMvObj->NavCmd[i] = NULL;
            }
        }

        /* free local handle */
        OS_MemFree(hMvObj);
        hMvObj = NULL;
    }

    return (tStatus);
}

/**
 * MvObjLoad -- Load the Movie Object data from BDROM disc into the database.
 *
 * @param
 *      none
 *
 * @retval
 *      MVOBJ_STATUS
 */
MVOBJ_STATUS  MvObjLoad(void)
{
    LOADER_FILE_HANDLE  MvObjFile       = 0;
    LOADER_FILE_HANDLE  MvObjBackupFile = 0;
    MVOBJ_STATUS        tStatus;

    if (hMvObj == NULL)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("MvObjLoad: Database not created!\n"));
        return (MVOBJ_FAILURE);
    }

    /* Clear db in case previsouly loaded disc still not cleared */
    hMvObj->usNumberOfMvObjs = 0;
    for (int i = 0; i < MVOBJ_MAX_MOVIE_OBJECTS; i++)
    {
        if (hMvObj->NavCmd[i] != NULL)
        {
            OS_MemFree(hMvObj->NavCmd[i]);
            hMvObj->NavCmd[i] = NULL;
        }
    }

    /* Open the Movie Object file */
    if (LoaderFileOpen(hMvObj->hLoader, "/mnt/cdrom/BDMV/MovieObject.bdmv", &MvObjFile) != LOADER_SUCCESS)
    {
        MvObjFile = 0;
    }

    /* Open the Movie Object backup file */
    if (LoaderFileOpen(hMvObj->hLoader, "/mnt/cdrom/BDMV/BACKUP/MovieObject.bdmv", &MvObjBackupFile) != LOADER_SUCCESS)
    {
        MvObjBackupFile = 0;
    }

    /* Make sure at least one file opened successfully. */
    if (MvObjFile == 0)
    {
        if (MvObjBackupFile == 0)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("MvObjLoad: Could not open movie object file!\n"));
            tStatus = MVOBJ_FILE_ERROR;
            goto errout;
        }
        else
        {
            /* use backup file */
            MvObjFile = MvObjBackupFile;
            MvObjBackupFile = 0;
        }
    }

    /* Load the Type indicator and version number from the file */
    tStatus = mvobjLoadIndicator(MvObjFile);
    if (tStatus != MVOBJ_SUCCESS)
    {
        /* Main file failed so try the backup file */
        if (MvObjBackupFile == 0)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("MvObjLoad: Failed to load indicator!\n"));
            goto errout;
        }
        else
        {
            /* Load the Type indicator and version number from the backup file */
            tStatus = mvobjLoadIndicator(MvObjBackupFile);
            if (tStatus != MVOBJ_SUCCESS)
            {
                DBGPRINT(DBG_ON(DBG_ERROR), ("MvObjLoad: Failed to load indicator!\n"));
                goto errout;
            }
        }
    }

    /* Load the movie objects from the file */
    tStatus = mvobjLoadMobjs(MvObjFile);
    if (tStatus != MVOBJ_SUCCESS)
    {
        /* Main file failed so try the backup file */
        if (MvObjBackupFile == 0)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("MvObjLoad: Failed to load movie objects!\n"));
            goto errout;
        }
        else
        {
            /* Load the movie objects from the backup file */
            tStatus = mvobjLoadMobjs(MvObjBackupFile);
            if (tStatus != MVOBJ_SUCCESS)
            {
                DBGPRINT(DBG_ON(DBG_ERROR), ("MvObjLoad: Failed to load movie objects!\n"));
                goto errout;
            }
        }
    }

    /* Close the movie object file */
    LoaderFileClose(hMvObj->hLoader, MvObjFile);

    /* Close the backup file */
    if (MvObjBackupFile != 0)
    {
        LoaderFileClose(hMvObj->hLoader, MvObjBackupFile);
    }

    return (MVOBJ_SUCCESS);

errout:

    if (MvObjFile != 0)
    {
        LoaderFileClose(hMvObj->hLoader, MvObjFile);
    }

    if (MvObjBackupFile != 0)
    {
        LoaderFileClose(hMvObj->hLoader, MvObjBackupFile);
    }

    return (tStatus);
}

/**
 * MvObjGetNumberOfMvObjs -- Get number of movie objects in the Movie Object file.
 *
 * @param
 *     none.
 *
 * @retval
 *      Pointer to the database field that contains the number of
 *      movie objects in the movie object file.
 */
USHORT*  MvObjGetNumberOfMvObjs(void)
{
    if (hMvObj == NULL)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("MvObjGetNumberOfMvObjs: Database not created!\n"));
        return (NULL);
    }

    return (&hMvObj->usNumberOfMvObjs);
}

/**
 * MvObjGetTermInfo -- Get the terminal information from a specified movie object
 *
 * @param
 *      ulMvObjID -- Movie Object ID
 *
 * @retval
 *      Pointer to the database field that contains the terminal info
 *      of the specified movie object.
 */
MVOBJ_TERMINFO*  MvObjGetTermInfo(ULONG ulMvObjID)
{
    if (hMvObj == NULL)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("MvObjGetTermInfo: Database not created!\n"));

⌨️ 快捷键说明

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