diff --git a/ext/daala/gstdaalaenc.c b/ext/daala/gstdaalaenc.c index ef3ce4aa45..77ab0b26d2 100644 --- a/ext/daala/gstdaalaenc.c +++ b/ext/daala/gstdaalaenc.c @@ -82,6 +82,8 @@ GST_STATIC_PAD_TEMPLATE ("src", "width = (int) [ 1, MAX ], " "height = (int) [ 1, MAX ]") ); +static GstCaps *daala_supported_caps = NULL; + #define gst_daala_enc_parent_class parent_class G_DEFINE_TYPE (GstDaalaEnc, gst_daala_enc, GST_TYPE_VIDEO_ENCODER); @@ -107,6 +109,85 @@ static void daala_enc_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void daala_enc_finalize (GObject * object); +static char * +daala_enc_get_supported_formats (void) +{ + daala_enc_ctx *encoder; + daala_info info; + struct + { + GstVideoFormat fmt; + gint planes; + gint xdec[3], ydec[3]; + } formats[] = { + { + GST_VIDEO_FORMAT_Y444, 3, { + 0, 0, 0}, { + 0, 0, 0}}, { + GST_VIDEO_FORMAT_I420, 3, { + 0, 1, 1}, { + 0, 1, 1}} + }; + GString *string = NULL; + guint i; + + daala_info_init (&info); + info.pic_width = 16; + info.pic_height = 16; + info.timebase_numerator = 25; + info.timebase_denominator = 1; + info.frame_duration = 1; + for (i = 0; i < G_N_ELEMENTS (formats); i++) { + gint j; + + info.nplanes = formats[i].planes; + for (j = 0; j < formats[i].planes; j++) { + info.plane_info[j].xdec = formats[i].xdec[j]; + info.plane_info[j].ydec = formats[i].ydec[j]; + } + + encoder = daala_encode_create (&info); + if (encoder == NULL) + continue; + + GST_LOG ("format %s is supported", + gst_video_format_to_string (formats[i].fmt)); + daala_encode_free (encoder); + + if (string == NULL) { + string = g_string_new (gst_video_format_to_string (formats[i].fmt)); + } else { + g_string_append (string, ", "); + g_string_append (string, gst_video_format_to_string (formats[i].fmt)); + } + } + daala_info_clear (&info); + + return string == NULL ? NULL : g_string_free (string, FALSE); +} + +static void +initialize_supported_caps (void) +{ + char *supported_formats, *caps_string; + + supported_formats = daala_enc_get_supported_formats (); + if (!supported_formats) { + GST_WARNING ("no supported formats found. Encoder disabled?"); + daala_supported_caps = gst_caps_new_empty (); + } + + caps_string = g_strdup_printf ("video/x-raw, " + "format = (string) { %s }, " + "framerate = (fraction) [1/MAX, MAX], " + "width = (int) [ 1, MAX ], " "height = (int) [ 1, MAX ]", + supported_formats); + daala_supported_caps = gst_caps_from_string (caps_string); + g_free (caps_string); + g_free (supported_formats); + GST_DEBUG ("Supported caps: %" GST_PTR_FORMAT, daala_supported_caps); +} + static void gst_daala_enc_class_init (GstDaalaEncClass * klass) { @@ -115,6 +196,8 @@ gst_daala_enc_class_init (GstDaalaEncClass * klass) GstVideoEncoderClass *gstvideo_encoder_class = GST_VIDEO_ENCODER_CLASS (klass); + GST_DEBUG_CATEGORY_INIT (daalaenc_debug, "daalaenc", 0, "Daala encoder"); + gobject_class->set_property = daala_enc_set_property; gobject_class->get_property = daala_enc_get_property; gobject_class->finalize = daala_enc_finalize; @@ -147,11 +230,12 @@ gst_daala_enc_class_init (GstDaalaEncClass * klass) gstvideo_encoder_class->pre_push = GST_DEBUG_FUNCPTR (daala_enc_pre_push); gstvideo_encoder_class->finish = GST_DEBUG_FUNCPTR (daala_enc_finish); gstvideo_encoder_class->getcaps = GST_DEBUG_FUNCPTR (daala_enc_getcaps); - gstvideo_encoder_class->sink_query = GST_DEBUG_FUNCPTR (daala_enc_sink_query); + gstvideo_encoder_class->sink_query = + GST_DEBUG_FUNCPTR (gst_daala_enc_sink_query); gstvideo_encoder_class->propose_allocation = GST_DEBUG_FUNCPTR (daala_enc_propose_allocation); - GST_DEBUG_CATEGORY_INIT (daalaenc_debug, "daalaenc", 0, "Daala encoder"); + initialize_supported_caps (); } static void @@ -238,63 +322,6 @@ daala_enc_stop (GstVideoEncoder * benc) return TRUE; } -static char * -daala_enc_get_supported_formats (void) -{ - daala_enc_ctx *encoder; - daala_info info; - struct - { - GstVideoFormat fmt; - gint planes; - gint xdec[3], ydec[3]; - } formats[] = { - { - GST_VIDEO_FORMAT_Y444, 3, { - 0, 0, 0}, { - 0, 0, 0}}, { - GST_VIDEO_FORMAT_I420, 3, { - 0, 1, 1}, { - 0, 1, 1}} - }; - GString *string = NULL; - guint i; - - daala_info_init (&info); - info.pic_width = 16; - info.pic_height = 16; - info.timebase_numerator = 25; - info.timebase_denominator = 1; - info.frame_duration = 1; - for (i = 0; i < G_N_ELEMENTS (formats); i++) { - gint j; - - info.nplanes = formats[i].planes; - for (j = 0; j < formats[i].planes; j++) { - info.plane_info[j].xdec = formats[i].xdec[j]; - info.plane_info[j].ydec = formats[i].ydec[j]; - } - - encoder = daala_encode_create (&info); - if (encoder == NULL) - continue; - - GST_LOG ("format %s is supported", - gst_video_format_to_string (formats[i].fmt)); - daala_encode_free (encoder); - - if (string == NULL) { - string = g_string_new (gst_video_format_to_string (formats[i].fmt)); - } else { - g_string_append (string, ", "); - g_string_append (string, gst_video_format_to_string (formats[i].fmt)); - } - } - daala_info_clear (&info); - - return string == NULL ? NULL : g_string_free (string, FALSE); -} - static gboolean gst_daala_enc_sink_query (GstVideoEncoder * encoder, GstQuery * query) { @@ -302,14 +329,12 @@ gst_daala_enc_sink_query (GstVideoEncoder * encoder, GstQuery * query) switch (GST_QUERY_TYPE (query)) { case GST_QUERY_ACCEPT_CAPS:{ - GstCaps *acceptable, *caps; + GstCaps *caps; - acceptable = daala_enc_get_supported_formats (); gst_query_parse_accept_caps (query, &caps); gst_query_set_accept_caps_result (query, - gst_caps_is_subset (caps, acceptable)); - gst_caps_unref (acceptable); + gst_caps_is_subset (caps, daala_supported_caps)); res = TRUE; } break; @@ -324,29 +349,8 @@ gst_daala_enc_sink_query (GstVideoEncoder * encoder, GstQuery * query) static GstCaps * daala_enc_getcaps (GstVideoEncoder * encoder, GstCaps * filter) { - GstCaps *caps, *ret; - char *supported_formats, *caps_string; - - supported_formats = daala_enc_get_supported_formats (); - if (!supported_formats) { - GST_WARNING ("no supported formats found. Encoder disabled?"); - return gst_caps_new_empty (); - } - - caps_string = g_strdup_printf ("video/x-raw, " - "format = (string) { %s }, " - "framerate = (fraction) [1/MAX, MAX], " - "width = (int) [ 1, MAX ], " "height = (int) [ 1, MAX ]", - supported_formats); - caps = gst_caps_from_string (caps_string); - g_free (caps_string); - g_free (supported_formats); - GST_DEBUG ("Supported caps: %" GST_PTR_FORMAT, caps); - - ret = gst_video_encoder_proxy_getcaps (encoder, caps, filter); - gst_caps_unref (caps); - - return ret; + return gst_video_encoder_proxy_getcaps (encoder, daala_supported_caps, + filter); } static gboolean