If needed I can provide more information.
Thanks in advance.
#define VPU_WORK_BUFFERS (0x24100000)
#define VIDEO_BUFFERS_START (0x28000000)
#define VIDEO_BUFFERS_END (0x2FFFFFFF)
#define BIT_WORK_SIZE (300*1024)
#define CODE_BUF_SIZE (240 * 1024)
#define TEMP_BUF_SIZE (300 * 1024)
#define PARA_BUF2_SIZE (2 * 1024)
#define PARA_BUF_SIZE (10 * 1024)
#define BUFF_FILL_SIZE (512 * 1024)
#define DEFAULT_WIDTH 176
#define DEFAULT_HEIGHT 144
#define DEFAULT_FRAME_RATE 5
#define DEFAULT_GOP_SIZE 3
#define VPU_DEFAULT_H264_QP 10
void frame_fill (void *addr)
{
uint8_t *data = addr;
for (int i = 0; i < DEFAULT_WIDTH * DEFAULT_HEIGHT * 3/2; i++)
data[i] = i%256;
}
int vpu_test (void)
{
RetCode ret = 0;
int i;
vpu_versioninfo ver; // vpu version information
vpu_mem_desc bit_stream_buf; // input bit stream allocated memory
vpu_mem_desc source_buf; // source buffer allocated memory
FrameBuffer source_frame; // source frame buffer
// VPU specific members defined in vpu_lib.h
EncHandle *handle = malloc(sizeof(EncHandle));
EncOpenParam *encOP = malloc(sizeof(EncOpenParam));
EncInitialInfo *initialInfo = malloc(sizeof(EncInitialInfo));
EncOutputInfo *outputInfo = malloc(sizeof(EncOutputInfo));
EncParam *encParam = malloc(sizeof(EncParam));
// Set allocated memory to zero
memset (initialInfo, 0, sizeof (EncInitialInfo));
memset (encParam, 0, sizeof (EncParam));
memset (encOP, 0, sizeof (EncOpenParam));
memset (outputInfo, 0, sizeof (EncOutputInfo));
memset (&bit_stream_buf, 0, sizeof (vpu_mem_desc));
/*instance attached to display interface */
config_system_parameters();
/* initialize VPU */
ret = VPU_Init();
if (ret) { // VPU Init Failure
ret = -1;
goto free;
}
ret = VPU_GetVersionInfo(&ver);
if (ret) { // Cannot get version info
ret = -1;
goto uninit;
}
bit_stream_buf.size = BUFF_FILL_SIZE;
ret = vpu_malloc(&bit_stream_buf);
if (ret) {
ret = -1;
goto free;
}
// Set up encoder operation parameters
encOP->bitstreamBuffer = bit_stream_buf.phy_addr;
encOP->bitstreamBufferSize = BUFF_FILL_SIZE;
encOP->bitstreamFormat = STD_AVC;
encOP->picWidth = DEFAULT_WIDTH;
encOP->picHeight = DEFAULT_HEIGHT;
encOP->frameRateInfo = DEFAULT_FRAME_RATE;
encOP->gopSize = DEFAULT_GOP_SIZE;
encOP->rcIntraQp = -1;
encOP->ringBufferEnable = 0;
encOP->userGamma = (uint32_t) (0.75 * 32768);
encOP->avcIntra16x16OnlyModeEnable = 1;
encOP->EncStdParam.avcParam.avc_disableDeblk = 1;
ret = VPU_EncOpen (handle, encOP);
if (ret) {
ret = -1;
goto uninit;
}
ret = VPU_EncGetInitialInfo (*handle, initialInfo);
// Disable rotation/mirroring
ret = VPU_EncGiveCommand (*handle, DISABLE_ROTATION, 0);
ret = VPU_EncGiveCommand (*handle, DISABLE_MIRRORING, 0);
// Get number of destination frame buffers and allocate
int num = initialInfo->minFrameBufferCount;
vpu_mem_desc *framedesc = malloc(sizeof(vpu_mem_desc) * num);
FrameBuffer *frame = malloc(sizeof(FrameBuffer) * num);
memset (framedesc, 0, (sizeof (vpu_mem_desc) * num));
memset (frame, 0, (sizeof (FrameBuffer) * num));
// Allocate each destination frame buffer
for (i = 0; i < num; i++) {
framedesc[i].size = DEFAULT_WIDTH * DEFAULT_HEIGHT * 3/2;
ret = vpu_malloc(&(framedesc[i]));
if (ret) {
ret = -1;
goto uninit;
}
frame[i].myIndex = i;
frame[i].strideY = DEFAULT_WIDTH;
frame[i].strideC = DEFAULT_WIDTH >> 1;
frame[i].bufY = framedesc[i].phy_addr;
frame[i].bufCb = frame[i].bufY + (DEFAULT_WIDTH * DEFAULT_HEIGHT);
frame[i].bufCr = frame[i].bufCb + ((DEFAULT_WIDTH * DEFAULT_HEIGHT) >> 2);
}
// Allocate memory for source frame buffer
source_buf.size = DEFAULT_WIDTH * DEFAULT_HEIGHT * 3/2;
ret = vpu_malloc(&source_buf);
if (ret) {
ret = -1;
goto uninit;
}
source_frame.myIndex = num;
source_frame.strideY = DEFAULT_WIDTH;
source_frame.strideC = DEFAULT_WIDTH >> 1;
source_frame.bufY = source_buf.phy_addr;
source_frame.bufCb = source_frame.bufY + DEFAULT_WIDTH * DEFAULT_HEIGHT;
source_frame.bufCr = source_frame.bufCb + (DEFAULT_WIDTH * DEFAULT_HEIGHT >> 2);
ret = VPU_EncRegisterFrameBuffer (*handle, frame, num, DEFAULT_WIDTH, DEFAULT_WIDTH, 0, 0, NULL);
encParam->quantParam = VPU_DEFAULT_H264_QP;
encParam->picStreamBufferAddr = bit_stream_buf.phy_addr;
encParam->picStreamBufferSize = BUFF_FILL_SIZE;
// Copy and Encode
frame_fill((void *)source_buf.phy_addr);
encParam->sourceFrame = &source_frame;
/* Put encode header */
EncHeaderParam enchdr_param = { 0 };
enchdr_param.headerType = SPS_RBSP;
ret = VPU_EncGiveCommand(*handle, ENC_PUT_AVC_HEADER, &enchdr_param);
enchdr_param.headerType = PPS_RBSP;
ret = VPU_EncGiveCommand(*handle, ENC_PUT_AVC_HEADER, &enchdr_param);
// Encoding single frame
ret = VPU_EncStartOneFrame (*handle, encParam);
while (VPU_IsBusy()) {
hal_delay_us(100);
}
ret = VPU_EncGetOutputInfo (*handle, outputInfo);
ret = VPU_EncClose (*handle);
uninit:
VPU_UnInit();
free:
free(encOP);
free(initialInfo);
free(outputInfo);
free(encParam);
free(handle);
return (int)ret;
}