24 #include <linux/videodev2.h>
25 #include <sys/ioctl.h>
46 return V4L2_TYPE_IS_OUTPUT(
ctx->type) ?
58 return V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? fmt->fmt.pix_mp.width : fmt->fmt.pix.width;
63 return V4L2_TYPE_IS_MULTIPLANAR(fmt->type) ? fmt->fmt.pix_mp.height : fmt->fmt.pix.height;
69 struct v4l2_cropcap cropcap;
72 memset(&cropcap, 0,
sizeof(cropcap));
73 cropcap.type =
ctx->type;
79 sar.
num = cropcap.pixelaspect.numerator;
80 sar.
den = cropcap.pixelaspect.denominator;
86 struct v4l2_format *fmt1 = &
ctx->format;
87 int ret = V4L2_TYPE_IS_MULTIPLANAR(
ctx->type) ?
88 fmt1->fmt.pix_mp.width != fmt2->fmt.pix_mp.width ||
89 fmt1->fmt.pix_mp.height != fmt2->fmt.pix_mp.height
91 fmt1->fmt.pix.width != fmt2->fmt.pix.width ||
92 fmt1->fmt.pix.height != fmt2->fmt.pix.height;
105 return ctx->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE ||
106 ctx->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE ||
107 ctx->type == V4L2_BUF_TYPE_VIDEO_CAPTURE ||
108 ctx->type == V4L2_BUF_TYPE_VIDEO_OUTPUT;
114 const int SZ_4K = 0x1000;
127 ctx->format.type =
ctx->type;
132 if (V4L2_TYPE_IS_MULTIPLANAR(
ctx->type)) {
134 ctx->format.fmt.pix_mp.height =
ctx->height;
135 ctx->format.fmt.pix_mp.width =
ctx->width;
137 ctx->format.fmt.pix_mp.pixelformat = fmt->
v4l2_fmt;
140 ctx->format.fmt.pix_mp.plane_fmt[0].sizeimage =
144 ctx->format.fmt.pix.height =
ctx->height;
145 ctx->format.fmt.pix.width =
ctx->width;
150 ctx->format.fmt.pix.sizeimage =
164 struct v4l2_format cap_fmt =
s->capture.format;
165 struct v4l2_format out_fmt =
s->output.format;
166 struct v4l2_event evt = { 0 };
167 int full_reinit,
reinit, ret;
169 ret = ioctl(
s->fd, VIDIOC_DQEVENT, &evt);
175 if (evt.type == V4L2_EVENT_EOS) {
180 if (evt.type != V4L2_EVENT_SOURCE_CHANGE)
183 ret = ioctl(
s->fd, VIDIOC_G_FMT, &out_fmt);
189 ret = ioctl(
s->fd, VIDIOC_G_FMT, &cap_fmt);
209 if (full_reinit ||
reinit)
245 struct v4l2_decoder_cmd cmd = {
246 .cmd = V4L2_DEC_CMD_STOP,
265 struct v4l2_encoder_cmd cmd = {
266 .cmd = V4L2_ENC_CMD_STOP,
285 struct v4l2_plane
planes[VIDEO_MAX_PLANES];
286 struct v4l2_buffer buf = { 0 };
288 struct pollfd pfd = {
289 .events = POLLIN | POLLRDNORM | POLLPRI | POLLOUT | POLLWRNORM,
294 if (!V4L2_TYPE_IS_OUTPUT(
ctx->type) &&
ctx->buffers) {
295 for (
i = 0;
i <
ctx->num_buffers;
i++) {
299 if (
i ==
ctx->num_buffers)
301 "userspace. Increase num_capture_buffers "
302 "to prevent device deadlock or dropped "
303 "packets/frames.\n");
308 for (
i = 0;
i <
ctx->num_buffers;
i++) {
323 if (V4L2_TYPE_IS_OUTPUT(
ctx->type))
324 pfd.events = POLLOUT | POLLWRNORM;
328 pfd.events = POLLIN | POLLRDNORM | POLLPRI;
332 ret = poll(&pfd, 1, timeout);
341 if (pfd.revents & POLLERR) {
345 for (
i = 0;
i <
ctx->num_buffers;
i++) {
357 if (pfd.revents & POLLPRI) {
373 if (pfd.revents & (POLLIN | POLLRDNORM | POLLOUT | POLLWRNORM)) {
375 if (!V4L2_TYPE_IS_OUTPUT(
ctx->type)) {
377 if (pfd.revents & (POLLIN | POLLRDNORM))
383 if (pfd.revents & (POLLOUT | POLLWRNORM))
388 memset(&buf, 0,
sizeof(buf));
389 buf.memory = V4L2_MEMORY_MMAP;
390 buf.type =
ctx->type;
391 if (V4L2_TYPE_IS_MULTIPLANAR(
ctx->type)) {
393 buf.length = VIDEO_MAX_PLANES;
399 if (errno != EAGAIN) {
409 int bytesused = V4L2_TYPE_IS_MULTIPLANAR(buf.type) ?
410 buf.m.planes[0].bytesused : buf.bytesused;
411 if (bytesused == 0) {
415 #ifdef V4L2_BUF_FLAG_LAST
416 if (buf.flags & V4L2_BUF_FLAG_LAST)
421 avbuf = &
ctx->buffers[buf.index];
424 if (V4L2_TYPE_IS_MULTIPLANAR(
ctx->type)) {
440 if (V4L2_TYPE_IS_OUTPUT(
ctx->type)) {
445 for (
i = 0;
i <
ctx->num_buffers;
i++) {
447 return &
ctx->buffers[
i];
455 struct v4l2_requestbuffers req = {
456 .memory = V4L2_MEMORY_MMAP,
462 for (
i = 0;
i <
ctx->num_buffers;
i++) {
465 for (j = 0; j <
buffer->num_planes; j++) {
466 struct V4L2Plane_info *p = &
buffer->plane_info[j];
467 if (p->mm_addr && p->length)
468 if (munmap(p->mm_addr, p->length) < 0)
478 struct v4l2_format *fmt = &
ctx->format;
486 if (V4L2_TYPE_IS_MULTIPLANAR(
ctx->type))
487 fmt->fmt.pix_mp.pixelformat = v4l2_fmt;
489 fmt->fmt.pix.pixelformat = v4l2_fmt;
491 fmt->type =
ctx->type;
503 struct v4l2_fmtdesc fdesc;
506 memset(&fdesc, 0,
sizeof(fdesc));
507 fdesc.type =
ctx->type;
537 struct v4l2_fmtdesc fdesc;
547 memset(&fdesc, 0,
sizeof(fdesc));
548 fdesc.type =
ctx->type;
555 if (fdesc.pixelformat == v4l2_fmt)
581 ctx->streamon = (cmd == VIDIOC_STREAMON);
725 struct v4l2_requestbuffers req;
733 ret = ioctl(
s->fd, VIDIOC_G_FMT, &
ctx->format);
737 memset(&req, 0,
sizeof(req));
738 req.count =
ctx->num_buffers;
739 req.memory = V4L2_MEMORY_MMAP;
740 req.type =
ctx->type;
741 ret = ioctl(
s->fd, VIDIOC_REQBUFS, &req);
747 ctx->num_buffers = req.count;
754 for (
i = 0;
i < req.count;
i++) {
768 V4L2_TYPE_IS_MULTIPLANAR(
ctx->type) ?
ctx->format.fmt.pix_mp.plane_fmt[0].sizeimage :
ctx->format.fmt.pix.sizeimage,
769 V4L2_TYPE_IS_MULTIPLANAR(
ctx->type) ?
ctx->format.fmt.pix_mp.plane_fmt[0].bytesperline :
ctx->format.fmt.pix.bytesperline);
static int probe(const AVProbeData *p)
Libavcodec external API header.
int av_codec_is_decoder(const AVCodec *codec)
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
#define AVERROR_EOF
End of file.
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
#define av_fourcc2str(fourcc)
static void reinit(Jpeg2000EncoderContext *s)
enum AVPixelFormat pixfmt
common internal api header.
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
static const struct @322 planes[]
AVPixelFormat
Pixel format.
main external API structure.
This structure describes decoded (raw) audio or video data.
This structure stores compressed data.
Rational number (pair of numerator and denominator).
V4L2Buffer (wrapper for v4l2_buffer management)
enum V4L2Buffer_status status
struct v4l2_plane planes[VIDEO_MAX_PLANES]
static void error(const char *err)
int ff_v4l2_buffer_avframe_to_buf(const AVFrame *frame, V4L2Buffer *out)
Extracts the data from an AVFrame to a V4L2Buffer.
int ff_v4l2_buffer_avpkt_to_buf(const AVPacket *pkt, V4L2Buffer *out)
Extracts the data from an AVPacket to a V4L2Buffer.
int ff_v4l2_buffer_buf_to_avframe(AVFrame *frame, V4L2Buffer *avbuf)
Extracts the data from a V4L2Buffer to an AVFrame.
int ff_v4l2_buffer_enqueue(V4L2Buffer *avbuf)
Enqueues a V4L2Buffer.
int ff_v4l2_buffer_initialize(V4L2Buffer *avbuf, int index)
Initializes a V4L2Buffer.
int ff_v4l2_buffer_buf_to_avpkt(AVPacket *pkt, V4L2Buffer *avbuf)
Extracts the data from a V4L2Buffer to an AVPacket.
void ff_v4l2_context_release(V4L2Context *ctx)
Releases a V4L2Context.
static void v4l2_save_to_context(V4L2Context *ctx, struct v4l2_format_update *fmt)
static int v4l2_release_buffers(V4L2Context *ctx)
static V4L2Buffer * v4l2_getfree_v4l2buf(V4L2Context *ctx)
int ff_v4l2_context_get_format(V4L2Context *ctx, int probe)
Queries the driver for a valid v4l2 format and copies it to the context.
static int v4l2_get_framesize_compressed(V4L2Context *ctx, int width, int height)
static unsigned int v4l2_get_height(struct v4l2_format *fmt)
static AVRational v4l2_get_sar(V4L2Context *ctx)
int ff_v4l2_context_dequeue_frame(V4L2Context *ctx, AVFrame *frame, int timeout)
Dequeues a buffer from a V4L2Context to an AVFrame.
static unsigned int v4l2_get_width(struct v4l2_format *fmt)
int ff_v4l2_context_set_status(V4L2Context *ctx, uint32_t cmd)
Sets the status of a V4L2Context.
int ff_v4l2_context_enqueue_frame(V4L2Context *ctx, const AVFrame *frame)
Enqueues a buffer to a V4L2Context from an AVFrame.
static AVCodecContext * logger(V4L2Context *ctx)
int ff_v4l2_context_enqueue_packet(V4L2Context *ctx, const AVPacket *pkt)
Enqueues a buffer to a V4L2Context from an AVPacket.
static int v4l2_stop_encode(V4L2Context *ctx)
static int v4l2_handle_event(V4L2Context *ctx)
handle resolution change event and end of stream event returns 1 if reinit was successful,...
static int v4l2_get_coded_format(V4L2Context *ctx, uint32_t *p)
static int v4l2_stop_decode(V4L2Context *ctx)
int ff_v4l2_context_dequeue_packet(V4L2Context *ctx, AVPacket *pkt)
Dequeues a buffer from a V4L2Context to an AVPacket.
int ff_v4l2_context_set_format(V4L2Context *ctx)
Sets the V4L2Context format in the v4l2 driver.
static V4L2m2mContext * ctx_to_m2mctx(V4L2Context *ctx)
static int v4l2_type_supported(V4L2Context *ctx)
static V4L2Buffer * v4l2_dequeue_v4l2buf(V4L2Context *ctx, int timeout)
static int v4l2_try_raw_format(V4L2Context *ctx, enum AVPixelFormat pixfmt)
static int v4l2_get_raw_format(V4L2Context *ctx, enum AVPixelFormat *p)
static unsigned int v4l2_resolution_changed(V4L2Context *ctx, struct v4l2_format *fmt2)
int ff_v4l2_context_init(V4L2Context *ctx)
Initializes a V4L2Context.
enum AVPixelFormat ff_v4l2_format_v4l2_to_avfmt(uint32_t v4l2_fmt, enum AVCodecID avcodec)
uint32_t ff_v4l2_format_avcodec_to_v4l2(enum AVCodecID avcodec)
uint32_t ff_v4l2_format_avfmt_to_v4l2(enum AVPixelFormat avfmt)
int ff_v4l2_m2m_codec_full_reinit(V4L2m2mContext *s)
Reinitializes the V4L2m2mContext when the driver cannot continue processing with the any of the curre...
int ff_v4l2_m2m_codec_reinit(V4L2m2mContext *s)
Reinitializes the V4L2m2mContext when the driver cannot continue processing with the capture paramete...
#define container_of(ptr, type, member)