mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-25 16:48:11 +00:00
gst/gdp/gstgdppay.c: Don't set caps on the buffers that contain a copy of the buffer including the caps of them resul...
Original commit message from CVS: Patch by: Antoine Tremblay <hexa00 at gmail dot com> * gst/gdp/gstgdppay.c: (gst_gdp_pay_reset_streamheader): Don't set caps on the buffers that contain a copy of the buffer including the caps of them resulting in an always increasing refcount of the caps and insanely large caps. Instead include a buffer without caps in the new caps. Fixes bug #536475.
This commit is contained in:
parent
c5520eea2a
commit
ba89323790
1 changed files with 30 additions and 0 deletions
|
@ -86,9 +86,11 @@ GST_BOILERPLATE_FULL (GstGDPPay, gst_gdp_pay, GstElement,
|
||||||
GST_TYPE_ELEMENT, _do_init);
|
GST_TYPE_ELEMENT, _do_init);
|
||||||
|
|
||||||
static void gst_gdp_pay_reset (GstGDPPay * this);
|
static void gst_gdp_pay_reset (GstGDPPay * this);
|
||||||
|
|
||||||
static GstFlowReturn gst_gdp_pay_chain (GstPad * pad, GstBuffer * buffer);
|
static GstFlowReturn gst_gdp_pay_chain (GstPad * pad, GstBuffer * buffer);
|
||||||
|
|
||||||
static gboolean gst_gdp_pay_src_event (GstPad * pad, GstEvent * event);
|
static gboolean gst_gdp_pay_src_event (GstPad * pad, GstEvent * event);
|
||||||
|
|
||||||
static gboolean gst_gdp_pay_sink_event (GstPad * pad, GstEvent * event);
|
static gboolean gst_gdp_pay_sink_event (GstPad * pad, GstEvent * event);
|
||||||
|
|
||||||
static GstStateChangeReturn gst_gdp_pay_change_state (GstElement *
|
static GstStateChangeReturn gst_gdp_pay_change_state (GstElement *
|
||||||
|
@ -118,6 +120,7 @@ static void
|
||||||
gst_gdp_pay_class_init (GstGDPPayClass * klass)
|
gst_gdp_pay_class_init (GstGDPPayClass * klass)
|
||||||
{
|
{
|
||||||
GObjectClass *gobject_class;
|
GObjectClass *gobject_class;
|
||||||
|
|
||||||
GstElementClass *gstelement_class;
|
GstElementClass *gstelement_class;
|
||||||
|
|
||||||
gobject_class = (GObjectClass *) klass;
|
gobject_class = (GObjectClass *) klass;
|
||||||
|
@ -228,8 +231,11 @@ static GstBuffer *
|
||||||
gst_gdp_buffer_from_caps (GstGDPPay * this, GstCaps * caps)
|
gst_gdp_buffer_from_caps (GstGDPPay * this, GstCaps * caps)
|
||||||
{
|
{
|
||||||
GstBuffer *headerbuf;
|
GstBuffer *headerbuf;
|
||||||
|
|
||||||
GstBuffer *payloadbuf;
|
GstBuffer *payloadbuf;
|
||||||
|
|
||||||
guint8 *header, *payload;
|
guint8 *header, *payload;
|
||||||
|
|
||||||
guint len;
|
guint len;
|
||||||
|
|
||||||
if (!this->packetizer->packet_from_caps (caps, this->header_flag, &len,
|
if (!this->packetizer->packet_from_caps (caps, this->header_flag, &len,
|
||||||
|
@ -260,7 +266,9 @@ static GstBuffer *
|
||||||
gst_gdp_pay_buffer_from_buffer (GstGDPPay * this, GstBuffer * buffer)
|
gst_gdp_pay_buffer_from_buffer (GstGDPPay * this, GstBuffer * buffer)
|
||||||
{
|
{
|
||||||
GstBuffer *headerbuf;
|
GstBuffer *headerbuf;
|
||||||
|
|
||||||
guint8 *header;
|
guint8 *header;
|
||||||
|
|
||||||
guint len;
|
guint len;
|
||||||
|
|
||||||
if (!this->packetizer->header_from_buffer (buffer, this->header_flag, &len,
|
if (!this->packetizer->header_from_buffer (buffer, this->header_flag, &len,
|
||||||
|
@ -289,9 +297,13 @@ static GstBuffer *
|
||||||
gst_gdp_buffer_from_event (GstGDPPay * this, GstEvent * event)
|
gst_gdp_buffer_from_event (GstGDPPay * this, GstEvent * event)
|
||||||
{
|
{
|
||||||
GstBuffer *headerbuf;
|
GstBuffer *headerbuf;
|
||||||
|
|
||||||
GstBuffer *payloadbuf;
|
GstBuffer *payloadbuf;
|
||||||
|
|
||||||
guint8 *header, *payload;
|
guint8 *header, *payload;
|
||||||
|
|
||||||
guint len;
|
guint len;
|
||||||
|
|
||||||
gboolean ret;
|
gboolean ret;
|
||||||
|
|
||||||
ret =
|
ret =
|
||||||
|
@ -331,8 +343,11 @@ gst_gdp_pay_reset_streamheader (GstGDPPay * this)
|
||||||
|
|
||||||
/* We use copies of these to avoid circular refcounts */
|
/* We use copies of these to avoid circular refcounts */
|
||||||
GstBuffer *new_segment_buf, *caps_buf, *tag_buf;
|
GstBuffer *new_segment_buf, *caps_buf, *tag_buf;
|
||||||
|
|
||||||
GstStructure *structure;
|
GstStructure *structure;
|
||||||
|
|
||||||
GstFlowReturn r = GST_FLOW_OK;
|
GstFlowReturn r = GST_FLOW_OK;
|
||||||
|
|
||||||
gboolean version_one_zero = TRUE;
|
gboolean version_one_zero = TRUE;
|
||||||
|
|
||||||
GValue array = { 0 };
|
GValue array = { 0 };
|
||||||
|
@ -365,6 +380,7 @@ gst_gdp_pay_reset_streamheader (GstGDPPay * this)
|
||||||
GST_DEBUG_OBJECT (this, "1.0, appending copy of new segment buffer %p",
|
GST_DEBUG_OBJECT (this, "1.0, appending copy of new segment buffer %p",
|
||||||
this->new_segment_buf);
|
this->new_segment_buf);
|
||||||
new_segment_buf = gst_buffer_copy (this->new_segment_buf);
|
new_segment_buf = gst_buffer_copy (this->new_segment_buf);
|
||||||
|
gst_buffer_set_caps (new_segment_buf, NULL);
|
||||||
g_value_init (&value, GST_TYPE_BUFFER);
|
g_value_init (&value, GST_TYPE_BUFFER);
|
||||||
gst_value_set_buffer (&value, new_segment_buf);
|
gst_value_set_buffer (&value, new_segment_buf);
|
||||||
gst_value_array_append_value (&array, &value);
|
gst_value_array_append_value (&array, &value);
|
||||||
|
@ -376,6 +392,7 @@ gst_gdp_pay_reset_streamheader (GstGDPPay * this)
|
||||||
GST_DEBUG_OBJECT (this, "1.0, appending copy of tag buffer %p",
|
GST_DEBUG_OBJECT (this, "1.0, appending copy of tag buffer %p",
|
||||||
this->tag_buf);
|
this->tag_buf);
|
||||||
tag_buf = gst_buffer_copy (this->tag_buf);
|
tag_buf = gst_buffer_copy (this->tag_buf);
|
||||||
|
gst_buffer_set_caps (tag_buf, NULL);
|
||||||
g_value_init (&value, GST_TYPE_BUFFER);
|
g_value_init (&value, GST_TYPE_BUFFER);
|
||||||
gst_value_set_buffer (&value, tag_buf);
|
gst_value_set_buffer (&value, tag_buf);
|
||||||
gst_value_array_append_value (&array, &value);
|
gst_value_array_append_value (&array, &value);
|
||||||
|
@ -387,6 +404,7 @@ gst_gdp_pay_reset_streamheader (GstGDPPay * this)
|
||||||
gst_gdp_stamp_buffer (this, this->caps_buf);
|
gst_gdp_stamp_buffer (this, this->caps_buf);
|
||||||
GST_DEBUG_OBJECT (this, "appending copy of caps buffer %p", this->caps_buf);
|
GST_DEBUG_OBJECT (this, "appending copy of caps buffer %p", this->caps_buf);
|
||||||
caps_buf = gst_buffer_copy (this->caps_buf);
|
caps_buf = gst_buffer_copy (this->caps_buf);
|
||||||
|
gst_buffer_set_caps (caps_buf, NULL);
|
||||||
g_value_init (&value, GST_TYPE_BUFFER);
|
g_value_init (&value, GST_TYPE_BUFFER);
|
||||||
gst_value_set_buffer (&value, caps_buf);
|
gst_value_set_buffer (&value, caps_buf);
|
||||||
gst_value_array_append_value (&array, &value);
|
gst_value_array_append_value (&array, &value);
|
||||||
|
@ -398,8 +416,11 @@ gst_gdp_pay_reset_streamheader (GstGDPPay * this)
|
||||||
structure = gst_caps_get_structure (this->caps, 0);
|
structure = gst_caps_get_structure (this->caps, 0);
|
||||||
if (gst_structure_has_field (structure, "streamheader")) {
|
if (gst_structure_has_field (structure, "streamheader")) {
|
||||||
const GValue *sh;
|
const GValue *sh;
|
||||||
|
|
||||||
GArray *buffers;
|
GArray *buffers;
|
||||||
|
|
||||||
GstBuffer *buffer;
|
GstBuffer *buffer;
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
sh = gst_structure_get_value (structure, "streamheader");
|
sh = gst_structure_get_value (structure, "streamheader");
|
||||||
|
@ -409,6 +430,7 @@ gst_gdp_pay_reset_streamheader (GstGDPPay * this)
|
||||||
buffers->len);
|
buffers->len);
|
||||||
for (i = 0; i < buffers->len; ++i) {
|
for (i = 0; i < buffers->len; ++i) {
|
||||||
GValue *bufval;
|
GValue *bufval;
|
||||||
|
|
||||||
GstBuffer *outbuffer;
|
GstBuffer *outbuffer;
|
||||||
|
|
||||||
bufval = &g_array_index (buffers, GValue, i);
|
bufval = &g_array_index (buffers, GValue, i);
|
||||||
|
@ -540,8 +562,11 @@ static GstFlowReturn
|
||||||
gst_gdp_pay_chain (GstPad * pad, GstBuffer * buffer)
|
gst_gdp_pay_chain (GstPad * pad, GstBuffer * buffer)
|
||||||
{
|
{
|
||||||
GstGDPPay *this;
|
GstGDPPay *this;
|
||||||
|
|
||||||
GstCaps *caps;
|
GstCaps *caps;
|
||||||
|
|
||||||
GstBuffer *outbuffer;
|
GstBuffer *outbuffer;
|
||||||
|
|
||||||
GstFlowReturn ret;
|
GstFlowReturn ret;
|
||||||
|
|
||||||
this = GST_GDP_PAY (gst_pad_get_parent (pad));
|
this = GST_GDP_PAY (gst_pad_get_parent (pad));
|
||||||
|
@ -656,8 +681,11 @@ static gboolean
|
||||||
gst_gdp_pay_sink_event (GstPad * pad, GstEvent * event)
|
gst_gdp_pay_sink_event (GstPad * pad, GstEvent * event)
|
||||||
{
|
{
|
||||||
GstBuffer *outbuffer;
|
GstBuffer *outbuffer;
|
||||||
|
|
||||||
GstGDPPay *this = GST_GDP_PAY (gst_pad_get_parent (pad));
|
GstGDPPay *this = GST_GDP_PAY (gst_pad_get_parent (pad));
|
||||||
|
|
||||||
GstFlowReturn flowret;
|
GstFlowReturn flowret;
|
||||||
|
|
||||||
gboolean ret = TRUE;
|
gboolean ret = TRUE;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (this, "received event %p of type %s (%d)",
|
GST_DEBUG_OBJECT (this, "received event %p of type %s (%d)",
|
||||||
|
@ -739,6 +767,7 @@ static gboolean
|
||||||
gst_gdp_pay_src_event (GstPad * pad, GstEvent * event)
|
gst_gdp_pay_src_event (GstPad * pad, GstEvent * event)
|
||||||
{
|
{
|
||||||
GstGDPPay *this;
|
GstGDPPay *this;
|
||||||
|
|
||||||
gboolean res = TRUE;
|
gboolean res = TRUE;
|
||||||
|
|
||||||
this = GST_GDP_PAY (gst_pad_get_parent (pad));
|
this = GST_GDP_PAY (gst_pad_get_parent (pad));
|
||||||
|
@ -819,6 +848,7 @@ static GstStateChangeReturn
|
||||||
gst_gdp_pay_change_state (GstElement * element, GstStateChange transition)
|
gst_gdp_pay_change_state (GstElement * element, GstStateChange transition)
|
||||||
{
|
{
|
||||||
GstStateChangeReturn ret;
|
GstStateChangeReturn ret;
|
||||||
|
|
||||||
GstGDPPay *this = GST_GDP_PAY (element);
|
GstGDPPay *this = GST_GDP_PAY (element);
|
||||||
|
|
||||||
switch (transition) {
|
switch (transition) {
|
||||||
|
|
Loading…
Reference in a new issue