Index: source/libvpx/vpx_scale/generic/yv12config.c |
=================================================================== |
--- source/libvpx/vpx_scale/generic/yv12config.c (revision 291857) |
+++ source/libvpx/vpx_scale/generic/yv12config.c (working copy) |
@@ -13,6 +13,9 @@ |
#include "./vpx_config.h" |
#include "vpx_scale/yv12config.h" |
#include "vpx_mem/vpx_mem.h" |
+#if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH |
+#include "vp9/common/vp9_common.h" |
+#endif |
/**************************************************************************** |
* Exports |
@@ -136,7 +139,11 @@ |
int vp9_realloc_frame_buffer(YV12_BUFFER_CONFIG *ybf, |
int width, int height, |
- int ss_x, int ss_y, int border, |
+ int ss_x, int ss_y, |
+#if CONFIG_VP9_HIGHBITDEPTH |
+ int use_highbitdepth, |
+#endif |
+ int border, |
vpx_codec_frame_buffer_t *fb, |
vpx_get_frame_buffer_cb_fn_t cb, |
void *cb_priv) { |
@@ -161,11 +168,21 @@ |
const int alpha_border_h = border; |
const uint64_t alpha_plane_size = (alpha_height + 2 * alpha_border_h) * |
(uint64_t)alpha_stride; |
+#if CONFIG_VP9_HIGHBITDEPTH |
+ const uint64_t frame_size = (1 + use_highbitdepth) * |
+ (yplane_size + 2 * uvplane_size + alpha_plane_size); |
+#else |
const uint64_t frame_size = yplane_size + 2 * uvplane_size + |
alpha_plane_size; |
+#endif // CONFIG_VP9_HIGHBITDEPTH |
#else |
+#if CONFIG_VP9_HIGHBITDEPTH |
+ const uint64_t frame_size = |
+ (1 + use_highbitdepth) * (yplane_size + 2 * uvplane_size); |
+#else |
const uint64_t frame_size = yplane_size + 2 * uvplane_size; |
-#endif |
+#endif // CONFIG_VP9_HIGHBITDEPTH |
+#endif // CONFIG_ALPHA |
if (cb != NULL) { |
const int align_addr_extra_size = 31; |
const uint64_t external_frame_size = frame_size + align_addr_extra_size; |
@@ -231,11 +248,31 @@ |
ybf->border = border; |
ybf->frame_size = (int)frame_size; |
+#if CONFIG_VP9_HIGHBITDEPTH |
+ if (use_highbitdepth) { |
+ // Store uint16 addresses when using 16bit framebuffers |
+ uint8_t *p = CONVERT_TO_BYTEPTR(ybf->buffer_alloc); |
+ ybf->y_buffer = p + (border * y_stride) + border; |
+ ybf->u_buffer = p + yplane_size + |
+ (uv_border_h * uv_stride) + uv_border_w; |
+ ybf->v_buffer = p + yplane_size + uvplane_size + |
+ (uv_border_h * uv_stride) + uv_border_w; |
+ ybf->flags = YV12_FLAG_HIGHBITDEPTH; |
+ } else { |
+ ybf->y_buffer = ybf->buffer_alloc + (border * y_stride) + border; |
+ ybf->u_buffer = ybf->buffer_alloc + yplane_size + |
+ (uv_border_h * uv_stride) + uv_border_w; |
+ ybf->v_buffer = ybf->buffer_alloc + yplane_size + uvplane_size + |
+ (uv_border_h * uv_stride) + uv_border_w; |
+ ybf->flags = 0; |
+ } |
+#else |
ybf->y_buffer = ybf->buffer_alloc + (border * y_stride) + border; |
ybf->u_buffer = ybf->buffer_alloc + yplane_size + |
(uv_border_h * uv_stride) + uv_border_w; |
ybf->v_buffer = ybf->buffer_alloc + yplane_size + uvplane_size + |
(uv_border_h * uv_stride) + uv_border_w; |
+#endif // CONFIG_VP9_HIGHBITDEPTH |
#if CONFIG_ALPHA |
ybf->alpha_width = alpha_width; |
@@ -252,11 +289,18 @@ |
int vp9_alloc_frame_buffer(YV12_BUFFER_CONFIG *ybf, |
int width, int height, |
- int ss_x, int ss_y, int border) { |
+ int ss_x, int ss_y, |
+#if CONFIG_VP9_HIGHBITDEPTH |
+ int use_highbitdepth, |
+#endif |
+ int border) { |
if (ybf) { |
vp9_free_frame_buffer(ybf); |
- return vp9_realloc_frame_buffer(ybf, width, height, ss_x, ss_y, border, |
- NULL, NULL, NULL); |
+ return vp9_realloc_frame_buffer(ybf, width, height, ss_x, ss_y, |
+#if CONFIG_VP9_HIGHBITDEPTH |
+ use_highbitdepth, |
+#endif |
+ border, NULL, NULL, NULL); |
} |
return -2; |
} |