24 #include <linux/videodev2.h>
25 #include <sys/ioctl.h>
34 #define MPEG_CID(x) V4L2_CID_MPEG_VIDEO_##x
35 #define MPEG_VIDEO(x) V4L2_MPEG_VIDEO_##x
39 struct v4l2_streamparm parm = { 0 };
41 parm.type = V4L2_TYPE_IS_MULTIPLANAR(s->
output.
type) ? V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE : V4L2_BUF_TYPE_VIDEO_OUTPUT;
42 parm.parm.output.timeperframe.denominator = den;
43 parm.parm.output.timeperframe.numerator = num;
45 if (ioctl(s->
fd, VIDIOC_S_PARM, &parm) < 0)
51 struct v4l2_ext_controls ctrls = { 0 };
52 struct v4l2_ext_control ctrl = { 0 };
55 ctrls.ctrl_class = V4L2_CTRL_CLASS_MPEG;
56 ctrls.controls = &ctrl;
63 if (ioctl(s->
fd, VIDIOC_S_EXT_CTRLS, &ctrls) < 0)
71 struct v4l2_ext_controls ctrls = { 0 };
72 struct v4l2_ext_control ctrl = { 0 };
76 ctrls.ctrl_class = V4L2_CTRL_CLASS_MPEG;
77 ctrls.controls = &ctrl;
83 ret = ioctl(s->
fd, VIDIOC_G_EXT_CTRLS, &ctrls);
96 static const struct h264_profile {
97 unsigned int ffmpeg_val;
98 unsigned int v4l2_val;
115 if (
profile[i].ffmpeg_val == p)
123 static const struct mpeg4_profile {
124 unsigned int ffmpeg_val;
125 unsigned int v4l2_val;
136 if (
profile[i].ffmpeg_val == p)
160 int qmin_cid, qmax_cid, qmin, qmax;
182 "Encoder Context: id (%d), profile (%d), frame rate(%d/%d), number b-frames (%d), "
183 "gop size (%d), bit rate (%"PRId64
"), qmin (%d), qmax (%d)\n",
234 if (qmin != avctx->
qmin || qmax != avctx->
qmax)
315 #define OFFSET(x) offsetof(V4L2m2mPriv, x)
316 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
320 {
"num_capture_buffers",
"Number of buffers in the capture context",
325 #define M2MENC(NAME, LONGNAME, CODEC) \
326 static const AVClass v4l2_m2m_ ## NAME ## _enc_class = {\
327 .class_name = #NAME "_v4l2_m2m_encoder",\
328 .item_name = av_default_item_name,\
330 .version = LIBAVUTIL_VERSION_INT,\
333 AVCodec ff_ ## NAME ## _v4l2m2m_encoder = { \
334 .name = #NAME "_v4l2m2m" ,\
335 .long_name = NULL_IF_CONFIG_SMALL("V4L2 mem2mem " LONGNAME " encoder wrapper"),\
336 .type = AVMEDIA_TYPE_VIDEO,\
338 .priv_data_size = sizeof(V4L2m2mPriv),\
339 .priv_class = &v4l2_m2m_ ## NAME ##_enc_class,\
340 .init = v4l2_encode_init,\
341 .send_frame = v4l2_send_frame,\
342 .receive_packet = v4l2_receive_packet,\
343 .close = ff_v4l2_m2m_codec_end,\
344 .capabilities = AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DELAY, \
345 .wrapper_name = "v4l2m2m", \
#define FF_PROFILE_H264_MAIN
#define FF_PROFILE_MPEG4_SIMPLE
const char const char void * val
static const AVOption options[]
This structure describes decoded (raw) audio or video data.
#define AV_LOG_WARNING
Something somehow does not look correct.
int64_t bit_rate
the average bitrate
int max_b_frames
maximum number of B-frames between non-B-frames Note: The output will be delayed by max_b_frames+1 re...
static int v4l2_mpeg4_profile_from_ff(int p)
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
int width
Width and height of the frames it produces (in case of a capture context, e.g.
#define FF_PROFILE_MPEG4_SIMPLE_SCALABLE
int ff_v4l2_context_dequeue_packet(V4L2Context *ctx, AVPacket *pkt)
Dequeues a buffer from a V4L2Context to an AVPacket.
int ff_v4l2_m2m_codec_init(AVCodecContext *avctx)
Probes the video nodes looking for the required codec capabilities.
static int v4l2_receive_packet(AVCodecContext *avctx, AVPacket *avpkt)
static av_cold int v4l2_encode_init(AVCodecContext *avctx)
#define FF_PROFILE_H264_HIGH_444_PREDICTIVE
enum AVCodecID av_codec_id
AVCodecID corresponding to this buffer context.
#define FF_PROFILE_H264_BASELINE
#define FF_PROFILE_MPEG4_CORE
static int v4l2_send_frame(AVCodecContext *avctx, const AVFrame *frame)
static void v4l2_set_timeperframe(V4L2m2mContext *s, unsigned int num, unsigned int den)
#define FF_PROFILE_H264_EXTENDED
int ff_v4l2_m2m_create_context(AVCodecContext *avctx, V4L2m2mContext **s)
Allocate a new context and references for a V4L2 M2M instance.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
int qmax
maximum quantizer
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define FF_PROFILE_H264_HIGH_422
int flags
AV_CODEC_FLAG_*.
#define FF_PROFILE_H264_HIGH
enum AVPixelFormat av_pix_fmt
AVPixelFormat corresponding to this buffer context.
int streamon
Whether the stream has been started (VIDIOC_STREAMON has been sent).
static int v4l2_get_ext_ctrl(V4L2m2mContext *s, unsigned int id, signed int *value, const char *name)
static int v4l2_check_b_frame_support(V4L2m2mContext *s)
int width
picture width / height.
GLsizei GLboolean const GLfloat * value
#define FF_ARRAY_ELEMS(a)
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
int ff_v4l2_context_set_status(V4L2Context *ctx, uint32_t cmd)
Sets the status of a V4L2Context.
Libavcodec external API header.
#define FF_PROFILE_H264_HIGH_422_INTRA
#define M2MENC(NAME, LONGNAME, CODEC)
main external API structure.
#define FF_PROFILE_MPEG4_ADVANCED_SIMPLE
int qmin
minimum quantizer
#define FF_PROFILE_H264_HIGH_10_INTRA
#define FF_PROFILE_MPEG4_ADVANCED_CODING
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
#define AV_CODEC_FLAG_QPEL
Use qpel MC.
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only
int ff_v4l2_context_enqueue_frame(V4L2Context *ctx, const AVFrame *frame)
Enqueues a buffer to a V4L2Context from an AVFrame.
static int v4l2_prepare_encoder(V4L2m2mContext *s)
#define V4L_M2M_DEFAULT_OPTS
static unsigned int v4l2_h264_profile_from_ff(int p)
#define FF_PROFILE_H264_HIGH_444_INTRA
#define FF_PROFILE_H264_CONSTRAINED_BASELINE
#define FF_PROFILE_H264_HIGH_10
This structure stores compressed data.
static void v4l2_set_ext_ctrl(V4L2m2mContext *s, unsigned int id, signed int value, const char *name)
enum v4l2_buf_type type
Type of this buffer context.