summaryrefslogtreecommitdiff
path: root/vp9/vp9_dx_iface.c
diff options
context:
space:
mode:
Diffstat (limited to 'vp9/vp9_dx_iface.c')
-rw-r--r--vp9/vp9_dx_iface.c289
1 files changed, 73 insertions, 216 deletions
diff --git a/vp9/vp9_dx_iface.c b/vp9/vp9_dx_iface.c
index cf3f6df44..b7dc14e4b 100644
--- a/vp9/vp9_dx_iface.c
+++ b/vp9/vp9_dx_iface.c
@@ -57,30 +57,8 @@ static vpx_codec_err_t decoder_init(vpx_codec_ctx_t *ctx,
}
static vpx_codec_err_t decoder_destroy(vpx_codec_alg_priv_t *ctx) {
- if (ctx->frame_workers != NULL) {
- int i;
- // Shutdown all threads before reclaiming any memory. The frame-level
- // parallel decoder may access data from another worker.
- for (i = 0; i < ctx->num_frame_workers; ++i) {
- VPxWorker *const worker = &ctx->frame_workers[i];
- vpx_get_worker_interface()->end(worker);
- }
- for (i = 0; i < ctx->num_frame_workers; ++i) {
- VPxWorker *const worker = &ctx->frame_workers[i];
- FrameWorkerData *const frame_worker_data =
- (FrameWorkerData *)worker->data1;
- vp9_remove_common(&frame_worker_data->pbi->common);
-#if CONFIG_VP9_POSTPROC
- vp9_free_postproc_buffers(&frame_worker_data->pbi->common);
-#endif
- vp9_decoder_remove(frame_worker_data->pbi);
- vpx_free(frame_worker_data->scratch_buffer);
-#if CONFIG_MULTITHREAD
- pthread_mutex_destroy(&frame_worker_data->stats_mutex);
- pthread_cond_destroy(&frame_worker_data->stats_cond);
-#endif
- vpx_free(frame_worker_data);
- }
+ if (ctx->pbi != NULL) {
+ vp9_decoder_remove(ctx->pbi);
}
if (ctx->buffer_pool) {
@@ -88,7 +66,6 @@ static vpx_codec_err_t decoder_destroy(vpx_codec_alg_priv_t *ctx) {
vp9_free_internal_frame_buffers(&ctx->buffer_pool->int_frame_buffers);
}
- vpx_free(ctx->frame_workers);
vpx_free(ctx->buffer_pool);
vpx_free(ctx);
return VPX_CODEC_OK;
@@ -222,32 +199,26 @@ static vpx_codec_err_t update_error_state(
}
static void init_buffer_callbacks(vpx_codec_alg_priv_t *ctx) {
- int i;
-
- for (i = 0; i < ctx->num_frame_workers; ++i) {
- VPxWorker *const worker = &ctx->frame_workers[i];
- FrameWorkerData *const frame_worker_data = (FrameWorkerData *)worker->data1;
- VP9_COMMON *const cm = &frame_worker_data->pbi->common;
- BufferPool *const pool = cm->buffer_pool;
-
- cm->new_fb_idx = INVALID_IDX;
- cm->byte_alignment = ctx->byte_alignment;
- cm->skip_loop_filter = ctx->skip_loop_filter;
-
- if (ctx->get_ext_fb_cb != NULL && ctx->release_ext_fb_cb != NULL) {
- pool->get_fb_cb = ctx->get_ext_fb_cb;
- pool->release_fb_cb = ctx->release_ext_fb_cb;
- pool->cb_priv = ctx->ext_priv;
- } else {
- pool->get_fb_cb = vp9_get_frame_buffer;
- pool->release_fb_cb = vp9_release_frame_buffer;
+ VP9_COMMON *const cm = &ctx->pbi->common;
+ BufferPool *const pool = cm->buffer_pool;
- if (vp9_alloc_internal_frame_buffers(&pool->int_frame_buffers))
- vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
- "Failed to initialize internal frame buffers");
+ cm->new_fb_idx = INVALID_IDX;
+ cm->byte_alignment = ctx->byte_alignment;
+ cm->skip_loop_filter = ctx->skip_loop_filter;
- pool->cb_priv = &pool->int_frame_buffers;
- }
+ if (ctx->get_ext_fb_cb != NULL && ctx->release_ext_fb_cb != NULL) {
+ pool->get_fb_cb = ctx->get_ext_fb_cb;
+ pool->release_fb_cb = ctx->release_ext_fb_cb;
+ pool->cb_priv = ctx->ext_priv;
+ } else {
+ pool->get_fb_cb = vp9_get_frame_buffer;
+ pool->release_fb_cb = vp9_release_frame_buffer;
+
+ if (vp9_alloc_internal_frame_buffers(&pool->int_frame_buffers))
+ vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
+ "Failed to initialize internal frame buffers");
+
+ pool->cb_priv = &pool->int_frame_buffers;
}
}
@@ -264,80 +235,21 @@ static void set_ppflags(const vpx_codec_alg_priv_t *ctx, vp9_ppflags_t *flags) {
flags->noise_level = ctx->postproc_cfg.noise_level;
}
-static int frame_worker_hook(void *arg1, void *arg2) {
- FrameWorkerData *const frame_worker_data = (FrameWorkerData *)arg1;
- const uint8_t *data = frame_worker_data->data;
- (void)arg2;
-
- frame_worker_data->result = vp9_receive_compressed_data(
- frame_worker_data->pbi, frame_worker_data->data_size, &data);
- frame_worker_data->data_end = data;
-
- if (frame_worker_data->result != 0) {
- // Check decode result in serial decode.
- frame_worker_data->pbi->cur_buf->buf.corrupted = 1;
- frame_worker_data->pbi->need_resync = 1;
- }
- return !frame_worker_data->result;
-}
-
static vpx_codec_err_t init_decoder(vpx_codec_alg_priv_t *ctx) {
- int i;
- const VPxWorkerInterface *const winterface = vpx_get_worker_interface();
-
ctx->last_show_frame = -1;
ctx->need_resync = 1;
- ctx->num_frame_workers = 1;
ctx->flushed = 0;
ctx->buffer_pool = (BufferPool *)vpx_calloc(1, sizeof(BufferPool));
if (ctx->buffer_pool == NULL) return VPX_CODEC_MEM_ERROR;
- ctx->frame_workers = (VPxWorker *)vpx_malloc(ctx->num_frame_workers *
- sizeof(*ctx->frame_workers));
- if (ctx->frame_workers == NULL) {
- set_error_detail(ctx, "Failed to allocate frame_workers");
+ ctx->pbi = vp9_decoder_create(ctx->buffer_pool);
+ if (ctx->pbi == NULL) {
+ set_error_detail(ctx, "Failed to allocate decoder");
return VPX_CODEC_MEM_ERROR;
}
-
- for (i = 0; i < ctx->num_frame_workers; ++i) {
- VPxWorker *const worker = &ctx->frame_workers[i];
- FrameWorkerData *frame_worker_data = NULL;
- winterface->init(worker);
- worker->data1 = vpx_memalign(32, sizeof(FrameWorkerData));
- if (worker->data1 == NULL) {
- set_error_detail(ctx, "Failed to allocate frame_worker_data");
- return VPX_CODEC_MEM_ERROR;
- }
- frame_worker_data = (FrameWorkerData *)worker->data1;
- frame_worker_data->pbi = vp9_decoder_create(ctx->buffer_pool);
- if (frame_worker_data->pbi == NULL) {
- set_error_detail(ctx, "Failed to allocate frame_worker_data");
- return VPX_CODEC_MEM_ERROR;
- }
- frame_worker_data->worker_id = i;
- frame_worker_data->scratch_buffer = NULL;
- frame_worker_data->scratch_buffer_size = 0;
- frame_worker_data->frame_context_ready = 0;
- frame_worker_data->received_frame = 0;
-#if CONFIG_MULTITHREAD
- if (pthread_mutex_init(&frame_worker_data->stats_mutex, NULL)) {
- set_error_detail(ctx, "Failed to allocate frame_worker_data mutex");
- return VPX_CODEC_MEM_ERROR;
- }
-
- if (pthread_cond_init(&frame_worker_data->stats_cond, NULL)) {
- set_error_detail(ctx, "Failed to allocate frame_worker_data cond");
- return VPX_CODEC_MEM_ERROR;
- }
-#endif
- // If decoding in serial mode, FrameWorker thread could create tile worker
- // thread or loopfilter thread.
- frame_worker_data->pbi->max_threads = ctx->cfg.threads;
-
- frame_worker_data->pbi->inv_tile_order = ctx->invert_tile_order;
- worker->hook = (VPxWorkerHook)frame_worker_hook;
- }
+ ctx->pbi->max_threads = ctx->cfg.threads;
+ ctx->pbi->inv_tile_order = ctx->invert_tile_order;
// If postprocessing was enabled by the application and a
// configuration has not been provided, default it.
@@ -351,7 +263,7 @@ static vpx_codec_err_t init_decoder(vpx_codec_alg_priv_t *ctx) {
static INLINE void check_resync(vpx_codec_alg_priv_t *const ctx,
const VP9Decoder *const pbi) {
- // Clear resync flag if worker got a key frame or intra only frame.
+ // Clear resync flag if the decoder got a key frame or intra only frame.
if (ctx->need_resync == 1 && pbi->need_resync == 0 &&
(pbi->common.intra_only || pbi->common.frame_type == KEY_FRAME))
ctx->need_resync = 0;
@@ -360,7 +272,6 @@ static INLINE void check_resync(vpx_codec_alg_priv_t *const ctx,
static vpx_codec_err_t decode_one(vpx_codec_alg_priv_t *ctx,
const uint8_t **data, unsigned int data_sz,
void *user_priv, int64_t deadline) {
- const VPxWorkerInterface *const winterface = vpx_get_worker_interface();
(void)deadline;
// Determine the stream parameters. Note that we rely on peek_si to
@@ -376,31 +287,22 @@ static vpx_codec_err_t decode_one(vpx_codec_alg_priv_t *ctx,
if (!ctx->si.is_kf && !is_intra_only) return VPX_CODEC_ERROR;
}
- {
- VPxWorker *const worker = ctx->frame_workers;
- FrameWorkerData *const frame_worker_data = (FrameWorkerData *)worker->data1;
- frame_worker_data->data = *data;
- frame_worker_data->data_size = data_sz;
- frame_worker_data->user_priv = user_priv;
- frame_worker_data->received_frame = 1;
-
- // Set these even if already initialized. The caller may have changed the
- // decrypt config between frames.
- frame_worker_data->pbi->decrypt_cb = ctx->decrypt_cb;
- frame_worker_data->pbi->decrypt_state = ctx->decrypt_state;
-
- worker->had_error = 0;
- winterface->execute(worker);
-
- // Update data pointer after decode.
- *data = frame_worker_data->data_end;
+ ctx->user_priv = user_priv;
- if (worker->had_error)
- return update_error_state(ctx, &frame_worker_data->pbi->common.error);
+ // Set these even if already initialized. The caller may have changed the
+ // decrypt config between frames.
+ ctx->pbi->decrypt_cb = ctx->decrypt_cb;
+ ctx->pbi->decrypt_state = ctx->decrypt_state;
- check_resync(ctx, frame_worker_data->pbi);
+ if (vp9_receive_compressed_data(ctx->pbi, data_sz, data)) {
+ ctx->pbi->cur_buf->buf.corrupted = 1;
+ ctx->pbi->need_resync = 1;
+ ctx->need_resync = 1;
+ return update_error_state(ctx, &ctx->pbi->common.error);
}
+ check_resync(ctx, ctx->pbi);
+
return VPX_CODEC_OK;
}
@@ -421,8 +323,8 @@ static vpx_codec_err_t decoder_decode(vpx_codec_alg_priv_t *ctx,
// Reset flushed when receiving a valid frame.
ctx->flushed = 0;
- // Initialize the decoder workers on the first frame.
- if (ctx->frame_workers == NULL) {
+ // Initialize the decoder on the first frame.
+ if (ctx->pbi == NULL) {
const vpx_codec_err_t res = init_decoder(ctx);
if (res != VPX_CODEC_OK) return res;
}
@@ -478,35 +380,19 @@ static vpx_image_t *decoder_get_frame(vpx_codec_alg_priv_t *ctx,
// iter acts as a flip flop, so an image is only returned on the first
// call to get_frame.
- if (*iter == NULL && ctx->frame_workers != NULL) {
+ if (*iter == NULL && ctx->pbi != NULL) {
YV12_BUFFER_CONFIG sd;
vp9_ppflags_t flags = { 0, 0, 0 };
- const VPxWorkerInterface *const winterface = vpx_get_worker_interface();
- VPxWorker *const worker = &ctx->frame_workers[0];
- FrameWorkerData *const frame_worker_data = (FrameWorkerData *)worker->data1;
if (ctx->base.init_flags & VPX_CODEC_USE_POSTPROC) set_ppflags(ctx, &flags);
- // Wait for the frame from worker thread.
- if (winterface->sync(worker)) {
- // Check if worker has received any frames.
- if (frame_worker_data->received_frame == 1) {
- frame_worker_data->received_frame = 0;
- check_resync(ctx, frame_worker_data->pbi);
- }
- if (vp9_get_raw_frame(frame_worker_data->pbi, &sd, &flags) == 0) {
- VP9_COMMON *const cm = &frame_worker_data->pbi->common;
- RefCntBuffer *const frame_bufs = cm->buffer_pool->frame_bufs;
- ctx->last_show_frame = frame_worker_data->pbi->common.new_fb_idx;
- if (ctx->need_resync) return NULL;
- yuvconfig2image(&ctx->img, &sd, frame_worker_data->user_priv);
- ctx->img.fb_priv = frame_bufs[cm->new_fb_idx].raw_frame_buffer.priv;
- img = &ctx->img;
- return img;
- }
- } else {
- // Decoding failed. Release the worker thread.
- frame_worker_data->received_frame = 0;
- ctx->need_resync = 1;
- if (ctx->flushed != 1) return NULL;
+ if (vp9_get_raw_frame(ctx->pbi, &sd, &flags) == 0) {
+ VP9_COMMON *const cm = &ctx->pbi->common;
+ RefCntBuffer *const frame_bufs = cm->buffer_pool->frame_bufs;
+ ctx->last_show_frame = ctx->pbi->common.new_fb_idx;
+ if (ctx->need_resync) return NULL;
+ yuvconfig2image(&ctx->img, &sd, ctx->user_priv);
+ ctx->img.fb_priv = frame_bufs[cm->new_fb_idx].raw_frame_buffer.priv;
+ img = &ctx->img;
+ return img;
}
}
return NULL;
@@ -517,7 +403,7 @@ static vpx_codec_err_t decoder_set_fb_fn(
vpx_release_frame_buffer_cb_fn_t cb_release, void *cb_priv) {
if (cb_get == NULL || cb_release == NULL) {
return VPX_CODEC_INVALID_PARAM;
- } else if (ctx->frame_workers == NULL) {
+ } else if (ctx->pbi == NULL) {
// If the decoder has already been initialized, do not accept changes to
// the frame buffer functions.
ctx->get_ext_fb_cb = cb_get;
@@ -536,12 +422,9 @@ static vpx_codec_err_t ctrl_set_reference(vpx_codec_alg_priv_t *ctx,
if (data) {
vpx_ref_frame_t *const frame = (vpx_ref_frame_t *)data;
YV12_BUFFER_CONFIG sd;
- VPxWorker *const worker = ctx->frame_workers;
- FrameWorkerData *const frame_worker_data = (FrameWorkerData *)worker->data1;
image2yuvconfig(&frame->img, &sd);
- return vp9_set_reference_dec(&frame_worker_data->pbi->common,
- ref_frame_to_vp9_reframe(frame->frame_type),
- &sd);
+ return vp9_set_reference_dec(
+ &ctx->pbi->common, ref_frame_to_vp9_reframe(frame->frame_type), &sd);
} else {
return VPX_CODEC_INVALID_PARAM;
}
@@ -554,11 +437,9 @@ static vpx_codec_err_t ctrl_copy_reference(vpx_codec_alg_priv_t *ctx,
if (data) {
vpx_ref_frame_t *frame = (vpx_ref_frame_t *)data;
YV12_BUFFER_CONFIG sd;
- VPxWorker *const worker = ctx->frame_workers;
- FrameWorkerData *const frame_worker_data = (FrameWorkerData *)worker->data1;
image2yuvconfig(&frame->img, &sd);
- return vp9_copy_reference_dec(frame_worker_data->pbi,
- (VP9_REFFRAME)frame->frame_type, &sd);
+ return vp9_copy_reference_dec(ctx->pbi, (VP9_REFFRAME)frame->frame_type,
+ &sd);
} else {
return VPX_CODEC_INVALID_PARAM;
}
@@ -570,9 +451,7 @@ static vpx_codec_err_t ctrl_get_reference(vpx_codec_alg_priv_t *ctx,
if (data) {
YV12_BUFFER_CONFIG *fb;
- VPxWorker *const worker = ctx->frame_workers;
- FrameWorkerData *const frame_worker_data = (FrameWorkerData *)worker->data1;
- fb = get_ref_frame(&frame_worker_data->pbi->common, data->idx);
+ fb = get_ref_frame(&ctx->pbi->common, data->idx);
if (fb == NULL) return VPX_CODEC_ERROR;
yuvconfig2image(&data->img, fb, NULL);
return VPX_CODEC_OK;
@@ -603,9 +482,8 @@ static vpx_codec_err_t ctrl_set_postproc(vpx_codec_alg_priv_t *ctx,
static vpx_codec_err_t ctrl_get_quantizer(vpx_codec_alg_priv_t *ctx,
va_list args) {
int *const arg = va_arg(args, int *);
- if (arg == NULL) return VPX_CODEC_INVALID_PARAM;
- *arg =
- ((FrameWorkerData *)ctx->frame_workers[0].data1)->pbi->common.base_qindex;
+ if (arg == NULL || ctx->pbi == NULL) return VPX_CODEC_INVALID_PARAM;
+ *arg = ctx->pbi->common.base_qindex;
return VPX_CODEC_OK;
}
@@ -614,11 +492,8 @@ static vpx_codec_err_t ctrl_get_last_ref_updates(vpx_codec_alg_priv_t *ctx,
int *const update_info = va_arg(args, int *);
if (update_info) {
- if (ctx->frame_workers) {
- VPxWorker *const worker = ctx->frame_workers;
- FrameWorkerData *const frame_worker_data =
- (FrameWorkerData *)worker->data1;
- *update_info = frame_worker_data->pbi->refresh_frame_flags;
+ if (ctx->pbi != NULL) {
+ *update_info = ctx->pbi->refresh_frame_flags;
return VPX_CODEC_OK;
} else {
return VPX_CODEC_ERROR;
@@ -633,14 +508,9 @@ static vpx_codec_err_t ctrl_get_frame_corrupted(vpx_codec_alg_priv_t *ctx,
int *corrupted = va_arg(args, int *);
if (corrupted) {
- if (ctx->frame_workers) {
- VPxWorker *const worker = ctx->frame_workers;
- FrameWorkerData *const frame_worker_data =
- (FrameWorkerData *)worker->data1;
- RefCntBuffer *const frame_bufs =
- frame_worker_data->pbi->common.buffer_pool->frame_bufs;
- if (frame_worker_data->pbi->common.frame_to_show == NULL)
- return VPX_CODEC_ERROR;
+ if (ctx->pbi != NULL) {
+ RefCntBuffer *const frame_bufs = ctx->pbi->common.buffer_pool->frame_bufs;
+ if (ctx->pbi->common.frame_to_show == NULL) return VPX_CODEC_ERROR;
if (ctx->last_show_frame >= 0)
*corrupted = frame_bufs[ctx->last_show_frame].buf.corrupted;
return VPX_CODEC_OK;
@@ -657,11 +527,8 @@ static vpx_codec_err_t ctrl_get_frame_size(vpx_codec_alg_priv_t *ctx,
int *const frame_size = va_arg(args, int *);
if (frame_size) {
- if (ctx->frame_workers) {
- VPxWorker *const worker = ctx->frame_workers;
- FrameWorkerData *const frame_worker_data =
- (FrameWorkerData *)worker->data1;
- const VP9_COMMON *const cm = &frame_worker_data->pbi->common;
+ if (ctx->pbi != NULL) {
+ const VP9_COMMON *const cm = &ctx->pbi->common;
frame_size[0] = cm->width;
frame_size[1] = cm->height;
return VPX_CODEC_OK;
@@ -678,11 +545,8 @@ static vpx_codec_err_t ctrl_get_render_size(vpx_codec_alg_priv_t *ctx,
int *const render_size = va_arg(args, int *);
if (render_size) {
- if (ctx->frame_workers) {
- VPxWorker *const worker = ctx->frame_workers;
- FrameWorkerData *const frame_worker_data =
- (FrameWorkerData *)worker->data1;
- const VP9_COMMON *const cm = &frame_worker_data->pbi->common;
+ if (ctx->pbi != NULL) {
+ const VP9_COMMON *const cm = &ctx->pbi->common;
render_size[0] = cm->render_width;
render_size[1] = cm->render_height;
return VPX_CODEC_OK;
@@ -697,13 +561,10 @@ static vpx_codec_err_t ctrl_get_render_size(vpx_codec_alg_priv_t *ctx,
static vpx_codec_err_t ctrl_get_bit_depth(vpx_codec_alg_priv_t *ctx,
va_list args) {
unsigned int *const bit_depth = va_arg(args, unsigned int *);
- VPxWorker *const worker = &ctx->frame_workers[0];
if (bit_depth) {
- if (worker) {
- FrameWorkerData *const frame_worker_data =
- (FrameWorkerData *)worker->data1;
- const VP9_COMMON *const cm = &frame_worker_data->pbi->common;
+ if (ctx->pbi != NULL) {
+ const VP9_COMMON *const cm = &ctx->pbi->common;
*bit_depth = cm->bit_depth;
return VPX_CODEC_OK;
} else {
@@ -742,10 +603,8 @@ static vpx_codec_err_t ctrl_set_byte_alignment(vpx_codec_alg_priv_t *ctx,
return VPX_CODEC_INVALID_PARAM;
ctx->byte_alignment = byte_alignment;
- if (ctx->frame_workers) {
- VPxWorker *const worker = ctx->frame_workers;
- FrameWorkerData *const frame_worker_data = (FrameWorkerData *)worker->data1;
- frame_worker_data->pbi->common.byte_alignment = byte_alignment;
+ if (ctx->pbi != NULL) {
+ ctx->pbi->common.byte_alignment = byte_alignment;
}
return VPX_CODEC_OK;
}
@@ -754,10 +613,8 @@ static vpx_codec_err_t ctrl_set_skip_loop_filter(vpx_codec_alg_priv_t *ctx,
va_list args) {
ctx->skip_loop_filter = va_arg(args, int);
- if (ctx->frame_workers) {
- VPxWorker *const worker = ctx->frame_workers;
- FrameWorkerData *const frame_worker_data = (FrameWorkerData *)worker->data1;
- frame_worker_data->pbi->common.skip_loop_filter = ctx->skip_loop_filter;
+ if (ctx->pbi != NULL) {
+ ctx->pbi->common.skip_loop_filter = ctx->skip_loop_filter;
}
return VPX_CODEC_OK;