@@ -2543,22 +2543,20 @@ static int hls_slice_data(HEVCContext *s)
s->avctx->execute(s->avctx, hls_decode_entry, arg, ret , 1, sizeof(int));
return ret[0];
}
-static int hls_decode_entry_wpp(AVCodecContext *avctxt, void *input_ctb_row, int job, int self_id)
+static int hls_decode_entry_wpp(AVCodecContext *avctxt, void *hevc_lclist,
+ int job, int self_id)
{
- HEVCContext *s1 = avctxt->priv_data, *s;
- HEVCLocalContext *lc;
+ HEVCLocalContext *lc = ((HEVCLocalContext**)hevc_lclist)[self_id];
+ const HEVCContext *const s = lc->parent;
+ HEVCContext *s1 = avctxt->priv_data;
int ctb_size = 1<< s1->ps.sps->log2_ctb_size;
int more_data = 1;
- int *ctb_row_p = input_ctb_row;
- int ctb_row = ctb_row_p[job];
+ int ctb_row = job;
int ctb_addr_rs = s1->sh.slice_ctb_addr_rs + ctb_row * ((s1->ps.sps->width + ctb_size - 1) >> s1->ps.sps->log2_ctb_size);
int ctb_addr_ts = s1->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs];
int thread = ctb_row % s1->threads_number;
int ret;
- s = s1->sList[self_id];
- 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]);
if (ret < 0)
@@ -2630,16 +2628,12 @@ static int hls_slice_data_wpp(HEVCContext *s, const H2645NAL *nal)
int length = nal->size;
HEVCLocalContext *lc = s->HEVClc;
int *ret = av_malloc_array(s->sh.num_entry_point_offsets + 1, sizeof(int));
- int *arg = av_malloc_array(s->sh.num_entry_point_offsets + 1, sizeof(int));
int64_t offset;
int64_t startheader, cmpt = 0;
int i, j, res = 0;
- if (!ret || !arg) {
- av_free(ret);
- av_free(arg);
+ if (!ret)
return AVERROR(ENOMEM);
- }
if (s->sh.slice_ctb_addr_rs + s->sh.num_entry_point_offsets * s->ps.sps->ctb_width >= s->ps.sps->ctb_width * s->ps.sps->ctb_height) {
av_log(s->avctx, AV_LOG_ERROR, "WPP ctb addresses are wrong (%d %d %d %d)\n",
@@ -2713,18 +2707,16 @@ static int hls_slice_data_wpp(HEVCContext *s, const H2645NAL *nal)
ff_reset_entries(s->avctx);
for (i = 0; i <= s->sh.num_entry_point_offsets; i++) {
- arg[i] = i;
ret[i] = 0;
}
if (s->ps.pps->entropy_coding_sync_enabled_flag)
- s->avctx->execute2(s->avctx, hls_decode_entry_wpp, arg, ret, s->sh.num_entry_point_offsets + 1);
+ s->avctx->execute2(s->avctx, hls_decode_entry_wpp, s->HEVClcList, ret, s->sh.num_entry_point_offsets + 1);
for (i = 0; i <= s->sh.num_entry_point_offsets; i++)
res += ret[i];
error:
av_free(ret);
- av_free(arg);
return res;
}
Right now the code passes a list of ints whose entry #i is just i as opaque parameter to hls_decode_entry_wpp via execute2; said list is even constantly allocated and freed. This commit stops doing so and instead passes the list of HEVCLocalContext* instead, so that the main HEVCContext can be avoided in accessing the HEVCLocalContext. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> --- libavcodec/hevcdec.c | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-)