TrueHD 的小筆記

TrueHD 無損壓縮是 Dolby 公司的另類產品之一, 杜 (Do) 老爺把原來的 MLP 壓縮方法略加擴充之後, 就讓 MLP 改了姓名. 所謂河海不擇細流故能成其深, 當今最厲害的有損壓縮演算法 HE-AAC 也這樣進了杜家的門, 並改名為 Dolby Pulse.

雖然 TrueHD 並非杜家嫡傳, Dolby 還是很別緻地把它的 pass through 方式變成一個產品.  如果不 license MAT 格式, 就無法傳送或接收 TrueHD 的 bit stream. 從學理上看, lossless 壓縮可能導致 bit rate 有極大的變化, 一個週期的正弦波只需要一點點 bit 就可以表示, 若是不把它包成 CBR (constant bit rate), 其實也很難在 HDMI 這樣的介面上傳輸.

TrueHD 的 DRC (dynamic range control) mode 可以用來調整音量, 如果 DRC = on, 那麼 DRC 就會永遠開, DRC = off 就是原樣的 lossless 輸出. 而 DRC = follow 就是根據 bit stream 裡面的描述來決定 DRC 開或是關. 

以 PS3 的舊版 FW 來說, 因為它的 DRC mode = off, 所以 PS3 解出的 PCM 硬是比擴大機的輸出小了 4dB. 由於客戶的抱怨, 新版 (> 2.41 版) 的 PS3 就把 TrueHD 的 DRC 給開了. 但是開 DRC 需要增加不少計算量, Sony 應該是調校過 FW, 才推出這個新版吧!?

3D 繪圖速成小筆記

我希望自己在最短的時間之內, 就把 3D 基本觀念搞懂. 最好只花一個 page 就可以複習. 以下就是我的筆記.

3D 繪圖方式有三種, 第一種是用線的觀念. 可以想像一個視線從投射面回溯到光源, 這稱之為 Ray-tracing. 第二種方式是把圖的表面 (surface) 分解成小塊 (patch). 而每個 patch 都有自己的光照圖 (light map), 並且輻射周圍的 patch. 這稱之為 Radiosity, 聽起來有 iteration 的感覺.

第三種方法,  稱之為 Rasterizing (光柵化), 也就是唯一適用於硬體加速的演算法. 簡單地說, 就是先得到頂點 (vertex), 然後把點連成網眼 (mesh), 其中的基本圖形是點, 線, 與三角形, 三者合稱為 primitive.

假設我們要畫的東西是一個剛體, 不會隨便就變得軟趴趴的, 那麼每個 vertex 都可以有一個相對座標值. 要把這個 object coordinate 轉到整張圖上的座標位置 world coordinate, 這就是第一個轉換. 轉到 world coordinate 還是不夠的, 因為觀察者視角的關係, 這個位體還要轉到 eye coordinate. 就好像一個魔術方塊, 不可能讓我們同時看到六個面, 座標位置當然與觀察者的角度有關.

轉完之後, 開始打光, 包括 R, G, B, alpha 四個值決定紅, 綠, 藍和透明的強度.

畫好之後, 剛才的魔術方塊又出現了. 被擋到的東西不用畫, 也不能畫. 所以要再次轉到裁切座標 (clip coordinate). 在最上層的東西, 才會畫到螢幕上 screen coordinate.

以上可以得知哪些 vertex 位於螢幕之內或是之外. 凡是落在螢幕之外的 vertex, 我們只需要畫到螢幕邊緣就好. 但任意多邊形並不是 primitive, 所以那些形狀不齊的四邊形會被分割成兩個三角形.

現在有了一堆轉換過的頂點, 接著就要把頂點所包圍的畫素 (pixel) 都找出來. 這個過程就是光柵化 (Rasterize). 還在 vertex 階段的處理稱為 front-end, pixel 等級的處理稱為 back-end.

在 pixel 的操作包括下面三者: texture (紋理), blending (混色), filtering (濾鏡), 總之就要給每個 pixel 最合理的顏色. 原先在 vertex 階段所配置的特性如何用在 pixel 上呢? 大致就是內插法. 所以原先幫每個 vertex 打光的工程, 就不需要詳細到 pixel 等級上那麼累! 真是聰明哪!

下一個階段就是要把畫好的圖貼進 frame buffer 了. 比方說要畫個眼睛在臉上, 眼睛總不能大過臉, 又不是海綿寶寶的蟹老闆. 因此要在可以畫眼睛的範圍以外塗上框框, 這個框就是模板 (stencil). 其次當然不脫後景不蓋前景, 需要更新的區域才更新等基本限制, 在真正畫出去之前, 要先做這類的測試. 例如 scissor test, alpha test, depth and stencil test 等等.

測完之後可能還有一點事情要做, 比方說 alpha belnding, 千辛萬苦之後, 一個點好不容易才可以進到 frame buffer.

講完硬體之後, 再講一點點軟體. 繪圖的 API 包括 OpenGL, 這是 ARB 推的. 還有 Direct3D, 這是 Microsoft 推的.

