File: 0111-mediacodec-set-color-keys-in-media-format-explicitly.patch

package info (click to toggle)
vlc 3.0.21-10
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 212,728 kB
  • sloc: ansic: 441,379; cpp: 110,628; objc: 36,394; sh: 6,947; makefile: 6,592; javascript: 4,902; xml: 1,611; asm: 1,355; yacc: 640; python: 555; lex: 88; perl: 77; sed: 16
file content (149 lines) | stat: -rw-r--r-- 6,124 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
From: Mangal Kushwah <mangalk2324@gmail.com>
Date: Thu, 12 Sep 2024 12:03:58 +0530
Subject: mediacodec: set color keys in media format explicitly

Fixes issues where by default mediacodec sets wrong keys for video.
See #26948

(cherry picked from commit 55e0779f98b71ab135a4c0c78c2cb91b16a72547)
---
 modules/codec/omxil/mediacodec.c     | 44 ++++++++++++++++++++++++++++++++++++
 modules/codec/omxil/mediacodec.h     | 30 ++++++++++++++++++++++++
 modules/codec/omxil/mediacodec_jni.c |  4 ++++
 modules/codec/omxil/mediacodec_ndk.c |  5 ++++
 4 files changed, 83 insertions(+)

diff --git a/modules/codec/omxil/mediacodec.c b/modules/codec/omxil/mediacodec.c
index 1a2c97a..46d9807 100644
--- a/modules/codec/omxil/mediacodec.c
+++ b/modules/codec/omxil/mediacodec.c
@@ -497,6 +497,50 @@ static int StartMediaCodec(decoder_t *p_dec)
 
         args.video.p_surface = p_sys->video.p_surface;
         args.video.p_jsurface = p_sys->video.p_jsurface;
+
+        if (p_dec->fmt_out.video.b_color_range_full)
+            args.video.color_range = MC_COLOR_RANGE_FULL;
+        else
+            args.video.color_range = MC_COLOR_RANGE_LIMITED;
+
+        switch (p_dec->fmt_out.video.primaries)
+        {
+            case COLOR_PRIMARIES_BT601_525:
+                args.video.color_standard = MC_COLOR_STANDARD_BT601_NTSC;
+                break;
+            case COLOR_PRIMARIES_BT601_625:
+                args.video.color_standard = MC_COLOR_STANDARD_BT601_PAL;
+                break;
+            case COLOR_PRIMARIES_BT709:
+                args.video.color_standard = MC_COLOR_STANDARD_BT709;
+                break;
+            case COLOR_PRIMARIES_BT2020:
+                args.video.color_standard = MC_COLOR_STANDARD_BT2020;
+                break;
+            default:
+                args.video.color_standard = MC_COLOR_STANDARD_UNSPECIFIED;
+                break;
+        }
+
+        switch (p_dec->fmt_out.video.transfer)
+        {
+            case TRANSFER_FUNC_LINEAR:
+                args.video.color_transfer = MC_COLOR_TRANSFER_LINEAR;
+                break;
+            case TRANSFER_FUNC_SMPTE_ST2084:
+                args.video.color_transfer = MC_COLOR_TRANSFER_ST2084;
+                break;
+            case TRANSFER_FUNC_HLG:
+                args.video.color_transfer = MC_COLOR_TRANSFER_HLG;
+                break;
+            case TRANSFER_FUNC_BT709:
+                args.video.color_transfer = MC_COLOR_TRANSFER_SDR_VIDEO;
+                break;
+            default:
+                args.video.color_transfer = MC_COLOR_TRANSFER_UNSPECIFIED;
+                break;
+        }
+
         args.video.b_tunneled_playback = args.video.p_surface ?
                 var_InheritBool(p_dec, CFG_PREFIX "tunneled-playback") : false;
         if (p_sys->b_adaptive)
diff --git a/modules/codec/omxil/mediacodec.h b/modules/codec/omxil/mediacodec.h
index 6a7fd96..8fc1fca 100644
--- a/modules/codec/omxil/mediacodec.h
+++ b/modules/codec/omxil/mediacodec.h
@@ -49,6 +49,33 @@ int MediaCodecNdk_Init(mc_api*);
 #define MC_API_VIDEO_QUIRKS_ADAPTIVE 0x1000
 #define MC_API_VIDEO_QUIRKS_IGNORE_SIZE 0x2000
 
