int vp8_yv12_de_alloc_frame_buffer(YV12_BUFFER_CONFIG *ybf) {
if (ybf) { // If libvpx is using frame buffer callbacks then buffer_alloc_sz must // not be set.
if (ybf->buffer_alloc_sz > 0) {
vpx_free(ybf->buffer_alloc);
}
/* buffer_alloc isn't accessed by most functions. Rather y_buffer, u_bufferandv_bufferpointtobuffer_allocandareused.Clearout
all of this so that a freed pointer isn't inadvertently used */
memset(ybf, 0, sizeof(YV12_BUFFER_CONFIG));
} else { return -1;
}
return0;
}
int vp8_yv12_realloc_frame_buffer(YV12_BUFFER_CONFIG *ybf, int width,
int height, int border) {
if (ybf) {
int aligned_width = (width + 15) & ~15;
int aligned_height = (height + 15) & ~15;
int y_stride = ((aligned_width + 2 * border) + 31) & ~31;
int yplane_size = (aligned_height + 2 * border) * y_stride;
int uv_width = aligned_width >> 1;
int uv_height = aligned_height >> 1; /** There is currently a bunch of code which assumes
* uv_stride == y_stride/2, so enforce this here. */
int uv_stride = y_stride >> 1;
int uvplane_size = (uv_height + border) * uv_stride; const size_t frame_size = yplane_size + 2 * uvplane_size;
if (!ybf->buffer_alloc) {
ybf->buffer_alloc = (uint8_t *)vpx_memalign(32, frame_size);
if (!ybf->buffer_alloc) {
ybf->buffer_alloc_sz = 0; return -1;
} #ifdefined(__has_feature) #if __has_feature(memory_sanitizer) // This memset is needed for fixing the issue of using uninitialized // value in msan test. It will cause a perf loss, so only do this for // msan test.
memset(ybf->buffer_alloc, 0, frame_size); #endif #endif
ybf->buffer_alloc_sz = frame_size;
}
if (ybf->buffer_alloc_sz < frame_size) return -1;
/* Only support allocating buffers that have a border that's a multiple *of32.Theborderrestrictionisrequiredtoget16-bytealignmentof *thestartofthechromarowswithoutintroducinganarbitrarygap *betweenplanes,whichwouldbreakthesemanticsofthingslike
* vpx_img_set_rect(). */
if (border & 0x1f) return -3;
ybf->corrupted = 0; /* assume not currupted by errors */ return0;
} return -2;
}
int vp8_yv12_alloc_frame_buffer(YV12_BUFFER_CONFIG *ybf, int width, int height,
int border) {
if (ybf) {
vp8_yv12_de_alloc_frame_buffer(ybf); return vp8_yv12_realloc_frame_buffer(ybf, width, height, border);
} return -2;
}
#if CONFIG_VP9 // TODO(jkoleszar): Maybe replace this with struct vpx_image
int vpx_free_frame_buffer(YV12_BUFFER_CONFIG *ybf) {
if (ybf) {
if (ybf->buffer_alloc_sz > 0) {
vpx_free(ybf->buffer_alloc);
}
/* buffer_alloc isn't accessed by most functions. Rather y_buffer, u_bufferandv_bufferpointtobuffer_allocandareused.Clearout
all of this so that a freed pointer isn't inadvertently used */
memset(ybf, 0, sizeof(YV12_BUFFER_CONFIG));
} else { return -1;
}
return0;
}
int vpx_realloc_frame_buffer(YV12_BUFFER_CONFIG *ybf, int width, int height,
int ss_x, int ss_y, #if CONFIG_VP9_HIGHBITDEPTH
int use_highbitdepth, #endif
int border, int byte_alignment,
vpx_codec_frame_buffer_t *fb,
vpx_get_frame_buffer_cb_fn_t cb, void *cb_priv) { #if CONFIG_SIZE_LIMIT
if (width > DECODE_WIDTH_LIMIT || height > DECODE_HEIGHT_LIMIT) return -1; #endif
/* Only support allocating buffers that have a border that's a multiple *of32.Theborderrestrictionisrequiredtoget16-bytealignmentof *thestartofthechromarowswithoutintroducinganarbitrarygap *betweenplanes,whichwouldbreakthesemanticsofthingslike
* vpx_img_set_rect(). */
if (border & 0x1f) return -3;
#ifdefined(VPX_MAX_ALLOCABLE_MEMORY) // The decoder may allocate REF_FRAMES frame buffers in the frame buffer // pool. Bound the total amount of allocated memory as if these REF_FRAMES // frame buffers were allocated in a single allocation.
if (frame_size > VPX_MAX_ALLOCABLE_MEMORY / REF_FRAMES) return -1; #endif// VPX_MAX_ALLOCABLE_MEMORY
#if UINT64_MAX > SIZE_MAX // frame_size is stored in buffer_alloc_sz, which is a size_t. If it won't // fit, fail early.
if (frame_size > SIZE_MAX) { return -1;
} #endif
if (cb != NULL) { const int align_addr_extra_size = 31; const uint64_t external_frame_size = frame_size + align_addr_extra_size;
assert(fb != NULL);
if (external_frame_size != (size_t)external_frame_size) return -1;
// Allocation to hold larger frame, or first allocation.
if (cb(cb_priv, (size_t)external_frame_size, fb) < 0) return -1;
if (fb->data == NULL || fb->size < external_frame_size) return -1;
#ifdefined(__has_feature) #if __has_feature(memory_sanitizer) // This memset is needed for fixing the issue of using uninitialized // value in msan test. It will cause a perf loss, so only do this for // msan test.
memset(ybf->buffer_alloc, 0, (size_t)frame_size); #endif #endif
} else if (frame_size > ybf->buffer_alloc_sz) { // Allocation to hold larger frame, or first allocation.
vpx_free(ybf->buffer_alloc);
ybf->buffer_alloc = NULL;
ybf->buffer_alloc_sz = 0;
ybf->buffer_alloc = (uint8_t *)vpx_memalign(32, (size_t)frame_size);
if (!ybf->buffer_alloc) return -1;
ybf->buffer_alloc_sz = (size_t)frame_size;
// This memset is needed for fixing valgrind error from C loop filter // due to access uninitialized memory in frame border. It could be // removed if border is totally removed.
memset(ybf->buffer_alloc, 0, ybf->buffer_alloc_sz);
}
ybf->corrupted = 0; /* assume not corrupted by errors */ return0;
} return -2;
}
int vpx_alloc_frame_buffer(YV12_BUFFER_CONFIG *ybf, int width, int height,
int ss_x, int ss_y, #if CONFIG_VP9_HIGHBITDEPTH
int use_highbitdepth, #endif
int border, int byte_alignment) {
if (ybf) {
vpx_free_frame_buffer(ybf); return vpx_realloc_frame_buffer(ybf, width, height, ss_x, ss_y, #if CONFIG_VP9_HIGHBITDEPTH
use_highbitdepth, #endif
border, byte_alignment, NULL, NULL, NULL);
} return -2;
} #endif
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.18 Sekunden
(vorverarbeitet am 2026-08-26)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.