.. _image_encoding_jpeg: 图像编码(JPEG) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. _functional_constraints_of_jpeg_encoding: 功能约束 """"""""""""""""""""""""""""""""""""""""""""""""""""" KA200提供的图像编码器只支持JPEG图像编码,编码的功能约束参见下表。 .. _table_14_jpeg_encoding_constraints: 表 JPEG编码功能约束 """"""""""""""""""""""""""""""""""""""""""""""""""""" +----------+-----------+------------------------------------------------------------------------------+ | 约束项 | 属性 | 参数 | +==========+===========+==============================================================================+ | 输入 | 分辨率 | - 最大:3840×2160 | | | | - 最小:16×16 | | +-----------+------------------------------------------------------------------------------+ | | 格式 | - 支持YUV420SP/YUVJ420P NV12 8bit | | | | - 不支持算术编码 | | | | - 不支持渐进JPEG格式 | | | | - 不支持JPEG2000格式 | | +-----------+------------------------------------------------------------------------------+ | | 输入内存 | 只能调用lynMalloc和lynFree进行图像编码输入的内存申请和释放 | +----------+-----------+------------------------------------------------------------------------------+ | 输出 | 输出格式 | JPEG压缩格式(YUVJ420P)的图片文件,输出像素色域是JPEG色域,即范围为[0, 255] | | +-----------+------------------------------------------------------------------------------+ | | 输出内存 | 只能调用lynMalloc和lynFree进行图像编码输出的内存申请和释放 | +----------+-----------+------------------------------------------------------------------------------+ .. _image_encoding_process: 图像编码 """"""""""""""""""""""""""""""""""""""""""""""""""""" 用户可以从LynSDK提供的示例代码中查看完整样例,在示例代码中,调用各接口后都添加了异常判断和处理,以下是关键步骤代码示例,仅供参考,不可以直接拷贝编译。 .. code-block:: c++ std::string srcFileName = "../source/test.yuv"; std::string dstFileName = "./output/encoded_jpg.jpg"; // 删除已有文件 FileManager::deleteFile(dstFileName); lynCodecBuf_t inDataLocal = GetInputFromFile(srcFileName); lynContext_t context = nullptr; int ret = lynCreateContext(&context, 0); EXPECT_EQ(ret, 0); lynStream_t jpegStream = nullptr; ret = lynCreateStream(&jpegStream); EXPECT_NE(jpegStream, nullptr); // 把图像数据copy到Device侧 lynJencInfo_t attr; attr.params.inputFormat = LYN_PIX_FMT_NV12; attr.params.width = 620; attr.params.height = 478; attr.params.jpegQuality = 80; attr.input.size = inDataLocal.size; ret = lynMalloc((void **)&attr.input.data, attr.input.size); EXPECT_EQ(ret, 0); ret = lynMemcpyAsync(jpegStream, attr.input.data, inDataLocal.data, inDataLocal.size, ClientToServer); EXPECT_EQ(ret, 0); attr.output.size = inDataLocal.size; ret = lynMalloc((void **)&attr.output.data, attr.output.size); EXPECT_EQ(ret, 0); // 异步编码 ret = lynJpegEncodeAsync(jpegStream, &attr); EXPECT_EQ(ret, 0); lynCodecBuf_t *outbuf = new lynCodecBuf_t; outbuf->data = (uint8_t *)malloc(inDataLocal.size); outbuf->size = inDataLocal.size; rcvData *out_data = new rcvData; out_data->pQueue = nullptr; out_data->packet = &attr.output; out_data->localBuf = outbuf; out_data->dstFile = dstFileName; lynStreamAddAsyncCallback(jpegStream, RecvPacketCallback, out_data); lynSynchronizeStream(jpegStream); lynDestroyStream(jpegStream); lynFree(attr.input.data); lynFree(attr.output.data); free(inDataLocal.data); free(outbuf->data); delete outbuf; lynDestroyContext(context);