[FFmpeg-devel] [PATCH v5 04/10] cbs_h2645: refact, allow INVALID_OFFSET for id_offset and active_offset
Nuo Mi
nuomi2021 at gmail.com
Thu Feb 11 16:36:05 EET 2021
---
libavcodec/cbs_h2645.c | 22 +++++++++++++---------
1 file changed, 13 insertions(+), 9 deletions(-)
diff --git a/libavcodec/cbs_h2645.c b/libavcodec/cbs_h2645.c
index 36212d1da6..fdc527f8e8 100644
--- a/libavcodec/cbs_h2645.c
+++ b/libavcodec/cbs_h2645.c
@@ -664,6 +664,7 @@ static int cbs_h2645_split_fragment(CodedBitstreamContext *ctx,
static int cbs_h2645_replace_ps(CodedBitstreamContext *ctx,
CodedBitstreamUnit *unit)
{
+ static const size_t INVALID_OFFSET = (size_t)-1;
typedef struct {
int nal_unit_type;
int max_count;
@@ -728,8 +729,8 @@ static int cbs_h2645_replace_ps(CodedBitstreamContext *ctx,
const PSType *ps_type;
AVBufferRef **ref_array;
void **ptr_array;
- void **active;
- int err, id, i, nb_ps_types;
+ void **active = NULL;
+ int err, id = 0, i, nb_ps_types;
switch (ctx->codec->codec_id) {
case AV_CODEC_ID_H264:
@@ -751,12 +752,14 @@ static int cbs_h2645_replace_ps(CodedBitstreamContext *ctx,
}
av_assert0(i < nb_ps_types);
- id = *((uint8_t*)unit->content + ps_type->id_offset);
+ if (ps_type->id_offset != INVALID_OFFSET) {
+ id = *((uint8_t*)unit->content + ps_type->id_offset);
- if (id >= ps_type->max_count) {
- av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid %s id: %d.\n",
- ps_type->name, id);
- return AVERROR_INVALIDDATA;
+ if (id >= ps_type->max_count) {
+ av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid %s id: %d.\n",
+ ps_type->name, id);
+ return AVERROR_INVALIDDATA;
+ }
}
err = ff_cbs_make_unit_refcounted(ctx, unit);
@@ -766,9 +769,10 @@ static int cbs_h2645_replace_ps(CodedBitstreamContext *ctx,
ref_array =
(AVBufferRef**)((uint8_t*)ctx->priv_data + ps_type->ref_array_offset);
ptr_array = (void**)((uint8_t*)ctx->priv_data + ps_type->ptr_array_offset);
- active = (void**)((uint8_t*)ctx->priv_data + ps_type->active_offset);
+ if (ps_type->active_offset != INVALID_OFFSET)
+ active = (void**)((uint8_t*)ctx->priv_data + ps_type->active_offset);
- if (ptr_array[id] == *active) {
+ if (active && ptr_array[id] == *active) {
// The old active parameter set is being overwritten, so it can't
// be active after this point.
*active = NULL;
--
2.25.1
More information about the ffmpeg-devel
mailing list