2026年7月2日

藉由 DSC_TotalChunkKBytes(快取硬體上限)與 DSC_MaxSlices(核心分割上限)的交集,共同計算出壓縮後的「目標每像素位元數

 在 HDMI 2.1 訊號傳輸中,發送端(如顯示卡)與接收端(如螢幕)並不是直接溝通「壓縮成 1/2 或 1/3」這種比例概念,而是透過將畫面切碎,並藉由 DSC_TotalChunkKBytes(快取硬體上限)DSC_MaxSlices(核心分割上限)的交集,共同計算出壓縮後的「目標每像素位元數(Target bpp, Bits Per Pixel)」

當目標 bpp 被確定後,它與原始未壓縮影像的 bpc(Bits Per Component,例如 8-bit 或 10-bit 色深)進行對比,就會精準落入 1/2、1/3 甚至 1/4 的壓縮能力區間。
以下為這兩個參數相互作用,最終合併決定壓縮能力的完整拆解:

第一步:理解基本換算關係(bpp 與壓縮比)

我們常說的 1/2、1/3 壓縮能力,在 DSC 技術中對應的是硬體能處理的最低 Target bpp 限制。
以常見的 RGB 4:4:4 / YCbCr 4:4:4 格式為例(一個像素由 3 個顏色通道組成):
  • 原始 8-bit 色深 = 原始一個像素佔用 24 bit (8-bit × 3)
    • 若要達到 1/2 壓縮:壓縮後的目標必須降至 12 bpp
    • 若要達到 1/3 壓縮:壓縮後的目標必須降至 8 bpp
  • 原始 10-bit 色深 = 原始一個像素佔用 30 bit (10-bit × 3)
    • 若要達到 1/2 壓縮:壓縮後的目標必須降至 15 bpp
    • 若要達到 1/3 壓縮:壓縮後的目標必須降至 10 bpp

第二步:兩個參數如何合力「卡死」bpp 上限?

接收端的硬體解碼線緩衝區(Line Buffer)是固定的。在點亮某一條水平掃描線時,硬體必須保證把所有被切碎的 Slice 數據全部塞進暫存區。
核心的硬體限制公式如下:
$$\text{單條線所需的總傳輸數據量} \le \text{DSC\_TotalChunkKBytes} \times 1024 \times 8 \text{ (bits)}$$
當顯示卡要計算這條線能用多高的 bpp(也就是多高的畫質)進行壓縮時,會受到這兩個參數的雙重夾擊:

1. DSC_MaxSlices 限制了「最小切片寬度」

DSC 規定一個 Slice 的水平寬度(Slice Width)不能無限大,因為晶片並行處理能力有限。
  • 假設螢幕水平解析度為 $H_{\text{active}}$(例如 4K 的 3840 像素)。
  • 顯示卡會根據螢幕宣告的 DSC_MaxSlices,計算出每個 Slice 的基本寬度:
    $$\text{Slice Width} = \frac{H_{\text{active}}}{\text{實際使用的 Slices 數量(不超過 DSC\_MaxSlices)}}$$
  • 例如:3840 像素 / 4 個 Slices = 每個 Slice 寬度 960 像素。

2. DSC_TotalChunkKBytes 限制了「每個切片的位元數」

在 DSC 語法中,一個 Slice 的水平像素壓縮後會被封裝成一個 Chunk(數據塊)
為了讓硬體不溢流,所有 Slice 的 Chunk 大小加起來,不能超過 DSC_TotalChunkKBytes
$$\text{每個 Chunk 的最大 Bits 數} = \frac{\text{DSC\_TotalChunkKBytes} \times 1024 \times 8}{\text{實際使用的 Slices 數量}}$$

3. 兩者合併求出 Target bpp

把上面兩個限制結合,就能算出每個像素在被壓縮時,硬體所允許的最大目標 bpp(Target bpp)
$$\text{Max Target bpp} = \frac{\text{每個 Chunk 的最大 Bits 數}}{\text{Slice Width}} = \frac{\text{DSC\_TotalChunkKBytes} \times 8192}{H_{\text{active}}}$$
💡 關鍵發現:當我們把公式展開,實際使用的 Slices 數量被消去了。這意味著:DSC_TotalChunkKBytes 與螢幕的解析度寬度 $H_{\text{active}}$ 直接決定了這台螢幕最高能承受多大的 bpp 能力!
DSC_MaxSlices 則是在背後當守門員,確保在超高解析度下,有足夠的硬體並行核心(Slices)去把頻寬拆小消化。如果 DSC_MaxSlices 太小,即使緩衝區夠大,晶片也來不及解碼。

第三步:實例模擬(以 4K 畫面為例)

我們來看看硬體宣告不同的 DSC_TotalChunkKBytes 時,如何改變壓縮能力。
假設我們要在 4K(水平 3840 像素)10-bit 色深(原始 30 bit/pixel) 的螢幕上開通 DSC:

情況 A:硬體配置較低(只能做到約 1/2 壓縮)

  • 螢幕宣告:DSC_TotalChunkKBytes = 32 KBDSC_MaxSlices = 4
  • 帶入公式算最大允許 bpp:
    $$\text{Max Target bpp} = \frac{32 \times 1024 \times 8}{3840} \approx \mathbf{68.26 \text{ bpp}}$$
  • 解讀:硬體緩衝區上限允許非常高的 bpp,但 DSC 標準規定的最高目標壓縮 bpp 通常為 12 或 15(以滿足 VESA 視覺無損標準)。此時硬體限制完全不是瓶頸,顯示卡可以從容地選擇 15 bpp(將 30-bit 壓縮成 15-bit,即精準的 1/2 壓縮),提供極高畫質。

情況 B:硬體配置極度受限(被迫進入 1/3 或 1/4 強制壓縮)

  • 螢幕宣告:DSC_TotalChunkKBytes = 4 KB(極小的快取),DSC_MaxSlices = 4
  • 帶入公式算最大允許 bpp:
    $$\text{Max Target bpp} = \frac{4 \times 1024 \times 8}{3840} \approx \mathbf{8.53 \text{ bpp}}$$
  • 解讀:此時因為硬體緩衝區太小,算出來的限制值卡在 8.53 bpp
  • 結果:顯示卡被逼無奈,絕對不能使用 1/2 壓縮(15 bpp),因為會撐爆緩衝區。它必須向下尋找 DSC 規格內支援的更低檔位,選擇 8 bpp 進行編碼(將 30-bit 壓縮成 8-bit,即 1/3.75 壓縮,逼近 1/4 壓縮)。

總結

發送端在讀取 EDID 時的決策鏈如下:
  1. 看解析度寬度與 DSC_TotalChunkKBytes 算出這台螢幕在硬體上最高承受的 bpp 上限
  2. DSC_MaxSlices 決定要橫向切成幾個區塊來並行解碼。
  3. 根據算出的 bpp 上限,在 VESA DSC 標準定義的檔位中(如 8 bpp, 10 bpp, 12 bpp 等),選擇一個符合當下 HDMI FRL 頻寬、且不超過硬體上限的數值。這個數值就直接定義了當前是運作在 1/2、1/3 或更低的壓縮比率。
如果想要進一步了解在特定解析度(例如 8K @ 60Hz)下,如何逆推這兩個參數在 EDID(SCDS 暫存器) 的正確填寫數值,請告訴我!

2026年6月25日

displayport spec 中提道的 SCR 是什麼?

 在 VESA 組織制定的 DisplayPort (DP) 規格書與相關測試規範(CTS)中,SCR 代表的是 Specification Change Notice(或 Specification Change Request,即規格變更通知/請求)。 [1, 2]

2026年6月10日

windows 11, 如何以簡單的 script 一次設定一堆副檔名的程式如 windows 95 的 HKEY_ROOT\xxxxx ?

 在 Windows 11 中,微軟為了安全防護(防止惡意軟體私自篡改預設程式),已經無法像 Windows 95 那樣,單純透過修改 HKEY_CLASSES_ROOT 登錄檔(Registry)就直接改變預設關聯。現在如果直接改登錄檔,系統會因為雜湊值(Hash)不符而失效或跳出重設提示。

目前最簡單、有效且不需要第三方工具的大量設定方法,是使用 Windows 內建的 PowerShell 指令搭配 XML 設定檔

上面 GetObject 的第一個參數未提供,是什麼? On Error Goto 0, 是什麼意思?

 這三個問題都問到了 VBS 核心控制的關鍵。以下為您用最簡單、直白的方式逐一解答:

一個既存的 word 程式,可以用 VBS 進行介入將其存檔關閉嗎?

 是的,完全可以。你可以透過 VBS (VBScript) 的 GetObject 函數,直接「介入」並控制電腦中已經在執行(既存)的 Word 程式,將所有開啟的文件自動存檔並關閉。 [1, 2]

請參考下方的範例與操作步驟。

2026年6月4日

Python Code 打包成 exe

打包成 exe

2026年6月3日

IT6616 Linux V4L2 driver


在 Linux 嵌入式系統中,

2026年6月1日

在 C 語言中如何使用 regular expression 進行搜尋與替代?

在 C 語言中處理正規表達式不像 Perl 或 Python 那樣有豐富的語法糖或內建高階函式。C 語言標準函式庫(POSIX 標準)只內建了搜尋功能(regcomp, regexec),沒有內建替代(Replace)功能

2026年5月31日

我在 perl 工作 30 年,現在學習 python 所以比較一下


三十年的 Perl 資歷是非常深厚的底蘊!Perl 作為文字處理的文字堂級語言,其正規表達式(Regex)已經深入到語言的骨髓裡(語法糖非常甜);而 Python 則是將其收納在內建的 re 模組中。
為了讓您能將三十年的 Perl 功力無縫平移到 Python,我幫您整理了一份 Perl vs Python Regex 核心語法對照表

2026年5月29日

VSCODE 如何只替代所選區域或全部?

 在 VS Code 中,您可以自由選擇將替代範圍限制在特定選取區域或套用到整份檔案(全部)