Hello everybody,
I would like to introduce a new uAPI for DVB streaming I/O.
Current DVB framework uses ringbuffer mechanism to demux MPEG-2 TS data
and pass it to userspace. However, this mechanism requires extra memory copy
because DVB framework provides only read() system call, which copies the kernel
data in ringbuffer to user-space buffer.
New uAPIs can remove the memory copy by using videobuf2 framework (a.k.a VB2)
which supports ioctl() calls related to streaming I/O, including buffer
allocation and queue management.
In this patch series, I have tried to implement DVB streaming I/O without
breaking existing legacy interfaces and cover all functionalities of
read() system call with new ioctl() calls.
The user scenario is very similar to v4l2's, but belows are different.
1. Support only CAPTURE buffer type with single plane.
2. Support only MMAP memory type.
3. STREAMON will execute automatically when the first buffer is queued.
4. STREANOFF will also execute automatically when dvr or dmxdev_filter
are released.
5. User can decide not only buffer count but also buffer size by REQBUFS.
New ioctl() calls and data structure are belows - defined in
include/uapi/linux/dvb/dmx.h.
struct dmx_buffer {
__u32 index;
__u32 bytesused;
__u32 offset;
__u32 length;
__u32 reserved[4];
};
struct dmx_requestbuffers {
__u32 count;
__u32 size;
__u32 reserved[2];
};
struct dmx_exportbuffer {
__u32 index;
__u32 flags;
__s32 fd;
__u32 reserved;
};
#define DMX_REQBUFS _IOWR('o', 60, struct dmx_requestbuffers)
#define DMX_QUERYBUF _IOWR('o', 61, struct dmx_buffer)
#define DMX_EXPBUF _IOWR('o', 62, struct dmx_exportbuffer)
#define DMX_QBUF _IOWR('o', 63, struct dmx_buffer)
#define DMX_DQBUF _IOWR('o', 64, struct dmx_buffer)
This patch series is consisted of two parts - kernel changes and test patch
for dvbv5-zap.
1. Kernel changes
It includes implementation of the helper framework for DVB to use Videobuf2
and changes of the DVB framework inside.
If you want to probe this patch, firstly, you should apply the patch for VB2
refactoring before do that.
Please refer to this link for more information about VB2 refactoring.
[1] RFC PATCH v5 - Refactoring Videobuf2 for common use
http://www.spinics.net/lists/linux-media/msg93810.html
This patch also have been applied to my own git.
[2] jsung/dvb-vb2.git - http://git.linuxtv.org/cgit.cgi/jsung/dvb-vb2.git/
(branch: dvb-vb2)
2. Patch for testing DVB streaming I/O with dvbv5-zap
You can use '-R' option instead of '-r' to record TS data via DVR, when you
launch the dvbv5-zap application. If you do, dvbv5-zap will use following
ioctl() calls instead of read() system call.
- DMX_REQBUFS : Request kernel to allocate buffers which count and size are
dedicated by user.
- DMX_QUERYBUF : Get the buffer information like a memory offset which will
mmap() and be shared with user-space.
- DMX_EXPBUF : Just for testing whether buffer-exporting success or not.
- DMX_QBUF : Pass the buffer to kernel-space.
- DMX_DQBUF : Get back the buffer which may contain TS data gathered by DVR.
Any suggestions and comments are welcome.
Regards,
Junghak
Junghak Sung (1):
media: videobuf2: Add new uAPI for DVB streaming I/O
drivers/media/dvb-core/Makefile | 2 +-
drivers/media/dvb-core/dmxdev.c | 189 +++++++++++++++---
drivers/media/dvb-core/dmxdev.h | 4 +
drivers/media/dvb-core/dvb_vb2.c | 406 ++++++++++++++++++++++++++++++++++++++
drivers/media/dvb-core/dvb_vb2.h | 69 +++++++
include/uapi/linux/dvb/dmx.h | 66 ++++++-
6 files changed, 709 insertions(+), 27 deletions(-)
create mode 100644 drivers/media/dvb-core/dvb_vb2.c
create mode 100644 drivers/media/dvb-core/dvb_vb2.h
--
1.7.9.5
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html