.. _image_decoding: 图像解码 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. _functional_constraints_of_image_decoding: 功能约束 """"""""""""""""""""""""""""""""""""""""""""""""""""" 图像解码(硬件解码)的功能约束参见下表。 .. _table_12_image_hardware_decoding_constraints: 表 图像硬件解码功能约束 """"""""""""""""""""""""""""""""""""""""""""""""""""" +----------+----------+------------------------------------------------------------------------------------------------------------------+ | 约束项 | 属性 | 参数 | +==========+==========+==================================================================================================================+ | 输入 | 分辨率 | - 最大:8192×8192 | | | | - 最小:8×8 | | | | - 宽高2对齐 | | +----------+------------------------------------------------------------------------------------------------------------------+ | | 缩放 | 支持2倍缩小和4倍缩小,缩小后的宽高需要2对齐 | | +----------+------------------------------------------------------------------------------------------------------------------+ | | 格式 | - 只支持Huffman编码,码流的colorspace为YUV,YUV格式为YUVJ420P | | | | - 不支持算术编码 | | | | - 不支持渐进JPEG格式 | | | | - 不支持JPEG2000格式 | | +----------+------------------------------------------------------------------------------------------------------------------+ | | 输入内存 | - 输入内存是Client侧内存 | | | | - 如果是收发同步接口,需要调用lynMalloc和lynFree进行视频解码输入的内存申请和释放,并将Client侧内存复制到Server侧 | +----------+----------+------------------------------------------------------------------------------------------------------------------+ | 输出 | 分辨率 | - 最大:8192×8192 | | | | - 最小:8×8 | | | | - 宽高是偶数 | | +----------+------------------------------------------------------------------------------------------------------------------+ | | 输出格式 | - YUV420SP NV12/NV21 | | | | - YUV420P YU12 | | | | - JPEG输出像素色域是JPEG色域,即范围为[0, 255] | | +----------+------------------------------------------------------------------------------------------------------------------+ | | 输出内存 | 只能调用lynMalloc和lynFree进行视频解码输出的内存申请和释放,输出内存大小可调用lynImageGetInfo接口获得 | +----------+----------+------------------------------------------------------------------------------------------------------------------+ | 硬件约束 | -- | - 最多支持4张Huffman表,其中包括2张DC(直流)表和2张AC(交流)表 | | | | - 最多支持3张量化表 | | | | - 只支持8bit采样精度 | | | | - 只支持对顺序式编码的图片进行解码 | | | | - 只支持基于DCT(Discrete Cosine Transform)变换的JPEG格式解码 | | | | - 只支持一个SOS(Start of Scan)标志的图片解码 | +----------+----------+------------------------------------------------------------------------------------------------------------------+ .. _image_decoding_process: 图片解码(硬解码) """"""""""""""""""""""""""""""""""""""""""""""""""""" 用户可以从LynSDK提供的示例代码中查看完整样例,在示例代码中,调用各接口后都添加了异常判断和处理,以下是关键步骤代码示例,仅供参考,不可以直接拷贝编译。 .. code-block:: c 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; } .. _special_remarks_on_image_decoding: 特殊说明 """"""""""""""""""""""""""""""""""""""""""""""""""""" 由于KA200提供的JPEG硬件解码器功能限制,对于 :ref:`table_12_image_hardware_decoding_constraints` 中以外的JPEG输入格式,LXHPL提供了对应的JPEG或PNG图像软解码接口。具体调用流程和示例参见 :ref:`image_decoding_1`。解码性能具体依赖于部署了LynSDK的x86或者ARM服务器的CPU性能。