[gstreamer-bugs] [Bug 629157] Move video frame conversion from playback plugin to libgstvideo
GStreamer (bugzilla.gnome.org)
bugzilla at gnome.org
Thu Sep 9 07:23:37 PDT 2010
https://bugzilla.gnome.org/show_bug.cgi?id=629157
GStreamer | gst-plugins-base | unspecified
Edward Hervey <bilboed> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Ever Confirmed|0 |1
--- Comment #4 from Edward Hervey <bilboed at gmail.com> 2010-09-09 14:23:32 UTC ---
(In reply to comment #3)
> (From update of attachment 169847 [details])
> >+#include <glib-object.h>
> >+#include <string.h>
> >+#include "video.h"
>
> glib-object.h include looks unnecessary
>
REMOVED
> >+static gboolean
> >+caps_are_raw (GstCaps * caps)
> >+{
> >+ static GstCaps *raw_video = NULL;
> >+ static gsize once = 0;
> >+
> >+ if (g_once_init_enter (&once)) {
> >+ raw_video = gst_caps_from_string ("video/x-raw-yuv;video/x-raw-rgb");
> >+ g_once_init_leave (&once, 1);
> >+ }
> >+
> >+ return gst_caps_can_intersect (caps, raw_video);
> >+}
>
> How about GstStaticCaps? I think something involving gst_structure_has_name()
> might be better though..
CHANGED
>
>
> >+/* takes ownership of the input buffer */
> >+/**
> >+ * gst_video_convert_frame:
> >+ * @buf: a #GstBuffer
> >+ * @to_caps: the #GstCaps to convert to
> >+ *
> >+ * Converts a raw video buffer into the specified output caps.
> >+ *
> >+ * The output caps can be any raw video formats or any image formats (jpeg, png, ...).
> >+ *
> >+ * The width, height and pixel-aspect-ratio can also be specified in the output caps.
> >+ *
> >+ * Returns: The converted #GstBuffer, or %NULL if an error happened.
> >+ */
> >+GstBuffer *
> >+gst_video_convert_frame (GstBuffer * buf, GstCaps * to_caps)
>
> API that takes ownership of the arguments passed is always a bit awkward IMHO
> and should only be a last resort if needed for performance reasons or if it
> considerably simplifies usage.
That comment was leftover bogus.
>
> In this case this seems unnecessary to me and I would not make the function
> take ownership of the buffer, and also mark the GstCaps as const GstCaps *.
DONE
>
> >+ from_caps = GST_BUFFER_CAPS (buf);
> >+ g_return_val_if_fail (from_caps != NULL, NULL);
>
> g_return_val_if_fail (GST_BUFFER_CAPS (buf) != NULL, NULL) might make it
> clearer to users of this API what they did wrong.
>
> Should maybe also check for input caps != NULL and GST_IS_CAPS and
> GST_CAPS_IS_SIMPLE and gst_caps_is_fixed().
FIXED
>
>
> >+ /* Add black borders if necessary to keep the DAR */
> >+ g_object_set (vscale, "add-borders", TRUE, NULL);
>
> This makes me wonder if we should add an option_flags parameter to the
> function. (User might prefer cropping, for example).
Too bad for them.
>
>
> >+ msg =
> >+ gst_bus_poll (bus, GST_MESSAGE_ERROR | GST_MESSAGE_ASYNC_DONE,
> >+ 25 * GST_SECOND);
>
> Should use gst_bus_timed_pop_filtered() here instead. Should definitely not
> iterate any GLib main loops IMHO.
FIXED
>
> Do we also need a timeout argument? An async variant of the function?
They can be added later
>
>
> >+ if (result) {
> >+ GST_DEBUG ("conversion successful: result = %p", result);
> >+ } else {
> >+ GST_WARNING ("prerolled but no result frame?!");
> >+ }
>
> Shouldn't this be an error of some instead? Instead of a GST_WARNING
fixed
>
>
> >+ case GST_MESSAGE_ERROR:{
> >...
> >+ gst_message_parse_error (msg, &error, &dbg);
> >+ if (error) {
> >+ g_warning ("Could not convert video frame: %s", error->message);
> >+ GST_DEBUG ("%s [debug: %s]", error->message, GST_STR_NULL (dbg));
> >+ g_error_free (error);
> >+ } else {
> >+ g_warning ("Could not convert video frame (and NULL error!)");
> >...
> >+ } else {
> >+ g_warning ("Could not convert video frame: %s",
> >+ "timeout during conversion");
> >+ }
> >...
> >+ /* ERRORS */
> >+no_encoder:
> >+ {
> >+ g_warning ("could not find an encoder for provided caps");
> >+ return NULL;
> >+ }
> >+no_elements:
> >+ {
> >+ g_warning ("Could not convert video frame: %s", error->message);
> >+ g_error_free (error);
> >+ return NULL;
> >+ }
> >+no_pipeline:
> >+ {
> >+ g_warning ("Could not convert video frame: %s",
> >+ "no pipeline (unknown error)");
> >+ return NULL;
> >+ }
> >+link_failed:
> >+ {
> >+ g_warning ("Could not convert video frame: %s", "failed to link elements");
> >+ gst_object_unref (pipeline);
> >+ return NULL;
> >+ }
>
> g_warning does not really seem like an appropriate form of error handling for
> such a function. We should add a GError ** argument as well for proper error
> handling.
--
Configure bugmail: https://bugzilla.gnome.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
You are the assignee for the bug.
More information about the Gstreamer-bugs
mailing list