OpenGL 的指令分為兩種, 一種是給定 vertex 與顏色等等, 以產生圖像. 另外一種是設定對上述資料的操作. 甚至是先做一些 transform 以取得新 vertex 的座標.  基本就是只做 rendering.  

[reference]

http://www.ategpu.com/2009/05/29/interactivecomputergraphics.html

說 reference 也太牽強了, 我根本是濃縮再製版.

http://zh.wikipedia.org/wiki/OpenGL

因為不太懂又沒有時間, 所以我花 2 個小時, 寫了這個快速學習備忘錄. 謬誤之處, 請多多見諒. 等我有所成長, 再來修正這裡的不足.

 

手機電池的壽命

我的前任手機 CHT9100 似乎很耗電, 或者說是: 給它買了五六顆電池也都擋不了多久. 不論是正廠或是副廠的電池都是如此.

雖然說 HTC 給的這顆電池本來就容量偏小 (1500 mAh) , 不過…完全是電池的錯嗎? 這兩天我 survey 到一顆高容量的 9100 電池, 號稱有 2400 mAh 的能耐. 正在我覺得這顆厚電池是個很棒的選擇的同時, 我也赫然發現它的規格上有一行字說, 可以充電 300~500 次. 那.. 300~500 次究竟是多還是少呢?

雖然我已經知道鎳氫電池的壽命決定於放電是否完全? 有沒有迴避記憶效應? 但是上網看了高人的評論, 才領會到充電次數才是電池的壽命正確計算方式, 而非 6 個月或是 2 年這樣以時間為單位. 正常來說, 充電次數應該在 500~800 次才合理, 每次充電就完成一個化學作用的循環: 1000mAh 的電池以 1000mA 從沒電充電到飽. 如果以此為標準, 300~500 次就嫌少了點, 難怪業者要自行揭露, 以免產生購物糾紛.

同樣的道理, 如果我的 Notebook 都帶著充電器跑來跑去的話, 充電次數就增加了. 即使是只充到一小部分, 電池壽命應該會變短嗎? 上網再查了一下, 讓電池處於過高或過低的電壓不好, 所以有業者說, 用到一半就充電比用到光再充電好.

http://vnids0.pixnet.net/blog/trackback/4bed2258f2/10117558

http://www.gastech.com.tw/tw/Li-Battery.htm

 

Adobe Flash vs. Nokia QT

手機的功能日益強大, 愈來愈像是一台攜帶式的小電腦, 雖然它的螢幕仍舊相當地迷你, 最多不過 4 吋多一點, 但是顧客對於繪圖能力的需求顯然與日俱增, 現在 VGA 的解析度已經不能算是高標準了.

如果要在手機上玩遊戲, 至少得支援 Java. 由於 Sun 公司自己不生產手機, 因此 Java 遊戲雖多, 還是要依賴底層軟硬體的支援. 若是想要在手機上種菜偷菜, 就得靠 flash 才行. 畢竟 flash 出道已久, 以前看的賤兔動畫就是用 flash 所畫的. 至於網路 flash 遊戲更是滿坑滿谷, 我女兒也花了不少時間在上面.

由於 Android 本身就支持 Flash Lite 的插件, 所以基於 Android 作業系統的手機就具備了更多的網路瀏覽優勢, 像是 HTC Hero.

Flash 的攜帶版本 (Flash Lite) 和 PC 版本的對照如下:

http://www.adobe.com/tw/products/flashlite/version/

Flash Lite 1.1 支持 Flash 4 的遊戲與動畫

Flash Lite 2.1 支持 Flash 7 或之前的遊戲,

Flash Lite 3  支持 Flash 8 或之前的遊戲、與 Youtube. 

如果看到 F9 字樣但什麼都撥不出來, 那是正常的. 因為 Flash Lite 不支援 Flash 9.

另一方面, Nokia 基於 Symbian 的 OS, 再加上他們在 2008 年 1 月所買的 QT, 同樣可以提供高階的應用軟體. 例如 Google Earth、Last.fm、與 Skype 等等. 在瀏覽器方面, 則是支援 Opera.

Opera 雖然網路瀏覽功能一把罩, 遇到 Youtube 這種 flash 軟體, 還是要加上 Flash Lite 的插件. 如果插件被拔掉, 只剩陽春版的 Opera 就遜色多了.

整理 Symbian 與 Android 不同的地方是, Android 本身就支援 Flash Lite 插件, 而 Symbian 是靠 Opera mobile 來外加此一插件. 如果使用 QT 的 Symbian 都要擁抱 flash, 那麼 flash 的前景看起來真是相當地不錯.

[ref]

http://www.javaeye.com/topic/250275

http://news.networkmagazine.com.tw/software-application/2009/03/06/11159/

 

藍光光碟機的加密方法

