本示例演示了如何:
本示例不需要摄像头。
$ cd /usr/src/jetson_multimedia_api/samples/05_jpeg_encode $ make
$ ./jpeg_encode <in-file> <in-width> <in-height> <out-file> [OPTIONS]
$ ./jpeg_encode ../../data/Picture/nvidia-logo.yuv 1920 1080 test.jpg
jpeg_encode
示例使用 YUV 文件。如果您还没有 YUV 文件,可以使用 jpeg_decode
示例生成一个。例如:$ cd /usr/src/jetson_multimedia_api/samples/06_jpeg_decode/ $ ./jpeg_decode num_files 1 ../../data/Picture/nvidia-logo.jpg ../../data/Picture/nvidia-logo.yuv
下图显示了数据流经本示例的流程。
输出平面用于接收输入,捕获平面用于生成输出。进入 JPEG 编码器之前的 YUV 数据格式可以是块状、线性或倾斜线性。 这导致 2 种不同的编码过程:encodeFromFD 和 encodeFromBuffer。 encodeFromFD
允许 JPEG 编码硬件直接处理数据。 encodeFromBuffer
需要在写入 JPEG 文件之前进行额外的格式转换。
struct context_t
全局结构管理应用程序中的所有资源。
NvVideoDecoder | 描述 |
---|---|
类 NvVideoConverter | 包含关于视频格式转换的元素和函数。 |
类 NvJpegEncoder | 包含用于编码 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 。 |
NvJpegEncoder 类包含所有用于 JPEG 编码的函数。使用的主要成员包括:
NvV4l2ElementPlane | 描述 |
---|---|
encodeFromFd | 从 V4L2 元素导出的缓冲区的 FD 进行编码。 |
encodeFromBuffer | 从缓冲区数据的指针进行编码。 |