tsmux: tsmux_packet_out should always consume its buffer
Consuming the buffer only when successful is an antipattern and easily leads to leaks. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5496>
This commit is contained in:
parent
55658ad166
commit
950789f61b
@ -841,9 +841,10 @@ tsmux_get_buffer (TsMux * mux, GstBuffer ** buf)
|
|||||||
static gboolean
|
static gboolean
|
||||||
tsmux_packet_out (TsMux * mux, GstBuffer * buf, gint64 pcr)
|
tsmux_packet_out (TsMux * mux, GstBuffer * buf, gint64 pcr)
|
||||||
{
|
{
|
||||||
|
g_return_val_if_fail (buf, FALSE);
|
||||||
|
|
||||||
if (G_UNLIKELY (mux->write_func == NULL)) {
|
if (G_UNLIKELY (mux->write_func == NULL)) {
|
||||||
if (buf)
|
gst_buffer_unref (buf);
|
||||||
gst_buffer_unref (buf);
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -870,19 +871,19 @@ tsmux_packet_out (TsMux * mux, GstBuffer * buf, gint64 pcr)
|
|||||||
new_pcr = write_new_pcr (mux, stream, cur_pcr, next_pcr);
|
new_pcr = write_new_pcr (mux, stream, cur_pcr, next_pcr);
|
||||||
|
|
||||||
if (new_pcr != -1) {
|
if (new_pcr != -1) {
|
||||||
GstBuffer *buf = NULL;
|
GstBuffer *pcr_buf = NULL;
|
||||||
GstMapInfo map;
|
GstMapInfo map;
|
||||||
|
|
||||||
if (!tsmux_get_buffer (mux, &buf)) {
|
if (!tsmux_get_buffer (mux, &pcr_buf)) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_buffer_map (buf, &map, GST_MAP_WRITE);
|
gst_buffer_map (pcr_buf, &map, GST_MAP_WRITE);
|
||||||
tsmux_write_ts_header (mux, map.data, &stream->pi, 0, NULL, NULL);
|
tsmux_write_ts_header (mux, map.data, &stream->pi, 0, NULL, NULL);
|
||||||
gst_buffer_unmap (buf, &map);
|
gst_buffer_unmap (pcr_buf, &map);
|
||||||
|
|
||||||
stream->pi.flags &= TSMUX_PACKET_FLAG_PES_FULL_HEADER;
|
stream->pi.flags &= TSMUX_PACKET_FLAG_PES_FULL_HEADER;
|
||||||
if (!tsmux_packet_out (mux, buf, new_pcr))
|
if (!tsmux_packet_out (mux, pcr_buf, new_pcr))
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -894,6 +895,7 @@ tsmux_packet_out (TsMux * mux, GstBuffer * buf, gint64 pcr)
|
|||||||
return mux->write_func (buf, mux->write_func_data, pcr);
|
return mux->write_func (buf, mux->write_func_data, pcr);
|
||||||
|
|
||||||
error:
|
error:
|
||||||
|
gst_buffer_unref (buf);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1530,6 +1532,7 @@ pad_stream (TsMux * mux, TsMuxStream * stream, gint64 cur_ts)
|
|||||||
if (diff == 0)
|
if (diff == 0)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
|
ret = FALSE;
|
||||||
start_n_bytes = mux->n_bytes;
|
start_n_bytes = mux->n_bytes;
|
||||||
do {
|
do {
|
||||||
GST_LOG ("Transport stream bitrate: %" G_GUINT64_FORMAT " over %"
|
GST_LOG ("Transport stream bitrate: %" G_GUINT64_FORMAT " over %"
|
||||||
@ -1545,14 +1548,11 @@ pad_stream (TsMux * mux, TsMuxStream * stream, gint64 cur_ts)
|
|||||||
if (bitrate <= mux->bitrate) {
|
if (bitrate <= mux->bitrate) {
|
||||||
gint64 new_pcr;
|
gint64 new_pcr;
|
||||||
|
|
||||||
if (!tsmux_get_buffer (mux, &buf)) {
|
if (!tsmux_get_buffer (mux, &buf))
|
||||||
ret = FALSE;
|
|
||||||
goto done;
|
goto done;
|
||||||
}
|
|
||||||
|
|
||||||
if (!gst_buffer_map (buf, &map, GST_MAP_WRITE)) {
|
if (!gst_buffer_map (buf, &map, GST_MAP_WRITE)) {
|
||||||
gst_buffer_unref (buf);
|
gst_buffer_unref (buf);
|
||||||
ret = FALSE;
|
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1566,7 +1566,6 @@ pad_stream (TsMux * mux, TsMuxStream * stream, gint64 cur_ts)
|
|||||||
if (!rewrite_si (mux, cur_ts)) {
|
if (!rewrite_si (mux, cur_ts)) {
|
||||||
gst_buffer_unmap (buf, &map);
|
gst_buffer_unmap (buf, &map);
|
||||||
gst_buffer_unref (buf);
|
gst_buffer_unref (buf);
|
||||||
ret = FALSE;
|
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
tsmux_write_null_ts_header (map.data);
|
tsmux_write_null_ts_header (map.data);
|
||||||
@ -1576,11 +1575,8 @@ pad_stream (TsMux * mux, TsMuxStream * stream, gint64 cur_ts)
|
|||||||
gst_buffer_unmap (buf, &map);
|
gst_buffer_unmap (buf, &map);
|
||||||
|
|
||||||
stream->pi.flags &= TSMUX_PACKET_FLAG_PES_FULL_HEADER;
|
stream->pi.flags &= TSMUX_PACKET_FLAG_PES_FULL_HEADER;
|
||||||
ret = tsmux_packet_out (mux, buf, new_pcr);
|
if (!tsmux_packet_out (mux, buf, new_pcr))
|
||||||
if (!ret) {
|
|
||||||
gst_buffer_unref (buf);
|
|
||||||
goto done;
|
goto done;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} while (bitrate < mux->bitrate);
|
} while (bitrate < mux->bitrate);
|
||||||
|
|
||||||
@ -1588,6 +1584,8 @@ pad_stream (TsMux * mux, TsMuxStream * stream, gint64 cur_ts)
|
|||||||
GST_LOG ("Finished padding the mux");
|
GST_LOG ("Finished padding the mux");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = TRUE;
|
||||||
|
|
||||||
done:
|
done:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user