24 #include <linux/videodev2.h>
25 #include <sys/ioctl.h>
38 #define MPEG_CID(x) V4L2_CID_MPEG_VIDEO_##x
39 #define MPEG_VIDEO(x) V4L2_MPEG_VIDEO_##x
43 struct v4l2_streamparm parm = { 0 };
45 parm.type = V4L2_TYPE_IS_MULTIPLANAR(
s->output.type) ? V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE : V4L2_BUF_TYPE_VIDEO_OUTPUT;
46 parm.parm.output.timeperframe.denominator = den;
47 parm.parm.output.timeperframe.numerator = num;
49 if (ioctl(
s->fd, VIDIOC_S_PARM, &parm) < 0)
55 struct v4l2_ext_controls ctrls = { { 0 } };
56 struct v4l2_ext_control ctrl = { 0 };
59 ctrls.ctrl_class = V4L2_CTRL_CLASS_MPEG;
60 ctrls.controls = &ctrl;
67 if (ioctl(
s->fd, VIDIOC_S_EXT_CTRLS, &ctrls) < 0)
69 "Failed to set %s: %s\n",
name, strerror(errno));
76 struct v4l2_ext_controls ctrls = { { 0 } };
77 struct v4l2_ext_control ctrl = { 0 };
81 ctrls.ctrl_class = V4L2_CTRL_CLASS_MPEG;
82 ctrls.controls = &ctrl;
88 ret = ioctl(
s->fd, VIDIOC_G_EXT_CTRLS, &ctrls);
91 "Failed to get %s\n",
name);
102 static const struct h264_profile {
103 unsigned int ffmpeg_val;
104 unsigned int v4l2_val;
129 static const struct mpeg4_profile {
130 unsigned int ffmpeg_val;
131 unsigned int v4l2_val;
150 if (
s->avctx->max_b_frames)
155 if (
s->avctx->max_b_frames == 0)
165 struct v4l2_event_subscription
sub;
167 memset(&
sub, 0,
sizeof(
sub));
168 sub.type = V4L2_EVENT_EOS;
169 if (ioctl(
s->fd, VIDIOC_SUBSCRIBE_EVENT, &
sub) < 0)
171 "the v4l2 driver does not support end of stream VIDIOC_SUBSCRIBE_EVENT\n");
177 int qmin_cid, qmax_cid, qmin, qmax;
202 "Encoder Context: id (%d), profile (%d), frame rate(%d/%d), number b-frames (%d), "
203 "gop size (%d), bit rate (%"PRId64
"), qmin (%d), qmax (%d)\n",
260 "exceed qmax\n", avctx->
qmin, avctx->
qmax);
262 qmin = avctx->
qmin >= 0 ? avctx->
qmin : qmin;
263 qmax = avctx->
qmax >= 0 ? avctx->
qmax : qmax;
279 #ifdef V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME
311 if (ret < 0 && ret !=
AVERROR(EAGAIN))
340 uint32_t v4l2_fmt_output;
347 capture = &
s->capture;
369 if (V4L2_TYPE_IS_MULTIPLANAR(output->
type))
370 v4l2_fmt_output = output->
format.fmt.pix_mp.pixelformat;
372 v4l2_fmt_output = output->
format.fmt.pix.pixelformat;
375 if (pix_fmt_output != avctx->
pix_fmt) {
389 #define OFFSET(x) offsetof(V4L2m2mPriv, x)
390 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
392 #define V4L_M2M_CAPTURE_OPTS \
393 V4L_M2M_DEFAULT_OPTS,\
394 { "num_capture_buffers", "Number of buffers in the capture context", \
395 OFFSET(num_capture_buffers), AV_OPT_TYPE_INT, {.i64 = 4 }, 4, INT_MAX, FLAGS }
414 #define M2MENC_CLASS(NAME, OPTIONS_NAME) \
415 static const AVClass v4l2_m2m_ ## NAME ## _enc_class = { \
416 .class_name = #NAME "_v4l2m2m_encoder", \
417 .item_name = av_default_item_name, \
418 .option = OPTIONS_NAME, \
419 .version = LIBAVUTIL_VERSION_INT, \
422 #define M2MENC(NAME, LONGNAME, OPTIONS_NAME, CODEC) \
423 M2MENC_CLASS(NAME, OPTIONS_NAME) \
424 AVCodec ff_ ## NAME ## _v4l2m2m_encoder = { \
425 .name = #NAME "_v4l2m2m" , \
426 .long_name = NULL_IF_CONFIG_SMALL("V4L2 mem2mem " LONGNAME " encoder wrapper"), \
427 .type = AVMEDIA_TYPE_VIDEO, \
429 .priv_data_size = sizeof(V4L2m2mPriv), \
430 .priv_class = &v4l2_m2m_ ## NAME ##_enc_class, \
431 .init = v4l2_encode_init, \
432 .receive_packet = v4l2_receive_packet, \
433 .close = v4l2_encode_close, \
434 .defaults = v4l2_m2m_defaults, \
435 .capabilities = AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DELAY, \
436 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, \
437 .wrapper_name = "v4l2m2m", \
static double val(void *priv, double ch)
Libavcodec external API header.
#define FF_PROFILE_MPEG4_SIMPLE
#define FF_PROFILE_MPEG4_ADVANCED_SIMPLE
#define FF_PROFILE_H264_HIGH
#define FF_PROFILE_H264_EXTENDED
#define FF_PROFILE_UNKNOWN
#define FF_PROFILE_MPEG4_SIMPLE_SCALABLE
#define FF_PROFILE_H264_HIGH_422
#define FF_PROFILE_H264_CONSTRAINED_BASELINE
#define FF_PROFILE_H264_HIGH_10_INTRA
#define FF_PROFILE_H264_MAIN
#define FF_PROFILE_MPEG4_CORE
#define FF_PROFILE_H264_HIGH_444_INTRA
#define FF_PROFILE_H264_HIGH_422_INTRA
#define FF_PROFILE_H264_HIGH_444_PREDICTIVE
#define FF_PROFILE_MPEG4_ADVANCED_CODING
#define FF_PROFILE_H264_HIGH_10
#define FF_PROFILE_H264_BASELINE
static float sub(float src0, float src1)
int ff_encode_get_frame(AVCodecContext *avctx, AVFrame *frame)
Called by encoders to get the next frame for encoding.
#define AV_CODEC_FLAG_QPEL
Use qpel MC.
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
#define AVERROR_EOF
End of file.
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
#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.
@ AV_PICTURE_TYPE_I
Intra.
common internal api header.
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
AVPixelFormat
Pixel format.
#define FF_MPEG4_PROFILE_OPTS
#define FF_ARRAY_ELEMS(a)
main external API structure.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
int width
picture width / height.
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...
int qmin
minimum quantizer
int64_t bit_rate
the average bitrate
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only
int qmax
maximum quantizer
int flags
AV_CODEC_FLAG_*.
This structure describes decoded (raw) audio or video data.
AVBufferRef * buf[AV_NUM_DATA_POINTERS]
AVBuffer references backing the data for this frame.
enum AVPictureType pict_type
Picture type of the frame.
This structure stores compressed data.
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
enum AVPixelFormat av_pix_fmt
AVPixelFormat corresponding to this buffer context.
enum v4l2_buf_type type
Type of this buffer context.
int width
Width and height of the frames it produces (in case of a capture context, e.g.
struct v4l2_format format
Format returned by the driver after initializing the buffer context.
enum AVCodecID av_codec_id
AVCodecID corresponding to this buffer context.
int streamon
Whether the stream has been started (VIDIOC_STREAMON has been sent).
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.
int ff_v4l2_context_dequeue_packet(V4L2Context *ctx, AVPacket *pkt)
Dequeues a buffer from a V4L2Context to an AVPacket.
enum AVPixelFormat ff_v4l2_format_v4l2_to_avfmt(uint32_t v4l2_fmt, enum AVCodecID avcodec)
int ff_v4l2_m2m_create_context(V4L2m2mPriv *priv, V4L2m2mContext **s)
Allocate a new context and references for a V4L2 M2M instance.
int ff_v4l2_m2m_codec_init(V4L2m2mPriv *priv)
Probes the video nodes looking for the required codec capabilities.
int ff_v4l2_m2m_codec_end(V4L2m2mPriv *priv)
Releases all the codec resources if all AVBufferRefs have been returned to the ctx.
static int v4l2_mpeg4_profile_from_ff(int p)
static void v4l2_subscribe_eos_event(V4L2m2mContext *s)
static const AVCodecDefault v4l2_m2m_defaults[]
static const AVOption options[]
static int v4l2_receive_packet(AVCodecContext *avctx, AVPacket *avpkt)
static int v4l2_get_ext_ctrl(V4L2m2mContext *s, unsigned int id, signed int *value, const char *name, int log_warning)
static void v4l2_set_timeperframe(V4L2m2mContext *s, unsigned int num, unsigned int den)
#define V4L_M2M_CAPTURE_OPTS
static void v4l2_set_ext_ctrl(V4L2m2mContext *s, unsigned int id, signed int value, const char *name, int log_warning)
static int v4l2_check_b_frame_support(V4L2m2mContext *s)
static int v4l2_send_frame(AVCodecContext *avctx, const AVFrame *frame)
static const AVOption mpeg4_options[]
static av_cold int v4l2_encode_init(AVCodecContext *avctx)
#define M2MENC(NAME, LONGNAME, OPTIONS_NAME, CODEC)
static av_cold int v4l2_encode_close(AVCodecContext *avctx)
static unsigned int v4l2_h264_profile_from_ff(int p)
static int v4l2_prepare_encoder(V4L2m2mContext *s)