← Firmware research← 韌體研究

From sensor to CinemaDNG從感光元件到 CinemaDNG

Eleven stages between tapping a resolution in the menu and a file landing on the card. This is all of them, opened up — what each one reads, what it decides, where the three open-gate projects cut in, and which parts are still dark. The second half collects every pitfall the three projects hit — garbled takes, wrong sizes, broken DNGs, dropped frames, live view, playback — and the alignment and divisibility rules of each stage.

從你在選單按下一個解析度,到卡上出現一個檔案,中間有十一關。這頁把每一關都拆開來講:它讀什麼、決定什麼、三個 open gate 專案各從哪裡切進去, 以及哪些地方其實我們還沒搞懂。後半頁把三個專案踩過的每一個坑(花屏、尺寸錯、DNG 寫壞、掉格、live view、回放) 和每一關的對齊與整除要求整理在一起。

Where this comes from資料從哪來
Ver.5.02 disassembly plus what OG3K, OG2K and HSW each had to find out to work. Several stages were only understood after a failure, and those are called out where they happened.
Ver.5.02 的反組譯,加上 OG3K、OG2K、HSW 為了能動而不得不搞懂的東西。有好幾關是失敗之後才搞懂的,那些地方我會直接寫出當時錯在哪。
How to read the status狀態標記怎麼看
A stage is solved only if something was verified on a camera or read directly out of the firmware. partial means the shape is known but a load-bearing detail is not. dark means it is guesswork.
只有「在相機上驗過」或「直接從韌體讀出來」才算 solved。partial 是大致形狀知道、但有個關鍵細節還沒定。dark 就是在猜。
What is deliberately not here故意不寫的
Audio, the gyro sidecar, and the still-photo path. This is the movie raw chain only.
音訊、陀螺儀的 sidecar、拍照路徑,都不在這頁。這頁只講錄影 raw 這條線。

The whole chain整條鏈

The eleven stages from menu selection to a CinemaDNG file menu selection 選單選擇 resolution · frame rate · bit depth · crop 解析度 · 格率 · 位元深度 · 裁切 picker — string key lookup picker — 用字串當鍵查表 "FHD"+"30"(+"CROP") → three tables by bit depth "FHD"+"30"(+"CROP") → 依位元深度分三張表 FUN_c043b828 format entry — 16 bytes 格式條目 — 16 bytes {5, profile, sensor mode, key ptr} 0xC0BE5B50 all three 三個專案 register a format 都在這註冊格式 sensor mode — 70 感光元件模式 — 70 筆 raster · fps · merge 光柵 · 格率 · 合併倍率 0xC0B59DC0 OG3K OG2K HSW swap the mode 都在這換模式 PARAM profile — 306 PARAM profile — 306 列 geometry · RWZM · hbin/vbin 幾何 · RWZM · hbin/vbin sensor timing 感光元件時序 hmax / vmax → real fps hmax / vmax → 真實格率 0xC0B5FDA4 CRCT path selector — picks ONE branch CRCT 路徑選擇器 — 只會選中一條 eight branches, static in ROM — not a chain 八個分支,靜態寫在 ROM — 不是一條鏈 0xC0325228 Crmf — no reduction Crmf — 不縮減 253 Open Gate, stock FHD Open Gate、原廠 FHD Hbin2 ÷N 36 2nd horizontal binning 第二級水平 binning RWZM + hbin÷3 17 UHD only — both at once 只有 UHD — 兩者同時 0x300F0900 geometry record — the canvas 幾何記錄 — 畫布 built here, then derived downstream 在這裡組好,下游再從它推導 FUN_c043a158 OG3K hook the canvas hook 在這 producer → DRAM strip producer → DRAM strip packed 12-bit, one stripe per frame 打包 12-bit,每幀一條 stripe DNG writer DNG 寫檔器 78,848 B header + strip, Compression = 1 78,848 B 表頭 + strip,Compression = 1 FUN_c069ac88 card — one file per frame 卡片 — 一幀一個檔 A001_xxxx.dng ⚠ 3 ⚠ 3 ⚠ 2 ⚠ 1 ⚠ 6 ⚠ 1 ⚠ 6 ⚠ 8 ⚠ 6 ⚠ 8
Stage 3 splits: the format entry hands a sensor mode to the left branch and a profile to the right, and they rejoin at the selector. Almost every open-gate trick is a substitution at stage 4, stage 5 or stage 9.

Read the CRCT row as a fork, not as a sequence. Hbin/Vbin and RWZM are not two stages of one chain — they are alternative branches of the same static selector, and a profile takes exactly one of them. Only the 17 UHD profiles take RWZM and hbin together, and that is the firmware doing it, not a hack. Open Gate and stock FHD both sit in the 253 that reduce nothing here.
第 3 關會分岔:格式條目把感光元件模式交給左邊那條、 把 profile 交給右邊那條,兩條在選擇器那關會合。open gate 的招數幾乎全部 都是在第 4、第 5 或第 9 關做「換掉」這件事。

CRCT 那一排要讀成「岔路」,不是「順序」。 Hbin/Vbin 跟 RWZM 不是同一條鏈上的前後兩關 —— 它們是同一個靜態選擇器底下互斥的分支,一個 profile 只會走中其中一條。
只有那 17 個 UHD profile 會同時吃到 RWZM 與 hbin, 而且那是原廠韌體自己這樣做的,不是 hack 串出來的。 Open Gate 和原廠 FHD 都落在「這一關完全不縮減」的那 253 筆裡。
solved verified on a camera or read from firmware在相機上驗過,或直接從韌體讀出 partial shape known, a detail is not形狀知道,細節還沒定 dark guesswork在猜 ⚠ n pitfalls whose cause is in that stage — click to open根因在這一關的雷數 — 點了會展開

Every stage, opened up十一關,逐關拆開

Menu selection選單選擇 What the user actually picks, and why bit depth matters more than it looks 使用者到底選了什麼,以及位元深度為什麼比看起來重要 ⚠ 3 solved

Four independent choices feed the next stage: resolution name, frame rate, bit depth, and whether crop mode is on. Only the first two are obvious; the other two silently change which table gets searched.

有四個獨立的選擇會往下傳:解析度名稱、格率、位元深度,還有裁切開不開。前兩個很直覺,後兩個會默默決定下一關要查哪一張表 —— 這點很容易忽略,而且踩過坑。

The CINE menu's own resolution list lives at 0xC0B51044, 14 rows, and it only contains 4096×2160, 3840×2160 and 1920×1080. Anything else has to be added there as well as in the picker, which is why adding a resolution is a multi-table job rather than one edit.

CINE 選單自己的解析度清單在 0xC0B51044,14 列,裡面只有 4096×2160、3840×2160、1920×1080 三種。想加新解析度,選單這張表要加、下一關的 picker 表也要加 —— 所以「加一個解析度」從來不是改一個地方就好。

Open: the menu can only display three rows in practice, which is why HSW ships as a separate card rather than alongside OG3K and OG2K. Whether that is a hard layout limit or just the current table has not been settled.
還沒解: 選單實際上只放得下三列,這就是為什麼 HSW 得做成獨立的卡,不能跟 OG3K、OG2K 擺在一起。這是排版的硬限制、還是只是目前這張表的關係,沒有定論。
The pickerpicker(挑格式的那段) A string-keyed lookup, not an index — and its fallback is a trap 用字串查表,不是用索引 — 而且它的退路是個陷阱 ⚠ 3 solved

FUN_c043b828 builds a key by concatenating the resolution name, the frame rate name, and "CROP" if the crop flag is set. Then FUN_c043ccf8 walks a 26-entry table comparing 15 characters:

FUN_c043b828 把解析度名稱、格率名稱接成一個字串,裁切開著的話再接一個 "CROP"。然後 FUN_c043ccf8 拿這串去走一張 26 筆的表,逐筆比前 15 個字元:

key = "" ;  append resolution name   ("UHD" / "FHD")
            append frame rate        ("30" / "25" / "23_98" ...)
            if crop flag: strcat("CROP")

table = (eRawBitType == 4) ? 0xC0BE5810     // 8-bit
      : (eRawBitType == 3) ? 0xC0BE59B0     // 10-bit
      :                      0xC0BE5B50     // 12-bit

entry = lookup(table, key)
if (!entry) { log_error(); entry = 0xC0BE5B50; }   // table 3, row 0 = UHD30

The fallback caused a real bug

那個退路真的害我們出過包

That last line is not harmless. OG3K v0.2.1a registered its format in the 12-bit table only. Selecting 8-bit or 10-bit made the lookup miss, and the fallback silently handed back UHD30 — a working recording of entirely the wrong thing. A format has to be registered in all three tables or the other two have to be blocked.

最後那一行不是無害的。OG3K v0.2.1a 只把自己的格式註冊在 12-bit 那張表。使用者一選 8-bit 或 10-bit,查表就查不到,退路安靜地回傳 UHD30 —— 於是相機乖乖錄了一段完全不是你要的東西,而且看起來一切正常。
教訓:一個格式要嘛三張表都註冊,要嘛把另外兩個選項擋掉。

The three tables are the same formats at different bit depths, and their profile numbers differ systematically by 20:

三張表是同樣的格式、不同位元深度,而它們的 profile 編號系統性差 20:

keymode8-bit10-bit12-bit
UHD307131151171
FHD30106135155175
FHD6027133153173
The format entry格式條目 Sixteen bytes that decide everything downstream 十六個 byte,決定了後面所有的事 ⚠ 2 solved
+0x00   5             constant tag (5 = movie; the stills tables use 1)
+0x04   profile       index into the 306-row PARAM table
+0x08   sensor mode   index into the 70-entry mode table
+0x0C   key ptr       pointer to the lookup string

Because the name is a pointer, a new resolution name can live anywhere and be any length — "OG3K" needed no space negotiation. The resolution-name tables are separate, at 0xC0BE4508 / 4548 / 4588 for the three bit depths, four entries each of {6, id, 222, name_ptr}.

