omxvideodec: support interlace-mode=interleaved input
[platform/upstream/gstreamer.git] / omx / gstomxh264utils.c
1 /*
2  * Copyright (C) 2011, Hewlett-Packard Development Company, L.P.
3  *   Author: Sebastian Dröge <sebastian.droege@collabora.co.uk>, Collabora Ltd.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation
8  * version 2.1 of the License.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
18  *
19  */
20
21 #ifdef HAVE_CONFIG_H
22 #include "config.h"
23 #endif
24
25 #include "gstomxh264utils.h"
26
27 typedef struct
28 {
29   const gchar *profile;
30   OMX_VIDEO_AVCPROFILETYPE e;
31 } H264ProfileMapping;
32
33 static const H264ProfileMapping h264_profiles[] = {
34   {"baseline", OMX_VIDEO_AVCProfileBaseline},
35 #ifdef USE_OMX_TARGET_ZYNQ_USCALE_PLUS
36   {"constrained-baseline",
37       (OMX_VIDEO_AVCPROFILETYPE) OMX_ALG_VIDEO_AVCProfileConstrainedBaseline},
38 #else
39   {"constrained-baseline", OMX_VIDEO_AVCProfileBaseline},
40 #endif
41   {"main", OMX_VIDEO_AVCProfileMain},
42   {"high", OMX_VIDEO_AVCProfileHigh},
43   {"high-10", OMX_VIDEO_AVCProfileHigh10},
44   {"high-4:2:2", OMX_VIDEO_AVCProfileHigh422},
45 #ifdef USE_OMX_TARGET_ZYNQ_USCALE_PLUS
46   {"progressive-high",
47       (OMX_VIDEO_AVCPROFILETYPE) OMX_ALG_VIDEO_AVCProfileProgressiveHigh},
48   {"constrained-high",
49       (OMX_VIDEO_AVCPROFILETYPE) OMX_ALG_VIDEO_AVCProfileConstrainedHigh},
50   {"high-10-intra",
51       (OMX_VIDEO_AVCPROFILETYPE) OMX_ALG_VIDEO_AVCProfileHigh10_Intra},
52   {"high-4:2:2-intra",
53       (OMX_VIDEO_AVCPROFILETYPE) OMX_ALG_VIDEO_AVCProfileHigh422_Intra},
54 #endif
55 };
56
57 OMX_VIDEO_AVCPROFILETYPE
58 gst_omx_h264_utils_get_profile_from_str (const gchar * profile)
59 {
60   guint i;
61
62   for (i = 0; i < G_N_ELEMENTS (h264_profiles); i++) {
63     if (g_str_equal (profile, h264_profiles[i].profile))
64       return h264_profiles[i].e;
65   }
66
67   return OMX_VIDEO_AVCProfileMax;
68 }
69
70 const gchar *
71 gst_omx_h264_utils_get_profile_from_enum (OMX_VIDEO_AVCPROFILETYPE e)
72 {
73   guint i;
74
75   for (i = 0; i < G_N_ELEMENTS (h264_profiles); i++) {
76     if (e == h264_profiles[i].e)
77       return h264_profiles[i].profile;
78   }
79
80   return NULL;
81 }
82
83 OMX_VIDEO_AVCLEVELTYPE
84 gst_omx_h264_utils_get_level_from_str (const gchar * level)
85 {
86   if (g_str_equal (level, "1")) {
87     return OMX_VIDEO_AVCLevel1;
88   } else if (g_str_equal (level, "1b")) {
89     return OMX_VIDEO_AVCLevel1b;
90   } else if (g_str_equal (level, "1.1")) {
91     return OMX_VIDEO_AVCLevel11;
92   } else if (g_str_equal (level, "1.2")) {
93     return OMX_VIDEO_AVCLevel12;
94   } else if (g_str_equal (level, "1.3")) {
95     return OMX_VIDEO_AVCLevel13;
96   } else if (g_str_equal (level, "2")) {
97     return OMX_VIDEO_AVCLevel2;
98   } else if (g_str_equal (level, "2.1")) {
99     return OMX_VIDEO_AVCLevel21;
100   } else if (g_str_equal (level, "2.2")) {
101     return OMX_VIDEO_AVCLevel22;
102   } else if (g_str_equal (level, "3")) {
103     return OMX_VIDEO_AVCLevel3;
104   } else if (g_str_equal (level, "3.1")) {
105     return OMX_VIDEO_AVCLevel31;
106   } else if (g_str_equal (level, "3.2")) {
107     return OMX_VIDEO_AVCLevel32;
108   } else if (g_str_equal (level, "4")) {
109     return OMX_VIDEO_AVCLevel4;
110   } else if (g_str_equal (level, "4.1")) {
111     return OMX_VIDEO_AVCLevel41;
112   } else if (g_str_equal (level, "4.2")) {
113     return OMX_VIDEO_AVCLevel42;
114   } else if (g_str_equal (level, "5")) {
115     return OMX_VIDEO_AVCLevel5;
116   } else if (g_str_equal (level, "5.1")) {
117     return OMX_VIDEO_AVCLevel51;
118 #ifdef USE_OMX_TARGET_ZYNQ_USCALE_PLUS
119   } else if (g_str_equal (level, "5.2")) {
120     return (OMX_VIDEO_AVCLEVELTYPE) OMX_ALG_VIDEO_AVCLevel52;
121   } else if (g_str_equal (level, "6.0")) {
122     return (OMX_VIDEO_AVCLEVELTYPE) OMX_ALG_VIDEO_AVCLevel60;
123   } else if (g_str_equal (level, "6.1")) {
124     return (OMX_VIDEO_AVCLEVELTYPE) OMX_ALG_VIDEO_AVCLevel61;
125   } else if (g_str_equal (level, "6.2")) {
126     return (OMX_VIDEO_AVCLEVELTYPE) OMX_ALG_VIDEO_AVCLevel62;
127 #endif
128   }
129
130   return OMX_VIDEO_AVCLevelMax;
131 }