summaryrefslogtreecommitdiff
path: root/libavutil/hdr_dynamic_metadata.c
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2023-04-01 12:12:11 -0300
committerJames Almer <jamrial@gmail.com>2023-04-05 09:47:12 -0300
commit61b27b15fc924d7fa35baa61cfbc91568945f5db (patch)
treec4e769a30e53f30515fb1c118ffe6a4f19209beb /libavutil/hdr_dynamic_metadata.c
parent1c2a1e07500017c873a318fe2f49011f35c1f534 (diff)
downloadffmpeg-61b27b15fc924d7fa35baa61cfbc91568945f5db.tar.gz
avutil/hdr_dynamic_metadata: allow av_dynamic_hdr_plus_to_t35() to accept an existing buffer
The function now accepts an existing buffer to avoid unnecessary allocations, as well as only reporting the needed amount of bytes if you pass a NULL pointer as input for data. For this, both parameters become input and output, as well as making data optional. This is backwards compatible, and as such not breaking any existing use of the function in external code (if there's any). Signed-off-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavutil/hdr_dynamic_metadata.c')
-rw-r--r--libavutil/hdr_dynamic_metadata.c28
1 files changed, 20 insertions, 8 deletions
diff --git a/libavutil/hdr_dynamic_metadata.c b/libavutil/hdr_dynamic_metadata.c
index d458788c32..7033f060c0 100644
--- a/libavutil/hdr_dynamic_metadata.c
+++ b/libavutil/hdr_dynamic_metadata.c
@@ -18,14 +18,13 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include "avassert.h"
#include "hdr_dynamic_metadata.h"
#include "mem.h"
#include "libavcodec/defs.h"
#include "libavcodec/get_bits.h"
#include "libavcodec/put_bits.h"
-#define T35_PAYLOAD_MAX_SIZE 907
-
static const int64_t luminance_den = 1;
static const int32_t peak_luminance_den = 15;
static const int64_t rgb_den = 100000;
@@ -62,14 +61,14 @@ AVDynamicHDRPlus *av_dynamic_hdr_plus_create_side_data(AVFrame *frame)
int av_dynamic_hdr_plus_from_t35(AVDynamicHDRPlus *s, const uint8_t *data,
size_t size)
{
- uint8_t padded_buf[T35_PAYLOAD_MAX_SIZE + AV_INPUT_BUFFER_PADDING_SIZE];
+ uint8_t padded_buf[AV_HDR_PLUS_MAX_PAYLOAD_SIZE + AV_INPUT_BUFFER_PADDING_SIZE];
GetBitContext gbc, *gb = &gbc;
int ret;
if (!s)
return AVERROR(ENOMEM);
- if (size > T35_PAYLOAD_MAX_SIZE)
+ if (size > AV_HDR_PLUS_MAX_PAYLOAD_SIZE)
return AVERROR(EINVAL);
memcpy(padded_buf, data, size);
@@ -243,8 +242,10 @@ int av_dynamic_hdr_plus_to_t35(const AVDynamicHDRPlus *s, uint8_t **data, size_t
size_t size_bits, size_bytes;
PutBitContext pbc, *pb = &pbc;
- if (!s || !data)
+ if (!s)
return AVERROR(EINVAL);
+ if ((!data || *data) && !size)
+ return AVERROR(EINVAL);
/**
* Buffer size per CTA-861-H p.253-254:
@@ -296,9 +297,20 @@ int av_dynamic_hdr_plus_to_t35(const AVDynamicHDRPlus *s, uint8_t **data, size_t
size_bytes = (size_bits + 7) / 8;
- buf = av_mallocz(size_bytes);
- if (!buf)
- return AVERROR(ENOMEM);
+ av_assert0(size_bytes <= AV_HDR_PLUS_MAX_PAYLOAD_SIZE);
+
+ if (!data) {
+ *size = size_bytes;
+ return 0;
+ } else if (*data) {
+ if (*size < size_bytes)
+ return AVERROR_BUFFER_TOO_SMALL;
+ buf = *data;
+ } else {
+ buf = av_malloc(size_bytes);
+ if (!buf)
+ return AVERROR(ENOMEM);
+ }
init_put_bits(pb, buf, size_bytes);