| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2010 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 | 10 |
| 11 | 11 |
| 12 #include "vpx_scale/yv12config.h" | 12 #include "vpx_scale/yv12config.h" |
| 13 #include "vpx_mem/vpx_mem.h" | 13 #include "vpx_mem/vpx_mem.h" |
| 14 | 14 |
| 15 /**************************************************************************** | 15 /**************************************************************************** |
| 16 * Exports | 16 * Exports |
| 17 ****************************************************************************/ | 17 ****************************************************************************/ |
| 18 | 18 |
| 19 /**************************************************************************** | 19 /**************************************************************************** |
| 20 * | 20 * |
| 21 ****************************************************************************/ | 21 ****************************************************************************/ |
| 22 int | 22 int |
| 23 vp8_yv12_de_alloc_frame_buffer(YV12_BUFFER_CONFIG *ybf) | 23 vp8_yv12_de_alloc_frame_buffer(YV12_BUFFER_CONFIG *ybf) |
| 24 { | 24 { |
| 25 if (ybf) | 25 if (ybf) |
| 26 { | 26 { |
| 27 duck_free(ybf->buffer_alloc); | 27 vpx_free(ybf->buffer_alloc); |
| 28 | 28 |
| 29 ybf->buffer_alloc = 0; | 29 /* buffer_alloc isn't accessed by most functions. Rather y_buffer, |
| 30 u_buffer and v_buffer point to buffer_alloc and are used. Clear out |
| 31 all of this so that a freed pointer isn't inadvertently used */ |
| 32 vpx_memset (ybf, 0, sizeof (YV12_BUFFER_CONFIG)); |
| 30 } | 33 } |
| 31 else | 34 else |
| 32 { | 35 { |
| 33 return -1; | 36 return -1; |
| 34 } | 37 } |
| 35 | 38 |
| 36 return 0; | 39 return 0; |
| 37 } | 40 } |
| 38 | 41 |
| 39 /**************************************************************************** | 42 /**************************************************************************** |
| 40 * | 43 * |
| 41 ****************************************************************************/ | 44 ****************************************************************************/ |
| 42 int | 45 int |
| 43 vp8_yv12_alloc_frame_buffer(YV12_BUFFER_CONFIG *ybf, int width, int height, int
border) | 46 vp8_yv12_alloc_frame_buffer(YV12_BUFFER_CONFIG *ybf, int width, int height, int
border) |
| 44 { | 47 { |
| 45 /*NOTE:*/ | 48 /*NOTE:*/ |
| 46 | 49 |
| 47 int yplane_size = (height + 2 * border) * (width + 2 * border); | |
| 48 int uvplane_size = ((1 + height) / 2 + border) * ((1 + width) / 2 + border); | |
| 49 | |
| 50 if (ybf) | 50 if (ybf) |
| 51 { | 51 { |
| 52 int y_stride = ((width + 2 * border) + 31) & ~31; |
| 53 int yplane_size = (height + 2 * border) * y_stride; |
| 54 int uv_width = width >> 1; |
| 55 int uv_height = height >> 1; |
| 56 /** There is currently a bunch of code which assumes |
| 57 * uv_stride == y_stride/2, so enforce this here. */ |
| 58 int uv_stride = y_stride >> 1; |
| 59 int uvplane_size = (uv_height + border) * uv_stride; |
| 60 |
| 52 vp8_yv12_de_alloc_frame_buffer(ybf); | 61 vp8_yv12_de_alloc_frame_buffer(ybf); |
| 53 | 62 |
| 63 /** Only support allocating buffers that have a height and width that |
| 64 * are multiples of 16, and a border that's a multiple of 32. |
| 65 * The border restriction is required to get 16-byte alignment of the |
| 66 * start of the chroma rows without intoducing an arbitrary gap |
| 67 * between planes, which would break the semantics of things like |
| 68 * vpx_img_set_rect(). */ |
| 69 if ((width & 0xf) | (height & 0xf) | (border & 0x1f)) |
| 70 return -3; |
| 71 |
| 54 ybf->y_width = width; | 72 ybf->y_width = width; |
| 55 ybf->y_height = height; | 73 ybf->y_height = height; |
| 56 ybf->y_stride = width + 2 * border; | 74 ybf->y_stride = y_stride; |
| 57 | 75 |
| 58 ybf->uv_width = (1 + width) / 2; | 76 ybf->uv_width = uv_width; |
| 59 ybf->uv_height = (1 + height) / 2; | 77 ybf->uv_height = uv_height; |
| 60 ybf->uv_stride = ybf->uv_width + border; | 78 ybf->uv_stride = uv_stride; |
| 61 | 79 |
| 62 ybf->border = border; | 80 ybf->border = border; |
| 63 ybf->frame_size = yplane_size + 2 * uvplane_size; | 81 ybf->frame_size = yplane_size + 2 * uvplane_size; |
| 64 | 82 |
| 65 /* Added 2 extra lines to framebuffer so that copy12x12 doesn't fail | 83 ybf->buffer_alloc = (unsigned char *) vpx_memalign(32, ybf->frame_size); |
| 66 * when we have a large motion vector in V on the last v block. | |
| 67 * Note : We never use these pixels anyway so this doesn't hurt. | |
| 68 */ | |
| 69 ybf->buffer_alloc = (unsigned char *) duck_memalign(32, ybf->frame_size
+ (ybf->y_stride * 2) + 32, 0); | |
| 70 | 84 |
| 71 if (ybf->buffer_alloc == NULL) | 85 if (ybf->buffer_alloc == NULL) |
| 72 return -1; | 86 return -1; |
| 73 | 87 |
| 74 ybf->y_buffer = ybf->buffer_alloc + (border * ybf->y_stride) + border; | 88 ybf->y_buffer = ybf->buffer_alloc + (border * y_stride) + border; |
| 75 | 89 ybf->u_buffer = ybf->buffer_alloc + yplane_size + (border / 2 * uv_stri
de) + border / 2; |
| 76 if (yplane_size & 0xf) | 90 ybf->v_buffer = ybf->buffer_alloc + yplane_size + uvplane_size + (border
/ 2 * uv_stride) + border / 2; |
| 77 yplane_size += 16 - (yplane_size & 0xf); | |
| 78 | |
| 79 ybf->u_buffer = ybf->buffer_alloc + yplane_size + (border / 2 * ybf->uv
_stride) + border / 2; | |
| 80 ybf->v_buffer = ybf->buffer_alloc + yplane_size + uvplane_size + (border
/ 2 * ybf->uv_stride) + border / 2; | |
| 81 | 91 |
| 82 ybf->corrupted = 0; /* assume not currupted by errors */ | 92 ybf->corrupted = 0; /* assume not currupted by errors */ |
| 83 } | 93 } |
| 84 else | 94 else |
| 85 { | 95 { |
| 86 return -2; | 96 return -2; |
| 87 } | 97 } |
| 88 | 98 |
| 89 return 0; | 99 return 0; |
| 90 } | 100 } |
| OLD | NEW |