media: vicodec: Register another node for stateless decoder
Add stateless decoder instance field to the dev struct and register another node for the statelsess decoder. The stateless API for the node will be implemented in further patches. Signed-off-by: Dafna Hirschfeld <dafna3@gmail.com> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> [hverkuil-cisco@xs4all.nl: fix typo: videdev-stateless-dec -> stateless-decoder] Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
parent
f05a51b98e
commit
fde649b418
@ -104,6 +104,7 @@ struct vicodec_dev {
|
||||
struct v4l2_device v4l2_dev;
|
||||
struct vicodec_dev_instance stateful_enc;
|
||||
struct vicodec_dev_instance stateful_dec;
|
||||
struct vicodec_dev_instance stateless_dec;
|
||||
#ifdef CONFIG_MEDIA_CONTROLLER
|
||||
struct media_device mdev;
|
||||
#endif
|
||||
@ -114,6 +115,7 @@ struct vicodec_ctx {
|
||||
struct v4l2_fh fh;
|
||||
struct vicodec_dev *dev;
|
||||
bool is_enc;
|
||||
bool is_stateless;
|
||||
spinlock_t *lock;
|
||||
|
||||
struct v4l2_ctrl_handler hdl;
|
||||
@ -372,6 +374,9 @@ static void device_run(void *priv)
|
||||
|
||||
if (ctx->is_enc)
|
||||
v4l2_m2m_job_finish(dev->stateful_enc.m2m_dev, ctx->fh.m2m_ctx);
|
||||
else if (ctx->is_stateless)
|
||||
v4l2_m2m_job_finish(dev->stateless_dec.m2m_dev,
|
||||
ctx->fh.m2m_ctx);
|
||||
else
|
||||
v4l2_m2m_job_finish(dev->stateful_dec.m2m_dev, ctx->fh.m2m_ctx);
|
||||
}
|
||||
@ -1508,8 +1513,14 @@ static int queue_init(void *priv, struct vb2_queue *src_vq,
|
||||
src_vq->ops = &vicodec_qops;
|
||||
src_vq->mem_ops = &vb2_vmalloc_memops;
|
||||
src_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
|
||||
src_vq->lock = ctx->is_enc ? &ctx->dev->stateful_enc.mutex :
|
||||
&ctx->dev->stateful_dec.mutex;
|
||||
if (ctx->is_enc)
|
||||
src_vq->lock = &ctx->dev->stateful_enc.mutex;
|
||||
else if (ctx->is_stateless)
|
||||
src_vq->lock = &ctx->dev->stateless_dec.mutex;
|
||||
else
|
||||
src_vq->lock = &ctx->dev->stateful_dec.mutex;
|
||||
src_vq->supports_requests = ctx->is_stateless;
|
||||
src_vq->requires_requests = ctx->is_stateless;
|
||||
ret = vb2_queue_init(src_vq);
|
||||
if (ret)
|
||||
return ret;
|
||||
@ -1578,6 +1589,8 @@ static int vicodec_open(struct file *file)
|
||||
|
||||
if (vfd == &dev->stateful_enc.vfd)
|
||||
ctx->is_enc = true;
|
||||
else if (vfd == &dev->stateless_dec.vfd)
|
||||
ctx->is_stateless = true;
|
||||
|
||||
v4l2_fh_init(&ctx->fh, video_devdata(file));
|
||||
file->private_data = &ctx->fh;
|
||||
@ -1590,6 +1603,8 @@ static int vicodec_open(struct file *file)
|
||||
1, 31, 1, 20);
|
||||
v4l2_ctrl_new_std(hdl, &vicodec_ctrl_ops, V4L2_CID_FWHT_P_FRAME_QP,
|
||||
1, 31, 1, 20);
|
||||
if (ctx->is_stateless)
|
||||
v4l2_ctrl_new_custom(hdl, &vicodec_ctrl_stateless_state, NULL);
|
||||
if (hdl->error) {
|
||||
rc = hdl->error;
|
||||
v4l2_ctrl_handler_free(hdl);
|
||||
@ -1629,6 +1644,10 @@ static int vicodec_open(struct file *file)
|
||||
ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(dev->stateful_enc.m2m_dev,
|
||||
ctx, &queue_init);
|
||||
ctx->lock = &dev->stateful_enc.lock;
|
||||
} else if (ctx->is_stateless) {
|
||||
ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(dev->stateless_dec.m2m_dev,
|
||||
ctx, &queue_init);
|
||||
ctx->lock = &dev->stateless_dec.lock;
|
||||
} else {
|
||||
ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(dev->stateful_dec.m2m_dev,
|
||||
ctx, &queue_init);
|
||||
@ -1765,6 +1784,10 @@ static int vicodec_probe(struct platform_device *pdev)
|
||||
"stateful-decoder", false))
|
||||
goto unreg_sf_enc;
|
||||
|
||||
if (register_instance(dev, &dev->stateless_dec,
|
||||
"stateless-decoder", false))
|
||||
goto unreg_sf_dec;
|
||||
|
||||
#ifdef CONFIG_MEDIA_CONTROLLER
|
||||
ret = v4l2_m2m_register_media_controller(dev->stateful_enc.m2m_dev,
|
||||
&dev->stateful_enc.vfd,
|
||||
@ -1782,23 +1805,36 @@ static int vicodec_probe(struct platform_device *pdev)
|
||||
goto unreg_m2m_sf_enc_mc;
|
||||
}
|
||||
|
||||
ret = v4l2_m2m_register_media_controller(dev->stateless_dec.m2m_dev,
|
||||
&dev->stateless_dec.vfd,
|
||||
MEDIA_ENT_F_PROC_VIDEO_DECODER);
|
||||
if (ret) {
|
||||
v4l2_err(&dev->v4l2_dev, "Failed to init mem2mem media controller for stateless dec\n");
|
||||
goto unreg_m2m_sf_dec_mc;
|
||||
}
|
||||
|
||||
ret = media_device_register(&dev->mdev);
|
||||
if (ret) {
|
||||
v4l2_err(&dev->v4l2_dev, "Failed to register mem2mem media device\n");
|
||||
goto unreg_m2m_sf_dec_mc;
|
||||
goto unreg_m2m_sl_dec_mc;
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
|
||||
#ifdef CONFIG_MEDIA_CONTROLLER
|
||||
unreg_m2m_sl_dec_mc:
|
||||
v4l2_m2m_unregister_media_controller(dev->stateless_dec.m2m_dev);
|
||||
unreg_m2m_sf_dec_mc:
|
||||
v4l2_m2m_unregister_media_controller(dev->stateful_dec.m2m_dev);
|
||||
unreg_m2m_sf_enc_mc:
|
||||
v4l2_m2m_unregister_media_controller(dev->stateful_enc.m2m_dev);
|
||||
unreg_m2m:
|
||||
video_unregister_device(&dev->stateless_dec.vfd);
|
||||
v4l2_m2m_release(dev->stateless_dec.m2m_dev);
|
||||
#endif
|
||||
unreg_sf_dec:
|
||||
video_unregister_device(&dev->stateful_dec.vfd);
|
||||
v4l2_m2m_release(dev->stateful_dec.m2m_dev);
|
||||
#endif
|
||||
unreg_sf_enc:
|
||||
video_unregister_device(&dev->stateful_enc.vfd);
|
||||
v4l2_m2m_release(dev->stateful_enc.m2m_dev);
|
||||
@ -1818,6 +1854,7 @@ static int vicodec_remove(struct platform_device *pdev)
|
||||
media_device_unregister(&dev->mdev);
|
||||
v4l2_m2m_unregister_media_controller(dev->stateful_enc.m2m_dev);
|
||||
v4l2_m2m_unregister_media_controller(dev->stateful_dec.m2m_dev);
|
||||
v4l2_m2m_unregister_media_controller(dev->stateless_dec.m2m_dev);
|
||||
media_device_cleanup(&dev->mdev);
|
||||
#endif
|
||||
|
||||
@ -1825,6 +1862,7 @@ static int vicodec_remove(struct platform_device *pdev)
|
||||
v4l2_m2m_release(dev->stateful_dec.m2m_dev);
|
||||
video_unregister_device(&dev->stateful_enc.vfd);
|
||||
video_unregister_device(&dev->stateful_dec.vfd);
|
||||
video_unregister_device(&dev->stateless_dec.vfd);
|
||||
v4l2_device_unregister(&dev->v4l2_dev);
|
||||
|
||||
return 0;
|
||||
|
Loading…
Reference in New Issue
Block a user