diff options
author | John Koleszar <jkoleszar@google.com> | 2012-11-15 12:19:07 -0800 |
---|---|---|
committer | John Koleszar <jkoleszar@google.com> | 2012-11-15 15:48:07 -0800 |
commit | 64bcffc1ec56da76e4fe631cf31fbc091cc49392 (patch) | |
tree | 47a73124d14238dee82822bac3113ddd5593ede7 /vp9/vp9_dx_iface.c | |
parent | 08b43fef3a72c3b1790d66b2410b7fa71677c1a4 (diff) | |
download | libvpx-64bcffc1ec56da76e4fe631cf31fbc091cc49392.tar libvpx-64bcffc1ec56da76e4fe631cf31fbc091cc49392.tar.gz libvpx-64bcffc1ec56da76e4fe631cf31fbc091cc49392.tar.bz2 libvpx-64bcffc1ec56da76e4fe631cf31fbc091cc49392.zip |
Pack invisible frames without lengths
Modify the decoder to return the ending position of the bool decoder and
use that as the starting position for the next frame.
The constant-space algorithm for parsing the appended frame lengths is
O(n^2), which is a potential DoS concern if n is unbounded. Revisit
the appended lengths for use as partition lengths when multipartition
support is added.
In addition, this allows decoding of raw streams outside of a container
without additional framing information, though it's insufficient to
be able to remux said stream into a container.
Change-Id: I71e801a9c3e37abe559a56a597635b0cbae1934b
Diffstat (limited to 'vp9/vp9_dx_iface.c')
-rw-r--r-- | vp9/vp9_dx_iface.c | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/vp9/vp9_dx_iface.c b/vp9/vp9_dx_iface.c index c85b423b2..74321560f 100644 --- a/vp9/vp9_dx_iface.c +++ b/vp9/vp9_dx_iface.c @@ -303,11 +303,11 @@ static void yuvconfig2image(vpx_image_t *img, img->self_allocd = 0; } -static vpx_codec_err_t vp8_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 decode_one(vpx_codec_alg_priv_t *ctx, + const uint8_t **data, + unsigned int data_sz, + void *user_priv, + long deadline) { vpx_codec_err_t res = VPX_CODEC_OK; ctx->img_avail = 0; @@ -317,7 +317,7 @@ static vpx_codec_err_t vp8_decode(vpx_codec_alg_priv_t *ctx, * of the heap. */ if (!ctx->si.h) - res = ctx->base.iface->dec.peek_si(data, data_sz, &ctx->si); + res = ctx->base.iface->dec.peek_si(*data, data_sz, &ctx->si); /* Perform deferred allocations, if required */ @@ -424,6 +424,33 @@ static vpx_codec_err_t vp8_decode(vpx_codec_alg_priv_t *ctx, return res; } +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) { + const uint8_t *data_start = data; + const uint8_t *data_end = data + data_sz; + vpx_codec_err_t res; + + do { + 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. */ + while (data_start < data_end && *data_start == 0) + data_start++; + + data_sz = data_end - data_start; + } while (data_start < data_end); + return res; +} + static vpx_image_t *vp8_get_frame(vpx_codec_alg_priv_t *ctx, vpx_codec_iter_t *iter) { vpx_image_t *img = NULL; @@ -672,7 +699,7 @@ CODEC_INTERFACE(vpx_codec_vp9_dx) = { { vp8_peek_si, /* vpx_codec_peek_si_fn_t peek_si; */ vp8_get_si, /* vpx_codec_get_si_fn_t get_si; */ - vp8_decode, /* vpx_codec_decode_fn_t decode; */ + vp9_decode, /* vpx_codec_decode_fn_t decode; */ vp8_get_frame, /* vpx_codec_frame_get_fn_t frame_get; */ }, { |