因為名字存的是指標而不是字串本體,新的解析度名字可以放在任何地方、要多長都行 —— 加 "OG3K" 的時候完全不用跟誰搶空間,這點幫了大忙。
解析度名字是另外三張表,0xC0BE4508 / 4548 / 4588 對應三種位元深度,每張四筆,格式是 {6, id, 222, name_ptr}。

For 12-bit CinemaDNG the resolution enums are UHD = 71, FHD = 73, UHDCROP = 391, FHDCROP = 393.

12-bit CinemaDNG 那張的解析度編號是 UHD = 71、FHD = 73、UHDCROP = 391、FHDCROP = 393。

Sensor mode table感光元件模式表 70 entries — and the frame rate in it is nominal 70 筆 — 而且裡面那個格率是標稱值,不是真的 ⚠ 1 solved

0xC0B59DC0, 70 records of 0x64 bytes. This is the table the compression simulator drives from.

0xC0B59DC0,70 筆,每筆 0x64 bytes。壓縮模擬器的格式清單就是直接吃這張表。

+0x00  mode id        +0x04/+0x08  raster        +0x2C/+0x30  output crop
+0x34/+0x38  crop origin              +0x3C  bit-depth flag
+0x40  nominal frame rate       +0x44..+0x50  four merge factors
+0x54  aspect marker  +0x58  full/crop  +0x5C  vblank  +0x60  analogue fingerprint

13 distinct rasters, 17 distinct frame rates. The merge tuple is (1,1,1,1) for a full readout, (2,2,2,2) for half, (3,2,3,3) and (3,3,3,6) for the thirds.

13 種不同光柵、17 種不同格率。合併倍率那組四個數字:全讀是 (1,1,1,1)、對半是 (2,2,2,2)、三分之一是 (3,2,3,3) 跟 (3,3,3,6)。

The frame rate field lies, on purpose and by accident

那個格率欄位會騙人,而且有兩種騙法

+0x40 is the frame rate, confirmed against measurements: mode 3 says 30 and runs 29.97, mode 98 says 78 and runs 77.27, mode 121 says 25 and runs 24.9997. It is a nominal value.

+0x40 確實是格率,拿實測值對過:mode 3 寫 30、實跑 29.97;mode 98 寫 78、實跑 77.27;mode 121 寫 25、實跑 24.9997。所以它是標稱值 —— 這是第一種騙法,精度而已。

It also becomes an outright lie when a project retimes a donor mode. OG3K drives mode 98 at 29.97 while its metadata still says 78. Anything that reads +0x40 to label a clip is reading a stale number.

第二種比較兇:專案把某個模式的時序改掉之後,這個欄位就變成純粹的謊話。OG3K 讓 mode 98 跑 29.97,但它的 metadata 還寫著 78。任何拿 +0x40 去標記素材的東西,讀到的都是過期的數字。

Open: +0x44 and +0x48. +0x4C/+0x50 are confirmed as effective X/Y geometry scale, but that only proves a coordinate ratio — it does not distinguish charge binning from skipping, and the OG2K plan is careful not to claim otherwise.
還沒解: +0x44 跟 +0x48 是什麼。+0x4C/+0x50 已確認是有效的 X/Y 幾何倍率,但那只證明座標比例 —— 不能分辨是電荷合併還是跳讀,而這個差別對畫質很重要。
PARAM profile tablePARAM profile 表 306 rows, column-major, and the columns are not in field order 306 列,column-major,而且欄的順序不照欄位順序 ⚠ 6 partial

Each profile is a row; each field is a separate array of 306 words. An element is column_base + row×4. The fields that matter for geometry:

一個 profile 是一列;但每個欄位各自是一個 306 個字的陣列,要取值是 欄位基底 + 列號×4。跟幾何有關的欄位:

+0x58  preview hbin   0xC0BD8EBC      +0x5C  record hbin   0xC0BE1E2C
+0xC4  preview vbin   0xC0BD9384      +0xC8  record vbin   0xC0BE22F4
+0x60  preview zoomH  0xC0BD984C      +0x64  record zoomH  0xC0BE149C
+0xD0  preview zoomV  0xC0BD9D14      +0xD4  record zoomV  0xC0BE1964
This layout cost a wrong conclusion. The column bases are not ordered by field offset — the column after +0x60 is +0xD0, not +0x64. Reading neighbouring columns as neighbouring fields turns "preview versus record" into "horizontal versus vertical", and produced a confident claim that a third of stock profiles were anamorphic. They are not; all 306 are square.
這個排列害我下過一個錯結論。 欄位的基底位址不是照欄位偏移排的 —— +0x60 的下一欄是 +0xD0,不是 +0x64。把相鄰的欄當成相鄰的欄位,就會把「預覽 vs 錄影」讀成「水平 vs 垂直」,於是我很有自信地宣稱「原廠有三分之一的 profile 是非等比的」。完全不是 —— 306 筆全部等比。

Profile 43 and 83 are the hidden 3K

Profile 43 跟 83 就是藏起來的 3K

The firmware already had a 3032×2012 path — on the stills side. Profiles 43 and 83 are the S-size 12-bit photo profiles, and they carry exactly the geometry OG3K wanted:

韌體本來就有 3032×2012 這條路 —— 只是在拍照那邊。profile 43 跟 83 是 S 尺寸 12-bit 照片的 profile,而它們帶的幾何正好就是 OG3K 想要的:

RAW geometry   3032x2012        crop  3008x2000 @ (12, 6)
sensor window  3032x2012        sensor mode  98 (p43) / 143 (p83)
+0x1C          2  = 3:2 marker  +0x30 frame rate  -1.0 (stills have none)
RAW RWZM       0x3FF = unity

That is why swapping to p43 made recording clean immediately: it was not improvised, it was the camera's own full-height 3:2 capture path, previously only used for photographs. The movie side has no 3K anywhere — not in the picker's 78 entries, not in the playback name tables, not in the CINE menu.

這解釋了為什麼一換上 p43,錄影立刻就乾淨了 —— 那不是我們硬湊出來的東西,而是相機自己的全高 3:2 擷取路徑,只是原本只服務照片。
錄影那邊則是完全沒有 3K:picker 的 78 筆沒有、回放名稱表沒有、CINE 選單也沒有。

OG3K ships on p83, not p43. They differ only in +0x030, which turned out to be the nominal frame rate (float): p43 holds −1.0 (0xBF800000), p175 holds 30.0 (0x41F00000). The RAW buffer count is derived from it, and −1.0 means zero buffers — that was the garbled last frame. p43 is the stills view profile; p83 is the capture profile and already allocates three.

OG3K 最後用的是 p83,不是 p43。 兩者只差 +0x030, 後來查明那是標稱格率(float):p43 是 −1.0(0xBF800000)、p175 是 30.0(0x41F00000)。 RAW 緩衝張數由它導出,−1.0 = 零張 —— 那就是「最後一幀花屏」的來源。p43 是照片檢視用, p83 是拍攝用,原廠就配三張。

Open: the 306-row table has around 65 columns and most are still not understood.
還沒解: 這張 306 列的表大概有 65 個欄位,大部分仍然沒搞懂。
Sensor timing感光元件時序 hmax and vmax set the real frame rate; the metadata does not 真正決定格率的是 hmax 跟 vmax,不是 metadata ⚠ 1 solved

The register container at 0xC0B5FDA4 holds 70 records of 0x288 bytes. The frame period is hmax × (vmax−1) + tail cycles at 72 MHz, and the rolling shutter is hmax × height / 72 MHz.

暫存器容器在 0xC0B5FDA4,70 筆,每筆 0x288 bytes。一幀的週期是 hmax × (vmax−1) + tail 個 72 MHz 時脈,捲簾時間是 hmax × 高度 / 72 MHz。

Mode 12 is the clean example, because it needs no retiming at all:

mode 12 是最漂亮的例子,因為它完全不用改時序:

raster         2016 x 672      hmax/tail  330 / 330     vmax  910
frame cycles   330 x 909 + 330 = 300,300 @ 72 MHz
actual rate    239.760240 fps  exactly, 0 ppm
rolling        330 x 672 / 72 MHz = 3.080 ms
光柵      2016 x 672      hmax/tail  330 / 330     vmax  910
每幀時脈  330 x 909 + 330 = 300,300 @ 72 MHz
實際格率  239.760240 fps  剛好,誤差 0 ppm
捲簾      330 x 672 / 72 MHz = 3.080 ms

Every other open-gate target has to rewrite a donor mode's timing to get the rate it wants, which is what makes the metadata frame rate go stale. HSW is the only one where the sensor is left completely untouched.

其他每一個 open gate 目標,都得把借來的模式的時序改掉才能拿到想要的格率 —— 那正是上一關講的「metadata 格率變成謊話」的來源。HSW 是唯一一個感光元件一個位元都不用動的。

Pitfalls rooted here (1)這一關踩過的雷(1)

CRCT chainCRCT 校正鏈 A fork, not a sequence — and only two of six taps are live 是岔路不是順序 — 六個抽頭只有兩個真的活著 ⚠ 0 solved

Covered in full in the reduction path. The short version: an eight-branch selector at 0xC0325228 decides which window is enabled and which of six chain positions it taps. Only Crmf and Hbin2 are ever actually enabled; Gain, Vbin and Spc are never written at all, and Hbin only ever lands on a window that branch leaves switched off.

完整的在縮減路徑那頁。這裡講重點:0xC0325228 有個八分支的選擇器,決定哪個窗開著、以及從鏈上六個位置的哪一個抽料。
實際上只有 Crmf 跟 Hbin2 被真的開啟過。Gain、Vbin、Spc 從來沒被寫過;Hbin 有被寫,但每次都寫在一個「那條分支剛好沒開」的窗上。

Distribution over all 306 profiles: 172 + 81 take the Crmf branches, 36 take Hbin2, 17 take RWZM, and the two-pipeline branch is never reached by anything.

