图像编码(JPEG)
功能约束
KA200提供的图像编码器只支持JPEG图像编码,编码的功能约束参见下表。
表 JPEG编码功能约束
约束项 |
属性 |
参数 |
---|---|---|
输入 |
分辨率 |
|
格式 |
|
|
输入内存 |
只能调用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);