mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-02 14:36:41 +00:00
49992be643
This add src format validation, this avoid registering element for drivers we don't support any of their src formats. This also special case the AlphaDecodeBin wrapper, as we know that alphacombine element only support I420 and NV12 for now. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2272>
103 lines
3.1 KiB
C
103 lines
3.1 KiB
C
/* GStreamer
|
|
* Copyright (C) 2020 Collabora Ltd.
|
|
* Author: Nicolas Dufresne <nicolas.dufresne@collabora.com>
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Library General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* 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
|
|
* Library General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Library General Public
|
|
* License along with this library; if not, write to the
|
|
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
|
* Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include "config.h"
|
|
#endif
|
|
|
|
#include "gstv4l2codecdevice.h"
|
|
#include "gstv4l2codech264dec.h"
|
|
#include "gstv4l2codecvp8dec.h"
|
|
#include "gstv4l2decoder.h"
|
|
#include "linux/v4l2-controls.h"
|
|
#include "linux/vp8-ctrls.h"
|
|
#include "linux/media.h"
|
|
|
|
#define GST_CAT_DEFAULT gstv4l2codecs_debug
|
|
GST_DEBUG_CATEGORY (gstv4l2codecs_debug);
|
|
|
|
static void
|
|
register_video_decoder (GstPlugin * plugin, GstV4l2CodecDevice * device)
|
|
{
|
|
GstV4l2Decoder *decoder = gst_v4l2_decoder_new (device);
|
|
gint i;
|
|
guint32 fmt;
|
|
|
|
if (!gst_v4l2_decoder_open (decoder)) {
|
|
g_object_unref (decoder);
|
|
return;
|
|
}
|
|
|
|
for (i = 0; gst_v4l2_decoder_enum_sink_fmt (decoder, i, &fmt); i++) {
|
|
switch (fmt) {
|
|
case V4L2_PIX_FMT_H264_SLICE:
|
|
GST_INFO_OBJECT (decoder, "Registering %s as H264 Decoder",
|
|
device->name);
|
|
gst_v4l2_codec_h264_dec_register (plugin, decoder, device,
|
|
GST_RANK_PRIMARY + 1);
|
|
break;
|
|
case V4L2_PIX_FMT_VP8_FRAME:
|
|
GST_INFO_OBJECT (decoder, "Registering %s as VP8 Decoder",
|
|
device->name);
|
|
gst_v4l2_codec_vp8_dec_register (plugin, decoder,
|
|
device, GST_RANK_PRIMARY + 1);
|
|
break;
|
|
default:
|
|
GST_FIXME_OBJECT (decoder, "%" GST_FOURCC_FORMAT " is not supported.",
|
|
GST_FOURCC_ARGS (fmt));
|
|
break;
|
|
}
|
|
}
|
|
|
|
g_object_unref (decoder);
|
|
}
|
|
|
|
static gboolean
|
|
plugin_init (GstPlugin * plugin)
|
|
{
|
|
GList *devices, *d;
|
|
const gchar *paths[] = { "/dev", NULL };
|
|
const gchar *names[] = { "media", NULL };
|
|
|
|
GST_DEBUG_CATEGORY_INIT (gstv4l2codecs_debug, "v4l2codecs", 0,
|
|
"V4L2 CODECs general debug");
|
|
|
|
/* Add some dependency, so the dynamic features get updated upon changes in
|
|
* /dev/media* */
|
|
gst_plugin_add_dependency (plugin,
|
|
NULL, paths, names, GST_PLUGIN_DEPENDENCY_FLAG_FILE_NAME_IS_PREFIX);
|
|
|
|
devices = gst_v4l2_codec_find_devices ();
|
|
for (d = devices; d; d = g_list_next (d)) {
|
|
GstV4l2CodecDevice *device = d->data;
|
|
|
|
if (device->function == MEDIA_ENT_F_PROC_VIDEO_DECODER)
|
|
register_video_decoder (plugin, device);
|
|
}
|
|
|
|
gst_v4l2_codec_device_list_free (devices);
|
|
return TRUE;
|
|
}
|
|
|
|
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
|
|
GST_VERSION_MINOR,
|
|
v4l2codecs,
|
|
"V4L2 CODEC Accelerators plugin",
|
|
plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
|