author | jintao xu <jintao.xu@amlogic.com> | 2018-08-14 11:10:23 (GMT) |
---|---|---|
committer | Xindong Xu <xindong.xu@amlogic.com> | 2018-08-17 10:18:30 (GMT) |
commit | 3d26fec6d9f758496a3448c2338eeaa7a8c4a3b6 (patch) | |
tree | ddc5c7cb5e9534f92fbb63426b02e0e3e3c8ef5e | |
parent | 28dfbc5048e7e6942c7337cb2c12f7cadf778e57 (diff) | |
download | common-3d26fec6d9f758496a3448c2338eeaa7a8c4a3b6.zip common-3d26fec6d9f758496a3448c2338eeaa7a8c4a3b6.tar.gz common-3d26fec6d9f758496a3448c2338eeaa7a8c4a3b6.tar.bz2 |
video: add hdr metadata and color aspects support
PD#167533
add hdr metadata and color aspects support
fix cts below test cases:
android.media.cts.DecoderTest#testH265HDR10StaticMetadata
android.media.cts.DecoderTest#testH264ColorAspects
android.media.cts.DecoderTest#testH265ColorAspects
android.media.cts.DecoderTest#testMPEG2ColorAspectsTV
Change-Id: I7a7f3b3d7ec1079c4b4094e3c6b9a14c5fe9d791
Signed-off-by: peter wang <peter.wang@amlogic.com>
Signed-off-by: jintao xu <jintao.xu@amlogic.com>
4 files changed, 59 insertions, 0 deletions
diff --git a/drivers/amlogic/media/video_processor/ionvideo/ionvideo.c b/drivers/amlogic/media/video_processor/ionvideo/ionvideo.c index 1b5978b..0f61659 100644 --- a/drivers/amlogic/media/video_processor/ionvideo/ionvideo.c +++ b/drivers/amlogic/media/video_processor/ionvideo/ionvideo.c @@ -128,6 +128,22 @@ static int vidioc_s_ctrl(struct file *file, void *priv, return 0; } +static int vidioc_g_parm(struct file *file, void *priv, + struct v4l2_streamparm *parms) +{ + struct ionvideo_dev *dev = video_drvdata(file); + struct v4l2_amlogic_parm *ap + = (struct v4l2_amlogic_parm *)&parms->parm.capture; + + if (parms->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) + return -EINVAL; + + memset(ap, 0, sizeof(struct v4l2_amlogic_parm)); + *ap = dev->am_parm; + + return 0; +} + static const struct ionvideo_fmt *__get_format(u32 pixelformat) { const struct ionvideo_fmt *fmt; @@ -318,6 +334,9 @@ static int ionvideo_fillbuff(struct ionvideo_dev *dev, dev->wait_ge2d_timeout = false; videoc_omx_compute_pts(dev, vf); buf->timecode.frames = 0; + dev->am_parm.signal_type = vf->signal_type; + dev->am_parm.master_display_colour + = vf->prop.master_display_colour; vf_put(vf, dev->vf_receiver_name); buf->timestamp.tv_sec = dev->pts >> 32; buf->timestamp.tv_usec = dev->pts & 0xFFFFFFFF; @@ -876,6 +895,7 @@ static const struct v4l2_ioctl_ops ionvideo_ioctl_ops = { .vidioc_streamon = vidioc_streamon, .vidioc_streamoff = vidioc_streamoff, .vidioc_s_ctrl = vidioc_s_ctrl, + .vidioc_g_parm = vidioc_g_parm, }; static const struct video_device ionvideo_template = { diff --git a/drivers/amlogic/media/video_processor/ionvideo/ionvideo.h b/drivers/amlogic/media/video_processor/ionvideo/ionvideo.h index 8ab646b..b1dae53 100644 --- a/drivers/amlogic/media/video_processor/ionvideo/ionvideo.h +++ b/drivers/amlogic/media/video_processor/ionvideo/ionvideo.h @@ -74,6 +74,13 @@ do { \ #define PPMGR2_CANVAS_INDEX_SRC (PPMGR2_CANVAS_INDEX + 3) +/* v4l2_amlogic_parm must < u8[200] */ +struct v4l2_amlogic_parm { + u32 signal_type; + struct vframe_master_display_colour_s + master_display_colour; + }; + struct v4l2q_s { int rp; int wp; @@ -303,6 +310,7 @@ struct ionvideo_dev { struct mutex mutex_output; struct v4l2_buffer ionvideo_input[IONVIDEO_POOL_SIZE + 1]; bool wait_ge2d_timeout; + struct v4l2_amlogic_parm am_parm; }; unsigned int get_ionvideo_debug(void); diff --git a/drivers/amlogic/media/video_processor/video_dev/amlvideo.c b/drivers/amlogic/media/video_processor/video_dev/amlvideo.c index 828db50..ded3d9b 100644 --- a/drivers/amlogic/media/video_processor/video_dev/amlvideo.c +++ b/drivers/amlogic/media/video_processor/video_dev/amlvideo.c @@ -294,6 +294,23 @@ static const struct vframe_receiver_op_s video_vf_receiver = { * Videobuf operations * ------------------------------------------------------------------ */ + +static int vidioc_g_parm(struct file *file, void *priv, + struct v4l2_streamparm *parms) +{ + struct vivi_dev *dev = video_drvdata(file); + struct v4l2_amlogic_parm *ap + = (struct v4l2_amlogic_parm *)&parms->parm.capture; + + if (parms->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) + return -EINVAL; + + memset(ap, 0, sizeof(struct v4l2_amlogic_parm)); + *ap = dev->am_parm; + + return 0; +} + static int buffer_setup(struct videobuf_queue *vq, unsigned int *count, unsigned int *size) { @@ -524,6 +541,9 @@ static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *p) return -EAGAIN; } dev->vf->omx_index = dev->frame_num; + dev->am_parm.signal_type = dev->vf->signal_type; + dev->am_parm.master_display_colour + = dev->vf->prop.master_display_colour; if (dev->vf->pts_us64) { dev->first_frame = 1; @@ -769,6 +789,8 @@ static const struct v4l2_ioctl_ops amlvideo_ioctl_ops = { #ifdef CONFIG_VIDEO_V4L1_COMPAT .vidiocgmbuf = vidiocgmbuf, #endif + .vidioc_g_parm = vidioc_g_parm, + }; static struct video_device amlvideo_template = { diff --git a/drivers/amlogic/media/video_processor/video_dev/amlvideo.h b/drivers/amlogic/media/video_processor/video_dev/amlvideo.h index cc4c96a..e1ea5c9 100644 --- a/drivers/amlogic/media/video_processor/video_dev/amlvideo.h +++ b/drivers/amlogic/media/video_processor/video_dev/amlvideo.h @@ -18,9 +18,17 @@ #ifndef AMLVIDEO_H_ #define AMLVIDEO_H_ +#include <linux/amlogic/media/vfm/vframe.h> #define AMLVIDEO_POOL_SIZE 16 +/* v4l2_amlogic_parm must < u8[200] */ +struct v4l2_amlogic_parm { + u32 signal_type; + struct vframe_master_display_colour_s + master_display_colour; + }; + struct vivi_fmt { char *name; u32 fourcc; /* v4l2 format id */ @@ -80,6 +88,7 @@ struct vivi_dev { struct vframe_provider_s video_vf_prov; struct vframe_receiver_s video_vf_recv; u32 frame_num; + struct v4l2_amlogic_parm am_parm; }; struct vivi_fh { |