/* set ctrl*/
ctrl.value = value;
- ctrl.id = id ;
+ ctrl.id = id;
if (ioctl(s->fd, VIDIOC_S_EXT_CTRLS, &ctrls) < 0)
- av_log(s->avctx, AV_LOG_WARNING, "Failed to set %s\n", name);
+ av_log(s->avctx, AV_LOG_WARNING, "Failed to set %s: %s\n", name, strerror(errno));
else
av_log(s->avctx, AV_LOG_DEBUG, "Encoder: %s = %d\n", name, value);
}
V4L2m2mContext *s = ((V4L2m2mPriv*)avctx->priv_data)->context;
V4L2Context *const output = &s->output;
+#ifdef V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME
+ if (frame && frame->pict_type == AV_PICTURE_TYPE_I)
+ v4l2_set_ext_ctrl(s, MPEG_CID(FORCE_KEY_FRAME), 0, "force key frame");
+#endif
+
return ff_v4l2_context_enqueue_frame(output, frame);
}
if (!output->streamon) {
ret = ff_v4l2_context_set_status(output, VIDIOC_STREAMON);
if (ret) {
- av_log(avctx, AV_LOG_ERROR, "VIDIOC_STREAMOFF failed on output context\n");
+ av_log(avctx, AV_LOG_ERROR, "VIDIOC_STREAMON failed on output context\n");
return ret;
}
}
{
V4L2Context *capture, *output;
V4L2m2mContext *s;
+ V4L2m2mPriv *priv = avctx->priv_data;
int ret;
- ret = ff_v4l2_m2m_create_context(avctx, &s);
+ ret = ff_v4l2_m2m_create_context(priv, &s);
if (ret < 0)
return ret;
capture->av_codec_id = avctx->codec_id;
capture->av_pix_fmt = AV_PIX_FMT_NONE;
- ret = ff_v4l2_m2m_codec_init(avctx);
+ ret = ff_v4l2_m2m_codec_init(priv);
if (ret) {
av_log(avctx, AV_LOG_ERROR, "can't configure encoder\n");
return ret;
}
+ s->avctx = avctx;
return v4l2_prepare_encoder(s);
}
+static av_cold int v4l2_encode_close(AVCodecContext *avctx)
+{
+ return ff_v4l2_m2m_codec_end(avctx->priv_data);
+}
+
#define OFFSET(x) offsetof(V4L2m2mPriv, x)
#define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
{ NULL },
};
+#define M2MENC_CLASS(NAME) \
+ static const AVClass v4l2_m2m_ ## NAME ## _enc_class = { \
+ .class_name = #NAME "_v4l2m2m_encoder", \
+ .item_name = av_default_item_name, \
+ .option = options, \
+ .version = LIBAVUTIL_VERSION_INT, \
+ };
+
#define M2MENC(NAME, LONGNAME, CODEC) \
-static const AVClass v4l2_m2m_ ## NAME ## _enc_class = {\
- .class_name = #NAME "_v4l2_m2m_encoder",\
- .item_name = av_default_item_name,\
- .option = options,\
- .version = LIBAVUTIL_VERSION_INT,\
-};\
-\
-AVCodec ff_ ## NAME ## _v4l2m2m_encoder = { \
- .name = #NAME "_v4l2m2m" ,\
- .long_name = NULL_IF_CONFIG_SMALL("V4L2 mem2mem " LONGNAME " encoder wrapper"),\
- .type = AVMEDIA_TYPE_VIDEO,\
- .id = CODEC ,\
- .priv_data_size = sizeof(V4L2m2mPriv),\
- .priv_class = &v4l2_m2m_ ## NAME ##_enc_class,\
- .init = v4l2_encode_init,\
- .send_frame = v4l2_send_frame,\
- .receive_packet = v4l2_receive_packet,\
- .close = ff_v4l2_m2m_codec_end,\
- .capabilities = AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DELAY, \
- .wrapper_name = "v4l2m2m", \
-};
+ M2MENC_CLASS(NAME) \
+ AVCodec ff_ ## NAME ## _v4l2m2m_encoder = { \
+ .name = #NAME "_v4l2m2m" , \
+ .long_name = NULL_IF_CONFIG_SMALL("V4L2 mem2mem " LONGNAME " encoder wrapper"), \
+ .type = AVMEDIA_TYPE_VIDEO, \
+ .id = CODEC , \
+ .priv_data_size = sizeof(V4L2m2mPriv), \
+ .priv_class = &v4l2_m2m_ ## NAME ##_enc_class, \
+ .init = v4l2_encode_init, \
+ .send_frame = v4l2_send_frame, \
+ .receive_packet = v4l2_receive_packet, \
+ .close = v4l2_encode_close, \
+ .capabilities = AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_DELAY, \
+ .wrapper_name = "v4l2m2m", \
+ };
M2MENC(mpeg4,"MPEG4", AV_CODEC_ID_MPEG4);
M2MENC(h263, "H.263", AV_CODEC_ID_H263);