| Index: source/libvpx/vp9/vp9_dx_iface.c
|
| ===================================================================
|
| --- source/libvpx/vp9/vp9_dx_iface.c (revision 263011)
|
| +++ source/libvpx/vp9/vp9_dx_iface.c (working copy)
|
| @@ -8,45 +8,32 @@
|
| * be found in the AUTHORS file in the root of the source tree.
|
| */
|
|
|
| -
|
| #include <stdlib.h>
|
| #include <string.h>
|
| -#include "vpx/vpx_decoder.h"
|
| -#include "vpx/vp8dx.h"
|
| -#include "vpx/internal/vpx_codec_internal.h"
|
| +
|
| #include "./vpx_version.h"
|
| +
|
| +#include "vpx/internal/vpx_codec_internal.h"
|
| +#include "vpx/vp8dx.h"
|
| +#include "vpx/vpx_decoder.h"
|
| +
|
| #include "vp9/common/vp9_frame_buffers.h"
|
| -#include "vp9/decoder/vp9_onyxd.h"
|
| -#include "vp9/decoder/vp9_onyxd_int.h"
|
| +
|
| +#include "vp9/decoder/vp9_decoder.h"
|
| #include "vp9/decoder/vp9_read_bit_buffer.h"
|
| +
|
| #include "vp9/vp9_iface_common.h"
|
|
|
| #define VP9_CAP_POSTPROC (CONFIG_VP9_POSTPROC ? VPX_CODEC_CAP_POSTPROC : 0)
|
| -typedef vpx_codec_stream_info_t vp9_stream_info_t;
|
|
|
| -/* Structures for handling memory allocations */
|
| -typedef enum {
|
| - VP9_SEG_ALG_PRIV = 256,
|
| - VP9_SEG_MAX
|
| -} mem_seg_id_t;
|
| -#define NELEMENTS(x) ((int)(sizeof(x)/sizeof(x[0])))
|
| +typedef vpx_codec_stream_info_t vp9_stream_info_t;
|
|
|
| -static unsigned long priv_sz(const vpx_codec_dec_cfg_t *si,
|
| - vpx_codec_flags_t flags);
|
| -
|
| -static const mem_req_t vp9_mem_req_segs[] = {
|
| - {VP9_SEG_ALG_PRIV, 0, 8, VPX_CODEC_MEM_ZERO, priv_sz},
|
| - {VP9_SEG_MAX, 0, 0, 0, NULL}
|
| -};
|
| -
|
| struct vpx_codec_alg_priv {
|
| vpx_codec_priv_t base;
|
| - vpx_codec_mmap_t mmaps[NELEMENTS(vp9_mem_req_segs) - 1];
|
| vpx_codec_dec_cfg_t cfg;
|
| vp9_stream_info_t si;
|
| - int defer_alloc;
|
| int decoder_init;
|
| - struct VP9Decompressor *pbi;
|
| + struct VP9Decoder *pbi;
|
| int postproc_cfg_set;
|
| vp8_postproc_cfg_t postproc_cfg;
|
| #if CONFIG_POSTPROC_VISUALIZER
|
| @@ -67,87 +54,55 @@
|
| vpx_release_frame_buffer_cb_fn_t release_ext_fb_cb;
|
| };
|
|
|
| -static unsigned long priv_sz(const vpx_codec_dec_cfg_t *si,
|
| - vpx_codec_flags_t flags) {
|
| - /* Although this declaration is constant, we can't use it in the requested
|
| - * segments list because we want to define the requested segments list
|
| - * before defining the private type (so that the number of memory maps is
|
| - * known)
|
| - */
|
| - (void)si;
|
| - return sizeof(vpx_codec_alg_priv_t);
|
| -}
|
| -
|
| -static void vp9_init_ctx(vpx_codec_ctx_t *ctx, const vpx_codec_mmap_t *mmap) {
|
| - int i;
|
| -
|
| - ctx->priv = mmap->base;
|
| - ctx->priv->sz = sizeof(*ctx->priv);
|
| - ctx->priv->iface = ctx->iface;
|
| - ctx->priv->alg_priv = mmap->base;
|
| -
|
| - for (i = 0; i < NELEMENTS(ctx->priv->alg_priv->mmaps); i++)
|
| - ctx->priv->alg_priv->mmaps[i].id = vp9_mem_req_segs[i].id;
|
| -
|
| - ctx->priv->alg_priv->mmaps[0] = *mmap;
|
| - ctx->priv->alg_priv->si.sz = sizeof(ctx->priv->alg_priv->si);
|
| - ctx->priv->init_flags = ctx->init_flags;
|
| -
|
| - if (ctx->config.dec) {
|
| - /* Update the reference to the config structure to an internal copy. */
|
| - ctx->priv->alg_priv->cfg = *ctx->config.dec;
|
| - ctx->config.dec = &ctx->priv->alg_priv->cfg;
|
| - }
|
| -}
|
| -
|
| -static void vp9_finalize_mmaps(vpx_codec_alg_priv_t *ctx) {
|
| - /* nothing to clean up */
|
| -}
|
| -
|
| -static vpx_codec_err_t vp9_init(vpx_codec_ctx_t *ctx,
|
| - vpx_codec_priv_enc_mr_cfg_t *data) {
|
| - vpx_codec_err_t res = VPX_CODEC_OK;
|
| -
|
| +static vpx_codec_err_t decoder_init(vpx_codec_ctx_t *ctx,
|
| + vpx_codec_priv_enc_mr_cfg_t *data) {
|
| // This function only allocates space for the vpx_codec_alg_priv_t
|
| // structure. More memory may be required at the time the stream
|
| // information becomes known.
|
| if (!ctx->priv) {
|
| - vpx_codec_mmap_t mmap;
|
| + vpx_codec_alg_priv_t *alg_priv = vpx_memalign(32, sizeof(*alg_priv));
|
| + if (alg_priv == NULL)
|
| + return VPX_CODEC_MEM_ERROR;
|
|
|
| - mmap.id = vp9_mem_req_segs[0].id;
|
| - mmap.sz = sizeof(vpx_codec_alg_priv_t);
|
| - mmap.align = vp9_mem_req_segs[0].align;
|
| - mmap.flags = vp9_mem_req_segs[0].flags;
|
| + vp9_zero(*alg_priv);
|
|
|
| - res = vpx_mmap_alloc(&mmap);
|
| - if (!res) {
|
| - vp9_init_ctx(ctx, &mmap);
|
| + ctx->priv = (vpx_codec_priv_t *)alg_priv;
|
| + ctx->priv->sz = sizeof(*ctx->priv);
|
| + ctx->priv->iface = ctx->iface;
|
| + ctx->priv->alg_priv = alg_priv;
|
| + ctx->priv->alg_priv->si.sz = sizeof(ctx->priv->alg_priv->si);
|
| + ctx->priv->init_flags = ctx->init_flags;
|
|
|
| - ctx->priv->alg_priv->defer_alloc = 1;
|
| + if (ctx->config.dec) {
|
| + // Update the reference to the config structure to an internal copy.
|
| + ctx->priv->alg_priv->cfg = *ctx->config.dec;
|
| + ctx->config.dec = &ctx->priv->alg_priv->cfg;
|
| }
|
| }
|
|
|
| - return res;
|
| + return VPX_CODEC_OK;
|
| }
|
|
|
| -static vpx_codec_err_t vp9_destroy(vpx_codec_alg_priv_t *ctx) {
|
| - int i;
|
| -
|
| - vp9_remove_decompressor(ctx->pbi);
|
| -
|
| - for (i = NELEMENTS(ctx->mmaps) - 1; i >= 0; i--) {
|
| - if (ctx->mmaps[i].dtor)
|
| - ctx->mmaps[i].dtor(&ctx->mmaps[i]);
|
| +static vpx_codec_err_t decoder_destroy(vpx_codec_alg_priv_t *ctx) {
|
| + if (ctx->pbi) {
|
| + vp9_decoder_remove(ctx->pbi);
|
| + ctx->pbi = NULL;
|
| }
|
|
|
| + vpx_free(ctx);
|
| +
|
| return VPX_CODEC_OK;
|
| }
|
|
|
| -static vpx_codec_err_t vp9_peek_si(const uint8_t *data, unsigned int data_sz,
|
| - vpx_codec_stream_info_t *si) {
|
| - if (data_sz <= 8) return VPX_CODEC_UNSUP_BITSTREAM;
|
| - if (data + data_sz <= data) return VPX_CODEC_INVALID_PARAM;
|
| +static vpx_codec_err_t decoder_peek_si(const uint8_t *data,
|
| + unsigned int data_sz,
|
| + vpx_codec_stream_info_t *si) {
|
| + if (data_sz <= 8)
|
| + return VPX_CODEC_UNSUP_BITSTREAM;
|
|
|
| + if (data + data_sz <= data)
|
| + return VPX_CODEC_INVALID_PARAM;
|
| +
|
| si->is_kf = 0;
|
| si->w = si->h = 0;
|
|
|
| @@ -204,8 +159,8 @@
|
| return VPX_CODEC_OK;
|
| }
|
|
|
| -static vpx_codec_err_t vp9_get_si(vpx_codec_alg_priv_t *ctx,
|
| - vpx_codec_stream_info_t *si) {
|
| +static vpx_codec_err_t decoder_get_si(vpx_codec_alg_priv_t *ctx,
|
| + vpx_codec_stream_info_t *si) {
|
| const size_t sz = (si->sz >= sizeof(vp9_stream_info_t))
|
| ? sizeof(vp9_stream_info_t)
|
| : sizeof(vpx_codec_stream_info_t);
|
| @@ -215,7 +170,6 @@
|
| return VPX_CODEC_OK;
|
| }
|
|
|
| -
|
| static vpx_codec_err_t update_error_state(vpx_codec_alg_priv_t *ctx,
|
| const struct vpx_internal_error_info *error) {
|
| if (error->error_code)
|
| @@ -224,149 +178,122 @@
|
| return error->error_code;
|
| }
|
|
|
| -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) {
|
| - vpx_codec_err_t res = VPX_CODEC_OK;
|
| +static void init_buffer_callbacks(vpx_codec_alg_priv_t *ctx) {
|
| + VP9_COMMON *const cm = &ctx->pbi->common;
|
|
|
| - ctx->img_avail = 0;
|
| + cm->new_fb_idx = -1;
|
|
|
| - /* Determine the stream parameters. Note that we rely on peek_si to
|
| - * validate that we have a buffer that does not wrap around the top
|
| - * of the heap.
|
| - */
|
| - if (!ctx->si.h)
|
| - res = ctx->base.iface->dec.peek_si(*data, data_sz, &ctx->si);
|
| + if (ctx->get_ext_fb_cb != NULL && ctx->release_ext_fb_cb != NULL) {
|
| + cm->get_fb_cb = ctx->get_ext_fb_cb;
|
| + cm->release_fb_cb = ctx->release_ext_fb_cb;
|
| + cm->cb_priv = ctx->ext_priv;
|
| + } else {
|
| + cm->get_fb_cb = vp9_get_frame_buffer;
|
| + cm->release_fb_cb = vp9_release_frame_buffer;
|
|
|
| + if (vp9_alloc_internal_frame_buffers(&cm->int_frame_buffers))
|
| + vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
|
| + "Failed to initialize internal frame buffers");
|
|
|
| - /* Perform deferred allocations, if required */
|
| - if (!res && ctx->defer_alloc) {
|
| - int i;
|
| + cm->cb_priv = &cm->int_frame_buffers;
|
| + }
|
| +}
|
|
|
| - for (i = 1; !res && i < NELEMENTS(ctx->mmaps); i++) {
|
| - vpx_codec_dec_cfg_t cfg;
|
| +static void set_default_ppflags(vp8_postproc_cfg_t *cfg) {
|
| + cfg->post_proc_flag = VP8_DEBLOCK | VP8_DEMACROBLOCK;
|
| + cfg->deblocking_level = 4;
|
| + cfg->noise_level = 0;
|
| +}
|
|
|
| - cfg.w = ctx->si.w;
|
| - cfg.h = ctx->si.h;
|
| - ctx->mmaps[i].id = vp9_mem_req_segs[i].id;
|
| - ctx->mmaps[i].sz = vp9_mem_req_segs[i].sz;
|
| - ctx->mmaps[i].align = vp9_mem_req_segs[i].align;
|
| - ctx->mmaps[i].flags = vp9_mem_req_segs[i].flags;
|
| +static void set_ppflags(const vpx_codec_alg_priv_t *ctx,
|
| + vp9_ppflags_t *flags) {
|
| + flags->post_proc_flag =
|
| +#if CONFIG_POSTPROC_VISUALIZER
|
| + (ctx->dbg_color_ref_frame_flag ? VP9D_DEBUG_CLR_FRM_REF_BLKS : 0) |
|
| + (ctx->dbg_color_mb_modes_flag ? VP9D_DEBUG_CLR_BLK_MODES : 0) |
|
| + (ctx->dbg_color_b_modes_flag ? VP9D_DEBUG_CLR_BLK_MODES : 0) |
|
| + (ctx->dbg_display_mv_flag ? VP9D_DEBUG_DRAW_MV : 0) |
|
| +#endif
|
| + ctx->postproc_cfg.post_proc_flag;
|
|
|
| - if (!ctx->mmaps[i].sz)
|
| - ctx->mmaps[i].sz = vp9_mem_req_segs[i].calc_sz(&cfg,
|
| - ctx->base.init_flags);
|
| + flags->deblocking_level = ctx->postproc_cfg.deblocking_level;
|
| + flags->noise_level = ctx->postproc_cfg.noise_level;
|
| +#if CONFIG_POSTPROC_VISUALIZER
|
| + flags->display_ref_frame_flag = ctx->dbg_color_ref_frame_flag;
|
| + flags->display_mb_modes_flag = ctx->dbg_color_mb_modes_flag;
|
| + flags->display_b_modes_flag = ctx->dbg_color_b_modes_flag;
|
| + flags->display_mv_flag = ctx->dbg_display_mv_flag;
|
| +#endif
|
| +}
|
|
|
| - res = vpx_mmap_alloc(&ctx->mmaps[i]);
|
| - }
|
| +static void init_decoder(vpx_codec_alg_priv_t *ctx) {
|
| + VP9D_CONFIG oxcf;
|
| + oxcf.width = ctx->si.w;
|
| + oxcf.height = ctx->si.h;
|
| + oxcf.version = 9;
|
| + oxcf.max_threads = ctx->cfg.threads;
|
| + oxcf.inv_tile_order = ctx->invert_tile_order;
|
|
|
| - if (!res)
|
| - vp9_finalize_mmaps(ctx);
|
| + ctx->pbi = vp9_decoder_create(&oxcf);
|
| + if (ctx->pbi == NULL)
|
| + return;
|
|
|
| - ctx->defer_alloc = 0;
|
| - }
|
| + vp9_initialize_dec();
|
|
|
| - /* Initialize the decoder instance on the first frame*/
|
| - if (!res && !ctx->decoder_init) {
|
| - res = vpx_validate_mmaps(&ctx->si, ctx->mmaps,
|
| - vp9_mem_req_segs, NELEMENTS(vp9_mem_req_segs),
|
| - ctx->base.init_flags);
|
| + // If postprocessing was enabled by the application and a
|
| + // configuration has not been provided, default it.
|
| + if (!ctx->postproc_cfg_set &&
|
| + (ctx->base.init_flags & VPX_CODEC_USE_POSTPROC))
|
| + set_default_ppflags(&ctx->postproc_cfg);
|
|
|
| - if (!res) {
|
| - VP9D_CONFIG oxcf;
|
| - struct VP9Decompressor *optr;
|
| + init_buffer_callbacks(ctx);
|
| +}
|
|
|
| - vp9_initialize_dec();
|
| +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) {
|
| + YV12_BUFFER_CONFIG sd = { 0 };
|
| + int64_t time_stamp = 0, time_end_stamp = 0;
|
| + vp9_ppflags_t flags = {0};
|
| + VP9_COMMON *cm = NULL;
|
|
|
| - oxcf.width = ctx->si.w;
|
| - oxcf.height = ctx->si.h;
|
| - oxcf.version = 9;
|
| - oxcf.postprocess = 0;
|
| - oxcf.max_threads = ctx->cfg.threads;
|
| - oxcf.inv_tile_order = ctx->invert_tile_order;
|
| - optr = vp9_create_decompressor(&oxcf);
|
| + ctx->img_avail = 0;
|
|
|
| - // If postprocessing was enabled by the application and a
|
| - // configuration has not been provided, default it.
|
| - if (!ctx->postproc_cfg_set &&
|
| - (ctx->base.init_flags & VPX_CODEC_USE_POSTPROC)) {
|
| - ctx->postproc_cfg.post_proc_flag = VP8_DEBLOCK | VP8_DEMACROBLOCK;
|
| - ctx->postproc_cfg.deblocking_level = 4;
|
| - ctx->postproc_cfg.noise_level = 0;
|
| - }
|
| + // Determine the stream parameters. Note that we rely on peek_si to
|
| + // validate that we have a buffer that does not wrap around the top
|
| + // of the heap.
|
| + if (!ctx->si.h) {
|
| + const vpx_codec_err_t res =
|
| + ctx->base.iface->dec.peek_si(*data, data_sz, &ctx->si);
|
| + if (res != VPX_CODEC_OK)
|
| + return res;
|
| + }
|
|
|
| - if (!optr) {
|
| - res = VPX_CODEC_ERROR;
|
| - } else {
|
| - VP9D_COMP *const pbi = (VP9D_COMP*)optr;
|
| - VP9_COMMON *const cm = &pbi->common;
|
| + // Initialize the decoder instance on the first frame
|
| + if (!ctx->decoder_init) {
|
| + init_decoder(ctx);
|
| + if (ctx->pbi == NULL)
|
| + return VPX_CODEC_ERROR;
|
|
|
| - // Set index to not initialized.
|
| - cm->new_fb_idx = -1;
|
| -
|
| - if (ctx->get_ext_fb_cb != NULL && ctx->release_ext_fb_cb != NULL) {
|
| - cm->get_fb_cb = ctx->get_ext_fb_cb;
|
| - cm->release_fb_cb = ctx->release_ext_fb_cb;
|
| - cm->cb_priv = ctx->ext_priv;
|
| - } else {
|
| - cm->get_fb_cb = vp9_get_frame_buffer;
|
| - cm->release_fb_cb = vp9_release_frame_buffer;
|
| -
|
| - if (vp9_alloc_internal_frame_buffers(&cm->int_frame_buffers))
|
| - vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
|
| - "Failed to initialize internal frame buffers");
|
| - cm->cb_priv = &cm->int_frame_buffers;
|
| - }
|
| -
|
| - ctx->pbi = optr;
|
| - }
|
| - }
|
| -
|
| ctx->decoder_init = 1;
|
| }
|
|
|
| - if (!res && ctx->pbi) {
|
| - YV12_BUFFER_CONFIG sd;
|
| - int64_t time_stamp = 0, time_end_stamp = 0;
|
| - vp9_ppflags_t flags = {0};
|
| + cm = &ctx->pbi->common;
|
|
|
| - if (ctx->base.init_flags & VPX_CODEC_USE_POSTPROC) {
|
| - flags.post_proc_flag =
|
| -#if CONFIG_POSTPROC_VISUALIZER
|
| - (ctx->dbg_color_ref_frame_flag ? VP9D_DEBUG_CLR_FRM_REF_BLKS : 0) |
|
| - (ctx->dbg_color_mb_modes_flag ? VP9D_DEBUG_CLR_BLK_MODES : 0) |
|
| - (ctx->dbg_color_b_modes_flag ? VP9D_DEBUG_CLR_BLK_MODES : 0) |
|
| - (ctx->dbg_display_mv_flag ? VP9D_DEBUG_DRAW_MV : 0) |
|
| -#endif
|
| - ctx->postproc_cfg.post_proc_flag;
|
| + if (vp9_receive_compressed_data(ctx->pbi, data_sz, data, deadline))
|
| + return update_error_state(ctx, &cm->error);
|
|
|
| - flags.deblocking_level = ctx->postproc_cfg.deblocking_level;
|
| - flags.noise_level = ctx->postproc_cfg.noise_level;
|
| -#if CONFIG_POSTPROC_VISUALIZER
|
| - flags.display_ref_frame_flag = ctx->dbg_color_ref_frame_flag;
|
| - flags.display_mb_modes_flag = ctx->dbg_color_mb_modes_flag;
|
| - flags.display_b_modes_flag = ctx->dbg_color_b_modes_flag;
|
| - flags.display_mv_flag = ctx->dbg_display_mv_flag;
|
| -#endif
|
| - }
|
| + if (ctx->base.init_flags & VPX_CODEC_USE_POSTPROC)
|
| + set_ppflags(ctx, &flags);
|
|
|
| - if (vp9_receive_compressed_data(ctx->pbi, data_sz, data, deadline)) {
|
| - VP9D_COMP *pbi = (VP9D_COMP*)ctx->pbi;
|
| - res = update_error_state(ctx, &pbi->common.error);
|
| - }
|
| + if (vp9_get_raw_frame(ctx->pbi, &sd, &time_stamp, &time_end_stamp, &flags))
|
| + return update_error_state(ctx, &cm->error);
|
|
|
| - if (!res && 0 == vp9_get_raw_frame(ctx->pbi, &sd, &time_stamp,
|
| - &time_end_stamp, &flags)) {
|
| - VP9D_COMP *const pbi = (VP9D_COMP*)ctx->pbi;
|
| - VP9_COMMON *const cm = &pbi->common;
|
| - yuvconfig2image(&ctx->img, &sd, user_priv);
|
| + yuvconfig2image(&ctx->img, &sd, user_priv);
|
| + ctx->img.fb_priv = cm->frame_bufs[cm->new_fb_idx].raw_frame_buffer.priv;
|
| + ctx->img_avail = 1;
|
|
|
| - ctx->img.fb_priv = cm->frame_bufs[cm->new_fb_idx].raw_frame_buffer.priv;
|
| - ctx->img_avail = 1;
|
| - }
|
| - }
|
| -
|
| - return res;
|
| + return VPX_CODEC_OK;
|
| }
|
|
|
| static void parse_superframe_index(const uint8_t *data, size_t data_sz,
|
| @@ -385,7 +312,7 @@
|
| if (data_sz >= index_sz && data[data_sz - index_sz] == marker) {
|
| // found a valid superframe index
|
| uint32_t i, j;
|
| - const uint8_t *x = data + data_sz - index_sz + 1;
|
| + const uint8_t *x = &data[data_sz - index_sz + 1];
|
|
|
| for (i = 0; i < frames; i++) {
|
| uint32_t this_sz = 0;
|
| @@ -400,18 +327,17 @@
|
| }
|
| }
|
|
|
| -static vpx_codec_err_t vp9_decode(vpx_codec_alg_priv_t *ctx,
|
| - const uint8_t *data,
|
| - unsigned int data_sz,
|
| - void *user_priv,
|
| - long deadline) {
|
| +static vpx_codec_err_t decoder_decode(vpx_codec_alg_priv_t *ctx,
|
| + const uint8_t *data, unsigned int data_sz,
|
| + void *user_priv, long deadline) {
|
| const uint8_t *data_start = data;
|
| const uint8_t *data_end = data + data_sz;
|
| - vpx_codec_err_t res = 0;
|
| + vpx_codec_err_t res = VPX_CODEC_OK;
|
| uint32_t sizes[8];
|
| int frames_this_pts, frame_count = 0;
|
|
|
| - if (data == NULL || data_sz == 0) return VPX_CODEC_INVALID_PARAM;
|
| + if (data == NULL || data_sz == 0)
|
| + return VPX_CODEC_INVALID_PARAM;
|
|
|
| parse_superframe_index(data, data_sz, sizes, &frames_this_pts);
|
|
|
| @@ -450,27 +376,27 @@
|
| assert(data_start >= data);
|
| assert(data_start <= data_end);
|
|
|
| - /* Early exit if there was a decode error */
|
| + // Early exit if there was a decode error
|
| if (res)
|
| break;
|
|
|
| - /* Account for suboptimal termination by the encoder. */
|
| + // Account for suboptimal termination by the encoder.
|
| while (data_start < data_end && *data_start == 0)
|
| data_start++;
|
|
|
| data_sz = (unsigned int)(data_end - data_start);
|
| } while (data_start < data_end);
|
| +
|
| return res;
|
| }
|
|
|
| -static vpx_image_t *vp9_get_frame(vpx_codec_alg_priv_t *ctx,
|
| - vpx_codec_iter_t *iter) {
|
| +static vpx_image_t *decoder_get_frame(vpx_codec_alg_priv_t *ctx,
|
| + vpx_codec_iter_t *iter) {
|
| vpx_image_t *img = NULL;
|
|
|
| if (ctx->img_avail) {
|
| - /* iter acts as a flip flop, so an image is only returned on the first
|
| - * call to get_frame.
|
| - */
|
| + // iter acts as a flip flop, so an image is only returned on the first
|
| + // call to get_frame.
|
| if (!(*iter)) {
|
| img = &ctx->img;
|
| *iter = img;
|
| @@ -481,7 +407,7 @@
|
| return img;
|
| }
|
|
|
| -static vpx_codec_err_t vp9_set_fb_fn(
|
| +static vpx_codec_err_t decoder_set_fb_fn(
|
| vpx_codec_alg_priv_t *ctx,
|
| vpx_get_frame_buffer_cb_fn_t cb_get,
|
| vpx_release_frame_buffer_cb_fn_t cb_release, void *cb_priv) {
|
| @@ -499,93 +425,24 @@
|
| return VPX_CODEC_ERROR;
|
| }
|
|
|
| -static vpx_codec_err_t vp9_xma_get_mmap(const vpx_codec_ctx_t *ctx,
|
| - vpx_codec_mmap_t *mmap,
|
| - vpx_codec_iter_t *iter) {
|
| - vpx_codec_err_t res;
|
| - const mem_req_t *seg_iter = *iter;
|
| +static vpx_codec_err_t ctrl_set_reference(vpx_codec_alg_priv_t *ctx,
|
| + int ctr_id, va_list args) {
|
| + vpx_ref_frame_t *const data = va_arg(args, vpx_ref_frame_t *);
|
|
|
| - /* Get address of next segment request */
|
| - do {
|
| - if (!seg_iter)
|
| - seg_iter = vp9_mem_req_segs;
|
| - else if (seg_iter->id != VP9_SEG_MAX)
|
| - seg_iter++;
|
| -
|
| - *iter = (vpx_codec_iter_t)seg_iter;
|
| -
|
| - if (seg_iter->id != VP9_SEG_MAX) {
|
| - mmap->id = seg_iter->id;
|
| - mmap->sz = seg_iter->sz;
|
| - mmap->align = seg_iter->align;
|
| - mmap->flags = seg_iter->flags;
|
| -
|
| - if (!seg_iter->sz)
|
| - mmap->sz = seg_iter->calc_sz(ctx->config.dec, ctx->init_flags);
|
| -
|
| - res = VPX_CODEC_OK;
|
| - } else {
|
| - res = VPX_CODEC_LIST_END;
|
| - }
|
| - } while (!mmap->sz && res != VPX_CODEC_LIST_END);
|
| -
|
| - return res;
|
| -}
|
| -
|
| -static vpx_codec_err_t vp9_xma_set_mmap(vpx_codec_ctx_t *ctx,
|
| - const vpx_codec_mmap_t *mmap) {
|
| - vpx_codec_err_t res = VPX_CODEC_MEM_ERROR;
|
| - int i, done;
|
| -
|
| - if (!ctx->priv) {
|
| - if (mmap->id == VP9_SEG_ALG_PRIV) {
|
| - if (!ctx->priv) {
|
| - vp9_init_ctx(ctx, mmap);
|
| - res = VPX_CODEC_OK;
|
| - }
|
| - }
|
| - }
|
| -
|
| - done = 1;
|
| -
|
| - if (!res && ctx->priv->alg_priv) {
|
| - for (i = 0; i < NELEMENTS(ctx->priv->alg_priv->mmaps); i++) {
|
| - if (ctx->priv->alg_priv->mmaps[i].id == mmap->id)
|
| - if (!ctx->priv->alg_priv->mmaps[i].base) {
|
| - ctx->priv->alg_priv->mmaps[i] = *mmap;
|
| - res = VPX_CODEC_OK;
|
| - }
|
| -
|
| - done &= (ctx->priv->alg_priv->mmaps[i].base != NULL);
|
| - }
|
| - }
|
| -
|
| - if (done && !res) {
|
| - vp9_finalize_mmaps(ctx->priv->alg_priv);
|
| - res = ctx->iface->init(ctx, NULL);
|
| - }
|
| -
|
| - return res;
|
| -}
|
| -
|
| -static vpx_codec_err_t set_reference(vpx_codec_alg_priv_t *ctx, int ctr_id,
|
| - va_list args) {
|
| - vpx_ref_frame_t *data = va_arg(args, vpx_ref_frame_t *);
|
| -
|
| if (data) {
|
| - vpx_ref_frame_t *frame = (vpx_ref_frame_t *)data;
|
| + vpx_ref_frame_t *const frame = (vpx_ref_frame_t *)data;
|
| YV12_BUFFER_CONFIG sd;
|
|
|
| image2yuvconfig(&frame->img, &sd);
|
| - return vp9_set_reference_dec(ctx->pbi,
|
| + return vp9_set_reference_dec(&ctx->pbi->common,
|
| (VP9_REFFRAME)frame->frame_type, &sd);
|
| } else {
|
| return VPX_CODEC_INVALID_PARAM;
|
| }
|
| }
|
|
|
| -static vpx_codec_err_t copy_reference(vpx_codec_alg_priv_t *ctx, int ctr_id,
|
| - va_list args) {
|
| +static vpx_codec_err_t ctrl_copy_reference(vpx_codec_alg_priv_t *ctx,
|
| + int ctr_id, va_list args) {
|
| vpx_ref_frame_t *data = va_arg(args, vpx_ref_frame_t *);
|
|
|
| if (data) {
|
| @@ -601,8 +458,8 @@
|
| }
|
| }
|
|
|
| -static vpx_codec_err_t get_reference(vpx_codec_alg_priv_t *ctx, int ctr_id,
|
| - va_list args) {
|
| +static vpx_codec_err_t ctrl_get_reference(vpx_codec_alg_priv_t *ctx,
|
| + int ctr_id, va_list args) {
|
| vp9_ref_frame_t *data = va_arg(args, vp9_ref_frame_t *);
|
|
|
| if (data) {
|
| @@ -616,8 +473,8 @@
|
| }
|
| }
|
|
|
| -static vpx_codec_err_t set_postproc(vpx_codec_alg_priv_t *ctx, int ctr_id,
|
| - va_list args) {
|
| +static vpx_codec_err_t ctrl_set_postproc(vpx_codec_alg_priv_t *ctx,
|
| + int ctr_id, va_list args) {
|
| #if CONFIG_VP9_POSTPROC
|
| vp8_postproc_cfg_t *data = va_arg(args, vp8_postproc_cfg_t *);
|
|
|
| @@ -633,8 +490,8 @@
|
| #endif
|
| }
|
|
|
| -static vpx_codec_err_t set_dbg_options(vpx_codec_alg_priv_t *ctx, int ctrl_id,
|
| - va_list args) {
|
| +static vpx_codec_err_t ctrl_set_dbg_options(vpx_codec_alg_priv_t *ctx,
|
| + int ctrl_id, va_list args) {
|
| #if CONFIG_POSTPROC_VISUALIZER && CONFIG_POSTPROC
|
| int data = va_arg(args, int);
|
|
|
| @@ -653,14 +510,15 @@
|
| #endif
|
| }
|
|
|
| -static vpx_codec_err_t get_last_ref_updates(vpx_codec_alg_priv_t *ctx,
|
| - int ctrl_id, va_list args) {
|
| - int *update_info = va_arg(args, int *);
|
| - VP9D_COMP *pbi = (VP9D_COMP*)ctx->pbi;
|
| +static vpx_codec_err_t ctrl_get_last_ref_updates(vpx_codec_alg_priv_t *ctx,
|
| + int ctrl_id, va_list args) {
|
| + int *const update_info = va_arg(args, int *);
|
|
|
| if (update_info) {
|
| - *update_info = pbi->refresh_frame_flags;
|
| -
|
| + if (ctx->pbi)
|
| + *update_info = ctx->pbi->refresh_frame_flags;
|
| + else
|
| + return VPX_CODEC_ERROR;
|
| return VPX_CODEC_OK;
|
| } else {
|
| return VPX_CODEC_INVALID_PARAM;
|
| @@ -668,14 +526,13 @@
|
| }
|
|
|
|
|
| -static vpx_codec_err_t get_frame_corrupted(vpx_codec_alg_priv_t *ctx,
|
| - int ctrl_id, va_list args) {
|
| +static vpx_codec_err_t ctrl_get_frame_corrupted(vpx_codec_alg_priv_t *ctx,
|
| + int ctrl_id, va_list args) {
|
| int *corrupted = va_arg(args, int *);
|
|
|
| if (corrupted) {
|
| - VP9D_COMP *pbi = (VP9D_COMP*)ctx->pbi;
|
| - if (pbi)
|
| - *corrupted = pbi->common.frame_to_show->corrupted;
|
| + if (ctx->pbi)
|
| + *corrupted = ctx->pbi->common.frame_to_show->corrupted;
|
| else
|
| return VPX_CODEC_ERROR;
|
| return VPX_CODEC_OK;
|
| @@ -684,15 +541,15 @@
|
| }
|
| }
|
|
|
| -static vpx_codec_err_t get_display_size(vpx_codec_alg_priv_t *ctx,
|
| - int ctrl_id, va_list args) {
|
| +static vpx_codec_err_t ctrl_get_display_size(vpx_codec_alg_priv_t *ctx,
|
| + int ctrl_id, va_list args) {
|
| int *const display_size = va_arg(args, int *);
|
|
|
| if (display_size) {
|
| - const VP9D_COMP *const pbi = (VP9D_COMP*)ctx->pbi;
|
| - if (pbi) {
|
| - display_size[0] = pbi->common.display_width;
|
| - display_size[1] = pbi->common.display_height;
|
| + if (ctx->pbi) {
|
| + const VP9_COMMON *const cm = &ctx->pbi->common;
|
| + display_size[0] = cm->display_width;
|
| + display_size[1] = cm->display_height;
|
| } else {
|
| return VPX_CODEC_ERROR;
|
| }
|
| @@ -702,30 +559,33 @@
|
| }
|
| }
|
|
|
| -static vpx_codec_err_t set_invert_tile_order(vpx_codec_alg_priv_t *ctx,
|
| - int ctr_id,
|
| - va_list args) {
|
| +static vpx_codec_err_t ctrl_set_invert_tile_order(vpx_codec_alg_priv_t *ctx,
|
| + int ctr_id, va_list args) {
|
| ctx->invert_tile_order = va_arg(args, int);
|
| return VPX_CODEC_OK;
|
| }
|
|
|
| -static vpx_codec_ctrl_fn_map_t ctf_maps[] = {
|
| - {VP8_SET_REFERENCE, set_reference},
|
| - {VP8_COPY_REFERENCE, copy_reference},
|
| - {VP8_SET_POSTPROC, set_postproc},
|
| - {VP8_SET_DBG_COLOR_REF_FRAME, set_dbg_options},
|
| - {VP8_SET_DBG_COLOR_MB_MODES, set_dbg_options},
|
| - {VP8_SET_DBG_COLOR_B_MODES, set_dbg_options},
|
| - {VP8_SET_DBG_DISPLAY_MV, set_dbg_options},
|
| - {VP8D_GET_LAST_REF_UPDATES, get_last_ref_updates},
|
| - {VP8D_GET_FRAME_CORRUPTED, get_frame_corrupted},
|
| - {VP9_GET_REFERENCE, get_reference},
|
| - {VP9D_GET_DISPLAY_SIZE, get_display_size},
|
| - {VP9_INVERT_TILE_DECODE_ORDER, set_invert_tile_order},
|
| +static vpx_codec_ctrl_fn_map_t decoder_ctrl_maps[] = {
|
| + {VP8_COPY_REFERENCE, ctrl_copy_reference},
|
| +
|
| + // Setters
|
| + {VP8_SET_REFERENCE, ctrl_set_reference},
|
| + {VP8_SET_POSTPROC, ctrl_set_postproc},
|
| + {VP8_SET_DBG_COLOR_REF_FRAME, ctrl_set_dbg_options},
|
| + {VP8_SET_DBG_COLOR_MB_MODES, ctrl_set_dbg_options},
|
| + {VP8_SET_DBG_COLOR_B_MODES, ctrl_set_dbg_options},
|
| + {VP8_SET_DBG_DISPLAY_MV, ctrl_set_dbg_options},
|
| + {VP9_INVERT_TILE_DECODE_ORDER, ctrl_set_invert_tile_order},
|
| +
|
| + // Getters
|
| + {VP8D_GET_LAST_REF_UPDATES, ctrl_get_last_ref_updates},
|
| + {VP8D_GET_FRAME_CORRUPTED, ctrl_get_frame_corrupted},
|
| + {VP9_GET_REFERENCE, ctrl_get_reference},
|
| + {VP9D_GET_DISPLAY_SIZE, ctrl_get_display_size},
|
| +
|
| { -1, NULL},
|
| };
|
|
|
| -
|
| #ifndef VERSION_STRING
|
| #define VERSION_STRING
|
| #endif
|
| @@ -733,22 +593,20 @@
|
| "WebM Project VP9 Decoder" VERSION_STRING,
|
| VPX_CODEC_INTERNAL_ABI_VERSION,
|
| VPX_CODEC_CAP_DECODER | VP9_CAP_POSTPROC |
|
| - VPX_CODEC_CAP_EXTERNAL_FRAME_BUFFER,
|
| - /* vpx_codec_caps_t caps; */
|
| - vp9_init, /* vpx_codec_init_fn_t init; */
|
| - vp9_destroy, /* vpx_codec_destroy_fn_t destroy; */
|
| - ctf_maps, /* vpx_codec_ctrl_fn_map_t *ctrl_maps; */
|
| - vp9_xma_get_mmap, /* vpx_codec_get_mmap_fn_t get_mmap; */
|
| - vp9_xma_set_mmap, /* vpx_codec_set_mmap_fn_t set_mmap; */
|
| + VPX_CODEC_CAP_EXTERNAL_FRAME_BUFFER, // vpx_codec_caps_t
|
| + decoder_init, // vpx_codec_init_fn_t
|
| + decoder_destroy, // vpx_codec_destroy_fn_t
|
| + decoder_ctrl_maps, // vpx_codec_ctrl_fn_map_t
|
| + NOT_IMPLEMENTED, // vpx_codec_get_mmap_fn_t
|
| + NOT_IMPLEMENTED, // vpx_codec_set_mmap_fn_t
|
| { // NOLINT
|
| - vp9_peek_si, /* vpx_codec_peek_si_fn_t peek_si; */
|
| - vp9_get_si, /* vpx_codec_get_si_fn_t get_si; */
|
| - vp9_decode, /* vpx_codec_decode_fn_t decode; */
|
| - vp9_get_frame, /* vpx_codec_frame_get_fn_t frame_get; */
|
| - vp9_set_fb_fn, /* vpx_codec_set_fb_fn_t set_fb_fn; */
|
| + decoder_peek_si, // vpx_codec_peek_si_fn_t
|
| + decoder_get_si, // vpx_codec_get_si_fn_t
|
| + decoder_decode, // vpx_codec_decode_fn_t
|
| + decoder_get_frame, // vpx_codec_frame_get_fn_t
|
| + decoder_set_fb_fn, // vpx_codec_set_fb_fn_t
|
| },
|
| { // NOLINT
|
| - /* encoder functions */
|
| NOT_IMPLEMENTED,
|
| NOT_IMPLEMENTED,
|
| NOT_IMPLEMENTED,
|
|
|