diff options
author | Anton Khirnov <anton@khirnov.net> | 2024-05-28 18:43:13 +0200 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2024-06-04 11:36:51 +0200 |
commit | 67ca18dd56956892a097388a160bb70f10539d77 (patch) | |
tree | 07ee138ed44baa0495aef8f476b09ed7a40f53ca | |
parent | ac69e6caf6d9b74a215c7fc170574e7bcc4f9fda (diff) | |
download | ffmpeg-67ca18dd56956892a097388a160bb70f10539d77.tar.gz |
lavc/hevcdec: drop HEVCLocalContext.gb
In all HEVCLocalContext instances except the first one, the bitreader is
never used for actually reading bits, but merely for passing the buffer
to ff_init_cabac_decoder(), which is better done directly.
The instance that actually is used for bitreading gets moved to stack in
decode_nal_unit(), which makes its lifetime clearer.
-rw-r--r-- | libavcodec/hevc_cabac.c | 17 | ||||
-rw-r--r-- | libavcodec/hevcdec.c | 43 | ||||
-rw-r--r-- | libavcodec/hevcdec.h | 4 |
3 files changed, 27 insertions, 37 deletions
diff --git a/libavcodec/hevc_cabac.c b/libavcodec/hevc_cabac.c index 3f95c9ca05..71bd678972 100644 --- a/libavcodec/hevc_cabac.c +++ b/libavcodec/hevc_cabac.c @@ -427,14 +427,6 @@ static int cabac_reinit(HEVCLocalContext *lc) return skip_bytes(&lc->cc, 0) == NULL ? AVERROR_INVALIDDATA : 0; } -static int cabac_init_decoder(HEVCLocalContext *lc) -{ - GetBitContext *gb = &lc->gb; - return ff_init_cabac_decoder(&lc->cc, - gb->buffer + get_bits_count(gb) / 8, - (get_bits_left(gb) + 7) / 8); -} - static void cabac_init_state(HEVCLocalContext *lc, const HEVCContext *s) { int init_type = 2 - s->sh.slice_type; @@ -459,12 +451,13 @@ static void cabac_init_state(HEVCLocalContext *lc, const HEVCContext *s) lc->stat_coeff[i] = 0; } -int ff_hevc_cabac_init(HEVCLocalContext *lc, int ctb_addr_ts) +int ff_hevc_cabac_init(HEVCLocalContext *lc, int ctb_addr_ts, + const uint8_t *data, size_t size) { const HEVCContext *const s = lc->parent; if (ctb_addr_ts == s->ps.pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs]) { - int ret = cabac_init_decoder(lc); + int ret = ff_init_cabac_decoder(&lc->cc, data, size); if (ret < 0) return ret; if (s->sh.dependent_slice_segment_flag == 0 || @@ -488,7 +481,7 @@ int ff_hevc_cabac_init(HEVCLocalContext *lc, int ctb_addr_ts) if (s->threads_number == 1) ret = cabac_reinit(lc); else { - ret = cabac_init_decoder(lc); + ret = ff_init_cabac_decoder(&lc->cc, data, size); } if (ret < 0) return ret; @@ -501,7 +494,7 @@ int ff_hevc_cabac_init(HEVCLocalContext *lc, int ctb_addr_ts) if (s->threads_number == 1) ret = cabac_reinit(lc); else { - ret = cabac_init_decoder(lc); + ret = ff_init_cabac_decoder(&lc->cc, data, size); } if (ret < 0) return ret; diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c index 42fd33961b..0a9443505a 100644 --- a/libavcodec/hevcdec.c +++ b/libavcodec/hevcdec.c @@ -593,9 +593,8 @@ fail: return ret; } -static int hls_slice_header(HEVCContext *s) +static int hls_slice_header(HEVCContext *s, GetBitContext *gb) { - GetBitContext *gb = &s->HEVClc->gb; SliceHeader *sh = &s->sh; int i, ret; @@ -2533,9 +2532,11 @@ static void hls_decode_neighbour(HEVCLocalContext *lc, int x_ctb, int y_ctb, lc->ctb_up_left_flag = ((x_ctb > 0) && (y_ctb > 0) && (ctb_addr_in_slice-1 >= s->ps.sps->ctb_width) && (s->ps.pps->tile_id[ctb_addr_ts] == s->ps.pps->tile_id[s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs-1 - s->ps.sps->ctb_width]])); } -static int hls_decode_entry(HEVCContext *s) +static int hls_decode_entry(HEVCContext *s, GetBitContext *gb) { HEVCLocalContext *const lc = s->HEVClc; + const uint8_t *slice_data = gb->buffer + s->sh.data_offset; + const size_t slice_size = gb->buffer_end - gb->buffer - s->sh.data_offset; int ctb_size = 1 << s->ps.sps->log2_ctb_size; int more_data = 1; int x_ctb = 0; @@ -2563,7 +2564,7 @@ static int hls_decode_entry(HEVCContext *s) y_ctb = (ctb_addr_rs / ((s->ps.sps->width + ctb_size - 1) >> s->ps.sps->log2_ctb_size)) << s->ps.sps->log2_ctb_size; hls_decode_neighbour(lc, x_ctb, y_ctb, ctb_addr_ts); - ret = ff_hevc_cabac_init(lc, ctb_addr_ts); + ret = ff_hevc_cabac_init(lc, ctb_addr_ts, slice_data, slice_size); if (ret < 0) { s->tab_slice_address[ctb_addr_rs] = -1; return ret; @@ -2605,14 +2606,14 @@ static int hls_decode_entry_wpp(AVCodecContext *avctxt, void *hevc_lclist, int ctb_addr_rs = s->sh.slice_ctb_addr_rs + ctb_row * ((s->ps.sps->width + ctb_size - 1) >> s->ps.sps->log2_ctb_size); int ctb_addr_ts = s->ps.pps->ctb_addr_rs_to_ts[ctb_addr_rs]; int thread = ctb_row % s->threads_number; + + const uint8_t *data = s->data + s->sh.offset[ctb_row]; + const size_t data_size = s->sh.size[ctb_row]; + int ret; - if(ctb_row) { - ret = init_get_bits8(&lc->gb, s->data + s->sh.offset[ctb_row], s->sh.size[ctb_row]); - if (ret < 0) - goto error; - ff_init_cabac_decoder(&lc->cc, s->data + s->sh.offset[ctb_row], s->sh.size[ctb_row]); - } + if (ctb_row) + ff_init_cabac_decoder(&lc->cc, data, data_size); while(more_data && ctb_addr_ts < s->ps.sps->ctb_size) { int x_ctb = (ctb_addr_rs % s->ps.sps->ctb_width) << s->ps.sps->log2_ctb_size; @@ -2630,7 +2631,7 @@ static int hls_decode_entry_wpp(AVCodecContext *avctxt, void *hevc_lclist, return 0; } - ret = ff_hevc_cabac_init(lc, ctb_addr_ts); + ret = ff_hevc_cabac_init(lc, ctb_addr_ts, data, data_size); if (ret < 0) goto error; hls_sao_param(lc, x_ctb >> s->ps.sps->log2_ctb_size, y_ctb >> s->ps.sps->log2_ctb_size); @@ -2681,7 +2682,6 @@ static int hls_slice_data_wpp(HEVCContext *s, const H2645NAL *nal) { const uint8_t *data = nal->data; int length = nal->size; - HEVCLocalContext *lc; int *ret; int64_t offset; int64_t startheader, cmpt = 0; @@ -2719,8 +2719,7 @@ static int hls_slice_data_wpp(HEVCContext *s, const H2645NAL *nal) s->nb_local_ctx = s->threads_number; } - lc = &s->local_ctx[0]; - offset = (lc->gb.index >> 3); + offset = s->sh.data_offset; for (j = 0, cmpt = 0, startheader = offset + s->sh.entry_point_offset[0]; j < nal->skipped_bytes; j++) { if (nal->skipped_bytes_pos[j] >= offset && nal->skipped_bytes_pos[j] < startheader) { @@ -2981,11 +2980,9 @@ static int hevc_frame_end(HEVCContext *s) static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal) { - HEVCLocalContext *lc = s->HEVClc; - GetBitContext *gb = &lc->gb; + GetBitContext gb = nal->gb; int ctb_addr_ts, ret; - *gb = nal->gb; s->nal_unit_type = nal->type; s->temporal_id = nal->temporal_id; @@ -2997,7 +2994,7 @@ static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal) if (ret < 0) goto fail; } - ret = ff_hevc_decode_nal_vps(gb, s->avctx, &s->ps); + ret = ff_hevc_decode_nal_vps(&gb, s->avctx, &s->ps); if (ret < 0) goto fail; break; @@ -3008,7 +3005,7 @@ static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal) if (ret < 0) goto fail; } - ret = ff_hevc_decode_nal_sps(gb, s->avctx, &s->ps, + ret = ff_hevc_decode_nal_sps(&gb, s->avctx, &s->ps, s->apply_defdispwin); if (ret < 0) goto fail; @@ -3020,7 +3017,7 @@ static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal) if (ret < 0) goto fail; } - ret = ff_hevc_decode_nal_pps(gb, s->avctx, &s->ps); + ret = ff_hevc_decode_nal_pps(&gb, s->avctx, &s->ps); if (ret < 0) goto fail; break; @@ -3032,7 +3029,7 @@ static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal) if (ret < 0) goto fail; } - ret = ff_hevc_decode_nal_sei(gb, s->avctx, &s->sei, &s->ps, s->nal_unit_type); + ret = ff_hevc_decode_nal_sei(&gb, s->avctx, &s->sei, &s->ps, s->nal_unit_type); if (ret < 0) goto fail; break; @@ -3052,7 +3049,7 @@ static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal) case HEVC_NAL_RADL_R: case HEVC_NAL_RASL_N: case HEVC_NAL_RASL_R: - ret = hls_slice_header(s); + ret = hls_slice_header(s, &gb); if (ret < 0) return ret; if (ret == 1) { @@ -3134,7 +3131,7 @@ static int decode_nal_unit(HEVCContext *s, const H2645NAL *nal) if (s->threads_number > 1 && s->sh.num_entry_point_offsets > 0) ctb_addr_ts = hls_slice_data_wpp(s, nal); else - ctb_addr_ts = hls_decode_entry(s); + ctb_addr_ts = hls_decode_entry(s, &gb); if (ctb_addr_ts >= (s->ps.sps->ctb_width * s->ps.sps->ctb_height)) { ret = hevc_frame_end(s); if (ret < 0) diff --git a/libavcodec/hevcdec.h b/libavcodec/hevcdec.h index 3824bf621b..0ed51a5392 100644 --- a/libavcodec/hevcdec.h +++ b/libavcodec/hevcdec.h @@ -394,7 +394,6 @@ typedef struct HEVCLocalContext { void *logctx; const struct HEVCContext *parent; - GetBitContext gb; CABACContext cc; /** @@ -583,7 +582,8 @@ int ff_hevc_frame_rps(HEVCContext *s); int ff_hevc_slice_rpl(HEVCContext *s); void ff_hevc_save_states(HEVCLocalContext *lc, int ctb_addr_ts); -int ff_hevc_cabac_init(HEVCLocalContext *lc, int ctb_addr_ts); +int ff_hevc_cabac_init(HEVCLocalContext *lc, int ctb_addr_ts, + const uint8_t *data, size_t size); int ff_hevc_sao_merge_flag_decode(HEVCLocalContext *lc); int ff_hevc_sao_type_idx_decode(HEVCLocalContext *lc); int ff_hevc_sao_band_position_decode(HEVCLocalContext *lc); |