omxh264enc: move profile and level parsing functions to their own files

Will allow to re-use them in the decoder element.

https://bugzilla.gnome.org/show_bug.cgi?id=783114
This commit is contained in:
Guillaume Desmottes 2017-07-03 13:17:11 +02:00 committed by Olivier Crête
parent 043b417717
commit 1e570fed17
5 changed files with 127 additions and 65 deletions

View file

@ -22,6 +22,7 @@ libgstomx_la_SOURCES = \
gstomxmpeg4videodec.c \
gstomxmpeg2videodec.c \
gstomxh264dec.c \
gstomxh264utils.c \
gstomxh263dec.c \
gstomxwmvdec.c \
$(VP8_C_FILES) \
@ -49,6 +50,7 @@ noinst_HEADERS = \
gstomxmpeg2videodec.h \
gstomxmpeg4videodec.h \
gstomxh264dec.h \
gstomxh264utils.h \
gstomxh263dec.h \
gstomxwmvdec.h \
$(VP8_H_FILES) \

View file

@ -25,6 +25,7 @@
#include <gst/gst.h>
#include "gstomxh264enc.h"
#include "gstomxh264utils.h"
#ifdef USE_OMX_TARGET_RPI
#include <OMX_Broadcom.h>
@ -233,69 +234,6 @@ gst_omx_h264_enc_stop (GstVideoEncoder * enc)
return GST_VIDEO_ENCODER_CLASS (parent_class)->stop (enc);
}
static OMX_VIDEO_AVCPROFILETYPE
get_profile_from_str (const gchar * profile)
{
if (g_str_equal (profile, "baseline")) {
return OMX_VIDEO_AVCProfileBaseline;
} else if (g_str_equal (profile, "main")) {
return OMX_VIDEO_AVCProfileMain;
} else if (g_str_equal (profile, "extended")) {
return OMX_VIDEO_AVCProfileExtended;
} else if (g_str_equal (profile, "high")) {
return OMX_VIDEO_AVCProfileHigh;
} else if (g_str_equal (profile, "high-10")) {
return OMX_VIDEO_AVCProfileHigh10;
} else if (g_str_equal (profile, "high-4:2:2")) {
return OMX_VIDEO_AVCProfileHigh422;
} else if (g_str_equal (profile, "high-4:4:4")) {
return OMX_VIDEO_AVCProfileHigh444;
}
return OMX_VIDEO_AVCProfileMax;
}
static OMX_VIDEO_AVCLEVELTYPE
get_level_from_str (const gchar * level)
{
if (g_str_equal (level, "1")) {
return OMX_VIDEO_AVCLevel1;
} else if (g_str_equal (level, "1b")) {
return OMX_VIDEO_AVCLevel1b;
} else if (g_str_equal (level, "1.1")) {
return OMX_VIDEO_AVCLevel11;
} else if (g_str_equal (level, "1.2")) {
return OMX_VIDEO_AVCLevel12;
} else if (g_str_equal (level, "1.3")) {
return OMX_VIDEO_AVCLevel13;
} else if (g_str_equal (level, "2")) {
return OMX_VIDEO_AVCLevel2;
} else if (g_str_equal (level, "2.1")) {
return OMX_VIDEO_AVCLevel21;
} else if (g_str_equal (level, "2.2")) {
return OMX_VIDEO_AVCLevel22;
} else if (g_str_equal (level, "3")) {
return OMX_VIDEO_AVCLevel3;
} else if (g_str_equal (level, "3.1")) {
return OMX_VIDEO_AVCLevel31;
} else if (g_str_equal (level, "3.2")) {
return OMX_VIDEO_AVCLevel32;
} else if (g_str_equal (level, "4")) {
return OMX_VIDEO_AVCLevel4;
} else if (g_str_equal (level, "4.1")) {
return OMX_VIDEO_AVCLevel41;
} else if (g_str_equal (level, "4.2")) {
return OMX_VIDEO_AVCLevel42;
} else if (g_str_equal (level, "5")) {
return OMX_VIDEO_AVCLevel5;
} else if (g_str_equal (level, "5.1")) {
return OMX_VIDEO_AVCLevel51;
}
return OMX_VIDEO_AVCLevelMax;
}
/* Update OMX_VIDEO_PARAM_PROFILELEVELTYPE.{eProfile,eLevel}
*
* Returns TRUE if succeeded or if not supported, FALSE if failed */
@ -607,13 +545,13 @@ gst_omx_h264_enc_set_format (GstOMXVideoEnc * enc, GstOMXPort * port,
s = gst_caps_get_structure (peercaps, 0);
profile_string = gst_structure_get_string (s, "profile");
if (profile_string) {
profile = get_profile_from_str (profile_string);
profile = gst_omx_h264_utils_get_profile_from_str (profile_string);
if (profile == OMX_VIDEO_AVCProfileMax)
goto unsupported_profile;
}
level_string = gst_structure_get_string (s, "level");
if (level_string) {
level = get_level_from_str (level_string);
level = gst_omx_h264_utils_get_level_from_str (level_string);
if (level == OMX_VIDEO_AVCLevelMax)
goto unsupported_level;
}

87
omx/gstomxh264utils.c Normal file
View file

@ -0,0 +1,87 @@
/*
* Copyright (C) 2011, Hewlett-Packard Development Company, L.P.
* Author: Sebastian Dröge <sebastian.droege@collabora.co.uk>, Collabora Ltd.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "gstomxh264utils.h"
OMX_VIDEO_AVCPROFILETYPE
gst_omx_h264_utils_get_profile_from_str (const gchar * profile)
{
if (g_str_equal (profile, "baseline")) {
return OMX_VIDEO_AVCProfileBaseline;
} else if (g_str_equal (profile, "main")) {
return OMX_VIDEO_AVCProfileMain;
} else if (g_str_equal (profile, "extended")) {
return OMX_VIDEO_AVCProfileExtended;
} else if (g_str_equal (profile, "high")) {
return OMX_VIDEO_AVCProfileHigh;
} else if (g_str_equal (profile, "high-10")) {
return OMX_VIDEO_AVCProfileHigh10;
} else if (g_str_equal (profile, "high-4:2:2")) {
return OMX_VIDEO_AVCProfileHigh422;
} else if (g_str_equal (profile, "high-4:4:4")) {
return OMX_VIDEO_AVCProfileHigh444;
}
return OMX_VIDEO_AVCProfileMax;
}
OMX_VIDEO_AVCLEVELTYPE
gst_omx_h264_utils_get_level_from_str (const gchar * level)
{
if (g_str_equal (level, "1")) {
return OMX_VIDEO_AVCLevel1;
} else if (g_str_equal (level, "1b")) {
return OMX_VIDEO_AVCLevel1b;
} else if (g_str_equal (level, "1.1")) {
return OMX_VIDEO_AVCLevel11;
} else if (g_str_equal (level, "1.2")) {
return OMX_VIDEO_AVCLevel12;
} else if (g_str_equal (level, "1.3")) {
return OMX_VIDEO_AVCLevel13;
} else if (g_str_equal (level, "2")) {
return OMX_VIDEO_AVCLevel2;
} else if (g_str_equal (level, "2.1")) {
return OMX_VIDEO_AVCLevel21;
} else if (g_str_equal (level, "2.2")) {
return OMX_VIDEO_AVCLevel22;
} else if (g_str_equal (level, "3")) {
return OMX_VIDEO_AVCLevel3;
} else if (g_str_equal (level, "3.1")) {
return OMX_VIDEO_AVCLevel31;
} else if (g_str_equal (level, "3.2")) {
return OMX_VIDEO_AVCLevel32;
} else if (g_str_equal (level, "4")) {
return OMX_VIDEO_AVCLevel4;
} else if (g_str_equal (level, "4.1")) {
return OMX_VIDEO_AVCLevel41;
} else if (g_str_equal (level, "4.2")) {
return OMX_VIDEO_AVCLevel42;
} else if (g_str_equal (level, "5")) {
return OMX_VIDEO_AVCLevel5;
} else if (g_str_equal (level, "5.1")) {
return OMX_VIDEO_AVCLevel51;
}
return OMX_VIDEO_AVCLevelMax;
}

34
omx/gstomxh264utils.h Normal file
View file

@ -0,0 +1,34 @@
/*
* Copyright (C) 2011, Hewlett-Packard Development Company, L.P.
* Author: Sebastian Dröge <sebastian.droege@collabora.co.uk>, Collabora Ltd.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#ifndef __GST_OMX_H264_UTILS_H__
#define __GST_OMX_H264_UTILS_H__
#include "gstomx.h"
G_BEGIN_DECLS
OMX_VIDEO_AVCPROFILETYPE gst_omx_h264_utils_get_profile_from_str (const
gchar * profile);
OMX_VIDEO_AVCLEVELTYPE gst_omx_h264_utils_get_level_from_str (const gchar *
level);
G_END_DECLS
#endif /* __GST_OMX_H264_UTILS_H__ */

View file

@ -10,6 +10,7 @@ omx_sources = [
'gstomxmpeg4videodec.c',
'gstomxmpeg2videodec.c',
'gstomxh264dec.c',
'gstomxh264utils.c',
'gstomxh263dec.c',
'gstomxwmvdec.c',
'gstomxmpeg4videoenc.c',