How to add GstMeta to buffers in a pool?

Spruyt, Randy Randy.Spruyt at christiedigital.com
Thu Jun 11 07:12:41 PDT 2015


Thanks Mohammed, adding the GST_META_FLAG_POOLED helps. However, if we append memory to Gst Buffers after they are allocated we see the same thing, the meta data disappears. Perhaps I am approaching this wrong and need to do the wrapping during the buffer allocation by overloading GstBufferPoolClass->alloc instead? 

i.e. here is what I am currently doing:

gst_buffer_pool_acquire_buffer( pool, &buf, NULL);
mem = gst_memory_new_wrapped( 0, dataBuf, dataBufSize, 0, dataBufSize, NULL, NULL );
gst_buffer_append_memory( buf, mem );

if I then add metadata, it does not show up the next time I acquire the buffer. The idea is that we have a block of memory from Intel MediaSDK created, we just want to wrap a GstBuffer around it, then add some meta data with additional information (i.e. YUV planes, RGB planes, etc). If I remove the gst_buffer_append_memory() the metadata shows up.


Thanks,
Randy


-----Original Message-----
From: gstreamer-devel [mailto:gstreamer-devel-bounces at lists.freedesktop.org] On Behalf Of Mohammed Sameer
Sent: Wednesday, June 10, 2015 7:10 PM
To: gstreamer-devel at lists.freedesktop.org
Subject: Re: How to add GstMeta to buffers in a pool?

On Wed, Jun 10, 2015 at 05:37:09PM +0000, Spruyt, Randy wrote:
>  When using a buffer pool, adding MetaData to an acquired buffer seems
>  work fine, but the next time I acquire the same buffer, the data is
>  gone. I suspect I may be using this incorrectly somehow?

[...]

>  void test()
>  {
>  GstBuffer* buf = NULL;
>  mfxFrameSurface1 someSurface;
>  IntelQuickSyncMeta* metaData = NULL;
>  GstBufferPool* pool = NULL;
>  GstStructure* config = NULL;
>  GstCaps* caps = NULL;
>  pool = gst_buffer_pool_new();
>  config = gst_buffer_pool_get_config( pool );
>  caps = gst_caps_from_string("video/x-raw");
>  gst_buffer_pool_config_set_params( config, caps, 100, 1, 1 );
>  if( gst_buffer_pool_set_config( pool, config ) )
>  {
>  if( gst_buffer_pool_set_active( pool, TRUE ) )
>  {
>  while( gst_buffer_pool_acquire_buffer( pool, &buf,
>  NULL ) != GST_FLOW_EOS )
>  {
>  // first loop this is NULL which is fine,
>  2nd loop this should not be null, but it is
> 
>  metaData =
>  gst_buffer_get_intel_quicksync_meta( buf );
> 
>  if( !metaData )
> 
>  {
> 
>  // add some meta data,

Here you can set the GST_META_FLAG_POOLED flag:
GST_META_FLAG_SET (metaData, GST_META_FLAG_POOLED);

https://developer.gnome.org/gstreamer/stable/gstreamer-GstMeta.html
and check the note in alloc_buffer() https://developer.gnome.org/gstreamer/stable/gstreamer-GstBufferPool.html

Cheers,

-- 
GPG-Key: 0xA3FD0DF7 - 9F73 032E EAC9 F7AD 951F  280E CB66 8E29 A3FD 0DF7
Debian User and Developer.
Homepage: www.foolab.org
_______________________________________________
gstreamer-devel mailing list
gstreamer-devel at lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel


More information about the gstreamer-devel mailing list