video: add hdr metadata and color aspects support
authorjintao xu <jintao.xu@amlogic.com>
Tue, 14 Aug 2018 11:10:23 +0000 (19:10 +0800)
committerJianxin Pan <jianxin.pan@amlogic.com>
Thu, 16 Aug 2018 08:02:40 +0000 (01:02 -0700)
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>
drivers/amlogic/media/video_processor/ionvideo/ionvideo.c
drivers/amlogic/media/video_processor/ionvideo/ionvideo.h
drivers/amlogic/media/video_processor/video_dev/amlvideo.c
drivers/amlogic/media/video_processor/video_dev/amlvideo.h

index 1b5978b..0f61659 100644 (file)
@@ -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 = {
index 8ab646b..b1dae53 100644 (file)
@@ -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);
index 946350d..c857498 100644 (file)
@@ -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)
 {
@@ -525,6 +542,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;
@@ -774,6 +794,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 = {
index cc4c96a..e1ea5c9 100644 (file)
 #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 {