[Spice-devel] [PATCH spice-streaming-agent 4/4] gst-plugin: reduce number of templates being used

Frediano Ziglio fziglio at redhat.com
Thu Aug 1 16:17:42 UTC 2019


> 
> > 
> > ---
> > 
> > This patch is not really necessary, just a suggestion, it's a bit hacky
> > but would save some code.
> > Other options would be to use explicit template specialization or to
> > leave it as is.
> > 
> 
> Sure, what I don't like is that is surely not type safe, you can instantiate
> a GstMiniObjectUPtr of whatever, even an "int" type and compiler won't
> complain at all, witch is a good thing of C++.
> I'm thinking possible changes to this patch like traits and/or macros to
> declare allowed types.
> Certain the type is getting a bit long ("GstMiniObjectUPtr<GstSample>"),
> but this could be solve by typedefs (well, this was solved by using lines).
> 

What about:


template <typename T>
struct is_gst_mini_type {
};

template <typename T, typename = typename is_gst_mini_type<T>::type>
struct GstMiniObjectDeleter {
    void operator()(T* p)
    {
        gst_mini_object_unref(GST_MINI_OBJECT_CAST(p));
    }
};

template <typename T>
using GstMiniObjectUPtr = std::unique_ptr<T, GstMiniObjectDeleter<T>>;

#define DECLARE_GST_MINI_TYPE(name) \
template <> struct is_gst_mini_type<name> { \
        typedef name *type; \
}; \
using name ## UPtr = GstMiniObjectUPtr<name>;

DECLARE_GST_MINI_TYPE(GstSample)