306 個 profile 的分布:172 + 81 走 Crmf、36 走 Hbin2、17 走 RWZM,雙管線那條一筆都沒有。

The part that is easy to misread. The recording hbin/vbin fields (+0x5C/+0xC8) are zero in all 306 profiles, which is where "CinemaDNG never uses hbin" comes from — and taken on its own it is true. But branch E's main pipeline does not read those fields: it reads the recording RWZM ratio together with the preview hbin/vbin tap counts (+0x58/+0xC4), and those are set to 1 on exactly the 17 UHD profiles. So on those 17, hbin÷3 and RWZM÷1.5625 really do run together on the recording path, using a field that otherwise serves the LCD. Everywhere else the two are mutually exclusive branches.

最容易讀錯的地方。錄影那組 hbin/vbin 欄位 (+0x5C/+0xC8)在 306 筆裡全部是 0 —— 「CinemaDNG 不用 hbin」這個說法就是從這裡來的,單看這組欄位它是對的。
但是分支 E 的主管線根本不讀那組欄位:它讀的是錄影的 RWZM 比率, 搭配預覽那組 hbin/vbin 抽頭數(+0x58/+0xC4)—— 而那一組正好在那 17 個 UHD profile 上被設成 1。
所以那 17 筆,錄影路徑上 hbin÷3 跟 RWZM÷1.5625 真的是疊在一起跑的, 用的還是一個平常服務 LCD 的欄位。除此之外,兩者確實是互斥的分支。

Open: what Crmf and Spc actually correct. Also the five-tap horizontal coefficients — both ROM records only carry three-tap kernels.
還沒解: Crmf 跟 Spc 到底在修正什麼。還有 ÷5 要用的五抽頭係數 —— 兩筆 ROM record 裡都只有三抽頭。
RWZM resamplerRWZM 重取樣器 The last place the frame can change size 畫面尺寸最後能被改動的地方 ⚠ 6 solved

A divisor scaled by 1024, clamped so anything at or below 1024 means 1.0×. Horizontal and vertical are independent registers with independent clamps, so anamorphic is possible in code — but no stock profile does it.

它存的是「除數 × 1024」,而且有地板:任何 ≤ 1024 的值都當成 1.0×。水平跟垂直是兩個獨立的暫存器、各自獨立夾制,所以程式上做非等比是可以的 —— 但原廠沒有任何一個 profile 這樣用。

This is the stage that made open gate work. Profile 122's RWZM was 0x640 = 1600 = 1.5625×, which pinned the producer's active area at 1936 wide. Setting all four fields to unity is what let the frame fill 3032×2012.

open gate 能成,關鍵就在這一關。profile 122 的 RWZM 原本是 0x640 = 1600 = 1.5625×,這個值把 producer 的有效區釘死在 1936 寬。四個欄位全部改成 unity,畫面才填滿 3032×2012。

Trap, learned expensively: the four fields cannot be split. Setting only the RAW pair to unity and leaving the preview pair at 1600 produced a corrupted recording followed by a freeze. And eight frame rates use eight different profiles — an early build patched only the 29.97 one, so the other seven were broken and nobody noticed because every test used 29.97.
用很貴的代價學到的坑: 那四個欄位不能拆。只把 RAW 那一對改成 unity、預覽那一對留 1600 → 錄影花屏,然後相機凍結。
還有:八個格率用八個不同的 profile。早期版本只補了 29.97 那一個,另外七個全是壞的 —— 而沒人發現,因為每次測試都用 29.97。
The geometry record — the canvas幾何記錄 — 畫布 Six rounds of patching the wrong copy 連續六輪都在改錯的那一份複本 ⚠ 8 partial

The canvas is assembled in FUN_c043a158 and then derived into several downstream copies. The hook that works overwrites the record after it is built and before anything is derived from it, at 0xC043A19C.

畫布是在 FUN_c043a158 裡組出來的,組好之後會推導出好幾份下游複本。真正有效的 hook,是在「組好了、但還沒有人從它推導」的那個瞬間覆寫它,位置在 0xC043A19C。

result of the working hook:
  0xC37CE210   3032 x 2012 x 9,229,824      (six earlier attempts: 1936 1090 3244544)
  on card      9,229,824 bytes x 81 frames
  overwrite    hit 491 times
成功那次的結果:
  0xC37CE210  3032 x 2012 x 9,229,824   (前六次都是 1936 1090 3244544)
  卡上        9,229,824 bytes × 81 幀
  覆寫命中    491 次
0xC37CE210 is a cache, not the source — and an earlier note says otherwise. It was originally documented as "this is the recording geometry, not a guess", because its three words match the file size exactly. Later testing showed recording proceeds normally with it holding {0,0,0} and the DNG still comes out 1936×1090. It is written from the canvas, not read by the writer. What actually consumes the geometry at write time has not been pinned down.
0xC37CE210 是快取,不是來源 —— 而舊筆記寫的是相反的。 它原本被記成「這就是錄影幾何,不是猜的」,因為那三個字剛好等於檔案大小。但後來測出來:把它清成 {0,0,0} 照樣能錄,DNG 還是乖乖出 1936×1090。
所以它是被畫布寫進去的,不是寫檔器去讀的。真正在寫檔當下消費幾何的是誰,還沒追出來。

Six rounds of failure came from patching things that were computed downstream of this record. That is the general lesson: in this chain, find where a value is constructed, not where it is visible.

前面六輪失敗,全部都是在改「從這份記錄推導出來的下游東西」。這條鏈的通則就是這句話:要找值被「組出來」的地方,不是找它「看得見」的地方。

Producer → DRAM stripProducer → DRAM strip Two size fields with different jobs, and they must agree 兩對尺寸欄位,職責不同,而且必須一致 ⚠ 6 partial

The producer writes a packed 12-bit CinemaDNG strip, one stripe per frame. Two pairs of fields in the descriptor turned out to mean different things:

producer 寫出的是打包 12-bit 的 CinemaDNG strip,每幀一條。描述子裡有兩對尺寸欄位,後來才發現它們意思不一樣:

fieldrolestock
+0x0C/+0x10what the producer actually emits1936×1090
+0xD8/+0xE0what the consumer readsoverwritten to 3032×2012

Measured from a camera screenshot during recording: the image band occupied 0.5630 of the non-HUD area, matching 1090/2012 = 0.5417 and nothing else. The producer was writing 1090 rows while the consumer displayed 2012.

這是用相機自己的截圖量出來的:錄影時畫面上的影像帶佔了非 HUD 區域的 0.5630,對得上 1090/2012 = 0.5417,其他候選值都對不上。也就是 producer 只寫了 1090 行,而消費端在顯示 2012 行。

Trap: zeroing +0xD8/+0xE0 makes the producer fall back to reading +0x0C/+0x10. That destroyed dozens of takes before it was understood.
坑: 把 +0xD8/+0xE0 清成 0,producer 會改去讀 +0x0C/+0x10。搞懂這件事之前,這個行為毀掉了數十段素材。
DNG writerDNG 寫檔器 78,848 bytes of header, and a compression flag nothing sets 78,848 bytes 的表頭,和一個沒人去設的壓縮旗標 ⚠ 8 partial

Each frame is a complete DNG: a fixed 78,848-byte header followed by the strip. At FHD that header is 2.4% of the file; it would be 6.3% if the payload were compressed.

每一幀都是一個完整的 DNG:固定 78,848 bytes 的表頭,後面接 strip。在 FHD 這個表頭佔檔案的 2.4%;如果內容壓縮了,它會變成佔 6.3%。

ImageWidth      3032      ImageLength      2012
BitsPerSample   12        Compression      1        // uncompressed, always
RowsPerStrip    2012      StripOffsets     78848
StripByteCounts 9,150,584           // 3032x2012x12/8 = 9,150,576, plus 8

(That block is the early 3032×2012 build. Shipping OG3K records 3024×2010, because 3032 is not 16-aligned and in-camera playback broke on it — see playback.)

(上面那組是早期 3032×2012 的版本。正式的 OG3K 錄 3024×2010, 因為 3032 不是 16 的倍數,機內回放會壞 —— 見回放。)

The main image is in IFD0 with the dimensions inline and no SubIFD, which is why reading a frame's size on-camera only needs the first kilobyte.

主影像在 IFD0、尺寸直接內嵌、沒有 SubIFD —— 所以想在相機上讀一幀的尺寸,只要讀前 1 KB 就夠了。

Open: whether the writer tolerates variable frame lengths. The playback side derives a shared capacity from the first frame and asserts if a later frame exceeds it, so compressed video would need a conservative upper bound reserved before recording — the first frame's size is not a safe bound. This is the blocker in front of in-camera compression.
還沒解: 寫檔器吃不吃變動長度的幀。回放那邊會從第一幀導出一個共用容量,後面任何一幀超過就 assert。所以要做壓縮影片,得在錄影前就保守地保留一個上界 —— 拿第一幀的大小當上界是不安全的。這就是擋在機內壓縮前面的那道牆。

What each project changes三個專案各自改了什麼

All three are substitutions into the same chain. What separates them is how many stages they have to touch.

三個專案做的都是同一件事:在這條鏈上「換掉某個東西」。差別只在於要動幾關。

OG3KOG2KHSW
sensor raster感測器光柵3032×2012 (÷2)2016×1344 (÷3)2016×672 (3×6)
recorded DNG錄出的 DNG3024×2010 → 3008×20002016×1344 → 2000×13342016×672 → 2000×662
sensor mode感測器模式98 / 143139 / 812
frame rate格率29.97 retimed29.97,改過時序29.97 retimed29.97,改過時序239.76 native239.76 原生
rolling shutter捲簾12.44 ms8.31 ms3.08 ms
rate at 29.9729.97 的資料率273 MB/s122 MB/s—
donor profile借用的 profilep83 (stills capture; p43 abandoned)p83(拍照用;p43 已棄用)p13p13 + 7 high-rate fieldsp13 + 7 個高速欄位
retimes the sensor要改感測器時序yes要yes要no不用
touches RWZM要動 RWZMyes — to unity要 — 改成 unityno不用no (tried: no effect)不用(試過,沒作用)
canvas hook畫布 hookyes要yes要yes要
status狀態v0.2.4av0.1.1aon camera, unreleased: 180 fps clean on SSD, 240 freezes上過機、未發布:SSD 180 fps 乾淨,240 凍結

