[FFmpeg-devel] [PATCH v2 11/13] cbs_mpeg2.c: improve readability of start code search (part 1)

Scott Theisen scott.the.elm at gmail.com
Thu Feb 3 20:44:48 EET 2022


ff_cbs_insert_unit_data() does not modify the data or data_size fields of
the CodedBitstreamFragment.  It also does not modify the value pointed to
by start.  (We don't need that byte in this function anymore, anyway.)
---
 libavcodec/cbs_mpeg2.c | 26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/libavcodec/cbs_mpeg2.c b/libavcodec/cbs_mpeg2.c
index afe78eef9a..f2efedde5d 100644
--- a/libavcodec/cbs_mpeg2.c
+++ b/libavcodec/cbs_mpeg2.c
@@ -144,23 +144,24 @@ static int cbs_mpeg2_split_fragment(CodedBitstreamContext *ctx,
                                     CodedBitstreamFragment *frag,
                                     int header)
 {
-    const uint8_t *start, *end;
+    const uint8_t *start = frag->data, *end;
+    const uint8_t * const buf_end = frag->data + frag->data_size;
     CodedBitstreamUnitType unit_type;
     uint32_t start_code = -1;
     size_t unit_size;
-    int err, i = 0, final = 0;
+    int err, final = 0;
+    int i = -1; // offset for pre-increment
 
-    start = avpriv_find_start_code(frag->data, frag->data + frag->data_size,
-                                   &start_code, 1);
+    start = avpriv_find_start_code(start, buf_end, &start_code, 1);
     if (!avpriv_start_code_is_valid(start_code)) {
         // No start code found.
         return AVERROR_INVALIDDATA;
     }
 
-    while (!final) {
+    do {
         unit_type = start_code & 0xff;
 
-        if (start == frag->data + frag->data_size) {
+        if (start == buf_end) {
             // The last four bytes form a start code which constitutes
             // a unit of its own.  In this situation avpriv_find_start_code
             // won't modify start_code at all so modify start_code so that
@@ -168,10 +169,9 @@ static int cbs_mpeg2_split_fragment(CodedBitstreamContext *ctx,
             start_code = 0;
         }
 
-        end = avpriv_find_start_code(start--, frag->data + frag->data_size,
-                                     &start_code, 0);
-
-        // start points to the byte containing the start_code_identifier
+        end = avpriv_find_start_code(start, buf_end, &start_code, 0);
+        start--;
+        // decrement so start points to the byte containing the start_code_identifier
         // (may be the last byte of fragment->data); end points to the byte
         // following the byte containing the start code identifier (or to
         // the end of fragment->data).
@@ -185,14 +185,14 @@ static int cbs_mpeg2_split_fragment(CodedBitstreamContext *ctx,
            final     = 1;
         }
 
-        err = ff_cbs_insert_unit_data(frag, i, unit_type, (uint8_t*)start,
+        err = ff_cbs_insert_unit_data(frag, ++i, unit_type,
+                                      (uint8_t*)start /* cast away the const to match parameter type */,
                                       unit_size, frag->data_ref);
         if (err < 0)
             return err;
 
         start = end;
-        i++;
-    }
+    } while (!final);
 
     return 0;
 }
-- 
2.32.0



More information about the ffmpeg-devel mailing list