nt9856x/code/application/source/cardv/SrcCode/UIApp/MovieUdtaVendor.c
2023-03-28 15:07:53 +08:00

196 lines
5.2 KiB
C
Executable File

/**
UDTA atom (User Data) maker/parser sample code
Just sample code to show how to make/parse the user data in MOV file
@file MovieUdtaVendor.c
@ingroup Predefined_group_name
@note Nothing (or anything need to be mentioned).
Copyright Novatek Microelectronics Corp. 2013. All rights reserved.
*/
#include <string.h>
#include <stdio.h>
#include "PrjCfg.h"
#include "MovieUdtaVendor.h"
#include "avfile/MediaWriteLib.h"
#include "ImageApp/ImageApp_MovieMulti.h"
#define THIS_DBGLVL 2 // 0=FATAL, 1=ERR, 2=WRN, 3=UNIT, 4=FUNC, 5=IND, 6=MSG, 7=VALUE, 8=USER
///////////////////////////////////////////////////////////////////////////////
#define __MODULE__ MovieUdtaVendor
#define __DBGLVL__ ((THIS_DBGLVL>=PRJ_DBG_LVL)?THIS_DBGLVL:PRJ_DBG_LVL)
#define __DBGFLT__ "*" //*=All, [mark]=CustomClass
#include "kwrap/debug.h"
#define MOVIEUDTA_MAKE_VENDOR_USER_DATA ENABLE
#define MOVIEUDTA_PARSE_VENDOR_USER_DATA DISABLE
#if (MOVIEUDTA_MAKE_VENDOR_USER_DATA == ENABLE)
#include "avfile/MOVLib.h"
#include "avfile/AVFile_MakerTS.h"
#endif
#if (MOVIEUDTA_MAKE_VENDOR_USER_DATA == ENABLE)
static UINT8 gUserMakerModelDataBuf[128];
static unsigned char gAppMovieManuNameStr[] = MOVAPP_COMP_MANU_STRING;
static unsigned char gAppMovieCompNameStr[] = MOVAPP_COMP_NAME_STRING;
#endif //MOVIEUDTA_MAKE_VENDOR_USER_DATA
#if (MOVIEUDTA_PARSE_VENDOR_USER_DATA == ENABLE)
#define NVT_ATOM_MAX_MAKER_SIZE 32
#define NVT_ATOM_MAX_MODEL_SIZE 32
#define TEXT_STR_TAGID_fmt 0xA9666D74
#define TEXT_STR_TAGID_inf 0xA9696E66
static UINT32 MovieUdta_ReadB32Bits(UINT8 *pb)//big endian
{
UINT32 value = 0;
value = (*(pb)) << 24;
value += (*(pb + 1)) << 16;
value += (*(pb + 2)) << 8;
value += (*(pb + 3));
return value;
}
static UINT32 MovieUdta_ReadB16Bits(UINT8 *pb)//big endian
{
UINT32 value = 0;
value = (*(pb)) << 8;
value += (*(pb + 1));
return value;
}
#endif // MOVIEUDTA_PARSE_VENDOR_USER_DATA
#if (MOVIEUDTA_MAKE_VENDOR_USER_DATA == ENABLE)
#define MOVIE_MAX_USER_MAKER_SIZE 32
#define MOVIE_MAX_USER_MODEL_SIZE 32
#endif
//
// Maker User Data in Movie File
//
BOOL MovieUdta_MakeVendorUserData(UINT32 *UDtaAddr, UINT32 *UDtaSize, UINT32 format)
{
BOOL bMakeOK = FALSE;
#if (MOVIEUDTA_MAKE_VENDOR_USER_DATA == ENABLE)
UINT32 buf;
MOV_USER_MAKERINFO makeinfo;
buf = (UINT32) gUserMakerModelDataBuf;
makeinfo.ouputAddr = buf;
makeinfo.makerLen = sizeof(gAppMovieManuNameStr);
makeinfo.pMaker = gAppMovieManuNameStr;
makeinfo.modelLen = sizeof(gAppMovieCompNameStr);
makeinfo.pModel = gAppMovieCompNameStr;
if ((makeinfo.makerLen > MOVIE_MAX_USER_MAKER_SIZE) || (makeinfo.modelLen > MOVIE_MAX_USER_MODEL_SIZE)) {
DBG_ERR("The Maker/Model name is exceed than maximum! maker=%d max=%d, model=%d max=%d\r\n",
makeinfo.makerLen, MOVIE_MAX_USER_MAKER_SIZE,
makeinfo.modelLen, MOVIE_MAX_USER_MODEL_SIZE);
return FALSE;
}
*UDtaAddr = (UINT32) gUserMakerModelDataBuf;
// Make data
if (format == _CFG_FILE_FORMAT_TS) {
TSWriteLib_UserMakerModelData(&makeinfo);
} else {
*UDtaSize = MOVWrite_UserMakerModelData(&makeinfo);
}
bMakeOK = TRUE;
#endif //MOVIEUDTA_MAKE_VENDOR_USER_DATA
return bMakeOK;
}
//
// Parse User Data in Movie File
//
BOOL MovieUdta_ParseVendorUserData(UINT32 UDtaAddr, UINT32 UDtaSize)
{
#if (MOVIEUDTA_PARSE_VENDOR_USER_DATA == ENABLE)
unsigned char sUdtaMakerName[] = MOVAPP_COMP_MANU_STRING;
unsigned char sUdtaModelName[] = MOVAPP_COMP_NAME_STRING;
UINT8 u8MakerNameData[NVT_ATOM_MAX_MAKER_SIZE];
UINT8 u8ModelNameData[NVT_ATOM_MAX_MODEL_SIZE];
UINT32 i;
UINT32 uiSize, uiData;
UINT32 uiMakerSize, uiModelSize;
UINT8 *pb8;
if (!UDtaSize) {
DBG_ERR("No user data\r\n");
return FALSE;
}
pb8 = (UINT8 *)UDtaAddr;
uiSize = MovieUdta_ReadB32Bits(pb8); // Get size
pb8 += 4;
uiData = MovieUdta_ReadB32Bits(pb8); // Get '@fmt' tag
pb8 += 4;
if (uiData == TEXT_STR_TAGID_fmt) {
// Get Maker name
uiMakerSize = MovieUdta_ReadB16Bits(pb8);
pb8 += 4;
for (i = 0; i < uiMakerSize; i++) {
if (i > NVT_ATOM_MAX_MAKER_SIZE) {
break;
}
u8MakerNameData[i] = *pb8;
pb8++;
}
} else {
DBG_ERR("No Maker name\r\n");
return FALSE;
}
uiSize = MovieUdta_ReadB32Bits(pb8); // Get size
pb8 += 4;
uiData = MovieUdta_ReadB32Bits(pb8); // Get '@inf' tag
pb8 += 4;
if (uiData == TEXT_STR_TAGID_inf) {
// Get Model name
uiModelSize = MovieUdta_ReadB16Bits(pb8);
pb8 += 4;
for (i = 0; i < uiModelSize; i++) {
if (i > NVT_ATOM_MAX_MODEL_SIZE) {
break;
}
u8ModelNameData[i] = *pb8;
pb8++;
}
} else {
DBG_ERR("No Model name\r\n");
return FALSE;
}
//DBG_ERR("u8MakerNameData = %s \r\n", u8MakerNameData);
//DBG_ERR("sUdtaMakerName = %s \r\n", sUdtaMakerName);
//DBG_ERR("u8ModelNameData = %s \r\n", u8ModelNameData);
//DBG_ERR("sUdtaModelName = %s \r\n", sUdtaModelName);
// Check Maker name and Model name
if ((!memcmp(u8MakerNameData, sUdtaMakerName, uiMakerSize)) &&
(!memcmp(u8ModelNameData, sUdtaModelName, uiModelSize))) {
return TRUE;
} else {
return FALSE;
}
#else
return TRUE;
#endif // MOVIEUDTA_PARSE_VENDOR_USER_DATA
}