[FFmpeg-cvslog] avformat/mpegts: delay allocation of PES buffer
Marton Balint
git at videolan.org
Sun Oct 10 18:04:31 EEST 2021
ffmpeg | branch: master | Marton Balint <cus at passwd.hu> | Tue Sep 21 06:02:21 2021 +0200| [65cd43cff32a711a8380c059f153b5d64deec85e] | committer: Marton Balint
avformat/mpegts: delay allocation of PES buffer
This allows us to allocate the buffer in a single code path.
Signed-off-by: Marton Balint <cus at passwd.hu>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=65cd43cff32a711a8380c059f153b5d64deec85e
---
libavformat/mpegts.c | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
index 9aad720edd..6120f273d2 100644
--- a/libavformat/mpegts.c
+++ b/libavformat/mpegts.c
@@ -1189,11 +1189,6 @@ static int mpegts_push_data(MpegTSFilter *filter,
if (!pes->total_size)
pes->total_size = MAX_PES_PAYLOAD;
- /* allocate pes buffer */
- pes->buffer = buffer_pool_get(ts, pes->total_size);
- if (!pes->buffer)
- return AVERROR(ENOMEM);
-
if (pes->stream_id != STREAM_ID_PROGRAM_STREAM_MAP &&
pes->stream_id != STREAM_ID_PRIVATE_STREAM_2 &&
pes->stream_id != STREAM_ID_ECM_STREAM &&
@@ -1364,16 +1359,13 @@ skip:
}
break;
case MPEGTS_PAYLOAD:
- if (pes->buffer) {
+ do {
if (pes->data_index > 0 &&
pes->data_index + buf_size > pes->total_size) {
ret = new_pes_packet(pes, ts->pkt);
if (ret < 0)
return ret;
pes->total_size = MAX_PES_PAYLOAD;
- pes->buffer = buffer_pool_get(ts, pes->total_size);
- if (!pes->buffer)
- return AVERROR(ENOMEM);
ts->stop_parse = 1;
} else if (pes->data_index == 0 &&
buf_size > pes->total_size) {
@@ -1381,6 +1373,13 @@ skip:
// not sure if this is legal in ts but see issue #2392
buf_size = pes->total_size;
}
+
+ if (!pes->buffer) {
+ pes->buffer = buffer_pool_get(ts, pes->total_size);
+ if (!pes->buffer)
+ return AVERROR(ENOMEM);
+ }
+
memcpy(pes->buffer->data + pes->data_index, p, buf_size);
pes->data_index += buf_size;
/* emit complete packets with known packet size
@@ -1392,10 +1391,11 @@ skip:
pes->pes_header_size + pes->data_index == pes->total_size + PES_START_SIZE) {
ts->stop_parse = 1;
ret = new_pes_packet(pes, ts->pkt);
+ pes->state = MPEGTS_SKIP;
if (ret < 0)
return ret;
}
- }
+ } while (0);
buf_size = 0;
break;
case MPEGTS_SKIP:
More information about the ffmpeg-cvslog
mailing list