@@ -78,8 +78,7 @@ static void pic_arrays_free(HEVCContext *s)
av_freep(&s->vertical_bs);
av_freep(&s->sh.entry_point_offset);
- av_freep(&s->sh.size);
- av_freep(&s->sh.offset);
+ av_freep(&s->sh.entry_points);
av_buffer_pool_uninit(&s->tab_mvf_pool);
av_buffer_pool_uninit(&s->rpl_tab_pool);
@@ -915,12 +914,10 @@ static int hls_slice_header(HEVCContext *s)
}
av_freep(&sh->entry_point_offset);
- av_freep(&sh->offset);
- av_freep(&sh->size);
+ av_freep(&sh->entry_points);
sh->entry_point_offset = av_malloc_array(sh->num_entry_point_offsets, sizeof(unsigned));
- sh->offset = av_malloc_array(sh->num_entry_point_offsets, sizeof(int));
- sh->size = av_malloc_array(sh->num_entry_point_offsets, sizeof(int));
- if (!sh->entry_point_offset || !sh->offset || !sh->size) {
+ FF_ALLOC_TYPED_ARRAY(sh->entry_points, sh->num_entry_point_offsets);
+ if (!sh->entry_point_offset || !sh->entry_points) {
sh->num_entry_point_offsets = 0;
av_log(s->avctx, AV_LOG_ERROR, "Failed to allocate memory\n");
return AVERROR(ENOMEM);
@@ -2552,10 +2549,11 @@ static int hls_decode_entry_wpp(AVCodecContext *avctxt, void *input_ctb_row, int
lc = s->HEVClc;
if(ctb_row) {
- ret = init_get_bits8(&lc->gb, s->data + s->sh.offset[ctb_row - 1], s->sh.size[ctb_row - 1]);
+ const EntryPoint *const entry_point = &s->sh.entry_points[ctb_row - 1];
+ ret = init_get_bits8(&lc->gb, s->data + entry_point->offset, entry_point->size);
if (ret < 0)
goto error;
- ff_init_cabac_decoder(&lc->cc, s->data + s->sh.offset[(ctb_row)-1], s->sh.size[ctb_row - 1]);
+ ff_init_cabac_decoder(&lc->cc, s->data + entry_point->offset, entry_point->size);
}
while(more_data && ctb_addr_ts < s->ps.sps->ctb_size) {
@@ -2675,9 +2673,10 @@ static int hls_slice_data_wpp(HEVCContext *s, const H2645NAL *nal)
cmpt++;
}
}
- s->sh.size[i - 1] = s->sh.entry_point_offset[i] - cmpt;
- s->sh.offset[i - 1] = offset;
-
+ s->sh.entry_points[i - 1] = (EntryPoint){
+ .size = s->sh.entry_point_offset[i] - cmpt,
+ .offset = offset
+ };
}
if (s->sh.num_entry_point_offsets != 0) {
offset += s->sh.entry_point_offset[s->sh.num_entry_point_offsets - 1] - cmpt;
@@ -2686,9 +2685,8 @@ static int hls_slice_data_wpp(HEVCContext *s, const H2645NAL *nal)
res = AVERROR_INVALIDDATA;
goto error;
}
- s->sh.size[s->sh.num_entry_point_offsets - 1] = length - offset;
- s->sh.offset[s->sh.num_entry_point_offsets - 1] = offset;
-
+ s->sh.entry_points[s->sh.num_entry_point_offsets - 1] =
+ (EntryPoint){ .size = length - offset, .offset = offset };
}
s->data = data;
@@ -246,6 +246,11 @@ typedef struct RefPicListTab {
RefPicList refPicList[2];
} RefPicListTab;
+typedef struct EntryPoint {
+ int offset;
+ int size;
+} EntryPoint;
+
typedef struct SliceHeader {
unsigned int pps_id;
@@ -300,8 +305,7 @@ typedef struct SliceHeader {
unsigned int max_num_merge_cand; ///< 5 - 5_minus_max_num_merge_cand
unsigned *entry_point_offset;
- int * offset;
- int * size;
+ EntryPoint *entry_points;
int num_entry_point_offsets;
int8_t slice_qp;
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> --- libavcodec/hevcdec.c | 28 +++++++++++++--------------- libavcodec/hevcdec.h | 8 ++++++-- 2 files changed, 19 insertions(+), 17 deletions(-)