HSW needs the fewest sensor changes and turned out the hardest to write. Mode 12 ships at exactly 239.760240 fps and no picker table references it, so the sensor is untouched and the metadata rate stays honest. The work was all downstream: the window declared by donor p13 (the take could not stop), seven high-rate profile fields (freezes above 60 fps), a buffer-class write that serialised the card, and two still-open problems — 240 fps onto SSD freezes, and 8-bit frames on SSD are shifted by the writer. See dropped frames.

HSW 感光元件動得最少,寫檔卻最難。 mode 12 出廠就是 239.760240 fps、沒有 picker 表引用它,所以感光元件不用動、metadata 格率也誠實。 難的全在下游:donor p13 宣告的視窗(錄影停不下來)、七個高速 profile 欄位(超過 60 fps 凍結)、 一個把寫卡串列化的緩衝類別寫入,以及兩個還沒解的 —— 240 fps 寫 SSD 凍結、 8-bit 在 SSD 上被寫入端整塊推位。見掉格。

Every pitfall, by symptom所有踩過的坑,照症狀分

What OG3K, OG2K and HSW ran into between the sensor and the file: 44 of them, each with the mechanism and what fixed it. The numbered tag on each one is the stage where its cause lives; the same pitfalls are listed inside each stage above and counted on the chain diagram. fixed / rule means verified on a camera; workaround means it is contained but the cause is still there; open means unsolved.

OG3K、OG2K、HSW 在感光元件到檔案之間踩過的坑,共 44 個,每個都寫出機制與解法。每個坑上的編號標籤 = 它的根因所在的那一關;同樣的坑也列在上面每一關裡,並在流程圖上標出數量。fixed / rule = 已在相機上驗證;workaround = 擋住了但根因還在;open = 未解。

Garbled picture in the recording錄影中花屏

Header says 3032×2012, but only the top-left ~1936×1090 holds picture檔頭寫 3032×2012,但只有左上約 1936×1090 有畫面,其餘是雜訊fixed

Why
原因
The recording profile's RWZM was 0x640 (1.5625×). That caps the producer at sl+0x64/+0x68 = 1936×1090 no matter what the canvas says.
錄影 profile 的 RWZM 是 0x640(1.5625×),它把 producer 的上限 sl+0x64/+0x68 釘在 1936×1090,畫布寫多大都沒用。
Fix
解法
All four RWZM fields (+0x60/+0x64/+0xD0/+0xD4) to unity 0x400. A001_016: adjacent-row correlation 0.88–0.93 on all four edges.
RWZM 四個欄位(+0x60/+0x64/+0xD0/+0xD4)全改 unity 0x400。A001_016 四邊相鄰列相關 0.88–0.93。

8RWZMRWZM OG3K · CANVAS_MOVED_AT_C043A19C §8–11

Only the RAW pair set to unity: garbled, then a freeze只把 RAW 那一對改 unity:花屏,接著凍結rule

Why
原因
Preview pair left at 1600 while the RAW pair was unity. The two pairs feed the same producer and must agree.
預覽那對留 1600、RAW 那對改 unity。兩對餵的是同一個 producer,必須一致。
Fix
解法
Change all four together. This holds for OG3K; on HSW, changing all four to 2048 did nothing at all, because the canvas write downstream pins the geometry.
四個一起改。這條只在 OG3K 成立 —— HSW 四欄全改 2048 完全沒作用,因為下游畫布的寫入把幾何釘死了。

8RWZMRWZM OG3K / HSW · OG3K_RWZM_AND_BUILD_PIPELINE §6c, HSW §67B

Every frame rate except 29.97 recorded garbage除了 29.97,其他格率錄出來全是壞的fixed

Why
原因
RWZM was patched only on p175. Each of the eight frame rates has its own profile (173/174/176/178/180/430/431 too). Every test used 29.97, so nobody saw it.
RWZM 只補了 p175。八個格率各有自己的 profile(還有 173/174/176/178/180/430/431),而每次測試都用 29.97,所以沒人發現。
Fix
解法
Patch all eight. They are shared with stock FHD, so the 32 addresses are switched by the OG flag, never written permanently.
八個都補。它們跟原廠 FHD 共用,所以這 32 個位址要跟著 OG 旗標切換,不能寫死。

8RWZMRWZM OG3K · OG3K_RWZM_AND_BUILD_PIPELINE §1

After a cold boot every take was garbled, while menu, live view and DNG header all looked right冷開機後每段都花屏,但選單、live view、DNG 檔頭看起來都正常fixed

Why
原因
The AutoRun on the card set RWZM; the USB loader did not. After a cold boot RWZM fell back to 1600.
卡上的 AutoRun 有設 RWZM,USB 載入器沒有。冷開機後 RWZM 回到 1600。
Fix
解法
One self-contained write plan (og3k_plan) used by every loader.
所有載入器共用同一份自給自足的寫入計畫 og3k_plan。

8RWZMRWZM OG3K · OG3K_RWZM_AND_BUILD_PIPELINE §3

Zeroing canvas +0xD8/+0xE0 destroyed dozens of takes把畫布 +0xD8/+0xE0 清成 0,毀掉數十段素材fixed

Why
原因
An external handoff called it a “preview override”. It is the producer/consumer pair. Once it was zeroed, the producer fell back to +0x0C/+0x10, which held the preview raster 2024×1341. From A001_015 only the left 1936 columns had picture; from A001_047 the strip shrank to 3032×1341 (6,179,328 B instead of 9,229,824).
外部交接包說它是「預覽覆寫」,實際上是 producer/消費端那一對。清成 0 之後 producer 改讀 +0x0C/+0x10,而那裡放的是預覽柵格 2024×1341。A001_015 起只有左邊 1936 欄有畫面;A001_047 起 strip 縮成 3032×1341(每幀 6,179,328 B,應為 9,229,824)。
Fix
解法
The canvas carries only recording geometry, and check() locks the ten canvas writes. The footage could not be recovered.
畫布只放錄影幾何,check() 鎖死那十個 PUT。那批素材救不回來。

10Producer → stripProducer → strip OG3K · RECORDING_REGRESSION_2026-09-12

1× readout + RWZM unity + 3032-wide canvas: instant freeze, USB gone1× 讀出 + RWZM unity + 3032 寬畫布:立刻凍結、USB 消失rule

Why
原因
A 6064-wide unbinned row overflows a buffer sized for 3032.
6064 寬、沒合併的一列,塞進照 3032 配置的緩衝,每行都溢位。
Fix
解法
Unity RWZM only on a mode that is already binned ≥2× at the sensor. FP3K used 2048 and never hit this.
RWZM unity 只能配感光元件端已經 ≥2× 合併的模式。FP3K 用 2048,所以沒踩到。

8RWZMRWZM SENSOR_READOUT_NOISE §6

Period-16 horizontal banding週期 16 的橫紋rule

Why
原因
The resampler has 16 phases, floor(16×frac(n×R)). The stock 25/16 ratio uses all 16 phases, and that repeats every 16 rows.
重取樣器有 16 個相位,floor(16×frac(n×R))。原廠 25/16 會用滿 16 個相位,每 16 行重複一次。
Fix
解法
Pick ratios whose denominator is ≤5, or unity.
選分母 ≤5 的比例,或直接 unity。

8RWZMRWZM REDUCTION_KERNEL_MEASURED §0

Wrong size in the recording錄影中尺寸錯誤

Settings block held 3032×2012 for a whole take; the DNG stayed 1936×1090設定區塊整段錄影都是 3032×2012,DNG 還是 1936×1090fixed

Why
原因
The settings block (*(0xC3075230), mirror 0xC3758B98, CameraMgr +0x40) is an output. The field that “gets reverted” only marks the next table not yet patched. “+16/+10” happens to hold for the two stock sizes; it is not causal.
設定區塊(*(0xC3075230)、鏡像 0xC3758B98、CameraMgr +0x40)是輸出。「被刷回的欄位」只是標出下一張還沒補的表。「+16/+10」只是兩種原廠尺寸剛好成立,沒有因果關係。
Fix
解法
Hook the canvas at 0xC043A19C, after FUN_c043a158 builds the record and before anything is derived from it.
在 0xC043A19C hook 畫布:FUN_c043a158 組好、還沒有人從它推導的那一刻。

9Canvas畫布 OG3K · CANVAS_IS_NOT_THE_SETTINGS_BLOCK

Picker switched to a 3:2 mode; the framing did not changepicker 換成 3:2 模式,構圖卻完全沒變fixed

Why
原因
The ISP crops to the canvas aspect. FUN_c0437078 only ever answers with 16:9 modes.
ISP 會照畫布的長寬比裁切,FUN_c0437078 也只會回 16:9 的模式。
Fix
解法
The mode alone is not enough. The canvas has to change too.
只換模式不夠,畫布也要改。

4Sensor mode table感光元件模式表 OPEN_GATE_EXPLORATION_ARCHIVE

Header size and byte length disagree, or the header keeps the old size檔頭尺寸和位元組長度對不上,或檔頭沿用舊尺寸fixed

Why
原因
The canvas has four layers: base +0x00/04 (sizes the RAW buffer), active +0x24/2C (DefaultCrop), override +0xDC/E4 (header), input +0xF4/F8. Patching override alone breaks the byte count; patching base alone keeps the old header. Offsets derived from the decompiler's assignment order were all off by 4.
畫布有四層:base +0x00/04(配置 RAW 緩衝用)、active +0x24/2C(DefaultCrop)、override +0xDC/E4(檔頭)、input +0xF4/F8。只改 override,位元組數會錯;只改 base,檔頭沿用舊尺寸。照反編譯賦值順序推出來的偏移全部差 4。
Fix
解法
Write all four, at offsets measured on the camera.
四層都寫,偏移用實機量。

