| Index: source/libvpx/vp9/encoder/vp9_lookahead.c
|
| ===================================================================
|
| --- source/libvpx/vp9/encoder/vp9_lookahead.c (revision 263011)
|
| +++ source/libvpx/vp9/encoder/vp9_lookahead.c (working copy)
|
| @@ -28,8 +28,8 @@
|
|
|
|
|
| /* Return the buffer at the given absolute index and increment the index */
|
| -static struct lookahead_entry * pop(struct lookahead_ctx *ctx,
|
| - unsigned int *idx) {
|
| +static struct lookahead_entry *pop(struct lookahead_ctx *ctx,
|
| + unsigned int *idx) {
|
| unsigned int index = *idx;
|
| struct lookahead_entry *buf = ctx->buf + index;
|
|
|
| @@ -55,16 +55,19 @@
|
| }
|
|
|
|
|
| -struct lookahead_ctx * vp9_lookahead_init(unsigned int width,
|
| - unsigned int height,
|
| - unsigned int subsampling_x,
|
| - unsigned int subsampling_y,
|
| - unsigned int depth) {
|
| +struct lookahead_ctx *vp9_lookahead_init(unsigned int width,
|
| + unsigned int height,
|
| + unsigned int subsampling_x,
|
| + unsigned int subsampling_y,
|
| + unsigned int depth) {
|
| struct lookahead_ctx *ctx = NULL;
|
|
|
| // Clamp the lookahead queue depth
|
| depth = clamp(depth, 1, MAX_LAG_BUFFERS);
|
|
|
| + // Allocate memory to keep previous source frames available.
|
| + depth += MAX_PRE_FRAMES;
|
| +
|
| // Allocate the lookahead structures
|
| ctx = calloc(1, sizeof(*ctx));
|
| if (ctx) {
|
| @@ -96,7 +99,7 @@
|
| int mb_cols = (src->y_width + 15) >> 4;
|
| #endif
|
|
|
| - if (ctx->sz + 1 > ctx->max_sz)
|
| + if (ctx->sz + 1 + MAX_PRE_FRAMES > ctx->max_sz)
|
| return 1;
|
| ctx->sz++;
|
| buf = pop(ctx, &ctx->write_idx);
|
| @@ -159,11 +162,11 @@
|
| }
|
|
|
|
|
| -struct lookahead_entry * vp9_lookahead_pop(struct lookahead_ctx *ctx,
|
| - int drain) {
|
| +struct lookahead_entry *vp9_lookahead_pop(struct lookahead_ctx *ctx,
|
| + int drain) {
|
| struct lookahead_entry *buf = NULL;
|
|
|
| - if (ctx->sz && (drain || ctx->sz == ctx->max_sz)) {
|
| + if (ctx->sz && (drain || ctx->sz == ctx->max_sz - MAX_PRE_FRAMES)) {
|
| buf = pop(ctx, &ctx->read_idx);
|
| ctx->sz--;
|
| }
|
| @@ -171,16 +174,28 @@
|
| }
|
|
|
|
|
| -struct lookahead_entry * vp9_lookahead_peek(struct lookahead_ctx *ctx,
|
| - int index) {
|
| +struct lookahead_entry *vp9_lookahead_peek(struct lookahead_ctx *ctx,
|
| + int index) {
|
| struct lookahead_entry *buf = NULL;
|
|
|
| - if (index < (int)ctx->sz) {
|
| - index += ctx->read_idx;
|
| - if (index >= (int)ctx->max_sz)
|
| - index -= ctx->max_sz;
|
| - buf = ctx->buf + index;
|
| + if (index >= 0) {
|
| + // Forward peek
|
| + if (index < (int)ctx->sz) {
|
| + index += ctx->read_idx;
|
| + if (index >= (int)ctx->max_sz)
|
| + index -= ctx->max_sz;
|
| + buf = ctx->buf + index;
|
| + }
|
| + } else if (index < 0) {
|
| + // Backward peek
|
| + if (-index <= MAX_PRE_FRAMES) {
|
| + index += ctx->read_idx;
|
| + if (index < 0)
|
| + index += ctx->max_sz;
|
| + buf = ctx->buf + index;
|
| + }
|
| }
|
| +
|
| return buf;
|
| }
|
|
|
|
|