avcodec/diracdec: Constify slice threads' ptr to main context

Modifying the main context from a slice thread is (usually)
a data race, so it must not happen. So only use a pointer to const
to access the main context.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
pull/388/head
Andreas Rheinhardt 2 years ago
parent 597dc96736
commit 9ea03f5678
  1. 23
      libavcodec/diracdec.c

@ -486,7 +486,7 @@ UNPACK_ARITH(10, int32_t)
* Decode the coeffs in the rectangle defined by left, right, top, bottom * Decode the coeffs in the rectangle defined by left, right, top, bottom
* [DIRAC_STD] 13.4.3.2 Codeblock unpacking loop. codeblock() * [DIRAC_STD] 13.4.3.2 Codeblock unpacking loop. codeblock()
*/ */
static inline int codeblock(DiracContext *s, SubBand *b, static inline int codeblock(const DiracContext *s, SubBand *b,
GetBitContext *gb, DiracArith *c, GetBitContext *gb, DiracArith *c,
int left, int right, int top, int bottom, int left, int right, int top, int bottom,
int blockcnt_one, int is_arith) int blockcnt_one, int is_arith)
@ -596,7 +596,8 @@ INTRA_DC_PRED(10, uint32_t)
* Dirac Specification -> * Dirac Specification ->
* 13.4.2 Non-skipped subbands. subband_coeffs() * 13.4.2 Non-skipped subbands. subband_coeffs()
*/ */
static av_always_inline int decode_subband_internal(DiracContext *s, SubBand *b, int is_arith) static av_always_inline int decode_subband_internal(const DiracContext *s,
SubBand *b, int is_arith)
{ {
int cb_x, cb_y, left, right, top, bottom; int cb_x, cb_y, left, right, top, bottom;
DiracArith c; DiracArith c;
@ -640,13 +641,13 @@ static av_always_inline int decode_subband_internal(DiracContext *s, SubBand *b,
static int decode_subband_arith(AVCodecContext *avctx, void *b) static int decode_subband_arith(AVCodecContext *avctx, void *b)
{ {
DiracContext *s = avctx->priv_data; const DiracContext *s = avctx->priv_data;
return decode_subband_internal(s, b, 1); return decode_subband_internal(s, b, 1);
} }
static int decode_subband_golomb(AVCodecContext *avctx, void *arg) static int decode_subband_golomb(AVCodecContext *avctx, void *arg)
{ {
DiracContext *s = avctx->priv_data; const DiracContext *s = avctx->priv_data;
SubBand **b = arg; SubBand **b = arg;
return decode_subband_internal(s, *b, 0); return decode_subband_internal(s, *b, 0);
} }
@ -721,9 +722,9 @@ static int decode_component(DiracContext *s, int comp)
return; \ return; \
} \ } \
static void decode_subband(DiracContext *s, GetBitContext *gb, int quant, static void decode_subband(const DiracContext *s, GetBitContext *gb, int quant,
int slice_x, int slice_y, int bits_end, int slice_x, int slice_y, int bits_end,
SubBand *b1, SubBand *b2) const SubBand *b1, const SubBand *b2)
{ {
int left = b1->width * slice_x / s->num_x; int left = b1->width * slice_x / s->num_x;
int right = b1->width *(slice_x+1) / s->num_x; int right = b1->width *(slice_x+1) / s->num_x;
@ -775,7 +776,7 @@ static void decode_subband(DiracContext *s, GetBitContext *gb, int quant,
*/ */
static int decode_lowdelay_slice(AVCodecContext *avctx, void *arg) static int decode_lowdelay_slice(AVCodecContext *avctx, void *arg)
{ {
DiracContext *s = avctx->priv_data; const DiracContext *s = avctx->priv_data;
DiracSlice *slice = arg; DiracSlice *slice = arg;
GetBitContext *gb = &slice->gb; GetBitContext *gb = &slice->gb;
enum dirac_subband orientation; enum dirac_subband orientation;
@ -819,13 +820,13 @@ typedef struct SliceCoeffs {
int tot; int tot;
} SliceCoeffs; } SliceCoeffs;
static int subband_coeffs(DiracContext *s, int x, int y, int p, static int subband_coeffs(const DiracContext *s, int x, int y, int p,
SliceCoeffs c[MAX_DWT_LEVELS]) SliceCoeffs c[MAX_DWT_LEVELS])
{ {
int level, coef = 0; int level, coef = 0;
for (level = 0; level < s->wavelet_depth; level++) { for (level = 0; level < s->wavelet_depth; level++) {
SliceCoeffs *o = &c[level]; SliceCoeffs *o = &c[level];
SubBand *b = &s->plane[p].band[level][3]; /* orientation doens't matter */ const SubBand *b = &s->plane[p].band[level][3]; /* orientation doens't matter */
o->top = b->height * y / s->num_y; o->top = b->height * y / s->num_y;
o->left = b->width * x / s->num_x; o->left = b->width * x / s->num_x;
o->tot_h = ((b->width * (x + 1)) / s->num_x) - o->left; o->tot_h = ((b->width * (x + 1)) / s->num_x) - o->left;
@ -840,7 +841,7 @@ static int subband_coeffs(DiracContext *s, int x, int y, int p,
* VC-2 Specification -> * VC-2 Specification ->
* 13.5.3 hq_slice(sx,sy) * 13.5.3 hq_slice(sx,sy)
*/ */
static int decode_hq_slice(DiracContext *s, DiracSlice *slice, uint8_t *tmp_buf) static int decode_hq_slice(const DiracContext *s, DiracSlice *slice, uint8_t *tmp_buf)
{ {
int i, level, orientation, quant_idx; int i, level, orientation, quant_idx;
int qfactor[MAX_DWT_LEVELS][4], qoffset[MAX_DWT_LEVELS][4]; int qfactor[MAX_DWT_LEVELS][4], qoffset[MAX_DWT_LEVELS][4];
@ -917,7 +918,7 @@ static int decode_hq_slice(DiracContext *s, DiracSlice *slice, uint8_t *tmp_buf)
static int decode_hq_slice_row(AVCodecContext *avctx, void *arg, int jobnr, int threadnr) static int decode_hq_slice_row(AVCodecContext *avctx, void *arg, int jobnr, int threadnr)
{ {
int i; int i;
DiracContext *s = avctx->priv_data; const DiracContext *s = avctx->priv_data;
DiracSlice *slices = ((DiracSlice *)arg) + s->num_x*jobnr; DiracSlice *slices = ((DiracSlice *)arg) + s->num_x*jobnr;
uint8_t *thread_buf = &s->thread_buf[s->thread_buf_size*threadnr]; uint8_t *thread_buf = &s->thread_buf[s->thread_buf_size*threadnr];
for (i = 0; i < s->num_x; i++) for (i = 0; i < s->num_x; i++)

Loading…
Cancel
Save