196 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			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
 | 
						|
}
 | 
						|
 |