this is a gstreamer plugin:

#include 
#include 
#include 
#include 

/\* Forward declarations \*/
typedef struct \_GstMyRtpHdrExt GstMyRtpHdrExt;
typedef struct \_GstMyRtpHdrExtClass GstMyRtpHdrExtClass;

static void gst\_my\_rtp\_hdr\_ext\_class\_init(GstMyRtpHdrExtClass \*klass);
static void gst\_my\_rtp\_hdr\_ext\_init(GstMyRtpHdrExt \*my\_rtp\_hdr\_ext);
static GstFlowReturn gst\_my\_rtp\_hdr\_ext\_transform\_ip(GstBaseTransform \*trans, GstBuffer \*buf);

/\* Define the GstMyRtpHdrExt structure \*/
struct \_GstMyRtpHdrExt
{
 GstBaseTransform base\_transform;
};

struct \_GstMyRtpHdrExtClass
{
 GstBaseTransformClass parent\_class;
};

/\* Register the element \*/
#define GST\_TYPE\_MY\_RTP\_HDR\_EXT (gst\_my\_rtp\_hdr\_ext\_get\_type())
#define GST\_MY\_RTP\_HDR\_EXT(obj) (G\_TYPE\_CHECK\_INSTANCE\_CAST((obj), GST\_TYPE\_MY\_RTP\_HDR\_EXT, GstMyRtpHdrExt))
G\_DEFINE\_TYPE(GstMyRtpHdrExt, gst\_my\_rtp\_hdr\_ext, GST\_TYPE\_BASE\_TRANSFORM);

/\* Pad templates \*/
static GstStaticPadTemplate sink\_template = GST\_STATIC\_PAD\_TEMPLATE("sink",
 GST\_PAD\_SINK,
 GST\_PAD\_ALWAYS,
 GST\_STATIC\_CAPS("application/x-rtp"));

static GstStaticPadTemplate src\_template = GST\_STATIC\_PAD\_TEMPLATE("src",
 GST\_PAD\_SRC,
 GST\_PAD\_ALWAYS,
 GST\_STATIC\_CAPS("application/x-rtp"));

/\* Initialize the class \*/
static void gst\_my\_rtp\_hdr\_ext\_class\_init(GstMyRtpHdrExtClass \*klass)
{
 GstElementClass \*element\_class = GST\_ELEMENT\_CLASS(klass);
 GstBaseTransformClass \*base\_transform\_class = GST\_BASE\_TRANSFORM\_CLASS(klass);

 gst\_element\_class\_set\_static\_metadata(element\_class,
 "My RTP Header Extension Element",
 "Filter/Effect",
 "A GStreamer element that adds an RTP header extension to packets",
 "CarlosC");

 base\_transform\_class->transform\_ip = GST\_DEBUG\_FUNCPTR(gst\_my\_rtp\_hdr\_ext\_transform\_ip);

 // Add pad templates
 gst\_element\_class\_add\_pad\_template(element\_class,
 gst\_static\_pad\_template\_get(&sink\_template));
 gst\_element\_class\_add\_pad\_template(element\_class,
 gst\_static\_pad\_template\_get(&src\_template));
}

/\* Initialize the element instance \*/
static void gst\_my\_rtp\_hdr\_ext\_init(GstMyRtpHdrExt \*my\_rtp\_hdr\_ext)
{
 // No initialization needed in this example
}

/\* Implement the in-place transform \*/
static GstFlowReturn gst\_my\_rtp\_hdr\_ext\_transform\_ip(GstBaseTransform \*trans, GstBuffer \*buf)
{
 GstRTPBuffer rtp\_buffer = GST\_RTP\_BUFFER\_INIT;
 guint16 ext\_id = 1; // RTP header extension id, change it according to your use case
 const gchar \*default\_data = "1234567890123456";
 guchar \*data = (guchar \*)default\_data;
 gsize data\_size = strlen(default\_data);

 if (!gst\_rtp\_buffer\_map(buf, GST\_MAP\_READWRITE, &rtp\_buffer))
 {
 GST\_ERROR\_OBJECT(trans, "Failed to map RTP buffer");
 return GST\_FLOW\_ERROR;
 }

 if (!gst\_rtp\_buffer\_add\_extension\_onebyte\_header(&rtp\_buffer, ext\_id, data, data\_size))
 {
 GST\_ERROR\_OBJECT(trans, "Failed to add RTP header extension");
 gst\_rtp\_buffer\_unmap(&rtp\_buffer);
 return GST\_FLOW\_ERROR;
 }

 gst\_rtp\_buffer\_unmap(&rtp\_buffer);
 return GST\_FLOW\_OK;
}

/\* Register the plugin \*/
#define PACKAGE "myrtpheaderextensionplugin"
static gboolean
plugin\_init(GstPlugin \*plugin)
{
 return gst\_element\_register(plugin, "myrtpheaderextension", GST\_RANK\_NONE, GST\_TYPE\_MY\_RTP\_HDR\_EXT);
}

GST\_PLUGIN\_DEFINE(
 GST\_VERSION\_MAJOR,
 GST\_VERSION\_MINOR,
 myrtpheaderextensionplugin,
 "My RTP Header Extension Element",
 plugin\_init,
 "1.0",
 "LGPL",
 "MyGStreamer",
 "http://gstreamer.net/")
it sends rtp header extensions. In this case is a one byte, but this could could be differetnt.
const dgram = require('dgram');

// Create a UDP socket to receive the RTP stream
const socket = dgram.createSocket('udp4');
socket.bind(5004);

// Event handler for when a new message is received
socket.on('message', (msg, rinfo) => {
 // Parse the RTP packet header
 const version = (msg[0] & 0xC0) >> 6;
 const padding = (msg[0] & 0x20) >> 5;
 const extension = (msg[0] & 0x10) >> 4;
 const cc = msg[0] & 0x0F;
 const marker = (msg[1] & 0x80) >> 7;
 const pt = msg[1] & 0x7F;
 const seq = msg.readUInt16BE(2);
 const timestamp = msg.readUInt32BE(4);
 const ssrc = msg.readUInt32BE(8);

 // Log the RTP timestamp
 console.log(`RTP timestamp: ${timestamp}`);

 // Check if the packet contains header extensions
 if (extension === 1) {
 // Extract the extension data
 const extensionLengthFieldOffset = 4 + (cc \* 4); // Offset of the extension length field in the RTP header
 const extensionBitMask = 0x10; // Mask for the extension bit

 if ((msg[0] & extensionBitMask) !== 0) {
 const extensionLengthFieldOffset = 4 + (cc \* 4) + 2; // Offset of the extension length field in the RTP header
 const extensionLength = msg.readUInt8(extensionLengthFieldOffset); // Length of the extension header in bytes
 const extensionData = msg.slice(extensionLengthFieldOffset + 4, extensionLengthFieldOffset + 4 + extensionLength);
 
 console.log(extensionLength)
 // Log the extension data as a string
 console.log(`Extension data: ${extensionData.toString('utf-8')}`);
 }
 }
});

I want a code that parse those rtp packets, and prints each and eveyone of the rtp specficiation fields in that packet. Use node and dgram for instance. No external libraies
user