+/* cf. https://github.com/FFmpeg/FFmpeg/blob/00f5a34c9a5f0adee28aca11971918d6aca48745/libavcodec/mediacodec_wrapper.h#L348
+ * cf. https://developer.android.com/reference/android/media/MediaFormat#constants_1*/
+enum mc_media_format_color_range_t
+{
+    MC_COLOR_RANGE_UNSPECIFIED = 0x0,
+    MC_COLOR_RANGE_FULL        = 0x1,
+    MC_COLOR_RANGE_LIMITED     = 0x2,
+};
+
+enum mc_media_format_color_standard_t
+{
+    MC_COLOR_STANDARD_UNSPECIFIED  = 0x0,
+    MC_COLOR_STANDARD_BT709        = 0x1,
+    MC_COLOR_STANDARD_BT601_PAL    = 0x2,
+    MC_COLOR_STANDARD_BT601_NTSC   = 0x4,
+    MC_COLOR_STANDARD_BT2020       = 0x6,
+};
+
+enum mc_media_format_color_transfer_t
+{
+    MC_COLOR_TRANSFER_UNSPECIFIED = 0x0,
+    MC_COLOR_TRANSFER_LINEAR      = 0x1,
+    MC_COLOR_TRANSFER_SDR_VIDEO   = 0x3,
+    MC_COLOR_TRANSFER_ST2084      = 0x6,
+    MC_COLOR_TRANSFER_HLG         = 0x7,
+};
+
 struct mc_api_out
 {
     enum {
@@ -99,6 +126,9 @@ union mc_api_args
         int i_angle;
         bool b_tunneled_playback;
         bool b_adaptive_playback;
+        enum mc_media_format_color_transfer_t color_transfer;
+        enum mc_media_format_color_range_t color_range;
+        enum mc_media_format_color_standard_t color_standard;
     } video;
     struct
     {
diff --git a/modules/codec/omxil/mediacodec_jni.c b/modules/codec/omxil/mediacodec_jni.c
index 8c9041e..a9721c1 100644
--- a/modules/codec/omxil/mediacodec_jni.c
+++ b/modules/codec/omxil/mediacodec_jni.c
@@ -638,6 +638,10 @@ static int Start(mc_api *api, union mc_api_args *p_args)
         if (p_args->video.i_angle != 0)
             SET_INTEGER(jformat, "rotation-degrees", p_args->video.i_angle);
 
+        SET_INTEGER(jformat, "color-range", p_args->video.color_range);
+        SET_INTEGER(jformat, "color-standard", p_args->video.color_standard);
+        SET_INTEGER(jformat, "color-transfer", p_args->video.color_transfer);
+
         if (b_direct_rendering)
         {
             /* feature-tunneled-playback available since API 21 */
diff --git a/modules/codec/omxil/mediacodec_ndk.c b/modules/codec/omxil/mediacodec_ndk.c
index c84d81e..c861e81 100644
--- a/modules/codec/omxil/mediacodec_ndk.c
+++ b/modules/codec/omxil/mediacodec_ndk.c
@@ -356,6 +356,11 @@ static int Start(mc_api *api, union mc_api_args *p_args)
         syms.AMediaFormat.setInt32(p_sys->p_format, "width", p_args->video.i_width);
         syms.AMediaFormat.setInt32(p_sys->p_format, "height", p_args->video.i_height);
         syms.AMediaFormat.setInt32(p_sys->p_format, "rotation-degrees", p_args->video.i_angle);
+
+        syms.AMediaFormat.setInt32(p_sys->p_format, "color-range", p_args->video.color_range);
+        syms.AMediaFormat.setInt32(p_sys->p_format, "color-standard", p_args->video.color_standard);
+        syms.AMediaFormat.setInt32(p_sys->p_format, "color-transfer", p_args->video.color_transfer);
+
         if (p_args->video.p_surface)
         {
             p_anw = p_args->video.p_surface;