diff options
author | Paul B Mahol <onemda@gmail.com> | 2017-06-26 21:31:12 +0200 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2017-06-27 09:54:10 +0200 |
commit | 4ed7c2bbc3d04d5410433fd7038f076538e4a944 (patch) | |
tree | 083a62e72a7e7a137b94c5ef8a0864399d17e35b /libavcodec/utvideodec.c | |
parent | 3594788b713e76449eda0bc9d64b38258c86a594 (diff) | |
download | ffmpeg-4ed7c2bbc3d04d5410433fd7038f076538e4a944.tar.gz |
avcodec/utvideodec: add SIMD for restore_rgb_planes
Signed-off-by: Paul B Mahol <onemda@gmail.com>
Diffstat (limited to 'libavcodec/utvideodec.c')
-rw-r--r-- | libavcodec/utvideodec.c | 53 |
1 files changed, 7 insertions, 46 deletions
diff --git a/libavcodec/utvideodec.c b/libavcodec/utvideodec.c index 0c6f89e83a..44841aaa65 100644 --- a/libavcodec/utvideodec.c +++ b/libavcodec/utvideodec.c @@ -333,50 +333,6 @@ fail: return AVERROR_INVALIDDATA; } -static void restore_rgb_planes(AVFrame *frame, int width, int height) -{ - uint8_t *src_r = (uint8_t *)frame->data[2]; - uint8_t *src_g = (uint8_t *)frame->data[0]; - uint8_t *src_b = (uint8_t *)frame->data[1]; - uint8_t r, g, b; - int i, j; - - for (j = 0; j < height; j++) { - for (i = 0; i < width; i++) { - r = src_r[i]; - g = src_g[i]; - b = src_b[i]; - src_r[i] = r + g - 0x80; - src_b[i] = b + g - 0x80; - } - src_r += frame->linesize[2]; - src_g += frame->linesize[0]; - src_b += frame->linesize[1]; - } -} - -static void restore_rgb_planes10(AVFrame *frame, int width, int height) -{ - uint16_t *src_r = (uint16_t *)frame->data[2]; - uint16_t *src_g = (uint16_t *)frame->data[0]; - uint16_t *src_b = (uint16_t *)frame->data[1]; - int r, g, b; - int i, j; - - for (j = 0; j < height; j++) { - for (i = 0; i < width; i++) { - r = src_r[i]; - g = src_g[i]; - b = src_b[i]; - src_r[i] = (r + g - 0x200) & 0x3FF; - src_b[i] = (b + g - 0x200) & 0x3FF; - } - src_r += frame->linesize[2] / 2; - src_g += frame->linesize[0] / 2; - src_b += frame->linesize[1] / 2; - } -} - #undef A #undef B #undef C @@ -696,7 +652,9 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, } } } - restore_rgb_planes(frame.f, avctx->width, avctx->height); + c->utdsp.restore_rgb_planes(frame.f->data[2], frame.f->data[0], frame.f->data[1], + frame.f->linesize[2], frame.f->linesize[0], frame.f->linesize[1], + avctx->width, avctx->height); break; case AV_PIX_FMT_GBRAP10: case AV_PIX_FMT_GBRP10: @@ -709,7 +667,9 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, if (ret) return ret; } - restore_rgb_planes10(frame.f, avctx->width, avctx->height); + c->utdsp.restore_rgb_planes10((uint16_t *)frame.f->data[2], (uint16_t *)frame.f->data[0], (uint16_t *)frame.f->data[1], + frame.f->linesize[2] / 2, frame.f->linesize[0] / 2, frame.f->linesize[1] / 2, + avctx->width, avctx->height); break; case AV_PIX_FMT_YUV420P: for (i = 0; i < 3; i++) { @@ -830,6 +790,7 @@ static av_cold int decode_init(AVCodecContext *avctx) c->avctx = avctx; + ff_utvideodsp_init(&c->utdsp); ff_bswapdsp_init(&c->bdsp); ff_llviddsp_init(&c->llviddsp); |