📄 osdcp_readbin.c
字号:
#define OSDCP_READBIN_C
///////////////////////////////////////////////////////////////////////////////
//
// File name: OSDcp_readbin.c
// Version:
// Date:
//
// Author:
// Company: MStarSemi Inc.
//
// Description:
//
///////////////////////////////////////////////////////////////////////////////
/******************************************************************************/
/* Header Files */
/* ****************************************************************************/
#include "OSDcp_readbin.h"
#include "drvflash.h"
#include "msAPI_MIU.h"
#include "Debug.h"
#define ENCODING_UTF16 0
#define ENCODING_UTF8 1
#define ENCODING_FLAG_FOR_ONE_OR_TWO 2
/********************************************************************************/
/* Macro */
/* ******************************************************************************/
/********************************************************************************/
/* Local */
/* ******************************************************************************/
//static U32 osdcp_output_addr;
//static U32 osdcp_bmp_info_addr;
typedef struct
{
U32 magicNumber;
U32 headerSize;
U32 bodySize;
U32 binaryType;
U16 bodyCompressMethod;
U32 bodyDecompressedSize;
U16 bodyEncodingMethod;
}StringBinaryInfo;
static U32 osdcp_text_addr;
static StringBinaryInfo info;
/********************************************************************************/
/* Functions */
/********************************************************************************/
//*************************************************************************
//Function name:
//Passing parameter:
//Return parameter:
//Description:
//*************************************************************************
void OSDcp_readbin_info_init(void)
{
BINFORMAT BinInfo;
BinInfo.B_ID = BIN_ID_OSDCP_TEXT;
if (msAPI_MIU_Get_BinInfo(&BinInfo) == PASS)
{
osdcp_text_addr = BinInfo.B_FAddr;
}
MDrv_Flash_Read(osdcp_text_addr,sizeof(info),(U8 *)&info);
}
static U32 readbin_language_addr(U8 language)
{
U32 language_addr;
U32 language_id_addr;
language_id_addr = sizeof(U32)+language*sizeof(language_addr);
MDrv_Flash_Read(osdcp_text_addr+INFO_SIZE+language_id_addr, sizeof(language_addr), (U8 *)&language_addr);
return language_addr;
}
static OSDcp_string_info_table readbin_string_info(U32 language_addr, U16 id)
{
OSDcp_string_info_table struct_string_info;
U32 startaddr;
U32 staraddr_next;
U32 string_id_info_addr;
string_id_info_addr = language_addr+sizeof(U32)/*string count*/+id*sizeof(startaddr);
MDrv_Flash_Read(osdcp_text_addr+string_id_info_addr, sizeof(startaddr), (U8 *)&startaddr);
MDrv_Flash_Read(osdcp_text_addr+string_id_info_addr+sizeof(startaddr), sizeof(startaddr), (U8 *)&staraddr_next);
struct_string_info.startaddr =startaddr;
struct_string_info.length = (U16)(staraddr_next-startaddr);
return struct_string_info;
}
U16 readbin_string_length(U8 language, U16 id)
{
U32 startaddr;
U32 staraddr_next;
U32 string_id_info_addr;
U32 language_addr;
language_addr = readbin_language_addr(language);
string_id_info_addr = language_addr+sizeof(U32)/*string count*/+id*sizeof(startaddr);
MDrv_Flash_Read(osdcp_text_addr+string_id_info_addr, sizeof(startaddr), (U8 *)&startaddr);
MDrv_Flash_Read(osdcp_text_addr+string_id_info_addr+sizeof(startaddr), sizeof(startaddr), (U8 *)&staraddr_next);
return (U16)(staraddr_next-startaddr);
}
void OSDcp_readbin_string_ptr(U8 language, U16 id, U16 *pu16stringbuffer)
{
U32 language_addr;
OSDcp_string_info_table struct_string_info;
language_addr = readbin_language_addr(language);
struct_string_info = readbin_string_info(language_addr, id);
if (info.bodyEncodingMethod == ENCODING_UTF8)
{
#if 0//not support in ATSC now
//printf("A=%lu,%lu,%u\n",(U32)info.headerSize,(U32)struct_string_info.startaddr,(U16)struct_string_info.length);
MDrv_Flash_Read(osdcp_text_addr+info.headerSize+struct_string_info.startaddr, struct_string_info.length, CHAR_BUFFER2);
MApp_CharTable_MappinUTF8ToUCS2(CHAR_BUFFER2, pu16stringbuffer, struct_string_info.length, STRBUFF_LENGTH);
#endif
__ASSERT(0);
}
else if (info.bodyEncodingMethod == ENCODING_FLAG_FOR_ONE_OR_TWO)
{
#if 0 //not support in ATSC now
U8 i = 0, bUseOneOrTwoByte;
//printf("A=%lu,%lu,%u\n",(U32)info.headerSize,(U32)struct_string_info.startaddr,(U16)struct_string_info.length);
MDrv_Flash_Read(osdcp_text_addr+info.headerSize+struct_string_info.startaddr, struct_string_info.length, CHAR_BUFFER2);
bUseOneOrTwoByte = CHAR_BUFFER2[0];
if (bUseOneOrTwoByte == 1)
{
for (i=1; i<struct_string_info.length; i++)
{
pu16stringbuffer[i-1] = (U16) CHAR_BUFFER2[i];
}
}
else if (bUseOneOrTwoByte == 2)
{
memcpy((U8*)pu16stringbuffer, CHAR_BUFFER2+1, struct_string_info.length-1);
}
#endif
__ASSERT(0);
}
else
{
//printf("A=%lu,%lu,%u\n",(U32)info.headerSize,(U32)struct_string_info.startaddr,(U16)struct_string_info.length);
MDrv_Flash_Read(osdcp_text_addr+info.headerSize+struct_string_info.startaddr, struct_string_info.length, (U8*)pu16stringbuffer);
}
}
#undef OSDCP_READBIN_C
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -