tis 2024-10-29 klockan 12:21 -0300 skrev James Almer:
> > From ce4b1dfb97530b242f899e5d1686f98fa83a7698 Mon Sep 17 00:00:00
> > 2001
> > From: =?UTF-8?q?Tomas=20H=C3=A4rdin?= <g...@haerdin.se>
> > Date: Tue, 29 Oct 2024 16:13:04 +0100
> > Subject: [PATCH] lavf/mxfenc: Use nb_components, not
> > av_pix_fmt_count_planes()
> > 
> > This fixed https://trac.ffmpeg.org/ticket/11267
> > ---
> >  libavformat/mxfenc.c | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> > 
> > diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c
> > index 57be9e6ef6..e66df0fba2 100644
> > --- a/libavformat/mxfenc.c
> > +++ b/libavformat/mxfenc.c
> > @@ -1488,7 +1488,7 @@ static void
> > mxf_write_jpeg2000_subdesc(AVFormatContext *s, AVStream *st)
> >      MXFStreamContext *sc = st->priv_data;
> >      AVIOContext *pb = s->pb;
> >      int64_t pos;
> > -    int component_count = av_pix_fmt_count_planes(st->codecpar-
> > >format);
> > +    int component_count = av_pix_fmt_desc_get(st->codecpar-
> > >format)->nb_components;
> 
> I don't think anything ensures that av_pix_fmt_desc_get() here will
> not 
> return NULL, so maybe instead do:
> 
> > const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(st->codecpar-
> > >format);
> > int component_count;
> > 
> > if (!desc)
> >     return AVERROR(EINVAL);
> > 
> > component_count = desc->nb_components;

I can't really see how that would happen, but I suppose it doesn't
hurt.

I see elsewhere in the code an assert that the returned pointer is not
NULL (mxf_write_ffv1_desc()), and explicit checks for it

Updated patch attached. Passes fate-mxf

/Tomas
From fb22a632cca04be64140284a3fc70c6511b970b0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tomas=20H=C3=A4rdin?= <g...@haerdin.se>
Date: Tue, 29 Oct 2024 16:13:04 +0100
Subject: [PATCH] lavf/mxfenc: Use nb_components, not av_pix_fmt_count_planes()

Also check that pix_desc != NULL, thanks James Almer

This fixes https://trac.ffmpeg.org/ticket/11267
---
 libavformat/mxfenc.c | 24 +++++++++++++++++-------
 1 file changed, 17 insertions(+), 7 deletions(-)

diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c
index 57be9e6ef6..664e8ca743 100644
--- a/libavformat/mxfenc.c
+++ b/libavformat/mxfenc.c
@@ -1488,7 +1488,12 @@ static void mxf_write_jpeg2000_subdesc(AVFormatContext *s, AVStream *st)
     MXFStreamContext *sc = st->priv_data;
     AVIOContext *pb = s->pb;
     int64_t pos;
-    int component_count = av_pix_fmt_count_planes(st->codecpar->format);
+    const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(st->codecpar->format);
+
+    if (!pix_desc) {
+        av_log(s, AV_LOG_ERROR, "Pixel format not set - not writing JPEG2000SubDescriptor\n");
+        return;
+    }
 
     /* JPEG2000 subdescriptor key */
     avio_write(pb, mxf_jpeg2000_subdescriptor_key, 16);
@@ -1527,15 +1532,15 @@ static void mxf_write_jpeg2000_subdesc(AVFormatContext *s, AVStream *st)
     avio_wb32(pb, sc->j2k_info.j2k_yt0siz);
     /* Image components number (Csiz) */
     mxf_write_local_tag(s, 2, 0x840A);
-    avio_wb16(pb, component_count);
+    avio_wb16(pb, pix_desc->nb_components);
     /* Array of picture components where each component comprises 3 bytes named Ssiz(i) (Pixel bitdepth - 1),
        XRSiz(i) (Horizontal sampling), YRSiz(i) (Vertical sampling). The array of 3-byte groups is preceded
        by the array header comprising a 4-byte value of the number of components followed by a 4-byte
        value of 3. */
-    mxf_write_local_tag(s, 8 + 3*component_count, 0x840B);
-    avio_wb32(pb, component_count);
+    mxf_write_local_tag(s, 8 + 3*pix_desc->nb_components, 0x840B);
+    avio_wb32(pb, pix_desc->nb_components);
     avio_wb32(pb, 3);
-    avio_write(pb, sc->j2k_info.j2k_comp_desc, 3*component_count);
+    avio_write(pb, sc->j2k_info.j2k_comp_desc, 3*pix_desc->nb_components);
 
     mxf_update_klv_size(pb, pos);
 }
@@ -2638,10 +2643,15 @@ static int mxf_parse_jpeg2000_frame(AVFormatContext *s, AVStream *st, AVPacket *
 {
     MXFContext *mxf = s->priv_data;
     MXFStreamContext *sc = st->priv_data;
-    int component_count = av_pix_fmt_count_planes(st->codecpar->format);
+    const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(st->codecpar->format);
     GetByteContext g;
     uint32_t j2k_ncomponents;
 
+    if (!pix_desc) {
+        av_log(s, AV_LOG_ERROR, "Pixel format not set\n");
+        return AVERROR(EINVAL);
+    }
+
     if (mxf->header_written)
         return 1;
 
@@ -2671,7 +2681,7 @@ static int mxf_parse_jpeg2000_frame(AVFormatContext *s, AVStream *st, AVPacket *
     sc->j2k_info.j2k_xt0siz = bytestream2_get_be32u(&g);
     sc->j2k_info.j2k_yt0siz = bytestream2_get_be32u(&g);
     j2k_ncomponents = bytestream2_get_be16u(&g);
-    if (j2k_ncomponents != component_count) {
+    if (j2k_ncomponents != pix_desc->nb_components) {
         av_log(s, AV_LOG_ERROR, "Incoherence about components image number.\n");
         return AVERROR_INVALIDDATA;
     }
-- 
2.39.2

_______________________________________________
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".

Reply via email to