| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2011 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2011 The WebM project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 #include <assert.h> | 10 #include <assert.h> |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 struct lookahead_ctx { | 21 struct lookahead_ctx { |
| 22 unsigned int max_sz; /* Absolute size of the queue */ | 22 unsigned int max_sz; /* Absolute size of the queue */ |
| 23 unsigned int sz; /* Number of buffers currently in the queue */ | 23 unsigned int sz; /* Number of buffers currently in the queue */ |
| 24 unsigned int read_idx; /* Read index */ | 24 unsigned int read_idx; /* Read index */ |
| 25 unsigned int write_idx; /* Write index */ | 25 unsigned int write_idx; /* Write index */ |
| 26 struct lookahead_entry *buf; /* Buffer list */ | 26 struct lookahead_entry *buf; /* Buffer list */ |
| 27 }; | 27 }; |
| 28 | 28 |
| 29 | 29 |
| 30 /* Return the buffer at the given absolute index and increment the index */ | 30 /* Return the buffer at the given absolute index and increment the index */ |
| 31 static struct lookahead_entry * pop(struct lookahead_ctx *ctx, | 31 static struct lookahead_entry *pop(struct lookahead_ctx *ctx, |
| 32 unsigned int *idx) { | 32 unsigned int *idx) { |
| 33 unsigned int index = *idx; | 33 unsigned int index = *idx; |
| 34 struct lookahead_entry *buf = ctx->buf + index; | 34 struct lookahead_entry *buf = ctx->buf + index; |
| 35 | 35 |
| 36 assert(index < ctx->max_sz); | 36 assert(index < ctx->max_sz); |
| 37 if (++index >= ctx->max_sz) | 37 if (++index >= ctx->max_sz) |
| 38 index -= ctx->max_sz; | 38 index -= ctx->max_sz; |
| 39 *idx = index; | 39 *idx = index; |
| 40 return buf; | 40 return buf; |
| 41 } | 41 } |
| 42 | 42 |
| 43 | 43 |
| 44 void vp9_lookahead_destroy(struct lookahead_ctx *ctx) { | 44 void vp9_lookahead_destroy(struct lookahead_ctx *ctx) { |
| 45 if (ctx) { | 45 if (ctx) { |
| 46 if (ctx->buf) { | 46 if (ctx->buf) { |
| 47 unsigned int i; | 47 unsigned int i; |
| 48 | 48 |
| 49 for (i = 0; i < ctx->max_sz; i++) | 49 for (i = 0; i < ctx->max_sz; i++) |
| 50 vp9_free_frame_buffer(&ctx->buf[i].img); | 50 vp9_free_frame_buffer(&ctx->buf[i].img); |
| 51 free(ctx->buf); | 51 free(ctx->buf); |
| 52 } | 52 } |
| 53 free(ctx); | 53 free(ctx); |
| 54 } | 54 } |
| 55 } | 55 } |
| 56 | 56 |
| 57 | 57 |
| 58 struct lookahead_ctx * vp9_lookahead_init(unsigned int width, | 58 struct lookahead_ctx *vp9_lookahead_init(unsigned int width, |
| 59 unsigned int height, | 59 unsigned int height, |
| 60 unsigned int subsampling_x, | 60 unsigned int subsampling_x, |
| 61 unsigned int subsampling_y, | 61 unsigned int subsampling_y, |
| 62 unsigned int depth) { | 62 unsigned int depth) { |
| 63 struct lookahead_ctx *ctx = NULL; | 63 struct lookahead_ctx *ctx = NULL; |
| 64 | 64 |
| 65 // Clamp the lookahead queue depth | 65 // Clamp the lookahead queue depth |
| 66 depth = clamp(depth, 1, MAX_LAG_BUFFERS); | 66 depth = clamp(depth, 1, MAX_LAG_BUFFERS); |
| 67 | 67 |
| 68 // Allocate memory to keep previous source frames available. |
| 69 depth += MAX_PRE_FRAMES; |
| 70 |
| 68 // Allocate the lookahead structures | 71 // Allocate the lookahead structures |
| 69 ctx = calloc(1, sizeof(*ctx)); | 72 ctx = calloc(1, sizeof(*ctx)); |
| 70 if (ctx) { | 73 if (ctx) { |
| 71 unsigned int i; | 74 unsigned int i; |
| 72 ctx->max_sz = depth; | 75 ctx->max_sz = depth; |
| 73 ctx->buf = calloc(depth, sizeof(*ctx->buf)); | 76 ctx->buf = calloc(depth, sizeof(*ctx->buf)); |
| 74 if (!ctx->buf) | 77 if (!ctx->buf) |
| 75 goto bail; | 78 goto bail; |
| 76 for (i = 0; i < depth; i++) | 79 for (i = 0; i < depth; i++) |
| 77 if (vp9_alloc_frame_buffer(&ctx->buf[i].img, | 80 if (vp9_alloc_frame_buffer(&ctx->buf[i].img, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 89 | 92 |
| 90 int vp9_lookahead_push(struct lookahead_ctx *ctx, YV12_BUFFER_CONFIG *src, | 93 int vp9_lookahead_push(struct lookahead_ctx *ctx, YV12_BUFFER_CONFIG *src, |
| 91 int64_t ts_start, int64_t ts_end, unsigned int flags) { | 94 int64_t ts_start, int64_t ts_end, unsigned int flags) { |
| 92 struct lookahead_entry *buf; | 95 struct lookahead_entry *buf; |
| 93 #if USE_PARTIAL_COPY | 96 #if USE_PARTIAL_COPY |
| 94 int row, col, active_end; | 97 int row, col, active_end; |
| 95 int mb_rows = (src->y_height + 15) >> 4; | 98 int mb_rows = (src->y_height + 15) >> 4; |
| 96 int mb_cols = (src->y_width + 15) >> 4; | 99 int mb_cols = (src->y_width + 15) >> 4; |
| 97 #endif | 100 #endif |
| 98 | 101 |
| 99 if (ctx->sz + 1 > ctx->max_sz) | 102 if (ctx->sz + 1 + MAX_PRE_FRAMES > ctx->max_sz) |
| 100 return 1; | 103 return 1; |
| 101 ctx->sz++; | 104 ctx->sz++; |
| 102 buf = pop(ctx, &ctx->write_idx); | 105 buf = pop(ctx, &ctx->write_idx); |
| 103 | 106 |
| 104 #if USE_PARTIAL_COPY | 107 #if USE_PARTIAL_COPY |
| 105 // TODO(jkoleszar): This is disabled for now, as | 108 // TODO(jkoleszar): This is disabled for now, as |
| 106 // vp9_copy_and_extend_frame_with_rect is not subsampling/alpha aware. | 109 // vp9_copy_and_extend_frame_with_rect is not subsampling/alpha aware. |
| 107 | 110 |
| 108 // Only do this partial copy if the following conditions are all met: | 111 // Only do this partial copy if the following conditions are all met: |
| 109 // 1. Lookahead queue has has size of 1. | 112 // 1. Lookahead queue has has size of 1. |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 vp9_copy_and_extend_frame(src, &buf->img); | 155 vp9_copy_and_extend_frame(src, &buf->img); |
| 153 #endif | 156 #endif |
| 154 | 157 |
| 155 buf->ts_start = ts_start; | 158 buf->ts_start = ts_start; |
| 156 buf->ts_end = ts_end; | 159 buf->ts_end = ts_end; |
| 157 buf->flags = flags; | 160 buf->flags = flags; |
| 158 return 0; | 161 return 0; |
| 159 } | 162 } |
| 160 | 163 |
| 161 | 164 |
| 162 struct lookahead_entry * vp9_lookahead_pop(struct lookahead_ctx *ctx, | 165 struct lookahead_entry *vp9_lookahead_pop(struct lookahead_ctx *ctx, |
| 163 int drain) { | 166 int drain) { |
| 164 struct lookahead_entry *buf = NULL; | 167 struct lookahead_entry *buf = NULL; |
| 165 | 168 |
| 166 if (ctx->sz && (drain || ctx->sz == ctx->max_sz)) { | 169 if (ctx->sz && (drain || ctx->sz == ctx->max_sz - MAX_PRE_FRAMES)) { |
| 167 buf = pop(ctx, &ctx->read_idx); | 170 buf = pop(ctx, &ctx->read_idx); |
| 168 ctx->sz--; | 171 ctx->sz--; |
| 169 } | 172 } |
| 170 return buf; | 173 return buf; |
| 171 } | 174 } |
| 172 | 175 |
| 173 | 176 |
| 174 struct lookahead_entry * vp9_lookahead_peek(struct lookahead_ctx *ctx, | 177 struct lookahead_entry *vp9_lookahead_peek(struct lookahead_ctx *ctx, |
| 175 int index) { | 178 int index) { |
| 176 struct lookahead_entry *buf = NULL; | 179 struct lookahead_entry *buf = NULL; |
| 177 | 180 |
| 178 if (index < (int)ctx->sz) { | 181 if (index >= 0) { |
| 179 index += ctx->read_idx; | 182 // Forward peek |
| 180 if (index >= (int)ctx->max_sz) | 183 if (index < (int)ctx->sz) { |
| 181 index -= ctx->max_sz; | 184 index += ctx->read_idx; |
| 182 buf = ctx->buf + index; | 185 if (index >= (int)ctx->max_sz) |
| 186 index -= ctx->max_sz; |
| 187 buf = ctx->buf + index; |
| 188 } |
| 189 } else if (index < 0) { |
| 190 // Backward peek |
| 191 if (-index <= MAX_PRE_FRAMES) { |
| 192 index += ctx->read_idx; |
| 193 if (index < 0) |
| 194 index += ctx->max_sz; |
| 195 buf = ctx->buf + index; |
| 196 } |
| 183 } | 197 } |
| 198 |
| 184 return buf; | 199 return buf; |
| 185 } | 200 } |
| 186 | 201 |
| 187 unsigned int vp9_lookahead_depth(struct lookahead_ctx *ctx) { | 202 unsigned int vp9_lookahead_depth(struct lookahead_ctx *ctx) { |
| 188 return ctx->sz; | 203 return ctx->sz; |
| 189 } | 204 } |
| OLD | NEW |