omxvideodec: support interlace-mode=interleaved input
[platform/upstream/gstreamer.git] / omx / gstomxh265utils.c
1 /*
2  * Copyright (C) 2011, Hewlett-Packard Development Company, L.P.
3  * Copyright (C) 2017 Xilinx, Inc.
4  *   Author: Sebastian Dröge <sebastian.droege@collabora.co.uk>, Collabora Ltd.
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation
9  * version 2.1 of the License.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
19  *
20  */
21
22 #ifdef HAVE_CONFIG_H
23 #include "config.h"
24 #endif
25
26 #include "gstomxh265utils.h"
27
28 typedef struct
29 {
30   const gchar *profile;
31   OMX_VIDEO_HEVCPROFILETYPE e;
32 } H265ProfileMapping;
33
34 static const H265ProfileMapping h265_profiles[] = {
35   {"main", OMX_VIDEO_HEVCProfileMain},
36   {"main-10", OMX_VIDEO_HEVCProfileMain10},
37 #ifdef USE_OMX_TARGET_ZYNQ_USCALE_PLUS
38   {"main-still-picture",
39       (OMX_VIDEO_HEVCPROFILETYPE) OMX_ALG_VIDEO_HEVCProfileMainStill},
40   /* Format range extensions profiles (A.3.5) */
41   {"monochrome",
42       (OMX_VIDEO_HEVCPROFILETYPE) OMX_ALG_VIDEO_HEVCProfileMonochrome},
43   /* Not standard: 10 bits variation of monochrome-12 */
44   {"monochrome-10",
45       (OMX_VIDEO_HEVCPROFILETYPE) OMX_ALG_VIDEO_HEVCProfileMonochrome10},
46   /* Not standard: 8 bits variation of main-422-10 */
47   {"main-422", (OMX_VIDEO_HEVCPROFILETYPE) OMX_ALG_VIDEO_HEVCProfileMain422},
48   {"main-422-10",
49       (OMX_VIDEO_HEVCPROFILETYPE) OMX_ALG_VIDEO_HEVCProfileMain422_10},
50   {"main-intra",
51       (OMX_VIDEO_HEVCPROFILETYPE) OMX_ALG_VIDEO_HEVCProfileMain_Intra},
52   {"main-10-intra",
53       (OMX_VIDEO_HEVCPROFILETYPE) OMX_ALG_VIDEO_HEVCProfileMain10_Intra},
54   /* Not standard: intra variation of main-422 */
55   {"main-422-intra",
56       (OMX_VIDEO_HEVCPROFILETYPE) OMX_ALG_VIDEO_HEVCProfileMain422_Intra},
57   {"main-422-10-intra",
58       (OMX_VIDEO_HEVCPROFILETYPE) OMX_ALG_VIDEO_HEVCProfileMain422_10_Intra},
59 #endif
60 };
61
62 OMX_VIDEO_HEVCPROFILETYPE
63 gst_omx_h265_utils_get_profile_from_str (const gchar * profile)
64 {
65   guint i;
66
67   for (i = 0; i < G_N_ELEMENTS (h265_profiles); i++) {
68     if (g_str_equal (profile, h265_profiles[i].profile))
69       return h265_profiles[i].e;
70   }
71
72   return OMX_VIDEO_HEVCProfileUnknown;
73 }
74
75 const gchar *
76 gst_omx_h265_utils_get_profile_from_enum (OMX_VIDEO_HEVCPROFILETYPE e)
77 {
78   guint i;
79
80   for (i = 0; i < G_N_ELEMENTS (h265_profiles); i++) {
81     if (e == h265_profiles[i].e)
82       return h265_profiles[i].profile;
83   }
84
85   return NULL;
86 }
87
88 OMX_VIDEO_HEVCLEVELTYPE
89 gst_omx_h265_utils_get_level_from_str (const gchar * level, const gchar * tier)
90 {
91   if (g_str_equal (tier, "main")) {
92     if (g_str_equal (level, "1"))
93       return OMX_VIDEO_HEVCMainTierLevel1;
94     else if (g_str_equal (level, "2"))
95       return OMX_VIDEO_HEVCMainTierLevel2;
96     else if (g_str_equal (level, "2.1"))
97       return OMX_VIDEO_HEVCMainTierLevel21;
98     else if (g_str_equal (level, "3"))
99       return OMX_VIDEO_HEVCMainTierLevel3;
100     else if (g_str_equal (level, "3.1"))
101       return OMX_VIDEO_HEVCMainTierLevel31;
102     else if (g_str_equal (level, "4"))
103       return OMX_VIDEO_HEVCMainTierLevel4;
104     else if (g_str_equal (level, "4.1"))
105       return OMX_VIDEO_HEVCMainTierLevel41;
106     else if (g_str_equal (level, "5"))
107       return OMX_VIDEO_HEVCMainTierLevel5;
108     else if (g_str_equal (level, "5.1"))
109       return OMX_VIDEO_HEVCMainTierLevel51;
110     else if (g_str_equal (level, "5.2"))
111       return OMX_VIDEO_HEVCMainTierLevel52;
112     else if (g_str_equal (level, "6"))
113       return OMX_VIDEO_HEVCMainTierLevel6;
114     else if (g_str_equal (level, "6.1"))
115       return OMX_VIDEO_HEVCMainTierLevel61;
116     else if (g_str_equal (level, "6.2"))
117       return OMX_VIDEO_HEVCMainTierLevel62;
118   } else if (g_str_equal (tier, "high")) {
119     if (g_str_equal (level, "4"))
120       return OMX_VIDEO_HEVCHighTierLevel4;
121     else if (g_str_equal (level, "4.1"))
122       return OMX_VIDEO_HEVCHighTierLevel41;
123     else if (g_str_equal (level, "5"))
124       return OMX_VIDEO_HEVCHighTierLevel5;
125     else if (g_str_equal (level, "5.1"))
126       return OMX_VIDEO_HEVCHighTierLevel51;
127     else if (g_str_equal (level, "5.2"))
128       return OMX_VIDEO_HEVCHighTierLevel52;
129     else if (g_str_equal (level, "6"))
130       return OMX_VIDEO_HEVCHighTierLevel6;
131     else if (g_str_equal (level, "6.1"))
132       return OMX_VIDEO_HEVCHighTierLevel61;
133     else if (g_str_equal (level, "6.2"))
134       return OMX_VIDEO_HEVCHighTierLevel62;
135   }
136
137   return OMX_VIDEO_HEVCLevelUnknown;
138 }