图像解码

功能约束

图像解码(硬件解码)的功能约束参见下表。

表 图像硬件解码功能约束

约束项

属性

参数

输入

分辨率

  • 最大: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)标志的图片解码

图片解码(硬解码)

用户可以从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性能。