9Canvas畫布 CANVAS_MOVED_AT_C043A19C §2

8-bit or 10-bit recorded UHD30, while the HUD said OG3K選 8/10-bit 錄出 UHD30,HUD 卻顯示 OG3Kfixed

Why
原因
The format was registered only in the 12-bit table, so the lookup missed and fell back to row 0 of table 3 = UHD30/p171. The probe caught it: 12,630,528 B per frame.
格式只註冊在 12-bit 表,查不到就退回表 3 第 0 筆 = UHD30/p171。探針量到每幀 12,630,528 B。
Fix
解法
v0.2.2a registers all three tables. BitsPerSample is written from eRawBitType but the data from profile +0x084, so +0x080/+0x084 are set per depth: 8-bit 10/10, 10-bit 10/9, 12-bit 7/7. A mismatch gives a broken file. Afterwards all 21 cells (7 rates × 3 depths) were correct.
v0.2.2a 三張表都註冊。BitsPerSample 依 eRawBitType 寫,資料卻由 profile +0x084 決定,所以 +0x080/+0x084 依深度寫:8-bit 10/10、10-bit 10/9、12-bit 7/7。不一致檔案就壞。之後 21 格(7 格率 × 3 深度)全對。

2PickerPicker OG3K v0.2.1a · OG3K_8BIT_10BIT_FALLS_BACK_TO_UHD

Flag and picker disagree: HUD says OG3K but the take is UHD30, or it silently records FHD旗標跟 picker 不一致:HUD 寫 OG3K 但錄成 UHD30,或安靜地錄成 FHDfixed

Why
原因
Two sources of truth: the OG flag and the picker hit. The resolution setter is not called at boot, so on the first boot the flag is 0 and the take comes out FHD (3,244,544 B, req/fin 48/48). The fear that “flag 0 with a picker hit freezes” was wrong.
兩個真相來源:OG 旗標與 picker 命中。開機時不會呼叫解析度 setter,所以冷開機第一次旗標是 0,錄成 FHD(3,244,544 B,req/fin 48/48)。「旗標 0 而 picker 命中會凍結」的擔心是錯的。
Fix
解法
Persist the choice in OGSAVE 0xC30754CC (CommonSaveData), and have og3krestore call the real setter at the end of AutoRun. A take recorded straight after boot comes out as OG.
選擇存進 OGSAVE 0xC30754CC(CommonSaveData),AutoRun 末端由 og3krestore 呼叫真正的 setter。開機不碰任何東西直接錄,就是 OG。

1Menu selection選單選擇 FLAG_AND_PICKER_DISAGREE §7–14, §39

OG3K with Super35/crop on: pressing record makes no clipOG3K 開著 Super35/裁切:按錄影不產生片段open

Why
原因
The key becomes OG3K25CROP, which no table has. The private format table is 384 of 480 B full.
鍵變成 OG3K25CROP,哪張表都沒有。私有格式表 480 B 已用 384。
Fix
解法
Not fixed. The README says to turn crop off.
沒修,README 要求關掉裁切。

2PickerPicker FLICKER_25P_INVESTIGATION §8

HSW: recording would not stop, SD light stayed on, reboot neededHSW:錄影停不下來,SD 燈長亮,要重開機fixed

Why
原因
Donor p13's sensor window +0xF4/+0xF8 says 2016×1344, but mode 12 reads only 672 rows, so fin_cnt < req_cnt.
donor p13 的感光元件視窗 +0xF4/+0xF8 宣告 2016×1344,mode 12 只讀 672 行,於是 fin_cnt < req_cnt。
Fix
解法
TARGET_WRITE_WINDOW writes the real window. A001_007 decodes as 2016×672, SBC 2,032,128, crop 2000×662 @ (8,5).
TARGET_WRITE_WINDOW 寫入真正的視窗。A001_007 解出 2016×672、SBC 2,032,128、裁切 2000×662 @ (8,5)。

9Canvas畫布 HSW · HSW_240FPS_MODE12 §20–25

Live view is the wrong sizeLive view 尺寸錯誤

While recording, the screen split into three bands: red-grey noise, a stretched picture, magenta-cyan smear錄影中畫面分三帶:紅灰雜訊 / 被拉開的影像 / 洋紅青塗抹fixed

Why
原因
The producer wrote 1090 rows and the consumer displayed 2012. A screenshot measured the image band at 0.5630; 1090/2012 = 0.5417.
producer 只寫 1090 行,消費端卻顯示 2012 行。截圖量到影像帶佔 0.5630,1090/2012 = 0.5417。
Fix
解法
+0x0C/+0x10 = 3032/2012 left a 1.560× magnification. Visible +0x20/+0x28 = 3000/2000 brought it to 1.000× (correlation 0.9787).
+0x0C/+0x10 改 3032/2012 之後還有 1.560× 放大;可見區 +0x20/+0x28 改 3000/2000 → 1.000×(相關 0.9787)。

10Producer → stripProducer → strip OG3K · OG3K_RWZM_AND_BUILD_PIPELINE §6b–6d

A hand-computed preview raster gives three different failures自己算預覽柵格,會出三種不同的壞法rule

Why
原因
Raster 3032×2012: fully garbled. Ratio 2048 → 1516×1006: clean, but zoomed and pushed to the lower right. 2016×1344: stride off by 5 px, so ghosting and psychedelic colour. The rounding differs per mode (FHD 1940×1093→1936×1090, UHD 3890×2183→3888×2184).
柵格 3032×2012 → 整個花屏;比例 2048 → 1516×1006,乾淨但放大、往右下擠;手算 2016×1344 → 行距差 5 px,重影、顏色迷幻。進位規則每個模式不一樣(FHD 1940×1093→1936×1090、UHD 3890×2183→3888×2184)。
Fix
解法
Copy the firmware's own value for the same window. A 3032×2012 window gives raster 2024×1341, visible 2000×1334, ratio 1536. Declared raster ≠ producer output misaligns the stride; declared ≠ standby raster latches a scale.
抄韌體對同一個視窗宣告的值:視窗 3032×2012 → 柵格 2024×1341、可見 2000×1334、比例 1536。宣告柵格 ≠ producer 產出 → 行距錯位;宣告 ≠ 待機柵格 → 縮放被 latch 住。

10Producer → stripProducer → strip LIVE_VIEW_DISPLAY_CHAIN §5

16:9 is hard-coded twice in the preview path預覽路徑有兩處把 16:9 寫死fixed

Why
原因
Aspect enum 0xC0306EA0 (also 0xC0306EEC), and the output descriptor 0xC0437E98 at 1620×911.
長寬比 enum 0xC0306EA0(另一處 0xC0306EEC),以及輸出描述子 0xC0437E98 的 1620×911。
Fix
解法
1620×911 → 1620×1080 (idx2 320×180 → 320×213), written to a private copy of the descriptor rather than the shared live buffer.
1620×911 → 1620×1080(idx2 320×180 → 320×213),寫在描述子的私有副本,不動共用的活緩衝。

10Producer → stripProducer → strip LIVE_VIEW_DISPLAY_CHAIN §2

OG2K: live view zoomed 1.05× while recordingOG2K:錄影中 live view 放大 1.05×fixed

Why
原因
p13's preview RWZM is 1023, so the producer emits 2016 wide, but raster +0x0C said 1920: 96 columns cropped, 2016/1920 = 1.050. The file itself was always right.
p13 的預覽 RWZM 是 1023,producer 出 2016 寬,但柵格 +0x0C 是 1920 → 裁掉 96 欄,2016/1920 = 1.050。檔案本身一直是對的。
Fix
解法
+0x0C/+0x10 = 2016×1344, +0x20/+0x28 = 2000×1334, +0xD8/+0xE0 = 2016×1344. Measured 1.001× (v0.1.1).
+0x0C/+0x10 = 2016×1344、+0x20/+0x28 = 2000×1334、+0xD8/+0xE0 = 2016×1344。實測 1.001×(v0.1.1)。

10Producer → stripProducer → strip OG2K · OG2K_PLAN §AG–AI

A thin gap on the right edge while recording錄影時右邊一條細空隙open

Why
原因
At the moment record is pressed the picture zooms from the centre and then locks smaller: the layout is latched.
按下錄影的瞬間畫面「從中心放大」再「鎖小」,版面被 latch 住。
Fix
解法
Unsolved. When measuring a latched system, capture the last overwrite. Capturing the first one catches a briefly correct state.
未解。量有 latch 的系統要抓最後一次覆寫,抓第一次會抓到短暫正確的假象。

10Producer → stripProducer → strip LIVE_VIEW_DISPLAY_CHAIN §7

Size jumps when focusing對焦中尺寸突然變化

Half-pressing the shutter stretched the picture vertically半按快門對焦,畫面突然被拉長fixed

Why
原因
Standby uses preview profile 5. Half-press and record switch to five sibling profiles (210/227/257/258/259) with +0x1C=1, all with visible height 1125. Profile 5 is shared by every mode, so fixing only the standby profile leaves the jump.
待機用預覽 profile 5,半按與錄影會切到另外五個 +0x1C=1 的兄弟 profile(210/227/257/258/259),可見高都是 1125。profile 5 是所有模式共用的,只修待機那個,半按就會跳。
Fix
解法
Switch +0x28 on all six to 1334 by the OG flag. Magnify (CMDDIAL3 ×3) was tested separately and passes.
六個的 +0x28 都跟著 OG 旗標切成 1334。放大(CMDDIAL3 ×3)另外測過,通過。

5PARAM profilePARAM profile LIVE_VIEW_DISPLAY_CHAIN §4, FLAG_AND_PICKER_DISAGREE

Broken CinemaDNGCinemaDNG 寫壞

