aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec
diff options
context:
space:
mode:
authorKieran Kunhya <kieran@kunhya.com>2016-01-12 00:51:49 +0000
committerRostislav Pehlivanov <atomnuker@gmail.com>2016-01-13 16:08:56 +0000
commitbfc8a4dabe5a0154b31128b59dca575010176441 (patch)
treed706b2dc340f6821e766ed3234b21f35a53c8210 /libavcodec
parent699c2ee560532a5111a944d2653e9a3e484efc34 (diff)
downloadffmpeg-bfc8a4dabe5a0154b31128b59dca575010176441.tar.gz
diracdec: Add slice threading to HQ profile
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/diracdec.c38
1 files changed, 30 insertions, 8 deletions
diff --git a/libavcodec/diracdec.c b/libavcodec/diracdec.c
index 9d98535142..c67f845712 100644
--- a/libavcodec/diracdec.c
+++ b/libavcodec/diracdec.c
@@ -832,11 +832,13 @@ static int decode_lowdelay_slice(AVCodecContext *avctx, void *arg)
* VC-2 Specification ->
* 13.5.3 hq_slice(sx,sy)
*/
-static int decode_hq_slice(DiracContext *s, GetBitContext *gb,
- int slice_x, int slice_y)
+static int decode_hq_slice(AVCodecContext *avctx, void *arg)
{
int i, quant, level, orientation, quant_idx;
uint8_t quants[MAX_DWT_LEVELS][4];
+ DiracContext *s = avctx->priv_data;
+ DiracSlice *slice = arg;
+ GetBitContext *gb = &slice->gb;
skip_bits_long(gb, 8*s->highquality.prefix_bytes);
quant_idx = get_bits(gb, 8);
@@ -856,7 +858,7 @@ static int decode_hq_slice(DiracContext *s, GetBitContext *gb,
int bits_end = get_bits_count(gb) + bits_left;
for (level = 0; level < s->wavelet_depth; level++) {
for (orientation = !!level; orientation < 4; orientation++) {
- decode_subband(s, gb, quants[level][orientation], slice_x, slice_y, bits_end,
+ decode_subband(s, gb, quants[level][orientation], slice->slice_x, slice->slice_y, bits_end,
&s->plane[i].band[level][orientation], NULL);
}
}
@@ -873,7 +875,7 @@ static int decode_hq_slice(DiracContext *s, GetBitContext *gb,
static int decode_lowdelay(DiracContext *s)
{
AVCodecContext *avctx = s->avctx;
- int slice_x, slice_y, bytes, bufsize;
+ int slice_x, slice_y, bytes = 0, bufsize;
const uint8_t *buf;
DiracSlice *slices;
int slice_num = 0;
@@ -888,11 +890,31 @@ static int decode_lowdelay(DiracContext *s)
bufsize = get_bits_left(&s->gb);
if (s->hq_picture) {
- for (slice_y = 0; slice_y < s->num_y; slice_y++) {
- for (slice_x = 0; slice_x < s->num_x; slice_x++) {
- decode_hq_slice(s, &s->gb, slice_x, slice_y);
+ int i;
+
+ for (slice_y = 0; bufsize > 0 && slice_y < s->num_y; slice_y++) {
+ for (slice_x = 0; bufsize > 0 && slice_x < s->num_x; slice_x++) {
+ bytes = s->highquality.prefix_bytes + 1;
+ for (i = 0; i < 3; i++) {
+ if (bytes <= bufsize/8)
+ bytes += buf[bytes] * s->highquality.size_scaler + 1;
+ }
+
+ slices[slice_num].bytes = bytes;
+ slices[slice_num].slice_x = slice_x;
+ slices[slice_num].slice_y = slice_y;
+ init_get_bits(&slices[slice_num].gb, buf, bufsize);
+ slice_num++;
+
+ buf += bytes;
+ if (bufsize/8 >= bytes)
+ bufsize -= bytes*8;
+ else
+ bufsize = 0;
}
}
+ avctx->execute(avctx, decode_hq_slice, slices, NULL, slice_num,
+ sizeof(DiracSlice));
} else {
for (slice_y = 0; bufsize > 0 && slice_y < s->num_y; slice_y++) {
for (slice_x = 0; bufsize > 0 && slice_x < s->num_x; slice_x++) {
@@ -2199,6 +2221,6 @@ AVCodec ff_dirac_decoder = {
.init = dirac_decode_init,
.close = dirac_decode_end,
.decode = dirac_decode_frame,
- .capabilities = AV_CODEC_CAP_DELAY,
+ .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_DR1,
.flush = dirac_decode_flush,
};