Index: source/libvpx/vp9/vp9_dx_iface.c |
=================================================================== |
--- source/libvpx/vp9/vp9_dx_iface.c (revision 271012) |
+++ source/libvpx/vp9/vp9_dx_iface.c (working copy) |
@@ -46,7 +46,6 @@ |
vpx_decrypt_cb decrypt_cb; |
void *decrypt_state; |
vpx_image_t img; |
- int img_setup; |
int img_avail; |
int invert_tile_order; |
@@ -245,17 +244,13 @@ |
} |
static void init_decoder(vpx_codec_alg_priv_t *ctx) { |
- VP9DecoderConfig 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; |
- |
- ctx->pbi = vp9_decoder_create(&oxcf); |
+ ctx->pbi = vp9_decoder_create(); |
if (ctx->pbi == NULL) |
return; |
+ ctx->pbi->max_threads = ctx->cfg.threads; |
+ ctx->pbi->inv_tile_order = ctx->invert_tile_order; |
+ |
vp9_initialize_dec(); |
// If postprocessing was enabled by the application and a |
@@ -375,80 +370,70 @@ |
} |
} |
+static vpx_codec_err_t decode_one_iter(vpx_codec_alg_priv_t *ctx, |
+ const uint8_t **data_start_ptr, |
+ const uint8_t *data_end, |
+ uint32_t frame_size, void *user_priv, |
+ long deadline) { |
+ const vpx_codec_err_t res = decode_one(ctx, data_start_ptr, frame_size, |
+ user_priv, deadline); |
+ if (res != VPX_CODEC_OK) |
+ return res; |
+ |
+ // Account for suboptimal termination by the encoder. |
+ while (*data_start_ptr < data_end) { |
+ const uint8_t marker = read_marker(ctx->decrypt_cb, ctx->decrypt_state, |
+ *data_start_ptr); |
+ if (marker) |
+ break; |
+ (*data_start_ptr)++; |
+ } |
+ |
+ return VPX_CODEC_OK; |
+} |
+ |
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 = VPX_CODEC_OK; |
- uint32_t sizes[8]; |
- int frames_this_pts, frame_count = 0; |
+ const uint8_t *const data_end = data + data_sz; |
+ vpx_codec_err_t res; |
+ uint32_t frame_sizes[8]; |
+ int frame_count; |
if (data == NULL || data_sz == 0) |
return VPX_CODEC_INVALID_PARAM; |
- parse_superframe_index(data, data_sz, sizes, &frames_this_pts, |
+ parse_superframe_index(data, data_sz, frame_sizes, &frame_count, |
ctx->decrypt_cb, ctx->decrypt_state); |
- do { |
- if (data_sz) { |
- uint8_t marker = read_marker(ctx->decrypt_cb, ctx->decrypt_state, |
- data_start); |
- // Skip over the superframe index, if present |
- if ((marker & 0xe0) == 0xc0) { |
- const uint32_t frames = (marker & 0x7) + 1; |
- const uint32_t mag = ((marker >> 3) & 0x3) + 1; |
- const uint32_t index_sz = 2 + mag * frames; |
+ if (frame_count > 0) { |
+ int i; |
- if (data_sz >= index_sz) { |
- uint8_t marker2 = read_marker(ctx->decrypt_cb, ctx->decrypt_state, |
- data_start + index_sz - 1); |
- if (marker2 == marker) { |
- data_start += index_sz; |
- data_sz -= index_sz; |
- if (data_start < data_end) |
- continue; |
- else |
- break; |
- } |
- } |
- } |
- } |
- |
- // Use the correct size for this frame, if an index is present. |
- if (frames_this_pts) { |
- uint32_t this_sz = sizes[frame_count]; |
- |
- if (data_sz < this_sz) { |
+ for (i = 0; i < frame_count; ++i) { |
+ const uint32_t frame_size = frame_sizes[i]; |
+ if (data_start < data || |
+ frame_size > (uint32_t)(data_end - data_start)) { |
ctx->base.err_detail = "Invalid frame size in index"; |
return VPX_CODEC_CORRUPT_FRAME; |
} |
- data_sz = this_sz; |
- frame_count++; |
+ res = decode_one_iter(ctx, &data_start, data_end, frame_size, |
+ user_priv, deadline); |
+ if (res != VPX_CODEC_OK) |
+ return res; |
} |
- |
- res = decode_one(ctx, &data_start, data_sz, user_priv, deadline); |
- assert(data_start >= data); |
- assert(data_start <= data_end); |
- |
- // Early exit if there was a decode error |
- if (res) |
- break; |
- |
- // Account for suboptimal termination by the encoder. |
+ } else { |
while (data_start < data_end) { |
- uint8_t marker3 = read_marker(ctx->decrypt_cb, ctx->decrypt_state, |
- data_start); |
- if (marker3) |
- break; |
- data_start++; |
+ res = decode_one_iter(ctx, &data_start, data_end, |
+ (uint32_t)(data_end - data_start), |
+ user_priv, deadline); |
+ if (res != VPX_CODEC_OK) |
+ return res; |
} |
+ } |
- data_sz = (unsigned int)(data_end - data_start); |
- } while (data_start < data_end); |
- |
- return res; |
+ return VPX_CODEC_OK; |
} |
static vpx_image_t *decoder_get_frame(vpx_codec_alg_priv_t *ctx, |