[FFmpeg-devel] [PATCH] doc/t2h: Support texinfo 7.0

2023-11-05 Thread post
From: Frank Plowman 

Texinfo 7.0, released in November 2022, changed the names of various
functions. Compiling docs with Texinfo 7.0 results in warnings and
improperly formatted documentation. More old names appear to have
been removed in Texinfo 7.1, released October 2023, which causes docs
compilation to fail.

This PR addresses the issue by adding logic to switch between the old
and new function names depending on the Texinfo version.

CC
https://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg1938238.html
https://bugs.gentoo.org/916104

Signed-off-by: Frank Plowman 
---
 doc/t2h.pm | 97 +++---
 1 file changed, 78 insertions(+), 19 deletions(-)

diff --git a/doc/t2h.pm b/doc/t2h.pm
index d07d974286..1f23083703 100644
--- a/doc/t2h.pm
+++ b/doc/t2h.pm
@@ -20,8 +20,41 @@
 # License along with FFmpeg; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
+# Texinfo 7.0 changed the syntax of various functions.
+# Provide a shim for older versions.
+sub ff_set_from_init_file($$) {
+my $key = shift;
+my $value = shift;
+if (exists &{'texinfo_set_from_init_file'}) {
+texinfo_set_from_init_file($key, $value);
+} else {
+set_from_init_file($key, $value);
+}
+}
+
+sub ff_get_conf($) {
+my $key = shift;
+if (exists &{'texinfo_get_conf'}) {
+texinfo_get_conf($key);
+} else {
+get_conf($key);
+}
+}
+
+sub get_formatting_function($$) {
+my $obj = shift;
+my $func = shift;
+
+my $sub = $obj->can('formatting_function');
+if ($sub) {
+return $obj->formatting_function($func);
+} else {
+return $obj->{$func};
+}
+}
+
 # no navigation elements
-set_from_init_file('HEADERS', 0);
+ff_set_from_init_file('HEADERS', 0);
 
 sub ffmpeg_heading_command($)
 {
@@ -55,7 +88,7 @@ sub ffmpeg_heading_command($)
 $element = $command->{'parent'};
 }
 if ($element) {
-$result .= &{$self->{'format_element_header'}}($self, $cmdname,
+$result .= &{get_formatting_function($self, 
'format_element_header')}($self, $cmdname,
$command, $element);
 }
 
@@ -112,8 +145,8 @@ sub ffmpeg_heading_command($)
 $cmdname
 = 
$Texinfo::Common::level_to_structuring_command{$cmdname}->[$heading_level];
 }
-$result .= &{$self->{'format_heading_text'}}(
-$self, $cmdname, $heading,
+$result .= &{get_formatting_function($self,'format_heading_text')}(
+$self, $cmdname, [$heading],
 $heading_level +
 $self->get_conf('CHAPTER_HEADER_LEVEL') - 1, $command);
 }
@@ -127,22 +160,22 @@ foreach my $command 
(keys(%Texinfo::Common::sectioning_commands), 'node') {
 }
 
 # determine if texinfo is at least version 6.8
-my $program_version_num = 
version->declare(get_conf('PACKAGE_VERSION'))->numify;
+my $program_version_num = 
version->declare(ff_get_conf('PACKAGE_VERSION'))->numify;
 my $program_version_6_8 = $program_version_num >= 6.008000;
 
 # print the TOC where @contents is used
 if ($program_version_6_8) {
-set_from_init_file('CONTENTS_OUTPUT_LOCATION', 'inline');
+ff_set_from_init_file('CONTENTS_OUTPUT_LOCATION', 'inline');
 } else {
-set_from_init_file('INLINE_CONTENTS', 1);
+ff_set_from_init_file('INLINE_CONTENTS', 1);
 }
 
 # make chapters 
-set_from_init_file('CHAPTER_HEADER_LEVEL', 2);
+ff_set_from_init_file('CHAPTER_HEADER_LEVEL', 2);
 
 # Do not add 
-set_from_init_file('DEFAULT_RULE', '');
-set_from_init_file('BIG_RULE', '');
+ff_set_from_init_file('DEFAULT_RULE', '');
+ff_set_from_init_file('BIG_RULE', '');
 
 # Customized file beginning
 sub ffmpeg_begin_file($$$)
@@ -159,7 +192,18 @@ sub ffmpeg_begin_file($$$)
 my ($title, $description, $encoding, $date, $css_lines,
 $doctype, $bodytext, $copying_comment, $after_body_open,
 $extra_head, $program_and_version, $program_homepage,
-$program, $generator) = $self->_file_header_informations($command);
+$program, $generator);
+if ($program_version_num >= 7.00) {
+($title, $description, $encoding, $date, $css_lines,
+ $doctype, $bodytext, $copying_comment, $after_body_open,
+ $extra_head, $program_and_version, $program_homepage,
+ $program, $generator) = $self->_file_header_information($command);
+} else {
+($title, $description, $encoding, $date, $css_lines,
+ $doctype, $bodytext, $copying_comment, $after_body_open,
+ $extra_head, $program_and_version, $program_homepage,
+ $program, $generator) = $self->_file_header_informations($command);
+}
 
 my $links = $self->_get_links ($filename, $element);
 
