diff options
author | Scott LaVarnway <slavarnway@google.com> | 2012-10-03 10:07:13 -0700 |
---|---|---|
committer | Scott LaVarnway <slavarnway@google.com> | 2013-01-30 10:27:26 -0800 |
commit | 75f647fe8a35ef59b7924a5f6f8af5c49e205ed1 (patch) | |
tree | b6160b4b548259628dfd16d4803fd1b7fd1adcd0 /vp8/vp8_dx_iface.c | |
parent | 8b22a9d377890f1ccf4e5729dfdaa1dde74e3cff (diff) | |
download | libvpx-75f647fe8a35ef59b7924a5f6f8af5c49e205ed1.tar libvpx-75f647fe8a35ef59b7924a5f6f8af5c49e205ed1.tar.gz libvpx-75f647fe8a35ef59b7924a5f6f8af5c49e205ed1.tar.bz2 libvpx-75f647fe8a35ef59b7924a5f6f8af5c49e205ed1.zip |
WIP: Multiple decoder instances support
Started adding support for multiple internal decoder instances. Also added
code to limit the vp8 config options available when using frame-based
multithreading.
Change-Id: I0f1ee7abcfcff59204f50162e28254b8dd6972eb
Diffstat (limited to 'vp8/vp8_dx_iface.c')
-rw-r--r-- | vp8/vp8_dx_iface.c | 67 |
1 files changed, 41 insertions, 26 deletions
diff --git a/vp8/vp8_dx_iface.c b/vp8/vp8_dx_iface.c index 598abbd29..1db61f161 100644 --- a/vp8/vp8_dx_iface.c +++ b/vp8/vp8_dx_iface.c @@ -64,7 +64,6 @@ struct vpx_codec_alg_priv vp8_stream_info_t si; int defer_alloc; int decoder_init; - struct VP8D_COMP *pbi; int postproc_cfg_set; vp8_postproc_cfg_t postproc_cfg; #if CONFIG_POSTPROC_VISUALIZER @@ -76,6 +75,7 @@ struct vpx_codec_alg_priv #endif vpx_image_t img; int img_setup; + struct frame_buffers yv12_frame_buffers; void *user_priv; FRAGMENT_DATA fragments; }; @@ -228,6 +228,24 @@ static vpx_codec_err_t vp8_init(vpx_codec_ctx_t *ctx, } } + ctx->priv->alg_priv->yv12_frame_buffers.use_frame_threads = + (ctx->priv->alg_priv->base.init_flags & + VPX_CODEC_USE_FRAME_THREADING); + + /* for now, disable frame threading */ + ctx->priv->alg_priv->yv12_frame_buffers.use_frame_threads = 0; + + if(ctx->priv->alg_priv->yv12_frame_buffers.use_frame_threads && + (( ctx->priv->alg_priv->base.init_flags & + VPX_CODEC_USE_ERROR_CONCEALMENT) + || ( ctx->priv->alg_priv->base.init_flags & + VPX_CODEC_USE_INPUT_FRAGMENTS) ) ) + { + /* row-based threading, error concealment, and input fragments will + * not be supported when using frame-based threading */ + res = VPX_CODEC_INVALID_PARAM; + } + return res; } @@ -235,7 +253,7 @@ static vpx_codec_err_t vp8_destroy(vpx_codec_alg_priv_t *ctx) { int i; - vp8dx_remove_decompressor(ctx->pbi); + vp8_remove_decoder_instances(&ctx->yv12_frame_buffers); for (i = NELEMENTS(ctx->mmaps) - 1; i >= 0; i--) { @@ -467,7 +485,6 @@ static vpx_codec_err_t vp8_decode(vpx_codec_alg_priv_t *ctx, if (!res) { VP8D_CONFIG oxcf; - struct VP8D_COMP* optr; oxcf.Width = ctx->si.w; oxcf.Height = ctx->si.h; @@ -477,8 +494,6 @@ static vpx_codec_err_t vp8_decode(vpx_codec_alg_priv_t *ctx, oxcf.error_concealment = (ctx->base.init_flags & VPX_CODEC_USE_ERROR_CONCEALMENT); - optr = vp8dx_create_decompressor(&oxcf); - /* If postprocessing was enabled by the application and a * configuration has not been provided, default it. */ @@ -491,20 +506,17 @@ static vpx_codec_err_t vp8_decode(vpx_codec_alg_priv_t *ctx, ctx->postproc_cfg.noise_level = 0; } - if (!optr) - res = VPX_CODEC_ERROR; - else - ctx->pbi = optr; + res = vp8_create_decoder_instances(&ctx->yv12_frame_buffers, &oxcf); } ctx->decoder_init = 1; } - if (!res && ctx->pbi) + if (!res) { + VP8D_COMP *pbi = ctx->yv12_frame_buffers.pbi[0]; if(resolution_change) { - VP8D_COMP *pbi = ctx->pbi; VP8_COMMON *const pc = & pbi->common; MACROBLOCKD *const xd = & pbi->mb; #if CONFIG_MULTITHREAD @@ -594,16 +606,15 @@ static vpx_codec_err_t vp8_decode(vpx_codec_alg_priv_t *ctx, pbi->common.error.setjmp = 0; /* required to get past the first get_free_fb() call */ - ctx->pbi->common.fb_idx_ref_cnt[0] = 0; + pbi->common.fb_idx_ref_cnt[0] = 0; } /* update the pbi fragment data */ - ctx->pbi->fragments = ctx->fragments; + pbi->fragments = ctx->fragments; ctx->user_priv = user_priv; - if (vp8dx_receive_compressed_data(ctx->pbi, data_sz, data, deadline)) + if (vp8dx_receive_compressed_data(pbi, data_sz, data, deadline)) { - VP8D_COMP *pbi = (VP8D_COMP *)ctx->pbi; res = update_error_state(ctx, &pbi->common.error); } @@ -649,7 +660,8 @@ static vpx_image_t *vp8_get_frame(vpx_codec_alg_priv_t *ctx, #endif } - if (0 == vp8dx_get_raw_frame(ctx->pbi, &sd, &time_stamp, &time_end_stamp, &flags)) + if (0 == vp8dx_get_raw_frame(ctx->yv12_frame_buffers.pbi[0], &sd, + &time_stamp, &time_end_stamp, &flags)) { yuvconfig2image(&ctx->img, &sd, ctx->user_priv); @@ -774,14 +786,15 @@ static vpx_codec_err_t vp8_set_reference(vpx_codec_alg_priv_t *ctx, vpx_ref_frame_t *data = va_arg(args, vpx_ref_frame_t *); - if (data) + if (data && !ctx->yv12_frame_buffers.use_frame_threads) { vpx_ref_frame_t *frame = (vpx_ref_frame_t *)data; YV12_BUFFER_CONFIG sd; image2yuvconfig(&frame->img, &sd); - return vp8dx_set_reference(ctx->pbi, frame->frame_type, &sd); + return vp8dx_set_reference(ctx->yv12_frame_buffers.pbi[0], + frame->frame_type, &sd); } else return VPX_CODEC_INVALID_PARAM; @@ -795,14 +808,15 @@ static vpx_codec_err_t vp8_get_reference(vpx_codec_alg_priv_t *ctx, vpx_ref_frame_t *data = va_arg(args, vpx_ref_frame_t *); - if (data) + if (data && !ctx->yv12_frame_buffers.use_frame_threads) { vpx_ref_frame_t *frame = (vpx_ref_frame_t *)data; YV12_BUFFER_CONFIG sd; image2yuvconfig(&frame->img, &sd); - return vp8dx_get_reference(ctx->pbi, frame->frame_type, &sd); + return vp8dx_get_reference(ctx->yv12_frame_buffers.pbi[0], + frame->frame_type, &sd); } else return VPX_CODEC_INVALID_PARAM; @@ -858,10 +872,11 @@ static vpx_codec_err_t vp8_get_last_ref_updates(vpx_codec_alg_priv_t *ctx, va_list args) { int *update_info = va_arg(args, int *); - VP8D_COMP *pbi = (VP8D_COMP *)ctx->pbi; - if (update_info) + if (update_info && !ctx->yv12_frame_buffers.use_frame_threads) { + VP8D_COMP *pbi = (VP8D_COMP *)ctx->yv12_frame_buffers.pbi[0]; + *update_info = pbi->common.refresh_alt_ref_frame * (int) VP8_ALTR_FRAME + pbi->common.refresh_golden_frame * (int) VP8_GOLD_FRAME + pbi->common.refresh_last_frame * (int) VP8_LAST_FRAME; @@ -878,11 +893,11 @@ static vpx_codec_err_t vp8_get_last_ref_frame(vpx_codec_alg_priv_t *ctx, va_list args) { int *ref_info = va_arg(args, int *); - VP8D_COMP *pbi = (VP8D_COMP *)ctx->pbi; - VP8_COMMON *oci = &pbi->common; - if (ref_info) + if (ref_info && !ctx->yv12_frame_buffers.use_frame_threads) { + VP8D_COMP *pbi = (VP8D_COMP *)ctx->yv12_frame_buffers.pbi[0]; + VP8_COMMON *oci = &pbi->common; *ref_info = (vp8dx_references_buffer( oci, ALTREF_FRAME )?VP8_ALTR_FRAME:0) | (vp8dx_references_buffer( oci, GOLDEN_FRAME )?VP8_GOLD_FRAME:0) | @@ -903,7 +918,7 @@ static vpx_codec_err_t vp8_get_frame_corrupted(vpx_codec_alg_priv_t *ctx, if (corrupted) { - VP8D_COMP *pbi = (VP8D_COMP *)ctx->pbi; + VP8D_COMP *pbi = (VP8D_COMP *)ctx->yv12_frame_buffers.pbi[0]; *corrupted = pbi->common.frame_to_show->corrupted; return VPX_CODEC_OK; |