在藍光的光碟片上, 有著多重的保護機制. 隨然他們已經被有心人士破解了, 但是對於 BD player 或是 BD disk 的生產廠商來說, 卻是一個不得不繼續維護的規格, 以免問題變得更嚴重. (謎之音: 會更嚴重嗎? 有抓不到的片子嗎? 僅存的功能應該說是維護正版的尊嚴吧!)

無論如何, 我們來回顧一下 BD 的保護機制. 大致上有下面三種:

AACS (Advanced Access Control System) – 主要的保護機制.

BD+ – 使得每個 title 都有唯一的 scramble 方式. Content code 存在光碟片上.

ROM Marks – 存在光碟片上, 這些加密的資料用來給 AACS engine 生成 key (金鑰). 必須是取得授權的 BD 光碟機才能夠讀出上面的資訊, 用 bit-by-bit 也無法複製此部分.

其中比較重要的顯然是 AACS, 我就先把它做個描述. 接著再補充 BD+ 的部分.

 AACS 主要是使用 128 bits AES 來加解密影音的內容, 其中需要許多步驟來生成最後的 key, 而不是大剌剌地把 key 放在某個地方. 其步驟大致如下:

1. 從光碟片的 Media Key Block (MKB) 的一堆 key 中取出符合這個 BD player 的 key. 若是某支 key 已經被 hack了 (compromised), 新版的藍光光碟就不會再存放這支 key.

2. 從 ROM Mark 所保護的區域取出 Key Conversion Data (KCD), 和 step 1 的結果生成 AES-G.

3. 從 Sequence Key Block (SKB) 取出 data 加上 Volume ID 和 step 2 的結果生成新的 AES-G.

4. 用 step 3 的結果來解 disk 上的 title key, title key 受到 ROM Mark 的保護.

5. 用 AACS 的 public key 來驗證 title key 是否合法. 如果合法, 就用 title key 來做 disk 的解密.

除了 title key 的機制之外, 不合法的 BD player 與 BD 光碟機也都有黑名單. 這個黑名單會放在新版的藍光光碟片上. BD player 與 BD 光碟機要互相查詢對方是否在黑名單裡面.

這些保護機制雖然已經層層把關, 但是 user 仍然有可能從類比輸出或是數位輸出把影音內容 "備份" 起來. 為了防堵這個漏洞, AACS 另外有 4 個方法來阻止 "小偷".

1. Analog Sunset — 類比介面的落日條款. 2010 年開始, AACS 所保護的內容只能有限制地輸出. 到了 2013 年, 就不允許再有類比輸出了.

2. Image Constraint Token — 如果 BD 裝置有類比輸出, 視訊方面要受限在 52 萬畫素以下. 也就是 1080p 顯示器上 25% 的大小.

3. Digital-Only Token — 完全禁止 video 在類比輸出上面播放的技術.

4. Audio WaterMark – 嗯, 終於講到 audio 了.

Audio watermark 的做法是在 audio bit stream 的聽不到的部分, 載入一些 data. 這樣大家應該可以知道為什麼 Dolby, DTS 要狂推 192 KHz 這種超級高頻了吧! Audio watermark 又可以分為  “theatrical” 和“consumer” 兩類. 前者表示劇場級的音效, 只要看到這個就表示這個音源是非法的, BD player 會立刻停止播出. 第二種表示音源受到 AACS 的保護, 如果沒有偵測到合法的 AACS 系統在運作, 也是立刻喊 "卡"!

最後介紹一下 BD+, 原先我們的同仁認為它是一次性的檢查, 所以沒有 implement 相關的硬體. 雖然它的確不需要硬體, 不過它可不是個省油的燈! 如果沒有預留足夠的計算量, 它也可能會成為運算的瓶頸.

BD+ 要做三件事:

1. Media Transform function: 把光碟上的資料讀出來, 在 BD+ Virtual Machine 上面做 descramble. 特別的是, descramble 的 code 不是 BD player 管的, 而是存在藍光光碟上的. 而Fix-table 是存在 AV bit stream 裡面的. 只要 playback, BD+VM 就會運作, 不是只做一次喔!

2. Counter Measure: 和 AACS 不一樣的地方在於, AACS 看到被 hack 的 BD player 會直接拒絕和它溝通. 但是根據 BD+ 的概念, 若是一台 BD player 被破解了, 這台 BD player 總會去播其他的新 BD 光碟, 而新的光碟上面就會針對這家被破解的 BD player 特別給予 "更正"! 因為 BD VM 的 code 是參考光碟上面的, 也就是 content-specific.

3. 如果第二招也無效, BD+ 採用 Native code 來做 counter measure. 如果播放的時候, BD+ 偵測到這個 BD player 已經被 hack 過, 而 native code 又存在的話, 它會改 run native code 而不是被 hack 過的 code.

基本上, 只有在 playback 的時候, BD+ VM 才會去監視 BD player 是否合法? 而 BD+ VM 偵測的方法則是專注在 memory footprint 上面, 不會竄改 BD player 的設定, 也不會收集客戶的私人資訊, 這是據說 BD+ 比較優異的地方.

[reference]

http://www.dell.com/downloads/global/vectors/brcp.pdf