diff --git a/libavcodec/diracdec.c b/libavcodec/diracdec.c index ee07ff8bb3..8ab4360288 100644 --- a/libavcodec/diracdec.c +++ b/libavcodec/diracdec.c @@ -1839,9 +1839,12 @@ static int dirac_decode_frame_internal(DiracContext *s) if (!s->num_refs) { /* intra */ for (y = 0; y < p->height; y += 16) { + int idx = (s->bit_depth - 8) >> 1; ff_spatial_idwt_slice2(&d, y+16); /* decode */ - s->diracdsp.put_signed_rect_clamped[s->pshift](frame + y*p->stride, p->stride, - p->idwt_buf + y*p->idwt_stride, p->idwt_stride, p->width, 16); + s->diracdsp.put_signed_rect_clamped[idx](frame + y*p->stride, + p->stride, + p->idwt_buf + y*p->idwt_stride, + p->idwt_stride, p->width, 16); } } else { /* inter */ int rowheight = p->ybsep*p->stride; diff --git a/libavcodec/diracdsp.c b/libavcodec/diracdsp.c index e82b58767e..6c75f9aaa0 100644 --- a/libavcodec/diracdsp.c +++ b/libavcodec/diracdsp.c @@ -168,6 +168,23 @@ static void put_signed_rect_clamped_10bit_c(uint8_t *_dst, int dst_stride, const } } +static void put_signed_rect_clamped_12bit_c(uint8_t *_dst, int dst_stride, const uint8_t *_src, int src_stride, int width, int height) +{ + int x, y; + uint16_t *dst = (uint16_t *)_dst; + int32_t *src = (int32_t *)_src; + for (y = 0; y < height; y++) { + for (x = 0; x < width; x+=4) { + dst[x ] = av_clip(src[x ] + 2048, 0, (1 << 12) - 1); + dst[x+1] = av_clip(src[x+1] + 2048, 0, (1 << 12) - 1); + dst[x+2] = av_clip(src[x+2] + 2048, 0, (1 << 12) - 1); + dst[x+3] = av_clip(src[x+3] + 2048, 0, (1 << 12) - 1); + } + dst += dst_stride >> 1; + src += src_stride >> 2; + } +} + static void add_rect_clamped_c(uint8_t *dst, const uint16_t *src, int stride, const int16_t *idwt, int idwt_stride, int width, int height) @@ -197,6 +214,7 @@ av_cold void ff_diracdsp_init(DiracDSPContext *c) c->add_rect_clamped = add_rect_clamped_c; c->put_signed_rect_clamped[0] = put_signed_rect_clamped_8bit_c; c->put_signed_rect_clamped[1] = put_signed_rect_clamped_10bit_c; + c->put_signed_rect_clamped[2] = put_signed_rect_clamped_12bit_c; c->add_dirac_obmc[0] = add_obmc8_c; c->add_dirac_obmc[1] = add_obmc16_c;