The last frame of a take was garbled (borrowing p43)借 p43 時,錄影最後一幀花屏fixed

Why
原因
p43 has +0x030 = −1.0 (stills have no frame rate), so FUN_c04357e0 allocated 0 RAW buffers.
p43 的 +0x030 = −1.0(照片沒有格率),FUN_c04357e0 算出張數 0,不配置 RAW 緩衝。
Fix
解法
Writing a frame-rate float into +0x030 worked, but it broke stills (next item). Final fix: borrow p83, whose stock count is already 3 and which differs from p43 only in +0x030.
寫格率浮點進 +0x030 有效,但會害到拍照(下一條)。最終改借 p83:原廠張數就是 3,而且跟 p43 只差 +0x030。

5PARAM profilePARAM profile OG3K · OG3K_PLAYBACK_PROFILE_CLASSES §1, §7

Shooting an S-size 12-bit still with OG3K selected froze the camera選著 OG3K 拍一張 S 尺寸 12-bit 照片,相機凍結fixed

Why
原因
p43 is the stills view profile. The frame-rate write made it ask for three extra 3032×2012 RAW buffers (+8.2 MB).
p43 是照片檢視用的 profile。寫入格率讓它多要三張 3032×2012 RAW 緩衝(+8.2 MB)。
Fix
解法
Borrow p83 and write no stock fields at all.
改借 p83,不寫任何原廠欄位。

5PARAM profilePARAM profile OG3K · OG3K_IS_THE_STILLS_PATH

DNG with DefaultCropSize (0,0): playback crashes, USB lostDNG 寫出 DefaultCropSize (0,0):回放當機、USB 消失fixed

Why
原因
Donor p221 was declared “unreferenced, same branch fields” after comparing 12 columns. 9 of its 65 columns differ, active +0x24/+0x2C = 0 among them (A001_125). p221 is actually profile B of FHD24CROP/48CROP, found only through a second table shape {profA, profB, key, class}.
donor p221 只比了 12 欄就宣稱「沒人引用、分支欄位相同」。65 欄裡其實有 9 欄不同,active +0x24/+0x2C = 0(A001_125)。p221 是 FHD24CROP/48CROP 的 profile B,屬於當初沒掃到的第二種表型 {profA, profB, key, class}。
Fix
解法
Compare all 65 columns before borrowing a donor, and say which table shape an “unreferenced” claim was scanned against. Only p13 and p14 are truly unreferenced.
借 donor 前全 65 欄比對;說「沒人引用」要講明用哪種表型掃的。真正沒人用的只有 p13、p14。

5PARAM profilePARAM profile OG2K · OG2K_PLAN §G, §M–T

8-bit DNG on SSD shifted as a block: truncated tail, colour flip at the bottomSSD 上 8-bit DNG 整塊往後推:尾巴被截、底部變色workaround

Why
原因
The payload moves by 7,168 B (= 0x15400 − 0x13800) or 65,536 B, cutting 3.55 or 32.5 rows. Half a row flips the Bayer phase. Period 128 frames; 10/12-bit is clean. The per-frame writer takes a fast path when every segment is 512-aligned (FUN_c069AD80, open type 0x1806), and its write-cache mode 2 pads on its own; desc+0x14C never changes. Disabling the fast path freezes instantly.
位移 7,168 B(= 0x15400 − 0x13800)或 65,536 B,截掉 3.55 或 32.5 行;半行讓 Bayer 相位翻轉。以 128 格為週期,10/12-bit 乾淨。每幀寫入器在「所有段都 512 對齊」時走快速路徑(FUN_c069AD80,開檔型別 0x1806),它的寫入快取模式 2 會自己補零;desc+0x14C 從頭到尾沒變。把快速路徑關掉會立刻凍結。
Fix
解法
Host-side cdng_fix.py cuts the leading shift and pads the tail. The truncated rows are gone. Unsolved, and it is on HSW 240's critical path.
主機端 cdng_fix.py 切掉前導位移、尾端補零,被截的行救不回。未解,是 HSW 240 的關鍵路徑。

11DNG writer & cardDNG 寫檔器與卡片 HSW · HSW_240FPS_MODE12 §67

HSW: a dark rectangle on the right side of the frameHSW:畫面右側一塊暗矩形open

Why
原因
OpcodeList3's GainMap grid is computed for normal pixel aspect and applied to 2016×672, where each pixel is 2:1.
OpcodeList3 的 GainMap 網格照正常比例算,卻套在像素 2:1 的 2016×672 上。
Fix
解法
Not fixed in camera.
機上未修。

11DNG writer & cardDNG 寫檔器與卡片 HSW · HSW_240FPS_MODE12 §40

Shutter angle underexposed by 1.38 EV快門角度模式曝光少 1.38 EVfixed

Why
原因
Mode 98's metadata +0x40 says 78 fps, so 29.97 at 180° became 1/156 (6,411 µs instead of 16,663). There are four read sites; the last, 0xC03AA568, overwrote the first one's fix. Stage 2 also cleaned only the D-cache (0xC000E91C) without invalidating the I-cache (0xC000EABC).
mode 98 的 metadata +0x40 標 78 fps → 29.97/180° 算成 1/156(6,411 µs,應為 16,663)。讀取點有四個,最後一個 0xC03AA568 會把第一個修好的值蓋回去。另外 stage2 只清了 D-cache(0xC000E91C),沒做 I-cache 無效化(0xC000EABC)。
Fix
解法
All four BLs go to one wrapper at 0xC0730A00. 7 rates × 3 depths and 45/90/171/270/360° are all within 0.05 EV (v0.2.1a).
四顆 BL 都導向同一個 wrapper 0xC0730A00。7 格率 × 3 深度、45/90/171/270/360° 全在 0.05 EV 內(v0.2.1a)。

6Sensor timing感光元件時序 OG3K · SHUTTER_ANGLE_EXPOSURE_2026-09-15

About 2.7 EV of highlights lost at ISO 640 and aboveISO 640 以上損失約 2.7 級高光fixed

Why
原因
A stills profile switches to high-gain readout at ISO 640 (gain_state 3). Stock 12-bit CinemaDNG switches at 3200 (state 7), and playback adds a fixed +3 EV on top.
借照片 profile → ISO 640 就切高增益讀出(gain_state 3),原廠 12-bit CinemaDNG 是 3200(state 7),回放還固定補 +3 EV。
Fix
解法
og3kgs hooks FUN_c03a6dd8 only. Also driving the sensor-mode path made the preview flicker green. The preview plane +0x080 must stay 7. Gain state at 8 and 10 bit is unverified.
og3kgs 只 hook FUN_c03a6dd8;連感光元件模式那條一起驅動 → 預覽閃綠。預覽平面 +0x080 必須是 7。8/10-bit 下的增益狀態未驗證。

5PARAM profilePARAM profile OG3K v0.1.1 · opengate/README

25p under 50 Hz light showed rolling bands25p 在 50 Hz 燈下出現橫紋fixed

Why
原因
v0.2.2a used r1 as scratch, but r1 is the stock lookup's table pointer. Non-OG keys went back with r1 = 0/3/4 and resolved to UHD30 mode 7 (nominal 30), so 25p/180° came out 1/60.
v0.2.2a 拿 r1 當暫存,但 r1 是原廠查表的表指標。非 OG 的鍵帶著 r1 = 0/3/4 回去 → UHD30 mode 7(標稱 30)→ 25p/180° 算成 1/60。
Fix
解法
v0.2.3a uses r5; 100 frames all 25.000 fps, 1/50. The notes disagree on whether this was the whole cause.
v0.2.3a 改用 r5,100 幀全部 25.000 fps、1/50。各筆記對「這是不是全部的原因」說法不一。

2PickerPicker OG3K v0.2.2a · FLICKER_25P_INVESTIGATION, OG2K_PLAN §Z–AA

Dropped frames, bad frames, stalls抽格、壞幀、停錄

HSW froze above 60 fpsHSW 超過 60 fps 就凍結fixed

Why
原因
Four hypotheses were ruled out: throughput, vblank, +0x0B0, hook contamination. Binding stock FHD120 to mode 12 did not freeze, which put the fault in donor p13.
排除了四個假設:吞吐、消隱、+0x0B0、hook 污染。把原廠 FHD120 那格綁到 mode 12 不會凍 → 問題在 donor p13。
Fix
解法
Seven high-rate fields (TARGET_WRITE_HIRATE): +0x90=1, +0xB0=1, +0xC0=0, +0xDC/+0xE4, +0xFC/+0x100=2.0f. A001_120: 1,173 frames in 9 s. The minimal subset was not bisected.
補七個高速欄位(TARGET_WRITE_HIRATE):+0x90=1、+0xB0=1、+0xC0=0、+0xDC/+0xE4、+0xFC/+0x100=2.0f。A001_120 9 秒 1,173 幀。最小集合沒二分。

5PARAM profilePARAM profile HSW · HSW_240FPS_MODE12 §30–39

External writes serialised to about 5 frames a second, then a freeze外接寫入被串列化成每秒約 5 格,然後凍結fixed

Why
原因
OG_BUFCLASS=29 wrote canvas +0xA4 = 0x29, which is the buffer class code. It had been judged harmless.
OG_BUFCLASS=29 把畫布 +0xA4 寫成 0x29,而那是緩衝類別碼。當初被判成「沒幫助」,其實是病因。
Fix
解法
Removed. A001_148: 180 fps for 23.5 s, zero dropped frames, 258 MB/s; A001_144–149 all req == fin.
拿掉。A001_148:180 fps、23.5 秒、零掉格、258 MB/s;A001_144..149 全部 req == fin。

9Canvas畫布 HSW · HSW_240FPS_MODE12 §59–66

Recording stops at req_cnt=94, or the clip has fewer real frames than its container rate錄到 req_cnt=94 就停,或實際格數少於容器格率rule

