gpt4 book ai didi

c - 我如何从单个文件描述符分配多个 MMAP?

转载 作者:行者123 更新时间:2023-12-05 01:26:40 27 4
gpt4 key购买 nike

所以,对于我最后一年的项目,我使用 Video4Linux2 从相机中提取 YUV420 图像,将它们解析为 x264(本地使用这些图像),然后通过 Live555 将编码流发送到 RTP/RTCP通过无线网络在客户端上播放兼容的视频播放器。所有这些我都试图实时完成,所以会有一个控制算法,但这不是这个问题的范围。所有这些 - 除了 Live555 - 都是用 C 语言编写的。目前,我已接近视频编码的尾声,但希望提高性能。

至少可以说,我遇到了一个障碍...我试图避免 V4L2 的用户空间指针并使用 mmap()。我正在对视频进行编码,但由于它是 YUV420,我一直在 malloc'ing 新内存以将 Y'、U 和 V 平面保存在三个不同的变量中,供 x264 读取。我想将这些变量保留为指向经过 mmap 处理的内存片的指针。

但是,V4L2 设备有一个用于缓冲流的文件描述符,我需要将流拆分为三个符合 YUV420 标准的 mmap 变量,就像这样......

buffers[n_buffers].y_plane = mmap(NULL, (2 * width * height) / 3,
PROT_READ | PROT_WRITE, MAP_SHARED,
fd, buf.m.offset);
buffers[n_buffers].u_plane = mmap(NULL, width * height / 6,
PROT_READ | PROT_WRITE, MAP_SHARED,
fd, buf.m.offset +
((2 * width * height) / 3 + 1) /
sysconf(_SC_PAGE_SIZE));
buffers[n_buffers].v_plane = mmap(NULL, width * height / 6,
PROT_READ | PROT_WRITE, MAP_SHARED,
fd, buf.m.offset +
((2 * width * height) / 3 +
width * height / 6 + 1) /
sysconf(_SC_PAGE_SIZE));

其中“宽度”和“高度”是视频的分辨率(例如 640x480)。

据我了解...MMAP 通过文件查找,有点像这样(伪代码):

fd = v4l2_open(...);
lseek(fd, buf.m.offset + (2 * width * height) / 3);
read(fd, buffers[n_buffers].u_plane, width * height / 6);

我的代码位于此处的 Launchpad Repo 中(更多背景信息): http://bazaar.launchpad.net/~alex-stevens/+junk/spyPanda/files (修订版 11)

从这个维基插图中可以清楚地看到 YUV420 格式:http://en.wikipedia.org/wiki/File:Yuv420.svg (我基本上想将 Y、U 和 V 字节拆分到每个 mmap 内存中)

有人愿意解释一种将三个变量从一个文件描述符映射到内存的方法,或者我为什么出错了?或者甚至暗示将 YUV420 缓冲区解析为 x264 的更好主意? :P

干杯! ^^

最佳答案

不需要三个独立的mmap。只需 mmap 一次,然后计算每个平面相对于整个 map 的基指针的基指针。

编辑:您需要这样的东西:

unsigned char *y = mmap(...); /* map total size of all 3 planes */
unsigned char *u = y + y_height*y_bytes_per_line;
unsigned char *v = u + u_height*u_bytes_per_line;

关于c - 我如何从单个文件描述符分配多个 MMAP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6290147/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com