图像解码
功能约束
图像解码(硬件解码)的功能约束参见下表。
表 图像硬件解码功能约束
约束项 |
属性 |
参数 |
---|---|---|
输入 |
分辨率 |
|
缩放 |
支持2倍缩小和4倍缩小,缩小后的宽高需要2对齐 |
|
格式 |
|
|
输入内存 |
|
|
输出 |
分辨率 |
|
输出格式 |
|
|
输出内存 |
只能调用lynMalloc和lynFree进行视频解码输出的内存申请和释放,输出内存大小可调用lynImageGetInfo接口获得 |
|
硬件约束 |
– |
|
图片解码(硬解码)
用户可以从LynSDK提供的示例代码中查看完整样例,在示例代码中,调用各接口后都添加了异常判断和处理,以下是关键步骤代码示例,仅供参考,不可以直接拷贝编译。
int JpegDecode(const char *url)
{
int ret;
lynImageDecPara_t input;
lynImageDecAttr_t attr;
void *inBuf;
void *outBuf;
void *dumpBuf;
FILE *fp = nullptr;
fp = fopen(url, "r");
CHECK_RETURN(fp == nullptr, -1, "fopen error");
fseek(fp, 0, SEEK_END);
/* get img info */
lynImageInfo_t imageInfo = {0};
bool support;
input.outputFmt = LYN_PIX_FMT_NV12;
input.scale = SCALE_NONE;
input.align = true;
ret = lynImageGetInfo(&input, &imageInfo, &support);
CHECK_RETURN(ret != 0, ret, "error");
CHECK_RETURN(support == false, ret, "not support");
/* config task */
attr.inBuf.data = (uint8_t *)inBuf;
attr.inBuf.size = input.img.size;
attr.outBuf.data = (uint8_t *)outBuf;
attr.outBuf.size = imageInfo.output.predictBufSize;
attr.info = imageInfo;
lynContext_t context = nullptr;
ret = lynCreateContext(&context, 0);
CHECK_RETURN(ret != 0, ret, "lynCreateContext error ret " << ret);
lynStream_t jpegStream = nullptr;
ret = lynCreateStream(&jpegStream);
CHECK_RETURN(jpegStream == nullptr, ret, "lynCreateStream error");
ret = lynJpegDecodeAsync(jpegStream, attr);
CHECK_RETURN(ret != 0, ret, "error");
dumpBuf = malloc(imageInfo.output.predictBufSize);
ret = lynMemcpy(dumpBuf, outBuf, imageInfo.output.predictBufSize, ServerToClient);
CHECK_RETURN(ret != 0, ret, "error");
fp = fopen("./dump_img.yuv", "w");
fwrite(dumpBuf, imageInfo.output.predictBufSize, 1, fp);
fclose(fp);
std::cout << "img decode success, frameRate " << frameRate << " time " << interval << " num " << g_repeatNum << std::endl;
printf("img decode success, frameRate %f time %f num %d\n", frameRate, interval, g_repeatNum);
lynFree(inBuf);
lynFree(outBuf);
free(input.img.data);
free(dumpBuf);
lynSynchronizeStream(jpegStream);
lynDestroyStream(jpegStream);
lynDestroyContext(context);
return 0;
}
特殊说明
由于KA200提供的JPEG硬件解码器功能限制,对于 表 图像硬件解码功能约束 中以外的JPEG输入格式,LXHPL提供了对应的JPEG或PNG图像软解码接口。具体调用流程和示例参见 图像解码。解码性能具体依赖于部署了LynSDK的x86或者ARM服务器的CPU性能。