sdk-hwV1.3/external/eyesee-mpp/system/public/libupdate/imgdecode.c

322 lines
7.9 KiB
C
Raw Normal View History

2024-05-07 10:09:20 +00:00
#include <string.h>
#include <malloc.h>
#include "imgdecode.h"
#include "imagefile_new.h"
#define HEAD_ID 0 //ͷ<><CDB7><EFBFBD>ܽӿ<DCBD><D3BF><EFBFBD><EFBFBD><EFBFBD>
#define TABLE_ID 1 //<2F><><EFBFBD><EFBFBD><EFBFBD>ܽӿ<DCBD><D3BF><EFBFBD><EFBFBD><EFBFBD>
#define DATA_ID 2 //<2F><><EFBFBD>ݼ<EFBFBD><DDBC>ܽӿ<DCBD><D3BF><EFBFBD><EFBFBD><EFBFBD>
#define IF_CNT 3 //<2F><><EFBFBD>ܽӿڸ<D3BF><DAB8><EFBFBD> <20><><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>ͷ<EFBFBD><CDB7><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD>3<EFBFBD><33>
#define MAX_KEY_SIZE 32 //<2F><><EFBFBD><EFBFBD><EBB3A4>
#pragma pack(push, 1)
typedef struct tag_IMAGE_HANDLE
{
ImageHead_t ImageHead; //imgͷ<67><CDB7>Ϣ
ImageItem_t *ItemTable; //item<65><6D>Ϣ<EFBFBD><CFA2>
}IMAGE_HANDLE;
#define INVALID_INDEX 0xFFFFFFFF
typedef struct tag_ITEM_HANDLE{
uint index; //<2F><>ItemTable<6C>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>
uint reserved[3];
// long long pos;
}ITEM_HANDLE;
#define ITEM_PHOENIX_TOOLS "PXTOOLS "
FILE *img_file_hd;
//------------------------------------------------------------------------------------------------------------
//image<67><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľӿ<C4BD>
//------------------------------------------------------------------------------------------------------------
HIMAGE Img_Open (char * ImageFile)
{
IMAGE_HANDLE * pImage = NULL;
uint ItemTableSize; //<2F>̼<EFBFBD><CCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>С
img_file_hd = fopen(ImageFile, "rb");
if(img_file_hd == NULL)
{
printf("sunxi sprite error: unable to open firmware file\n");
return NULL;
}
pImage = (IMAGE_HANDLE *)malloc(sizeof(IMAGE_HANDLE));
if (NULL == pImage)
{
printf("sunxi sprite error: fail to malloc memory for img head\n");
return NULL;
}
memset(pImage, 0, sizeof(IMAGE_HANDLE));
//------------------------------------------------
//<2F><>imgͷ
//------------------------------------------------
//debug("try to read mmc start %d\n", img_file_start);
if(!fread(&pImage->ImageHead, IMAGE_HEAD_SIZE, 1, img_file_hd))
{
printf("sunxi sprite error: read iamge head fail\n");
goto _img_open_fail_;
}
//------------------------------------------------
//<2F>Ƚ<EFBFBD>magic
//------------------------------------------------
if (memcmp(pImage->ImageHead.magic, IMAGE_MAGIC, 8) != 0)
{
printf("sunxi sprite error: iamge magic is bad\n");
goto _img_open_fail_;
}
//------------------------------------------------
//Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٿռ<D9BF>
//------------------------------------------------
ItemTableSize = pImage->ImageHead.itemcount * sizeof(ImageItem_t);
pImage->ItemTable = (ImageItem_t*)malloc(ItemTableSize);
if (NULL == pImage->ItemTable)
{
printf("sunxi sprite error: fail to malloc memory for item table\n");
goto _img_open_fail_;
}
//------------------------------------------------
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//------------------------------------------------
if(!fread(pImage->ItemTable, ItemTableSize, 1, img_file_hd))
{
printf("sunxi sprite error: read iamge item table fail\n");
goto _img_open_fail_;
}
return pImage;
_img_open_fail_:
if(pImage->ItemTable)
{
free(pImage->ItemTable);
}
if(pImage)
{
free(pImage);
}
return NULL;
}
long long Img_GetSize (HIMAGE hImage)
{
long long size;
if (NULL == hImage)
{
printf("sunxi sprite error : hImage is NULL\n");
return -1;
}
IMAGE_HANDLE* pImage = (IMAGE_HANDLE *)hImage;
size = pImage->ImageHead.lenHi;
size <<= 32;
size |= pImage->ImageHead.lenLo;
return size;
}
HIMAGEITEM Img_OpenItem (HIMAGE hImage, char * MainType, char * subType)
{
IMAGE_HANDLE* pImage = (IMAGE_HANDLE *)hImage;
ITEM_HANDLE * pItem = NULL;
uint i;
if (NULL == pImage || NULL == subType)
{
return NULL;
}
pItem = (ITEM_HANDLE *) malloc(sizeof(ITEM_HANDLE));
if (NULL == pItem)
{
printf("sunxi sprite error : cannot malloc memory for item\n");
return NULL;
}
pItem->index = INVALID_INDEX;
for (i = 0; i < pImage->ImageHead.itemcount ; i++)
{
if(!memcmp(subType, pImage->ItemTable[i].subType, SUBTYPE_LEN))
{
pItem->index = i;
return pItem;
}
}
printf("sunxi sprite error : cannot find item %s %s\n", MainType, subType);
free(pItem);
pItem = NULL;
return NULL;
}
long long Img_GetItemSize (HIMAGE hImage, HIMAGEITEM hItem)
{
IMAGE_HANDLE* pImage = (IMAGE_HANDLE *)hImage;
ITEM_HANDLE * pItem = (ITEM_HANDLE *)hItem;
long long size;
if (NULL == pItem)
{
printf("sunxi sprite error : item is NULL\n");
return 0;
}
size = pImage->ItemTable[pItem->index].filelenHi;
size <<= 32;
size |= pImage->ItemTable[pItem->index].filelenLo;
return size;
}
uint Img_GetItemStart (HIMAGE hImage, HIMAGEITEM hItem)
{
IMAGE_HANDLE* pImage = (IMAGE_HANDLE *)hImage;
ITEM_HANDLE * pItem = (ITEM_HANDLE *)hItem;
long long start;
long long offset;
if (NULL == pItem)
{
printf("sunxi sprite error : item is NULL\n");
return 0;
}
offset = pImage->ItemTable[pItem->index].offsetHi;
offset <<= 32;
offset |= pImage->ItemTable[pItem->index].offsetLo;
start = offset/512;
return (uint)start;
}
uint Img_ReadItem(HIMAGE hImage, HIMAGEITEM hItem, void *buffer, uint buffer_size)
{
IMAGE_HANDLE* pImage = (IMAGE_HANDLE *)hImage;
ITEM_HANDLE * pItem = (ITEM_HANDLE *)hItem;
long long start;
long long offset;
uint file_size;
if (NULL == pItem)
{
printf("sunxi sprite error : item is NULL\n");
return 0;
}
if(pImage->ItemTable[pItem->index].filelenHi)
{
printf("sunxi sprite error : the item too big\n");
return 0;
}
file_size = pImage->ItemTable[pItem->index].filelenLo;
file_size = (file_size + 1023) & (~(1024 - 1));
if(file_size > buffer_size)
{
printf("sunxi sprite error : buffer is smaller than data size\n");
return 0;
}
offset = pImage->ItemTable[pItem->index].offsetHi;
offset <<= 32;
offset |= pImage->ItemTable[pItem->index].offsetLo;
//start = offset/512;
start = offset;
fseek(img_file_hd, (uint)start, SEEK_SET);
if(!fread(buffer, file_size, 1, img_file_hd))
{
printf("sunxi sprite error : read item data failed\n");
return 0;
}
return file_size;
}
uint Img_ReadItem_Continue(HIMAGE hImage, HIMAGEITEM hItem, void *buffer, uint wanted_size, uint file_offset)
{
IMAGE_HANDLE* pImage = (IMAGE_HANDLE *)hImage;
ITEM_HANDLE * pItem = (ITEM_HANDLE *)hItem;
long long offset;
if (NULL == pItem)
{
printf("sunxi sprite error : item is NULL\n");
return 0;
}
if(pImage->ItemTable[pItem->index].filelenHi)
{
printf("sunxi sprite error : the item too big\n");
return 0;
}
offset = pImage->ItemTable[pItem->index].offsetHi;
offset <<= 32;
offset |= pImage->ItemTable[pItem->index].offsetLo;
fseek(img_file_hd, (uint)offset + file_offset, SEEK_SET);
if(!fread(buffer, wanted_size, 1, img_file_hd))
{
printf("sunxi sprite error : read item data failed\n");
return 0;
}
return wanted_size;
}
int Img_CloseItem (HIMAGE hImage, HIMAGEITEM hItem)
{
ITEM_HANDLE * pItem = (ITEM_HANDLE *)hItem;
if (NULL == pItem)
{
printf("sunxi sprite error : item is null when close it\n");
return -1;
}
free(pItem);
pItem = NULL;
return 0;
}
void Img_Close (HIMAGE hImage)
{
IMAGE_HANDLE * pImage = (IMAGE_HANDLE *)hImage;
if (NULL == pImage)
{
printf("sunxi sprite error : imghead is null when close it\n");
return ;
}
if (NULL != pImage->ItemTable)
{
free(pImage->ItemTable);
pImage->ItemTable = NULL;
}
memset(pImage, 0, sizeof(IMAGE_HANDLE));
free(pImage);
pImage = NULL;
if(img_file_hd)
{
fclose(img_file_hd);
}
return ;
}