video: dv: DV SDK, DRM infoframe in GBR order [1/1]
authorrobin zhu <robin.zhu@amlogic.com>
Fri, 20 Sep 2019 04:03:07 +0000 (21:03 -0700)
committerTao Zeng <tao.zeng@amlogic.com>
Wed, 25 Sep 2019 06:40:27 +0000 (23:40 -0700)
PD#SWPL-13874

Problem:
DV sdk test, for sdr/hdr/dv to hdr cases
DRM infoframe primaries in GBR order

Solution:
DV enable, send primaries in RGB order

Verify:
None

Change-Id: I0229179592203aba5e2a388a572b0061fa21a48f
Signed-off-by: robin zhu <robin.zhu@amlogic.com>
drivers/amlogic/media/enhancement/amdolby_vision/amdolby_vision.c

index 3539e98..6d3e636 100644 (file)
@@ -5321,6 +5321,7 @@ static int prepare_vsif_pkt(
 /* #define HDMI_SEND_ALL_PKT */
 static u32 last_dst_format = FORMAT_SDR;
 static bool send_hdmi_pkt(
+       enum signal_format_e src_format,
        enum signal_format_e dst_format,
        const struct vinfo_s *vinfo, struct vframe_s *vf)
 {
@@ -5340,54 +5341,103 @@ static bool send_hdmi_pkt(
                        | (9 << 16)     /* bt2020 */
                        | (0x10 << 8)   /* bt2020-10 */
                        | (10 << 0);/* bt2020c */
-               /* need invert to g,b,r */
-               if (hdr10_data.primaries[0][0] !=
-                       ((p_hdr->display_primaries_x_1_MSB << 8)
-                       | p_hdr->display_primaries_x_1_LSB))
-                       flag = true;
-               hdr10_data.primaries[0][0] =
-                       (p_hdr->display_primaries_x_1_MSB << 8)
-                       | p_hdr->display_primaries_x_1_LSB;
-
-               if (hdr10_data.primaries[0][1] !=
-                       ((p_hdr->display_primaries_y_1_MSB << 8)
-                       | p_hdr->display_primaries_y_1_LSB))
-                       flag = true;
-               hdr10_data.primaries[0][1] =
-                       (p_hdr->display_primaries_y_1_MSB << 8)
-                       | p_hdr->display_primaries_y_1_LSB;
-
-               if (hdr10_data.primaries[1][0] !=
-                       ((p_hdr->display_primaries_x_2_MSB << 8)
-                       | p_hdr->display_primaries_x_2_LSB))
-                       flag = true;
-               hdr10_data.primaries[1][0] =
-                       (p_hdr->display_primaries_x_2_MSB << 8)
-                       | p_hdr->display_primaries_x_2_LSB;
-
-               if (hdr10_data.primaries[1][1] !=
-                       ((p_hdr->display_primaries_y_2_MSB << 8)
-                       | p_hdr->display_primaries_y_2_LSB))
-                       flag = true;
-               hdr10_data.primaries[1][1] =
-                       (p_hdr->display_primaries_y_2_MSB << 8)
-                       | p_hdr->display_primaries_y_2_LSB;
-               if (hdr10_data.primaries[2][0] !=
-                       ((p_hdr->display_primaries_x_0_MSB << 8)
-                       | p_hdr->display_primaries_x_0_LSB))
-                       flag = true;
-               hdr10_data.primaries[2][0] =
-                       (p_hdr->display_primaries_x_0_MSB << 8)
-                       | p_hdr->display_primaries_x_0_LSB;
-
-               if (hdr10_data.primaries[2][1] !=
-                       ((p_hdr->display_primaries_y_0_MSB << 8)
-                       | p_hdr->display_primaries_y_0_LSB))
-                       flag = true;
-               hdr10_data.primaries[2][1] =
-                       (p_hdr->display_primaries_y_0_MSB << 8)
-                       | p_hdr->display_primaries_y_0_LSB;
-
+               if (src_format != FORMAT_HDR10PLUS) {
+                       /* keep as r,g,b when src not HDR+ */
+                       if (hdr10_data.primaries[0][0] !=
+                               ((p_hdr->display_primaries_x_0_MSB << 8)
+                               | p_hdr->display_primaries_x_0_LSB))
+                               flag = true;
+                       hdr10_data.primaries[0][0] =
+                               (p_hdr->display_primaries_x_0_MSB << 8)
+                               | p_hdr->display_primaries_x_0_LSB;
+
+                       if (hdr10_data.primaries[0][1] !=
+                               ((p_hdr->display_primaries_y_0_MSB << 8)
+                               | p_hdr->display_primaries_y_0_LSB))
+                               flag = true;
+                       hdr10_data.primaries[0][1] =
+                               (p_hdr->display_primaries_y_0_MSB << 8)
+                               | p_hdr->display_primaries_y_0_LSB;
+
+                       if (hdr10_data.primaries[1][0] !=
+                               ((p_hdr->display_primaries_x_1_MSB << 8)
+                               | p_hdr->display_primaries_x_1_LSB))
+                               flag = true;
+                       hdr10_data.primaries[1][0] =
+                               (p_hdr->display_primaries_x_1_MSB << 8)
+                               | p_hdr->display_primaries_x_1_LSB;
+
+                       if (hdr10_data.primaries[1][1] !=
+                               ((p_hdr->display_primaries_y_1_MSB << 8)
+                               | p_hdr->display_primaries_y_1_LSB))
+                               flag = true;
+                       hdr10_data.primaries[1][1] =
+                               (p_hdr->display_primaries_y_1_MSB << 8)
+                               | p_hdr->display_primaries_y_1_LSB;
+                       if (hdr10_data.primaries[2][0] !=
+                               ((p_hdr->display_primaries_x_2_MSB << 8)
+                               | p_hdr->display_primaries_x_2_LSB))
+                               flag = true;
+                       hdr10_data.primaries[2][0] =
+                               (p_hdr->display_primaries_x_2_MSB << 8)
+                               | p_hdr->display_primaries_x_2_LSB;
+
+                       if (hdr10_data.primaries[2][1] !=
+                               ((p_hdr->display_primaries_y_2_MSB << 8)
+                               | p_hdr->display_primaries_y_2_LSB))
+                               flag = true;
+                       hdr10_data.primaries[2][1] =
+                               (p_hdr->display_primaries_y_2_MSB << 8)
+                               | p_hdr->display_primaries_y_2_LSB;
+               } else {
+                       /* need invert to g,b,r */
+                       if (hdr10_data.primaries[0][0] !=
+                               ((p_hdr->display_primaries_x_1_MSB << 8)
+                               | p_hdr->display_primaries_x_1_LSB))
+                               flag = true;
+                       hdr10_data.primaries[0][0] =
+                               (p_hdr->display_primaries_x_1_MSB << 8)
+                               | p_hdr->display_primaries_x_1_LSB;
+
+                       if (hdr10_data.primaries[0][1] !=
+                               ((p_hdr->display_primaries_y_1_MSB << 8)
+                               | p_hdr->display_primaries_y_1_LSB))
+                               flag = true;
+                       hdr10_data.primaries[0][1] =
+                               (p_hdr->display_primaries_y_1_MSB << 8)
+                               | p_hdr->display_primaries_y_1_LSB;
+
+                       if (hdr10_data.primaries[1][0] !=
+                               ((p_hdr->display_primaries_x_2_MSB << 8)
+                               | p_hdr->display_primaries_x_2_LSB))
+                               flag = true;
+                       hdr10_data.primaries[1][0] =
+                               (p_hdr->display_primaries_x_2_MSB << 8)
+                               | p_hdr->display_primaries_x_2_LSB;
+
+                       if (hdr10_data.primaries[1][1] !=
+                               ((p_hdr->display_primaries_y_2_MSB << 8)
+                               | p_hdr->display_primaries_y_2_LSB))
+                               flag = true;
+                       hdr10_data.primaries[1][1] =
+                               (p_hdr->display_primaries_y_2_MSB << 8)
+                               | p_hdr->display_primaries_y_2_LSB;
+                       if (hdr10_data.primaries[2][0] !=
+                               ((p_hdr->display_primaries_x_0_MSB << 8)
+                               | p_hdr->display_primaries_x_0_LSB))
+                               flag = true;
+                       hdr10_data.primaries[2][0] =
+                               (p_hdr->display_primaries_x_0_MSB << 8)
+                               | p_hdr->display_primaries_x_0_LSB;
+
+                       if (hdr10_data.primaries[2][1] !=
+                               ((p_hdr->display_primaries_y_0_MSB << 8)
+                               | p_hdr->display_primaries_y_0_LSB))
+                               flag = true;
+                       hdr10_data.primaries[2][1] =
+                               (p_hdr->display_primaries_y_0_MSB << 8)
+                               | p_hdr->display_primaries_y_0_LSB;
+               }
                if (hdr10_data.white_point[0] !=
                        ((p_hdr->white_point_x_MSB << 8)
                        | p_hdr->white_point_x_LSB))
@@ -6917,21 +6967,25 @@ int dolby_vision_process(struct vframe_s *vf, u32 display_size,
                                if (vf && is_hdr10plus_frame(vf)) {
                                        /* disable dolby immediately */
                                        pr_info("Dolby bypass: HDR10+: Switched to SDR first\n");
-                                       send_hdmi_pkt(FORMAT_SDR, vinfo, vf);
+                                       send_hdmi_pkt(FORMAT_HDR10PLUS,
+                                                     FORMAT_SDR, vinfo, vf);
                                        enable_dolby_vision(0);
                                } else if (vf && is_hlg_frame(vf)) {
                                        /* disable dolby immediately */
                                        pr_info("Dolby bypass: HLG: Switched to SDR first\n");
-                                       send_hdmi_pkt(FORMAT_SDR, vinfo, vf);
+                                       send_hdmi_pkt(FORMAT_HLG,
+                                                     FORMAT_SDR, vinfo, vf);
                                        enable_dolby_vision(0);
                                } else if (last_dst_format != FORMAT_DOVI) {
                                        /* disable dolby immediately */
                                        pr_info("Dolby bypass: Switched %d to SDR\n",
                                                last_dst_format);
-                                       send_hdmi_pkt(FORMAT_SDR, vinfo, vf);
+                                       send_hdmi_pkt(dolby_vision_src_format,
+                                                     FORMAT_SDR, vinfo, vf);
                                        enable_dolby_vision(0);
                                } else {
-                                       send_hdmi_pkt(FORMAT_SDR, vinfo, vf);
+                                       send_hdmi_pkt(dolby_vision_src_format,
+                                                     FORMAT_SDR, vinfo, vf);
                                        if (sdr_delay >= MAX_TRANSITION_DELAY) {
                                                pr_info("Dolby bypass: Done - Switched to SDR\n");
                                                enable_dolby_vision(0);
@@ -7042,6 +7096,7 @@ int dolby_vision_process(struct vframe_s *vf, u32 display_size,
                                /* send HDMI packet according to dst_format */
                                if (vinfo && !force_stb_mode)
                                        send_hdmi_pkt(
+                                               dovi_setting.src_format,
                                                dovi_setting.dst_format,
                                                vinfo, vf);
                                update_dolby_vision_status(