Why
原因
The descriptor pool is MPoolFixed<4380,96> with a “more than 1 left” threshold, so at most 94 frames are in flight. When the medium cannot keep up, vbuf drains the pool and the take stops cleanly. The reason is written to 0xC359BE70 (vbuf/vmed/vidx/vcnt/cnt/data/mem). Media saturation means dropped frames and a normal end, not a freeze: A001_107's container says 119.88 but it really ran at 31 fps.
描述子池是 MPoolFixed<4380,96>,門檻「剩餘 > 1」→ 最多 94 格在途。媒體跟不上時 vbuf 抽乾池子,乾淨停止;原因字串寫在 0xC359BE70(vbuf/vmed/vidx/vcnt/cnt/data/mem)。媒體飽和 = 掉格 + 正常結束,不是凍結(A001_107 容器 119.88、實際 31 fps)。
Fix
解法
Stay under the medium's sustained rate: SD writes 94 MB/s, but FHD 12-bit already needs 97.2. The old 276.6 MB/s open gate stops on SD within 4.1 s. On SSD, 258 MB/s ran with zero drops and 317 MB/s is the only measured saturation point.
碼率壓在媒體持續速率以下:SD 寫 94 MB/s,而 FHD 12-bit 就要 97.2;舊 276.6 MB/s 的 open gate 在 SD 上 ≤4.1 秒自停。SSD 258 MB/s 零掉格,317 MB/s 是唯一量到的飽和點。

11DNG writer & cardDNG 寫檔器與卡片 HSW_240FPS_MODE12 §30, §53, §66–68; STORAGE_SPEED

Descriptors leak on every buffer-stop, until a cold boot每次 vbuf 停止都漏描述子,只有冷開機會恢復open

Why
原因
FUN_c0377118 → FUN_c0381008 unhooks the in-flight requests but never returns them through FUN_c0375030. Each stop leaks about 44 slots and 63 MB of RAW. A clean stop (fin == req) leaks nothing.
FUN_c0377118 → FUN_c0381008 只把在途請求摘下,沒經 FUN_c0375030 歸還;每次漏約 44 格 + 63 MB RAW。乾淨停止(fin == req)不漏。
Fix
解法
Firmware bug, not ours. Cold-boot after an overflow stop.
原廠 bug。溢位停止之後冷開機。

11DNG writer & cardDNG 寫檔器與卡片 HSW_240FPS_MODE12 §69

240 fps onto SSD freezes immediately240 fps 寫 SSD 立刻凍結open

Why
原因
It takes USB and the media subsystem down with it, so nothing can be read afterwards. On SD the same setting stops cleanly, but only because SD stops earlier. The one concrete SD/SSD difference found: XC_MediaDriverHost::v16 is empty, leaving SSD parameters at constructor defaults. Unverified. Both SSD write modes freeze; the claim that “Standard mode doesn't freeze” rested on one frame.
凍結會把 USB/媒體子系統一起拖死,事後拿不到現場。SD 上同設定是乾淨停止,但那只是因為 SD 更早停。唯一具體的 SD/SSD 差異:XC_MediaDriverHost::v16 是空實作,SSD 參數停在建構子預設值 —— 未驗證。兩種寫入模式都凍,「關快速錄影就不凍」只有 1 格證據。
Fix
解法
Unsolved.
未解。

11DNG writer & cardDNG 寫檔器與卡片 HSW · HSW_240FPS_MODE12 §43–59, §71

Gyro sidecar lost samples during a take (the “dropped needles”)陀螺儀 sidecar 漏樣本(漏針)fixed

Why
原因
One SD card lock (XC_MediaDriverSdcard+0x3C), non-preemptible. Our writer (priority 28) waited about 0.5 s per 64 KB write; three writes took longer than the 1.6 s it takes to fill a slot.
SD 卡鎖只有一把(XC_MediaDriverSdcard+0x3C),不可搶佔。我們的 writer(pri 28)每次 64 KB 寫入要等約 0.5 s,三次就超過一槽 1.6 s 的填滿時間。
Fix
解法
r36: 1250 Hz with sparse accel gives one write per slot. A/B dropped 3,402 → 0; a 15.4-minute take lost nothing. OVERFLOW=0 alone does not prove no loss.
r36:1250 Hz + 稀疏加速度計 → 每槽只寫一次。A/B 3,402 → 0,15.4 分鐘長片零遺失。OVERFLOW=0 不代表沒掉。

11DNG writer & cardDNG 寫檔器與卡片 gyro · STREAM_DROP_INVESTIGATION

Freezes caused by the patch itself補丁自己造成的凍結

OG selected + recording format MOV + record: hard freeze, even mem_get dies選著 OG + 錄影格式切 MOV + 按錄影:硬凍結,連 mem_get 都死fixed

Why
原因
MOV never goes through the CinemaDNG picker, but the hooks that check only the flag (og3kout/aspect/fps/gs/name) stayed armed, so H.264 got 3:2 descriptors. Flag 1 freezes, flag 0 does not.
MOV 不經 CinemaDNG picker,但只看旗標的那組 hook(og3kout/aspect/fps/gs/name)仍全開,H.264 拿到 3:2 描述子。旗標 1 凍、0 正常。
Fix
解法
og3kfmt hooks the format setter 0xC005BE58 into FMTLATCH 0xC0731C20. The flag now means OG and CinemaDNG. Passed on OG2K and OG3K.
og3kfmt 掛格式 setter 0xC005BE58 → FMTLATCH 0xC0731C20。旗標改成「選了 OG 且格式是 CinemaDNG」。OG2K、OG3K 都實機通過。

1Menu selection選單選擇 FLAG_AND_PICKER_DISAGREE §10–12, §38–39

Three freezes with one cause: something a hook reads was changed while the hook was live三次凍結,同一條規則:hook 還在跑,就去改它讀的東西rule

Why
原因
(1) A payload rewritten in place while it ran (rowpatch 232→252 B). (2) The function pointer 0xC0BE44DC written before the payload it points to (write 7 vs 193). (3) The format table rewritten while the picker hook was armed. Separately, rowpatch placed at 0xC072F800, the getfile/putfile scratch area.
(1) payload 邊執行邊原地覆寫(rowpatch 232→252 B);(2) 函式指標 0xC0BE44DC 比它指向的 payload 先寫(第 7 筆 vs 第 193 筆);(3) picker hook 武裝中改寫它讀的格式表。另外 rowpatch 放在 0xC072F800 = getfile/putfile 暫存區。
Fix
解法
Disarm first, then write. Enforced by Plan.check() and an OWNED table.
先解除 hook 再寫。已由 Plan.check() 與 OWNED 表強制。

3Format entry格式條目 OG3K_WHAT_WAS_WRONG §8–9

Reading past a record: data abort, camera gone from USB讀過界:data abort,相機從 USB 消失rule

Why
原因
The canvas dumper read SPAN 0x140; the record is 65 fields, 0x104 B. 0x5C+0x140 reached an unmapped page.
倒畫布用 SPAN 0x140,record 只有 65 欄 0x104 B;0x5C+0x140 碰到未映射頁。
Fix
解法
Every read and write range has to come from something measured, never from “big enough”.
讀寫範圍要有依據,不能取「應該夠大」的數字。

9Canvas畫布 CANVAS_MOVED_AT_C043A19C §5

Other freezes on record start其他在錄影開始時凍結的rule

