test rtsp and isp

This commit is contained in:
SikongJueluo 2025-02-14 16:00:12 +08:00
parent 8567012936
commit 8aff13ac18
No known key found for this signature in database
21 changed files with 5213 additions and 735 deletions

View File

@ -31,6 +31,6 @@ ftp-tui:
termscp -P "" ftp://root@192.168.137.3:21:/
tty:
minicom -D /dev/ttyUSB0 -b 115200
sudo minicom -D /dev/ttyUSB0 -b 115200
all: build sync

View File

@ -83,6 +83,7 @@ target("sample_common")
add_defines(
"SENSOR0_TYPE=GALAXYCORE_GC2053_MIPI_2M_30FPS_10BIT",
"SENSOR1_TYPE=GALAXYCORE_GC2053_MIPI_2M_30FPS_10BIT",
"_DEFAULT_SOURCE",
{public = true}
)
add_deps("sample_audio")

View File

@ -4,6 +4,9 @@
#include "stdbool.h"
#include "stdint.h"
#define SUCCESS 0
#define FAILED (-1)
#ifndef ARRAY_LENGTH
#define ARRAY_LENGTH(arr) (sizeof(arr) / sizeof(arr[0]))
#endif

View File

@ -2,6 +2,7 @@
#include <experimental/filesystem>
#include "hi_common.h"
#include "sample_comm.h"
#include "zlog.h"
#include "isp/eb3516_video.h"
@ -38,9 +39,16 @@ int main(int argc, char** argv) {
eb3516VideoInit();
eb3516VideoStart();
eb3516VideoStop();
// eb3516Yolov3Init("./coco_yolov3_detect.wk", "./dog_bike_car_416x416.bgr");
// nnie_init();
// nnie_start();
PAUSE();
// nnie_stop();
// eb3516Yolov3Exit();
eb3516VideoStop();
zlog_fini();

View File

@ -2,6 +2,8 @@
#include "hi_comm_snap.h"
#include "hi_common.h"
#include "hi_debug.h"
#include "hi_type.h"
#include "mpi_snap.h"
#include "sample_comm.h"
#include "zlog.h"
@ -29,6 +31,8 @@ static VB_CONFIG_S g_stVbConfig = {0};
static SAMPLE_VO_CONFIG_S stVoConfig;
static SAMPLE_VPSS_CONFIG_S g_stVpss0Config = {0};
static SAMPLE_VPSS_CONFIG_S g_stVpss1Config = {0};
static VI_PIPE videoPipe = 0;
static VI_PIPE snapPipe = 1;
// 注意此处不能为通道 0, 因为 hi3516 的 VPSS 通道 0 只支持放大,
// 其它通道只支持缩小
@ -93,10 +97,10 @@ static HI_S32 VPSS_GetParams(SAMPLE_VPSS_CONFIG_S *pstVpssConfig,
return HI_SUCCESS;
}
bool eb3516VideoInit(void) {
HI_BOOL eb3516VideoInit(void) {
log_video = zlog_get_category("eb3516_video");
if (!log_video) {
return false;
return HI_FALSE;
}
// Get Sensor(VI) Info: picture size , frame rate
@ -131,8 +135,8 @@ bool eb3516VideoInit(void) {
g_stViConfig.astViInfo[0].stDevInfo.ViDev = 0;
g_stViConfig.astViInfo[0].stDevInfo.enWDRMode = WDR_MODE_NONE;
// 设置 VI PIPE 信息
g_stViConfig.astViInfo[0].stPipeInfo.aPipe[0] = 0; // video pipe
g_stViConfig.astViInfo[0].stPipeInfo.aPipe[1] = 1; // snap pipe
g_stViConfig.astViInfo[0].stPipeInfo.aPipe[0] = videoPipe; // video pipe
g_stViConfig.astViInfo[0].stPipeInfo.aPipe[1] = snapPipe; // snap pipe
g_stViConfig.astViInfo[0].stPipeInfo.aPipe[2] = -1;
g_stViConfig.astViInfo[0].stPipeInfo.aPipe[3] = -1;
g_stViConfig.astViInfo[0].stPipeInfo.enMastPipeMode = VI_OFFLINE_VPSS_OFFLINE;
@ -146,20 +150,21 @@ bool eb3516VideoInit(void) {
// 设置 VI 抓拍信息
g_stViConfig.astViInfo[0].stSnapInfo.bSnap = HI_TRUE;
g_stViConfig.astViInfo[0].stSnapInfo.bDoublePipe = HI_TRUE;
g_stViConfig.astViInfo[0].stSnapInfo.VideoPipe = 0;
g_stViConfig.astViInfo[0].stSnapInfo.SnapPipe = 1;
g_stViConfig.astViInfo[0].stSnapInfo.VideoPipe = videoPipe;
g_stViConfig.astViInfo[0].stSnapInfo.SnapPipe = snapPipe;
g_stViConfig.astViInfo[0].stSnapInfo.enVideoPipeMode =
VI_OFFLINE_VPSS_OFFLINE;
g_stViConfig.astViInfo[0].stSnapInfo.enSnapPipeMode = VI_OFFLINE_VPSS_OFFLINE;
// 配置 VPSS
VPSS_GetParams(&g_stVpss0Config, &stSize, false);
VPSS_GetParams(&g_stVpss1Config, &stSize, true);
VPSS_GetParams(&g_stVpss0Config, &stSize, HI_FALSE);
VPSS_GetParams(&g_stVpss1Config, &stSize, HI_TRUE);
zlog_debug(log_video, "eb3516 Video Init Finish...");
return HI_TRUE;
}
bool eb3516VideoStart(void) {
HI_S32 eb3516VideoStart(void) {
HI_S32 s32Ret = 0;
// 初始化 VB 和 MPI 系统
@ -208,18 +213,18 @@ bool eb3516VideoStart(void) {
zlog_debug(log_video, "eb3516 VPSS1 Start Success...");
// 绑定 VI->VPSS
s32Ret = SAMPLE_COMM_VI_Bind_VPSS(
g_stViConfig.astViInfo[0].stPipeInfo.aPipe[0],
g_stViConfig.astViInfo[0].stChnInfo.ViChn, g_stVpss0Config.s32GrpId);
s32Ret = SAMPLE_COMM_VI_Bind_VPSS(videoPipe,
g_stViConfig.astViInfo[0].stChnInfo.ViChn,
g_stVpss0Config.s32GrpId);
if (s32Ret != HI_SUCCESS) {
zlog_error(log_video, "VI Video Pipe bind VPSS0 failed with %#x!\n",
s32Ret);
goto EXIT_VPSS_STOP;
}
zlog_debug(log_video, "eb3516 VI Bind VPSS0 Success");
s32Ret = SAMPLE_COMM_VI_Bind_VPSS(
g_stViConfig.astViInfo[0].stPipeInfo.aPipe[1],
g_stViConfig.astViInfo[0].stChnInfo.ViChn, g_stVpss1Config.s32GrpId);
s32Ret = SAMPLE_COMM_VI_Bind_VPSS(snapPipe,
g_stViConfig.astViInfo[0].stChnInfo.ViChn,
g_stVpss1Config.s32GrpId);
if (s32Ret != HI_SUCCESS) {
zlog_error(log_video, "VI Snap Pipe bind VPSS1 failed with %#x!\n", s32Ret);
goto EXIT_VPSS_STOP;
@ -240,6 +245,14 @@ bool eb3516VideoStart(void) {
}
zlog_debug(log_video, "eb3516 VENC Start Success...");
// 绑定 VPSS[0,1]->VENC[0]
s32Ret = SAMPLE_COMM_VPSS_Bind_VENC(g_stVpss0Config.s32GrpId, g_Vpss0Chn[0],
g_VencChn[0]);
if (s32Ret != HI_SUCCESS) {
zlog_error(log_video, "Venc bind Vpss failed with %#x!\n", s32Ret);
goto VENC_H265_STOP;
}
/*config vo*/
SAMPLE_COMM_VO_GetDefConfig(&stVoConfig);
stVoConfig.enDstDynamicRange = DYNAMIC_RANGE_SDR8;
@ -254,7 +267,8 @@ bool eb3516VideoStart(void) {
}
zlog_debug(log_video, "eb3516 VO Start Success...");
/*vpss bind vo*/
/*vpss bind vo for hdmi output*/
// Bind VPSS[0,1] -> VENC[0] -> VO(HDMI)
s32Ret = SAMPLE_COMM_VPSS_Bind_VO(g_stVpss0Config.s32GrpId, g_Vpss0Chn[0],
stVoConfig.VoDev, g_VencChn[0]);
if (HI_SUCCESS != s32Ret) {
@ -270,7 +284,7 @@ bool eb3516VideoStart(void) {
zlog_error(log_video, "Venc Snap Start failed with %#x\n", s32Ret);
goto EXIT_VENC_H264_UNBIND;
}
// 绑定 VPSS[1,0]->VENC[2]
// 绑定 VPSS[1,1]->VENC[2] for snap pic
s32Ret = SAMPLE_COMM_VPSS_Bind_VENC(g_stVpss1Config.s32GrpId, g_Vpss1Chn,
g_VencChn[2]);
if (s32Ret != HI_SUCCESS) {
@ -285,14 +299,12 @@ bool eb3516VideoStart(void) {
stSnapAttr.stNormalAttr.u32FrameCnt = 1;
stSnapAttr.stNormalAttr.u32RepeatSendTimes = 1;
stSnapAttr.stNormalAttr.bZSL = HI_FALSE;
s32Ret = HI_MPI_SNAP_SetPipeAttr(
g_stViConfig.astViInfo[0].stPipeInfo.aPipe[1], &stSnapAttr);
s32Ret = HI_MPI_SNAP_SetPipeAttr(snapPipe, &stSnapAttr);
if (s32Ret != HI_SUCCESS) {
zlog_error(log_video, "HI_MPI_SNAP_SetPipeAttr failed with %#x!\n", s32Ret);
goto EXIT_VO_STOP;
}
s32Ret =
HI_MPI_SNAP_EnablePipe(g_stViConfig.astViInfo[0].stPipeInfo.aPipe[1]);
s32Ret = HI_MPI_SNAP_EnablePipe(snapPipe);
if (s32Ret != HI_SUCCESS) {
zlog_error(log_video, "HI_MPI_SNAP_EnablePipe failed with %#x!\n", s32Ret);
goto EXIT_VO_STOP;
@ -300,8 +312,7 @@ bool eb3516VideoStart(void) {
// 设置照片 EXIF 信息
ISP_DCF_INFO_S stIspDCF;
HI_MPI_ISP_GetDCFInfo(g_stViConfig.astViInfo[0].stPipeInfo.aPipe[0],
&stIspDCF);
HI_MPI_ISP_GetDCFInfo(snapPipe, &stIspDCF);
strncpy((char *)stIspDCF.stIspDCFConstInfo.au8ImageDescription, "",
DCF_DRSCRIPTION_LENGTH);
strncpy((char *)stIspDCF.stIspDCFConstInfo.au8Make, "OurEDA",
@ -310,39 +321,39 @@ bool eb3516VideoStart(void) {
DCF_DRSCRIPTION_LENGTH);
snprintf((char *)stIspDCF.stIspDCFConstInfo.au8Software,
DCF_DRSCRIPTION_LENGTH, "CatFeeder snap");
s32Ret = HI_MPI_ISP_SetDCFInfo(g_stViConfig.astViInfo[0].stPipeInfo.aPipe[0],
s32Ret = HI_MPI_ISP_SetDCFInfo(g_stViConfig.astViInfo[0].stPipeInfo.aPipe[1],
&stIspDCF);
if (s32Ret != HI_SUCCESS) {
zlog_error(log_video, "HI_MPI_ISP_SetDCFInfo failed with %#x!\n", s32Ret);
}
// // 绑定 VPSS[0,0]->VENC[0]
// s32Ret = SAMPLE_COMM_VPSS_Bind_VENC(g_stVpss0Config.s32GrpId,
// g_Vpss0Chn[0],
// g_VencChn[0]);
// if (s32Ret != HI_SUCCESS) {
// zlog_error(log_video, "Venc bind Vpss failed with %#x!\n", s32Ret);
// goto EXIT_VENC_H265_STOP;
// }
// Start Venc Stream
// // Start Venc Stream
// s32Ret = SAMPLE_COMM_VENC_StartGetStream(
// g_VencChn + 1, sizeof(g_VencChn) / sizeof(VENC_CHN) - 2);
// if (HI_SUCCESS != s32Ret) {
// zlog_error(log_video, "Get venc stream failed!\n");
// goto EXIT_VENC_H264_STOP;
// zlog_error(log_video, "Get venc stream failed!\n");
// goto EXIT_VENC_H264_STOP;
// }
// zlog_debug(log_video, "eb3516 Stream Start Success...");
// s32Ret = SAMPLE_COMM_VENC_SaveJpeg(g_VencChn[2], 1);
// if (HI_SUCCESS != s32Ret) {
// zlog_error(log_video, "Save Jpeg Failed");
// }
printf("=======press any key to trigger=====\n");
getchar();
s32Ret =
HI_MPI_SNAP_TriggerPipe(g_stViConfig.astViInfo[0].stPipeInfo.aPipe[1]);
if (HI_SUCCESS != s32Ret) {
SAMPLE_PRT("HI_MPI_SNAP_TriggerPipe failed with %#x!\n", s32Ret);
}
s32Ret = SAMPLE_COMM_VENC_SaveJpeg(g_VencChn[2], 1);
if (HI_SUCCESS != s32Ret) {
zlog_error(log_video, "Save Jpeg Failed");
}
zlog_info(log_video, "Mpp Start Successfully");
// PAUSE();
// SAMPLE_COMM_VENC_StopGetStream();
SAMPLE_COMM_VENC_StopGetStream();
return true;
EXIT_VENC_SNAP_STOP:
@ -372,7 +383,7 @@ EXIT_SYS_STOP:
SAMPLE_COMM_SYS_Exit();
EXIT_SYS_RST_CLK:
EXIT:
return false;
return s32Ret;
}
void eb3516VideoStop(void) {
@ -394,7 +405,7 @@ void eb3516VideoStop(void) {
zlog_info(log_video, "Finish Stopping eb3516 Video");
}
bool eb3516GetPic(void) {
HI_S32 eb3516GetPic(void) {
HI_S32 ret = HI_SUCCESS;
VIDEO_FRAME_INFO_S stRawInfo;
@ -404,6 +415,8 @@ bool eb3516GetPic(void) {
&stRawInfo, milliSec);
if (HI_SUCCESS != ret) {
zlog_error(log_video, "Get Pipe Frame Failed");
return false;
return ret;
}
return ret;
}

View File

@ -1,6 +1,7 @@
#ifndef __EB3516_VIDEO_H__
#define __EB3516_VIDEO_H__
#include "hi_type.h"
#ifdef __cplusplus
extern "C"{
#endif
@ -25,8 +26,8 @@ typedef struct {
uint64_t timestamp; // in microseconds
} video_packet_t;
bool eb3516VideoInit(void);
bool eb3516VideoStart(void);
HI_BOOL eb3516VideoInit(void);
HI_S32 eb3516VideoStart(void);
void eb3516VideoStop(void);
#ifdef __cplusplus

335
src/modules/isp/mpp/ive_img.c Executable file
View File

@ -0,0 +1,335 @@
/*
* Copyright (c) 2022 HiSilicon (Shanghai) Technologies CO., LIMITED.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdbool.h>
#include <errno.h>
#include <unistd.h>
#include "hi_comm_vb.h"
#include "mpi_sys.h"
#include "ive_img.h"
#include "sample_comm_ive.h"
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif /* End of #ifdef __cplusplus */
#define HALF_THE_HEIGHT 2 // Half the height
HI_U32 HiAlign16(HI_U32 num)
{
return (((num) + 16 - 1) / 16 * 16); // 16: align 16
}
HI_U32 HiAlign32(HI_U32 num)
{
return (((num) + 32 - 1) / 32 * 32); // 32: align 32
}
/*
* VIDEO_FRAME_INFO_S格式转换成IVE_IMAGE_S格式
*
*
* video frame to ive image.
* Copy the data pointer, do not copy the data.
*/
int FrmToOrigImg(const VIDEO_FRAME_INFO_S* frm, IVE_IMAGE_S *img)
{
static const int chnNum = 2; // Currently only supports YUV420/422, so only the addresses of 2 channels are copied
PIXEL_FORMAT_E pixelFormat = frm->stVFrame.enPixelFormat;
if (memset_s(img, sizeof(*img), 0, sizeof(*img)) != EOK) {
HI_ASSERT(0);
}
img->u32Width = frm->stVFrame.u32Width;
img->u32Height = frm->stVFrame.u32Height;
if (pixelFormat == PIXEL_FORMAT_YVU_SEMIPLANAR_420) {
img->enType = IVE_IMAGE_TYPE_YUV420SP;
} else if (pixelFormat == PIXEL_FORMAT_YVU_SEMIPLANAR_422) {
img->enType = IVE_IMAGE_TYPE_YUV422SP;
} else {
HI_ASSERT(0);
return -1;
}
for (int i = 0; i < chnNum; i++) {
img->au64PhyAddr[i] = frm->stVFrame.u64PhyAddr[i];
img->au64VirAddr[i] = frm->stVFrame.u64VirAddr[i];
img->au32Stride[i] = frm->stVFrame.u32Stride[i];
}
return 0;
}
/*
*
* Calculate the stride of a channel
*/
static uint32_t IveCalStride(IVE_IMAGE_TYPE_E enType, uint32_t width, AlignType align)
{
uint32_t size = 1;
switch (enType) {
case IVE_IMAGE_TYPE_U8C1:
case IVE_IMAGE_TYPE_S8C1:
case IVE_IMAGE_TYPE_S8C2_PACKAGE:
case IVE_IMAGE_TYPE_S8C2_PLANAR:
case IVE_IMAGE_TYPE_U8C3_PACKAGE:
case IVE_IMAGE_TYPE_U8C3_PLANAR:
size = sizeof(HI_U8);
break;
case IVE_IMAGE_TYPE_S16C1:
case IVE_IMAGE_TYPE_U16C1:
size = sizeof(HI_U16);
break;
case IVE_IMAGE_TYPE_S32C1:
case IVE_IMAGE_TYPE_U32C1:
size = sizeof(uint32_t);
break;
case IVE_IMAGE_TYPE_S64C1:
case IVE_IMAGE_TYPE_U64C1:
size = sizeof(uint64_t);
break;
default:
break;
}
if (align == ALIGN_TYPE_16) {
return HiAlign16(width * size);
} else if (align == ALIGN_TYPE_32) {
return HiAlign32(width * size);
} else {
HI_ASSERT(0);
return 0;
}
}
/*
*
* Create ive image buffer based on type and size
*/
int IveImgCreate(IVE_IMAGE_S* img,
IVE_IMAGE_TYPE_E enType, uint32_t width, uint32_t height)
{
HI_ASSERT(img);
uint32_t oneChnSize;
uint32_t size;
int ret;
if (memset_s(img, sizeof(*img), 0, sizeof(*img)) != EOK) {
HI_ASSERT(0);
}
img->enType = enType;
img->u32Width = width;
img->u32Height = height;
img->au32Stride[0] = IveCalStride(img->enType, img->u32Width, ALIGN_TYPE_16);
switch (enType) {
case IVE_IMAGE_TYPE_U8C1:
case IVE_IMAGE_TYPE_S8C1: // Only 1 channel
size = img->au32Stride[0] * img->u32Height;
ret = HI_MPI_SYS_MmzAlloc(&img->au64PhyAddr[0], (void**)&img->au64VirAddr[0], NULL, NULL, size);
SAMPLE_CHECK_EXPR_RET(HI_SUCCESS != ret, ret, "Error(%#x), HI_MPI_SYS_MmzAlloc!\n", ret);
break;
/*
* 1.5(3/2), 2
* The size is equivalent to 1.5 times (3/2) of the pixel, which is equivalent to 2 channels
*/
case IVE_IMAGE_TYPE_YUV420SP:
/*
* 22
* The size is equivalent to 2 times the pixel, which is equivalent to 2 channels
*/
case IVE_IMAGE_TYPE_YUV422SP:
if (enType == IVE_IMAGE_TYPE_YUV420SP) {
size = img->au32Stride[0] * img->u32Height * THREE_TIMES / TWO_TIMES;
} else {
size = img->au32Stride[0] * img->u32Height * TWO_TIMES;
}
ret = HI_MPI_SYS_MmzAlloc(&img->au64PhyAddr[0], (void**)&img->au64VirAddr[0], NULL, NULL, size);
SAMPLE_CHECK_EXPR_RET(HI_SUCCESS != ret, ret, "Error(%#x), HI_MPI_SYS_MmzAlloc!\n", ret);
/*
* 11
* Set the stride of the address of channel 1, both of which require channel 1
*/
img->au32Stride[1] = img->au32Stride[0];
img->au64PhyAddr[1] = img->au64PhyAddr[0] + img->au32Stride[0] * (uint64_t)img->u32Height;
img->au64VirAddr[1] = img->au64VirAddr[0] + img->au32Stride[0] * (uint64_t)img->u32Height;
break;
case IVE_IMAGE_TYPE_U8C3_PLANAR: // 3 channels, often used for RGB
oneChnSize = img->au32Stride[0] * img->u32Height;
size = oneChnSize * 3; // 3 channels have the same size
ret = HI_MPI_SYS_MmzAlloc(&img->au64PhyAddr[0], (void**)&img->au64VirAddr[0], NULL, NULL, size);
SAMPLE_CHECK_EXPR_RET(HI_SUCCESS != ret, ret, "Error(%#x), HI_MPI_SYS_MmzAlloc!\n", ret);
/*
* 12
* Set the address and stride of channel 1 and channel 2
*/
img->au64VirAddr[1] = img->au64VirAddr[0] + oneChnSize;
img->au64PhyAddr[1] = img->au64PhyAddr[0] + oneChnSize;
img->au32Stride[1] = img->au32Stride[0];
img->au64VirAddr[2] = img->au64VirAddr[1] + oneChnSize; // 2: au64VirAddr array subscript, not out of bounds
img->au64PhyAddr[2] = img->au64PhyAddr[1] + oneChnSize; // 2: au64VirAddr array subscript, not out of bounds
img->au32Stride[2] = img->au32Stride[0]; // 2: au64VirAddr array subscript, not out of bounds
break;
/*
* YVC420P, YUV422P, S8C2_PACKAGE, S8C2_PLANAR,
* S32C1, U32C1, S64C1, U64C1, S16C1, U16C1, U8C3_PACKAGE等
*
* Types not currently supported: YVC420P, YUV422P, S8C2_PACKAGE, S8C2_PLANAR,
* S32C1, U32C1, S64C1, U64C1, S16C1, U16C1, U8C3_PACKAGE,etc.
*/
default:
HI_ASSERT(0);
break;
}
return HI_SUCCESS;
}
int ImgYuvCrop(const IVE_IMAGE_S *src, IVE_IMAGE_S *dst, const RectBox* origBox)
{
RectBox box = *origBox;
int boxWidth = box.xmax - box.xmin;
int boxHeight = box.ymax - box.ymin;
int ret;
HI_ASSERT(boxWidth > 0 && boxWidth <= src->u32Width);
HI_ASSERT(boxHeight > 0 && boxHeight <= src->u32Height);
HI_ASSERT(src->au64VirAddr[0]);
HI_ASSERT(src->au32Stride[0] >= src->u32Width);
/*
* / 2
* Adjust the width/height of the box to a multiple of 2
*/
if (boxWidth == 1 || boxHeight == 1) {
SAMPLE_PRT("box dstWidth=1 && dstHeight=1\n");
return -1;
}
if (boxWidth % HI_OVEN_BASE) {
box.xmax--;
boxWidth--;
}
if (boxHeight % HI_OVEN_BASE) {
box.ymax--;
boxHeight--;
}
ret = IveImgCreate(dst, src->enType, boxWidth, boxHeight);
HI_ASSERT(!ret);
/*
*
* copy box from src to dst
*/
/*
* Y分量
* Y component
*/
int srcStrideY = src->au32Stride[0];
int dstStrideY = dst->au32Stride[0];
uint8_t *srcBufY = (uint8_t*)((uintptr_t)src->au64VirAddr[0]);
uint8_t *dstBufY = (uint8_t*)((uintptr_t)dst->au64VirAddr[0]);
uint8_t *srcPtrY = &srcBufY[box.ymin * srcStrideY];
uint8_t *dstPtrY = dstBufY;
for (int h = 0; h < boxHeight; h++, srcPtrY += srcStrideY, dstPtrY += dstStrideY) {
if (memcpy_s(dstPtrY, boxWidth, srcPtrY + box.xmin, boxWidth) != EOK) {
HI_ASSERT(0);
}
}
HI_ASSERT(dstPtrY - dstBufY == boxHeight * dstStrideY);
/*
* UV分量
* UV component
*/
int srcStrideUV = src->au32Stride[1];
int dstStrideUV = dst->au32Stride[1];
uint8_t *srcBufUV = (uint8_t*)((uintptr_t)src->au64VirAddr[1]);
uint8_t *dstBufUV = (uint8_t*)((uintptr_t)dst->au64VirAddr[1]);
uint8_t *srcPtrUV = &srcBufUV[(box.ymin / HALF_THE_HEIGHT) * srcStrideUV];
uint8_t *dstPtrUV = dstBufUV;
for (int h = 0; h < (boxHeight / HALF_THE_HEIGHT);
h++, srcPtrUV += srcStrideUV, dstPtrUV += dstStrideUV) {
if (memcpy_s(dstPtrUV, boxWidth, srcPtrUV + box.xmin, boxWidth) != EOK) {
HI_ASSERT(0);
}
}
HI_ASSERT(dstPtrUV - dstBufUV == (boxHeight / HALF_THE_HEIGHT) * dstStrideUV);
return ret;
}
/*
* ive image
* Destory ive image
*/
void IveImgDestroy(IVE_IMAGE_S* img)
{
for (int i = 0; i < IMG_FULL_CHN; i++) {
if (img->au64PhyAddr[0] && img->au64VirAddr[0]) {
HI_MPI_SYS_MmzFree(img->au64PhyAddr[i], (void*)((uintptr_t)img->au64VirAddr[i]));
img->au64PhyAddr[i] = 0;
img->au64VirAddr[i] = 0;
}
}
if (memset_s(img, sizeof(*img), 0, sizeof(*img)) != EOK) {
HI_ASSERT(0);
}
}
int OrigImgToFrm(const IVE_IMAGE_S *img, VIDEO_FRAME_INFO_S* frm)
{
static const int chnNum = 2;
IVE_IMAGE_TYPE_E enType = img->enType;
if (memset_s(frm, sizeof(*frm), 0, sizeof(*frm)) != EOK) {
HI_ASSERT(0);
}
frm->stVFrame.u32Width = img->u32Width;
frm->stVFrame.u32Height = img->u32Height;
if (enType == IVE_IMAGE_TYPE_YUV420SP) {
frm->stVFrame.enPixelFormat = PIXEL_FORMAT_YVU_SEMIPLANAR_420;
} else if (enType == IVE_IMAGE_TYPE_YUV422SP) {
frm->stVFrame.enPixelFormat = PIXEL_FORMAT_YVU_SEMIPLANAR_422;
} else {
HI_ASSERT(0);
return -1;
}
for (int i = 0; i < chnNum; i++) {
frm->stVFrame.u64PhyAddr[i] = img->au64PhyAddr[i];
frm->stVFrame.u64VirAddr[i] = img->au64VirAddr[i];
frm->stVFrame.u32Stride[i] = img->au32Stride[i];
}
return 0;
}
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* End of #ifdef __cplusplus */

93
src/modules/isp/mpp/ive_img.h Executable file
View File

@ -0,0 +1,93 @@
/*
* Copyright (c) 2022 HiSilicon (Shanghai) Technologies CO., LIMITED.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef IVE_IMG_H
#define IVE_IMG_H
#include <stdbool.h>
#include <stdint.h>
#include "hi_common.h"
#include "hi_comm_ive.h"
#include "hi_comm_video.h"
#include "hi_comm_venc.h"
#include "hi_ive.h"
#include "mpi_ive.h"
#include "util.h"
#if __cplusplus
extern "C" {
#endif
/*
*
* Constant
*/
#define IMG_FULL_CHN 3 // Full channel / three channel, for YUV444, RGB888
#define IMG_HALF_CHN 2 // Half channel, for YUV420/422
#define THREE_TIMES 3
#define TWO_TIMES 2
/*
*
* Byte alignment calculation
*/
HI_U32 HiAlign16(HI_U32 num);
HI_U32 HiAlign32(HI_U32 num);
/*
*
* Alignment type
*/
typedef enum AlignType {
ALIGN_TYPE_2 = 2, // Align by 2 bytes
ALIGN_TYPE_16 = 16, // Align by 16 bytes
ALIGN_TYPE_32 = 32, // Align by 32 bytes
} AlignType;
/*
*
* Create ive image buffer based on type and size
*/
int IveImgCreate(IVE_IMAGE_S* img,
IVE_IMAGE_TYPE_E enType, uint32_t width, uint32_t height);
/*
* VIDEO_FRAME_INFO_S格式转换成IVE_IMAGE_S格式
*
*
* video frame to ive image.
* Copy the data pointer, do not copy the data.
*/
int FrmToOrigImg(const VIDEO_FRAME_INFO_S* frm, IVE_IMAGE_S *img);
/*
* yuv格式进行裁剪
* yuv file crop
*/
int ImgYuvCrop(const IVE_IMAGE_S *src, IVE_IMAGE_S *dst, const RectBox* origBox);
/*
* ive image
* Destory ive image
*/
void IveImgDestroy(IVE_IMAGE_S* img);
int OrigImgToFrm(const IVE_IMAGE_S *img, VIDEO_FRAME_INFO_S* frm);
#ifdef __cplusplus
}
#endif
#endif

1265
src/modules/isp/mpp/osd_img.c Executable file

File diff suppressed because it is too large Load Diff

287
src/modules/isp/mpp/osd_img.h Executable file
View File

@ -0,0 +1,287 @@
/*
* Copyright (c) 2022 HiSilicon (Shanghai) Technologies CO., LIMITED.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef OSD_IMG_H
#define OSD_IMG_H
#include <stdbool.h>
#include <stdint.h>
#include <pthread.h>
#include "hi_comm_region.h"
#include "hi_common.h"
#if __cplusplus
extern "C" {
#endif
#define HI_OSD_MAX_CNT (16) // Maximum OSD Count
#define HI_OSD_MAX_DISP_CNT (2) // Maximum Display Count for Each OSD
#define HI_OSD_MAX_STR_LEN (64) // String OSD Maximum Length
typedef HI_S32 HI_ERRNO;
/*
*
* Common error code
*/
#define HI_ERRNO_COMMON_BASE 0
#define HI_ERRNO_COMMON_COUNT 256
#define HI_EUNKNOWN (HI_ERRNO)(HI_ERRNO_COMMON_BASE + 1)
#define HI_EOTHER (HI_ERRNO)(HI_ERRNO_COMMON_BASE + 2)
#define HI_EINTER (HI_ERRNO)(HI_ERRNO_COMMON_BASE + 3)
#define HI_EVERSION (HI_ERRNO)(HI_ERRNO_COMMON_BASE + 4)
#define HI_EPAERM (HI_ERRNO)(HI_ERRNO_COMMON_BASE + 5)
#define HI_EINVAL (HI_ERRNO)(HI_ERRNO_COMMON_BASE + 6)
#define HI_ENOINIT (HI_ERRNO)(HI_ERRNO_COMMON_BASE + 7)
#define HI_ENOTREADY (HI_ERRNO)(HI_ERRNO_COMMON_BASE + 8)
#define HI_ENORES (HI_ERRNO)(HI_ERRNO_COMMON_BASE + 9)
#define HI_EEXIST (HI_ERRNO)(HI_ERRNO_COMMON_BASE + 10)
#define HI_ELOST (HI_ERRNO)(HI_ERRNO_COMMON_BASE + 11)
#define HI_ENOOP (HI_ERRNO)(HI_ERRNO_COMMON_BASE + 12)
#define HI_EBUSY (HI_ERRNO)(HI_ERRNO_COMMON_BASE + 13)
#define HI_EIDLE (HI_ERRNO)(HI_ERRNO_COMMON_BASE + 14)
#define HI_EFULL (HI_ERRNO)(HI_ERRNO_COMMON_BASE + 15)
#define HI_EEMPTY (HI_ERRNO)(HI_ERRNO_COMMON_BASE + 16)
#define HI_EUNDERFLOW (HI_ERRNO)(HI_ERRNO_COMMON_BASE + 17)
#define HI_EOVERFLOW (HI_ERRNO)(HI_ERRNO_COMMON_BASE + 18)
#define HI_EACCES (HI_ERRNO)(HI_ERRNO_COMMON_BASE + 19)
#define HI_EINTR (HI_ERRNO)(HI_ERRNO_COMMON_BASE + 20)
#define HI_ECONTINUE (HI_ERRNO)(HI_ERRNO_COMMON_BASE + 21)
#define HI_EOVER (HI_ERRNO)(HI_ERRNO_COMMON_BASE + 22)
#define HI_ERRNO_COMMON_BOTTOM (HI_ERRNO)(HI_ERRNO_COMMON_BASE + 23)
/*
*
* Custom error code
*/
#define HI_ERRNO_BASE (HI_ERRNO)(HI_ERRNO_COMMON_BASE + HI_ERRNO_COMMON_COUNT)
#define HI_EINITIALIZED (HI_ERRNO)(HI_ERRNO_BASE + 1) // Repeated initialization
#define HI_ERRNO_CUSTOM_BOTTOM (HI_ERRNO)(HI_ERRNO_BASE + 2) // Number of error numbers that have been defined
/*
* pthread互斥锁
* pthread mutex lock
*/
static inline void MutexLock(pthread_mutex_t* mutex)
{
if (pthread_mutex_lock(mutex) != 0) {
HI_ASSERT(0);
}
}
/*
* mutex所指向的互斥锁
* pthread mutex unlock
*/
static inline void MutexUnlock(pthread_mutex_t* mutex)
{
if (pthread_mutex_unlock(mutex) != 0) {
HI_ASSERT(0);
}
}
typedef HI_S32 (*HI_OSD_GETFONTMOD_CALLBACK_FN_PTR)(HI_CHAR* Character, HI_U8** FontMod, HI_S32* FontModLen);
/*
* OSD字体库
* OSD Fonts Lib
*/
typedef struct hiOSD_FONTS_S {
/* OSD Lib Font Size, in pixel */
HI_U32 u32FontWidth;
HI_U32 u32FontHeight;
HI_OSD_GETFONTMOD_CALLBACK_FN_PTR pfnGetFontMod;
} HI_OSD_FONTS_S;
/*
* OSD像素格式枚举
* OSD pixel format enum
*/
typedef enum hiOSD_PIXEL_FMT_E {
HI_OSD_PIXEL_FMT_RGB1555 = 0,
HI_OSD_PIXEL_FMT_BUTT
} HI_OSD_PIXEL_FMT_E;
/*
* OSD位图属性
* OSD Bitmap Attribute
*/
typedef struct hiOSD_BITMAP_ATTR_S {
HI_OSD_PIXEL_FMT_E enPixelFormat;
HI_U32 u32Width;
HI_U32 u32Height;
HI_U64 u64PhyAddr;
HI_VOID* pvData;
} HI_OSD_BITMAP_ATTR_S;
/*
* OSD类型枚举
* OSD Type Enum
*/
typedef enum hiOSD_TYPE_E {
HI_OSD_TYPE_TIME = 0,
HI_OSD_TYPE_STRING,
HI_OSD_TYPE_BITMAP,
HI_OSD_TYPE_BUTT
} HI_OSD_TYPE_E;
/*
* OSD时间格式枚举
* OSD Time Format Enum
*/
typedef enum hiOSD_TIMEFMT_E {
HI_OSD_TIMEFMT_YMD24H = 0, // eg. 2017-03-10 23:00:59
HI_OSD_TIMEFMT_BUTT
} HI_OSD_TIMEFMT_E;
/*
* OSD绑定模块枚举
* OSD Binded Module enum
*/
typedef enum hiOSD_BIND_MOD_E {
HI_OSD_BINDMOD_VI = 0,
HI_OSD_BINDMOD_VPSS,
HI_OSD_BINDMOD_AVS,
HI_OSD_BINDMOD_VENC,
HI_OSD_BINDMOD_VO,
HI_OSD_BINDMOD_BUTT
} HI_OSD_BIND_MOD_E;
typedef enum hiOSD_COORDINATE_E {
HI_OSD_COORDINATE_RATIO_COOR = 0,
HI_OSD_COORDINATE_ABS_COOR
} HI_OSD_COORDINATE_E;
/*
* OSD显示属性
* OSD Display Attribute
*/
typedef struct hiOSD_DISP_ATTR_S {
HI_BOOL bShow;
HI_OSD_BIND_MOD_E enBindedMod;
HI_HANDLE ModHdl;
HI_HANDLE ChnHdl;
HI_U32 u32FgAlpha;
HI_U32 u32BgAlpha;
HI_OSD_COORDINATE_E enCoordinate; // Coordinate mode of the osd start Position
POINT_S stStartPos; // OSD Start Position
ATTACH_DEST_E enAttachDest; // only for venc
HI_S32 s32Batch;
} HI_OSD_DISP_ATTR_S;
/*
* OSD内容
* OSD Content
*/
typedef struct hiOSD_CONTENT_S {
HI_OSD_TYPE_E enType;
HI_OSD_TIMEFMT_E enTimeFmt;
HI_U32 u32Color; // string color
HI_U32 u32BgColor;
HI_CHAR szStr[HI_OSD_MAX_STR_LEN];
SIZE_S stFontSize;
HI_OSD_BITMAP_ATTR_S stBitmap; // Pixel Format: Only Support RGB1555 for now
} HI_OSD_CONTENT_S;
/*
* OSD属性
* OSD attribution
*/
typedef struct hiOSD_ATTR_S {
HI_U32 u32DispNum; /* 1Binded Display Number for this OSD */
HI_OSD_DISP_ATTR_S astDispAttr[HI_OSD_MAX_DISP_CNT];
HI_OSD_CONTENT_S stContent;
} HI_OSD_ATTR_S;
/*
* OSD参数
* OSD Parameter
*/
typedef struct tagOSD_PARAM_S {
HI_OSD_ATTR_S stAttr;
SIZE_S stMaxSize;
pthread_mutex_t mutexLock;
HI_BOOL bInit; /* OSD Attribute Set or not, Canbe modified only HI_OSD_SetAttr */
HI_BOOL bOn; /* OSD On/Off Flag, Canbe modified only by HI_OSD_Start/HI_OSD_Stop */
} OSD_PARAM_S;
typedef struct hiOSD_TEXTBITMAP_S {
RGN_HANDLE rgnHdl;
HI_OSD_CONTENT_S pstContent;
RGN_CANVAS_INFO_S stCanvasInfo;
} HI_OSD_TEXTBITMAP_S;
/*
* OSD区域设置
* OSD region set
*/
struct OsdSet {
// OSD Binded Module: Static
HI_OSD_BIND_MOD_E bindMod;
// Binded Module Handle: Static eg.VcapPipeHdl, VpssHdl, StitchHdl, DispHdl, 0
HI_U32 modHnd;
// Binded Channel Handle: Static eg.PipeChnHdl, VPortHdl, StitchPortHdl, WndHdl, VencHdl
HI_U32 chnHnd;
};
typedef struct OsdSet OsdSet;
/*
* OsdSet中创建区域
* Create a region in OsdSet
*/
int OsdsCreateRgn(OsdSet* self);
/*
*
* Set the attribute value of the text region
*/
int TxtRgnInit(HI_OSD_ATTR_S* rgnAttr, const char* str, uint32_t begX, uint32_t begY, uint32_t color);
/*
* OsdSet中的所有区域
* Destroy all regions in OsdSet
*/
void OsdsClear(OsdSet* self);
/*
* OsdSet中设置指定区域的属性
* Set attributes for the specified region in OsdSet
*/
int OsdsSetRgn(OsdSet* self, int rgnHnd, const HI_OSD_ATTR_S* rgnAttr);
/*
* OsdSet
* Creat OsdSet
*/
OsdSet* OsdsCreate(HI_OSD_BIND_MOD_E bindMod, HI_U32 modHnd, HI_U32 chnHnd);
/*
* OsdSet
* Destory OsdSet
*/
void OsdsDestroy(OsdSet* self);
/*
* OsdSet库
* Initialize OsdSet lib
*/
int OsdLibInit(void);
#ifdef __cplusplus
}
#endif
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,194 @@
#ifndef __SAMPLE_COMM_IVE_H__
#define __SAMPLE_COMM_IVE_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include "hi_debug.h"
#include "hi_comm_ive.h"
#include "mpi_ive.h"
#include "sample_comm.h"
#define VIDEO_WIDTH 352
#define VIDEO_HEIGHT 288
#define IVE_ALIGN 16
#define IVE_CHAR_CALW 8
#define IVE_CHAR_CALH 8
#define IVE_CHAR_NUM (IVE_CHAR_CALW *IVE_CHAR_CALH)
#define IVE_FILE_NAME_LEN 256
#define IVE_RECT_NUM 64
#define VPSS_CHN_NUM 2
#define SAMPLE_ALIGN_BACK(x, a) ((a) * (((x) / (a))))
typedef struct hiSAMPLE_IVE_SWITCH_S
{
HI_BOOL bVenc;
HI_BOOL bVo;
}SAMPLE_IVE_SWITCH_S;
typedef struct hiSAMPLE_IVE_RECT_S
{
POINT_S astPoint[4];
} SAMPLE_IVE_RECT_S;
typedef struct hiSAMPLE_RECT_ARRAY_S
{
HI_U16 u16Num;
SAMPLE_IVE_RECT_S astRect[IVE_RECT_NUM];
} SAMPLE_RECT_ARRAY_S;
typedef struct hiIVE_LINEAR_DATA_S
{
HI_S32 s32LinearNum;
HI_S32 s32ThreshNum;
POINT_S* pstLinearPoint;
} IVE_LINEAR_DATA_S;
typedef struct hiSAMPLE_IVE_DRAW_RECT_MSG_S
{
VIDEO_FRAME_INFO_S stFrameInfo;
SAMPLE_RECT_ARRAY_S stRegion;
} SAMPLE_IVE_DRAW_RECT_MSG_S;
//free mmz
#define IVE_MMZ_FREE(phy,vir)\
do{\
if ((0 != (phy)) && (0 != (vir)))\
{\
HI_MPI_SYS_MmzFree((phy),(HI_VOID *)(HI_UL)(vir));\
(phy) = 0;\
(vir) = 0;\
}\
}while(0)
#define IVE_CLOSE_FILE(fp)\
do{\
if (NULL != (fp))\
{\
fclose((fp));\
(fp) = NULL;\
}\
}while(0)
#define SAMPLE_PAUSE()\
do {\
printf("---------------press Enter key to exit!---------------\n");\
(void)getchar();\
} while (0)
#define SAMPLE_CHECK_EXPR_RET(expr, ret, fmt...)\
do\
{\
if(expr)\
{\
SAMPLE_PRT(fmt);\
return (ret);\
}\
}while(0)
#define SAMPLE_CHECK_EXPR_GOTO(expr, label, fmt...)\
do\
{\
if(expr)\
{\
SAMPLE_PRT(fmt);\
goto label;\
}\
}while(0)
#define SAMPLE_COMM_IVE_CONVERT_64BIT_ADDR(Type,Addr) (Type*)(HI_UL)(Addr)
/******************************************************************************
* function : Mpi init
******************************************************************************/
HI_VOID SAMPLE_COMM_IVE_CheckIveMpiInit(HI_VOID);
/******************************************************************************
* function : Mpi exit
******************************************************************************/
HI_S32 SAMPLE_COMM_IVE_IveMpiExit(HI_VOID);
/******************************************************************************
* function :Read file
******************************************************************************/
HI_S32 SAMPLE_COMM_IVE_ReadFile(IVE_IMAGE_S* pstImg, FILE* pFp);
/******************************************************************************
* function :Write file
******************************************************************************/
HI_S32 SAMPLE_COMM_IVE_WriteFile(IVE_IMAGE_S* pstImg, FILE* pFp);
/******************************************************************************
* function :Calc stride
******************************************************************************/
HI_U16 SAMPLE_COMM_IVE_CalcStride(HI_U32 u32Width, HI_U8 u8Align);
/******************************************************************************
* function : Copy blob to rect
******************************************************************************/
HI_VOID SAMPLE_COMM_IVE_BlobToRect(IVE_CCBLOB_S *pstBlob, SAMPLE_RECT_ARRAY_S *pstRect,
HI_U16 u16RectMaxNum,HI_U16 u16AreaThrStep,
HI_U32 u32SrcWidth, HI_U32 u32SrcHeight,
HI_U32 u32DstWidth,HI_U32 u32DstHeight);
/******************************************************************************
* function : Create ive image
******************************************************************************/
HI_S32 SAMPLE_COMM_IVE_CreateImage(IVE_IMAGE_S* pstImg, IVE_IMAGE_TYPE_E enType,
HI_U32 u32Width, HI_U32 u32Height);
/******************************************************************************
* function : Create memory info
******************************************************************************/
HI_S32 SAMPLE_COMM_IVE_CreateMemInfo(IVE_MEM_INFO_S* pstMemInfo, HI_U32 u32Size);
/******************************************************************************
* function : Create ive image by cached
******************************************************************************/
HI_S32 SAMPLE_COMM_IVE_CreateImageByCached(IVE_IMAGE_S* pstImg,
IVE_IMAGE_TYPE_E enType, HI_U32 u32Width, HI_U32 u32Height);
/******************************************************************************
* function : Create IVE_DATA_S
******************************************************************************/
HI_S32 SAMPLE_COMM_IVE_CreateData(IVE_DATA_S* pstData,HI_U32 u32Width, HI_U32 u32Height);
/******************************************************************************
* function : Init Vb
******************************************************************************/
HI_S32 SAMPLE_COMM_IVE_VbInit(PIC_SIZE_E *paenSize,SIZE_S *pastSize,HI_U32 u32VpssChnNum);
/******************************************************************************
* function : Dma frame info to ive image
******************************************************************************/
HI_S32 SAMPLE_COMM_IVE_DmaImage(VIDEO_FRAME_INFO_S *pstFrameInfo,IVE_DST_IMAGE_S *pstDst,HI_BOOL bInstant);
/******************************************************************************
* function : Call vgs to fill rect
******************************************************************************/
HI_S32 SAMPLE_COMM_VGS_FillRect(VIDEO_FRAME_INFO_S* pstFrmInfo, SAMPLE_RECT_ARRAY_S* pstRect, HI_U32 u32Color);
/******************************************************************************
* function : Start Vpss
******************************************************************************/
HI_S32 SAMPLE_COMM_IVE_StartVpss(SIZE_S *pastSize,HI_U32 u32VpssChnNum);
/******************************************************************************
* function : Stop Vpss
******************************************************************************/
HI_VOID SAMPLE_COMM_IVE_StopVpss(HI_U32 u32VpssChnNum);
/******************************************************************************
* function : Start Vo
******************************************************************************/
HI_S32 SAMPLE_COMM_IVE_StartVo(HI_VOID);
/******************************************************************************
* function : Stop Vo
******************************************************************************/
HI_VOID SAMPLE_COMM_IVE_StopVo(HI_VOID);
/******************************************************************************
* function : Start Vi/Vpss/Venc/Vo
******************************************************************************/
HI_S32 SAMPLE_COMM_IVE_StartViVpssVencVo(SAMPLE_VI_CONFIG_S *pstViConfig,SAMPLE_IVE_SWITCH_S *pstSwitch,PIC_SIZE_E *penExtPicSize);
/******************************************************************************
* function : Stop Vi/Vpss/Venc/Vo
******************************************************************************/
HI_VOID SAMPLE_COMM_IVE_StopViVpssVencVo(SAMPLE_VI_CONFIG_S *pstViConfig,SAMPLE_IVE_SWITCH_S *pstSwitch);
#endif

View File

@ -0,0 +1,380 @@
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x01 ,0x00 ,0x03 ,0x80 ,0x03 ,0x80 ,0x03 ,0x80 ,0x03 ,0x80 ,
0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,
0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x01 ,0x80 ,0x03 ,0x80 ,
0x03 ,0x80 ,0x01 ,0x80 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x06 ,0x70 ,0x06 ,0x70 ,0x06 ,0x70 ,0x06 ,0x60 ,0x06 ,0x60 ,0x06 ,0x60 ,0x06 ,0x60 ,
0x06 ,0x20 ,0x04 ,0x40 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x04 ,0x18 ,0x0c ,0x18 ,0x0c ,0x10 ,0x08 ,0x10 ,
0x08 ,0x10 ,0x7f ,0xfe ,0x7f ,0xfe ,0x08 ,0x10 ,0x08 ,0x10 ,0x08 ,0x10 ,0x08 ,0x10 ,0x08 ,0x10 ,
0x08 ,0x30 ,0x08 ,0x30 ,0x7f ,0xfe ,0x7f ,0xfe ,0x10 ,0x20 ,0x10 ,0x20 ,0x10 ,0x20 ,0x10 ,0x20 ,
0x10 ,0x20 ,0x10 ,0x20 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x01 ,0x80 ,0x01 ,0x80 ,0x07 ,0xe0 ,0x0d ,0xb0 ,0x19 ,0x98 ,0x19 ,0x98 ,
0x19 ,0xb8 ,0x19 ,0xb0 ,0x19 ,0x80 ,0x1d ,0x80 ,0x0f ,0x80 ,0x07 ,0x80 ,0x01 ,0xc0 ,0x01 ,0xe0 ,
0x01 ,0xf0 ,0x01 ,0xb8 ,0x01 ,0x98 ,0x19 ,0x98 ,0x39 ,0x98 ,0x39 ,0x98 ,0x31 ,0x98 ,0x11 ,0x90 ,
0x0d ,0xe0 ,0x03 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x38 ,0x10 ,0x44 ,0x10 ,0x46 ,0x20 ,0xc6 ,0x20 ,
0xc6 ,0x20 ,0xc6 ,0x40 ,0xc6 ,0x40 ,0xc6 ,0x80 ,0x46 ,0x80 ,0x44 ,0x80 ,0x3d ,0x18 ,0x01 ,0x64 ,
0x02 ,0x46 ,0x02 ,0x46 ,0x04 ,0xc6 ,0x04 ,0xc6 ,0x04 ,0xc6 ,0x08 ,0xc6 ,0x08 ,0x46 ,0x10 ,0x46 ,
0x10 ,0x2c ,0x10 ,0x10 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x0f ,0x80 ,0x18 ,0x80 ,0x10 ,0xc0 ,0x10 ,0xc0 ,
0x10 ,0xc0 ,0x10 ,0x80 ,0x19 ,0x80 ,0x19 ,0x00 ,0x1a ,0x00 ,0x1c ,0x7c ,0x1c ,0x18 ,0x2c ,0x10 ,
0x66 ,0x10 ,0x46 ,0x10 ,0xc7 ,0x20 ,0xc3 ,0x20 ,0xc1 ,0xa0 ,0xc1 ,0xc0 ,0x60 ,0xe0 ,0x70 ,0xf2 ,
0x3f ,0x3e ,0x0c ,0x18 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x03 ,0x00 ,0x03 ,0x80 ,0x03 ,0x00 ,0x03 ,0x00 ,0x03 ,0x00 ,0x03 ,0x00 ,0x03 ,0x00 ,0x02 ,0x00 ,
0x02 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x04 ,0x00 ,0x0c ,0x00 ,0x18 ,0x00 ,0x10 ,0x00 ,0x20 ,0x00 ,0x60 ,0x00 ,0x40 ,0x00 ,0xc0 ,
0x00 ,0xc0 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,
0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x00 ,0x80 ,0x00 ,0xc0 ,0x00 ,0xc0 ,0x00 ,0x40 ,0x00 ,0x60 ,
0x00 ,0x30 ,0x00 ,0x10 ,0x00 ,0x08 ,0x00 ,0x04 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x40 ,0x00 ,0x20 ,0x00 ,0x10 ,0x00 ,0x18 ,0x00 ,0x0c ,0x00 ,0x04 ,0x00 ,0x06 ,0x00 ,0x02 ,0x00 ,
0x03 ,0x00 ,0x03 ,0x00 ,0x01 ,0x00 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,
0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x00 ,0x03 ,0x00 ,0x03 ,0x00 ,0x02 ,0x00 ,0x06 ,0x00 ,0x04 ,0x00 ,
0x0c ,0x00 ,0x18 ,0x00 ,0x10 ,0x00 ,0x20 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x01 ,0x80 ,
0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x79 ,0x8e ,0x3d ,0xbe ,0x1e ,0xf0 ,0x01 ,0x80 ,0x03 ,0xc0 ,
0x06 ,0x70 ,0x0c ,0x38 ,0x1c ,0x1c ,0x38 ,0x0c ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x01 ,0x80 ,0x01 ,0x80 ,
0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x7f ,0xfe ,0x01 ,0x80 ,
0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x1c ,0x00 ,0x1e ,0x00 ,
0x0e ,0x00 ,0x06 ,0x00 ,0x06 ,0x00 ,0x0c ,0x00 ,0x18 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x7f ,0xfe ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x18 ,0x00 ,0x3c ,0x00 ,
0x3c ,0x00 ,0x18 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x02 ,0x00 ,0x04 ,0x00 ,0x04 ,0x00 ,0x08 ,0x00 ,0x08 ,0x00 ,0x10 ,0x00 ,0x10 ,
0x00 ,0x20 ,0x00 ,0x20 ,0x00 ,0x40 ,0x00 ,0x40 ,0x00 ,0x80 ,0x00 ,0x80 ,0x01 ,0x00 ,0x01 ,0x00 ,
0x02 ,0x00 ,0x02 ,0x00 ,0x06 ,0x00 ,0x04 ,0x00 ,0x0c ,0x00 ,0x08 ,0x00 ,0x18 ,0x00 ,0x10 ,0x00 ,
0x10 ,0x00 ,0x20 ,0x00 ,0x20 ,0x00 ,0x40 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x07 ,0xc0 ,0x0c ,0x30 ,0x18 ,0x30 ,0x18 ,0x18 ,
0x38 ,0x18 ,0x30 ,0x1c ,0x30 ,0x0c ,0x30 ,0x0c ,0x70 ,0x0c ,0x70 ,0x0c ,0x70 ,0x0c ,0x70 ,0x0c ,
0x70 ,0x0c ,0x30 ,0x0c ,0x30 ,0x0c ,0x30 ,0x1c ,0x30 ,0x18 ,0x18 ,0x18 ,0x18 ,0x18 ,0x0c ,0x30 ,
0x06 ,0x60 ,0x01 ,0x80 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x80 ,0x03 ,0x80 ,0x07 ,0x80 ,0x01 ,0x80 ,
0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,
0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,
0x07 ,0xf0 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x07 ,0xe0 ,0x18 ,0x30 ,0x10 ,0x18 ,0x30 ,0x18 ,
0x30 ,0x1c ,0x38 ,0x1c ,0x38 ,0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,0x30 ,0x00 ,0x60 ,0x00 ,0x40 ,
0x00 ,0x80 ,0x01 ,0x00 ,0x02 ,0x00 ,0x04 ,0x00 ,0x08 ,0x04 ,0x10 ,0x04 ,0x30 ,0x0c ,0x20 ,0x38 ,
0x3f ,0xf8 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x0f ,0xc0 ,0x18 ,0x30 ,0x30 ,0x30 ,0x30 ,0x18 ,
0x38 ,0x18 ,0x10 ,0x18 ,0x00 ,0x18 ,0x00 ,0x30 ,0x00 ,0x60 ,0x03 ,0xc0 ,0x01 ,0xe0 ,0x00 ,0x30 ,
0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,0x0c ,0x00 ,0x0c ,0x30 ,0x0c ,0x38 ,0x1c ,0x30 ,0x18 ,0x30 ,0x30 ,
0x0c ,0x60 ,0x03 ,0x80 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x20 ,0x00 ,0x60 ,0x00 ,0xe0 ,0x00 ,0xe0 ,
0x01 ,0x60 ,0x03 ,0x60 ,0x02 ,0x60 ,0x04 ,0x60 ,0x04 ,0x60 ,0x08 ,0x60 ,0x10 ,0x60 ,0x10 ,0x60 ,
0x20 ,0x60 ,0x60 ,0x60 ,0x7f ,0xfe ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,
0x01 ,0xfc ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x1f ,0xf8 ,0x1f ,0xf8 ,0x10 ,0x00 ,0x10 ,0x00 ,
0x10 ,0x00 ,0x10 ,0x00 ,0x10 ,0x00 ,0x10 ,0x00 ,0x17 ,0xe0 ,0x18 ,0x30 ,0x10 ,0x18 ,0x00 ,0x18 ,
0x00 ,0x0c ,0x00 ,0x0c ,0x00 ,0x0c ,0x10 ,0x0c ,0x38 ,0x0c ,0x30 ,0x18 ,0x30 ,0x18 ,0x10 ,0x30 ,
0x0c ,0x60 ,0x03 ,0x80 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x03 ,0xf0 ,0x04 ,0x18 ,0x08 ,0x18 ,0x18 ,0x18 ,
0x10 ,0x00 ,0x30 ,0x00 ,0x30 ,0x00 ,0x30 ,0x00 ,0x33 ,0xf0 ,0x74 ,0x38 ,0x78 ,0x18 ,0x70 ,0x0c ,
0x70 ,0x0c ,0x70 ,0x0c ,0x30 ,0x0c ,0x30 ,0x0c ,0x30 ,0x0c ,0x30 ,0x0c ,0x18 ,0x08 ,0x1c ,0x18 ,
0x0e ,0x70 ,0x01 ,0x80 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x1f ,0xfc ,0x3f ,0xfc ,0x30 ,0x08 ,0x20 ,0x10 ,
0x20 ,0x10 ,0x00 ,0x20 ,0x00 ,0x20 ,0x00 ,0x60 ,0x00 ,0x40 ,0x00 ,0xc0 ,0x00 ,0x80 ,0x01 ,0x80 ,
0x01 ,0x80 ,0x01 ,0x80 ,0x03 ,0x00 ,0x03 ,0x00 ,0x03 ,0x00 ,0x03 ,0x00 ,0x03 ,0x00 ,0x07 ,0x00 ,
0x03 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x0f ,0xe0 ,0x18 ,0x10 ,0x30 ,0x18 ,0x30 ,0x0c ,
0x30 ,0x0c ,0x30 ,0x0c ,0x30 ,0x08 ,0x38 ,0x18 ,0x1e ,0x30 ,0x0f ,0xe0 ,0x07 ,0xe0 ,0x18 ,0xf0 ,
0x30 ,0x38 ,0x30 ,0x18 ,0x60 ,0x0c ,0x60 ,0x0c ,0x60 ,0x0c ,0x60 ,0x0c ,0x30 ,0x08 ,0x10 ,0x18 ,
0x0c ,0x70 ,0x03 ,0x80 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x0f ,0xc0 ,0x18 ,0x30 ,0x30 ,0x18 ,0x30 ,0x18 ,
0x70 ,0x18 ,0x60 ,0x0c ,0x60 ,0x0c ,0x60 ,0x0c ,0x70 ,0x0c ,0x30 ,0x1c ,0x30 ,0x2c ,0x38 ,0x6c ,
0x0f ,0xcc ,0x00 ,0x1c ,0x00 ,0x1c ,0x00 ,0x18 ,0x00 ,0x18 ,0x10 ,0x30 ,0x38 ,0x30 ,0x38 ,0x60 ,
0x18 ,0xc0 ,0x07 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x03 ,0x80 ,0x03 ,0x80 ,0x03 ,0x80 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x01 ,0x80 ,0x03 ,0x80 ,
0x03 ,0x80 ,0x01 ,0x80 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x03 ,0x80 ,0x03 ,0x80 ,0x03 ,0x80 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x03 ,0x80 ,
0x03 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x00 ,0x03 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x08 ,0x00 ,0x10 ,0x00 ,0x20 ,0x00 ,0x40 ,
0x00 ,0x80 ,0x01 ,0x00 ,0x02 ,0x00 ,0x04 ,0x00 ,0x08 ,0x00 ,0x10 ,0x00 ,0x30 ,0x00 ,0x18 ,0x00 ,
0x0c ,0x00 ,0x06 ,0x00 ,0x03 ,0x00 ,0x01 ,0x80 ,0x00 ,0xc0 ,0x00 ,0x60 ,0x00 ,0x30 ,0x00 ,0x18 ,
0x00 ,0x0c ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x7f ,0xfe ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x7f ,0xfe ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x20 ,0x00 ,0x30 ,0x00 ,0x18 ,0x00 ,0x0c ,0x00 ,0x06 ,0x00 ,
0x03 ,0x00 ,0x01 ,0x80 ,0x00 ,0xc0 ,0x00 ,0x60 ,0x00 ,0x30 ,0x00 ,0x18 ,0x00 ,0x0c ,0x00 ,0x18 ,
0x00 ,0x30 ,0x00 ,0x60 ,0x00 ,0xc0 ,0x01 ,0x80 ,0x03 ,0x00 ,0x06 ,0x00 ,0x0c ,0x00 ,0x18 ,0x00 ,
0x30 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x01 ,0x80 ,0x0f ,0xf0 ,0x10 ,0x18 ,0x30 ,0x1c ,0x20 ,0x0c ,
0x20 ,0x0c ,0x30 ,0x0c ,0x38 ,0x0c ,0x10 ,0x1c ,0x00 ,0x18 ,0x00 ,0x30 ,0x00 ,0xe0 ,0x01 ,0x80 ,
0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x01 ,0x80 ,0x03 ,0x80 ,
0x03 ,0x80 ,0x01 ,0x80 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x03 ,0xf0 ,0x0c ,0x18 ,0x08 ,0x04 ,0x10 ,0x04 ,
0x30 ,0xf2 ,0x21 ,0x12 ,0x23 ,0x32 ,0x62 ,0x32 ,0x66 ,0x32 ,0x66 ,0x32 ,0x64 ,0x22 ,0x64 ,0x22 ,
0x64 ,0x22 ,0x64 ,0x64 ,0x64 ,0x64 ,0x26 ,0xb8 ,0x33 ,0x10 ,0x10 ,0x02 ,0x18 ,0x04 ,0x08 ,0x08 ,
0x06 ,0x70 ,0x01 ,0x80 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x01 ,0x80 ,0x03 ,0x80 ,0x03 ,0x80 ,0x02 ,0xc0 ,
0x02 ,0xc0 ,0x04 ,0xc0 ,0x04 ,0xc0 ,0x04 ,0x60 ,0x04 ,0x60 ,0x08 ,0x60 ,0x08 ,0x60 ,0x08 ,0x30 ,
0x08 ,0x30 ,0x17 ,0xf0 ,0x10 ,0x30 ,0x10 ,0x30 ,0x10 ,0x18 ,0x20 ,0x18 ,0x20 ,0x18 ,0x20 ,0x18 ,
0x70 ,0x3e ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x7f ,0xe0 ,0x38 ,0x38 ,0x38 ,0x18 ,0x38 ,0x1c ,
0x38 ,0x0c ,0x38 ,0x0c ,0x38 ,0x1c ,0x38 ,0x18 ,0x38 ,0x30 ,0x3f ,0xc0 ,0x38 ,0x70 ,0x38 ,0x18 ,
0x38 ,0x0c ,0x38 ,0x0c ,0x38 ,0x0e ,0x38 ,0x0e ,0x38 ,0x0e ,0x38 ,0x0e ,0x38 ,0x0c ,0x38 ,0x18 ,
0x7f ,0xf0 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x03 ,0xfc ,0x0c ,0x0c ,0x18 ,0x04 ,0x18 ,0x04 ,
0x30 ,0x02 ,0x30 ,0x00 ,0x70 ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,
0x60 ,0x00 ,0x60 ,0x00 ,0x70 ,0x00 ,0x70 ,0x02 ,0x30 ,0x02 ,0x30 ,0x04 ,0x18 ,0x04 ,0x1c ,0x08 ,
0x07 ,0xf0 ,0x01 ,0x80 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x7f ,0x80 ,0x38 ,0x60 ,0x38 ,0x30 ,0x38 ,0x18 ,
0x38 ,0x0c ,0x38 ,0x0c ,0x38 ,0x0c ,0x38 ,0x0e ,0x38 ,0x0e ,0x38 ,0x0e ,0x38 ,0x0e ,0x38 ,0x0e ,
0x38 ,0x0e ,0x38 ,0x0e ,0x38 ,0x0c ,0x38 ,0x0c ,0x38 ,0x0c ,0x38 ,0x18 ,0x38 ,0x18 ,0x38 ,0x70 ,
0x3f ,0xc0 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x7f ,0xf8 ,0x18 ,0x1c ,0x18 ,0x04 ,0x18 ,0x04 ,
0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x20 ,0x18 ,0x20 ,0x1f ,0xe0 ,0x18 ,0x60 ,0x18 ,0x20 ,
0x18 ,0x20 ,0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x02 ,0x18 ,0x02 ,0x18 ,0x04 ,0x18 ,0x0c ,
0x7f ,0xfc ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x7f ,0xfc ,0x18 ,0x0c ,0x18 ,0x06 ,0x18 ,0x02 ,
0x18 ,0x02 ,0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x10 ,0x18 ,0x10 ,0x18 ,0x30 ,0x1f ,0xf0 ,0x18 ,0x10 ,
0x18 ,0x10 ,0x18 ,0x10 ,0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,
0x7c ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x07 ,0xf8 ,0x0c ,0x38 ,0x18 ,0x18 ,0x10 ,0x08 ,
0x30 ,0x08 ,0x30 ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,
0x60 ,0x7e ,0x60 ,0x18 ,0x60 ,0x18 ,0x70 ,0x18 ,0x30 ,0x18 ,0x30 ,0x18 ,0x18 ,0x18 ,0x18 ,0x18 ,
0x0e ,0x20 ,0x01 ,0xc0 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0xfc ,0x3e ,0x30 ,0x1c ,0x30 ,0x1c ,0x30 ,0x1c ,
0x30 ,0x1c ,0x30 ,0x1c ,0x30 ,0x1c ,0x30 ,0x1c ,0x30 ,0x1c ,0x30 ,0x1c ,0x3f ,0xfc ,0x30 ,0x1c ,
0x30 ,0x1c ,0x30 ,0x1c ,0x30 ,0x1c ,0x30 ,0x1c ,0x30 ,0x1c ,0x30 ,0x1c ,0x30 ,0x1c ,0x30 ,0x1c ,
0x78 ,0x3e ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x1f ,0xf8 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,
0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,
0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,
0x1f ,0xf0 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x07 ,0xfe ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,
0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,
0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,0x30 ,0x40 ,0x30 ,0xc0 ,
0x3f ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x7c ,0x7e ,0x38 ,0x18 ,0x38 ,0x30 ,0x38 ,0x20 ,
0x38 ,0x40 ,0x38 ,0x80 ,0x38 ,0x80 ,0x39 ,0x00 ,0x3b ,0x00 ,0x3f ,0x80 ,0x3d ,0x80 ,0x39 ,0x80 ,
0x38 ,0xc0 ,0x38 ,0xc0 ,0x38 ,0x60 ,0x38 ,0x60 ,0x38 ,0x30 ,0x38 ,0x30 ,0x38 ,0x18 ,0x38 ,0x18 ,
0x7c ,0x3e ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x7e ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,
0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,
0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x02 ,0x18 ,0x02 ,0x18 ,0x04 ,0x18 ,0x0c ,
0x7f ,0xfc ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0xf0 ,0x1f ,0x30 ,0x1c ,0x30 ,0x1c ,0x38 ,0x1c ,
0x38 ,0x2c ,0x38 ,0x2c ,0x38 ,0x2c ,0x28 ,0x2c ,0x2c ,0x4c ,0x2c ,0x4c ,0x2c ,0x4c ,0x2c ,0x4c ,
0x24 ,0x8c ,0x26 ,0x8c ,0x26 ,0x8c ,0x26 ,0x8c ,0x22 ,0x8c ,0x23 ,0x0c ,0x23 ,0x0c ,0x23 ,0x0c ,
0x73 ,0x1e ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0xf0 ,0x1f ,0x38 ,0x04 ,0x38 ,0x04 ,0x2c ,0x04 ,
0x2c ,0x04 ,0x26 ,0x04 ,0x26 ,0x04 ,0x23 ,0x04 ,0x23 ,0x04 ,0x21 ,0x84 ,0x21 ,0x84 ,0x20 ,0xc4 ,
0x20 ,0xc4 ,0x20 ,0x64 ,0x20 ,0x74 ,0x20 ,0x34 ,0x20 ,0x3c ,0x20 ,0x1c ,0x20 ,0x1c ,0x20 ,0x0c ,
0x78 ,0x0c ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x07 ,0xe0 ,0x0c ,0x30 ,0x18 ,0x18 ,0x30 ,0x08 ,
0x30 ,0x0c ,0x30 ,0x0c ,0x70 ,0x0e ,0x70 ,0x0e ,0x60 ,0x06 ,0x60 ,0x06 ,0x60 ,0x06 ,0x60 ,0x06 ,
0x60 ,0x06 ,0x60 ,0x06 ,0x70 ,0x0e ,0x30 ,0x0c ,0x30 ,0x0c ,0x30 ,0x0c ,0x18 ,0x18 ,0x08 ,0x10 ,
0x06 ,0x60 ,0x01 ,0x80 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x7f ,0xe0 ,0x18 ,0x18 ,0x18 ,0x0c ,0x18 ,0x0c ,
0x18 ,0x0e ,0x18 ,0x0e ,0x18 ,0x0e ,0x18 ,0x0c ,0x18 ,0x0c ,0x18 ,0x18 ,0x18 ,0x70 ,0x1f ,0x80 ,
0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,
0x7c ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x07 ,0xe0 ,0x0c ,0x30 ,0x18 ,0x18 ,0x30 ,0x08 ,
0x30 ,0x0c ,0x30 ,0x0c ,0x70 ,0x0c ,0x60 ,0x0e ,0x60 ,0x0e ,0x60 ,0x0e ,0x60 ,0x0e ,0x60 ,0x0e ,
0x60 ,0x0e ,0x60 ,0x0e ,0x60 ,0x0e ,0x77 ,0x8c ,0x3d ,0xcc ,0x38 ,0xcc ,0x18 ,0x58 ,0x18 ,0x70 ,
0x06 ,0x60 ,0x01 ,0xf0 ,0x00 ,0x3c ,0x00 ,0x3c ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x7f ,0xe0 ,0x18 ,0x38 ,0x18 ,0x18 ,0x18 ,0x0c ,
0x18 ,0x0c ,0x18 ,0x0c ,0x18 ,0x0c ,0x18 ,0x1c ,0x18 ,0x18 ,0x18 ,0x70 ,0x1f ,0xc0 ,0x18 ,0xc0 ,
0x18 ,0xc0 ,0x18 ,0x60 ,0x18 ,0x60 ,0x18 ,0x30 ,0x18 ,0x30 ,0x18 ,0x30 ,0x18 ,0x18 ,0x18 ,0x18 ,
0x7c ,0x1e ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x0f ,0xe8 ,0x10 ,0x38 ,0x30 ,0x18 ,0x20 ,0x08 ,
0x20 ,0x08 ,0x20 ,0x00 ,0x30 ,0x00 ,0x38 ,0x00 ,0x1c ,0x00 ,0x0f ,0x80 ,0x03 ,0xe0 ,0x00 ,0xf0 ,
0x00 ,0x38 ,0x00 ,0x18 ,0x00 ,0x0c ,0x40 ,0x0c ,0x40 ,0x0c ,0x20 ,0x0c ,0x20 ,0x08 ,0x30 ,0x18 ,
0x3c ,0x70 ,0x03 ,0x80 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x3f ,0xfc ,0x21 ,0x8c ,0x61 ,0x84 ,0x41 ,0x84 ,
0x41 ,0x82 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,
0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,
0x07 ,0xe0 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0xfc ,0x1e ,0x30 ,0x08 ,0x30 ,0x08 ,0x30 ,0x08 ,
0x30 ,0x08 ,0x30 ,0x08 ,0x30 ,0x08 ,0x30 ,0x08 ,0x30 ,0x08 ,0x30 ,0x08 ,0x30 ,0x08 ,0x30 ,0x08 ,
0x30 ,0x08 ,0x30 ,0x08 ,0x30 ,0x08 ,0x30 ,0x08 ,0x30 ,0x08 ,0x30 ,0x08 ,0x30 ,0x08 ,0x18 ,0x10 ,
0x0e ,0x60 ,0x01 ,0x80 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0xfc ,0x3e ,0x30 ,0x08 ,0x30 ,0x08 ,0x18 ,0x08 ,
0x18 ,0x10 ,0x18 ,0x10 ,0x18 ,0x10 ,0x0c ,0x10 ,0x0c ,0x20 ,0x0c ,0x20 ,0x0c ,0x20 ,0x06 ,0x40 ,
0x06 ,0x40 ,0x06 ,0x40 ,0x06 ,0x40 ,0x03 ,0x80 ,0x03 ,0x80 ,0x03 ,0x80 ,0x03 ,0x80 ,0x01 ,0x00 ,
0x01 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0xfb ,0xcf ,0x61 ,0x84 ,0x61 ,0x84 ,0x21 ,0x84 ,
0x31 ,0x84 ,0x31 ,0x84 ,0x31 ,0xc8 ,0x31 ,0xc8 ,0x31 ,0xc8 ,0x12 ,0xc8 ,0x12 ,0xc8 ,0x1a ,0x50 ,
0x1a ,0x50 ,0x1a ,0x70 ,0x1c ,0x70 ,0x1c ,0x70 ,0x0c ,0x70 ,0x0c ,0x60 ,0x0c ,0x20 ,0x0c ,0x20 ,
0x08 ,0x20 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x7c ,0x3e ,0x18 ,0x18 ,0x18 ,0x10 ,0x0c ,0x10 ,
0x0c ,0x20 ,0x06 ,0x20 ,0x06 ,0x40 ,0x02 ,0x40 ,0x03 ,0x80 ,0x03 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,
0x02 ,0xc0 ,0x02 ,0xc0 ,0x04 ,0x60 ,0x04 ,0x60 ,0x0c ,0x30 ,0x08 ,0x30 ,0x08 ,0x18 ,0x10 ,0x18 ,
0x78 ,0x3e ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x7c ,0x3e ,0x30 ,0x08 ,0x18 ,0x08 ,0x18 ,0x10 ,
0x18 ,0x10 ,0x0c ,0x20 ,0x0c ,0x20 ,0x06 ,0x20 ,0x06 ,0x40 ,0x06 ,0x40 ,0x03 ,0x40 ,0x03 ,0x80 ,
0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,
0x07 ,0xe0 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x1f ,0xfc ,0x18 ,0x0c ,0x30 ,0x18 ,0x20 ,0x18 ,
0x00 ,0x30 ,0x00 ,0x70 ,0x00 ,0x60 ,0x00 ,0xe0 ,0x00 ,0xc0 ,0x01 ,0x80 ,0x01 ,0x80 ,0x03 ,0x00 ,
0x03 ,0x00 ,0x06 ,0x00 ,0x06 ,0x00 ,0x0c ,0x00 ,0x0c ,0x00 ,0x18 ,0x04 ,0x18 ,0x04 ,0x30 ,0x0c ,
0x7f ,0xf8 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x03 ,0xfc ,0x03 ,0xfc ,0x02 ,0x00 ,0x02 ,0x00 ,0x02 ,0x00 ,0x02 ,0x00 ,0x02 ,0x00 ,0x02 ,0x00 ,
0x02 ,0x00 ,0x02 ,0x00 ,0x02 ,0x00 ,0x02 ,0x00 ,0x02 ,0x00 ,0x02 ,0x00 ,0x02 ,0x00 ,0x02 ,0x00 ,
0x02 ,0x00 ,0x02 ,0x00 ,0x02 ,0x00 ,0x02 ,0x00 ,0x02 ,0x00 ,0x02 ,0x00 ,0x02 ,0x00 ,0x02 ,0x00 ,
0x02 ,0x00 ,0x02 ,0x00 ,0x02 ,0x00 ,0x03 ,0xfc ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x10 ,0x00 ,0x10 ,0x00 ,0x18 ,0x00 ,0x08 ,0x00 ,0x0c ,0x00 ,
0x04 ,0x00 ,0x04 ,0x00 ,0x06 ,0x00 ,0x02 ,0x00 ,0x03 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x80 ,
0x00 ,0x80 ,0x00 ,0xc0 ,0x00 ,0x40 ,0x00 ,0x40 ,0x00 ,0x60 ,0x00 ,0x20 ,0x00 ,0x30 ,0x00 ,0x10 ,
0x00 ,0x10 ,0x00 ,0x18 ,0x00 ,0x08 ,0x00 ,0x0c ,0x00 ,0x04 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x3f ,0xc0 ,0x3f ,0xc0 ,0x00 ,0xc0 ,0x00 ,0xc0 ,0x00 ,0xc0 ,0x00 ,0xc0 ,0x00 ,0xc0 ,0x00 ,0xc0 ,
0x00 ,0xc0 ,0x00 ,0xc0 ,0x00 ,0xc0 ,0x00 ,0xc0 ,0x00 ,0xc0 ,0x00 ,0xc0 ,0x00 ,0xc0 ,0x00 ,0xc0 ,
0x00 ,0xc0 ,0x00 ,0xc0 ,0x00 ,0xc0 ,0x00 ,0xc0 ,0x00 ,0xc0 ,0x00 ,0xc0 ,0x00 ,0xc0 ,0x00 ,0xc0 ,
0x00 ,0xc0 ,0x00 ,0xc0 ,0x00 ,0xc0 ,0x3f ,0xc0 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x03 ,0xc0 ,0x06 ,0xe0 ,0x0c ,0x20 ,0x00 ,0x10 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0xff ,0xff ,0x00 ,0x00 ,0x00 ,0x00 ,
0x1e ,0x00 ,0x07 ,0x00 ,0x01 ,0x80 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x07 ,0xc0 ,0x18 ,0x30 ,0x30 ,0x10 ,0x30 ,0x18 ,0x00 ,0x18 ,
0x00 ,0x78 ,0x07 ,0x98 ,0x18 ,0x18 ,0x30 ,0x18 ,0x70 ,0x18 ,0x60 ,0x18 ,0x60 ,0x18 ,0x30 ,0x3a ,
0x1f ,0xde ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x10 ,0x00 ,0x70 ,0x00 ,0x30 ,0x00 ,0x30 ,0x00 ,0x30 ,0x00 ,
0x30 ,0x00 ,0x30 ,0x00 ,0x30 ,0x00 ,0x31 ,0xc0 ,0x32 ,0x30 ,0x34 ,0x18 ,0x38 ,0x0c ,0x38 ,0x0c ,
0x30 ,0x0c ,0x30 ,0x0c ,0x30 ,0x0c ,0x30 ,0x0c ,0x30 ,0x0c ,0x30 ,0x0c ,0x30 ,0x18 ,0x38 ,0x18 ,
0x37 ,0xf0 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x03 ,0xe0 ,0x0c ,0x30 ,0x18 ,0x18 ,0x18 ,0x18 ,0x30 ,0x18 ,
0x30 ,0x00 ,0x30 ,0x00 ,0x30 ,0x00 ,0x30 ,0x00 ,0x30 ,0x00 ,0x30 ,0x04 ,0x18 ,0x08 ,0x18 ,0x08 ,
0x0f ,0x70 ,0x00 ,0xc0 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x08 ,0x00 ,0x78 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,
0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x03 ,0x98 ,0x0e ,0x78 ,0x18 ,0x18 ,0x18 ,0x18 ,0x30 ,0x18 ,
0x30 ,0x18 ,0x30 ,0x18 ,0x30 ,0x18 ,0x30 ,0x18 ,0x30 ,0x18 ,0x30 ,0x18 ,0x10 ,0x18 ,0x18 ,0x38 ,
0x0f ,0xde ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x03 ,0xc0 ,0x0c ,0x30 ,0x18 ,0x18 ,0x10 ,0x18 ,0x30 ,0x0c ,
0x30 ,0x0c ,0x30 ,0x0c ,0x3f ,0xf0 ,0x30 ,0x00 ,0x30 ,0x00 ,0x30 ,0x00 ,0x18 ,0x08 ,0x18 ,0x08 ,
0x07 ,0x70 ,0x00 ,0xc0 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0xf8 ,0x01 ,0x06 ,0x03 ,0x06 ,0x02 ,0x04 ,
0x02 ,0x00 ,0x06 ,0x00 ,0x06 ,0x00 ,0x3f ,0xf8 ,0x06 ,0x00 ,0x06 ,0x00 ,0x06 ,0x00 ,0x06 ,0x00 ,
0x06 ,0x00 ,0x06 ,0x00 ,0x06 ,0x00 ,0x06 ,0x00 ,0x06 ,0x00 ,0x06 ,0x00 ,0x06 ,0x00 ,0x06 ,0x00 ,
0x1f ,0xe0 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x03 ,0x8e ,0x0c ,0x76 ,0x18 ,0x30 ,0x10 ,0x10 ,0x10 ,0x10 ,
0x10 ,0x10 ,0x18 ,0x10 ,0x08 ,0x30 ,0x0e ,0xe0 ,0x11 ,0x00 ,0x10 ,0x00 ,0x1f ,0x80 ,0x0f ,0xf8 ,
0x10 ,0x3c ,0x20 ,0x0c ,0x20 ,0x0c ,0x20 ,0x0c ,0x10 ,0x18 ,0x0f ,0xf0 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x10 ,0x00 ,0x70 ,0x00 ,0x10 ,0x00 ,0x10 ,0x00 ,0x10 ,0x00 ,
0x10 ,0x00 ,0x10 ,0x00 ,0x10 ,0x00 ,0x11 ,0xe0 ,0x17 ,0x30 ,0x1c ,0x18 ,0x18 ,0x18 ,0x10 ,0x18 ,
0x10 ,0x18 ,0x10 ,0x18 ,0x10 ,0x18 ,0x10 ,0x18 ,0x10 ,0x18 ,0x10 ,0x18 ,0x10 ,0x18 ,0x10 ,0x18 ,
0x7c ,0x3c ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x01 ,0x80 ,0x03 ,0xc0 ,0x01 ,0x80 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x80 ,0x1f ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,
0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,
0x0f ,0xf0 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x38 ,0x00 ,0x38 ,0x00 ,0x30 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x01 ,0xf0 ,0x00 ,0x30 ,0x00 ,0x30 ,0x00 ,0x30 ,0x00 ,0x30 ,
0x00 ,0x30 ,0x00 ,0x30 ,0x00 ,0x30 ,0x00 ,0x30 ,0x00 ,0x30 ,0x00 ,0x30 ,0x00 ,0x30 ,0x00 ,0x30 ,
0x00 ,0x30 ,0x00 ,0x30 ,0x00 ,0x30 ,0x38 ,0x20 ,0x18 ,0x60 ,0x0f ,0x80 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x08 ,0x00 ,0x78 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,
0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x7c ,0x18 ,0x30 ,0x18 ,0x60 ,0x18 ,0x40 ,0x18 ,0x80 ,
0x19 ,0x00 ,0x1b ,0x80 ,0x1c ,0xc0 ,0x18 ,0xc0 ,0x18 ,0x60 ,0x18 ,0x70 ,0x18 ,0x30 ,0x18 ,0x18 ,
0x7c ,0x3c ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x01 ,0x80 ,0x1f ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,
0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,
0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,
0x1f ,0xf0 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0xe7 ,0x38 ,0x69 ,0xcc ,0x71 ,0x84 ,0x61 ,0x86 ,0x61 ,0x86 ,
0x61 ,0x86 ,0x61 ,0x86 ,0x61 ,0x86 ,0x61 ,0x86 ,0x61 ,0x86 ,0x61 ,0x86 ,0x61 ,0x86 ,0x61 ,0x86 ,
0x73 ,0xce ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x71 ,0xe0 ,0x12 ,0x30 ,0x1c ,0x18 ,0x18 ,0x18 ,0x10 ,0x18 ,
0x10 ,0x18 ,0x10 ,0x18 ,0x10 ,0x18 ,0x10 ,0x18 ,0x10 ,0x18 ,0x10 ,0x18 ,0x10 ,0x18 ,0x10 ,0x18 ,
0x7c ,0x3c ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x03 ,0xc0 ,0x0c ,0x30 ,0x18 ,0x18 ,0x30 ,0x08 ,0x30 ,0x0c ,
0x30 ,0x0c ,0x60 ,0x0c ,0x60 ,0x0c ,0x60 ,0x0c ,0x30 ,0x0c ,0x30 ,0x0c ,0x30 ,0x08 ,0x18 ,0x18 ,
0x0c ,0x20 ,0x03 ,0xc0 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x71 ,0xc0 ,0x36 ,0x30 ,0x14 ,0x18 ,0x18 ,0x0c ,0x10 ,0x0c ,
0x10 ,0x0c ,0x10 ,0x0c ,0x10 ,0x0c ,0x10 ,0x0c ,0x10 ,0x0c ,0x10 ,0x0c ,0x18 ,0x18 ,0x18 ,0x18 ,
0x16 ,0x70 ,0x11 ,0x80 ,0x10 ,0x00 ,0x10 ,0x00 ,0x10 ,0x00 ,0x7e ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x03 ,0x88 ,0x0c ,0x68 ,0x18 ,0x18 ,0x30 ,0x18 ,0x30 ,0x18 ,
0x30 ,0x18 ,0x30 ,0x18 ,0x30 ,0x18 ,0x30 ,0x18 ,0x30 ,0x18 ,0x30 ,0x18 ,0x30 ,0x18 ,0x18 ,0x38 ,
0x0f ,0xd8 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,0x18 ,0x00 ,0x7e ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x7c ,0x38 ,0x0c ,0x4c ,0x0c ,0x8c ,0x0d ,0x00 ,0x0e ,0x00 ,
0x0c ,0x00 ,0x0c ,0x00 ,0x0c ,0x00 ,0x0c ,0x00 ,0x0c ,0x00 ,0x0c ,0x00 ,0x0c ,0x00 ,0x0c ,0x00 ,
0x7f ,0xc0 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x03 ,0xc8 ,0x0c ,0x38 ,0x18 ,0x18 ,0x18 ,0x08 ,0x18 ,0x00 ,
0x1c ,0x00 ,0x0f ,0x80 ,0x01 ,0xe0 ,0x00 ,0x78 ,0x00 ,0x18 ,0x10 ,0x0c ,0x10 ,0x08 ,0x18 ,0x08 ,
0x1f ,0xf0 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x02 ,0x00 ,
0x02 ,0x00 ,0x02 ,0x00 ,0x06 ,0x00 ,0x3f ,0xf0 ,0x02 ,0x00 ,0x02 ,0x00 ,0x02 ,0x00 ,0x02 ,0x00 ,
0x02 ,0x00 ,0x02 ,0x00 ,0x02 ,0x00 ,0x02 ,0x00 ,0x02 ,0x00 ,0x02 ,0x04 ,0x02 ,0x08 ,0x03 ,0x08 ,
0x01 ,0xf0 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x70 ,0x78 ,0x30 ,0x18 ,0x30 ,0x18 ,0x30 ,0x18 ,0x30 ,0x18 ,
0x30 ,0x18 ,0x30 ,0x18 ,0x30 ,0x18 ,0x30 ,0x18 ,0x30 ,0x18 ,0x10 ,0x18 ,0x10 ,0x18 ,0x18 ,0x38 ,
0x0f ,0xde ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x7c ,0x3e ,0x18 ,0x18 ,0x18 ,0x10 ,0x18 ,0x10 ,0x0c ,0x10 ,
0x0c ,0x20 ,0x0c ,0x20 ,0x06 ,0x20 ,0x06 ,0x40 ,0x02 ,0x40 ,0x03 ,0x80 ,0x03 ,0x80 ,0x01 ,0x80 ,
0x01 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0xfb ,0xdf ,0x61 ,0x84 ,0x21 ,0x84 ,0x31 ,0x84 ,0x31 ,0x88 ,
0x31 ,0xc8 ,0x12 ,0xc8 ,0x12 ,0xc8 ,0x1a ,0x50 ,0x1a ,0x50 ,0x0c ,0x70 ,0x0c ,0x70 ,0x0c ,0x20 ,
0x0c ,0x20 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x3e ,0x7c ,0x1c ,0x10 ,0x0c ,0x30 ,0x06 ,0x20 ,0x06 ,0x40 ,
0x03 ,0xc0 ,0x01 ,0x80 ,0x01 ,0x80 ,0x03 ,0xc0 ,0x02 ,0x40 ,0x04 ,0x60 ,0x08 ,0x30 ,0x08 ,0x30 ,
0x78 ,0x7c ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x7e ,0x7e ,0x18 ,0x18 ,0x18 ,0x10 ,0x0c ,0x10 ,0x0c ,0x30 ,
0x0c ,0x20 ,0x06 ,0x20 ,0x06 ,0x60 ,0x02 ,0x40 ,0x03 ,0x40 ,0x03 ,0x80 ,0x01 ,0x80 ,0x01 ,0x80 ,
0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x02 ,0x00 ,0x3e ,0x00 ,0x1c ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x1f ,0xf8 ,0x38 ,0x30 ,0x30 ,0x30 ,0x20 ,0x60 ,0x20 ,0xc0 ,
0x00 ,0xc0 ,0x01 ,0x80 ,0x03 ,0x00 ,0x03 ,0x00 ,0x06 ,0x04 ,0x0c ,0x08 ,0x0c ,0x08 ,0x18 ,0x08 ,
0x3f ,0xf8 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x0c ,0x00 ,0x30 ,0x00 ,0x20 ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,
0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x40 ,0x00 ,0x40 ,0x00 ,0xc0 ,0x01 ,0x00 ,0x00 ,0xc0 ,
0x00 ,0x40 ,0x00 ,0x40 ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,0x00 ,0x60 ,
0x00 ,0x60 ,0x00 ,0x20 ,0x00 ,0x20 ,0x00 ,0x38 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,
0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,
0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,
0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x01 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x30 ,0x00 ,0x0c ,0x00 ,0x04 ,0x00 ,0x04 ,0x00 ,0x04 ,0x00 ,0x04 ,0x00 ,0x04 ,0x00 ,0x04 ,0x00 ,
0x04 ,0x00 ,0x04 ,0x00 ,0x04 ,0x00 ,0x04 ,0x00 ,0x06 ,0x00 ,0x03 ,0x00 ,0x00 ,0x80 ,0x03 ,0x00 ,
0x06 ,0x00 ,0x04 ,0x00 ,0x04 ,0x00 ,0x04 ,0x00 ,0x04 ,0x00 ,0x04 ,0x00 ,0x04 ,0x00 ,0x04 ,0x00 ,
0x04 ,0x00 ,0x04 ,0x00 ,0x04 ,0x00 ,0x18 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x23 ,0x02 ,0x41 ,0x82 ,0x40 ,0xc4 ,0x00 ,0x6c ,0x00 ,0x30 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,
0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,

493
src/modules/isp/mpp/vgs_img.c Executable file
View File

@ -0,0 +1,493 @@
/*
* Copyright (c) 2022 HiSilicon (Shanghai) Technologies CO., LIMITED.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdbool.h>
#include "hi_comm_vb.h"
#include "hi_comm_vgs.h"
#include "hi_comm_region.h"
#include "sample_comm.h"
#include "mpi_sys.h"
#include "mpi_vgs.h"
#include "hi_buffer.h"
#include "vgs_img.h"
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif /* End of #ifdef __cplusplus */
#define VGS_MAX_LINE 100 // The maximum number of lines for a superimposed graphics operation
#define RECT_LINES 4 // The number of lines in a rectangle
#define RECT_LINE1 1
#define RECT_LINE2 2
#define RECT_LINE3 3
/*
* buffer
* Set the buf of the frame
*/
static void MppFrmSetBuf(VIDEO_FRAME_INFO_S* frm,
const VB_CAL_CONFIG_S *vbCfg, HI_U64 phyAddr, uint8_t *virAddr)
{
/*
* SP422/SP420SP444
* Currently only SP422/SP420 is supported, SP444 is not supported
*/
frm->stVFrame.u32HeaderStride[0] = vbCfg->u32HeadStride;
frm->stVFrame.u32HeaderStride[1] = vbCfg->u32HeadStride;
frm->stVFrame.u32HeaderStride[2] = vbCfg->u32HeadStride; // 2: Array subscript, not out of bounds
frm->stVFrame.u64HeaderPhyAddr[0] = phyAddr;
frm->stVFrame.u64HeaderPhyAddr[1] = frm->stVFrame.u64HeaderPhyAddr[0] + vbCfg->u32HeadYSize;
frm->stVFrame.u64HeaderPhyAddr[2] = frm->stVFrame.u64HeaderPhyAddr[1]; // 2: Array subscript, not out of bounds
frm->stVFrame.u64HeaderVirAddr[0] = (HI_U64)(HI_UL)virAddr;
frm->stVFrame.u64HeaderVirAddr[1] = frm->stVFrame.u64HeaderVirAddr[0] + vbCfg->u32HeadYSize;
frm->stVFrame.u64HeaderVirAddr[2] = frm->stVFrame.u64HeaderVirAddr[1]; // 2: Array subscript, not out of bounds
frm->stVFrame.u32Stride[0] = vbCfg->u32MainStride;
frm->stVFrame.u32Stride[1] = vbCfg->u32MainStride;
frm->stVFrame.u32Stride[2] = vbCfg->u32MainStride; // 2: Array subscript, not out of bounds
frm->stVFrame.u64PhyAddr[0] = frm->stVFrame.u64HeaderPhyAddr[0] + vbCfg->u32HeadSize;
frm->stVFrame.u64PhyAddr[1] = frm->stVFrame.u64PhyAddr[0] + vbCfg->u32MainYSize;
frm->stVFrame.u64PhyAddr[2] = frm->stVFrame.u64PhyAddr[1]; // 2: Array subscript, not out of bounds
frm->stVFrame.u64VirAddr[0] = frm->stVFrame.u64HeaderVirAddr[0] + vbCfg->u32HeadSize;
frm->stVFrame.u64VirAddr[1] = frm->stVFrame.u64VirAddr[0] + vbCfg->u32MainYSize;
frm->stVFrame.u64VirAddr[2] = frm->stVFrame.u64VirAddr[1]; // 2: Array subscript, not out of bounds
}
/*
* frame buf.
* frame所需空间frame分配内存.
* @param frm[in|out]: frame信息会复制到frm.
* @param width[in]: frame width.
* @param height[in]: frame height.
* @param pixelFormat[in]: -1PIXEL_FORMAT_YVU_SEMIPLANAR_420.
* @param bitWidth[in]: -1DATA_BITWIDTH_8.
* @param compressMode[in]: -1COMPRESS_MODE_NONE.
* @param align[in]: . -1''.
*
* Create an empty frame buf.
* It calculates the space required by the frame according to the parameter specification,
* and allocates memory for the frame.
* @param frm[in|out]: If successful, the created frame information will be copied to frm.
* @param width[in]: frame width.
* @param height[in]: frame height.
* @param pixelFormat[in]: Set to -1 means to take the default value PIXEL_FORMAT_YVU_SEMIPLANAR_420.
* @param bitWidth[in]: Set to -1 means to take the default value DATA_BITWIDTH_8.
* @param compressMode[in]: Set to -1 means to take the default value COMPRESS_MODE_NONE.
* @param align[in]: The byte length of the alignment. Set to -1 to take the default value 'automatic alignment'.
*/
int MppFrmCreate(
VIDEO_FRAME_INFO_S* frm,
int width, int height,
PIXEL_FORMAT_E pixelFormat,
DATA_BITWIDTH_E bitWidth,
COMPRESS_MODE_E compressMode,
int align)
{
HI_ASSERT(frm);
VB_CAL_CONFIG_S vbCfg;
if (memset_s(frm, sizeof(*frm), 0, sizeof(*frm)) != EOK) {
HI_ASSERT(0);
}
HI_ASSERT(width > 0 && height > 0);
if ((int)pixelFormat < 0) {
pixelFormat = PIXEL_FORMAT_YVU_SEMIPLANAR_420;
}
if ((int)bitWidth < 0) {
bitWidth = DATA_BITWIDTH_8;
}
if ((int)compressMode < 0) {
compressMode = COMPRESS_MODE_NONE;
}
if (align < 0) {
HI_ASSERT(0);
}
COMMON_GetPicBufferConfig(width, height, pixelFormat, bitWidth, compressMode, align, &vbCfg);
HI_U64 u64VBSize = (HI_U64) vbCfg.u32VBSize; // HACK 不强转一下有问题, 可能是clang有bug吧
VB_BLK vbHnd = HI_MPI_VB_GetBlock(VB_INVALID_POOLID, u64VBSize, NULL);
if (vbHnd == VB_INVALID_HANDLE) {
SAMPLE_PRT("HI_MPI_VB_GetBlock FAIL\n");
return HI_FAILURE;
}
HI_U64 phyAddr = HI_MPI_VB_Handle2PhysAddr(vbHnd);
HI_ASSERT(phyAddr);
uint8_t* virAddr = (uint8_t*)HI_MPI_SYS_Mmap(phyAddr, u64VBSize);
HI_ASSERT(virAddr);
/*
* u64PrivateData用来存储映射的内存区长度和vbHnddestroy时会用到
*
* u64PrivateData is used to store the length of the mapped memory area and vbHnd,
* which will be used when destroying
*/
frm->stVFrame.u64PrivateData = ((uint64_t)(uint32_t)vbHnd) << HI_INT32_BITS;
frm->stVFrame.u64PrivateData |= (uint64_t)u64VBSize;
frm->enModId = HI_ID_VGS;
frm->u32PoolId = HI_MPI_VB_Handle2PoolId(vbHnd);
frm->stVFrame.u32Width = width;
frm->stVFrame.u32Height = height;
frm->stVFrame.enField = VIDEO_FIELD_FRAME;
frm->stVFrame.enPixelFormat = pixelFormat;
frm->stVFrame.enVideoFormat = VIDEO_FORMAT_LINEAR;
frm->stVFrame.enCompressMode = compressMode;
frm->stVFrame.enDynamicRange = DYNAMIC_RANGE_SDR8;
frm->stVFrame.enColorGamut = COLOR_GAMUT_BT601;
MppFrmSetBuf(frm, &vbCfg, phyAddr, virAddr);
return HI_SUCCESS;
}
/*
* frame是否可用
* Determine whether the frame is available, That is, whether the memory is allocated
*/
bool MppFrmValid(const VIDEO_FRAME_INFO_S* frm)
{
/*
* VPSS输出的frame默认没有映射虚地址
* The frame output by VPSS does not map virtual addresses by default
*/
return frm->stVFrame.u64PhyAddr[0];
}
/*
* frame
* Destory frame
*/
void MppFrmDestroy(VIDEO_FRAME_INFO_S* frm)
{
if (!MppFrmValid(frm)) {
return;
}
/*
* u64PrivateData被用来存储映射的内存区长度和vbHnd
* u64PrivateData is used to store the length of the mapped memory area and vbHnd, which is set at create
*/
uint32_t memSize = (uint32_t)(frm->stVFrame.u64PrivateData);
uint32_t vbHnd = (uint32_t)(frm->stVFrame.u64PrivateData >> HI_INT32_BITS);
HI_S32 ret;
ret = HI_MPI_SYS_Munmap((void*)(uintptr_t)frm->stVFrame.u64VirAddr[0], memSize);
HI_ASSERT(ret == HI_SUCCESS);
ret = HI_MPI_VB_ReleaseBlock(vbHnd);
HI_ASSERT(ret == HI_SUCCESS);
if (memset_s(frm, sizeof(*frm), 0, sizeof(*frm)) != EOK) {
HI_ASSERT(0);
}
}
/*
* VGS缩放
* VGS resize的缩放倍数是有限制的. VGS支持对一幅图像进行缩放
* 1630 Y
*
* Perform a VGS resize.
* The zoom factor of each VGS resize is limited. VGS supports zooming of an image.
* The width and height are both enlarged by 16 times and reduced by 30 times.Support single-component (Y) scaling.
*/
static int VgsResizeOnce(const VIDEO_FRAME_INFO_S* src, VIDEO_FRAME_INFO_S* dst, uint32_t dstWidth, uint32_t dstHeight)
{
HI_ASSERT(src && dst);
HI_ASSERT(dstWidth > 0 && dstHeight > 0);
VGS_HANDLE jobHnd = -1;
VGS_TASK_ATTR_S task;
int ret;
ret = MppFrmCreate(dst, dstWidth, dstHeight, src->stVFrame.enPixelFormat, DATA_BITWIDTH_8,
src->stVFrame.enCompressMode, 0);
if (ret != 0) {
SAMPLE_PRT("frm resize FAIL, for create dstFrm FAIL\n");
return ret;
}
if (memset_s(&task, sizeof(task), 0, sizeof(task)) != EOK) {
HI_ASSERT(0);
}
task.stImgIn = *src;
task.stImgOut = *dst;
ret = HI_MPI_VGS_BeginJob(&jobHnd);
if (ret != 0) {
SAMPLE_PRT("HI_MPI_VGS_BeginJob FAIL, ret=%08X\n", ret);
if (jobHnd >= 0 && HI_MPI_VGS_CancelJob(jobHnd) != HI_SUCCESS) {
HI_ASSERT(0);
}
MppFrmDestroy(dst);
return ret;
}
HI_ASSERT(jobHnd >= 0);
ret = HI_MPI_VGS_AddScaleTask(jobHnd, &task, VGS_SCLCOEF_NORMAL);
if (ret != 0) {
SAMPLE_PRT("HI_MPI_VGS_AddScaleTask FAIL, ret=%08X\n", ret);
if (jobHnd >= 0 && HI_MPI_VGS_CancelJob(jobHnd) != HI_SUCCESS) {
HI_ASSERT(0);
}
MppFrmDestroy(dst);
return ret;
}
ret = HI_MPI_VGS_EndJob(jobHnd);
if (ret != 0) {
SAMPLE_PRT("HI_MPI_VGS_EndJob FAIL, ret=%08X\n", ret);
if (jobHnd >= 0 && HI_MPI_VGS_CancelJob(jobHnd) != HI_SUCCESS) {
HI_ASSERT(0);
}
MppFrmDestroy(dst);
return ret;
}
return 0;
}
/*
*
* vgs_resize以实现任意比例的缩放
* 142
* (X)
*
*
* resize frame.
* Call vgs_resize multiple times to achieve arbitrary scaling.
* In order to simplify the implementation, it is agreed that each zoom is up to 14 times,
* and at this time, the width and height only need to be aligned by 2 pixels.
* When the zooming direction of the two directions is different, for example,
* zooming in one direction (such as X) and zooming out in the other direction, no special processing is required
* At this time, the zoom ratio in one direction or both directions exceeds the standard,
* and no special treatment is required.
*/
int MppFrmResize(
const VIDEO_FRAME_INFO_S* src,
VIDEO_FRAME_INFO_S* dst,
uint32_t dstWidth, uint32_t dstHeight)
{
static const double rateMax = 14.0; // Maximum magnification
static const double rateMin = 1.0 / rateMax; // The smallest magnification, that is, the largest reduction
uint32_t srcWidth = src->stVFrame.u32Width;
uint32_t srcHeight = src->stVFrame.u32Height;
HI_ASSERT(srcWidth > 0 && srcHeight > 0);
HI_ASSERT(!(srcWidth % HI_OVEN_BASE) && !(srcHeight % HI_OVEN_BASE));
HI_ASSERT(dstWidth > 0 && dstHeight > 0);
HI_ASSERT(!(dstWidth % HI_OVEN_BASE) && !(dstHeight % HI_OVEN_BASE));
int ret;
/*
*
* magnification
*/
double widthRate = ((double)dstWidth) / (double)srcWidth; // >1 means zoom in, <1 means zoom out
double heightRate = ((double)dstHeight) / (double)srcHeight; // >1 means zoom in, <1 means zoom out
/*
*
* Separate processing according to zoom factor
*/
if (widthRate > rateMax || widthRate < rateMin ||
heightRate > rateMax || heightRate < rateMin) {
/*
* VGS的最大值时 ...
* When the zoom factor exceeds the maximum value of one VGS, recursive processing...
*/
uint32_t midWidth = (uint32_t)IntZoomTo((int)srcWidth, widthRate, rateMin, rateMax);
uint32_t midHeight = (uint32_t)IntZoomTo((int)srcHeight, heightRate, rateMin, rateMax);
/*
*
*
* Make sure it is an even number. When it is an odd number,
* the zoom is reduced by one, otherwise it is increased by one
*/
if (midWidth % HI_OVEN_BASE) {
midWidth += widthRate > 1 ? -1 : 1;
}
if (midHeight % HI_OVEN_BASE) {
midHeight += heightRate > 1 ? -1 : 1;
}
SAMPLE_PRT("@@@ multi-lev vgs resize, src={%u, %u}, mid={%u, %u}, dst={%u, %u}, rate={%.4f, %.4f}\n",
srcWidth, srcHeight, midWidth, midHeight, dstWidth, dstHeight, widthRate, heightRate);
/*
*
* Zoom once
*/
VIDEO_FRAME_INFO_S midFrm;
ret = VgsResizeOnce(src, &midFrm, midWidth, midHeight);
if (ret != 0) {
SAMPLE_PRT("VgsResizeOnce(dw=%u, dh=%u) FAIL\n", midWidth, midHeight);
return ret;
}
/*
* midFrm为src递归调用
* Recursively call with midFrm as src
*/
ret = MppFrmResize(&midFrm, dst, dstWidth, dstHeight);
MppFrmDestroy(&midFrm);
if (ret != 0) {
SAMPLE_PRT("sub call MppFrmResize(dw=%u, dh=%u) FAIL\n", dstWidth, dstHeight);
return ret;
}
} else {
/*
* VGS的最大值
* The zoom factor does not exceed the maximum value of VGS once, and it is done directly
*/
ret = VgsResizeOnce(src, dst, dstWidth, dstHeight);
if (ret != 0) {
SAMPLE_PRT("VgsResizeOnce(dw=%u, dh=%u) FAIL\n", dstWidth, dstHeight);
return ret;
}
}
return ret;
}
/*
*
* Round up integers to even numbers
*/
static inline int IntToOven(int x)
{
if (x % HI_OVEN_BASE == 0) {
return x;
} else {
return x + 1;
}
}
/*
* VGS画线任务
* Create and execute VGS draw lines job
*/
static HI_S32 VgsDrawLines(VIDEO_FRAME_INFO_S *frm, const VGS_DRAW_LINE_S lines[], int lineNum)
{
VGS_HANDLE jobHnd = -1;
VGS_TASK_ATTR_S task;
int ret;
if (memset_s(&task, sizeof(task), 0, sizeof(task)) != EOK) {
HI_ASSERT(0);
}
task.stImgIn = *frm;
task.stImgOut = *frm;
/*
* job
* Start a job
*/
ret = HI_MPI_VGS_BeginJob(&jobHnd);
if (ret != 0) {
SAMPLE_PRT("HI_MPI_VGS_BeginJob FAIL, ret=%08X\n", ret);
if (jobHnd >= 0 && HI_MPI_VGS_CancelJob(jobHnd) != HI_SUCCESS) {
HI_ASSERT(0);
}
return ret;
}
HI_ASSERT(jobHnd >= 0);
/*
* job里添加批量画线task
* Add a batch line drawing task to an already started job
*/
ret = HI_MPI_VGS_AddDrawLineTaskArray(jobHnd, &task, lines, lineNum);
if (ret != 0) {
SAMPLE_PRT("HI_MPI_VGS_AddDrawLineTaskArray FAIL, ret=%08X\n", ret);
if (jobHnd >= 0 && HI_MPI_VGS_CancelJob(jobHnd) != HI_SUCCESS) {
HI_ASSERT(0);
}
return ret;
}
/*
* job
* Submit a job
*/
ret = HI_MPI_VGS_EndJob(jobHnd);
if (ret != 0) {
SAMPLE_PRT("HI_MPI_VGS_EndJob FAIL, ret=%08X\n", ret);
if (jobHnd >= 0 && HI_MPI_VGS_CancelJob(jobHnd) != HI_SUCCESS) {
HI_ASSERT(0);
}
return ret;
}
return 0;
}
/*
* frame中叠加一个或多个矩形框
* Superimpose one or more rectangular boxes in the frame
*/
int MppFrmDrawRects(VIDEO_FRAME_INFO_S *frm,
const RectBox *boxes, int boxesNum, uint32_t color, int thick)
{
VGS_DRAW_LINE_S lines[VGS_MAX_LINE];
int i;
if (thick <= 0) {
HI_ASSERT(0);
}
/*
* lines
* Planarize the four sides of each rectangle into lines
*/
for (i = 0; i < boxesNum; i++) {
lines[RECT_LINES * i].stStartPoint.s32X = IntToOven(boxes[i].xmin);
lines[RECT_LINES * i].stStartPoint.s32Y = IntToOven(boxes[i].ymin);
lines[RECT_LINES * i].stEndPoint.s32X = IntToOven(boxes[i].xmax);
lines[RECT_LINES * i].stEndPoint.s32Y = IntToOven(boxes[i].ymin);
lines[RECT_LINES * i].u32Color = color;
lines[RECT_LINES * i].u32Thick = thick;
lines[RECT_LINES * i + RECT_LINE1].stStartPoint.s32X = IntToOven(boxes[i].xmax);
lines[RECT_LINES * i + RECT_LINE1].stStartPoint.s32Y = IntToOven(boxes[i].ymin);
lines[RECT_LINES * i + RECT_LINE1].stEndPoint.s32X = IntToOven(boxes[i].xmax);
lines[RECT_LINES * i + RECT_LINE1].stEndPoint.s32Y = IntToOven(boxes[i].ymax);
lines[RECT_LINES * i + RECT_LINE1].u32Color = color;
lines[RECT_LINES * i + RECT_LINE1].u32Thick = thick;
lines[RECT_LINES * i + RECT_LINE2].stStartPoint.s32X = IntToOven(boxes[i].xmax);
lines[RECT_LINES * i + RECT_LINE2].stStartPoint.s32Y = IntToOven(boxes[i].ymax);
lines[RECT_LINES * i + RECT_LINE2].stEndPoint.s32X = IntToOven(boxes[i].xmin);
lines[RECT_LINES * i + RECT_LINE2].stEndPoint.s32Y = IntToOven(boxes[i].ymax);
lines[RECT_LINES * i + RECT_LINE2].u32Color = color;
lines[RECT_LINES * i + RECT_LINE2].u32Thick = thick;
lines[RECT_LINES * i + RECT_LINE3].stStartPoint.s32X = IntToOven(boxes[i].xmin);
lines[RECT_LINES * i + RECT_LINE3].stStartPoint.s32Y = IntToOven(boxes[i].ymax);
lines[RECT_LINES * i + RECT_LINE3].stEndPoint.s32X = IntToOven(boxes[i].xmin);
lines[RECT_LINES * i + RECT_LINE3].stEndPoint.s32Y = IntToOven(boxes[i].ymin);
lines[RECT_LINES * i + RECT_LINE3].u32Color = color;
lines[RECT_LINES * i + RECT_LINE3].u32Thick = thick;
}
return VgsDrawLines(frm, lines, i * RECT_LINES);
}
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* End of #ifdef __cplusplus */

82
src/modules/isp/mpp/vgs_img.h Executable file
View File

@ -0,0 +1,82 @@
/*
* Copyright (c) 2022 HiSilicon (Shanghai) Technologies CO., LIMITED.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef VGS_IMG_H
#define VGS_IMG_H
#include <stdbool.h>
#include <stdint.h>
#include "hi_common.h"
#include "hi_comm_video.h"
#include "hi_comm_venc.h"
#include "util.h"
#if __cplusplus
extern "C" {
#endif
/*
*
* Commonly used numerical units
*/
#define HI_KB 1024
#define HI_MB (1024 * 1024)
#define HI_MS_OF_SEC 1000 // 1s in milliseconds
#define HI_NS_OF_MS 1000000 // Nanoseconds in 1ms
#define HI_BYTE_BITS 8 // Number of bits in 1 byte
#define HI_INT8_BITS 8 // 8-bit integer number of bits
#define HI_INT16_BITS 16 // 16-bit integer number of bits
#define HI_INT32_BITS 32 // 32-bit integer number of bits
#define HI_INT64_BITS 64 // The number of bits of a 64-bit integer
/*
*
* vgs_resize以实现任意比例的缩放
* 142
* (X)
*
*
* resize frame.
* Call vgs_resize multiple times to achieve arbitrary scaling.
* In order to simplify the implementation, it is agreed that each zoom is up to 14 times,
* and at this time, the width and height only need to be aligned by 2 pixels.
* When the zoom directions are different in the two directions, for example,
* zooming in one direction (such as X) and zooming out in the other direction,
* no special processing is required. At this time, the zoom ratio in one direction or
* both directions exceeds the standard, and no special treatment is required.
*/
int MppFrmResize(
const VIDEO_FRAME_INFO_S* src,
VIDEO_FRAME_INFO_S* dst,
uint32_t dstWidth, uint32_t dstHeight);
/*
*
* Destory frame
*/
void MppFrmDestroy(VIDEO_FRAME_INFO_S* frm);
/*
*
* Superimpose one or more rectangular boxes in the frame
*/
int MppFrmDrawRects(VIDEO_FRAME_INFO_S *frm,
const RectBox *boxes, int boxesNum, uint32_t color, int thick);
#ifdef __cplusplus
}
#endif
#endif

File diff suppressed because it is too large Load Diff

View File

@ -6,9 +6,19 @@ extern "C" {
#endif
#include <stdbool.h>
#include "util.h"
bool eb3516Yolov3Init(const char *model_file, const char *pic_file);
void eb3516Yolov3Exit(void);
typedef struct {
int cls; // The category of the object, an integer > 0
float score; // Object's credibility score
RectBox box; // The rectangular area of the object (pixels)
} DetectObjInfo;
int nnie_init();
void nnie_exit();
int nnie_start();
int nnie_stop();
void nnie_callback(DetectObjInfo *detections, int count);
#ifdef __cplusplus
}

View File

@ -42,7 +42,7 @@ MJPEGDeviceSource::~MJPEGDeviceSource() {
}
codec_type_t MJPEGDeviceSource::getCodecType() {
return ROV_JPEG;
return JPEG;
}
void MJPEGDeviceSource::signalNewFrame(const FrameData &frameData) {

73
src/modules/util.c Executable file
View File

@ -0,0 +1,73 @@
/*
* Copyright (c) 2022 HiSilicon (Shanghai) Technologies CO., LIMITED.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "util.h"
#include <stdlib.h>
#include <string.h>
#include "hi_debug.h"
int IntZoomTo(int n, double rate, double rateMin, double rateMax) {
HI_ASSERT(rateMin < 1 && rateMax > 1);
if (!rateMin) {
HI_ASSERT(rateMin);
return n;
} else {
int ret;
if (rate > rateMax) {
ret = n * (int) rateMax;
} else if (rate < rateMin) {
ret = n / (int) (1 / rateMin);
} else {
ret = (int) (n * rate);
}
return ret < 1 ? 1 : ret;
}
}
void RectBoxTran(RectBox* box, int srcWidth, int srcHeight, int dstWidth, int dstHeight) {
HI_ASSERT(box && srcWidth && srcHeight);
box->xmin = box->xmin * dstWidth / srcWidth * 2 / 2;
box->xmax = box->xmax * dstWidth / srcWidth * 2 / 2;
box->ymin = box->ymin * dstHeight / srcHeight * 2 / 2;
box->ymax = box->ymax * dstHeight / srcHeight * 2 / 2;
}
int HiStrxfrm(char *s1, char *s2, int n) {
int i;
for (i = 0; (i < n - 1) && s2[i]; i++) {
s1[i] = s2[i];
}
s1[i] = 0;
return i;
}
void RecurMutexInit(pthread_mutex_t* mutex) {
HI_ASSERT(mutex);
pthread_mutexattr_t attr;
int res;
res = pthread_mutexattr_init(&attr);
HI_ASSERT(!res);
res = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
HI_ASSERT(!res);
res = pthread_mutex_init(mutex, &attr);
HI_ASSERT(!res);
pthread_mutexattr_destroy(&attr);
}

84
src/modules/util.h Executable file
View File

@ -0,0 +1,84 @@
/*
* Copyright (c) 2022 HiSilicon (Shanghai) Technologies CO., LIMITED.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef UTIL_H
#define UTIL_H
#include <stdint.h>
#include <stdbool.h>
#include <pthread.h>
#if __cplusplus
extern "C" {
#endif
#define HI_PER_BASE 100
#define HI_OVEN_BASE 2 // Even base
/*
* RGB888常用的颜色
* RGB888 commonly used colors
*/
#define RGB888_RED ((uint32_t)0xFF0000)
#define RGB888_GREEN ((uint32_t)0x00FF00)
#define RGB888_BLUE ((uint32_t)0x0000FF)
#define RGB888_YELLOW ((uint32_t)0xFFFF00)
#define RGB888_WHITE ((uint32_t)0xFFFFFF)
#define RGB888_BLACK ((uint32_t)0x000000)
#ifndef SAMPLE_PRT
#define SAMPLE_PRT(fmt...) \
do { \
printf("[%s]-%d: ", __FUNCTION__, __LINE__); \
printf(fmt); \
} while (0)
#endif
typedef struct {
int xmin;
int xmax;
int ymin;
int ymax;
} RectBox;
/*
*
* Amplify the integer to the given multiple range
*/
int IntZoomTo(int n, double rate, double rateMin, double rateMax);
/*
*
* Convert coordinates proportionally
*/
void RectBoxTran(RectBox* box, int srcWidth, int srcHeight, int dstWidth, int dstHeight);
/*
*
* Character processing interface
*/
int HiStrxfrm(char *s1, char *s2, int n);
/*
* recursive pmutex
* Init recursive pmutex
*/
void RecurMutexInit(pthread_mutex_t* mutex);
#ifdef __cplusplus
}
#endif
#endif // UTIL_H

View File

@ -3,13 +3,13 @@ includes("Hi3516_SDK.lua", "live555.lua", " readerwriterqueue.lua")
--- Add Cross Compile Toolchain
toolchain("arm-himix200-linux")
set_kind("standalone")
set_sdkdir(path.join(os.projectdir(), "arm-himix200-linux"))
set_kind("standalone")
set_sdkdir(path.join(os.projectdir(), "arm-himix200-linux"))
toolchain_end()
--- Set toolchain and C/C++ standard
-- set_config("sdk", "/opt/hisi-linux/x86-arm/arm-himix200-linux/")
set_config("sdk", path.join(os.projectdir(), "arm-himix200-linux"))
set_toolchains("arm-himix200-linux")
set_plat("cross")
set_arch("arm")
@ -25,43 +25,43 @@ add_requires(
)
target("ISP")
set_kind("static")
add_files("src/modules/isp/*.c")
add_includedirs("src", "src/modules")
add_deps("sample_common")
add_packages("zlog")
set_kind("static")
add_files("src/modules/isp/**.c", "src/modules/*.c")
add_includedirs("src", "src/modules", "src/modules/isp")
add_deps("sample_common")
add_packages("zlog")
target_end()
target("NNIE")
set_kind("static")
add_files("src/modules/nnie/*.c")
add_includedirs("src", "src/modules")
add_deps("sample_common", "sample_svp")
add_packages("zlog")
set_kind("static")
add_files("src/modules/nnie/**.c", "src/modules/*.c")
add_includedirs("src", "src/modules", "src/modules/isp")
add_deps("sample_common", "sample_svp", "ISP")
add_packages("zlog")
target_end()
target("RTSP")
set_kind("static")
add_files("src/modules/rtsp/*.cpp")
add_includedirs("src", "src/modules")
add_packages("live555", "zlog", "readerwriterqueue")
add_links("pthread")
set_kind("static")
add_files("src/modules/rtsp/**.cpp", "src/modules/*.c")
add_includedirs("src", "src/modules")
add_packages("live555", "zlog", "readerwriterqueue")
add_links("pthread")
target_end()
target("CatFeeder")
set_kind("binary")
add_includedirs("src")
add_files("src/*.cpp")
add_deps("hi_library", "ISP", "NNIE", "RTSP")
add_packages("zlog")
add_links("stdc++fs")
after_build(function(target)
os.cp("src/log.conf", "$(buildir)/cross/arm/release")
end)
set_kind("binary")
add_includedirs("src", "src/modules")
add_files("src/*.cpp")
add_deps("hi_library", "ISP", "NNIE")
add_packages("zlog")
add_links("stdc++fs")
after_build(function(target)
os.cp("src/log.conf", "$(buildir)/cross/arm/release")
end)
if is_mode("debug") then
add_defines("DEBUG")
set_symbols("debug")
set_optimize("none")
end
if is_mode("debug") then
add_defines("DEBUG")
set_symbols("debug")
set_optimize("none")
end
target_end()