> > ---
> >  src/gst-plugin.cpp | 44 ++++++++++++++------------------------------
> >  1 file changed, 14 insertions(+), 30 deletions(-)
> > 
> > diff --git a/src/gst-plugin.cpp b/src/gst-plugin.cpp
> > index c7412c5..5f4cc3d 100644
> > --- a/src/gst-plugin.cpp
> > +++ b/src/gst-plugin.cpp
> > @@ -49,32 +49,16 @@ struct GstObjectDeleter {
> >  template <typename T>
> >  using GstObjectUPtr = std::unique_ptr<T, GstObjectDeleter<T>>;
> >  
> > -struct GstCapsDeleter {
> > -    void operator()(GstCaps* p)
> > -    {
> > -        gst_caps_unref(p);
> > -    }
> > -};
> > -
> > -using GstCapsUPtr = std::unique_ptr<GstCaps, GstCapsDeleter>;
> > -
> > -struct GstSampleDeleter {
> > -    void operator()(GstSample* p)
> > -    {
> > -        gst_sample_unref(p);
> > -    }
> > -};
> > -
> > -using GstSampleUPtr = std::unique_ptr<GstSample, GstSampleDeleter>;
> > -
> > -struct GstBufferDeleter {
> > -    void operator()(GstBuffer* p)
> > +template <typename T>
> > +struct GstMiniObjectDeleter {
> > +    void operator()(T* p)
> >      {
> > -        gst_buffer_unref(p);
> > +        gst_mini_object_unref(GST_MINI_OBJECT_CAST(p));
> >      }
> >  };
> >  
> > -using GstBufferUPtr = std::unique_ptr<GstBuffer, GstBufferDeleter>;
> > +template <typename T>
> > +using GstMiniObjectUPtr = std::unique_ptr<T, GstMiniObjectDeleter<T>>;
> >  
> >  class GstreamerFrameCapture final : public FrameCapture
> >  {
> > @@ -89,7 +73,7 @@ public:
> >      std::vector<DeviceDisplayInfo> get_device_display_info() const
> >      override;
> >  private:
> >      void free_sample();
> > -    GstElement *get_encoder_plugin(const GstreamerEncoderSettings
> > &settings,
> > GstCapsUPtr &sink_caps);
> > +    GstElement *get_encoder_plugin(const GstreamerEncoderSettings
> > &settings,
> > GstMiniObjectUPtr<GstCaps> &sink_caps);
> >      GstElement *get_capture_plugin(const GstreamerEncoderSettings
> >      &settings);
> >      void pipeline_init(const GstreamerEncoderSettings &settings);
> >      Display *const dpy;
> > @@ -97,7 +81,7 @@ private:
> >      void xlib_capture();
> >  #endif
> >      GstObjectUPtr<GstElement> pipeline, capture, sink;
> > -    GstSampleUPtr sample;
> > +    GstMiniObjectUPtr<GstSample> sample;
> >      GstMapInfo map = {};
> >      uint32_t last_width = ~0u, last_height = ~0u;
> >      uint32_t cur_width = 0, cur_height = 0;
> > @@ -134,7 +118,7 @@ GstElement
> > *GstreamerFrameCapture::get_capture_plugin(const GstreamerEncoderSett
> >  }
> >  
> >  GstElement *GstreamerFrameCapture::get_encoder_plugin(const
> >  GstreamerEncoderSettings &settings,
> > -                                                      GstCapsUPtr
> > &sink_caps)
> > +
> > GstMiniObjectUPtr<GstCaps>
> > &sink_caps)
> >  {
> >      GList *encoders;
> >      GList *filtered;
> > @@ -238,7 +222,7 @@ void GstreamerFrameCapture::pipeline_init(const
> > GstreamerEncoderSettings &settin
> >      if (!convert) {
> >          throw std::runtime_error("Gstreamer's 'autovideoconvert' element
> >          cannot be created");
> >      }
> > -    GstCapsUPtr sink_caps;
> > +    GstMiniObjectUPtr<GstCaps> sink_caps;
> >      GstObjectUPtr<GstElement> encoder(get_encoder_plugin(settings,
> >      sink_caps));
> >      if (!encoder) {
> >          throw std::runtime_error("Gstreamer's encoder element cannot be
> >          created");
> > @@ -260,7 +244,7 @@ void GstreamerFrameCapture::pipeline_init(const
> > GstreamerEncoderSettings &settin
> >      gst_bin_add(bin, encoder);
> >      gst_bin_add(bin, sink);
> >  
> > -    GstCapsUPtr caps(gst_caps_from_string("video/x-raw(ANY)"));
> > +    GstMiniObjectUPtr<GstCaps>
> > caps(gst_caps_from_string("video/x-raw(ANY)"));
> >      link = gst_element_link(capture.get(), convert.get()) &&
> >             gst_element_link_filtered(convert.get(), encoder.get(),
> >             caps.get()) &&
> >             gst_element_link_filtered(encoder.get(), sink.get(),
> >             sink_caps.get());
> > @@ -362,7 +346,7 @@ void GstreamerFrameCapture::xlib_capture()
> >          throw std::runtime_error("Cannot capture from X");
> >      }
> >  
> > -    GstBufferUPtr buf(gst_buffer_new_wrapped_full((GstMemoryFlags)0,
> > image->data,
> > +    GstMiniObjectUPtr<GstBuffer>
> > buf(gst_buffer_new_wrapped_full((GstMemoryFlags)0, image->data,
> >                                                    image->height *
> >                                                    image->bytes_per_line,
> >                                                    0,
> >                                                    image->height *
> >                                                    image->bytes_per_line,
> >                                                    image,
> >                                                    free_ximage));
> > @@ -370,7 +354,7 @@ void GstreamerFrameCapture::xlib_capture()
> >          throw std::runtime_error("Failed to wrap image in gstreamer
> >          buffer");
> >      }
> >  
> > -    GstCapsUPtr caps(gst_caps_new_simple("video/x-raw",
> > +    GstMiniObjectUPtr<GstCaps> caps(gst_caps_new_simple("video/x-raw",
> >                                           "format", G_TYPE_STRING, "BGRx",
> >                                           "width", G_TYPE_INT,
> >                                           image->width,
> >                                           "height", G_TYPE_INT,
> >                                           image->height,
> > @@ -378,7 +362,7 @@ void GstreamerFrameCapture::xlib_capture()
> >                                           nullptr));
> >  
> >      // Push sample
> > -    GstSampleUPtr appsrc_sample(gst_sample_new(buf.get(), caps.get(),
> > nullptr, nullptr));
> > +    GstMiniObjectUPtr<GstSample> appsrc_sample(gst_sample_new(buf.get(),
> > caps.get(), nullptr, nullptr));
> >      if (gst_app_src_push_sample(GST_APP_SRC(capture.get()),
> >      appsrc_sample.get()) != GST_FLOW_OK) {
> >          throw std::runtime_error("gstramer appsrc element cannot push
> >          sample");
> >      }
> 
> Frediano
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel


More information about the Spice-devel mailing list