gstreamermm: saving a frame to jpeg



Hello all

a question about gstreamermm: I am trying to convert an old project of mine to the current version of gtkmm and gstreamermm. And there is one particular problem that I can not solve.


I have a piece of code that extracts a thumbnail picture from a video, in order to give an idea of what the video is about. What I used to do in the old code was:

Save_Frame_To_Jpeg()

{

Glib::RefPtr<Gst::Caps> image_caps;

Glib::RefPtr<Gst::Buffer> image_buf;

Glib::RefPtr<Gdk::Pixbuf> pix_buf;

/////////////////////////////////////////////////

image_caps = Gst::Caps::create_simple("video/x-raw-rgb");


image_caps->set_simple("endianness", G_BIG_ENDIAN);

image_caps->set_simple("bpp", 24);

image_caps->set_simple("depth", 24);

image_caps->set_simple("red_mask", 0xff0000);

image_caps->set_simple("green_mask", 0x00ff00);

image_caps->set_simple("blue_mask", 0x0000ff);

// get the Gst::Buffer of the current frame of the video

image_buf = m_play_bin->convert_frame (image_caps);


image_buf->get_caps()->get_structure(0).get_field("width", w) ;

image_buf->get_caps()->get_structure(0).get_field("height", h) ;


// convert the Gst::Buffer current frame of the video to a Gdk::PixBuf

pix_buf =

Gdk::Pixbuf::create_from_data(

(const guint8*) image_buf->get_data(),

Gdk::COLORSPACE_RGB, /* RGB-colorspace */

false, /* No alpha-channel */

8, /* Bits per RGB-component */

w, h, /* Dimensions */

(((3 * w)+3)&~3) /* Number of bytes between lines (ie stride) */

//,Gdk::Pixbuf::SlotDestroyData(&UnRef_Pixbuf)

);

}

how can I do this today, with the current gstreamermm? I have tried things like

Save_Frame_To_Jpeg()

{

Glib::RefPtr<Gst::Caps> image_caps;

Glib::RefPtr<Gst::Sample> image_buf;

Glib::RefPtr<Gdk::Pixbuf> pix_buf;

/////////////////////////////////////////////////

...

image_buf = m_play_bin->convert_sample (image_caps);


m_play_bin→get_video_pad(0)→get_current_caps()->get_structure(0).get_field("width", w) ;

m_play_bin->get_video_pad(0)->get_current_caps()->get_structure(0).get_field("height", h) ;


pix_buf =

Gdk::Pixbuf::create_from_data(

(const guint8*) image_buf->get_buffer()->get_all_memory(),

Gdk::COLORSPACE_RGB, /* RGB-colorspace */

false, /* No alpha-channel */

8, /* Bits per RGB-component */

w, h, /* Dimensions */
(((3 * w)+3)&~3) /* Number of bytes between lines (ie stride) */

,Gdk::Pixbuf::SlotDestroyData(&UnRef_Pixbuf) 

);

but that does not even compile…

so… can someone tell me what the correct way is of converting one particular frame of a video to a jpeg?

Regards,

Danny.





[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]