* [FFmpeg-devel] [PATCH v4 01/13] avutil/frame: add AVFrameSideDataSet for passing sets of side data
2023-09-01 20:38 [FFmpeg-devel] [PATCH v4 00/13] encoder AVCodecContext configuration side data Jan Ekström
@ 2023-09-01 20:38 ` Jan Ekström
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 02/13] avutil/frame: split side data list wiping out to non-AVFrame function Jan Ekström
` (11 subsequent siblings)
12 siblings, 0 replies; 23+ messages in thread
From: Jan Ekström @ 2023-09-01 20:38 UTC (permalink / raw)
To: ffmpeg-devel
---
libavutil/frame.h | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/libavutil/frame.h b/libavutil/frame.h
index c0c1b23db7..6155226c1d 100644
--- a/libavutil/frame.h
+++ b/libavutil/frame.h
@@ -251,6 +251,14 @@ typedef struct AVFrameSideData {
AVBufferRef *buf;
} AVFrameSideData;
+/**
+ * Structure to hold a set of AVFrameSideData
+ */
+typedef struct AVFrameSideDataSet {
+ AVFrameSideData **sd;
+ int nb_sd;
+} AVFrameSideDataSet;
+
/**
* Structure describing a single Region Of Interest.
*
--
2.41.0
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 23+ messages in thread
* [FFmpeg-devel] [PATCH v4 02/13] avutil/frame: split side data list wiping out to non-AVFrame function
2023-09-01 20:38 [FFmpeg-devel] [PATCH v4 00/13] encoder AVCodecContext configuration side data Jan Ekström
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 01/13] avutil/frame: add AVFrameSideDataSet for passing sets of " Jan Ekström
@ 2023-09-01 20:38 ` Jan Ekström
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 03/13] avutil/frame: add helper for uninitializing side data sets Jan Ekström
` (10 subsequent siblings)
12 siblings, 0 replies; 23+ messages in thread
From: Jan Ekström @ 2023-09-01 20:38 UTC (permalink / raw)
To: ffmpeg-devel
This will make it possible to to reuse logic in further commits.
---
libavutil/frame.c | 23 ++++++++++++++---------
1 file changed, 14 insertions(+), 9 deletions(-)
diff --git a/libavutil/frame.c b/libavutil/frame.c
index b6cee2d886..4b8481b756 100644
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@ -75,14 +75,19 @@ static void free_side_data(AVFrameSideData **ptr_sd)
av_freep(ptr_sd);
}
-static void wipe_side_data(AVFrame *frame)
+static void wipe_side_data(AVFrameSideData ***sd, int *nb_side_data)
{
- for (int i = 0; i < frame->nb_side_data; i++) {
- free_side_data(&frame->side_data[i]);
+ for (int i = 0; i < *nb_side_data; i++) {
+ free_side_data(&((*sd)[i]));
}
- frame->nb_side_data = 0;
+ *nb_side_data = 0;
+
+ av_freep(sd);
+}
- av_freep(&frame->side_data);
+static void frame_side_data_wipe(AVFrame *frame)
+{
+ wipe_side_data(&frame->side_data, &frame->nb_side_data);
}
AVFrame *av_frame_alloc(void)
@@ -337,7 +342,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
sd_dst = av_frame_new_side_data(dst, sd_src->type,
sd_src->size);
if (!sd_dst) {
- wipe_side_data(dst);
+ frame_side_data_wipe(dst);
return AVERROR(ENOMEM);
}
memcpy(sd_dst->data, sd_src->data, sd_src->size);
@@ -346,7 +351,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
sd_dst = av_frame_new_side_data_from_buf(dst, sd_src->type, ref);
if (!sd_dst) {
av_buffer_unref(&ref);
- wipe_side_data(dst);
+ frame_side_data_wipe(dst);
return AVERROR(ENOMEM);
}
}
@@ -525,7 +530,7 @@ FF_DISABLE_DEPRECATION_WARNINGS
FF_ENABLE_DEPRECATION_WARNINGS
#endif
- wipe_side_data(dst);
+ frame_side_data_wipe(dst);
av_dict_free(&dst->metadata);
ret = frame_copy_props(dst, src, 0);
if (ret < 0)
@@ -624,7 +629,7 @@ void av_frame_unref(AVFrame *frame)
if (!frame)
return;
- wipe_side_data(frame);
+ frame_side_data_wipe(frame);
for (int i = 0; i < FF_ARRAY_ELEMS(frame->buf); i++)
av_buffer_unref(&frame->buf[i]);
--
2.41.0
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 23+ messages in thread
* [FFmpeg-devel] [PATCH v4 03/13] avutil/frame: add helper for uninitializing side data sets
2023-09-01 20:38 [FFmpeg-devel] [PATCH v4 00/13] encoder AVCodecContext configuration side data Jan Ekström
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 01/13] avutil/frame: add AVFrameSideDataSet for passing sets of " Jan Ekström
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 02/13] avutil/frame: split side data list wiping out to non-AVFrame function Jan Ekström
@ 2023-09-01 20:38 ` Jan Ekström
2023-09-02 13:12 ` James Almer
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 04/13] avutil/frame: split side_data_from_buf to base and AVFrame func Jan Ekström
` (9 subsequent siblings)
12 siblings, 1 reply; 23+ messages in thread
From: Jan Ekström @ 2023-09-01 20:38 UTC (permalink / raw)
To: ffmpeg-devel
---
libavutil/frame.c | 5 +++++
libavutil/frame.h | 8 ++++++++
2 files changed, 13 insertions(+)
diff --git a/libavutil/frame.c b/libavutil/frame.c
index 4b8481b756..b03f8d6c73 100644
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@ -90,6 +90,11 @@ static void frame_side_data_wipe(AVFrame *frame)
wipe_side_data(&frame->side_data, &frame->nb_side_data);
}
+void av_frame_side_data_set_uninit(AVFrameSideDataSet *set)
+{
+ wipe_side_data(&set->sd, &set->nb_sd);
+}
+
AVFrame *av_frame_alloc(void)
{
AVFrame *frame = av_malloc(sizeof(*frame));
diff --git a/libavutil/frame.h b/libavutil/frame.h
index 6155226c1d..dc87d38adc 100644
--- a/libavutil/frame.h
+++ b/libavutil/frame.h
@@ -1057,6 +1057,14 @@ int av_frame_apply_cropping(AVFrame *frame, int flags);
*/
const char *av_frame_side_data_name(enum AVFrameSideDataType type);
+/**
+ * Free all side data items and their contents, then zeroes out the
+ * struct values.
+ *
+ * @param set the set which should be uninitialized
+ */
+void av_frame_side_data_set_uninit(AVFrameSideDataSet *set);
+
/**
* @}
*/
--
2.41.0
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [FFmpeg-devel] [PATCH v4 03/13] avutil/frame: add helper for uninitializing side data sets
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 03/13] avutil/frame: add helper for uninitializing side data sets Jan Ekström
@ 2023-09-02 13:12 ` James Almer
2023-09-05 11:48 ` Anton Khirnov
0 siblings, 1 reply; 23+ messages in thread
From: James Almer @ 2023-09-02 13:12 UTC (permalink / raw)
To: ffmpeg-devel
On 9/1/2023 5:38 PM, Jan Ekström wrote:
> ---
> libavutil/frame.c | 5 +++++
> libavutil/frame.h | 8 ++++++++
> 2 files changed, 13 insertions(+)
>
> diff --git a/libavutil/frame.c b/libavutil/frame.c
> index 4b8481b756..b03f8d6c73 100644
> --- a/libavutil/frame.c
> +++ b/libavutil/frame.c
> @@ -90,6 +90,11 @@ static void frame_side_data_wipe(AVFrame *frame)
> wipe_side_data(&frame->side_data, &frame->nb_side_data);
> }
>
> +void av_frame_side_data_set_uninit(AVFrameSideDataSet *set)
> +{
> + wipe_side_data(&set->sd, &set->nb_sd);
> +}
> +
> AVFrame *av_frame_alloc(void)
> {
> AVFrame *frame = av_malloc(sizeof(*frame));
> diff --git a/libavutil/frame.h b/libavutil/frame.h
> index 6155226c1d..dc87d38adc 100644
> --- a/libavutil/frame.h
> +++ b/libavutil/frame.h
> @@ -1057,6 +1057,14 @@ int av_frame_apply_cropping(AVFrame *frame, int flags);
> */
> const char *av_frame_side_data_name(enum AVFrameSideDataType type);
>
> +/**
> + * Free all side data items and their contents, then zeroes out the
> + * struct values.
> + *
> + * @param set the set which should be uninitialized
> + */
> +void av_frame_side_data_set_uninit(AVFrameSideDataSet *set);
av_frame_side_data_set_free()?
> +
> /**
> * @}
> */
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [FFmpeg-devel] [PATCH v4 03/13] avutil/frame: add helper for uninitializing side data sets
2023-09-02 13:12 ` James Almer
@ 2023-09-05 11:48 ` Anton Khirnov
2023-09-05 11:53 ` James Almer
0 siblings, 1 reply; 23+ messages in thread
From: Anton Khirnov @ 2023-09-05 11:48 UTC (permalink / raw)
To: FFmpeg development discussions and patches
Quoting James Almer (2023-09-02 15:12:20)
> On 9/1/2023 5:38 PM, Jan Ekström wrote:
> > ---
> > libavutil/frame.c | 5 +++++
> > libavutil/frame.h | 8 ++++++++
> > 2 files changed, 13 insertions(+)
> >
> > diff --git a/libavutil/frame.c b/libavutil/frame.c
> > index 4b8481b756..b03f8d6c73 100644
> > --- a/libavutil/frame.c
> > +++ b/libavutil/frame.c
> > @@ -90,6 +90,11 @@ static void frame_side_data_wipe(AVFrame *frame)
> > wipe_side_data(&frame->side_data, &frame->nb_side_data);
> > }
> >
> > +void av_frame_side_data_set_uninit(AVFrameSideDataSet *set)
> > +{
> > + wipe_side_data(&set->sd, &set->nb_sd);
> > +}
> > +
> > AVFrame *av_frame_alloc(void)
> > {
> > AVFrame *frame = av_malloc(sizeof(*frame));
> > diff --git a/libavutil/frame.h b/libavutil/frame.h
> > index 6155226c1d..dc87d38adc 100644
> > --- a/libavutil/frame.h
> > +++ b/libavutil/frame.h
> > @@ -1057,6 +1057,14 @@ int av_frame_apply_cropping(AVFrame *frame, int flags);
> > */
> > const char *av_frame_side_data_name(enum AVFrameSideDataType type);
> >
> > +/**
> > + * Free all side data items and their contents, then zeroes out the
> > + * struct values.
> > + *
> > + * @param set the set which should be uninitialized
> > + */
> > +void av_frame_side_data_set_uninit(AVFrameSideDataSet *set);
>
> av_frame_side_data_set_free()?
uninit is better IMO because the function cleans the struct contents,
but does not free the struct itself.
--
Anton Khirnov
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [FFmpeg-devel] [PATCH v4 03/13] avutil/frame: add helper for uninitializing side data sets
2023-09-05 11:48 ` Anton Khirnov
@ 2023-09-05 11:53 ` James Almer
0 siblings, 0 replies; 23+ messages in thread
From: James Almer @ 2023-09-05 11:53 UTC (permalink / raw)
To: ffmpeg-devel
On 9/5/2023 8:48 AM, Anton Khirnov wrote:
> Quoting James Almer (2023-09-02 15:12:20)
>> On 9/1/2023 5:38 PM, Jan Ekström wrote:
>>> ---
>>> libavutil/frame.c | 5 +++++
>>> libavutil/frame.h | 8 ++++++++
>>> 2 files changed, 13 insertions(+)
>>>
>>> diff --git a/libavutil/frame.c b/libavutil/frame.c
>>> index 4b8481b756..b03f8d6c73 100644
>>> --- a/libavutil/frame.c
>>> +++ b/libavutil/frame.c
>>> @@ -90,6 +90,11 @@ static void frame_side_data_wipe(AVFrame *frame)
>>> wipe_side_data(&frame->side_data, &frame->nb_side_data);
>>> }
>>>
>>> +void av_frame_side_data_set_uninit(AVFrameSideDataSet *set)
>>> +{
>>> + wipe_side_data(&set->sd, &set->nb_sd);
>>> +}
>>> +
>>> AVFrame *av_frame_alloc(void)
>>> {
>>> AVFrame *frame = av_malloc(sizeof(*frame));
>>> diff --git a/libavutil/frame.h b/libavutil/frame.h
>>> index 6155226c1d..dc87d38adc 100644
>>> --- a/libavutil/frame.h
>>> +++ b/libavutil/frame.h
>>> @@ -1057,6 +1057,14 @@ int av_frame_apply_cropping(AVFrame *frame, int flags);
>>> */
>>> const char *av_frame_side_data_name(enum AVFrameSideDataType type);
>>>
>>> +/**
>>> + * Free all side data items and their contents, then zeroes out the
>>> + * struct values.
>>> + *
>>> + * @param set the set which should be uninitialized
>>> + */
>>> +void av_frame_side_data_set_uninit(AVFrameSideDataSet *set);
>>
>> av_frame_side_data_set_free()?
>
> uninit is better IMO because the function cleans the struct contents,
> but does not free the struct itself.
Ok. Will amend my set then.
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 23+ messages in thread
* [FFmpeg-devel] [PATCH v4 04/13] avutil/frame: split side_data_from_buf to base and AVFrame func
2023-09-01 20:38 [FFmpeg-devel] [PATCH v4 00/13] encoder AVCodecContext configuration side data Jan Ekström
` (2 preceding siblings ...)
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 03/13] avutil/frame: add helper for uninitializing side data sets Jan Ekström
@ 2023-09-01 20:38 ` Jan Ekström
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 05/13] avutil/frame: split side data removal out to non-AVFrame function Jan Ekström
` (8 subsequent siblings)
12 siblings, 0 replies; 23+ messages in thread
From: Jan Ekström @ 2023-09-01 20:38 UTC (permalink / raw)
To: ffmpeg-devel
---
libavutil/frame.c | 31 +++++++++++++++++++++++--------
1 file changed, 23 insertions(+), 8 deletions(-)
diff --git a/libavutil/frame.c b/libavutil/frame.c
index b03f8d6c73..9eff851d64 100644
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@ -787,23 +787,22 @@ FF_ENABLE_DEPRECATION_WARNINGS
return NULL;
}
-AVFrameSideData *av_frame_new_side_data_from_buf(AVFrame *frame,
- enum AVFrameSideDataType type,
- AVBufferRef *buf)
+static AVFrameSideData *add_side_data_to_set_from_buf(AVFrameSideDataSet *set,
+ enum AVFrameSideDataType type,
+ AVBufferRef *buf)
{
AVFrameSideData *ret, **tmp;
if (!buf)
return NULL;
- if (frame->nb_side_data > INT_MAX / sizeof(*frame->side_data) - 1)
+ if (set->nb_sd > INT_MAX / sizeof(*set->sd) - 1)
return NULL;
- tmp = av_realloc(frame->side_data,
- (frame->nb_side_data + 1) * sizeof(*frame->side_data));
+ tmp = av_realloc(set->sd, (set->nb_sd + 1) * sizeof(*set->sd));
if (!tmp)
return NULL;
- frame->side_data = tmp;
+ set->sd = tmp;
ret = av_mallocz(sizeof(*ret));
if (!ret)
@@ -814,7 +813,23 @@ AVFrameSideData *av_frame_new_side_data_from_buf(AVFrame *frame,
ret->size = buf->size;
ret->type = type;
- frame->side_data[frame->nb_side_data++] = ret;
+ set->sd[set->nb_sd++] = ret;
+
+ return ret;
+}
+
+AVFrameSideData *av_frame_new_side_data_from_buf(AVFrame *frame,
+ enum AVFrameSideDataType type,
+ AVBufferRef *buf)
+{
+ AVFrameSideDataSet set = {
+ .sd = frame->side_data,
+ .nb_sd = frame->nb_side_data,
+ };
+ AVFrameSideData *ret = add_side_data_to_set_from_buf(&set, type, buf);
+
+ frame->side_data = set.sd;
+ frame->nb_side_data = set.nb_sd;
return ret;
}
--
2.41.0
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 23+ messages in thread
* [FFmpeg-devel] [PATCH v4 05/13] avutil/frame: split side data removal out to non-AVFrame function
2023-09-01 20:38 [FFmpeg-devel] [PATCH v4 00/13] encoder AVCodecContext configuration side data Jan Ekström
` (3 preceding siblings ...)
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 04/13] avutil/frame: split side_data_from_buf to base and AVFrame func Jan Ekström
@ 2023-09-01 20:38 ` Jan Ekström
2023-09-05 11:56 ` Leo Izen
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 06/13] avutil/frame: add helper for adding side data to set Jan Ekström
` (7 subsequent siblings)
12 siblings, 1 reply; 23+ messages in thread
From: Jan Ekström @ 2023-09-01 20:38 UTC (permalink / raw)
To: ffmpeg-devel
This will make it possible to reuse logic in further commits.
---
libavutil/frame.c | 24 ++++++++++++++++--------
1 file changed, 16 insertions(+), 8 deletions(-)
diff --git a/libavutil/frame.c b/libavutil/frame.c
index 9eff851d64..0b1a8e5244 100644
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@ -95,6 +95,21 @@ void av_frame_side_data_set_uninit(AVFrameSideDataSet *set)
wipe_side_data(&set->sd, &set->nb_sd);
}
+static void remove_side_data(AVFrameSideData ***sd, int *nb_side_data,
+ const enum AVFrameSideDataType type)
+{
+ for (int i = *nb_side_data - 1; i >= 0; i--) {
+ AVFrameSideData *entry = ((*sd)[i]);
+ if (entry->type != type)
+ continue;
+
+ free_side_data(&entry);
+
+ ((*sd)[i]) = ((*sd)[*nb_side_data - 1]);
+ (*nb_side_data)--;
+ }
+}
+
AVFrame *av_frame_alloc(void)
{
AVFrame *frame = av_malloc(sizeof(*frame));
@@ -945,14 +960,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type)
{
- for (int i = frame->nb_side_data - 1; i >= 0; i--) {
- AVFrameSideData *sd = frame->side_data[i];
- if (sd->type == type) {
- free_side_data(&frame->side_data[i]);
- frame->side_data[i] = frame->side_data[frame->nb_side_data - 1];
- frame->nb_side_data--;
- }
- }
+ remove_side_data(&frame->side_data, &frame->nb_side_data, type);
}
const char *av_frame_side_data_name(enum AVFrameSideDataType type)
--
2.41.0
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [FFmpeg-devel] [PATCH v4 05/13] avutil/frame: split side data removal out to non-AVFrame function
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 05/13] avutil/frame: split side data removal out to non-AVFrame function Jan Ekström
@ 2023-09-05 11:56 ` Leo Izen
0 siblings, 0 replies; 23+ messages in thread
From: Leo Izen @ 2023-09-05 11:56 UTC (permalink / raw)
To: ffmpeg-devel
On 9/1/23 16:38, Jan Ekström wrote:
> This will make it possible to reuse logic in further commits.
> ---
> libavutil/frame.c | 24 ++++++++++++++++--------
> 1 file changed, 16 insertions(+), 8 deletions(-)
>
> diff --git a/libavutil/frame.c b/libavutil/frame.c
> index 9eff851d64..0b1a8e5244 100644
> --- a/libavutil/frame.c
> +++ b/libavutil/frame.c
> @@ -95,6 +95,21 @@ void av_frame_side_data_set_uninit(AVFrameSideDataSet *set)
> wipe_side_data(&set->sd, &set->nb_sd);
> }
>
> +static void remove_side_data(AVFrameSideData ***sd, int *nb_side_data,
> + const enum AVFrameSideDataType type)
> +{
> + for (int i = *nb_side_data - 1; i >= 0; i--) {
> + AVFrameSideData *entry = ((*sd)[i]);
> + if (entry->type != type)
> + continue;
> +
> + free_side_data(&entry);
> +
> + ((*sd)[i]) = ((*sd)[*nb_side_data - 1]);
> + (*nb_side_data)--;
> + }
> +}
> +
Do we need AVFrameSideData ***sd here? It looks like **sd will suffice,
as sd[i] = foo will still modify the original.
> AVFrame *av_frame_alloc(void)
> {
> AVFrame *frame = av_malloc(sizeof(*frame));
> @@ -945,14 +960,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
>
> void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type)
> {
> - for (int i = frame->nb_side_data - 1; i >= 0; i--) {
> - AVFrameSideData *sd = frame->side_data[i];
> - if (sd->type == type) {
> - free_side_data(&frame->side_data[i]);
> - frame->side_data[i] = frame->side_data[frame->nb_side_data - 1];
> - frame->nb_side_data--;
> - }
> - }
> + remove_side_data(&frame->side_data, &frame->nb_side_data, type);
> }
>
> const char *av_frame_side_data_name(enum AVFrameSideDataType type)
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 23+ messages in thread
* [FFmpeg-devel] [PATCH v4 06/13] avutil/frame: add helper for adding side data to set
2023-09-01 20:38 [FFmpeg-devel] [PATCH v4 00/13] encoder AVCodecContext configuration side data Jan Ekström
` (4 preceding siblings ...)
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 05/13] avutil/frame: split side data removal out to non-AVFrame function Jan Ekström
@ 2023-09-01 20:38 ` Jan Ekström
2023-09-02 13:09 ` James Almer
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 07/13] avutil/frame: add helper for getting side data from set Jan Ekström
` (6 subsequent siblings)
12 siblings, 1 reply; 23+ messages in thread
From: Jan Ekström @ 2023-09-01 20:38 UTC (permalink / raw)
To: ffmpeg-devel
Additionally, add an API test to check that the no-duplicates
addition works after duplicates have been inserted.
---
libavutil/Makefile | 1 +
libavutil/frame.c | 18 ++++++
libavutil/frame.h | 20 +++++++
libavutil/tests/side_data_set.c | 97 +++++++++++++++++++++++++++++++++
tests/fate/libavutil.mak | 4 ++
tests/ref/fate/side_data_set | 14 +++++
6 files changed, 154 insertions(+)
create mode 100644 libavutil/tests/side_data_set.c
create mode 100644 tests/ref/fate/side_data_set
diff --git a/libavutil/Makefile b/libavutil/Makefile
index 7828c94dc5..339eaf3539 100644
--- a/libavutil/Makefile
+++ b/libavutil/Makefile
@@ -264,6 +264,7 @@ TESTPROGS = adler32 \
ripemd \
sha \
sha512 \
+ side_data_set \
softfloat \
tree \
twofish \
diff --git a/libavutil/frame.c b/libavutil/frame.c
index 0b1a8e5244..f64ddb3645 100644
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@ -861,6 +861,24 @@ AVFrameSideData *av_frame_new_side_data(AVFrame *frame,
return ret;
}
+AVFrameSideData *av_frame_side_data_set_new_item(AVFrameSideDataSet *set,
+ enum AVFrameSideDataType type,
+ size_t size,
+ unsigned int flags)
+{
+ AVBufferRef *buf = av_buffer_alloc(size);
+ AVFrameSideData *ret = NULL;
+
+ if (flags & AV_FRAME_SIDE_DATA_SET_FLAG_NO_DUPLICATES)
+ remove_side_data(&set->sd, &set->nb_sd, type);
+
+ ret = add_side_data_to_set_from_buf(set, type, buf);
+ if (!ret)
+ av_buffer_unref(&buf);
+
+ return ret;
+}
+
AVFrameSideData *av_frame_get_side_data(const AVFrame *frame,
enum AVFrameSideDataType type)
{
diff --git a/libavutil/frame.h b/libavutil/frame.h
index dc87d38adc..5aed08b796 100644
--- a/libavutil/frame.h
+++ b/libavutil/frame.h
@@ -1065,6 +1065,26 @@ const char *av_frame_side_data_name(enum AVFrameSideDataType type);
*/
void av_frame_side_data_set_uninit(AVFrameSideDataSet *set);
+#define AV_FRAME_SIDE_DATA_SET_FLAG_NO_DUPLICATES (1 << 0)
+
+/**
+ * Add a new side data entry to a set.
+ *
+ * @param set a set to which the side data should be added
+ * @param type type of the added side data
+ * @param size size of the side data
+ * @param flags Some combination of AV_FRAME_SIDE_DATA_SET_FLAG_* flags, or 0.
+ *
+ * @return newly added side data on success, NULL on error. In case of
+ * AV_FRAME_SIDE_DATA_SET_FLAG_NO_DUPLICATES being set, entries
+ * of matching AVFrameSideDataType will be removed before the
+ * addition is attempted.
+ */
+AVFrameSideData *av_frame_side_data_set_new_item(AVFrameSideDataSet *set,
+ enum AVFrameSideDataType type,
+ size_t size,
+ unsigned int flags);
+
/**
* @}
*/
diff --git a/libavutil/tests/side_data_set.c b/libavutil/tests/side_data_set.c
new file mode 100644
index 0000000000..056d79f655
--- /dev/null
+++ b/libavutil/tests/side_data_set.c
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2023 Jan Ekström <jeebjp@gmail.com>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <stdio.h>
+#include "libavutil/frame.c"
+#include "libavutil/mastering_display_metadata.h"
+
+static void print_clls(const AVFrameSideDataSet set)
+{
+ for (int i = 0; i < set.nb_sd; i++) {
+ AVFrameSideData *sd = set.sd[i];
+
+ printf("sd %d, %s",
+ i, av_frame_side_data_name(sd->type));
+
+ if (sd->type != AV_FRAME_DATA_CONTENT_LIGHT_LEVEL) {
+ putchar('\n');
+ continue;
+ }
+
+ printf(": MaxCLL: %u\n",
+ ((AVContentLightMetadata *)sd->data)->MaxCLL);
+ }
+}
+
+int main(void)
+{
+ AVFrameSideDataSet set = { 0 };
+
+ av_assert0(
+ av_frame_side_data_set_new_item(
+ &set, AV_FRAME_DATA_AMBIENT_VIEWING_ENVIRONMENT, 0, 0));
+
+ // test entries in the middle
+ for (int value = 1; value < 4; value++) {
+ AVFrameSideData *sd = av_frame_side_data_set_new_item(
+ &set, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
+ sizeof(AVContentLightMetadata), 0);
+
+ av_assert0(sd);
+
+ ((AVContentLightMetadata *)sd->data)->MaxCLL = value;
+ }
+
+ av_assert0(
+ av_frame_side_data_set_new_item(
+ &set, AV_FRAME_DATA_SPHERICAL, 0, 0));
+
+ // test entries at the end
+ for (int value = 1; value < 4; value++) {
+ AVFrameSideData *sd = av_frame_side_data_set_new_item(
+ &set, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
+ sizeof(AVContentLightMetadata), 0);
+
+ av_assert0(sd);
+
+ ((AVContentLightMetadata *)sd->data)->MaxCLL = value + 3;
+ }
+
+ puts("Initial addition results with duplicates:");
+ print_clls(set);
+
+ {
+ AVFrameSideData *sd = av_frame_side_data_set_new_item(
+ &set, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
+ sizeof(AVContentLightMetadata),
+ AV_FRAME_SIDE_DATA_SET_FLAG_NO_DUPLICATES);
+
+ av_assert0(sd);
+
+ ((AVContentLightMetadata *)sd->data)->MaxCLL = 1337;
+ }
+
+ puts("\nFinal state after a single 'no-duplicates' addition:");
+ print_clls(set);
+
+ av_frame_side_data_set_uninit(&set);
+
+ return 0;
+}
diff --git a/tests/fate/libavutil.mak b/tests/fate/libavutil.mak
index 80153f4395..6864ea9c03 100644
--- a/tests/fate/libavutil.mak
+++ b/tests/fate/libavutil.mak
@@ -148,6 +148,10 @@ FATE_LIBAVUTIL += fate-sha512
fate-sha512: libavutil/tests/sha512$(EXESUF)
fate-sha512: CMD = run libavutil/tests/sha512$(EXESUF)
+FATE_LIBAVUTIL += fate-side_data_set
+fate-side_data_set: libavutil/tests/side_data_set$(EXESUF)
+fate-side_data_set: CMD = run libavutil/tests/side_data_set$(EXESUF)
+
FATE_LIBAVUTIL += fate-tree
fate-tree: libavutil/tests/tree$(EXESUF)
fate-tree: CMD = run libavutil/tests/tree$(EXESUF)
diff --git a/tests/ref/fate/side_data_set b/tests/ref/fate/side_data_set
new file mode 100644
index 0000000000..7d8c684d8f
--- /dev/null
+++ b/tests/ref/fate/side_data_set
@@ -0,0 +1,14 @@
+Initial addition results with duplicates:
+sd 0, Ambient viewing environment
+sd 1, Content light level metadata: MaxCLL: 1
+sd 2, Content light level metadata: MaxCLL: 2
+sd 3, Content light level metadata: MaxCLL: 3
+sd 4, Spherical Mapping
+sd 5, Content light level metadata: MaxCLL: 4
+sd 6, Content light level metadata: MaxCLL: 5
+sd 7, Content light level metadata: MaxCLL: 6
+
+Final state after a single 'no-duplicates' addition:
+sd 0, Ambient viewing environment
+sd 1, Spherical Mapping
+sd 2, Content light level metadata: MaxCLL: 1337
--
2.41.0
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [FFmpeg-devel] [PATCH v4 06/13] avutil/frame: add helper for adding side data to set
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 06/13] avutil/frame: add helper for adding side data to set Jan Ekström
@ 2023-09-02 13:09 ` James Almer
0 siblings, 0 replies; 23+ messages in thread
From: James Almer @ 2023-09-02 13:09 UTC (permalink / raw)
To: ffmpeg-devel
On 9/1/2023 5:38 PM, Jan Ekström wrote:
> Additionally, add an API test to check that the no-duplicates
> addition works after duplicates have been inserted.
> ---
> libavutil/Makefile | 1 +
> libavutil/frame.c | 18 ++++++
> libavutil/frame.h | 20 +++++++
> libavutil/tests/side_data_set.c | 97 +++++++++++++++++++++++++++++++++
> tests/fate/libavutil.mak | 4 ++
> tests/ref/fate/side_data_set | 14 +++++
> 6 files changed, 154 insertions(+)
> create mode 100644 libavutil/tests/side_data_set.c
> create mode 100644 tests/ref/fate/side_data_set
>
> diff --git a/libavutil/Makefile b/libavutil/Makefile
> index 7828c94dc5..339eaf3539 100644
> --- a/libavutil/Makefile
> +++ b/libavutil/Makefile
> @@ -264,6 +264,7 @@ TESTPROGS = adler32 \
> ripemd \
> sha \
> sha512 \
> + side_data_set \
> softfloat \
> tree \
> twofish \
> diff --git a/libavutil/frame.c b/libavutil/frame.c
> index 0b1a8e5244..f64ddb3645 100644
> --- a/libavutil/frame.c
> +++ b/libavutil/frame.c
> @@ -861,6 +861,24 @@ AVFrameSideData *av_frame_new_side_data(AVFrame *frame,
> return ret;
> }
>
> +AVFrameSideData *av_frame_side_data_set_new_item(AVFrameSideDataSet *set,
Maybe av_frame_side_data_set_new_entry(), or just
av_frame_side_data_set_new()? I don't particularly like item.
> + enum AVFrameSideDataType type,
> + size_t size,
> + unsigned int flags)
> +{
> + AVBufferRef *buf = av_buffer_alloc(size);
> + AVFrameSideData *ret = NULL;
> +
> + if (flags & AV_FRAME_SIDE_DATA_SET_FLAG_NO_DUPLICATES)
> + remove_side_data(&set->sd, &set->nb_sd, type);
> +
> + ret = add_side_data_to_set_from_buf(set, type, buf);
> + if (!ret)
> + av_buffer_unref(&buf);
> +
> + return ret;
> +}
> +
> AVFrameSideData *av_frame_get_side_data(const AVFrame *frame,
> enum AVFrameSideDataType type)
> {
> diff --git a/libavutil/frame.h b/libavutil/frame.h
> index dc87d38adc..5aed08b796 100644
> --- a/libavutil/frame.h
> +++ b/libavutil/frame.h
> @@ -1065,6 +1065,26 @@ const char *av_frame_side_data_name(enum AVFrameSideDataType type);
> */
> void av_frame_side_data_set_uninit(AVFrameSideDataSet *set);
>
> +#define AV_FRAME_SIDE_DATA_SET_FLAG_NO_DUPLICATES (1 << 0)
> +
> +/**
> + * Add a new side data entry to a set.
> + *
> + * @param set a set to which the side data should be added
> + * @param type type of the added side data
> + * @param size size of the side data
> + * @param flags Some combination of AV_FRAME_SIDE_DATA_SET_FLAG_* flags, or 0.
> + *
> + * @return newly added side data on success, NULL on error. In case of
> + * AV_FRAME_SIDE_DATA_SET_FLAG_NO_DUPLICATES being set, entries
> + * of matching AVFrameSideDataType will be removed before the
> + * addition is attempted.
> + */
> +AVFrameSideData *av_frame_side_data_set_new_item(AVFrameSideDataSet *set,
> + enum AVFrameSideDataType type,
> + size_t size,
> + unsigned int flags);
> +
> /**
> * @}
> */
> diff --git a/libavutil/tests/side_data_set.c b/libavutil/tests/side_data_set.c
> new file mode 100644
> index 0000000000..056d79f655
> --- /dev/null
> +++ b/libavutil/tests/side_data_set.c
> @@ -0,0 +1,97 @@
> +/*
> + * Copyright (c) 2023 Jan Ekström <jeebjp@gmail.com>
> + *
> + * This file is part of FFmpeg.
> + *
> + * FFmpeg is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * FFmpeg is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with FFmpeg; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> + */
> +
> +#include <stdio.h>
> +#include "libavutil/frame.c"
> +#include "libavutil/mastering_display_metadata.h"
> +
> +static void print_clls(const AVFrameSideDataSet set)
> +{
> + for (int i = 0; i < set.nb_sd; i++) {
> + AVFrameSideData *sd = set.sd[i];
> +
> + printf("sd %d, %s",
> + i, av_frame_side_data_name(sd->type));
> +
> + if (sd->type != AV_FRAME_DATA_CONTENT_LIGHT_LEVEL) {
> + putchar('\n');
> + continue;
> + }
> +
> + printf(": MaxCLL: %u\n",
> + ((AVContentLightMetadata *)sd->data)->MaxCLL);
> + }
> +}
> +
> +int main(void)
> +{
> + AVFrameSideDataSet set = { 0 };
> +
> + av_assert0(
> + av_frame_side_data_set_new_item(
> + &set, AV_FRAME_DATA_AMBIENT_VIEWING_ENVIRONMENT, 0, 0));
> +
> + // test entries in the middle
> + for (int value = 1; value < 4; value++) {
> + AVFrameSideData *sd = av_frame_side_data_set_new_item(
> + &set, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
> + sizeof(AVContentLightMetadata), 0);
> +
> + av_assert0(sd);
> +
> + ((AVContentLightMetadata *)sd->data)->MaxCLL = value;
> + }
> +
> + av_assert0(
> + av_frame_side_data_set_new_item(
> + &set, AV_FRAME_DATA_SPHERICAL, 0, 0));
> +
> + // test entries at the end
> + for (int value = 1; value < 4; value++) {
> + AVFrameSideData *sd = av_frame_side_data_set_new_item(
> + &set, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
> + sizeof(AVContentLightMetadata), 0);
> +
> + av_assert0(sd);
> +
> + ((AVContentLightMetadata *)sd->data)->MaxCLL = value + 3;
> + }
> +
> + puts("Initial addition results with duplicates:");
> + print_clls(set);
> +
> + {
> + AVFrameSideData *sd = av_frame_side_data_set_new_item(
> + &set, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,
> + sizeof(AVContentLightMetadata),
> + AV_FRAME_SIDE_DATA_SET_FLAG_NO_DUPLICATES);
> +
> + av_assert0(sd);
> +
> + ((AVContentLightMetadata *)sd->data)->MaxCLL = 1337;
> + }
> +
> + puts("\nFinal state after a single 'no-duplicates' addition:");
> + print_clls(set);
> +
> + av_frame_side_data_set_uninit(&set);
> +
> + return 0;
> +}
> diff --git a/tests/fate/libavutil.mak b/tests/fate/libavutil.mak
> index 80153f4395..6864ea9c03 100644
> --- a/tests/fate/libavutil.mak
> +++ b/tests/fate/libavutil.mak
> @@ -148,6 +148,10 @@ FATE_LIBAVUTIL += fate-sha512
> fate-sha512: libavutil/tests/sha512$(EXESUF)
> fate-sha512: CMD = run libavutil/tests/sha512$(EXESUF)
>
> +FATE_LIBAVUTIL += fate-side_data_set
> +fate-side_data_set: libavutil/tests/side_data_set$(EXESUF)
> +fate-side_data_set: CMD = run libavutil/tests/side_data_set$(EXESUF)
> +
> FATE_LIBAVUTIL += fate-tree
> fate-tree: libavutil/tests/tree$(EXESUF)
> fate-tree: CMD = run libavutil/tests/tree$(EXESUF)
> diff --git a/tests/ref/fate/side_data_set b/tests/ref/fate/side_data_set
> new file mode 100644
> index 0000000000..7d8c684d8f
> --- /dev/null
> +++ b/tests/ref/fate/side_data_set
> @@ -0,0 +1,14 @@
> +Initial addition results with duplicates:
> +sd 0, Ambient viewing environment
> +sd 1, Content light level metadata: MaxCLL: 1
> +sd 2, Content light level metadata: MaxCLL: 2
> +sd 3, Content light level metadata: MaxCLL: 3
> +sd 4, Spherical Mapping
> +sd 5, Content light level metadata: MaxCLL: 4
> +sd 6, Content light level metadata: MaxCLL: 5
> +sd 7, Content light level metadata: MaxCLL: 6
> +
> +Final state after a single 'no-duplicates' addition:
> +sd 0, Ambient viewing environment
> +sd 1, Spherical Mapping
> +sd 2, Content light level metadata: MaxCLL: 1337
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 23+ messages in thread
* [FFmpeg-devel] [PATCH v4 07/13] avutil/frame: add helper for getting side data from set
2023-09-01 20:38 [FFmpeg-devel] [PATCH v4 00/13] encoder AVCodecContext configuration side data Jan Ekström
` (5 preceding siblings ...)
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 06/13] avutil/frame: add helper for adding side data to set Jan Ekström
@ 2023-09-01 20:38 ` Jan Ekström
2023-09-02 13:25 ` James Almer
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 08/13] avutil/frame: add helper for extending a set of side data Jan Ekström
` (5 subsequent siblings)
12 siblings, 1 reply; 23+ messages in thread
From: Jan Ekström @ 2023-09-01 20:38 UTC (permalink / raw)
To: ffmpeg-devel
---
libavutil/frame.c | 22 +++++++++++++++++-----
libavutil/frame.h | 12 ++++++++++++
2 files changed, 29 insertions(+), 5 deletions(-)
diff --git a/libavutil/frame.c b/libavutil/frame.c
index f64ddb3645..5f74e0172b 100644
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@ -879,16 +879,28 @@ AVFrameSideData *av_frame_side_data_set_new_item(AVFrameSideDataSet *set,
return ret;
}
-AVFrameSideData *av_frame_get_side_data(const AVFrame *frame,
- enum AVFrameSideDataType type)
+AVFrameSideData *av_frame_side_data_set_get_item(const AVFrameSideDataSet set,
+ enum AVFrameSideDataType type)
{
- for (int i = 0; i < frame->nb_side_data; i++) {
- if (frame->side_data[i]->type == type)
- return frame->side_data[i];
+ for (int i = 0; i < set.nb_sd; i++) {
+ if (set.sd[i]->type == type)
+ return set.sd[i];
}
return NULL;
}
+AVFrameSideData *av_frame_get_side_data(const AVFrame *frame,
+ enum AVFrameSideDataType type)
+{
+ return av_frame_side_data_set_get_item(
+ (const AVFrameSideDataSet){
+ .sd = frame->side_data,
+ .nb_sd = frame->nb_side_data
+ },
+ type
+ );
+}
+
static int frame_copy_video(AVFrame *dst, const AVFrame *src)
{
const uint8_t *src_data[4];
diff --git a/libavutil/frame.h b/libavutil/frame.h
index 5aed08b796..8ecdf82f33 100644
--- a/libavutil/frame.h
+++ b/libavutil/frame.h
@@ -1085,6 +1085,18 @@ AVFrameSideData *av_frame_side_data_set_new_item(AVFrameSideDataSet *set,
size_t size,
unsigned int flags);
+/**
+ * Get a side data entry of a specific type from a set.
+ *
+ * @param set the set from which side data should be queried from
+ * @param type type of side data to be queried
+ *
+ * @return a pointer to the side data of a given type on success, NULL if there
+ * is no side data with such type in this set.
+ */
+AVFrameSideData *av_frame_side_data_set_get_item(const AVFrameSideDataSet set,
+ enum AVFrameSideDataType type);
+
/**
* @}
*/
--
2.41.0
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [FFmpeg-devel] [PATCH v4 07/13] avutil/frame: add helper for getting side data from set
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 07/13] avutil/frame: add helper for getting side data from set Jan Ekström
@ 2023-09-02 13:25 ` James Almer
0 siblings, 0 replies; 23+ messages in thread
From: James Almer @ 2023-09-02 13:25 UTC (permalink / raw)
To: ffmpeg-devel
On 9/1/2023 5:38 PM, Jan Ekström wrote:
> ---
> libavutil/frame.c | 22 +++++++++++++++++-----
> libavutil/frame.h | 12 ++++++++++++
> 2 files changed, 29 insertions(+), 5 deletions(-)
>
> diff --git a/libavutil/frame.c b/libavutil/frame.c
> index f64ddb3645..5f74e0172b 100644
> --- a/libavutil/frame.c
> +++ b/libavutil/frame.c
> @@ -879,16 +879,28 @@ AVFrameSideData *av_frame_side_data_set_new_item(AVFrameSideDataSet *set,
> return ret;
> }
>
> -AVFrameSideData *av_frame_get_side_data(const AVFrame *frame,
> - enum AVFrameSideDataType type)
> +AVFrameSideData *av_frame_side_data_set_get_item(const AVFrameSideDataSet set,
You should pass a pointer to a set, not a set.
> + enum AVFrameSideDataType type)
> {
> - for (int i = 0; i < frame->nb_side_data; i++) {
> - if (frame->side_data[i]->type == type)
> - return frame->side_data[i];
> + for (int i = 0; i < set.nb_sd; i++) {
> + if (set.sd[i]->type == type)
> + return set.sd[i];
> }
> return NULL;
> }
>
> +AVFrameSideData *av_frame_get_side_data(const AVFrame *frame,
> + enum AVFrameSideDataType type)
> +{
Thus:
AVFrameSideDataSet set = {
.sd = frame->side_data,
.nb_sd = frame->nb_side_data,
};
return av_frame_side_data_set_get_item(&set, type);
> + return av_frame_side_data_set_get_item(
> + (const AVFrameSideDataSet){
> + .sd = frame->side_data,
> + .nb_sd = frame->nb_side_data
> + },
> + type
> + );
> +}
> +
> static int frame_copy_video(AVFrame *dst, const AVFrame *src)
> {
> const uint8_t *src_data[4];
> diff --git a/libavutil/frame.h b/libavutil/frame.h
> index 5aed08b796..8ecdf82f33 100644
> --- a/libavutil/frame.h
> +++ b/libavutil/frame.h
> @@ -1085,6 +1085,18 @@ AVFrameSideData *av_frame_side_data_set_new_item(AVFrameSideDataSet *set,
> size_t size,
> unsigned int flags);
>
> +/**
> + * Get a side data entry of a specific type from a set.
> + *
> + * @param set the set from which side data should be queried from
> + * @param type type of side data to be queried
> + *
> + * @return a pointer to the side data of a given type on success, NULL if there
> + * is no side data with such type in this set.
> + */
> +AVFrameSideData *av_frame_side_data_set_get_item(const AVFrameSideDataSet set,
> + enum AVFrameSideDataType type);
> +
> /**
> * @}
> */
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 23+ messages in thread
* [FFmpeg-devel] [PATCH v4 08/13] avutil/frame: add helper for extending a set of side data
2023-09-01 20:38 [FFmpeg-devel] [PATCH v4 00/13] encoder AVCodecContext configuration side data Jan Ekström
` (6 preceding siblings ...)
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 07/13] avutil/frame: add helper for getting side data from set Jan Ekström
@ 2023-09-01 20:38 ` Jan Ekström
2023-09-02 13:14 ` James Almer
2023-09-02 16:05 ` James Almer
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 09/13] avcodec: add side data set to AVCodecContext Jan Ekström
` (4 subsequent siblings)
12 siblings, 2 replies; 23+ messages in thread
From: Jan Ekström @ 2023-09-01 20:38 UTC (permalink / raw)
To: ffmpeg-devel
Additionally, extend the side data set FATE test to check for the
invalid use case of extending a set by itself.
---
libavutil/frame.c | 32 ++++++++++++++++++++++++++++++++
libavutil/frame.h | 15 +++++++++++++++
libavutil/tests/side_data_set.c | 16 ++++++++++++++++
tests/ref/fate/side_data_set | 7 +++++++
4 files changed, 70 insertions(+)
diff --git a/libavutil/frame.c b/libavutil/frame.c
index 5f74e0172b..898c749631 100644
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@ -879,6 +879,38 @@ AVFrameSideData *av_frame_side_data_set_new_item(AVFrameSideDataSet *set,
return ret;
}
+int av_frame_side_data_set_extend(AVFrameSideDataSet *dst,
+ const AVFrameSideDataSet src,
+ unsigned int flags)
+{
+ if (src.nb_sd > 0 && src.nb_sd == dst->nb_sd &&
+ src.sd == dst->sd)
+ return AVERROR(EINVAL);
+
+ for (int i = 0; i < src.nb_sd; i++) {
+ const AVFrameSideData *sd_src = src.sd[i];
+ AVBufferRef *buf = av_buffer_ref(sd_src->buf);
+ AVFrameSideData *sd_dst =
+ add_side_data_to_set_from_buf(dst, sd_src->type, buf);
+ if (!sd_dst) {
+ av_buffer_unref(&buf);
+ av_frame_side_data_set_uninit(dst);
+ return AVERROR(ENOMEM);
+ }
+
+ {
+ int ret = av_dict_copy(&sd_dst->metadata, sd_src->metadata, 0);
+ if (ret < 0) {
+ av_frame_side_data_set_uninit(dst);
+ return ret;
+ }
+ }
+
+ }
+
+ return 0;
+}
+
AVFrameSideData *av_frame_side_data_set_get_item(const AVFrameSideDataSet set,
enum AVFrameSideDataType type)
{
diff --git a/libavutil/frame.h b/libavutil/frame.h
index 8ecdf82f33..e16941c5a5 100644
--- a/libavutil/frame.h
+++ b/libavutil/frame.h
@@ -1085,6 +1085,21 @@ AVFrameSideData *av_frame_side_data_set_new_item(AVFrameSideDataSet *set,
size_t size,
unsigned int flags);
+/**
+ * Add multiple side data entries to a set in one go.
+ *
+ * @param dst a set to which the side data should be added
+ * @param src a set from which the side data should be copied from
+ * @param flags Some combination of AV_FRAME_SIDE_DATA_SET_FLAG_* flags, or 0.
+ *
+ * @return negative error code on failure, >=0 on success.
+ *
+ * @see av_frame_side_data_set_new_item regarding the flags.
+ */
+int av_frame_side_data_set_extend(AVFrameSideDataSet *dst,
+ const AVFrameSideDataSet src,
+ unsigned int flags);
+
/**
* Get a side data entry of a specific type from a set.
*
diff --git a/libavutil/tests/side_data_set.c b/libavutil/tests/side_data_set.c
index 056d79f655..0c9ceed962 100644
--- a/libavutil/tests/side_data_set.c
+++ b/libavutil/tests/side_data_set.c
@@ -91,6 +91,22 @@ int main(void)
puts("\nFinal state after a single 'no-duplicates' addition:");
print_clls(set);
+ {
+ AVFrameSideDataSet dst_set = { 0 };
+ av_assert0(av_frame_side_data_set_extend(&dst_set, set, 0) >= 0);
+
+ puts("\nState of the copied set:");
+ print_clls(dst_set);
+
+ av_frame_side_data_set_uninit(&dst_set);
+ }
+
+ {
+ int ret = av_frame_side_data_set_extend(&set, set, 0);
+ printf("\nResult of trying to extend a set by itself: %s\n",
+ av_err2str(ret));
+ }
+
av_frame_side_data_set_uninit(&set);
return 0;
diff --git a/tests/ref/fate/side_data_set b/tests/ref/fate/side_data_set
index 7d8c684d8f..3050b31014 100644
--- a/tests/ref/fate/side_data_set
+++ b/tests/ref/fate/side_data_set
@@ -12,3 +12,10 @@ Final state after a single 'no-duplicates' addition:
sd 0, Ambient viewing environment
sd 1, Spherical Mapping
sd 2, Content light level metadata: MaxCLL: 1337
+
+State of the copied set:
+sd 0, Ambient viewing environment
+sd 1, Spherical Mapping
+sd 2, Content light level metadata: MaxCLL: 1337
+
+Result of trying to extend a set by itself: Invalid argument
--
2.41.0
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [FFmpeg-devel] [PATCH v4 08/13] avutil/frame: add helper for extending a set of side data
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 08/13] avutil/frame: add helper for extending a set of side data Jan Ekström
@ 2023-09-02 13:14 ` James Almer
2023-09-02 16:05 ` James Almer
1 sibling, 0 replies; 23+ messages in thread
From: James Almer @ 2023-09-02 13:14 UTC (permalink / raw)
To: ffmpeg-devel
On 9/1/2023 5:38 PM, Jan Ekström wrote:
> Additionally, extend the side data set FATE test to check for the
> invalid use case of extending a set by itself.
> ---
> libavutil/frame.c | 32 ++++++++++++++++++++++++++++++++
> libavutil/frame.h | 15 +++++++++++++++
> libavutil/tests/side_data_set.c | 16 ++++++++++++++++
> tests/ref/fate/side_data_set | 7 +++++++
> 4 files changed, 70 insertions(+)
>
> diff --git a/libavutil/frame.c b/libavutil/frame.c
> index 5f74e0172b..898c749631 100644
> --- a/libavutil/frame.c
> +++ b/libavutil/frame.c
> @@ -879,6 +879,38 @@ AVFrameSideData *av_frame_side_data_set_new_item(AVFrameSideDataSet *set,
> return ret;
> }
>
> +int av_frame_side_data_set_extend(AVFrameSideDataSet *dst,
> + const AVFrameSideDataSet src,
> + unsigned int flags)
flags is unused. Shouldn't you check for the no duplicates one?
> +{
> + if (src.nb_sd > 0 && src.nb_sd == dst->nb_sd &&
> + src.sd == dst->sd)
> + return AVERROR(EINVAL);
> +
> + for (int i = 0; i < src.nb_sd; i++) {
> + const AVFrameSideData *sd_src = src.sd[i];
> + AVBufferRef *buf = av_buffer_ref(sd_src->buf);
> + AVFrameSideData *sd_dst =
> + add_side_data_to_set_from_buf(dst, sd_src->type, buf);
> + if (!sd_dst) {
> + av_buffer_unref(&buf);
> + av_frame_side_data_set_uninit(dst);
> + return AVERROR(ENOMEM);
> + }
> +
> + {
> + int ret = av_dict_copy(&sd_dst->metadata, sd_src->metadata, 0);
> + if (ret < 0) {
> + av_frame_side_data_set_uninit(dst);
> + return ret;
> + }
> + }
> +
> + }
> +
> + return 0;
> +}
> +
> AVFrameSideData *av_frame_side_data_set_get_item(const AVFrameSideDataSet set,
> enum AVFrameSideDataType type)
> {
> diff --git a/libavutil/frame.h b/libavutil/frame.h
> index 8ecdf82f33..e16941c5a5 100644
> --- a/libavutil/frame.h
> +++ b/libavutil/frame.h
> @@ -1085,6 +1085,21 @@ AVFrameSideData *av_frame_side_data_set_new_item(AVFrameSideDataSet *set,
> size_t size,
> unsigned int flags);
>
> +/**
> + * Add multiple side data entries to a set in one go.
> + *
> + * @param dst a set to which the side data should be added
> + * @param src a set from which the side data should be copied from
> + * @param flags Some combination of AV_FRAME_SIDE_DATA_SET_FLAG_* flags, or 0.
> + *
> + * @return negative error code on failure, >=0 on success.
> + *
> + * @see av_frame_side_data_set_new_item regarding the flags.
> + */
> +int av_frame_side_data_set_extend(AVFrameSideDataSet *dst,
> + const AVFrameSideDataSet src,
> + unsigned int flags);
> +
> /**
> * Get a side data entry of a specific type from a set.
> *
> diff --git a/libavutil/tests/side_data_set.c b/libavutil/tests/side_data_set.c
> index 056d79f655..0c9ceed962 100644
> --- a/libavutil/tests/side_data_set.c
> +++ b/libavutil/tests/side_data_set.c
> @@ -91,6 +91,22 @@ int main(void)
> puts("\nFinal state after a single 'no-duplicates' addition:");
> print_clls(set);
>
> + {
> + AVFrameSideDataSet dst_set = { 0 };
> + av_assert0(av_frame_side_data_set_extend(&dst_set, set, 0) >= 0);
> +
> + puts("\nState of the copied set:");
> + print_clls(dst_set);
> +
> + av_frame_side_data_set_uninit(&dst_set);
> + }
> +
> + {
> + int ret = av_frame_side_data_set_extend(&set, set, 0);
> + printf("\nResult of trying to extend a set by itself: %s\n",
> + av_err2str(ret));
> + }
> +
> av_frame_side_data_set_uninit(&set);
>
> return 0;
> diff --git a/tests/ref/fate/side_data_set b/tests/ref/fate/side_data_set
> index 7d8c684d8f..3050b31014 100644
> --- a/tests/ref/fate/side_data_set
> +++ b/tests/ref/fate/side_data_set
> @@ -12,3 +12,10 @@ Final state after a single 'no-duplicates' addition:
> sd 0, Ambient viewing environment
> sd 1, Spherical Mapping
> sd 2, Content light level metadata: MaxCLL: 1337
> +
> +State of the copied set:
> +sd 0, Ambient viewing environment
> +sd 1, Spherical Mapping
> +sd 2, Content light level metadata: MaxCLL: 1337
> +
> +Result of trying to extend a set by itself: Invalid argument
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [FFmpeg-devel] [PATCH v4 08/13] avutil/frame: add helper for extending a set of side data
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 08/13] avutil/frame: add helper for extending a set of side data Jan Ekström
2023-09-02 13:14 ` James Almer
@ 2023-09-02 16:05 ` James Almer
1 sibling, 0 replies; 23+ messages in thread
From: James Almer @ 2023-09-02 16:05 UTC (permalink / raw)
To: ffmpeg-devel
On 9/1/2023 5:38 PM, Jan Ekström wrote:
> Additionally, extend the side data set FATE test to check for the
> invalid use case of extending a set by itself.
> ---
> libavutil/frame.c | 32 ++++++++++++++++++++++++++++++++
> libavutil/frame.h | 15 +++++++++++++++
> libavutil/tests/side_data_set.c | 16 ++++++++++++++++
> tests/ref/fate/side_data_set | 7 +++++++
> 4 files changed, 70 insertions(+)
>
> diff --git a/libavutil/frame.c b/libavutil/frame.c
> index 5f74e0172b..898c749631 100644
> --- a/libavutil/frame.c
> +++ b/libavutil/frame.c
> @@ -879,6 +879,38 @@ AVFrameSideData *av_frame_side_data_set_new_item(AVFrameSideDataSet *set,
> return ret;
> }
>
> +int av_frame_side_data_set_extend(AVFrameSideDataSet *dst,
> + const AVFrameSideDataSet src,
> + unsigned int flags)
I think a standard, more versatile add() function would be better. The
signature would be something like
av_frame_side_data_set_add_item(AVFrameSideDataSet *set,
const AVBufferRef *buf,
unsigned int flags);
It would also be a good chance to fix the non standard behavior i had
misfortune to introduce with av_frame_new_side_data_from_buf() by having
this function actually create a new reference to the passed in buffer
rather than take ownership of it.
> +{
> + if (src.nb_sd > 0 && src.nb_sd == dst->nb_sd &&
> + src.sd == dst->sd)
> + return AVERROR(EINVAL);
> +
> + for (int i = 0; i < src.nb_sd; i++) {
> + const AVFrameSideData *sd_src = src.sd[i];
> + AVBufferRef *buf = av_buffer_ref(sd_src->buf);
> + AVFrameSideData *sd_dst =
> + add_side_data_to_set_from_buf(dst, sd_src->type, buf);
> + if (!sd_dst) {
> + av_buffer_unref(&buf);
> + av_frame_side_data_set_uninit(dst);
> + return AVERROR(ENOMEM);
> + }
> +
> + {
> + int ret = av_dict_copy(&sd_dst->metadata, sd_src->metadata, 0);
> + if (ret < 0) {
> + av_frame_side_data_set_uninit(dst);
> + return ret;
> + }
> + }
> +
> + }
> +
> + return 0;
> +}
> +
> AVFrameSideData *av_frame_side_data_set_get_item(const AVFrameSideDataSet set,
> enum AVFrameSideDataType type)
> {
> diff --git a/libavutil/frame.h b/libavutil/frame.h
> index 8ecdf82f33..e16941c5a5 100644
> --- a/libavutil/frame.h
> +++ b/libavutil/frame.h
> @@ -1085,6 +1085,21 @@ AVFrameSideData *av_frame_side_data_set_new_item(AVFrameSideDataSet *set,
> size_t size,
> unsigned int flags);
>
> +/**
> + * Add multiple side data entries to a set in one go.
> + *
> + * @param dst a set to which the side data should be added
> + * @param src a set from which the side data should be copied from
> + * @param flags Some combination of AV_FRAME_SIDE_DATA_SET_FLAG_* flags, or 0.
> + *
> + * @return negative error code on failure, >=0 on success.
> + *
> + * @see av_frame_side_data_set_new_item regarding the flags.
> + */
> +int av_frame_side_data_set_extend(AVFrameSideDataSet *dst,
> + const AVFrameSideDataSet src,
> + unsigned int flags);
> +
> /**
> * Get a side data entry of a specific type from a set.
> *
> diff --git a/libavutil/tests/side_data_set.c b/libavutil/tests/side_data_set.c
> index 056d79f655..0c9ceed962 100644
> --- a/libavutil/tests/side_data_set.c
> +++ b/libavutil/tests/side_data_set.c
> @@ -91,6 +91,22 @@ int main(void)
> puts("\nFinal state after a single 'no-duplicates' addition:");
> print_clls(set);
>
> + {
> + AVFrameSideDataSet dst_set = { 0 };
> + av_assert0(av_frame_side_data_set_extend(&dst_set, set, 0) >= 0);
> +
> + puts("\nState of the copied set:");
> + print_clls(dst_set);
> +
> + av_frame_side_data_set_uninit(&dst_set);
> + }
> +
> + {
> + int ret = av_frame_side_data_set_extend(&set, set, 0);
> + printf("\nResult of trying to extend a set by itself: %s\n",
> + av_err2str(ret));
> + }
> +
> av_frame_side_data_set_uninit(&set);
>
> return 0;
> diff --git a/tests/ref/fate/side_data_set b/tests/ref/fate/side_data_set
> index 7d8c684d8f..3050b31014 100644
> --- a/tests/ref/fate/side_data_set
> +++ b/tests/ref/fate/side_data_set
> @@ -12,3 +12,10 @@ Final state after a single 'no-duplicates' addition:
> sd 0, Ambient viewing environment
> sd 1, Spherical Mapping
> sd 2, Content light level metadata: MaxCLL: 1337
> +
> +State of the copied set:
> +sd 0, Ambient viewing environment
> +sd 1, Spherical Mapping
> +sd 2, Content light level metadata: MaxCLL: 1337
> +
> +Result of trying to extend a set by itself: Invalid argument
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 23+ messages in thread
* [FFmpeg-devel] [PATCH v4 09/13] avcodec: add side data set to AVCodecContext
2023-09-01 20:38 [FFmpeg-devel] [PATCH v4 00/13] encoder AVCodecContext configuration side data Jan Ekström
` (7 preceding siblings ...)
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 08/13] avutil/frame: add helper for extending a set of side data Jan Ekström
@ 2023-09-01 20:38 ` Jan Ekström
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 10/13] ffmpeg: pass first video AVFrame's side data to encoder Jan Ekström
` (3 subsequent siblings)
12 siblings, 0 replies; 23+ messages in thread
From: Jan Ekström @ 2023-09-01 20:38 UTC (permalink / raw)
To: ffmpeg-devel
This allows configuring an encoder by using AVFrameSideData.
---
libavcodec/avcodec.h | 7 +++++++
libavcodec/options.c | 1 +
2 files changed, 8 insertions(+)
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 649411ac79..ce673a4e65 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -2100,6 +2100,13 @@ typedef struct AVCodecContext {
* an error.
*/
int64_t frame_num;
+
+ /**
+ * Set containing static side data, such as HDR10 CLL / MDCV structures.
+ * - encoding: set by user
+ * - decoding: unused
+ */
+ AVFrameSideDataSet frame_sd_set;
} AVCodecContext;
/**
diff --git a/libavcodec/options.c b/libavcodec/options.c
index a9b35ee1c3..e42a29e834 100644
--- a/libavcodec/options.c
+++ b/libavcodec/options.c
@@ -180,6 +180,7 @@ void avcodec_free_context(AVCodecContext **pavctx)
av_freep(&avctx->inter_matrix);
av_freep(&avctx->rc_override);
av_channel_layout_uninit(&avctx->ch_layout);
+ av_frame_side_data_set_uninit(&avctx->frame_sd_set);
av_freep(pavctx);
}
--
2.41.0
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 23+ messages in thread
* [FFmpeg-devel] [PATCH v4 10/13] ffmpeg: pass first video AVFrame's side data to encoder
2023-09-01 20:38 [FFmpeg-devel] [PATCH v4 00/13] encoder AVCodecContext configuration side data Jan Ekström
` (8 preceding siblings ...)
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 09/13] avcodec: add side data set to AVCodecContext Jan Ekström
@ 2023-09-01 20:38 ` Jan Ekström
2023-09-02 16:10 ` James Almer
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 11/13] avcodec/libsvtav1: add support for writing out CLL and MDCV Jan Ekström
` (2 subsequent siblings)
12 siblings, 1 reply; 23+ messages in thread
From: Jan Ekström @ 2023-09-01 20:38 UTC (permalink / raw)
To: ffmpeg-devel
This enables further configuration of output based on the results
of input decoding and filtering in a similar manner as the color
information.
---
fftools/ffmpeg_enc.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/fftools/ffmpeg_enc.c b/fftools/ffmpeg_enc.c
index f28884e50c..0d022700cf 100644
--- a/fftools/ffmpeg_enc.c
+++ b/fftools/ffmpeg_enc.c
@@ -356,6 +356,19 @@ int enc_open(OutputStream *ost, AVFrame *frame)
enc_ctx->colorspace = frame->colorspace;
enc_ctx->chroma_sample_location = frame->chroma_location;
+ ret = av_frame_side_data_set_extend(
+ &enc_ctx->frame_sd_set,
+ (const AVFrameSideDataSet){
+ .sd = frame->side_data,
+ .nb_sd = frame->nb_side_data
+ },
+ AV_FRAME_SIDE_DATA_SET_FLAG_NO_DUPLICATES);
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_ERROR, "failed to configure video encoder: %s!\n",
+ av_err2str(ret));
+ return ret;
+ }
+
// Field order: autodetection
if (enc_ctx->flags & (AV_CODEC_FLAG_INTERLACED_DCT | AV_CODEC_FLAG_INTERLACED_ME) &&
ost->top_field_first >= 0)
--
2.41.0
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [FFmpeg-devel] [PATCH v4 10/13] ffmpeg: pass first video AVFrame's side data to encoder
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 10/13] ffmpeg: pass first video AVFrame's side data to encoder Jan Ekström
@ 2023-09-02 16:10 ` James Almer
0 siblings, 0 replies; 23+ messages in thread
From: James Almer @ 2023-09-02 16:10 UTC (permalink / raw)
To: ffmpeg-devel
On 9/1/2023 5:38 PM, Jan Ekström wrote:
> This enables further configuration of output based on the results
> of input decoding and filtering in a similar manner as the color
> information.
> ---
> fftools/ffmpeg_enc.c | 13 +++++++++++++
> 1 file changed, 13 insertions(+)
>
> diff --git a/fftools/ffmpeg_enc.c b/fftools/ffmpeg_enc.c
> index f28884e50c..0d022700cf 100644
> --- a/fftools/ffmpeg_enc.c
> +++ b/fftools/ffmpeg_enc.c
> @@ -356,6 +356,19 @@ int enc_open(OutputStream *ost, AVFrame *frame)
> enc_ctx->colorspace = frame->colorspace;
> enc_ctx->chroma_sample_location = frame->chroma_location;
>
> + ret = av_frame_side_data_set_extend(
> + &enc_ctx->frame_sd_set,
> + (const AVFrameSideDataSet){
> + .sd = frame->side_data,
> + .nb_sd = frame->nb_side_data
> + },
> + AV_FRAME_SIDE_DATA_SET_FLAG_NO_DUPLICATES);
> + if (ret < 0) {
> + av_log(NULL, AV_LOG_ERROR, "failed to configure video encoder: %s!\n",
> + av_err2str(ret));
> + return ret;
> + }
Following what i suggested in my last email, this would instead be a
loop adding all the frame->side_data entries.
> +
> // Field order: autodetection
> if (enc_ctx->flags & (AV_CODEC_FLAG_INTERLACED_DCT | AV_CODEC_FLAG_INTERLACED_ME) &&
> ost->top_field_first >= 0)
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 23+ messages in thread
* [FFmpeg-devel] [PATCH v4 11/13] avcodec/libsvtav1: add support for writing out CLL and MDCV
2023-09-01 20:38 [FFmpeg-devel] [PATCH v4 00/13] encoder AVCodecContext configuration side data Jan Ekström
` (9 preceding siblings ...)
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 10/13] ffmpeg: pass first video AVFrame's side data to encoder Jan Ekström
@ 2023-09-01 20:38 ` Jan Ekström
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 12/13] avcodec/libx264: " Jan Ekström
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 13/13] avcodec/libx265: " Jan Ekström
12 siblings, 0 replies; 23+ messages in thread
From: Jan Ekström @ 2023-09-01 20:38 UTC (permalink / raw)
To: ffmpeg-devel
These two were added in 28e23d7f348c78d49a726c7469f9d4e38edec341
and 3558c1f2e97455e0b89edef31b9a72ab7fa30550 for version 0.9.0 of
SVT-AV1, which is also our minimum requirement right now.
In other words, no additional version limiting conditions seem
to be required.
Additionally, add a FATE test which verifies that pass-through of
the MDCV/CLL side data is working during encoding.
---
libavcodec/libsvtav1.c | 67 ++++++++++++++++++++++++++++++++++
tests/fate/enc_external.mak | 5 +++
tests/ref/fate/libsvtav1-hdr10 | 14 +++++++
3 files changed, 86 insertions(+)
create mode 100644 tests/ref/fate/libsvtav1-hdr10
diff --git a/libavcodec/libsvtav1.c b/libavcodec/libsvtav1.c
index f2b73361d8..a56845c078 100644
--- a/libavcodec/libsvtav1.c
+++ b/libavcodec/libsvtav1.c
@@ -27,6 +27,8 @@
#include "libavutil/common.h"
#include "libavutil/frame.h"
#include "libavutil/imgutils.h"
+#include "libavutil/intreadwrite.h"
+#include "libavutil/mastering_display_metadata.h"
#include "libavutil/opt.h"
#include "libavutil/pixdesc.h"
#include "libavutil/avassert.h"
@@ -146,6 +148,69 @@ static int alloc_buffer(EbSvtAv1EncConfiguration *config, SvtContext *svt_enc)
}
+static void handle_mdcv(struct EbSvtAv1MasteringDisplayInfo *dst,
+ const AVMasteringDisplayMetadata *mdcv)
+{
+ if (mdcv->has_primaries) {
+ const struct EbSvtAv1ChromaPoints *const points[] = {
+ &dst->r,
+ &dst->g,
+ &dst->b,
+ };
+
+ for (int i = 0; i < 3; i++) {
+ const struct EbSvtAv1ChromaPoints *dst = points[i];
+ const AVRational *src = mdcv->display_primaries[i];
+
+ AV_WB16(&dst->x,
+ av_rescale_q(1, src[0], (AVRational){ 1, (1 << 16) }));
+ AV_WB16(&dst->y,
+ av_rescale_q(1, src[1], (AVRational){ 1, (1 << 16) }));
+ }
+
+ AV_WB16(&dst->white_point.x,
+ av_rescale_q(1, mdcv->white_point[0],
+ (AVRational){ 1, (1 << 16) }));
+ AV_WB16(&dst->white_point.y,
+ av_rescale_q(1, mdcv->white_point[1],
+ (AVRational){ 1, (1 << 16) }));
+ }
+
+ if (mdcv->has_luminance) {
+ AV_WB32(&dst->max_luma,
+ av_rescale_q(1, mdcv->max_luminance,
+ (AVRational){ 1, (1 << 8) }));
+ AV_WB32(&dst->min_luma,
+ av_rescale_q(1, mdcv->min_luminance,
+ (AVRational){ 1, (1 << 14) }));
+ }
+}
+
+static void handle_side_data(AVCodecContext *avctx,
+ EbSvtAv1EncConfiguration *param)
+{
+ const AVFrameSideDataSet set = avctx->frame_sd_set;
+ const AVFrameSideData *cll_sd =
+ av_frame_side_data_set_get_item(
+ set, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL);
+ const AVFrameSideData *mdcv_sd =
+ av_frame_side_data_set_get_item(
+ set, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA);
+
+ if (cll_sd) {
+ const AVContentLightMetadata *cll =
+ (AVContentLightMetadata *)cll_sd->data;
+
+ AV_WB16(¶m->content_light_level.max_cll, cll->MaxCLL);
+ AV_WB16(¶m->content_light_level.max_fall, cll->MaxFALL);
+ }
+
+ if (mdcv_sd) {
+ handle_mdcv(¶m->mastering_display,
+ (AVMasteringDisplayMetadata *)mdcv_sd->data);
+ }
+}
+
static int config_enc_params(EbSvtAv1EncConfiguration *param,
AVCodecContext *avctx)
{
@@ -273,6 +338,8 @@ FF_ENABLE_DEPRECATION_WARNINGS
/* 2 = IDR, closed GOP, 1 = CRA, open GOP */
param->intra_refresh_type = avctx->flags & AV_CODEC_FLAG_CLOSED_GOP ? 2 : 1;
+ handle_side_data(avctx, param);
+
#if SVT_AV1_CHECK_VERSION(0, 9, 1)
while ((en = av_dict_get(svt_enc->svtav1_opts, "", en, AV_DICT_IGNORE_SUFFIX))) {
EbErrorType ret = svt_av1_enc_parse_parameter(param, en->key, en->value);
diff --git a/tests/fate/enc_external.mak b/tests/fate/enc_external.mak
index 7eabebcc51..d787941c16 100644
--- a/tests/fate/enc_external.mak
+++ b/tests/fate/enc_external.mak
@@ -2,5 +2,10 @@ FATE_ENC_EXTERNAL-$(call ENCDEC, LIBX264 H264, MOV, H264_DEMUXER) += fate-libx26
fate-libx264-simple: CMD = enc_external $(TARGET_SAMPLES)/h264-conformance/BA1_Sony_D.jsv \
mp4 "-c:v libx264" "-show_entries frame=width,height,pix_fmt,pts,pkt_dts -of flat"
+# test for SVT-AV1 MDCV and CLL passthrough during encoding
+FATE_ENC_EXTERNAL-$(call ENCDEC, LIBSVTAV1 HEVC, MOV, HEVC_DEMUXER LIBDAV1D_DECODER) += fate-libsvtav1-hdr10
+fate-libsvtav1-hdr10: CMD = enc_external $(TARGET_SAMPLES)/hevc/hdr10_plus_h265_sample.hevc \
+ mp4 "-c:v libsvtav1" "-show_frames -show_entries frame=side_data_list -of flat"
+
FATE_SAMPLES_FFMPEG_FFPROBE += $(FATE_ENC_EXTERNAL-yes)
fate-enc-external: $(FATE_ENC_EXTERNAL-yes)
diff --git a/tests/ref/fate/libsvtav1-hdr10 b/tests/ref/fate/libsvtav1-hdr10
new file mode 100644
index 0000000000..6f0d34903b
--- /dev/null
+++ b/tests/ref/fate/libsvtav1-hdr10
@@ -0,0 +1,14 @@
+frames.frame.0.side_data_list.side_data.0.side_data_type="Mastering display metadata"
+frames.frame.0.side_data_list.side_data.0.red_x="17367/65536"
+frames.frame.0.side_data_list.side_data.0.red_y="45220/65536"
+frames.frame.0.side_data_list.side_data.0.green_x="9830/65536"
+frames.frame.0.side_data_list.side_data.0.green_y="3932/65536"
+frames.frame.0.side_data_list.side_data.0.blue_x="44564/65536"
+frames.frame.0.side_data_list.side_data.0.blue_y="20972/65536"
+frames.frame.0.side_data_list.side_data.0.white_point_x="20493/65536"
+frames.frame.0.side_data_list.side_data.0.white_point_y="21561/65536"
+frames.frame.0.side_data_list.side_data.0.min_luminance="82/16384"
+frames.frame.0.side_data_list.side_data.0.max_luminance="256000/256"
+frames.frame.0.side_data_list.side_data.1.side_data_type="Content light level metadata"
+frames.frame.0.side_data_list.side_data.1.max_content=1000
+frames.frame.0.side_data_list.side_data.1.max_average=200
--
2.41.0
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 23+ messages in thread
* [FFmpeg-devel] [PATCH v4 12/13] avcodec/libx264: add support for writing out CLL and MDCV
2023-09-01 20:38 [FFmpeg-devel] [PATCH v4 00/13] encoder AVCodecContext configuration side data Jan Ekström
` (10 preceding siblings ...)
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 11/13] avcodec/libsvtav1: add support for writing out CLL and MDCV Jan Ekström
@ 2023-09-01 20:38 ` Jan Ekström
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 13/13] avcodec/libx265: " Jan Ekström
12 siblings, 0 replies; 23+ messages in thread
From: Jan Ekström @ 2023-09-01 20:38 UTC (permalink / raw)
To: ffmpeg-devel
Both of these two structures were first available with X264_BUILD
163, so make relevant functionality conditional on the version
being at least such.
Keep handle_side_data available in all cases as this way X264_init
does not require additional version based conditions within it.
Finally, add a FATE test which verifies that pass-through of the
MDCV/CLL side data is working during encoding.
---
configure | 2 +
libavcodec/libx264.c | 78 ++++++++++++++++++++++++++++++++++++
tests/fate/enc_external.mak | 5 +++
tests/ref/fate/libx264-hdr10 | 15 +++++++
4 files changed, 100 insertions(+)
create mode 100644 tests/ref/fate/libx264-hdr10
diff --git a/configure b/configure
index bd7f7697c8..432f2f8144 100755
--- a/configure
+++ b/configure
@@ -2518,6 +2518,7 @@ CONFIG_EXTRA="
jpegtables
lgplv3
libx262
+ libx264_hdr10
llauddsp
llviddsp
llvidencdsp
@@ -6844,6 +6845,7 @@ enabled libx264 && require_pkg_config libx264 x264 "stdint.h x264.h" x
require_cpp_condition libx264 x264.h "X264_BUILD >= 122" && {
[ "$toolchain" != "msvc" ] ||
require_cpp_condition libx264 x264.h "X264_BUILD >= 158"; } &&
+ check_cpp_condition libx264_hdr10 x264.h "X264_BUILD >= 163" &&
check_cpp_condition libx262 x264.h "X264_MPEG2"
enabled libx265 && require_pkg_config libx265 x265 x265.h x265_api_get &&
require_cpp_condition libx265 x265.h "X265_BUILD >= 89"
diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c
index ce849d6c9a..f311c7b087 100644
--- a/libavcodec/libx264.c
+++ b/libavcodec/libx264.c
@@ -25,6 +25,7 @@
#include "libavutil/eval.h"
#include "libavutil/internal.h"
#include "libavutil/opt.h"
+#include "libavutil/mastering_display_metadata.h"
#include "libavutil/mem.h"
#include "libavutil/pixdesc.h"
#include "libavutil/stereo3d.h"
@@ -842,6 +843,81 @@ static int convert_pix_fmt(enum AVPixelFormat pix_fmt)
return AVERROR(EINVAL);\
}
+#if CONFIG_LIBX264_HDR10
+static void handle_mdcv(x264_param_t *params,
+ const AVMasteringDisplayMetadata *mdcv)
+{
+ if (!mdcv->has_primaries && !mdcv->has_luminance)
+ return;
+
+ params->mastering_display.b_mastering_display = 1;
+
+ if (mdcv->has_primaries) {
+ int *const points[][2] = {
+ {
+ ¶ms->mastering_display.i_red_x,
+ ¶ms->mastering_display.i_red_y
+ },
+ {
+ ¶ms->mastering_display.i_green_x,
+ ¶ms->mastering_display.i_green_y
+ },
+ {
+ ¶ms->mastering_display.i_blue_x,
+ ¶ms->mastering_display.i_blue_y
+ },
+ };
+
+ for (int i = 0; i < 3; i++) {
+ const AVRational *src = mdcv->display_primaries[i];
+ int *dst[2] = { points[i][0], points[i][1] };
+
+ *dst[0] = av_rescale_q(1, src[0], (AVRational){ 1, 50000 });
+ *dst[1] = av_rescale_q(1, src[1], (AVRational){ 1, 50000 });
+ }
+
+ params->mastering_display.i_white_x =
+ av_rescale_q(1, mdcv->white_point[0], (AVRational){ 1, 50000 });
+ params->mastering_display.i_white_y =
+ av_rescale_q(1, mdcv->white_point[1], (AVRational){ 1, 50000 });
+ }
+
+ if (mdcv->has_luminance) {
+ params->mastering_display.i_display_max =
+ av_rescale_q(1, mdcv->max_luminance, (AVRational){ 1, 10000 });
+ params->mastering_display.i_display_min =
+ av_rescale_q(1, mdcv->min_luminance, (AVRational){ 1, 10000 });
+ }
+}
+#endif // CONFIG_LIBX264_HDR10
+
+static void handle_side_data(AVCodecContext *avctx, x264_param_t *params)
+{
+#if CONFIG_LIBX264_HDR10
+ const AVFrameSideDataSet set = avctx->frame_sd_set;
+ const AVFrameSideData *cll_sd =
+ av_frame_side_data_set_get_item(
+ set, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL);
+ const AVFrameSideData *mdcv_sd =
+ av_frame_side_data_set_get_item(
+ set, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA);
+
+ if (cll_sd) {
+ const AVContentLightMetadata *cll =
+ (AVContentLightMetadata *)cll_sd->data;
+
+ params->content_light_level.i_max_cll = cll->MaxCLL;
+ params->content_light_level.i_max_fall = cll->MaxFALL;
+
+ params->content_light_level.b_cll = 1;
+ }
+
+ if (mdcv_sd) {
+ handle_mdcv(params, (AVMasteringDisplayMetadata *)mdcv_sd->data);
+ }
+#endif // CONFIG_LIBX264_HDR10
+}
+
static av_cold int X264_init(AVCodecContext *avctx)
{
X264Context *x4 = avctx->priv_data;
@@ -1142,6 +1218,8 @@ FF_ENABLE_DEPRECATION_WARNINGS
if (avctx->chroma_sample_location != AVCHROMA_LOC_UNSPECIFIED)
x4->params.vui.i_chroma_loc = avctx->chroma_sample_location - 1;
+ handle_side_data(avctx, &x4->params);
+
if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER)
x4->params.b_repeat_headers = 0;
diff --git a/tests/fate/enc_external.mak b/tests/fate/enc_external.mak
index d787941c16..4095a4b51a 100644
--- a/tests/fate/enc_external.mak
+++ b/tests/fate/enc_external.mak
@@ -7,5 +7,10 @@ FATE_ENC_EXTERNAL-$(call ENCDEC, LIBSVTAV1 HEVC, MOV, HEVC_DEMUXER LIBDAV1D_DECO
fate-libsvtav1-hdr10: CMD = enc_external $(TARGET_SAMPLES)/hevc/hdr10_plus_h265_sample.hevc \
mp4 "-c:v libsvtav1" "-show_frames -show_entries frame=side_data_list -of flat"
+# test for x264 MDCV and CLL passthrough during encoding
+FATE_ENC_EXTERNAL-$(call ENCDEC, LIBX264 HEVC, MOV, LIBX264_HDR10 HEVC_DEMUXER H264_DECODER) += fate-libx264-hdr10
+fate-libx264-hdr10: CMD = enc_external $(TARGET_SAMPLES)/hevc/hdr10_plus_h265_sample.hevc \
+ mp4 "-c:v libx264" "-show_frames -show_entries frame=side_data_list -of flat"
+
FATE_SAMPLES_FFMPEG_FFPROBE += $(FATE_ENC_EXTERNAL-yes)
fate-enc-external: $(FATE_ENC_EXTERNAL-yes)
diff --git a/tests/ref/fate/libx264-hdr10 b/tests/ref/fate/libx264-hdr10
new file mode 100644
index 0000000000..99c11677f0
--- /dev/null
+++ b/tests/ref/fate/libx264-hdr10
@@ -0,0 +1,15 @@
+frames.frame.0.side_data_list.side_data.0.side_data_type="H.26[45] User Data Unregistered SEI message"
+frames.frame.0.side_data_list.side_data.1.side_data_type="Mastering display metadata"
+frames.frame.0.side_data_list.side_data.1.red_x="13250/50000"
+frames.frame.0.side_data_list.side_data.1.red_y="34500/50000"
+frames.frame.0.side_data_list.side_data.1.green_x="7500/50000"
+frames.frame.0.side_data_list.side_data.1.green_y="3000/50000"
+frames.frame.0.side_data_list.side_data.1.blue_x="34000/50000"
+frames.frame.0.side_data_list.side_data.1.blue_y="16000/50000"
+frames.frame.0.side_data_list.side_data.1.white_point_x="15635/50000"
+frames.frame.0.side_data_list.side_data.1.white_point_y="16450/50000"
+frames.frame.0.side_data_list.side_data.1.min_luminance="50/10000"
+frames.frame.0.side_data_list.side_data.1.max_luminance="10000000/10000"
+frames.frame.0.side_data_list.side_data.2.side_data_type="Content light level metadata"
+frames.frame.0.side_data_list.side_data.2.max_content=1000
+frames.frame.0.side_data_list.side_data.2.max_average=200
--
2.41.0
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 23+ messages in thread
* [FFmpeg-devel] [PATCH v4 13/13] avcodec/libx265: add support for writing out CLL and MDCV
2023-09-01 20:38 [FFmpeg-devel] [PATCH v4 00/13] encoder AVCodecContext configuration side data Jan Ekström
` (11 preceding siblings ...)
2023-09-01 20:38 ` [FFmpeg-devel] [PATCH v4 12/13] avcodec/libx264: " Jan Ekström
@ 2023-09-01 20:38 ` Jan Ekström
12 siblings, 0 replies; 23+ messages in thread
From: Jan Ekström @ 2023-09-01 20:38 UTC (permalink / raw)
To: ffmpeg-devel
The newer of these two are the separate integers for content light
level, introduced in 3952bf3e98c76c31594529a3fe34e056d3e3e2ea ,
with X265_BUILD 75. As we already require X265_BUILD of at least
89, no further conditions are required.
---
libavcodec/libx265.c | 87 ++++++++++++++++++++++++++++++++++++
tests/fate/enc_external.mak | 5 +++
tests/ref/fate/libx265-hdr10 | 16 +++++++
3 files changed, 108 insertions(+)
create mode 100644 tests/ref/fate/libx265-hdr10
diff --git a/libavcodec/libx265.c b/libavcodec/libx265.c
index 873b3021ee..eb4a42b06c 100644
--- a/libavcodec/libx265.c
+++ b/libavcodec/libx265.c
@@ -28,9 +28,11 @@
#include <float.h>
#include "libavutil/avassert.h"
+#include "libavutil/bprint.h"
#include "libavutil/buffer.h"
#include "libavutil/internal.h"
#include "libavutil/common.h"
+#include "libavutil/mastering_display_metadata.h"
#include "libavutil/opt.h"
#include "libavutil/pixdesc.h"
#include "avcodec.h"
@@ -179,6 +181,84 @@ static av_cold int libx265_param_parse_int(AVCodecContext *avctx,
return 0;
}
+static int handle_mdcv(const AVClass **avcl, const x265_api *api,
+ x265_param *params,
+ const AVMasteringDisplayMetadata *mdcv)
+{
+ int ret = AVERROR_BUG;
+ AVBPrint buf;
+ av_bprint_init(&buf, 0, AV_BPRINT_SIZE_AUTOMATIC);
+
+ // G(%hu,%hu)B(%hu,%hu)R(%hu,%hu)WP(%hu,%hu)L(%u,%u)
+ av_bprintf(
+ &buf,
+ "G(%"PRId64",%"PRId64")B(%"PRId64",%"PRId64")R(%"PRId64",%"PRId64")"
+ "WP(%"PRId64",%"PRId64")L(%"PRId64",%"PRId64")",
+ av_rescale_q(1, mdcv->display_primaries[1][0], (AVRational){ 1, 50000 }),
+ av_rescale_q(1, mdcv->display_primaries[1][1], (AVRational){ 1, 50000 }),
+ av_rescale_q(1, mdcv->display_primaries[2][0], (AVRational){ 1, 50000 }),
+ av_rescale_q(1, mdcv->display_primaries[2][1], (AVRational){ 1, 50000 }),
+ av_rescale_q(1, mdcv->display_primaries[0][0], (AVRational){ 1, 50000 }),
+ av_rescale_q(1, mdcv->display_primaries[0][1], (AVRational){ 1, 50000 }),
+ av_rescale_q(1, mdcv->white_point[0], (AVRational){ 1, 50000 }),
+ av_rescale_q(1, mdcv->white_point[1], (AVRational){ 1, 50000 }),
+ av_rescale_q(1, mdcv->max_luminance, (AVRational){ 1, 10000 }),
+ av_rescale_q(1, mdcv->min_luminance, (AVRational){ 1, 10000 }));
+
+ if (!av_bprint_is_complete(&buf)) {
+ av_log(avcl, AV_LOG_ERROR,
+ "MDCV string too long for its available space!\n");
+ ret = AVERROR(ENOMEM);
+ goto end;
+ }
+
+ if (api->param_parse(params, "master-display", buf.str) ==
+ X265_PARAM_BAD_VALUE) {
+ av_log(avcl, AV_LOG_ERROR,
+ "Invalid value \"%s\" for param \"master-display\".\n",
+ buf.str);
+ ret = AVERROR(EINVAL);
+ goto end;
+ }
+
+ ret = 0;
+
+end:
+ av_bprint_finalize(&buf, NULL);
+
+ return ret;
+}
+
+static int handle_side_data(AVCodecContext *avctx, const x265_api *api,
+ x265_param *params)
+{
+ const AVFrameSideDataSet set = avctx->frame_sd_set;
+ const AVFrameSideData *cll_sd =
+ av_frame_side_data_set_get_item(
+ set, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL);
+ const AVFrameSideData *mdcv_sd =
+ av_frame_side_data_set_get_item(
+ set, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA);
+
+ if (cll_sd) {
+ const AVContentLightMetadata *cll =
+ (AVContentLightMetadata *)cll_sd->data;
+
+ params->maxCLL = cll->MaxCLL;
+ params->maxFALL = cll->MaxFALL;
+ }
+
+ if (mdcv_sd) {
+ int ret = handle_mdcv(
+ &avctx->av_class, api, params,
+ (AVMasteringDisplayMetadata *)mdcv_sd->data);
+ if (ret < 0)
+ return ret;
+ }
+
+ return 0;
+}
+
static av_cold int libx265_encode_init(AVCodecContext *avctx)
{
libx265Context *ctx = avctx->priv_data;
@@ -339,6 +419,13 @@ FF_ENABLE_DEPRECATION_WARNINGS
return AVERROR_BUG;
}
+ ret = handle_side_data(avctx, ctx->api, ctx->params);
+ if (ret < 0) {
+ av_log(avctx, AV_LOG_ERROR, "Failed handling side data! (%s)\n",
+ av_err2str(ret));
+ return ret;
+ }
+
if (ctx->crf >= 0) {
char crf[6];
diff --git a/tests/fate/enc_external.mak b/tests/fate/enc_external.mak
index 4095a4b51a..30021efbcd 100644
--- a/tests/fate/enc_external.mak
+++ b/tests/fate/enc_external.mak
@@ -12,5 +12,10 @@ FATE_ENC_EXTERNAL-$(call ENCDEC, LIBX264 HEVC, MOV, LIBX264_HDR10 HEVC_DEMUXER H
fate-libx264-hdr10: CMD = enc_external $(TARGET_SAMPLES)/hevc/hdr10_plus_h265_sample.hevc \
mp4 "-c:v libx264" "-show_frames -show_entries frame=side_data_list -of flat"
+# test for x265 MDCV and CLL passthrough during encoding
+FATE_ENC_EXTERNAL-$(call ENCDEC, LIBX265 HEVC, MOV, HEVC_DEMUXER) += fate-libx265-hdr10
+fate-libx265-hdr10: CMD = enc_external $(TARGET_SAMPLES)/hevc/hdr10_plus_h265_sample.hevc \
+ mp4 "-c:v libx265" "-show_frames -show_entries frame=side_data_list -of flat"
+
FATE_SAMPLES_FFMPEG_FFPROBE += $(FATE_ENC_EXTERNAL-yes)
fate-enc-external: $(FATE_ENC_EXTERNAL-yes)
diff --git a/tests/ref/fate/libx265-hdr10 b/tests/ref/fate/libx265-hdr10
new file mode 100644
index 0000000000..571c837cac
--- /dev/null
+++ b/tests/ref/fate/libx265-hdr10
@@ -0,0 +1,16 @@
+frames.frame.0.side_data_list.side_data.0.side_data_type="H.26[45] User Data Unregistered SEI message"
+frames.frame.0.side_data_list.side_data.1.side_data_type="H.26[45] User Data Unregistered SEI message"
+frames.frame.0.side_data_list.side_data.2.side_data_type="Mastering display metadata"
+frames.frame.0.side_data_list.side_data.2.red_x="13250/50000"
+frames.frame.0.side_data_list.side_data.2.red_y="34500/50000"
+frames.frame.0.side_data_list.side_data.2.green_x="7500/50000"
+frames.frame.0.side_data_list.side_data.2.green_y="3000/50000"
+frames.frame.0.side_data_list.side_data.2.blue_x="34000/50000"
+frames.frame.0.side_data_list.side_data.2.blue_y="16000/50000"
+frames.frame.0.side_data_list.side_data.2.white_point_x="15635/50000"
+frames.frame.0.side_data_list.side_data.2.white_point_y="16450/50000"
+frames.frame.0.side_data_list.side_data.2.min_luminance="50/10000"
+frames.frame.0.side_data_list.side_data.2.max_luminance="10000000/10000"
+frames.frame.0.side_data_list.side_data.3.side_data_type="Content light level metadata"
+frames.frame.0.side_data_list.side_data.3.max_content=1000
+frames.frame.0.side_data_list.side_data.3.max_average=200
--
2.41.0
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 23+ messages in thread