Adding MetaData to GstBuffer

Roshan Chaudhari rgc183 at gmail.com
Mon Sep 27 11:00:16 UTC 2021


So I have created sample application with sender adding metadata and
receiver reading it. I am using templates for gst_Add_meta from here:
http://lifestyletransfer.com/how-to-add-metadata-to-gstreamer-buffer-in-python/


Relevant code from my sender and receiver as follows:
However, if I try to read meta data below in the same pipeline, it works.

rtpsink is udpsink and rtpsrc is udpsrc.

Sender:

#define AUDIO_CAPS "audio/x-raw,format=S16LE,channels=1"

gst_element_link_many(source, wavparse, audioconv,capsfilterAFX, rtpgstpay,
rtpsink, NULL)

ADD_PAD_PROBE(source, "src", Callback,
                    GST_PAD_PROBE_TYPE_BUFFER, nullptr);

GstPadProbeReturn Callback(GstPad *pad,
                                                         GstPadProbeInfo
*info,
                                                         gpointer
user_data) {
  GstBuffer *buffer = (GstBuffer *)info->data;

  GstMapInfo inmap = GST_MAP_INFO_INIT;

  g_print("\n data sending from source ");
  GstMapInfo map = GST_MAP_INFO_INIT;

  GstMetaMarking* meta = GST_META_MARKING_ADD(buffer);

  meta->in_timestamp = 99000;

  // Below works
    /*GstMetaMarking* meta1 = GST_META_MARKING_GET(buffer);
  if(meta1)
    g_print("\n data is %lu ", meta1->in_timestamp);
*/
  return GST_PAD_PROBE_OK;

}


Receiver:

// capsfilterAFX are same as sender AUDIO_CAPS

gboolean res=gst_element_link_many(rtpsrc, rtpgstdepay, capsfilterAFX,
audioconver,audioresample, fakesink,NULL);
g_assert(res==TRUE);

ADD_PAD_PROBE(capsfilterAFX, "src", Callback,
                    GST_PAD_PROBE_TYPE_BUFFER, nullptr);

GstPadProbeReturn Callback(GstPad *pad,
                           GstPadProbeInfo *info,
                           gpointer user_data) {

  GstBuffer *buffer = (GstBuffer *)info->data;
  //MaxineDSPipeline *pipeline = (MaxineDSPipeline *)user_data;
  GstMapInfo inmap = GST_MAP_INFO_INIT;

  GstMetaMarking* meta = GST_META_MARKING_GET(buffer);
  if(!meta)
    g_print("\n it is null ");
  else
    g_print("\n data received %lu", meta->in_timestamp);

  //g_print("\n data received");
  return GST_PAD_PROBE_OK;
}



However, my receiver, always get data null.



-
Thanks,
Roshan

On Mon, Sep 27, 2021 at 12:50 PM Eslam Ahmed <eslam.ahmed at avidbeam.com>
wrote:

> You are welcome!
>
> With gstrtppay/gstrtpdepay you should be able to serialize/deserialize the
> GstBuffer over the network no matter the type of data it contains.
> GstBuffer at this point could contain text, encoded/raw frame or an audio
> frame.
>
> Best Regards,
> Eslam Ahmed
>
>
> On Mon, Sep 27, 2021 at 9:09 AM Roshan Chaudhari <rgc183 at gmail.com> wrote:
>
>> Thank you Michael and Eslam!
>>
>> @Eslam, Seems like all the above options you mentioned are specific to
>> MPEG, or RTP?
>>
>> I am looking for a solution which could be applied to any data such as
>> text, audio, video data.
>>
>>
>> --
>> Thanks,
>> Roshan
>>
>> On Sun, Sep 26, 2021 at 2:21 PM Eslam Ahmed <eslam.ahmed at avidbeam.com>
>> wrote:
>>
>>> Roshan,
>>>
>>> Regarding Transport Stream, you can use the MPEG-TS container to contain
>>> your encoded stream as well as your metadata in a klv-format. Check this
>>> out:
>>> https://gstreamer-devel.narkive.com/GlIqaK1k/example-code-for-muxing-klv-meta-x-klv-with-mpegtsmux-plugins-bad-and-gstreamer-1-8-3
>>>
>>> Just make sure to push klv metadata every video frame otherwise the
>>> pipeline would stall. One useful thing to note is that your metadata need
>>> not be in a klv format, you can just push arbitrary bytes as long as you
>>> know how to interpret them after the demuxer at the receiver end.
>>>
>>> Another approach is to use payloaders (e.g. rtph264pay) and encode your
>>> metadata as RTP extension headers. see
>>> https://gstreamer.freedesktop.org/documentation/rtplib/gstrtpbuffer.html?gi-language=c#gst_rtp_buffer_add_extension_onebyte_header.
>>> If your metadata is per-frame basis, then most probably and based on the
>>> encoded frame size, one frame might end up having multiple RTP packets so
>>> you will need to handle where to insert your metadata. You can use the
>>> marker bit for that. see
>>> https://gstreamer.freedesktop.org/documentation/rtplib/gstrtpbuffer.html?gi-language=c#gst_rtp_buffer_get_marker
>>>
>>> Final approach which is much more complicated which will require you to
>>> create a new custom gstreamer media type (e.g. video/x-mytype) and insert
>>> your custom metadata via gst_buffer_add_meta() in the GstBuffer and use
>>> rtpgstpay/rtpgstdepay which guarantee to fully serialize/deserialize the
>>> GstBuffer over the network. You would also need to develop 2 gstreamer
>>> elements, one to prepend/append your metadata to your au-aligned H264 and
>>> the other to extract the metadata from video/x-mytype and restore the
>>> original stream.
>>>
>>> Hope that helps!
>>>
>>> Best Regards,
>>> Eslam Ahmed
>>>
>>>
>>> On Sat, Sep 25, 2021 at 10:00 PM Michael Gruner via gstreamer-devel <
>>> gstreamer-devel at lists.freedesktop.org> wrote:
>>>
>>>> Hello Roshan
>>>>
>>>> The GstMeta is not transmitted through network. If your want a standard
>>>> way to transmit metadata over the network along with audio and video you
>>>> may look into Transport Stream. This will allow you to insert your custom
>>>> metadata without breaking existing decoders. GStreamer already has support
>>>> for this.
>>>>
>>>> Another option may be to use a codec that allows you to insert custom
>>>> data within the compressed bitstream (like SEI in H264 or H265). That,
>>>> however is a bit more tricky to get right.
>>>>
>>>> Michael
>>>> www.ridgerun.con
>>>>
>>>> On 25 Sep 2021, at 08:24, Roshan Chaudhari via gstreamer-devel <
>>>> gstreamer-devel at lists.freedesktop.org> wrote:
>>>>
>>>> 
>>>> Hello,
>>>>
>>>> I am trying to append some metadata to the data transferred over udp
>>>> using gstreamer.
>>>>
>>>>
>>>>    1. I would like to know whether metadata in GstBuffer is
>>>>    transferred/retained when transferred over the network or it is only
>>>>    retained in that pipeline? I have tried using my custom metadata with
>>>>    gst_buffer_add_meta() at the udpsink, however, when I try to query it on
>>>>    udpsrc on other machine using gst_buffer_get_meta(), metadata is not
>>>>    present in GstBuffer.
>>>>    2.
>>>>    3. If this is not carried over the network, what would be the other
>>>>    way to add metadata? I could write custom plugin and append to actual data,
>>>>    so my custom encoder and decoder knows how to extract real data and pass it
>>>>    to next stage in the pipeline. But this way, it puts restriction on the
>>>>    receiver side to have decoder if my data contains metadata.
>>>>
>>>>
>>>> -
>>>> Thanks,
>>>> Roshan
>>>>
>>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20210927/ceaee42f/attachment-0001.htm>


More information about the gstreamer-devel mailing list