| // Copyright 2019 Joe Drago. All rights reserved. | |
| // SPDX-License-Identifier: BSD-2-Clause | |
| #include "avif/internal.h" | |
| #include <string.h> | |
| avifResult avifRWDataRealloc(avifRWData * raw, size_t newSize) | |
| { | |
| if (raw->size != newSize) { | |
| if (newSize == 0) { | |
| // avifAlloc(0) returns NULL, so handle the shrink-to-zero case by freeing the buffer. | |
| avifRWDataFree(raw); | |
| return AVIF_RESULT_OK; | |
| } | |
| uint8_t * newData = (uint8_t *)avifAlloc(newSize); | |
| AVIF_CHECKERR(newData, AVIF_RESULT_OUT_OF_MEMORY); | |
| if (raw->size) { | |
| memcpy(newData, raw->data, AVIF_MIN(raw->size, newSize)); | |
| } | |
| avifFree(raw->data); | |
| raw->data = newData; | |
| raw->size = newSize; | |
| } | |
| return AVIF_RESULT_OK; | |
| } | |
| avifResult avifRWDataSet(avifRWData * raw, const uint8_t * data, size_t len) | |
| { | |
| if (len) { | |
| AVIF_CHECKRES(avifRWDataRealloc(raw, len)); | |
| memcpy(raw->data, data, len); | |
| } else { | |
| avifRWDataFree(raw); | |
| } | |
| return AVIF_RESULT_OK; | |
| } | |
| void avifRWDataFree(avifRWData * raw) | |
| { | |
| avifFree(raw->data); | |
| raw->data = NULL; | |
| raw->size = 0; | |
| } |