The H.264 parser currently allocates a buffer of the size of the input
frame for every input frame to store the unescaped RBSP of a NAL unit
(it is actually only used if a 0x03 escape is encountered at all).
For performance reasons only a small part of slices is actually
unescaped; and given that an unescaped NAL unit is only used once (if
ever), the really needed size of the buffer is the maximum of the
possible length of a NAL unit in front of the first slice and the length of
the part of the first slice that is actually unescaped.
For AVC (mp4/Matroska) content, the length of a NAL unit is known, so
that if the NAL units in front of the slices are small (as they usually
are), said maximum is small so that one can reduce memory usage by
allocating less.
For Annex B, this is unfortunately not so, because the code has to
assume the worst wrt the NAL unit sizes (it even assumes that an
access unit delimiter extends until the end of the input buffer).

Signed-off-by: Andreas Rheinhardt <andreas.rheinha...@gmail.com>
---
 libavcodec/h264_parser.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/libavcodec/h264_parser.c b/libavcodec/h264_parser.c
index c200a2ab8e..5f7aea0c76 100644
--- a/libavcodec/h264_parser.c
+++ b/libavcodec/h264_parser.c
@@ -268,11 +268,6 @@ static inline int parse_nal_units(AVCodecParserContext *s,
     if (!buf_size)
         return 0;
 
-    av_fast_padded_malloc(&rbsp->rbsp_buffer, &rbsp->rbsp_buffer_alloc_size, 
buf_size);
-    if (!rbsp->rbsp_buffer)
-        return AVERROR(ENOMEM);
-    rbsp->rbsp_buffer_size = 0;
-
     buf_index     = 0;
     next_avc      = p->is_avc ? 0 : buf_size;
     for (;;) {
@@ -310,6 +305,12 @@ static inline int parse_nal_units(AVCodecParserContext *s,
             }
             break;
         }
+
+    av_fast_padded_malloc(&rbsp->rbsp_buffer, &rbsp->rbsp_buffer_alloc_size, 
src_length);
+    if (!rbsp->rbsp_buffer)
+        return AVERROR(ENOMEM);
+    rbsp->rbsp_buffer_size = 0;
+
         consumed = ff_h2645_extract_rbsp(buf + buf_index, src_length, rbsp, 
&nal, 1);
         if (consumed < 0)
             break;
-- 
2.21.0

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to