Why
原因
A hook at FUN_c03212e0 (fine for stills, freezes on record). Allocator memory held across record start (movRec's fixed class-10 allocation fails). Host USB traffic at the moment record is pressed (IRQ livelock). State words that sit inside hook code.
hook 掛在 FUN_c03212e0(拍照沒事、錄影就凍);握著配置器記憶體跨過錄影開始(movRec 從 class 10 定量配置失敗);按錄影那一刻主機下 USB 交易(IRQ livelock);狀態字坐在 hook 程式碼上。
Fix
解法
Don't hook there. Keep resident buffers in the pool. Keep the host silent on record. Run the deployer's overlap check.
不掛那裡;常駐緩衝放池裡;錄影時主機靜默;部署器做重疊檢查。

11DNG writer & cardDNG 寫檔器與卡片 OPEN_GATE_EXPLORATION_ARCHIVE; memory: allocator-not-across-recording, state-words-inside-code

In-camera playback機內回放

OG3K clips played back with horizontal stripesOG3K 片子回放出現水平條紋fixed

Why
原因
Two causes. (1) Playback does not use the picker, and our own og3kname turned the lookup key into “OG3K”, which fell back to p51 (the UHD pipeline). (2) A playback profile's raster equals the clip's stride, and 3032 broke the +16/+10, 16-aligned convention. Three earlier explanations were retracted: pool overflow, a “16-aligned stride” decode bug, and PARAM geometry as the playback source.
兩個原因:(1) 回放不查 picker,而我們自己的 og3kname 把查表鍵改成「OG3K」→ 退回 p51(UHD 管線);(2) 回放 profile 的柵格等於片子的列距,而 3032 不守 +16/+10、16 對齊的慣例。先前三個解釋全數收回:池爆掉、「16 對齊 stride 解錯」、PARAM 幾何是回放來源。
Fix
解法
Pass through when lr == 0xC043BCBC. Record 3024×2010 with crop 3008×2000 @ (8,5). og3kcanvas has a playback case. A001_037 verified. The recorded files were always fine.
lr == 0xC043BCBC 時放行;錄影改 3024×2010、裁切 3008×2000 @ (8,5);og3kcanvas 加回放 case。A001_037 驗證。錄下的檔案本身一直是好的。

9Canvas畫布 OG3K · OG3K_PLAYBACK_PROFILE_CLASSES

Black screens and freezes in playback回放黑屏、凍結rule

Why
原因
Taking the name table's FHDCROP slot gives a black screen. The stills pipeline +0x268 expects 256×256 lossless-JPEG tiles, so the result is pink-green spots. +0x538 WithRaw freezes on a black screen. A non-zero PBSEL_ENT default freezes at boot. On OG2K, 3008/2000 were hard-coded as immediates, so PBFLAG never fired.
挪用名稱表 FHDCROP 槽 → 黑屏;照片管線 +0x268 預期 256×256 無損 JPEG tile → 粉綠斑點;+0x538 WithRaw → 黑屏凍結;PBSEL_ENT 預設非 0 → 開機就凍。OG2K 把 3008/2000 寫死成立即數 → PBFLAG 永遠不成立。
Fix
解法
Parameterised as TARGET_AW/AH. The checklist covers .equ, plan addresses, instruction immediates, firmware compare tables, .asciz strings and resource names built from numbers.
參數化成 TARGET_AW/AH;檢查清單涵蓋 .equ、計畫位址、指令立即數、韌體比對表、.asciz 字串、由數值組出的資源名。

3Format entry格式條目 OG3K / OG2K · OG3K_PLAYBACK_PROFILE_CLASSES §6–13, OG2K_PLAN §AL–AT

OG2K playback: colour noise in the top-left cornerOG2K 回放左上角彩色雜訊fixed

Why
原因
The firmware has no font_S_imageSize_1334 resource (1334 is not among its 70), and a failed load reports nothing.
韌體沒有 font_S_imageSize_1334(70 個資源裡沒有 1334),載入失敗也不報錯。
Fix
解法
Added automatically to a private resource bundle. The HUD font is ARGB4444, not L8A8.
自動補進私有資源包。HUD 字型是 ARGB4444,不是 L8A8。

1Menu selection選單選擇 OG2K · OG2K_PLAN §AQ–AY

8-bit OG clips in playback8-bit OG 片子的回放open

Why
原因
FUN_c05c1a58 only knows 12 → 0 and 10 → 3; anything else becomes RAW8 (4).
FUN_c05c1a58 只認 12→0、10→3,其他一律當 RAW8(4)。
Fix
解法
Untested, and expected to break.
未驗證,預期會壞。

11DNG writer & cardDNG 寫檔器與卡片 OG14_FEASIBILITY §2

Sidecar and lens profileSidecar 與鏡頭 profile

JSON sidecar width = 0JSON sidecar 寬度 = 0fixed

Why
原因
The size came from 0xC37CE210, which is only filled at 1080p. It reads 0 in UHD and in stream mode.
尺寸取自 0xC37CE210,它只有 1080p 有值,UHD 與 stream 模式整段是 0。
Fix
解法
Early write from CameraMgrSetting +0x40 plus 16/10 (r39d). The mirror 0xC3758B98 is 0 on release cards. Unrelated to the dropped gyro samples.
改為提早寫入,取 CameraMgrSetting +0x40 加 16/10(r39d);鏡像 0xC3758B98 在發布卡上是 0。跟陀螺漏針是兩個獨立機制。

9Canvas畫布 gyro · memory: json-early-write-design

Under OG3K the lens profile said 3856×2170; focal length off by 27%OG3K 下鏡頭 profile 寫成 3856×2170,焦距錯 27%workaround

Why
原因
Both paths fell back to the settings block, which OG does not update. 0xC38250E4 is the stills EXIF singleton, always {0,0} (retracted twice).
兩條路都退回設定值,而 OG 不更新設定。0xC38250E4 是照片 EXIF 的單例,恆為 {0,0}(收回兩次)。
Fix
解法
FUN_c0437140(&out, 2, ctx, 3) returns 3024×2010 even when not recording; release it with FUN_c022EDB0. A null ctx with kind 2 freezes. Verified on A001_957 (gyro v1.12.1). ring_task.S and profilegen.S have not been ported yet.
FUN_c0437140(&out, 2, ctx, 3) 不錄影也能回 3024×2010,用完 FUN_c022EDB0 釋放;ctx 傳 null 搭 kind 2 會凍結。A001_957 驗證(gyro v1.12.1)。ring_task.S、profilegen.S 還沒移植。

9Canvas畫布 OG3K · LENS_PROFILE_WRONG_SIZE_WITH_OG3K

What every stage requires每一關的硬性要求、對齊與整除

The constraints a new format has to satisfy, stage by stage, in chain order. Every number here was either read from Ver.5.02 or measured on a take.

新格式在每一關必須滿足的條件,照鏈的順序排。這裡每個數字不是從 Ver.5.02 讀出來的,就是從實拍量出來的。

Menu / UI選單 / UI

Picker / format entryPicker / 格式條目

Sensor mode & timing感光元件模式與時序

PARAM profilePARAM profile

CRCTCRCT

RWZMRWZM

Canvas & recorded size畫布與錄影尺寸

Producer → stripProducer → strip

DNG writer & cardDNG 寫檔器與卡片

Playback回放

Lossless codec (not yet in the chain)無損 codec(尚未進鏈)

Claims that did not survive已推翻、別再當事實引用的說法

Each of these was written down as a finding at some point. They are listed so they don't come back.

這些都曾經被當成結論寫進筆記。列出來,是為了不讓它們再回來。

How a recording change is accepted改錄影路徑的驗收規則

  1. Decode the DNG. Every recording-path change is accepted on the file, never on live view: file size, strip length, and the adjacent same-phase row correlation beyond column 1936 (good 0.72–0.98, broken −0.12–0.03). “Non-zero bytes” lies, because unfilled area is noise, not zero.解 DNG。改錄影路徑一律用檔案驗收、不看 live view:檔案大小、strip 長度、1936 欄以外的相鄰同相位列相關(正常 0.72–0.98、壞的 −0.12–0.03)。「位元組非零」會騙人 —— 未填區是雜訊不是零。
  2. Read the outcome from req_cnt / fin_cnt and the stop-reason string before anything else. is_recording returning to 0 does not mean the writes finished.先用 req_cnt/fin_cnt 與停止原因字串判讀結果;is_recording 歸 0 不代表寫完。
  3. Measure the sensor's true frame rate with a fixed shutter clamped by the frame period (EXIF 1/250 @240). Angle mode reads the metadata.感光元件真實格率用「固定快門被格週期夾住」的 EXIF 量(1/250 @240);角度模式讀的是 metadata。
  4. On a latched system, capture the last overwrite. Every screenshot has to assert REC or STBY from the HUD.有 latch 的系統抓最後一次覆寫;每張截圖都要從 HUD 斷言 REC/STBY。
  5. Test every frame rate and every bit depth, not only 29.97 / 12-bit.每個格率、每個位元深度都要測,不能只測 29.97 / 12-bit。
  6. Disarm hooks before writing anything they read. Every read or write range must come from a measurement.改 hook 讀的東西前先解除 hook;讀寫範圍要有依據。

What is still dark還沒搞懂的部分

Collected from the stages above, worst first:

把上面各關的未解項收集起來,照嚴重程度排:

  1. What consumes the geometry at write time寫檔當下是誰在消費幾何

    0xC37CE210 was documented as the recording geometry and is not — recording works with it zeroed. The canvas hook works empirically, but the path from canvas to the writer's idea of frame size is not traced.

    0xC37CE210 被寫成「這就是錄影幾何」,但它不是 —— 清成 0 照樣能錄。畫布 hook 是「試出來有效」,但從畫布到寫檔器心裡那個幀尺寸,中間這段沒追出來。

  2. Whether the writer accepts variable frame lengths寫檔器吃不吃變動長度的幀

    Blocks in-camera compression entirely. The playback capacity is derived from the first frame, which is not a worst-case guarantee.

    這件事直接擋死機內壓縮。回放的容量是從第一幀導出來的,而那不是最壞情況的保證。

  3. Most of the 306-row profile table306 列 profile 表的大部分

    Most of the roughly 65 columns are still not understood (+0x030 is now known: nominal fps, which sets the buffer count). The minimal set of HSW's seven high-rate fields was never bisected.

    大約 65 個欄位大部分仍沒搞懂(+0x030 已解:標稱 fps,決定緩衝張數)。 HSW 那七個高速欄位的最小集合沒有二分過。

  4. Whether the merge tuple is binning or skipping合併倍率到底是合併還是跳讀

    +0x4C/+0x50 are confirmed as geometry scale, which proves a coordinate ratio and nothing about charge. The noise work narrowed it but hit a modelling contradiction it could not resolve.

    +0x4C/+0x50 確認是幾何倍率,那只證明座標比例,跟電荷怎麼處理無關。雜訊分析把範圍縮小了,但撞到一個模型上的矛盾,沒能解掉。

  5. What Crmf and Spc correctCrmf 跟 Spc 在修正什麼

    Two of the six CRCT tap names. Spc is the lowest priority of anything here, since no code path can select it.

    六個 CRCT 抽頭名字裡的兩個。Spc 是這整頁優先度最低的一項,因為根本沒有程式路徑選得到它。

Four more, smaller: the five-tap horizontal coefficients are in neither ROM record; the flat 2.18 ms per codec call is unlocated; the menu's three-row limit may or may not be real; and the second imager object's selector has never been traced to a caller.

還有四個比較小的:÷5 的五抽頭係數兩筆 ROM record 裡都沒有; codec 每次呼叫那筆固定 2.18 ms 花在哪還沒定位;選單「只能三列」是不是真的限制沒確認; 第二個 imager 物件的選擇器從來沒追到呼叫者。

Sources出處

The picker, format entry and name tables are from the format-registry work; the canvas hook and its six failed predecessors from the open-gate notes; sensor timing from the frame-rate and HSW investigations; the profile table layout from the reduction work and an external handoff's table description. Everything on this page that is marked solved was either read out of Ver.5.02 or verified on a camera, and the two places where an older note says something this page contradicts are called out where they occur.

picker、格式條目、名稱表來自格式註冊那條線的研究;畫布 hook 跟它前面六次失敗 來自 open gate 的筆記;感光元件時序來自格率與 HSW 的調查;profile 表的排列來自縮減路徑的研究, 加上一份外部 handoff 對那張表的描述。
這頁標成 solved 的每一項,不是從 Ver.5.02 讀出來的,就是在相機上驗過的。 有兩個地方舊筆記講的跟這頁相反,我都直接寫在那一關裡了。