[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