This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit 7ea44ca6a6fb630a0678e8afbdd6bb49f06baba5 Author: marcos ashton <[email protected]> AuthorDate: Tue Mar 31 22:20:33 2026 +0100 Commit: michaelni <[email protected]> CommitDate: Thu Jul 2 13:48:58 2026 +0000 tests/fate/libavutil: add FATE test for mastering_display_metadata Test all 5 public functions: av_mastering_display_metadata_alloc, av_mastering_display_metadata_alloc_size, the create_side_data variant, av_content_light_metadata_alloc, and its create_side_data variant. Verifies the {0,1} rational defaults set by get_defaults(), write/read-back of HDR metadata fields, frame side data attachment for both mastering display and content light metadata, and OOM paths via av_max_alloc. Coverage for libavutil/mastering_display_metadata.c: 86.49% -> 100.00% --- .forgejo/CODEOWNERS | 2 + libavutil/Makefile | 1 + libavutil/tests/.gitignore | 1 + libavutil/tests/mastering_display_metadata.c | 160 +++++++++++++++++++++++++++ tests/fate/libavutil.mak | 4 + tests/ref/fate/mastering_display_metadata | 31 ++++++ 6 files changed, 199 insertions(+) diff --git a/.forgejo/CODEOWNERS b/.forgejo/CODEOWNERS index 5d600d2593..e6de0155ea 100644 --- a/.forgejo/CODEOWNERS +++ b/.forgejo/CODEOWNERS @@ -237,6 +237,7 @@ libavutil/tests/buffer.* @MarcosAsh libavutil/tests/csp.* @MarcosAsh libavutil/tests/dovi_meta.* @MarcosAsh libavutil/tests/hdr_dynamic_vivid_metadata.* @MarcosAsh +libavutil/tests/mastering_display_metadata.* @MarcosAsh libavutil/tests/tdrdi.* @MarcosAsh libavutil/tests/timestamp.* @MarcosAsh tests/ref/.*drawvg.* @ayosec @@ -245,6 +246,7 @@ tests/ref/fate/buffer @MarcosAsh tests/ref/fate/csp @MarcosAsh tests/ref/fate/dovi_meta @MarcosAsh tests/ref/fate/hdr_dynamic_vivid_metadata @MarcosAsh +tests/ref/fate/mastering_display_metadata @MarcosAsh tests/ref/fate/sub-mcc.* @programmerjake tests/ref/fate/tdrdi @MarcosAsh tests/ref/fate/timestamp @MarcosAsh diff --git a/libavutil/Makefile b/libavutil/Makefile index 5aed6900e6..b7cbe49145 100644 --- a/libavutil/Makefile +++ b/libavutil/Makefile @@ -294,6 +294,7 @@ TESTPROGS = adler32 \ lfg \ lls \ log \ + mastering_display_metadata \ mathematics \ md5 \ murmur3 \ diff --git a/libavutil/tests/.gitignore b/libavutil/tests/.gitignore index 0b66e4b662..5562bc3359 100644 --- a/libavutil/tests/.gitignore +++ b/libavutil/tests/.gitignore @@ -38,6 +38,7 @@ /lls /log /lzo +/mastering_display_metadata /mathematics /md5 /murmur3 diff --git a/libavutil/tests/mastering_display_metadata.c b/libavutil/tests/mastering_display_metadata.c new file mode 100644 index 0000000000..3e99b18d38 --- /dev/null +++ b/libavutil/tests/mastering_display_metadata.c @@ -0,0 +1,160 @@ +/* + * 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 <limits.h> +#include <stdio.h> + +#include "libavutil/frame.h" +#include "libavutil/mastering_display_metadata.h" +#include "libavutil/mem.h" + +int main(void) +{ + AVMasteringDisplayMetadata *mdm; + AVContentLightMetadata *clm; + AVFrame *frame; + size_t size; + + /* av_mastering_display_metadata_alloc */ + printf("Testing av_mastering_display_metadata_alloc()\n"); + mdm = av_mastering_display_metadata_alloc(); + if (mdm) { + /* verify defaults: all rationals should be {0, 1} */ + printf("alloc: OK\n"); + printf("defaults: primaries[0][0]=%d/%d, white_point[0]=%d/%d\n", + mdm->display_primaries[0][0].num, + mdm->display_primaries[0][0].den, + mdm->white_point[0].num, mdm->white_point[0].den); + printf("defaults: min_lum=%d/%d, max_lum=%d/%d\n", + mdm->min_luminance.num, mdm->min_luminance.den, + mdm->max_luminance.num, mdm->max_luminance.den); + printf("defaults: has_primaries=%d, has_luminance=%d\n", + mdm->has_primaries, mdm->has_luminance); + av_free(mdm); + } else { + printf("alloc: FAIL\n"); + } + + /* av_mastering_display_metadata_alloc_size */ + printf("\nTesting av_mastering_display_metadata_alloc_size()\n"); + mdm = av_mastering_display_metadata_alloc_size(&size); + if (mdm) { + printf("alloc_size: OK, size>0=%s\n", size > 0 ? "yes" : "no"); + printf("defaults: primaries[0][0]=%d/%d\n", + mdm->display_primaries[0][0].num, + mdm->display_primaries[0][0].den); + av_free(mdm); + } else { + printf("alloc_size: FAIL\n"); + } + + /* write and read back */ + printf("\nTesting write/read back\n"); + mdm = av_mastering_display_metadata_alloc(); + if (mdm) { + mdm->display_primaries[0][0] = (AVRational){ 34000, 50000 }; + mdm->display_primaries[0][1] = (AVRational){ 16000, 50000 }; + mdm->white_point[0] = (AVRational){ 15635, 50000 }; + mdm->white_point[1] = (AVRational){ 16450, 50000 }; + mdm->min_luminance = (AVRational){ 50, 10000 }; + mdm->max_luminance = (AVRational){ 10000000, 10000 }; + mdm->has_primaries = 1; + mdm->has_luminance = 1; + printf("primaries[0]=(%d/%d, %d/%d)\n", + mdm->display_primaries[0][0].num, + mdm->display_primaries[0][0].den, + mdm->display_primaries[0][1].num, + mdm->display_primaries[0][1].den); + printf("white_point=(%d/%d, %d/%d)\n", + mdm->white_point[0].num, mdm->white_point[0].den, + mdm->white_point[1].num, mdm->white_point[1].den); + printf("luminance: min=%d/%d max=%d/%d\n", + mdm->min_luminance.num, mdm->min_luminance.den, + mdm->max_luminance.num, mdm->max_luminance.den); + av_free(mdm); + } + + /* av_mastering_display_metadata_create_side_data */ + printf("\nTesting av_mastering_display_metadata_create_side_data()\n"); + frame = av_frame_alloc(); + if (frame) { + mdm = av_mastering_display_metadata_create_side_data(frame); + if (mdm) { + printf("side_data: OK, defaults: primaries[0][0]=%d/%d\n", + mdm->display_primaries[0][0].num, + mdm->display_primaries[0][0].den); + } else { + printf("side_data: FAIL\n"); + } + av_frame_free(&frame); + } + + /* av_content_light_metadata_alloc */ + printf("\nTesting av_content_light_metadata_alloc()\n"); + clm = av_content_light_metadata_alloc(&size); + if (clm) { + printf("alloc: OK, size>0=%s, MaxCLL=%u, MaxFALL=%u\n", + size > 0 ? "yes" : "no", clm->MaxCLL, clm->MaxFALL); + clm->MaxCLL = 1000; + clm->MaxFALL = 400; + printf("write: MaxCLL=%u, MaxFALL=%u\n", clm->MaxCLL, clm->MaxFALL); + av_free(clm); + } else { + printf("alloc: FAIL\n"); + } + + /* av_content_light_metadata_create_side_data */ + printf("\nTesting av_content_light_metadata_create_side_data()\n"); + frame = av_frame_alloc(); + if (frame) { + clm = av_content_light_metadata_create_side_data(frame); + if (clm) { + printf("side_data: OK, MaxCLL=%u\n", clm->MaxCLL); + } else { + printf("side_data: FAIL\n"); + } + av_frame_free(&frame); + } + + /* OOM paths via av_max_alloc */ + printf("\nTesting OOM paths\n"); + av_max_alloc(1); + mdm = av_mastering_display_metadata_alloc(); + printf("mastering alloc OOM: %s\n", mdm ? "FAIL" : "OK"); + av_free(mdm); + mdm = av_mastering_display_metadata_alloc_size(&size); + printf("mastering alloc_size OOM: %s\n", mdm ? "FAIL" : "OK"); + av_free(mdm); + clm = av_content_light_metadata_alloc(&size); + printf("content alloc OOM: %s\n", clm ? "FAIL" : "OK"); + av_free(clm); + av_max_alloc(INT_MAX); + + frame = av_frame_alloc(); + if (frame) { + av_max_alloc(1); + mdm = av_mastering_display_metadata_create_side_data(frame); + printf("mastering side_data OOM: %s\n", mdm ? "FAIL" : "OK"); + clm = av_content_light_metadata_create_side_data(frame); + printf("content side_data OOM: %s\n", clm ? "FAIL" : "OK"); + av_max_alloc(INT_MAX); + av_frame_free(&frame); + } + + return 0; +} diff --git a/tests/fate/libavutil.mak b/tests/fate/libavutil.mak index 1a31561b5e..67625445cc 100644 --- a/tests/fate/libavutil.mak +++ b/tests/fate/libavutil.mak @@ -136,6 +136,10 @@ FATE_LIBAVUTIL += fate-lfg fate-lfg: libavutil/tests/lfg$(EXESUF) fate-lfg: CMD = run libavutil/tests/lfg$(EXESUF) +FATE_LIBAVUTIL += fate-mastering_display_metadata +fate-mastering_display_metadata: libavutil/tests/mastering_display_metadata$(EXESUF) +fate-mastering_display_metadata: CMD = run libavutil/tests/mastering_display_metadata$(EXESUF) + FATE_LIBAVUTIL += fate-mathematics fate-mathematics: libavutil/tests/mathematics$(EXESUF) fate-mathematics: CMD = run libavutil/tests/mathematics$(EXESUF) diff --git a/tests/ref/fate/mastering_display_metadata b/tests/ref/fate/mastering_display_metadata new file mode 100644 index 0000000000..60ba540f04 --- /dev/null +++ b/tests/ref/fate/mastering_display_metadata @@ -0,0 +1,31 @@ +Testing av_mastering_display_metadata_alloc() +alloc: OK +defaults: primaries[0][0]=0/1, white_point[0]=0/1 +defaults: min_lum=0/1, max_lum=0/1 +defaults: has_primaries=0, has_luminance=0 + +Testing av_mastering_display_metadata_alloc_size() +alloc_size: OK, size>0=yes +defaults: primaries[0][0]=0/1 + +Testing write/read back +primaries[0]=(34000/50000, 16000/50000) +white_point=(15635/50000, 16450/50000) +luminance: min=50/10000 max=10000000/10000 + +Testing av_mastering_display_metadata_create_side_data() +side_data: OK, defaults: primaries[0][0]=0/1 + +Testing av_content_light_metadata_alloc() +alloc: OK, size>0=yes, MaxCLL=0, MaxFALL=0 +write: MaxCLL=1000, MaxFALL=400 + +Testing av_content_light_metadata_create_side_data() +side_data: OK, MaxCLL=0 + +Testing OOM paths +mastering alloc OOM: OK +mastering alloc_size OOM: OK +content alloc OOM: OK +mastering side_data OOM: OK +content side_data OOM: OK _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
