图像编码(JPEG)

功能约束

KA200提供的图像编码器只支持JPEG图像编码,编码的功能约束参见下表。

表 JPEG编码功能约束

约束项

属性

参数

输入

分辨率

  • 最大:3840×2160

  • 最小:16×16

格式

  • 支持YUV420SP/YUVJ420P NV12 8bit

  • 不支持算术编码

  • 不支持渐进JPEG格式

  • 不支持JPEG2000格式

输入内存

只能调用lynMalloc和lynFree进行图像编码输入的内存申请和释放

输出

输出格式

JPEG压缩格式(YUVJ420P)的图片文件,输出像素色域是JPEG色域,即范围为[0, 255]

输出内存

只能调用lynMalloc和lynFree进行图像编码输出的内存申请和释放

图像编码

用户可以从LynSDK提供的示例代码中查看完整样例,在示例代码中,调用各接口后都添加了异常判断和处理,以下是关键步骤代码示例,仅供参考,不可以直接拷贝编译。

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);