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/5516>
This commit is contained in:
Jan Alexander Steffens (heftig) 2023-10-17 00:54:38 +02:00 committed by GStreamer Marge Bot
parent 6198c4b8a1
commit c205086f2b

View file

@ -834,9 +834,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;
} }
@ -863,19 +864,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;
} }
} }
@ -887,6 +888,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;
} }
@ -1523,6 +1525,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 %"
@ -1538,14 +1541,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;
} }
@ -1559,7 +1559,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);
@ -1569,11 +1568,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);
@ -1581,6 +1577,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;
} }