@@ -223,7 +267,7 @@ if ($program_version_6_8) {
 sub ffmpeg_end_file($)
 {
 my $

[FFmpeg-devel] [PATCH] libavformat/vvc: Make probe more conservative

2023-12-03 Thread post
From: Frank Plowman 

Reduce false positives for VVC files by adding additional checks in
`vvc_probe`. Specifically, `nuh_temporal_id_plus1` is tested for valid
values in extra cases depending on the NAL unit type, as per ITU-T H.266
section 7.4.2.2.

Resolves trac #10703.

Signed-off-by: Frank Plowman 
---
 libavformat/vvcdec.c | 8 +++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/libavformat/vvcdec.c b/libavformat/vvcdec.c
index 31c5ae1f14..57d2769465 100644
--- a/libavformat/vvcdec.c
+++ b/libavformat/vvcdec.c
@@ -35,11 +35,17 @@ static int vvc_probe(const AVProbeData *p)
 if ((code & 0xff00) == 0x100) {
 uint8_t nal2 = p->buf[i + 1];
 int type = (nal2 & 0xF8) >> 3;
+const uint8_t nuh_temporal_id_plus1 = nal2 & 0x7;
 
 if (code & 0x80) // forbidden_zero_bit
 return 0;
 
-if ((nal2 & 0x7) == 0) // nuh_temporal_id_plus1
+if (nuh_temporal_id_plus1 == 0) // nuh_temporal_id_plus1
+return 0;
+if (nuh_temporal_id_plus1 != 1 && (type >= VVC_IDR_W_RADL && type 
<= VVC_RSV_IRAP_11
+|| type == VVC_DCI_NUT || type == 
VVC_OPI_NUT
+|| type == VVC_VPS_NUT || type == 
VVC_SPS_NUT
+|| type == VVC_EOS_NUT || type == 
VVC_EOB_NUT))
 return 0;
 
 switch (type) {
-- 
2.43.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-requ...@ffmpeg.org with subject "unsubscribe".


[FFmpeg-devel] [PATCH v2] libavformat/vvc: Make probe more conservative

2023-12-05 Thread post
From: Frank Plowman 

Reduce false positives for VVC files by adding additional checks in
`vvc_probe`. Specifically, `nuh_temporal_id_plus1` is tested for valid
values in extra cases depending on the NAL unit type, as per ITU-T H.266
section 7.4.2.2.

Resolves trac #10703.

Signed-off-by: Frank Plowman 
---
 libavformat/vvcdec.c | 18 +-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/libavformat/vvcdec.c b/libavformat/vvcdec.c
index 31c5ae1f14..0a0e24b71c 100644
--- a/libavformat/vvcdec.c
+++ b/libavformat/vvcdec.c
@@ -24,6 +24,22 @@
 #include "avformat.h"
 #include "rawdec.h"
 
+static int check_temporal_id(uint8_t nuh_temporal_id_plus1, int type)
+{
+if (nuh_temporal_id_plus1 == 0)
+return 0;
+
+if (nuh_temporal_id_plus1 != 1) {
+if (type >= VVC_IDR_W_RADL && type <= VVC_RSV_IRAP_11
+|| type == VVC_DCI_NUT || type == VVC_OPI_NUT
+|| type == VVC_VPS_NUT || type == VVC_SPS_NUT
+|| type == VVC_EOS_NUT || type == VVC_EOB_NUT)
+return 0;
+}
+
+return 1;
+}
+
 static int vvc_probe(const AVProbeData *p)
 {
 uint32_t code = -1;
@@ -39,7 +55,7 @@ static int vvc_probe(const AVProbeData *p)
 if (code & 0x80) // forbidden_zero_bit
 return 0;
 
-if ((nal2 & 0x7) == 0) // nuh_temporal_id_plus1
+if (!check_temporal_id(nal2 & 0x7, type))
 return 0;
 
 switch (type) {
-- 
2.43.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-requ...@ffmpeg.org with subject "unsubscribe".


[FFmpeg-devel] [PATCH] lavc/vvc: Use pps->{width, height} over sps->{width, height}

2024-02-15 Thread post
From: Frank Plowman 

The PPS should be used instead of the SPS to get the current picture's
dimensions.  Using the SPS can cause issues if the resolution changes
mid-sequence.  In particular, it was leading to invalid memory accesses
if the resolution decreased.

Patch replaces sps->{width,height} with pps->{width,height}.  It also
removes sps->{width,height}, as these are no longer used anywhere.

Fixes crash when decoding DVB V&V test sequence
VVC_HDR_UHDTV1_ClosedGOP_Max3840x2160_50fps_HLG10_res_change_without_RPR

Signed-off-by: Frank Plowman 
---
 libavcodec/vvc/vvc_ctu.c|  4 ++--
 libavcodec/vvc/vvc_ctu.h|  2 +-
 libavcodec/vvc/vvc_filter.c | 48 ++---
 libavcodec/vvc/vvc_mvs.c|  4 ++--
 libavcodec/vvc/vvc_ps.c |  3 ---
 libavcodec/vvc/vvc_ps.h |  2 --
 libavcodec/vvc/vvc_refs.c   |  5 ++--
 7 files changed, 32 insertions(+), 36 deletions(-)

diff --git a/libavcodec/vvc/vvc_ctu.c b/libavcodec/vvc/vvc_ctu.c
index d166b16a19..36f98f5f2b 100644
--- a/libavcodec/vvc/vvc_ctu.c
+++ b/libavcodec/vvc/vvc_ctu.c
@@ -2415,8 +2415,8 @@ void ff_vvc_decode_neighbour(VVCLocalContext *lc, const 
int x_ctb, const int y_c
 VVCFrameContext *fc = lc->fc;
 const int ctb_size = fc->ps.sps->ctb_size_y;
 
-lc->end_of_tiles_x = fc->ps.sps->width;
-lc->end_of_tiles_y = fc->ps.sps->height;
+lc->end_of_tiles_x = fc->ps.pps->width;
+lc->end_of_tiles_y = fc->ps.pps->height;
 if (fc->ps.pps->ctb_to_col_bd[rx] != fc->ps.pps->ctb_to_col_bd[rx + 1])
 lc->end_of_tiles_x = FFMIN(x_ctb + ctb_size, lc->end_of_tiles_x);
 if (fc->ps.pps->ctb_to_row_bd[ry] != fc->ps.pps->ctb_to_row_bd[ry + 1])
diff --git a/libavcodec/vvc/vvc_ctu.h b/libavcodec/vvc/vvc_ctu.h
index 91b4ed14a1..ab3fac626d 100644
--- a/libavcodec/vvc/vvc_ctu.h
+++ b/libavcodec/vvc/vvc_ctu.h
@@ -85,7 +85,7 @@
 /**
  * Value of the luma sample at position (x, y) in the 2D array tab.
  */
-#define SAMPLE(tab, x, y) ((tab)[(y) * s->sps->width + (x)])
+#define SAMPLE(tab, x, y) ((tab)[(y) * s->pps->width + (x)])
 #define SAMPLE_CTB(tab, x, y) ((tab)[(y) * min_cb_width + (x)])
 #define CTB(tab, x, y) ((tab)[(y) * fc->ps.pps->ctb_width + (x)])
 
diff --git a/libavcodec/vvc/vvc_filter.c b/libavcodec/vvc/vvc_filter.c
index cebc02fd9f..df77e443f6 100644
--- a/libavcodec/vvc/vvc_filter.c
+++ b/libavcodec/vvc/vvc_filter.c
@@ -102,8 +102,8 @@ static void copy_ctb_to_hv(VVCFrameContext *fc, const 
uint8_t *src,
 const int c_idx, const int x_ctb, const int y_ctb, const int top)
 {
 const int ps = fc->ps.sps->pixel_shift;
-const int w  = fc->ps.sps->width >> fc->ps.sps->hshift[c_idx];
-const int h  = fc->ps.sps->height >> fc->ps.sps->vshift[c_idx];
+const int w  = fc->ps.pps->width >> fc->ps.sps->hshift[c_idx];
+const int h  = fc->ps.pps->height >> fc->ps.sps->vshift[c_idx];
 
 if (top) {
 /* top */
@@ -133,8 +133,8 @@ static void sao_copy_ctb_to_hv(VVCLocalContext *lc, const 
int rx, const int ry,
 const ptrdiff_t src_stride = fc->frame->linesize[c_idx];
 const int ctb_size_h   = ctb_size_y >> fc->ps.sps->hshift[c_idx];
 const int ctb_size_v   = ctb_size_y >> fc->ps.sps->vshift[c_idx];
-const int width= FFMIN(ctb_size_h, (fc->ps.sps->width  >> 
fc->ps.sps->hshift[c_idx]) - x);
-const int height   = FFMIN(ctb_size_v, (fc->ps.sps->height >> 
fc->ps.sps->vshift[c_idx]) - y);
+const int width= FFMIN(ctb_size_h, (fc->ps.pps->width  >> 
fc->ps.sps->hshift[c_idx]) - x);
+const int height   = FFMIN(ctb_size_v, (fc->ps.pps->height >> 
fc->ps.sps->vshift[c_idx]) - y);
 const uint8_t *src  = &fc->frame->data[c_idx][y * src_stride + 
(x << fc->ps.sps->pixel_shift)];
 copy_ctb_to_hv(fc, src, src_stride, x, y, width, height, c_idx, rx, 
ry, top);
 }
@@ -216,8 +216,8 @@ void ff_vvc_sao_filter(VVCLocalContext *lc, int x, int y)
 ptrdiff_t src_stride = fc->frame->linesize[c_idx];
 int ctb_size_h = ctb_size_y >> fc->ps.sps->hshift[c_idx];
 int ctb_size_v = ctb_size_y >> fc->ps.sps->vshift[c_idx];
-int width= FFMIN(ctb_size_h, (fc->ps.sps->width  >> 
fc->ps.sps->hshift[c_idx]) - x0);
-int height   = FFMIN(ctb_size_v, (fc->ps.sps->height >> 
fc->ps.sps->vshift[c_idx]) - y0);
+int width= FFMIN(ctb_size_h, (fc->ps.pps->width  >> 
fc->ps.sps->hshift[c_idx]) - x0);
+int height   = FFMIN(ctb_size_v, (fc->ps.pps->height >> 
fc->ps.sps->vshift[c_idx]) - y0);
 int tab  = sao_tab[(FFALIGN(width, 8) >> 3) - 1];
 uint8_t *src = &fc->frame->data[c_idx][y0 * src_stride + (x0 << 
fc->ps.sps->pixel_shift)];
 ptrdiff_t dst_stride;
@@ -230,8 +230,8 @@ void ff_vvc_sao_filter(VVCLocalContext *lc, int x, int y)
 break;
 case SAO_EDGE:
 {
-const int w = fc->ps.sps->width >> fc->ps.sps->hshift[c_idx];
-const int h = fc->ps.sps->h

[FFmpeg-devel] [PATCH] lavc/vvc: Remove left shifts of negative values

2024-01-20 Thread post
From: Frank Plowman 

VVC specifies << as arithmetic left shift, i.e. x << y is equivalent to
x * pow2(y).  C's << on the other hand has UB if x is negative.  This
patch removes all UB resulting from this, mostly by replacing x << y
with x * (1 << y), but there are also a couple places where the OOP was
changed instead.

Signed-off-by: Frank Plowman 
---
 libavcodec/vvc/vvc_ctu.c|  4 +--
 libavcodec/vvc/vvc_filter.c |  4 +--
 libavcodec/vvc/vvc_inter.c  | 24 +++
 libavcodec/vvc/vvc_inter_template.c |  4 +--
 libavcodec/vvc/vvc_mvs.c| 46 ++---
 5 files changed, 41 insertions(+), 41 deletions(-)

diff --git a/libavcodec/vvc/vvc_ctu.c b/libavcodec/vvc/vvc_ctu.c
index dd3c8884cb..307bc3490e 100644
--- a/libavcodec/vvc/vvc_ctu.c
+++ b/libavcodec/vvc/vvc_ctu.c
@@ -1554,8 +1554,8 @@ static void mvp_add_difference(MotionInfo *mi, const int 
num_cp_mv,
 if (mi->pred_flag & mask) {
 for (int j = 0; j < num_cp_mv; j++) {
 const Mv *mvd = &mvds[i][j];
-mi->mv[i][j].x += mvd->x << amvr_shift;
-mi->mv[i][j].y += mvd->y << amvr_shift;
+mi->mv[i][j].x += mvd->x * (1 << amvr_shift);
+mi->mv[i][j].y += mvd->y * (1 << amvr_shift);
 }
 }
 }
diff --git a/libavcodec/vvc/vvc_filter.c b/libavcodec/vvc/vvc_filter.c
index e5cd89b8a3..cebc02fd9f 100644
--- a/libavcodec/vvc/vvc_filter.c
+++ b/libavcodec/vvc/vvc_filter.c
@@ -1115,12 +1115,12 @@ static void alf_prepare_buffer(VVCFrameContext *fc, 
uint8_t *_dst, const uint8_t
 copy_ctb(_dst, _src, width << ps, height, dst_stride, src_stride);
 
 //top
-src = fc->tab.alf_pixel_buffer_h[c_idx][1] + (((border_pixels * (y_ctb - 
1)) * w + x) << ps);
+src = fc->tab.alf_pixel_buffer_h[c_idx][1] + (((border_pixels * w) << ps) 
* (y_ctb - 1) + (x << ps));
 dst = _dst - border_pixels * dst_stride;
 alf_fill_border_h(dst, dst_stride, src, w  << ps, _dst, width, 
border_pixels, ps, edges[TOP]);
 
 //bottom
-src = fc->tab.alf_pixel_buffer_h[c_idx][0] + ((border_pixels * (y_ctb + 1) 
* w + x) << ps);
+src = fc->tab.alf_pixel_buffer_h[c_idx][0] + (((border_pixels * w) << ps) 
* (y_ctb + 1) + (x << ps));
 dst = _dst + height * dst_stride;
 alf_fill_border_h(dst, dst_stride, src, w  << ps, _dst + (height - 1) * 
dst_stride, width, border_pixels, ps, edges[BOTTOM]);
 
diff --git a/libavcodec/vvc/vvc_inter.c b/libavcodec/vvc/vvc_inter.c
index 9b2925f60c..e05f3db93e 100644
--- a/libavcodec/vvc/vvc_inter.c
+++ b/libavcodec/vvc/vvc_inter.c
@@ -190,7 +190,7 @@ static void luma_mc(VVCLocalContext *lc, int16_t *dst, 
const AVFrame *ref, const
 
 x_off += mv->x >> 4;
 y_off += mv->y >> 4;
-src   += y_off * src_stride + (x_off << fc->ps.sps->pixel_shift);
+src   += y_off * src_stride + (x_off * (1 << fc->ps.sps->pixel_shift));
 
 EMULATED_EDGE_LUMA(lc->edge_emu_buffer, &src, &src_stride, x_off, y_off);
 
@@ -213,7 +213,7 @@ static void chroma_mc(VVCLocalContext *lc, int16_t *dst, 
const AVFrame *ref, con
 
 x_off += mv->x >> (4 + hs);
 y_off += mv->y >> (4 + vs);
-src  += y_off * src_stride + (x_off << fc->ps.sps->pixel_shift);
+src  += y_off * src_stride + (x_off * (1 << fc->ps.sps->pixel_shift));
 
 EMULATED_EDGE_CHROMA(lc->edge_emu_buffer, &src, &src_stride, x_off, y_off);
 fc->vvcdsp.inter.put[CHROMA][idx][!!my][!!mx](dst, src, src_stride, 
block_h, hf, vf, block_w);
@@ -237,7 +237,7 @@ static void luma_mc_uni(VVCLocalContext *lc, uint8_t *dst, 
const ptrdiff_t dst_s
 
 x_off += mv->x >> 4;
 y_off += mv->y >> 4;
-src   += y_off * src_stride + (x_off << fc->ps.sps->pixel_shift);
+src   += y_off * src_stride + (x_off * (1 << fc->ps.sps->pixel_shift));
 
 EMULATED_EDGE_LUMA(lc->edge_emu_buffer, &src, &src_stride, x_off, y_off);
 
@@ -270,7 +270,7 @@ static void luma_mc_bi(VVCLocalContext *lc, uint8_t *dst, 
const ptrdiff_t dst_st
 const int ox= x_off + (mv->x >> 4);
 const int oy= y_off + (mv->y >> 4);
 ptrdiff_t src_stride= ref[i]->linesize[0];
-const uint8_t *src  = ref[i]->data[0] + oy * src_stride + (ox << 
fc->ps.sps->pixel_shift);
+const uint8_t *src  = ref[i]->data[0] + oy * src_stride + (ox * (1 
<< fc->ps.sps->pixel_shift));
 const int8_t *hf= ff_vvc_inter_luma_filters[hf_idx][mx];
 const int8_t *vf= ff_vvc_inter_luma_filters[vf_idx][my];
 
@@ -314,7 +314,7 @@ static void chroma_mc_uni(VVCLocalContext *lc, uint8_t 
*dst, const ptrdiff_t dst
 
 x_off += mv->x >> (4 + hs);
 y_off += mv->y >> (4 + vs);
-src  += y_off * src_stride + (x_off << fc->ps.sps->pixel_shift);
+src  += y_off * src_stride + (x_off * (1 << fc->ps.sps->pixel_shift));
 
 
 EMULATED_EDGE_CHROMA(lc->edge_emu_buffer, &src, &src_stride, x_off, y_off);
@@ -348,7 +348,7 @@ static void chroma_mc_bi(VVCLocalContext

[FFmpeg-devel] [PATCH] lavc/vvc: Use av_log2 when destination is integer

2024-01-25 Thread post
From: Frank Plowman 

Signed-off-by: Frank Plowman 
---
 libavcodec/vvc/vvc_ctu.c | 4 ++--
 libavcodec/vvc/vvc_ps.c  | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/libavcodec/vvc/vvc_ctu.c b/libavcodec/vvc/vvc_ctu.c
index 307bc3490e..d166b16a19 100644
--- a/libavcodec/vvc/vvc_ctu.c
+++ b/libavcodec/vvc/vvc_ctu.c
@@ -257,8 +257,8 @@ static TransformBlock* add_tb(TransformUnit *tu, 
VVCLocalContext *lc,
 tb->y0 = y0;
 tb->tb_width  = tb_width;
 tb->tb_height = tb_height;
-tb->log2_tb_width  = log2(tb_width);
-tb->log2_tb_height = log2(tb_height);
+tb->log2_tb_width  = av_log2(tb_width);
+tb->log2_tb_height = av_log2(tb_height);
 
 tb->max_scan_x = tb->max_scan_y = 0;
 tb->min_scan_x = tb->min_scan_y = 0;
diff --git a/libavcodec/vvc/vvc_ps.c b/libavcodec/vvc/vvc_ps.c
index ac96ed9f43..c2afc0ac93 100644
--- a/libavcodec/vvc/vvc_ps.c
+++ b/libavcodec/vvc/vvc_ps.c
@@ -910,7 +910,7 @@ static void scaling_derive(VVCScalingList *sl, const 
H266RawAPS *aps)
 {
 for (int id = 0; id < SL_MAX_ID; id++) {
 const int matrix_size   = derive_matrix_size(id);
-const int log2_size = log2(matrix_size);
+const int log2_size = av_log2(matrix_size);
 const int list_size = matrix_size * matrix_size;
 int coeff[SL_MAX_MATRIX_SIZE * SL_MAX_MATRIX_SIZE];
 const uint8_t *pred;
-- 
2.43.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-requ...@ffmpeg.org with subject "unsubscribe".


[FFmpeg-devel] [PATCH] lavc/vvc: Clamp shift RHS

2024-01-26 Thread post
From: Frank Plowman 

Resolves the following undefined behavior sanitiser error:
runtime error: shift exponent 32 is too large for 32-bit type 'int'

Signed-off-by: Frank Plowman 
---
 libavcodec/vvc/vvc_intra_template.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libavcodec/vvc/vvc_intra_template.c 
b/libavcodec/vvc/vvc_intra_template.c
index 9fb47549d5..a078885266 100644
--- a/libavcodec/vvc/vvc_intra_template.c
+++ b/libavcodec/vvc/vvc_intra_template.c
@@ -969,7 +969,7 @@ static void FUNC(pred_angular_h)(uint8_t *_src, const 
uint8_t *_top, const uint8
 int pos = (1 + ref_idx) * intra_pred_angle;
 int wt;
 if (need_pdpc)
-wt = (32 >> ((y * 2) >> nscale));
+wt = (32 >> FFMIN(31, (y * 2) >> nscale));
 
 for (int x = 0; x < w; x++) {
 const int idx  = (pos >> 5) + ref_idx;
-- 
2.43.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-requ...@ffmpeg.org with subject "unsubscribe".


[FFmpeg-devel] [PATCH] lavc/vvc: Fix emulation prevention byte handling

2024-01-26 Thread post
From: Frank Plowman 

nal->skipped_bytes_pos contains the positions of errors relative to the
start of the slice header, whereas the position they were tested against
is relative to the start of the slice data, i.e. one byte after the end
of the slice header.

Patch fixes this by storing the size of the slice header in H266RawSlice
and adding it to the position given by the GetBitContext before
comparing to skipped_bytes_pos.  This fixes AVERROR_INVALIDDATAs for
various valid bitstreams, such as the LMCS_B_Dolby_2 conformance
bitstream.

Signed-off-by: Frank Plowman 
---
 libavcodec/cbs_h2645.c  | 1 +
 libavcodec/cbs_h266.h   | 1 +
 libavcodec/vvc/vvcdec.c | 9 +
 3 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/libavcodec/cbs_h2645.c b/libavcodec/cbs_h2645.c
index c48a06b241..2fb249bcd3 100644
--- a/libavcodec/cbs_h2645.c
+++ b/libavcodec/cbs_h2645.c
@@ -1155,6 +1155,7 @@ static int cbs_h266_read_nal_unit(CodedBitstreamContext 
*ctx,
 return err;
 }
 
+slice->header_size = pos / 8;
 slice->data_size = len - pos / 8;
 slice->data_ref  = av_buffer_ref(unit->data_ref);
 if (!slice->data_ref)
diff --git a/libavcodec/cbs_h266.h b/libavcodec/cbs_h266.h
index 8b3ad391b1..73d94157d4 100644
--- a/libavcodec/cbs_h266.h
+++ b/libavcodec/cbs_h266.h
@@ -843,6 +843,7 @@ typedef struct H266RawSlice {
 
 uint8_t *data;
 AVBufferRef *data_ref;
+size_t   header_size;
 size_t   data_size;
 int  data_bit_start;
 } H266RawSlice;
diff --git a/libavcodec/vvc/vvcdec.c b/libavcodec/vvc/vvcdec.c
index 540a05f8cf..83ee472ce6 100644
--- a/libavcodec/vvc/vvcdec.c
+++ b/libavcodec/vvc/vvcdec.c
@@ -451,8 +451,9 @@ static int slices_realloc(VVCFrameContext *fc)
 }
 
 static void ep_init_cabac_decoder(SliceContext *sc, const int index,
-const H2645NAL *nal, GetBitContext *gb)
+const H2645NAL *nal, GetBitContext *gb, const CodedBitstreamUnit *unit)
 {
+const H266RawSlice *slice = unit->content_ref;
 const H266RawSliceHeader *rsh = sc->sh.r;
 EntryPoint *ep= sc->eps + index;
 int size;
@@ -461,10 +462,10 @@ static void ep_init_cabac_decoder(SliceContext *sc, const 
int index,
 int skipped = 0;
 int64_t start =  (gb->index >> 3);
 int64_t end = start + rsh->sh_entry_point_offset_minus1[index] + 1;
-while (skipped < nal->skipped_bytes && nal->skipped_bytes_pos[skipped] 
<= start) {
+while (skipped < nal->skipped_bytes && nal->skipped_bytes_pos[skipped] 
<= start + slice->header_size) {
 skipped++;
 }
-while (skipped < nal->skipped_bytes && nal->skipped_bytes_pos[skipped] 
< end) {
+while (skipped < nal->skipped_bytes && nal->skipped_bytes_pos[skipped] 
<= end + slice->header_size) {
 end--;
 skipped++;
 }
@@ -506,7 +507,7 @@ static int slice_init_entry_points(SliceContext *sc,
 fc->tab.slice_idx[rs] = sc->slice_idx;
 }
 
-ep_init_cabac_decoder(sc, i, nal, &gb);
+ep_init_cabac_decoder(sc, i, nal, &gb, unit);
 
 if (i + 1 < sc->nb_eps)
 ctu_addr = sh->entry_point_start_ctu[i];
-- 
2.43.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-requ...@ffmpeg.org with subject "unsubscribe".


[FFmpeg-devel] [PATCH] lavc/vvc: Add check to num_multi_layer_olss

2024-01-30 Thread post
From: Frank Plowman 

Check that vps_each_layer_is_an_ols_flag, which indicates that "at
least one OLS specified by the VPS contains more than one layer," is
set if num_multi_layer_olss is non-zero.

Fixes: 
65160/clusterfuzz-testcase-minimized-ffmpeg_BSF_VVC_METADATA_fuzzer-4665241535119360

Found-by: continuous fuzzing process 
https://github.com/google/oss-fuzz/tree/master/projects/ffmpeg
Signed-off-by: Frank Plowman 
---
 libavcodec/cbs_h266_syntax_template.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/libavcodec/cbs_h266_syntax_template.c 
b/libavcodec/cbs_h266_syntax_template.c
index 2f3478e5e1..37dc3acba0 100644
--- a/libavcodec/cbs_h266_syntax_template.c
+++ b/libavcodec/cbs_h266_syntax_template.c
@@ -911,6 +911,8 @@ static int FUNC(vps) (CodedBitstreamContext *ctx, RWContext 
*rw,
 num_multi_layer_olss++;
 }
 }
+if (!current->vps_each_layer_is_an_ols_flag && num_multi_layer_olss == 
0)
+return AVERROR_INVALIDDATA;
 }
 
 for (i = 0; i <= current->vps_num_ptls_minus1; i++) {
-- 
2.43.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-requ...@ffmpeg.org with subject "unsubscribe".


[FFmpeg-devel] [PATCH] lavc/vvc: Error pps_single_slice_per_subpic_flag

2024-02-01 Thread post
From: Frank Plowman 

pps_single_slice_per_subpic_flag is not yet supported.  Support is WIP,
but in the meantime throw an error when trying to decode a bitstream
with it set, avoiding an out-of-bounds array access.

Fixes: out-of-bounds array access for conformance bitstreams
SUBPIC_C_ERICSSON_1, SUBPIC_D_ERICSSON_1, MNUT_A_Nokia_4 and
MNUT_B_Nokia_3.

Signed-off-by: Frank Plowman 
---
 libavcodec/vvc/vvc_ps.c | 21 -
 1 file changed, 16 insertions(+), 5 deletions(-)

diff --git a/libavcodec/vvc/vvc_ps.c b/libavcodec/vvc/vvc_ps.c
index 2cf156b323..bd81d70e71 100644
--- a/libavcodec/vvc/vvc_ps.c
+++ b/libavcodec/vvc/vvc_ps.c
@@ -381,11 +381,16 @@ static void pps_multi_tiles_slice(VVCPPS *pps, const int 
tile_idx, const int i,
 }
 }
 
-static void pps_rect_slice(VVCPPS* pps)
+static int pps_rect_slice(VVCPPS* pps)
 {
 const H266RawPPS* r = pps->r;
 int tile_idx = 0, off = 0;
 
+if (r->pps_single_slice_per_subpic_flag) {
+avpriv_report_missing_feature(NULL, 
"pps_single_slice_per_subpic_flag");
+return AVERROR_PATCHWELCOME;
+}
+
 for (int i = 0; i < r->pps_num_slices_in_pic_minus1 + 1; i++) {
 if (!r->pps_slice_width_in_tiles_minus1[i] &&
 !r->pps_slice_height_in_tiles_minus1[i]) {
@@ -396,9 +401,11 @@ static void pps_rect_slice(VVCPPS* pps)
 }
 tile_idx = next_tile_idx(tile_idx, i, r);
 }
+
+return 0;
 }
 
-static void pps_no_rect_slice(VVCPPS* pps)
+static int pps_no_rect_slice(VVCPPS* pps)
 {
 const H266RawPPS* r = pps->r;
 int ctu_x, ctu_y, off = 0;
@@ -409,20 +416,24 @@ static void pps_no_rect_slice(VVCPPS* pps)
 pps_add_ctus(pps, &off, ctu_x, ctu_y, r->col_width_val[tile_x], 
r->row_height_val[tile_y]);
 }
 }
+
+return 0;
 }
 
 static int pps_slice_map(VVCPPS *pps)
 {
+int ret;
+
 pps->ctb_addr_in_slice = av_calloc(pps->ctb_count, 
sizeof(*pps->ctb_addr_in_slice));
 if (!pps->ctb_addr_in_slice)
 return AVERROR(ENOMEM);
 
 if (pps->r->pps_rect_slice_flag)
-pps_rect_slice(pps);
+ret = pps_rect_slice(pps);
 else
-pps_no_rect_slice(pps);
+ret = pps_no_rect_slice(pps);
 
-return 0;
+return ret;
 }
 
 static void pps_ref_wraparound_offset(VVCPPS *pps, const VVCSPS *sps)
-- 
2.43.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-requ...@ffmpeg.org with subject "unsubscribe".


[FFmpeg-devel] [PATCH] lavc/vvc: Validate alf_list indexes

2024-02-03 Thread post
From: Frank Plowman 

Fixes crashes when decoding illegal bitstreams found by fuzzing.

Signed-off-by: Frank Plowman 
---
 libavcodec/vvc/vvc_ctu.c | 17 +++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/libavcodec/vvc/vvc_ctu.c b/libavcodec/vvc/vvc_ctu.c
index d166b16a19..f601c6c95e 100644
--- a/libavcodec/vvc/vvc_ctu.c
+++ b/libavcodec/vvc/vvc_ctu.c
@@ -2207,7 +2207,7 @@ static void hls_sao(VVCLocalContext *lc, const int rx, 
const int ry)
 }
 }
 
-static void alf_params(VVCLocalContext *lc, const int rx, const int ry)
+static int alf_params(VVCLocalContext *lc, const int rx, const int ry)
 {
 const VVCFrameContext *fc = lc->fc;
 const H266RawSliceHeader *sh  = lc->sc->sh.r;
@@ -2233,6 +2233,11 @@ static void alf_params(VVCLocalContext *lc, const int 
rx, const int ry)
 c_idx == CB ? sh->sh_alf_cb_enabled_flag : 
sh->sh_alf_cr_enabled_flag;
 if (alf_enabled_flag) {
 const VVCALF *aps = fc->ps.alf_list[sh->sh_alf_aps_id_chroma];
+if (!aps) {
+// Slice header refers to an APS which does not exist
+return AVERROR_INVALIDDATA;
+}
+
 alf->ctb_flag[c_idx] = ff_vvc_alf_ctb_flag(lc, rx, ry, c_idx);
 alf->alf_ctb_filter_alt_idx[c_idx - 1] = 0;
 if (alf->ctb_flag[c_idx] && aps->num_chroma_filters > 1)
@@ -2247,10 +2252,16 @@ static void alf_params(VVCLocalContext *lc, const int 
rx, const int ry)
 alf->ctb_cc_idc[i] = 0;
 if (cc_enabled[i]) {
 const VVCALF *aps = fc->ps.alf_list[cc_aps_id[i]];
+if (!aps) {
+// Slice header refers to an APS which does not exist
+return AVERROR_INVALIDDATA;
+}
 alf->ctb_cc_idc[i] = ff_vvc_alf_ctb_cc_idc(lc, rx, ry, i, 
aps->num_cc_filters[i]);
 }
 }
 }
+
+return 0;
 }
 
 static void deblock_params(VVCLocalContext *lc, const int rx, const int ry)
@@ -2274,7 +2285,9 @@ static int hls_coding_tree_unit(VVCLocalContext *lc,
 memset(lc->parse.chroma_qp_offset, 0, sizeof(lc->parse.chroma_qp_offset));
 
 hls_sao(lc, x0 >> sps->ctb_log2_size_y, y0 >> sps->ctb_log2_size_y);
-alf_params(lc, x0 >> sps->ctb_log2_size_y, y0 >> sps->ctb_log2_size_y);
+ret = alf_params(lc, x0 >> sps->ctb_log2_size_y, y0 >> 
sps->ctb_log2_size_y);
+if (ret < 0)
+return ret;
 deblock_params(lc, x0 >> sps->ctb_log2_size_y, y0 >> sps->ctb_log2_size_y);
 
 if (IS_I(rsh) && sps->r->sps_qtbtt_dual_tree_intra_flag)
-- 
2.43.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-requ...@ffmpeg.org with subject "unsubscribe".


[FFmpeg-devel] [PATCH v2] lavc/vvc: Validate alf_list indexes

2024-02-05 Thread post
From: Frank Plowman 

Signed-off-by: Frank Plowman 
---
 libavcodec/vvc/vvc_ps.c | 37 +
 1 file changed, 37 insertions(+)

diff --git a/libavcodec/vvc/vvc_ps.c b/libavcodec/vvc/vvc_ps.c
index 4ef8f9f9b9..9c4a74fc9c 100644
--- a/libavcodec/vvc/vvc_ps.c
+++ b/libavcodec/vvc/vvc_ps.c
@@ -1005,6 +1005,39 @@ int ff_vvc_decode_aps(VVCParamSets *ps, const 
CodedBitstreamUnit *unit)
 return ret;
 }
 
+static int sh_alf_aps(VVCSH *sh, const VVCFrameParamSets *fps)
+{
+if (!sh->r->sh_alf_enabled_flag)
+return 0;
+
+for (int i = 0; i < sh->r->sh_num_alf_aps_ids_luma; i++) {
+const VVCALF * alf_aps_luma = 
fps->alf_list[sh->r->sh_alf_aps_id_luma[i]];
+if (!alf_aps_luma)
+return AVERROR_INVALIDDATA;
+}
+
+if (sh->r->sh_alf_cb_enabled_flag || sh->r->sh_alf_cr_enabled_flag) {
+const VVCALF* alf_aps_chroma = 
fps->alf_list[sh->r->sh_alf_aps_id_chroma];
+if (!alf_aps_chroma)
+return AVERROR_INVALIDDATA;
+}
+
+if (fps->sps->r->sps_ccalf_enabled_flag) {
+if (sh->r->sh_alf_cc_cb_enabled_flag) {
+const VVCALF *alf_aps_cc_cr = 
fps->alf_list[sh->r->sh_alf_cc_cb_aps_id];
+if (!alf_aps_cc_cr)
+return AVERROR_INVALIDDATA;
+}
+if (sh->r->sh_alf_cc_cr_enabled_flag) {
+const VVCALF *alf_aps_cc_cr = 
fps->alf_list[sh->r->sh_alf_cc_cr_aps_id];
+if (!alf_aps_cc_cr)
+return AVERROR_INVALIDDATA;
+}
+}
+
+return 0;
+}
+
 static void sh_slice_address(VVCSH *sh, const H266RawSPS *sps, const VVCPPS 
*pps)
 {
 const int slice_address = sh->r->sh_slice_address;
@@ -1123,8 +1156,12 @@ static int sh_derive(VVCSH *sh, const VVCFrameParamSets 
*fps)
 const H266RawSPS *sps   = fps->sps->r;
 const H266RawPPS *pps   = fps->pps->r;
 const H266RawPictureHeader *ph  = fps->ph.r;
+int ret;
 
 sh_slice_address(sh, sps, fps->pps);
+ret = sh_alf_aps(sh, fps);
+if (ret < 0)
+return ret;
 sh_inter(sh, sps, pps);
 sh_qp_y(sh, pps, ph);
 sh_deblock_offsets(sh);
-- 
2.43.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-requ...@ffmpeg.org with subject "unsubscribe".


[FFmpeg-devel] [PATCH] lavc/vvc: Fix slice_idx out-of-bounds memset

2024-02-05 Thread post
From: Frank Plowman 

If the number of CTUs reduces between one picture and the next, the
slice_idx table is reduced in size in the frame_context_for_each_tl call
on vvcdec.c:321.  When initialising the slice_idx table on vvcdec.c:325,
the old code uses fc->tab.sz.ctu_count when calculating the table size.
fc->tab.sz.ctu_count holds the old ctu count at this point however, not
being updated to hold the new ctu count until vvcdec.c:342.  This causes
an out-of-bounds write.

Patch fixes the problem by using pps->ctb_count, which was just used
when allocating the table, in place of fc->tab.sz.ctu_count when
initialising the table.

Signed-off-by: Frank Plowman 
---
 libavcodec/vvc/vvcdec.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libavcodec/vvc/vvcdec.c b/libavcodec/vvc/vvcdec.c
index 1a050600eb..8163b5ecb6 100644
--- a/libavcodec/vvc/vvcdec.c
+++ b/libavcodec/vvc/vvcdec.c
@@ -322,7 +322,7 @@ static int pic_arrays_init(VVCContext *s, VVCFrameContext 
*fc)
 if (ret < 0)
 return ret;
 
-memset(fc->tab.slice_idx, -1, sizeof(*fc->tab.slice_idx) * 
fc->tab.sz.ctu_count);
+memset(fc->tab.slice_idx, -1, sizeof(*fc->tab.slice_idx) * ctu_count);
 
 if (fc->tab.sz.ctu_count != ctu_count) {
 ff_refstruct_pool_uninit(&fc->rpl_tab_pool);
-- 
2.43.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-requ...@ffmpeg.org with subject "unsubscribe".


[FFmpeg-devel] [PATCH] lavu/thread: Check HAVE_PTHREAD_SET_?NAME_NP is defined

2024-02-06 Thread post
From: Frank Plowman 

Check HAVE_PTHREAD_SETNAME_NP and HAVE_PTHREAD_SET_NAME_NP are defined
before using them in macro conditions.  Gets rid of lots of -Wundef
warnings present when building on MacOS since
fd16d8c68cd7b820eda76c407b0645b7cf470efd.

Signed-off-by: Frank Plowman 
---
 libavutil/thread.h | 8 +---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/libavutil/thread.h b/libavutil/thread.h
index 2c00c7cc35..0200b7b511 100644
--- a/libavutil/thread.h
+++ b/libavutil/thread.h
@@ -26,7 +26,9 @@
 
 #if HAVE_PRCTL
 #include 
-#elif (HAVE_PTHREAD_SETNAME_NP || HAVE_PTHREAD_SET_NAME_NP) && 
HAVE_PTHREAD_NP_H
+#elif ((defined(HAVE_PTHREAD_SETNAME_NP) && HAVE_PTHREAD_SETNAME_NP) \
+|| (defined(HAVE_PTHREAD_SET_NAME_NP) && HAVE_PTHREAD_SET_NAME_NP)) \
+&& HAVE_PTHREAD_NP_H
 #include 
 #endif
 
@@ -219,7 +221,7 @@ static inline int ff_thread_setname(const char *name)
 
 #if HAVE_PRCTL
 ret = AVERROR(prctl(PR_SET_NAME, name));
-#elif HAVE_PTHREAD_SETNAME_NP
+#elif defined(HAVE_PTHREAD_SETNAME_NP) && HAVE_PTHREAD_SETNAME_NP
 #if defined(__APPLE__)
 ret = AVERROR(pthread_setname_np(name));
 #elif defined(__NetBSD__)
@@ -227,7 +229,7 @@ static inline int ff_thread_setname(const char *name)
 #else
 ret = AVERROR(pthread_setname_np(pthread_self(), name));
 #endif
-#elif HAVE_PTHREAD_SET_NAME_NP
+#elif defined(HAVE_PTHREAD_SET_NAME_NP) && HAVE_PTHREAD_SET_NAME_NP
 pthread_set_name_np(pthread_self(), name);
 #else
 ret = AVERROR(ENOSYS);
-- 
2.43.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-requ...@ffmpeg.org with subject "unsubscribe".


[FFmpeg-devel] [PATCH] lavc/vvc: Check fc->ref contains valid reference

2024-02-08 Thread post
From: Frank Plowman 

Depending on where exactly decode_nal_unit failed, it is possible that
fc->ref holds a VVCFrame which has had ff_vvc_unref_frame called on it
and not yet had ref_frame called on it.  In this case, fc->ref most of
the fields of fc->ref are NULL and attempting to call
ff_vvc_report_frame_finished on it will result in a null dereference.

Patch fixes the error described above by checking fc->ref has not only
been allocated, but also references a valid AVFrame before attempting to
call ff_vvc_report_frame_finished on it.

Signed-off-by: Frank Plowman 
---
 libavcodec/vvc/vvcdec.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libavcodec/vvc/vvcdec.c b/libavcodec/vvc/vvcdec.c
index 8163b5ecb6..246ee79299 100644
--- a/libavcodec/vvc/vvcdec.c
+++ b/libavcodec/vvc/vvcdec.c
@@ -820,7 +820,7 @@ static int decode_nal_units(VVCContext *s, VVCFrameContext 
*fc, AVPacket *avpkt)
 return 0;
 
 fail:
-if (fc->ref)
+if (fc->ref && fc->ref->frame->buf[0])
 ff_vvc_report_frame_finished(fc->ref);
 return ret;
 }
-- 
2.43.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-requ...@ffmpeg.org with subject "unsubscribe".