📄 mvobjdb.cpp
字号:
/*****************************************************************************
******************************************************************************
** **
** 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 + -