[libav-devel] [PATCH 10/14] cbs: Fragment/unit data is always reference counted

Alexandra Hájková alexandra.khirnova at gmail.com
Mon May 13 10:54:52 CEST 2019


On Sat, May 4, 2019 at 2:15 PM Luca Barbato <lu_zero at gentoo.org> wrote:
>
> From: Mark Thompson <sw at jkqxz.net>
>
> Make this clear in the documentation and add some asserts to ensure
> that it is always true.
> ---
>  libavcodec/cbs.c | 19 ++++++++++++-------
>  libavcodec/cbs.h | 10 ++++++----
>  2 files changed, 18 insertions(+), 11 deletions(-)
>
> diff --git a/libavcodec/cbs.c b/libavcodec/cbs.c
> index dc8d94eedc..907471956b 100644
> --- a/libavcodec/cbs.c
> +++ b/libavcodec/cbs.c
> @@ -140,26 +140,30 @@ static int cbs_read_fragment_content(CodedBitstreamContext *ctx,
>      int err, i, j;
>
>      for (i = 0; i < frag->nb_units; i++) {
> +        CodedBitstreamUnit *unit = &frag->units[i];
> +
>          if (ctx->decompose_unit_types) {
>              for (j = 0; j < ctx->nb_decompose_unit_types; j++) {
> -                if (ctx->decompose_unit_types[j] == frag->units[i].type)
> +                if (ctx->decompose_unit_types[j] == unit->type)
>                      break;
>              }
>              if (j >= ctx->nb_decompose_unit_types)
>                  continue;
>          }
>
> -        av_buffer_unref(&frag->units[i].content_ref);
> -        frag->units[i].content = NULL;
> +        av_buffer_unref(&unit->content_ref);
> +        unit->content = NULL;
> +
> +        av_assert0(unit->data && unit->data_ref);
>
> -        err = ctx->codec->read_unit(ctx, &frag->units[i]);
> +        err = ctx->codec->read_unit(ctx, unit);
>          if (err == AVERROR(ENOSYS)) {
>              av_log(ctx->log_ctx, AV_LOG_VERBOSE,
>                     "Decomposition unimplemented for unit %d "
> -                   "(type %"PRIu32").\n", i, frag->units[i].type);
> +                   "(type %"PRIu32").\n", i, unit->type);
>          } else if (err < 0) {
>              av_log(ctx->log_ctx, AV_LOG_ERROR, "Failed to read unit %d "
> -                   "(type %"PRIu32").\n", i, frag->units[i].type);
> +                   "(type %"PRIu32").\n", i, unit->type);
>              return err;
>          }
>      }
> @@ -278,6 +282,7 @@ int ff_cbs_write_fragment_data(CodedBitstreamContext *ctx,
>                     "(type %"PRIu32").\n", i, unit->type);
>              return err;
>          }
> +        av_assert0(unit->data && unit->data_ref);
>      }
>
>      av_buffer_unref(&frag->data_ref);
> @@ -288,6 +293,7 @@ int ff_cbs_write_fragment_data(CodedBitstreamContext *ctx,
>          av_log(ctx->log_ctx, AV_LOG_ERROR, "Failed to assemble fragment.\n");
>          return err;
>      }
> +    av_assert0(frag->data && frag->data_ref);
>
>      return 0;
>  }
> @@ -328,7 +334,6 @@ int ff_cbs_write_packet(CodedBitstreamContext *ctx,
>      if (err < 0)
>          return err;
>
> -    av_assert0(frag->data_ref);
>      buf = av_buffer_ref(frag->data_ref);
>      if (!buf)
>          return AVERROR(ENOMEM);
> diff --git a/libavcodec/cbs.h b/libavcodec/cbs.h
> index 1f26be7b36..c38edc539a 100644
> --- a/libavcodec/cbs.h
> +++ b/libavcodec/cbs.h
> @@ -84,8 +84,9 @@ typedef struct CodedBitstreamUnit {
>       */
>      size_t   data_bit_padding;
>      /**
> -     * If data is reference counted, a reference to the buffer containing
> -     * data.  Null if data is not reference counted.
> +     * A reference to the buffer containing data.
> +     *
> +     * Must be set if data is not NULL.
>       */
>      AVBufferRef *data_ref;
>
> @@ -130,8 +131,9 @@ typedef struct CodedBitstreamFragment {
>       */
>      size_t data_bit_padding;
>      /**
> -     * If data is reference counted, a reference to the buffer containing
> -     * data.  Null if data is not reference counted.
> +     * A reference to the buffer containing data.
> +     *
> +     * Must be set if data is not NULL.
>       */
>      AVBufferRef *data_ref;
>
> --
> 2.12.2
>
> _______________________________________________
> libav-devel mailing list
> libav-devel at libav.org
> https://lists.libav.org/mailman/listinfo/libav-devel

OK


More information about the libav-devel mailing list