Re: [FFmpeg-devel] [PATCH] [MXF] - Add jpeg2000 subdescriptor in MXF file (V2).

2023-12-31 Thread Tomas Härdin
sön 2023-12-31 klockan 14:16 +0100 skrev Tomas Härdin:
> fre 2023-12-22 klockan 09:58 +0100 skrev Cédric Le Barz:
> > 
> > Le 21/12/2023 à 12:11, Tomas Härdin a écrit :
> > > ons 2023-12-20 klockan 18:04 +0100 skrev Cédric Le Barz:
> > > > Le 19/12/2023 à 14:36, Tomas Härdin a écrit :
> > > > > > +    for ( comp = 0; comp < component_count; comp++ ) {
> > > > > > +    avio_write(pb, &sc->j2k_info.j2k_comp_desc[3*comp]
> > > > > > ,
> > > > > > 3);
> > > > > > +    }
> > > > > Looks like this could be simplified to just
> > > > > 
> > > > >     avio_write(pb, sc->j2k_info.j2k_comp_desc,
> > > > > 3*component_count);
> > > > > 
> > > > > > +    if (j2k_ncomponents != component_count) {
> > > > > > +    av_log(s, AV_LOG_ERROR, "Incoherence about
> > > > > > components
> > > > > > image
> > > > > > number.\n");
> > > > > > +    }
> > > > > I again feel this should be a hard error
> > > > > 
> > > > > > +    for (comp = 0; comp < j2k_ncomponents; comp++) {
> > > > > > +    sc->j2k_info.j2k_comp_desc[comp*j2k_ncomponents] =
> > > > > > bytestream2_get_byteu(&g);   // Bitdepth for each component
> > > > > > +    sc->j2k_info.j2k_comp_desc[comp*j2k_ncomponents+1]
> > > > > > =
> > > > > > bytestream2_get_byteu(&g); // Horizontal sampling for each
> > > > > > component
> > > > > > +    sc->j2k_info.j2k_comp_desc[comp*j2k_ncomponents+2]
> > > > > > =
> > > > > > bytestream2_get_byteu(&g); // Vertical sampling for each
> > > > > > component
> > > > > > +    }
> > > > > Could be simplified to a single avio_read()
> > > > > 
> > > > > /Tomas
> > > > > ___
> > > > > 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".
> > > > Here is the new version of the patch taken into account your
> > > > remarks.
> > > Looks OK. Does this also work with RGB(A)? Seems to not be
> > > hardcoded
> > > for YUV at least. Higher bitdepths would also be nice, I've been
> > > working with lossless RGB48 J2K. Doesn't necessarily need to hold
> > > up
> > > this patch, just curious.
> > > 
> > > /Tomas
> > 
> > Any J2K bitdepth can be handled with this patch (up to 31 bits per 
> > component).
> > 
> > Concerning RGBA, The JPEG 2000 sub-descriptor can be referenced
> > either 
> > by the CDCI picture essence descriptor or the RGBA picture essence 
> > descriptor both of which are defined by SMPTE ST 377-1. In this
> > patch
> > it 
> > is only referenced by the CDCI as the RGBA essence descriptor is
> > not
> > yet 
> > implemented in FFmpeg.   Nevertheless, I think it should work too
> > with 
> > CDCI essence descriptor : if you have such data, you can try.
> 
> I have one sample at least, muxed by WidgetCo's as-02-wrap. Its
> descriptor looks like this (via mxfdump):
> 
> RGBAEssenceDescriptor
>   InstanceUID = {c3bf8d8c-6fd4-4004-83d7-3950ab56e86f}
>   SubDescriptors
>     SubDescriptor = {d2013379-ad4b-4d9e-9531-c3a6d8d59175}
>     SubDescriptor -> Strong Reference to JPEG2000PictureSubDescriptor
>   JPEG2000PictureSubDescriptor
>     InstanceUID = {d2013379-ad4b-4d9e-9531-c3a6d8d59175}
>     Rsiz = 16384
>     Xsiz = 3840
>     Ysiz = 2160
>     XOsiz = 0
>     YOsiz = 0
>     XTsiz = 3840
>     YTsiz = 2160
>     XTOsiz = 0
>     YTOsiz = 0
>     Csiz = 3
>     PictureComponentSizing
>   PictureComponentSize = Ssiz="15", XRsiz="1", YRsiz="1"
>   PictureComponentSize = Ssiz="15", XRsiz="1", YRsiz="1"
>   PictureComponentSize = Ssiz="15", XRsiz="1", YRsiz="1"
>     CodingStyleDefault = Scod="0", SGcod="ProgressionOrder="2",
> NumberOfLayers="1", MultipleComponentTransformation="1"",
> SPcod="DecompositionLevels="5", CodeblockWidth="4",
> CodeblockHeight="4", CodeblockStyle="64", Transformation="1"",
> PrecinctSize=""
>     QuantizationDefault = Sqcd="32", SPqcd="152, 160, 160, 168,
> 160, 160, 168, 160, 160, 168, 160, 160, 160, 152, 152, 160"
>     Unknown ff.e9 [060e2b34.0101.010e.04010603.0e00] = 52 10
> 47
> 10 42 10 00 00 00 00 00 00 00 00 00 00
>     Unknown ff.e8 [060e2b34.0101.010e.04010603.0f00] = 00 02
> 00
> 00 00 00 00 01 00 00 00 02 00 02
>   LinkedTrackID = 2
>   SampleRate = 24/1
>   ContainerDuration = 1
>   EssenceContainer = MXF-GC JPEG-2000 Picture Mappings
>   FrameLayout = 0
>   StoredWidth = 3840
>   StoredHeight = 2160
>   AspectRatio = 3840/2160
>   Gamma = [060e2b34.0401.010d.04010101.010a]
>   PictureEssenceCoding = [060e2b34.0401.010d.04010202.03010801]
>   Unknown 32.19 [060e2b34.0101.0109.04010201.01060100] = 06 0e 2b 34
> 04
> 01 01 0d 04 01 01 01 03 04 00 00
>   Unknown ff.fe [060e2b34.0101.010e.04010501.1400] = 00 00 00 02
>   Unknown ff.fd [060e2b34.0101.010e.04010501.1300] = 00 00 00 03
>   Unknown ff.fc [060e2b34.0101.010e.04010501.1

Re: [FFmpeg-devel] [PATCH] [MXF] - Add jpeg2000 subdescriptor in MXF file (V2).

2023-12-31 Thread Tomas Härdin
fre 2023-12-22 klockan 09:58 +0100 skrev Cédric Le Barz:
> 
> Le 21/12/2023 à 12:11, Tomas Härdin a écrit :
> > ons 2023-12-20 klockan 18:04 +0100 skrev Cédric Le Barz:
> > > Le 19/12/2023 à 14:36, Tomas Härdin a écrit :
> > > > > +    for ( comp = 0; comp < component_count; comp++ ) {
> > > > > +    avio_write(pb, &sc->j2k_info.j2k_comp_desc[3*comp] ,
> > > > > 3);
> > > > > +    }
> > > > Looks like this could be simplified to just
> > > > 
> > > >     avio_write(pb, sc->j2k_info.j2k_comp_desc,
> > > > 3*component_count);
> > > > 
> > > > > +    if (j2k_ncomponents != component_count) {
> > > > > +    av_log(s, AV_LOG_ERROR, "Incoherence about
> > > > > components
> > > > > image
> > > > > number.\n");
> > > > > +    }
> > > > I again feel this should be a hard error
> > > > 
> > > > > +    for (comp = 0; comp < j2k_ncomponents; comp++) {
> > > > > +    sc->j2k_info.j2k_comp_desc[comp*j2k_ncomponents] =
> > > > > bytestream2_get_byteu(&g);   // Bitdepth for each component
> > > > > +    sc->j2k_info.j2k_comp_desc[comp*j2k_ncomponents+1] =
> > > > > bytestream2_get_byteu(&g); // Horizontal sampling for each
> > > > > component
> > > > > +    sc->j2k_info.j2k_comp_desc[comp*j2k_ncomponents+2] =
> > > > > bytestream2_get_byteu(&g); // Vertical sampling for each
> > > > > component
> > > > > +    }
> > > > Could be simplified to a single avio_read()
> > > > 
> > > > /Tomas
> > > > ___
> > > > 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".
> > > Here is the new version of the patch taken into account your
> > > remarks.
> > Looks OK. Does this also work with RGB(A)? Seems to not be
> > hardcoded
> > for YUV at least. Higher bitdepths would also be nice, I've been
> > working with lossless RGB48 J2K. Doesn't necessarily need to hold
> > up
> > this patch, just curious.
> > 
> > /Tomas
> 
> Any J2K bitdepth can be handled with this patch (up to 31 bits per 
> component).
> 
> Concerning RGBA, The JPEG 2000 sub-descriptor can be referenced
> either 
> by the CDCI picture essence descriptor or the RGBA picture essence 
> descriptor both of which are defined by SMPTE ST 377-1. In this patch
> it 
> is only referenced by the CDCI as the RGBA essence descriptor is not
> yet 
> implemented in FFmpeg.   Nevertheless, I think it should work too
> with 
> CDCI essence descriptor : if you have such data, you can try.

I have one sample at least, muxed by WidgetCo's as-02-wrap. Its
descriptor looks like this (via mxfdump):

RGBAEssenceDescriptor
  InstanceUID = {c3bf8d8c-6fd4-4004-83d7-3950ab56e86f}
  SubDescriptors
SubDescriptor = {d2013379-ad4b-4d9e-9531-c3a6d8d59175}
SubDescriptor -> Strong Reference to JPEG2000PictureSubDescriptor
  JPEG2000PictureSubDescriptor
InstanceUID = {d2013379-ad4b-4d9e-9531-c3a6d8d59175}
Rsiz = 16384
Xsiz = 3840
Ysiz = 2160
XOsiz = 0
YOsiz = 0
XTsiz = 3840
YTsiz = 2160
XTOsiz = 0
YTOsiz = 0
Csiz = 3
PictureComponentSizing
  PictureComponentSize = Ssiz="15", XRsiz="1", YRsiz="1"
  PictureComponentSize = Ssiz="15", XRsiz="1", YRsiz="1"
  PictureComponentSize = Ssiz="15", XRsiz="1", YRsiz="1"
CodingStyleDefault = Scod="0", SGcod="ProgressionOrder="2",
NumberOfLayers="1", MultipleComponentTransformation="1"",
SPcod="DecompositionLevels="5", CodeblockWidth="4",
CodeblockHeight="4", CodeblockStyle="64", Transformation="1"",
PrecinctSize=""
QuantizationDefault = Sqcd="32", SPqcd="152, 160, 160, 168,
160, 160, 168, 160, 160, 168, 160, 160, 160, 152, 152, 160"
Unknown ff.e9 [060e2b34.0101.010e.04010603.0e00] = 52 10 47
10 42 10 00 00 00 00 00 00 00 00 00 00
Unknown ff.e8 [060e2b34.0101.010e.04010603.0f00] = 00 02 00
00 00 00 00 01 00 00 00 02 00 02
  LinkedTrackID = 2
  SampleRate = 24/1
  ContainerDuration = 1
  EssenceContainer = MXF-GC JPEG-2000 Picture Mappings
  FrameLayout = 0
  StoredWidth = 3840
  StoredHeight = 2160
  AspectRatio = 3840/2160
  Gamma = [060e2b34.0401.010d.04010101.010a]
  PictureEssenceCoding = [060e2b34.0401.010d.04010202.03010801]
  Unknown 32.19 [060e2b34.0101.0109.04010201.01060100] = 06 0e 2b 34 04
01 01 0d 04 01 01 01 03 04 00 00
  Unknown ff.fe [060e2b34.0101.010e.04010501.1400] = 00 00 00 02
  Unknown ff.fd [060e2b34.0101.010e.04010501.1300] = 00 00 00 03
  Unknown ff.fc [060e2b34.0101.010e.04010501.1500] = 00 00 00 04
  Unknown ff.fb [060e2b34.0101.010e.04010501.1600] = 00 00 00 05
  VideoLineMap
VideoLineMapEntry = 
VideoLineMapEntry = 
  Unknown ff.fa [060e2b34.0101.010e.04200401.0101] = 7d 00 40 74 3a
98 75 30 1d 4c 0b b8
  Unknown ff.f9 [060e2b34.0101.010e.04200401.0102] = 3d 13 40 42
  Unknown ff.f8 [060

Re: [FFmpeg-devel] [PATCH] [MXF] - Add jpeg2000 subdescriptor in MXF file (V2).

2023-12-22 Thread Cédric Le Barz


Le 21/12/2023 à 12:11, Tomas Härdin a écrit :

ons 2023-12-20 klockan 18:04 +0100 skrev Cédric Le Barz:

Le 19/12/2023 à 14:36, Tomas Härdin a écrit :

+for ( comp = 0; comp < component_count; comp++ ) {
+avio_write(pb, &sc->j2k_info.j2k_comp_desc[3*comp] , 3);
+}

Looks like this could be simplified to just

avio_write(pb, sc->j2k_info.j2k_comp_desc, 3*component_count);


+if (j2k_ncomponents != component_count) {
+av_log(s, AV_LOG_ERROR, "Incoherence about components
image
number.\n");
+}

I again feel this should be a hard error


+for (comp = 0; comp < j2k_ncomponents; comp++) {
+sc->j2k_info.j2k_comp_desc[comp*j2k_ncomponents] =
bytestream2_get_byteu(&g);   // Bitdepth for each component
+sc->j2k_info.j2k_comp_desc[comp*j2k_ncomponents+1] =
bytestream2_get_byteu(&g); // Horizontal sampling for each
component
+sc->j2k_info.j2k_comp_desc[comp*j2k_ncomponents+2] =
bytestream2_get_byteu(&g); // Vertical sampling for each
component
+}

Could be simplified to a single avio_read()

/Tomas
___
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".

Here is the new version of the patch taken into account your remarks.

Looks OK. Does this also work with RGB(A)? Seems to not be hardcoded
for YUV at least. Higher bitdepths would also be nice, I've been
working with lossless RGB48 J2K. Doesn't necessarily need to hold up
this patch, just curious.

/Tomas


Any J2K bitdepth can be handled with this patch (up to 31 bits per 
component).


Concerning RGBA, The JPEG 2000 sub-descriptor can be referenced either 
by the CDCI picture essence descriptor or the RGBA picture essence 
descriptor both of which are defined by SMPTE ST 377-1. In this patch it 
is only referenced by the CDCI as the RGBA essence descriptor is not yet 
implemented in FFmpeg.   Nevertheless, I think it should work too with 
CDCI essence descriptor : if you have such data, you can try.


Cédric



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


Re: [FFmpeg-devel] [PATCH] [MXF] - Add jpeg2000 subdescriptor in MXF file (V2).

2023-12-21 Thread Tomas Härdin
ons 2023-12-20 klockan 18:04 +0100 skrev Cédric Le Barz:
> Le 19/12/2023 à 14:36, Tomas Härdin a écrit :
> > > +    for ( comp = 0; comp < component_count; comp++ ) {
> > > +    avio_write(pb, &sc->j2k_info.j2k_comp_desc[3*comp] , 3);
> > > +    }
> > Looks like this could be simplified to just
> > 
> >    avio_write(pb, sc->j2k_info.j2k_comp_desc, 3*component_count);
> > 
> > > +    if (j2k_ncomponents != component_count) {
> > > +    av_log(s, AV_LOG_ERROR, "Incoherence about components
> > > image
> > > number.\n");
> > > +    }
> > I again feel this should be a hard error
> > 
> > > +    for (comp = 0; comp < j2k_ncomponents; comp++) {
> > > +    sc->j2k_info.j2k_comp_desc[comp*j2k_ncomponents] =
> > > bytestream2_get_byteu(&g);   // Bitdepth for each component
> > > +    sc->j2k_info.j2k_comp_desc[comp*j2k_ncomponents+1] =
> > > bytestream2_get_byteu(&g); // Horizontal sampling for each
> > > component
> > > +    sc->j2k_info.j2k_comp_desc[comp*j2k_ncomponents+2] =
> > > bytestream2_get_byteu(&g); // Vertical sampling for each
> > > component
> > > +    }
> > Could be simplified to a single avio_read()
> > 
> > /Tomas
> > ___
> > 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".
> 
> Here is the new version of the patch taken into account your remarks.

Looks OK. Does this also work with RGB(A)? Seems to not be hardcoded
for YUV at least. Higher bitdepths would also be nice, I've been
working with lossless RGB48 J2K. Doesn't necessarily need to hold up
this patch, just curious.

/Tomas
___
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".


Re: [FFmpeg-devel] [PATCH] [MXF] - Add jpeg2000 subdescriptor in MXF file (V2).

2023-12-20 Thread Cédric Le Barz

Le 19/12/2023 à 14:36, Tomas Härdin a écrit :

+for ( comp = 0; comp < component_count; comp++ ) {
+avio_write(pb, &sc->j2k_info.j2k_comp_desc[3*comp] , 3);
+}

Looks like this could be simplified to just

   avio_write(pb, sc->j2k_info.j2k_comp_desc, 3*component_count);


+if (j2k_ncomponents != component_count) {
+av_log(s, AV_LOG_ERROR, "Incoherence about components image
number.\n");
+}

I again feel this should be a hard error


+for (comp = 0; comp < j2k_ncomponents; comp++) {
+sc->j2k_info.j2k_comp_desc[comp*j2k_ncomponents] =
bytestream2_get_byteu(&g);   // Bitdepth for each component
+sc->j2k_info.j2k_comp_desc[comp*j2k_ncomponents+1] =
bytestream2_get_byteu(&g); // Horizontal sampling for each component
+sc->j2k_info.j2k_comp_desc[comp*j2k_ncomponents+2] =
bytestream2_get_byteu(&g); // Vertical sampling for each component
+}

Could be simplified to a single avio_read()

/Tomas
___
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".


Here is the new version of the patch taken into account your remarks.

Regards,

Cédric Le Barz
--- Begin Message ---
Signed-off-by: Cedric Le Barz 
---
 ffmpeg/libavformat/mxf.h|   1 +
 ffmpeg/libavformat/mxfenc.c | 169 +++-
 2 files changed, 169 insertions(+), 1 deletion(-)

diff --git a/ffmpeg/libavformat/mxf.h b/ffmpeg/libavformat/mxf.h
index 2561605..7dd1681 100644
--- a/ffmpeg/libavformat/mxf.h
+++ b/ffmpeg/libavformat/mxf.h
@@ -55,6 +55,7 @@ enum MXFMetadataSetType {
 SoundfieldGroupLabelSubDescriptor,
 GroupOfSoundfieldGroupsLabelSubDescriptor,
 FFV1SubDescriptor,
+JPEG2000SubDescriptor,
 };
 
 enum MXFFrameLayout {
diff --git a/ffmpeg/libavformat/mxfenc.c b/ffmpeg/libavformat/mxfenc.c
index 53bd6ae..685c11b 100644
--- a/ffmpeg/libavformat/mxfenc.c
+++ b/ffmpeg/libavformat/mxfenc.c
@@ -48,8 +48,10 @@
 #include "libavutil/pixdesc.h"
 #include "libavutil/time_internal.h"
 #include "libavcodec/defs.h"
+#include "libavcodec/bytestream.h"
 #include "libavcodec/golomb.h"
 #include "libavcodec/h264.h"
+#include "libavcodec/jpeg2000.h"
 #include "libavcodec/packet_internal.h"
 #include "libavcodec/rangecoder.h"
 #include "libavcodec/startcode.h"
@@ -78,6 +80,20 @@ typedef struct MXFIndexEntry {
 uint8_t flags;
 } MXFIndexEntry;
 
+typedef struct j2k_info_t {
+uint16_t j2k_cap;///< j2k required decoder capabilities
+uint16_t j2k_rsiz;   ///< j2k required decoder capabilities (Rsiz)
+uint32_t j2k_xsiz;   ///< j2k width of the reference grid (Xsiz)
+uint32_t j2k_ysiz;   ///< j2k height of the reference grid (Ysiz)
+uint32_t j2k_x0siz;  ///< j2k horizontal offset from the origin of the 
reference grid to the left side of the image (X0siz)
+uint32_t j2k_y0siz;  ///< j2k vertical offset from the origin of the 
reference grid to the left side of the image (Y0siz)
+uint32_t j2k_xtsiz;  ///< j2k width of one reference tile with respect 
to the reference grid (XTsiz)
+uint32_t j2k_ytsiz;  ///< j2k height of one reference tile with 
respect to the reference grid (YTsiz)
+uint32_t j2k_xt0siz; ///< j2k horizontal offset from the origin of the 
reference grid to the left side of the first tile (XT0siz)
+uint32_t j2k_yt0siz; ///< j2k vertical offset from the origin of the 
reference grid to the left side of the first tile (YT0siz)
+uint8_t  j2k_comp_desc[12]; ///< j2k components descriptor (Ssiz(i), 
XRsiz(i), YRsiz(i))
+} j2k_info_t;
+
 typedef struct MXFStreamContext {
 int64_t pkt_cnt; ///< pkt counter for muxed packets
 UID track_essence_element_key;
@@ -104,6 +120,7 @@ typedef struct MXFStreamContext {
 int low_delay;   ///< low delay, used in mpeg-2 descriptor
 int avc_intra;
 int micro_version;   ///< format micro_version, used in ffv1 descriptor
+j2k_info_t j2k_info;
 } MXFStreamContext;
 
 typedef struct MXFContainerEssenceEntry {
@@ -413,6 +430,20 @@ static const MXFLocalTagPair mxf_local_tag_batch[] = {
 { 0xDFD9, 
{0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x0E,0x04,0x01,0x06,0x0C,0x06,0x00,0x00,0x00}},
 /* FFV1 Micro-version */
 { 0xDFDA, 
{0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x0E,0x04,0x01,0x06,0x0C,0x05,0x00,0x00,0x00}},
 /* FFV1 Version */
 { 0xDFDB, 
{0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x0E,0x04,0x01,0x06,0x0C,0x01,0x00,0x00,0x00}},
 /* FFV1 Initialization Metadata */
+// ff_mxf_jpeg2000_local_tags
+{ 0x8400, 
{0x06,0x0E,0x2B,0x34,0x01,0x01,0x01,0x09,0x06,0x01,0x01,0x04,0x06,0x10,0x00,0x00}},
 /* Sub Descriptors / Opt Ordered array of strong references to sub descriptor 
sets */
+{ 0x8401, 
{0x06,0x0e,0x2b,0x34,0x01,0x01,0x01,0x0a,0x04,0x01,0x06,0x03,0x01,0x00,0x00,0x00}},
 /* Rsiz: An enumerated value that de