diff options
author | John Koleszar <jkoleszar@google.com> | 2013-05-06 15:52:06 -0700 |
---|---|---|
committer | John Koleszar <jkoleszar@google.com> | 2013-05-09 17:50:12 -0700 |
commit | da58436f43095743d77f7ee84500fd22851317d8 (patch) | |
tree | 1583a075122a56b524823dba8f78a52aad4965bd /vpx_scale | |
parent | 9e327dbb76540f128cde7367b85bca05aa5863e6 (diff) | |
download | libvpx-da58436f43095743d77f7ee84500fd22851317d8.tar libvpx-da58436f43095743d77f7ee84500fd22851317d8.tar.gz libvpx-da58436f43095743d77f7ee84500fd22851317d8.tar.bz2 libvpx-da58436f43095743d77f7ee84500fd22851317d8.zip |
Subsampling aware allocs and bitstream
Make framebuffer allocations according to the chroma subsamping
factors in use. A bit is placed in the raw part of the frame header for
each of the two subsampling factors. This will be moved in a future
commit to make them part of the TBD feature set bits, probably only set
on keyframes, etc.
Change-Id: I59ed38d3a3c0d4af3c7c277617de28d04a001853
Diffstat (limited to 'vpx_scale')
-rw-r--r-- | vpx_scale/generic/yv12config.c | 88 | ||||
-rw-r--r-- | vpx_scale/yv12config.h | 8 |
2 files changed, 95 insertions, 1 deletions
diff --git a/vpx_scale/generic/yv12config.c b/vpx_scale/generic/yv12config.c index fc7f82881..cd66f0051 100644 --- a/vpx_scale/generic/yv12config.c +++ b/vpx_scale/generic/yv12config.c @@ -8,7 +8,7 @@ * be found in the AUTHORS file in the root of the source tree. */ - +#include "./vpx_config.h" #include "vpx_scale/yv12config.h" #include "vpx_mem/vpx_mem.h" @@ -97,3 +97,89 @@ int vp8_yv12_alloc_frame_buffer(YV12_BUFFER_CONFIG *ybf, } return -2; } + +#if CONFIG_VP9 +// TODO(jkoleszar): Maybe replace this with struct vpx_image + +int vp9_free_frame_buffer(YV12_BUFFER_CONFIG *ybf) { + if (ybf) { + vpx_free(ybf->buffer_alloc); + + /* buffer_alloc isn't accessed by most functions. Rather y_buffer, + u_buffer and v_buffer point to buffer_alloc and are used. Clear out + all of this so that a freed pointer isn't inadvertently used */ + vpx_memset(ybf, 0, sizeof(YV12_BUFFER_CONFIG)); + } else { + return -1; + } + + return 0; +} + +int vp9_realloc_frame_buffer(YV12_BUFFER_CONFIG *ybf, + int width, int height, + int ss_x, int ss_y, int border) { + if (ybf) { + const int aligned_width = (width + 15) & ~15; + const int aligned_height = (height + 15) & ~15; + const int y_stride = ((aligned_width + 2 * border) + 31) & ~31; + const int yplane_size = (aligned_height + 2 * border) * y_stride; + const int uv_width = aligned_width >> ss_x; + const int uv_height = aligned_height >> ss_y; + const int uv_stride = y_stride >> ss_x; + const int uv_border_w = border >> ss_x; + const int uv_border_h = border >> ss_y; + const int uvplane_size = (uv_height + 2 * uv_border_h) * uv_stride; + const int frame_size = yplane_size + 2 * uvplane_size; + + if (!ybf->buffer_alloc) { + ybf->buffer_alloc = vpx_memalign(32, frame_size); + ybf->buffer_alloc_sz = frame_size; + } + + if (!ybf->buffer_alloc || ybf->buffer_alloc_sz < frame_size) + return -1; + + /* Only support allocating buffers that have a border that's a multiple + * of 32. The border restriction is required to get 16-byte alignment of + * the start of the chroma rows without intoducing an arbitrary gap + * between planes, which would break the semantics of things like + * vpx_img_set_rect(). */ + if (border & 0x1f) + return -3; + + ybf->y_crop_width = width; + ybf->y_crop_height = height; + ybf->y_width = aligned_width; + ybf->y_height = aligned_height; + ybf->y_stride = y_stride; + + ybf->uv_width = uv_width; + ybf->uv_height = uv_height; + ybf->uv_stride = uv_stride; + + ybf->border = border; + ybf->frame_size = frame_size; + + 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->corrupted = 0; /* assume not currupted by errors */ + return 0; + } + return -2; +} + +int vp9_alloc_frame_buffer(YV12_BUFFER_CONFIG *ybf, + int width, int height, + int ss_x, int ss_y, int border) { + if (ybf) { + vp9_free_frame_buffer(ybf); + return vp9_realloc_frame_buffer(ybf, width, height, ss_x, ss_y, border); + } + return -2; +} +#endif diff --git a/vpx_scale/yv12config.h b/vpx_scale/yv12config.h index 22df3999e..85396c00e 100644 --- a/vpx_scale/yv12config.h +++ b/vpx_scale/yv12config.h @@ -72,6 +72,14 @@ extern "C" { int width, int height, int border); int vp8_yv12_de_alloc_frame_buffer(YV12_BUFFER_CONFIG *ybf); + int vp9_alloc_frame_buffer(YV12_BUFFER_CONFIG *ybf, + int width, int height, int ss_x, int ss_y, + int border); + int vp9_realloc_frame_buffer(YV12_BUFFER_CONFIG *ybf, + int width, int height, int ss_x, int ss_y, + int border); + int vp9_free_frame_buffer(YV12_BUFFER_CONFIG *ybf); + #ifdef __cplusplus } #endif |