JPEG 解码示例演示了 JPEG 解码以及 lib4L2 转换 API 的可选使用,以便在需要缓冲区格式转换时使用。
$ cd /usr/src/jetson_multimedia_api/samples/06_jpeg_decode $ make
$ ./jpeg_decode num_files <number of files to decode> \
<in-file1> <out-file1> ...<in-filen> <out-filen> [OPTIONS]
$ ./jpeg_decode num_files 1 ../../data/Picture/nvidia-logo.jpg ../../data/Picture/nvidia-logo.yuv
下图显示了数据流经示例的流程。

输出平面用于接收输入,捕获平面用于生成输出。当调用 decodeToFd 时,数据格式与 Tegra 硬件匹配,因此不需要格式转换。调用 decodeToBuffer 需要在硬件加速 JPEG 解码后将缓冲区转换为软件格式。JPEG 文件格式包含标准软件格式。
此示例使用以下主要结构和类
| 元素 | 描述 |
|---|---|
| NvVideoConverter | 包含用于视频格式转换的元素和函数。 |
| NvJpegDecoder | 包含用于解码 JPEG 图像的元素和函数。 |
NvVideoConverter 包含所有视频转换相关的元素和函数。示例中使用的 NvVideoConverter 的主要成员包括
| NvVideoConverter 成员 | 描述 |
|---|---|
| output_plane | V4l2 输出平面。 |
| capture_plane | V4l2 捕获平面。 |
| waitForIdle | 等待直到所有排队的输出平面缓冲区都被处理并从捕获平面出队。 |
| setOutputPlaneFormat | 设置输出平面格式。 |
| setCapturePlaneFormat | 设置捕获平面格式。 |
NvVideoConverter 元素 output_plane 和 capture_plane 属于 NvV4l2ElementPlane 类。NvV4l2ElementPlane 中示例使用的主要成员如下
| 元素 | 描述 |
|---|---|
| setupPlane | 设置 V4l2 元素的平面。 |
| deinitPlane | 销毁 V4l2 元素的平面。 |
| setStreamStatus | 启动/停止流。 |
| setDQThreadCallback | 设置出队缓冲区线程的回调函数。 |
| startDQThread | 启动出队缓冲区线程。 |
| stopDQThread | 停止出队缓冲区线程。 |
| qBuffer | 排队 V4l2 缓冲区。 |
| dqBuffer | 出队 V4l2 缓冲区。 |
| getNumBuffers | 获取 V4l2 缓冲区的数量。 |
| getNumQueuedBuffers | 获取队列中 V4l2 缓冲区的数量。 |
| getNthBuffer | 获取索引 N 处的 NvBuffer。 |
NvJpegDecoder 类包含所有用于 JPEG 图像解码的函数。使用的主要成员是
| 函数 | 描述 |
|---|---|
| decodeToFd | 解码到硬件缓冲区(在文件描述符处),数据可供其他组件使用。 |
| decodeToBuffer | 解码到软件缓冲区。 |