From 5767e173414432d6079b1b581121622e874a26cd Mon Sep 17 00:00:00 2001
From: dukesook <devonsookhoo14@gmail.com>
Date: Tue, 24 Sep 2024 12:27:31 -0600
Subject: [PATCH 1/2] mov_write_uncC_tag()

Initial function for writing the uncC, or uncopmressed codec box
---
 libavformat/movenc.c | 52 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)

diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index d20e45cf81..da40442726 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -2602,6 +2602,58 @@ static int mov_write_aux_tag(AVIOContext *pb, const char *aux_type)
     return update_size(pb, pos);
 }
 
+static int mov_write_uncC_component(AVIOContext *pb, uint16_t index, uint8_t bit_depth_minus_one, uint8_t format, uint8_t align_size) {
+    avio_wb16(pb, index);
+    avio_w8(pb, bit_depth_minus_one);
+    avio_w8(pb, format);
+    avio_w8(pb, align_size);
+    return 0;
+}
+
+static int mov_write_uncC_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track) {
+    int64_t pos = avio_tell(pb);
+    uint8_t version = 0x0;
+
+    avio_wb32(pb, 0); /* size */
+    ffio_wfourcc(pb, "uncC");
+
+    //FULL BOX
+    avio_w8(pb, 0x00);       // Flags
+    avio_wb24(pb, 0x000000); // Version
+
+    avio_wb32(pb, 0x00000000); // profile
+
+    if (version == 1) {
+        return update_size(pb, pos);
+    }
+    else if (version == 0) {
+        avio_wb32(pb, 0x03); // component_count
+        mov_write_uncC_component(pb, 0x0000, 0x07, 0x00, 0x00); //Red
+        mov_write_uncC_component(pb, 0x0001, 0x07, 0x00, 0x00); //Green
+        mov_write_uncC_component(pb, 0x0002, 0x07, 0x00, 0x00); //Blue
+
+        avio_w8(pb, 0x00); //sampling_type. 0 = No subsampling
+        avio_w8(pb, 0x00); //interleave_type. 0 = Planar, 1 = interleaved
+        avio_w8(pb, 0x00); //block_size;
+
+        // Pixel Layout Flags
+        // bit(1) components_little_endian;
+        // bit(1) block_pad_last;
+        // bit(1) block_little_endian;
+        // bit(1) block_reversed;
+        // bit(1) pad_unknown;
+        // bit(3) reserved = 0;
+        avio_w8(pb, 0X00);
+
+        avio_wb32(pb, 0x00000000); // pixel_size;
+        avio_wb32(pb, 0x00000000); // row_align_size;
+        avio_wb32(pb, 0x00000000); // tile_align_size;
+        avio_wb32(pb, 0x00000000); // num_tile_cols_minus_one;
+        avio_wb32(pb, 0x00000000); // num_tile_rows_minus_one;
+    }
+    return update_size(pb, pos);
+}
+
 static int mov_write_video_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track)
 {
     int ret = AVERROR_BUG;
-- 
2.34.1


From 92d2e0c32bed2d54e30cfdb7a05a6fc68471e800 Mon Sep 17 00:00:00 2001
From: dukesook <devonsookhoo14@gmail.com>
Date: Wed, 2 Oct 2024 21:17:38 -0600
Subject: [PATCH 2/2] read nb_components using av_pix_fmt_desc_get()

---
 libavformat/movenc.c | 19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index da40442726..f4bab5823e 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -2602,10 +2602,10 @@ static int mov_write_aux_tag(AVIOContext *pb, const char *aux_type)
     return update_size(pb, pos);
 }
 
-static int mov_write_uncC_component(AVIOContext *pb, uint16_t index, uint8_t bit_depth_minus_one, uint8_t format, uint8_t align_size) {
+static int mov_write_uncC_component(AVIOContext *pb, uint16_t index, uint8_t bit_depth, uint8_t format, uint8_t align_size) {
     avio_wb16(pb, index);
-    avio_w8(pb, bit_depth_minus_one);
-    avio_w8(pb, format);
+    avio_w8(pb, bit_depth-1);
+    avio_w8(pb, format); // 0 = unsigned integer. 1 = floating point. 2 = complex
     avio_w8(pb, align_size);
     return 0;
 }
@@ -2613,6 +2613,9 @@ static int mov_write_uncC_component(AVIOContext *pb, uint16_t index, uint8_t bit
 static int mov_write_uncC_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track) {
     int64_t pos = avio_tell(pb);
     uint8_t version = 0x0;
+    const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(s->streams[0]->codecpar->format);
+    const uint32_t nb_components = (uint32_t) pixdesc->nb_components;
+
 
     avio_wb32(pb, 0); /* size */
     ffio_wfourcc(pb, "uncC");
@@ -2624,13 +2627,13 @@ static int mov_write_uncC_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext
     avio_wb32(pb, 0x00000000); // profile
 
     if (version == 1) {
-        return update_size(pb, pos);
+
     }
     else if (version == 0) {
-        avio_wb32(pb, 0x03); // component_count
-        mov_write_uncC_component(pb, 0x0000, 0x07, 0x00, 0x00); //Red
-        mov_write_uncC_component(pb, 0x0001, 0x07, 0x00, 0x00); //Green
-        mov_write_uncC_component(pb, 0x0002, 0x07, 0x00, 0x00); //Blue
+        avio_wb32(pb, nb_components);
+        for (uint32_t i = 0; i < nb_components; i++) {
+            mov_write_uncC_component(pb, i, 0x08, 0x00, 0x00);
+        }
 
         avio_w8(pb, 0x00); //sampling_type. 0 = No subsampling
         avio_w8(pb, 0x00); //interleave_type. 0 = Planar, 1 = interleaved
-- 
2.34.1

