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、回放) 和每一關的對齊與整除要求整理在一起。
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 表也要加 —— 所以「加一個解析度」從來不是改一個地方就好。
mem_get dies選著 OG + 錄影格式切 MOV + 按錄影:硬凍結,連 mem_get 都死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
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:
| key | mode | 8-bit | 10-bit | 12-bit |
|---|---|---|---|---|
| UHD30 | 7 | 131 | 151 | 171 |
| FHD30 | 106 | 135 | 155 | 175 |
| FHD60 | 27 | 133 | 153 | 173 |
+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。
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)。
+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 去標記素材的東西,讀到的都是過期的數字。
+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 幾何倍率,但那只證明座標比例 —— 不能分辨是電荷合併還是跳讀,而這個差別對畫質很重要。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
+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 筆全部等比。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 是拍攝用,原廠就配三張。
DefaultCropSize (0,0): playback crashes, USB lostDNG 寫出 DefaultCropSize (0,0):回放當機、USB 消失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 是唯一一個感光元件一個位元都不用動的。
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 的欄位。除此之外,兩者確實是互斥的分支。
Crmf and Spc
actually correct. Also the five-tap horizontal coefficients — both ROM
records only carry three-tap kernels.Crmf 跟 Spc 到底在修正什麼。還有 ÷5 要用的五抽頭係數 —— 兩筆 ROM record 裡都只有三抽頭。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。
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.
前面六輪失敗,全部都是在改「從這份記錄推導出來的下游東西」。這條鏈的通則就是這句話:要找值被「組出來」的地方,不是找它「看得見」的地方。
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,每幀一條。描述子裡有兩對尺寸欄位,後來才發現它們意思不一樣:
| field | role | stock |
|---|---|---|
+0x0C/+0x10 | what the producer actually emits | 1936×1090 |
+0xD8/+0xE0 | what the consumer reads | overwritten 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 行。
+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。搞懂這件事之前,這個行為毀掉了數十段素材。+0xD8/+0xE0 destroyed dozens of takes把畫布 +0xD8/+0xE0 清成 0,毀掉數十段素材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 就夠了。
req_cnt=94, or the clip has fewer real frames than its container rate錄到 req_cnt=94 就停,或實際格數少於容器格率All three are substitutions into the same chain. What separates them is how many stages they have to touch.
三個專案做的都是同一件事:在這條鏈上「換掉某個東西」。差別只在於要動幾關。
| OG3K | OG2K | HSW | |
|---|---|---|---|
| sensor raster感測器光柵 | 3032×2012 (÷2) | 2016×1344 (÷3) | 2016×672 (3×6) |
| recorded DNG錄出的 DNG | 3024×2010 → 3008×2000 | 2016×1344 → 2000×1334 | 2016×672 → 2000×662 |
| sensor mode感測器模式 | 98 / 143 | 139 / 8 | 12 |
| frame rate格率 | 29.97 retimed29.97,改過時序 | 29.97 retimed29.97,改過時序 | 239.76 native239.76 原生 |
| rolling shutter捲簾 | 12.44 ms | 8.31 ms | 3.08 ms |
| rate at 29.9729.97 的資料率 | 273 MB/s | 122 MB/s | — |
| donor profile借用的 profile | p83 (stills capture; p43 abandoned)p83(拍照用;p43 已棄用) | p13 | p13 + 7 high-rate fieldsp13 + 7 個高速欄位 |
| retimes the sensor要改感測器時序 | yes要 | yes要 | no不用 |
| touches RWZM要動 RWZM | yes — to unity要 — 改成 unity | no不用 | no (tried: no effect)不用(試過,沒作用) |
| canvas hook畫布 hook | yes要 | yes要 | yes要 |
| status狀態 | v0.2.4a | v0.1.1a | on 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 上被寫入端整塊推位。見掉格。
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 = 未解。
0x640 (1.5625×). That caps the producer at sl+0x64/+0x68 = 1936×1090 no matter what the canvas says.0x640(1.5625×),它把 producer 的上限 sl+0x64/+0x68 釘在 1936×1090,畫布寫多大都沒用。+0x60/+0x64/+0xD0/+0xD4) to unity 0x400. A001_016: adjacent-row correlation 0.88–0.93 on all four edges.+0x60/+0x64/+0xD0/+0xD4)全改 unity 0x400。A001_016 四邊相鄰列相關 0.88–0.93。8RWZMRWZM OG3K · CANVAS_MOVED_AT_C043A19C §8–11
8RWZMRWZM OG3K / HSW · OG3K_RWZM_AND_BUILD_PIPELINE §6c, HSW §67B
8RWZMRWZM OG3K · OG3K_RWZM_AND_BUILD_PIPELINE §1
og3k_plan) used by every loader.og3k_plan。8RWZMRWZM OG3K · OG3K_RWZM_AND_BUILD_PIPELINE §3
+0xD8/+0xE0 destroyed dozens of takes把畫布 +0xD8/+0xE0 清成 0,毀掉數十段素材fixed+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).+0x0C/+0x10,而那裡放的是預覽柵格 2024×1341。A001_015 起只有左邊 1936 欄有畫面;A001_047 起 strip 縮成 3032×1341(每幀 6,179,328 B,應為 9,229,824)。check() locks the ten canvas writes. The footage could not be recovered.check() 鎖死那十個 PUT。那批素材救不回來。10Producer → stripProducer → strip OG3K · RECORDING_REGRESSION_2026-09-12
8RWZMRWZM SENSOR_READOUT_NOISE §6
floor(16×frac(n×R)). The stock 25/16 ratio uses all 16 phases, and that repeats every 16 rows.floor(16×frac(n×R))。原廠 25/16 會用滿 16 個相位,每 16 行重複一次。8RWZMRWZM REDUCTION_KERNEL_MEASURED §0
*(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」只是兩種原廠尺寸剛好成立,沒有因果關係。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
FUN_c0437078 only ever answers with 16:9 modes.FUN_c0437078 也只會回 16:9 的模式。4Sensor mode table感光元件模式表 OPEN_GATE_EXPLORATION_ARCHIVE
+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.+0x00/04(配置 RAW 緩衝用)、active +0x24/2C(DefaultCrop)、override +0xDC/E4(檔頭)、input +0xF4/F8。只改 override,位元組數會錯;只改 base,檔頭沿用舊尺寸。照反編譯賦值順序推出來的偏移全部差 4。9Canvas畫布 CANVAS_MOVED_AT_C043A19C §2
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.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
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
OG3K25CROP, which no table has. The private format table is 384 of 480 B full.OG3K25CROP,哪張表都沒有。私有格式表 480 B 已用 384。2PickerPicker FLICKER_25P_INVESTIGATION §8
+0xF4/+0xF8 says 2016×1344, but mode 12 reads only 672 rows, so fin_cnt < req_cnt.+0xF4/+0xF8 宣告 2016×1344,mode 12 只讀 672 行,於是 fin_cnt < req_cnt。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
+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
10Producer → stripProducer → strip LIVE_VIEW_DISPLAY_CHAIN §5
0xC0306EA0 (also 0xC0306EEC), and the output descriptor 0xC0437E98 at 1620×911.0xC0306EA0(另一處 0xC0306EEC),以及輸出描述子 0xC0437E98 的 1620×911。10Producer → stripProducer → strip LIVE_VIEW_DISPLAY_CHAIN §2
+0x0C said 1920: 96 columns cropped, 2016/1920 = 1.050. The file itself was always right.+0x0C 是 1920 → 裁掉 96 欄,2016/1920 = 1.050。檔案本身一直是對的。+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
10Producer → stripProducer → strip LIVE_VIEW_DISPLAY_CHAIN §7
+0x1C=1, all with visible height 1125. Profile 5 is shared by every mode, so fixing only the standby profile leaves the jump.+0x1C=1 的兄弟 profile(210/227/257/258/259),可見高都是 1125。profile 5 是所有模式共用的,只修待機那個,半按就會跳。+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
+0x030 = −1.0 (stills have no frame rate), so FUN_c04357e0 allocated 0 RAW buffers.+0x030 = −1.0(照片沒有格率),FUN_c04357e0 算出張數 0,不配置 RAW 緩衝。+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
5PARAM profilePARAM profile OG3K · OG3K_IS_THE_STILLS_PATH
DefaultCropSize (0,0): playback crashes, USB lostDNG 寫出 DefaultCropSize (0,0):回放當機、USB 消失fixed+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}.+0x24/+0x2C = 0(A001_125)。p221 是 FHD24CROP/48CROP 的 profile B,屬於當初沒掃到的第二種表型 {profA, profB, key, class}。5PARAM profilePARAM profile OG2K · OG2K_PLAN §G, §M–T
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.FUN_c069AD80,開檔型別 0x1806),它的寫入快取模式 2 會自己補零;desc+0x14C 從頭到尾沒變。把快速路徑關掉會立刻凍結。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
11DNG writer & cardDNG 寫檔器與卡片 HSW · HSW_240FPS_MODE12 §40
+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).+0x40 標 78 fps → 29.97/180° 算成 1/156(6,411 µs,應為 16,663)。讀取點有四個,最後一個 0xC03AA568 會把第一個修好的值蓋回去。另外 stage2 只清了 D-cache(0xC000E91C),沒做 I-cache 無效化(0xC000EABC)。0xC0730A00. 7 rates × 3 depths and 45/90/171/270/360° are all within 0.05 EV (v0.2.1a).0xC0730A00。7 格率 × 3 深度、45/90/171/270/360° 全在 0.05 EV 內(v0.2.1a)。6Sensor timing感光元件時序 OG3K · SHUTTER_ANGLE_EXPOSURE_2026-09-15
gain_state 3). Stock 12-bit CinemaDNG switches at 3200 (state 7), and playback adds a fixed +3 EV on top.gain_state 3),原廠 12-bit CinemaDNG 是 3200(state 7),回放還固定補 +3 EV。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
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.r1 當暫存,但 r1 是原廠查表的表指標。非 OG 的鍵帶著 r1 = 0/3/4 回去 → UHD30 mode 7(標稱 30)→ 25p/180° 算成 1/60。r5; 100 frames all 25.000 fps, 1/50. The notes disagree on whether this was the whole cause.r5,100 幀全部 25.000 fps、1/50。各筆記對「這是不是全部的原因」說法不一。2PickerPicker OG3K v0.2.2a · FLICKER_25P_INVESTIGATION, OG2K_PLAN §Z–AA
+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。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
OG_BUFCLASS=29 wrote canvas +0xA4 = 0x29, which is the buffer class code. It had been judged harmless.OG_BUFCLASS=29 把畫布 +0xA4 寫成 0x29,而那是緩衝類別碼。當初被判成「沒幫助」,其實是病因。9Canvas畫布 HSW · HSW_240FPS_MODE12 §59–66
req_cnt=94, or the clip has fewer real frames than its container rate錄到 req_cnt=94 就停,或實際格數少於容器格率ruleMPoolFixed<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)。11DNG writer & cardDNG 寫檔器與卡片 HSW_240FPS_MODE12 §30, §53, §66–68; STORAGE_SPEED
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)不漏。11DNG writer & cardDNG 寫檔器與卡片 HSW_240FPS_MODE12 §69
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.XC_MediaDriverHost::v16 是空實作,SSD 參數停在建構子預設值 —— 未驗證。兩種寫入模式都凍,「關快速錄影就不凍」只有 1 格證據。11DNG writer & cardDNG 寫檔器與卡片 HSW · HSW_240FPS_MODE12 §43–59, §71
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.XC_MediaDriverSdcard+0x3C),不可搶佔。我們的 writer(pri 28)每次 64 KB 寫入要等約 0.5 s,三次就超過一槽 1.6 s 的填滿時間。OVERFLOW=0 alone does not prove no loss.OVERFLOW=0 不代表沒掉。11DNG writer & cardDNG 寫檔器與卡片 gyro · STREAM_DROP_INVESTIGATION
mem_get dies選著 OG + 錄影格式切 MOV + 按錄影:硬凍結,連 mem_get 都死fixedog3kout/aspect/fps/gs/name) stayed armed, so H.264 got 3:2 descriptors. Flag 1 freezes, flag 0 does not.og3kout/aspect/fps/gs/name)仍全開,H.264 拿到 3:2 描述子。旗標 1 凍、0 正常。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
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.0xC0BE44DC 比它指向的 payload 先寫(第 7 筆 vs 第 193 筆);(3) picker hook 武裝中改寫它讀的格式表。另外 rowpatch 放在 0xC072F800 = getfile/putfile 暫存區。Plan.check() and an OWNED table.Plan.check() 與 OWNED 表強制。3Format entry格式條目 OG3K_WHAT_WAS_WRONG §8–9
SPAN 0x140; the record is 65 fields, 0x104 B. 0x5C+0x140 reached an unmapped page.SPAN 0x140,record 只有 65 欄 0x104 B;0x5C+0x140 碰到未映射頁。9Canvas畫布 CANVAS_MOVED_AT_C043A19C §5
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.FUN_c03212e0(拍照沒事、錄影就凍);握著配置器記憶體跨過錄影開始(movRec 從 class 10 定量配置失敗);按錄影那一刻主機下 USB 交易(IRQ livelock);狀態字坐在 hook 程式碼上。11DNG writer & cardDNG 寫檔器與卡片 OPEN_GATE_EXPLORATION_ARCHIVE; memory: allocator-not-across-recording, state-words-inside-code
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.og3kname 把查表鍵改成「OG3K」→ 退回 p51(UHD 管線);(2) 回放 profile 的柵格等於片子的列距,而 3032 不守 +16/+10、16 對齊的慣例。先前三個解釋全數收回:池爆掉、「16 對齊 stride 解錯」、PARAM 幾何是回放來源。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
+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.+0x268 預期 256×256 無損 JPEG tile → 粉綠斑點;+0x538 WithRaw → 黑屏凍結;PBSEL_ENT 預設非 0 → 開機就凍。OG2K 把 3008/2000 寫死成立即數 → PBFLAG 永遠不成立。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
font_S_imageSize_1334 resource (1334 is not among its 70), and a failed load reports nothing.font_S_imageSize_1334(70 個資源裡沒有 1334),載入失敗也不報錯。1Menu selection選單選擇 OG2K · OG2K_PLAN §AQ–AY
FUN_c05c1a58 only knows 12 → 0 and 10 → 3; anything else becomes RAW8 (4).FUN_c05c1a58 只認 12→0、10→3,其他一律當 RAW8(4)。11DNG writer & cardDNG 寫檔器與卡片 OG14_FEASIBILITY §2
0xC37CE210, which is only filled at 1080p. It reads 0 in UHD and in stream mode.0xC37CE210,它只有 1080p 有值,UHD 與 stream 模式整段是 0。+0x40 plus 16/10 (r39d). The mirror 0xC3758B98 is 0 on release cards. Unrelated to the dropped gyro samples.+0x40 加 16/10(r39d);鏡像 0xC3758B98 在發布卡上是 0。跟陀螺漏針是兩個獨立機制。9Canvas畫布 gyro · memory: json-early-write-design
0xC38250E4 is the stills EXIF singleton, always {0,0} (retracted twice).0xC38250E4 是照片 EXIF 的單例,恆為 {0,0}(收回兩次)。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
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 讀出來的,就是從實拍量出來的。
0xC1A709BC is a big-endian float (1.0→2.0). Menu string records are 28 B. QS labels are fixed 4-byte slots.控制器上限 0xC1A709BC 是大端 float(1.0→2.0);選單字串記錄 28 B;QS 標籤是固定 4 B 槽。font_S_imageSize_<W> and <H> have to exist; a missing one fails with no error.font_S_imageSize_<W> 與 <H> 兩個資源都必須存在,少了不會報錯。CROP, so each crop key needs its own entry.鍵只比前 15 字元;裁切會接 CROP,每個 CROP 鍵都要有自己的條目。{5, profile, mode, key_ptr}. Across the three depths, profile numbers differ by exactly 20.條目 {5, profile, mode, key_ptr};三種深度的 profile 編號恰好差 20。+0x080/+0x084: 12-bit 7, 10-bit 9, 8-bit 0xA, 16-bit 8/0xB. There is no 14-bit. BitsPerSample must agree with them.平面格式碼 +0x080/+0x084:12-bit 7、10-bit 9、8-bit 0xA、16-bit 8/0xB,沒有 14-bit;必須與 BitsPerSample 一致。r1, the stock table pointer. Use r5 for scratch.hook 不能動 r1(原廠表指標),暫存用 r5。frame_cycles = hmax×(vmax−1) + tail at 72 MHz. Rolling shutter = hmax×height/72 µs.frame_cycles = hmax×(vmax−1) + tail @ 72 MHz;捲簾 = hmax×高/72 µs。+0x5C; register 0x0016 holds half of it) is a minimum blanking: 98→40, 143→100, mode 12→50. OG2K at 119.88 would leave only about 5.7 lines, so it is not possible.vblank(metadata +0x5C,暫存器 0x0016 存一半)是最小消隱:98→40、143→100、mode 12→50。OG2K 119.88 只剩約 5.7 行 → 不可行。0xC0B59500, stride 0x20. +0x0A x_start is 4 for 2×2, 8 for 1×1 and 6 for the ÷3 family, and must stay 6 there. x_end − x_start = width, y_end − y_start = height. Every stock window origin is even.時序表 0xC0B59500、stride 0x20;+0x0A x_start:2×2=4、1×1=8、÷3 家族=6(必須保留 6);x_end−x_start=寬、y_end−y_start=高;原廠視窗起點全是偶數。+0x40 stays nominal, and anything that reads it (shutter angle) has to be redirected.donor 時序由格式表命中時寫入,否則跑原廠速率(mode 98 = 77.267 fps)。metadata +0x40 保持標稱值,讀它的東西(快門角度)要另外導向。+0xF4/+0xF8) must equal the rows the mode actually reads, otherwise fin < req and the take cannot stop.感光元件合併只有 1×/2×/3×;畫布宣告的視窗(+0xF4/+0xF8)必須等於模式實際讀出行數,否則 fin < req、停不下來。+0x60 comes +0xD0).借 donor 必須全 ~65 欄比對;欄位在記憶體裡不照偏移排(+0x60 的下一欄是 +0xD0)。+0x030 is the nominal fps, and the buffer count comes from it. −1.0 means 0 buffers, which garbles the last frame.+0x030 = 標稱 fps,緩衝張數由它導出;−1.0 → 0 張 → 最後一幀花屏。FUN_c04357e0): +0xA4==1 gives 2; +0xA4 9/10 or +0x30 = −1 gives 0; otherwise 3. +0xA4 is the buffer class. Don't write it: 0x29 serialised the writes.張數(FUN_c04357e0):+0xA4==1→2;+0xA4∈{9,10} 或 +0x30=−1→0;其他→3。+0xA4 是緩衝類別碼,別寫(0x29 會串列化寫入)。+0x24/+0x2C must not be 0. If it is, the DNG gets DefaultCropSize (0,0) and playback crashes.active 裁切 +0x24/+0x2C 不能是 0 → 否則 DNG 寫 DefaultCropSize (0,0),回放當機。+0x90/+0xB0/+0xC0/+0xDC/+0xE4/+0xFC/+0x100.高於 60 fps 需要高速欄位 +0x90/+0xB0/+0xC0/+0xDC/+0xE4/+0xFC/+0x100。while(true). There is no ÷2, and the only 3:2-preserving combination is hbin3 + vbin3.hbin 列舉 0/1/2 = 1/3/5 抽頭、vbin 0/1 = 1/3;其他值 assert + while(true),相機當場鎖死。沒有 ÷2;維持 3:2 只有 hbin3+vbin3。out = ((rwzm>>1) + ((in+(hbin>>1))/hbin)×0x400)/rwzm. hbin divides first, then RWZM.尺寸:out = ((rwzm>>1) + ((in+(hbin>>1))/hbin)×0x400)/rwzm,先除 hbin 再除 RWZM。0x300F0908/090C). All 306 stock profiles are square.H/V 是獨立暫存器(0x300F0908/090C),但原廠 306 筆全部等比。DefaultCropOrigin has no even-only rule here.錄影尺寸 = 裁切 +16 寬 / +10 高;裁切原點 (8,5),原廠 FHD/UHD 也一樣 —— y 是奇數,所以 DefaultCropOrigin 沒有「必須偶數」的規則。(sensor − bef) >> 2 << 1 is always even, which keeps the Bayer phase.ISP 端裁切偏移 (sensor − bef) >> 2 << 1 永遠偶數,保 Bayer 相位。RowsPerStrip = H.12-bit 1.5 B/px、10-bit 1.25、8-bit 1.0;單一 strip,RowsPerStrip = H。+0xD8/+0xE0 makes the producer read +0x0C/+0x10.producer 對與消費端對必須描述同一幀;+0xD8/+0xE0 清 0 → producer 改讀 +0x0C/+0x10。desc+0x14C = 0x13800 (79,872), 512-aligned. StripOffsets = 78,848. The per-frame reserve is 0x15400 (87,040). 8-bit adds a LinearizationTable (59 tags instead of 58).檔頭區 desc+0x14C = 0x13800(79,872),512 對齊;StripOffsets 78,848;每幀保留 0x15400(87,040)。8-bit 多一個 LinearizationTable(59 個 tag,12-bit 58 個)。&0x1FF == 0, open type 0x1806); otherwise the writer uses 0x806. Allocation requests are 1024-aligned (UHD 12,638,720; OG4K 16,207,360).所有段 512 對齊(&0x1FF == 0)才走快速路徑(開檔型別 0x1806),否則 0x806;配置請求 1024 對齊(UHD 12,638,720、OG4K 16,207,360)。per_frame = roundup(round512(frame) + 0x15400, cluster) + 128. Clusters are 128 KB on SD and 512 KB on SSD.per_frame = roundup(round512(frame) + 0x15400, 叢集) + 128;叢集 SD 128 KB、SSD 512 KB。(file + 0x1FFF) & ~0xFFF, derived from the first frame. A later frame that reaches it asserts, which is what blocks compressed video.每片容量 (file + 0x1FFF) & ~0xFFF,由第一幀導出;後面讀到等於容量就 assert(這是壓縮錄影的牆)。Each of these was written down as a finding at some point. They are listed so they don't come back.
這些都曾經被當成結論寫進筆記。列出來,是為了不讓它們再回來。
+0x00/+0x04 plus 16/10.” It only correlates for the two stock sizes.「DNG 尺寸 = 設定 +0x00/+0x04 +16/+10」—— 只是兩種原廠尺寸剛好成立。0xC37CE210 is the recording geometry.” It is a cache, and reads 0 in UHD and in stream mode.「0xC37CE210 就是錄影幾何」—— 快取,UHD 與 stream 模式是 0。+0xD8/+0xE0 is a preview override; 0 means no override.” It is the producer/consumer pair.「+0xD8/+0xE0 是預覽覆寫,0 = 不覆寫」—— 是 producer/消費端那一對。+0x030: “invalid rate”, then “buffer switch”, then finally “nominal fps, with the buffer count derived from it”.+0x030:「無效格率」→「張數開關」→ 定案「標稱 fps,張數由它導出」。+0x0B0, by hook contamination; “BUFCLASS is harmless”; “req_cnt=94 is the ring size”; “turning off fast SSD recording avoids the freeze”; “angle mode proves 240”; “26 MB vs 105 MB directory = failure”.HSW:吞吐/消隱/+0x0B0/hook 污染導致凍結、「BUFCLASS 無害」、「req_cnt=94 是環大小」、「關快速錄影就不凍」、「角度模式證明 240」、「26M vs 105M 目錄 = 失敗」。0xC38250E4 is the header size” (retracted twice) and “0xC0731C18 is the header size”.「0xC38250E4 是檔頭尺寸」(收回兩次)、「0xC0731C18 是檔頭尺寸」。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 不代表寫完。Collected from the stages above, worst first:
把上面各關的未解項收集起來,照嚴重程度排:
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 是「試出來有效」,但從畫布到寫檔器心裡那個幀尺寸,中間這段沒追出來。
Blocks in-camera compression entirely. The playback capacity is derived from the first frame, which is not a worst-case guarantee.
這件事直接擋死機內壓縮。回放的容量是從第一幀導出來的,而那不是最壞情況的保證。
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 那七個高速欄位的最小集合沒有二分過。
+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 確認是幾何倍率,那只證明座標比例,跟電荷怎麼處理無關。雜訊分析把範圍縮小了,但撞到一個模型上的矛盾,沒能解掉。
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 物件的選擇器從來沒追到呼叫者。
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 讀出來的,就是在相機上驗過的。
有兩個地方舊筆記講的跟這頁相反,我都直接寫在那一關裡了。