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

Andreas Rheinhardt andreas.rheinhardt at outlook.com
Sat Feb 5 04:16:18 EET 2022


Scott Theisen:
> 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

Using a pre-increment is unnatural (i is supposed to be the number of
units of the fragment and so it should naturally be incremented after a
unit has been successfully added to the fragment) and impairs clarity.

>  
> -    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 */,

redundant comment

>                                        unit_size, frag->data_ref);
>          if (err < 0)
>              return err;
>  
>          start = end;
> -        i++;
> -    }
> +    } while (!final);
>  
>      return 0;
>  }



More information about the ffmpeg-devel mailing list