Exemplo n.º 1
0
gboolean
gst_ffmpegenc_register (GstPlugin * plugin)
{
  GTypeInfo typeinfo = {
    sizeof (GstFFMpegEncClass),
    (GBaseInitFunc) gst_ffmpegenc_base_init,
    NULL,
    (GClassInitFunc) gst_ffmpegenc_class_init,
    NULL,
    NULL,
    sizeof (GstFFMpegEnc),
    0,
    (GInstanceInitFunc) gst_ffmpegenc_init,
  };
  GType type;
  AVCodec *in_plugin;


  GST_LOG ("Registering encoders");

  /* build global ffmpeg param/property info */
  gst_ffmpeg_cfg_init ();

  in_plugin = av_codec_next (NULL);
  while (in_plugin) {
    gchar *type_name;

    /* no quasi codecs, please */
    if (in_plugin->id == CODEC_ID_RAWVIDEO ||
        in_plugin->id == CODEC_ID_ZLIB ||
        (in_plugin->id >= CODEC_ID_PCM_S16LE &&
            in_plugin->id <= CODEC_ID_PCM_F64LE)) {
      goto next;
    }

    /* No encoders depending on external libraries (we don't build them, but
     * people who build against an external ffmpeg might have them.
     * We have native gstreamer plugins for all of those libraries anyway. */
    if (!strncmp (in_plugin->name, "lib", 3)) {
      GST_DEBUG
          ("Not using external library encoder %s. Use the gstreamer-native ones instead.",
          in_plugin->name);
      goto next;
    }

    /* only encoders */
    if (!in_plugin->encode) {
      goto next;
    }

    /* FIXME : We should have a method to know cheaply whether we have a mapping
     * for the given plugin or not */

    GST_DEBUG ("Trying plugin %s [%s]", in_plugin->name, in_plugin->long_name);

    /* no codecs for which we're GUARANTEED to have better alternatives */
    if (!strcmp (in_plugin->name, "vorbis") ||
        !strcmp (in_plugin->name, "gif") || !strcmp (in_plugin->name, "flac")) {
      GST_LOG ("Ignoring encoder %s", in_plugin->name);
      goto next;
    }

    /* construct the type */
    type_name = g_strdup_printf ("ffenc_%s", in_plugin->name);

    type = g_type_from_name (type_name);

    if (!type) {

      /* create the glib type now */
      type = g_type_register_static (GST_TYPE_ELEMENT, type_name, &typeinfo, 0);
      g_type_set_qdata (type, GST_FFENC_PARAMS_QDATA, (gpointer) in_plugin);

      {
        static const GInterfaceInfo preset_info = {
          NULL,
          NULL,
          NULL
        };
        g_type_add_interface_static (type, GST_TYPE_PRESET, &preset_info);
      }
    }

    if (!gst_element_register (plugin, type_name, GST_RANK_SECONDARY, type)) {
      g_free (type_name);
      return FALSE;
    }

    g_free (type_name);

  next:
    in_plugin = av_codec_next (in_plugin);
  }

  GST_LOG ("Finished registering encoders");

  return TRUE;
}
Exemplo n.º 2
0
gboolean
gst_ffmpegvidenc_register (GstPlugin * plugin)
{
    GTypeInfo typeinfo = {
        sizeof (GstFFMpegVidEncClass),
        (GBaseInitFunc) gst_ffmpegvidenc_base_init,
        NULL,
        (GClassInitFunc) gst_ffmpegvidenc_class_init,
        NULL,
        NULL,
        sizeof (GstFFMpegVidEnc),
        0,
        (GInstanceInitFunc) gst_ffmpegvidenc_init,
    };
    GType type;
    AVCodec *in_plugin;


    GST_LOG ("Registering encoders");

    /* build global ffmpeg param/property info */
    gst_ffmpeg_cfg_init ();

    in_plugin = av_codec_next (NULL);
    while (in_plugin) {
        gchar *type_name;

        /* Skip non-AV codecs */
        if (in_plugin->type != AVMEDIA_TYPE_VIDEO)
            goto next;

        /* no quasi codecs, please */
        if (in_plugin->id == AV_CODEC_ID_RAWVIDEO ||
                in_plugin->id == AV_CODEC_ID_V210 ||
                in_plugin->id == AV_CODEC_ID_V210X ||
                in_plugin->id == AV_CODEC_ID_V308 ||
                in_plugin->id == AV_CODEC_ID_V408 ||
                in_plugin->id == AV_CODEC_ID_V410 ||
                in_plugin->id == AV_CODEC_ID_R210
                || in_plugin->id == AV_CODEC_ID_AYUV
                || in_plugin->id == AV_CODEC_ID_Y41P
                || in_plugin->id == AV_CODEC_ID_012V
                || in_plugin->id == AV_CODEC_ID_YUV4
#if AV_VERSION_INT (LIBAVCODEC_VERSION_MAJOR, LIBAVCODEC_VERSION_MINOR, LIBAVCODEC_VERSION_MICRO) >= \
        AV_VERSION_INT (57,4,0)
                || in_plugin->id == AV_CODEC_ID_WRAPPED_AVFRAME
#endif
                || in_plugin->id == AV_CODEC_ID_ZLIB) {
            goto next;
        }

        /* No encoders depending on external libraries (we don't build them, but
         * people who build against an external ffmpeg might have them.
         * We have native gstreamer plugins for all of those libraries anyway. */
        if (!strncmp (in_plugin->name, "lib", 3)) {
            GST_DEBUG
            ("Not using external library encoder %s. Use the gstreamer-native ones instead.",
             in_plugin->name);
            goto next;
        }

        if (strstr (in_plugin->name, "vaapi")) {
            GST_DEBUG
            ("Ignoring VAAPI encoder %s. We can't handle this outside of ffmpeg",
             in_plugin->name);
            goto next;
        }

        if (strstr (in_plugin->name, "nvenc")) {
            GST_DEBUG
            ("Ignoring nvenc encoder %s. We can't handle this outside of ffmpeg",
             in_plugin->name);
            goto next;
        }

        if (g_str_has_suffix (in_plugin->name, "_qsv")) {
            GST_DEBUG
            ("Ignoring qsv encoder %s. We can't handle this outside of ffmpeg",
             in_plugin->name);
            goto next;
        }

        /* only video encoders */
        if (!av_codec_is_encoder (in_plugin)
                || in_plugin->type != AVMEDIA_TYPE_VIDEO)
            goto next;

        /* FIXME : We should have a method to know cheaply whether we have a mapping
         * for the given plugin or not */

        GST_DEBUG ("Trying plugin %s [%s]", in_plugin->name, in_plugin->long_name);

        /* no codecs for which we're GUARANTEED to have better alternatives */
        if (!strcmp (in_plugin->name, "gif")) {
            GST_LOG ("Ignoring encoder %s", in_plugin->name);
            goto next;
        }

        /* construct the type */
        type_name = g_strdup_printf ("avenc_%s", in_plugin->name);

        type = g_type_from_name (type_name);

        if (!type) {

            /* create the glib type now */
            type =
                g_type_register_static (GST_TYPE_VIDEO_ENCODER, type_name, &typeinfo,
                                        0);
            g_type_set_qdata (type, GST_FFENC_PARAMS_QDATA, (gpointer) in_plugin);

            {
                static const GInterfaceInfo preset_info = {
                    NULL,
                    NULL,
                    NULL
                };
                g_type_add_interface_static (type, GST_TYPE_PRESET, &preset_info);
            }
        }

        if (!gst_element_register (plugin, type_name, GST_RANK_SECONDARY, type)) {
            g_free (type_name);
            return FALSE;
        }

        g_free (type_name);

next:
        in_plugin = av_codec_next (in_plugin);
    }

    GST_LOG ("Finished registering encoders");

    return TRUE;
}