return 0;
}
-static int v4l2_prepare_contexts(V4L2m2mContext* s, int probe)
+static int v4l2_prepare_contexts(V4L2m2mContext *s, int probe)
{
struct v4l2_capability cap;
- void *log_ctx = s->priv;
+ void *log_ctx = s->avctx;
int ret;
s->capture.done = s->output.done = 0;
return AVERROR(EINVAL);
}
-static int v4l2_probe_driver(V4L2m2mContext* s)
+static int v4l2_probe_driver(V4L2m2mContext *s)
{
- void *log_ctx = s->priv;
+ void *log_ctx = s->avctx;
int ret;
s->fd = open(s->devname, O_RDWR | O_NONBLOCK, 0);
return ret;
}
-static int v4l2_configure_contexts(V4L2m2mContext* s)
+static int v4l2_configure_contexts(V4L2m2mContext *s)
{
- void *log_ctx = s->priv;
+ void *log_ctx = s->avctx;
int ret;
struct v4l2_format ofmt, cfmt;
* V4L2 M2M Interface
*
******************************************************************************/
-int ff_v4l2_m2m_codec_reinit(V4L2m2mContext* s)
+int ff_v4l2_m2m_codec_reinit(V4L2m2mContext *s)
{
- void *log_ctx = s->priv;
+ void *log_ctx = s->avctx;
int ret;
av_log(log_ctx, AV_LOG_DEBUG, "reinit context\n");
ret = ff_v4l2_context_set_status(&s->capture, VIDIOC_STREAMOFF);
if (ret) {
- av_log(log_ctx, AV_LOG_ERROR, "capture VIDIOC_STREAMOFF\n");
- goto error;
+ av_log(log_ctx, AV_LOG_ERROR, "capture VIDIOC_STREAMOFF\n");
+ goto error;
}
/* release and unmmap the buffers */
sem_destroy(&s->refsync);
close(s->fd);
+ av_frame_unref(s->frame);
+ av_frame_free(&s->frame);
+ av_packet_unref(&s->buf_pkt);
av_free(s);
}
int ff_v4l2_m2m_codec_end(V4L2m2mPriv *priv)
{
- V4L2m2mContext* s = priv->context;
+ V4L2m2mContext *s = priv->context;
int ret;
- ret = ff_v4l2_context_set_status(&s->output, VIDIOC_STREAMOFF);
- if (ret)
- av_log(priv, AV_LOG_ERROR, "VIDIOC_STREAMOFF %s\n", s->output.name);
+ if (!s)
+ return 0;
- ret = ff_v4l2_context_set_status(&s->capture, VIDIOC_STREAMOFF);
- if (ret)
- av_log(priv, AV_LOG_ERROR, "VIDIOC_STREAMOFF %s\n", s->capture.name);
+ if (s->fd >= 0) {
+ ret = ff_v4l2_context_set_status(&s->output, VIDIOC_STREAMOFF);
+ if (ret)
+ av_log(s->avctx, AV_LOG_ERROR, "VIDIOC_STREAMOFF %s\n", s->output.name);
+
+ ret = ff_v4l2_context_set_status(&s->capture, VIDIOC_STREAMOFF);
+ if (ret)
+ av_log(s->avctx, AV_LOG_ERROR, "VIDIOC_STREAMOFF %s\n", s->capture.name);
+ }
ff_v4l2_context_release(&s->output);
{
int ret = AVERROR(EINVAL);
struct dirent *entry;
- char node[PATH_MAX];
DIR *dirp;
V4L2m2mContext *s = priv->context;
if (strncmp(entry->d_name, "video", 5))
continue;
- snprintf(node, sizeof(node), "/dev/%s", entry->d_name);
- av_log(priv, AV_LOG_DEBUG, "probing device %s\n", node);
- strncpy(s->devname, node, strlen(node) + 1);
+ snprintf(s->devname, sizeof(s->devname), "/dev/%s", entry->d_name);
+ av_log(s->avctx, AV_LOG_DEBUG, "probing device %s\n", s->devname);
ret = v4l2_probe_driver(s);
if (!ret)
break;
closedir(dirp);
if (ret) {
- av_log(priv, AV_LOG_ERROR, "Could not find a valid device\n");
+ av_log(s->avctx, AV_LOG_ERROR, "Could not find a valid device\n");
memset(s->devname, 0, sizeof(s->devname));
return ret;
}
- av_log(priv, AV_LOG_INFO, "Using device %s\n", node);
+ av_log(s->avctx, AV_LOG_INFO, "Using device %s\n", s->devname);
return v4l2_configure_contexts(s);
}
priv->context->self_ref = priv->context_ref;
priv->context->fd = -1;
+ priv->context->frame = av_frame_alloc();
+ if (!priv->context->frame) {
+ av_buffer_unref(&priv->context_ref);
+ *s = NULL; /* freed when unreferencing context_ref */
+ return AVERROR(ENOMEM);
+ }
+
return 0;
}