- 在 trace Android media player時, 常看到 function有些有加 _l suffix的, 有的沒有. e.g. prepare, prepare_l
- 主要的差異在於是否有用 Mutex lock住
- 但此時又看到神奇的 code
- /frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
-
status_t NuPlayerDriver::prepare() { ALOGV("prepare(%p)", this); Mutex::Autolock autoLock(mLock); return prepare_l(); }
- /frameworks/av/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp 因此會發出疑問, 這個 autoLock 是做什麼的? 定義卻沒有使用?
- 簡單說, 就是利用 constructor跟 deconstructor 來呼叫 mutex lock 跟 mutex unlock
- 而此處的 prepare_l 有 l結尾的應該就是指 lock後執行的程式碼
2017年12月28日 星期四
[Android] Autolock
[C++] do...while(0)
- 優點:
- block 區塊, 可以在其內宣告變數, 在像 C89需要將變數定義在最上方這方面大有幫助
- 以 do...while(0) 取代 goto, 將 goto 後的東西放 while外面, 裡面用 break來達到 goto的效果
- 程式碼易讀且效能並沒損失
- 避免 marco 沒有加 {}, 又接在 if() 單行執行內容有分號的 case
- e.g.
#define swap(x, y) int temp; temp = x; x = y; y = temp;
if(x > y) swap(x, y);
- Reference:宏定义中使用do{}while(0)的好处
2017年12月27日 星期三
[C++] Coding convention - prefix k and What
- trace Android code時, 常會看到如下的 code
enum { kWhatSetDataSource = '=DaS', kWhatPrepare = 'prep', kWhatSetVideoSurface = '=VSu', kWhatSetAudioSink = '=AuS', kWhatMoreDataQueued = 'more', kWhatConfigPlayback = 'cfPB', ...
- 這個 k代表什麼意思呢? => konstant, 因為 c的 prefix 已經被 char 用掉了, 用了 Germany的 konstant, 至於全大寫與 Hungarian notation 就不在這戰了
- 至於 What, 則猜測這些 enum 主要是用來在 message中傳遞, 對應 message.what 的 int值, 所以在 handler中常會看到自行定義的 enum 用 kWhat當 prefix
- 節錄 Android doc Message.what
-
what int what User-defined message code so that the recipient can identify what this message is about.
Each Handler has its own name-space for message codes,
so you do not need to worry about yours conflicting with other handlers.
[Android] DISALLOW_EVIL_CONSTRUCTORS
- 簡單的 macro, 用來避免未實作的 copy constructor 跟 assignment constructor 被 compiler實作
- Code
#define DISALLOW_EVIL_CONSTRUCTORS(name) \
name(const name &); \
name &operator=(const name &) /* NOLINT */
- Sample: ABuffer.h
struct ABuffer : public RefBase { explicit ABuffer(size_t capacity); ABuffer(void *data, size_t capacity); ... private: DISALLOW_EVIL_CONSTRUCTORS(ABuffer);
- Reference:
[Android] Media Player
- State Diagram
- fixme later: 補 initialized/prepared/stopped 的 state diagram
- stagefright/NuPlayer
- fundamental design
- ALooper/AMessage/AHandler
- Interface
- content source/demuxer/decoder/render (driver)
- Reference:
2017年12月25日 星期一
2017年12月14日 星期四
[C Programming] strong v.s. weak symbols
- weak symbol 可以不用 definition
- strong symbol 可以取代 weak symbol
- 預設皆為 strong
- 用法: __attribute __((weak)) or #pragma weak
- 用 nm tool 來看 symbol table
2017年12月9日 星期六
2017年12月8日 星期五
[Android] Nougut with Raspberry Pi
- sync code
- platform: android
- Q & A:
- sync size 太大 (不確定整個 size 是多少? 看起來應該不少於 45GB)
- 可以用以下指令抓取
repo sync -c --no-tags --no-clone-bundle
- 其中最主要是 -c: 只抓目前 branch
- 更多細節可以查看
repo help sync
- Ref:
- Reference:
[Android] sync code
- version control tools
- repo
- 簡介: 主要靠 Manifest 來記錄 remote, remote url, 各 project revision等資訊. Manifest 為一個 XML格式的檔案, 記錄各 project git 資訊, 預設的檔案名稱是 default.xml
- 用法:
repo init -u mainfestURL -b branch
- 通常第一步即透過 mainfest 的 URL得到想要的 manifest資訊, 會產生一個隱藏資料夾 .repo, 通常也可以製作 snapshot.xml
repo sync
- 通常緊接於 repo init 或是透過 snapshot init後, 需要由 repo 通知各 project 進行 git checkout的動作
repo upload
- 較少用到, Manifest 裡 remote 的欄位有設 review url的話, 便會進行 git push 的動作.
- git
git checkout -b localBranchName remoteBranchName
git commit
git commit --amend
可修改最後一次 commit的內容git push
將 change 上到 remotegit pull
sync .git 的資訊, 更新 metadata, 檔案等尚未進行 sync- 與 repo 可以整合應用, e.g.:
repo forall -c 'git checkout branch'
git config
設定 git的 configuration, 通常用在設定 user name跟 e-mailgit add fileName
git reset
僅更改 file status
git checkout
會重新抓檔案
git update-index --chmod=-x fileName
git diff (--cached)
git status
非常常用, 看各個檔案目前是在什麼 status: tracked, untracked,...- Sync Android code
- Setup repo
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
- Setup git
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
- P.S.: 若是在 synology nas上操作的話, 可能遇到
error: could not lock config file /var/services/homes/yourName/.gitconfig: No such file or directory
的問題 repo init -u https://android.googlesource.com/platform/manifest
repo sync -j8
- Reference: Downloading the Source
[Android] architecture
- Linux kernel (GPL license) (aosp中並沒有包含 kernel source code)
- Hardware Abstract Layer (HAL) (Android license: Apache license)
- user space C/C++ library layer
- defines interface that Android requires hardware drivers to implement
- separates Android platform logic from hardware interface
- Native C/C++ libraries (library and runtime): OpenMAX AL, libc, OpenGL ES, Media Framework, WebKit
- Java API frameworks (application frameworks): View System, Content Provider, Activity, ...
- System Apps
- Tools
- repo
- cutilies
- make, ...
2017年11月29日 星期三
[Profiling] DS-5
- What is ARM DS-5?
- Install
- .config: 建立 kernel config, timer, interrupt, tracers
- *.ko:
- gator:
- gatord:
- download ARM DS-5
- Reference:
[Development] using GNU development tools
- SOP
Configure
Build
- universal binary:
- build flag: e.g.
--arch ppc --arch i386
Install
[Node.js] framework: Express
- library
- $npm install express -g
- binary generator
- $npm install express-generator -g
- Usage
- generate template app
- $express --view=ejs sampleExpress
- install dependencies:
- $cd sampleExpress && npm install
- run the app
- $DEBUG=sampleExpress:* npm start
- validate
- jshint
- generate template app
2017年11月25日 星期六
[Kernel] Linux kernel debug
- 技巧
- 用 printk dump messages to console
- 簡單好用, 行為類似 printf, 不過這會改變 kernel行為 (例如: 執行速度變慢, 使得 race condition 行為不一致)
- 可同時更改 ring buffer size (更改 kernel boot parameter: log_buf_len), 避免 log的訊息被裁斷
- 更改 log level, 預設為 KERN_WARNING, e.g. 開啟所有 log: , 並刪除 boot parameters: quiet, splash (runtime 查看 boot parameters:
- 用 gdb
- disassemble function codes
-
gdb vmlinux
(gdb) dissemble functionName - locate core dump:
gdb crashed_function_obj, e.g. gdb sd.o
(gdb) list *(backtrace_func_shown+offset), e.g. list *(sd_remove+0x20
- 用 objdump
objdump -SdCg sample.o
- ToDo: add2line 指令介紹, ELF 格式介紹, study Kernel Debugging
- Reference
cat /proc/cmdline
)echo 7 > /proc/sys/kernel/printk
2017年8月27日 星期日
[Mac] Code sign for gdb
- 在 Mac上以 MacPort 安裝 gdb 後, 會顯示
gdb has the following notes: You will need to codesign /opt/local/bin/ggdb See https://sourceware.org/gdb/wiki/BuildingOnDarwin#Giving_gdb_permission_to_control_other_processes for more information.
- 請按照網頁所列方法為 gdb 做 code sign. 否則在 gdb run的時候會顯示以下 error message:
Unable to find Mach task port for process-id 72241: (os/kern) failure (0x5). (please check gdb is codesigned - see taskgated(8))
2017年8月16日 星期三
[Security] DRM - Digital Right Management System
- 契機
- 最近在看 ATSC3.0 的 standard, 其中一部分 A/360 Security 問到關於 content protection 的部分, 整個被問倒, 只好好好筆記一下如何做到 content protection. 先來看看 ATSC3.0 定義的 content protection 在哪一層. 有此圖可知, 這是 based on ISO-BMFF 的 format
- Content Protection
- standards
- W3C Encrpyted Media Extension (EME)
- What: a Javascript API to enable
- Who:
- W3C defined
- a web application exchanges decryption keys
- MPEG Common Encrypted (CENC)
- What: ISO-BMFF format (e.g. mp4 container) 若要使用 DRM, 則需要 CENC, 可想成此規範定義了 ISO-BMFF 支援 DRM時, 需要在那些 box 定義 DRM 相關的 parameters, namely, Protection System Specific Header Box (pssh)
- Who:
- scrambling system
- ISO-BMFF file
- Where:
- When:
- Why: for DRM system
- How:
- only encrypts media samples, and keep metadata un-encrypted
- DRM comparison
2017年8月15日 星期二
2017年8月2日 星期三
[Notes] Linux Devices Drivers 3Ed.
- Books: Linux Device Drivers
- Ch1. Introduction
- 說明驅動程式的角色
- 設計原則: 提供機制 (mechanism)-要提供什麼能力, 而非法則 (policy)-如何使用這些能力
- Kernel 概論
- Module
- Device分類: character device, block device, network interface
- Ch2. Module
- Kernel preparation
- Download Linux Kernel source codes
apt-get source linux-image-unsigned-$(uname -r)
sudo apt-get install libncurses-dev flex bison openssl libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf
cp /boot/config-4.15.0-91-generic .
make menuconfig
make -j 16 clean
make -j 16
- build -
- include kernel headers (/usr/src/linux-headers)
- make file - obj-m
- sample module file
#include#include MODULE_DESCRIPTION("Hello_world"); MODULE_LICENSE("GPL"); static int hello_init(void) { printk(KERN_INFO "Hello world !\n"); return 0; } static void hello_exit(void) { printk(KERN_INFO "Bye !\n"); } module_init(hello_init); module_exit(hello_exit);
PWD := $(shell pwd) KVERSION := $(shell uname -r) KERNEL_DIR = /usr/src/linux-headers-$(KVERSION)/ MODULE_NAME = hello obj-m := $(MODULE_NAME).o all: make -C $(KERNEL_DIR) M=$(PWD) modules clean: make -C $(KERNEL_DIR) M=$(PWD) clean
insmod hello.ko dmseg
- header: 重要 headers: linux/init.h, linux/module.h 含有後面要用到的 marcos
- license
- module_init()
- module_exit
- module_param(parameterName, type, permission)
2017年7月15日 星期六
[Kernel] Portal
- Tool:
- trace kernel: LXR
- Steps
- Environment setup
- source code
- architecture
- fetch: apt-get source linux-image-$(uname -r)
- sources.list -> 可能需要 uncomment /etc/apt/sources.list 中 deb-src 的 #, 並且做 apt-get update
- build
- 推薦書目:
- Linux Kernel in a nutshell
- Understanding the Linux Kernel
- Professional Kernel Architecture - 中譯本: 深入探索 Linux 核心架構
- Linux Kernel Development - 中譯本: 精通Linux核心開發 : 設計與實作Linux核心的權威指南
- Understanding Linux Network Internals - 中譯本: Linux 網路原理
- Linux Device Driver - 中譯本: Linux驅動程式
- Essential Linux Device Driver - 中譯本: Linux 驅動程式開發實戰
- Debugging Linux Systems
- Linux 鳥哥的私房菜
- Reference:
[Git] Portal
- What is Git?
- 分散式版本控制軟體
- 利用 40 bytes的 hash key當作每次 commit ID
- stages
- 每次皆儲存完整內容, not diff
- 名詞
- hash
- commit
- repository (remote, local)
- branch
- HEAD
- pointer to latest commit of current branch
- Q: reference, rebase, cherry-pick?
- parent -> 延伸至哪個 version
- 行為
- clone
- checkout
- commit
- 修改 commit:
git commit --amend
- push
- pull
- 從 remote 抓取各版 merge成新的 commit
- fetch
- 與 pull的差異是, 僅抓取 remote的 log, 不 merge
- merge
- fast forward (branch 合回 master, 且 master 未更改)
- non-fast forward, merge into a new commit
- rebase, branch的修改會串到 master 後面
- Merge (From 連猴子都懂的 Git 入門指南)
修改內容的歷史記錄會維持原狀,但是合併後的歷史紀錄會變得更複雜。 - Rebase
修改內容的歷史記錄會接在要合併的分支後面,合併後的歷史記錄會比較清楚簡單,但是,會比使用 merge 更容易發生衝突。 - e.g. git checkout br3
- git rebase master
- 在 master 後面再串上 br3
- stash
- blame
- 可以 line-by-line 秀出各 commiter
- 教學
- 設定
- .gitignore
- filemode
- 常看到 git diff 只差在 old mode 100644 與 new mode 100755
- 可以利用 git config core.filemode false 來隱藏這些錯誤
- workspace config, user config, global config
- 可搭配 Google 的 Tool repo 進階 checkout 多個 repository 對應的特定版號, 以 manifest做管理 (xml format), 或是 snapshot.xml 做管理
2017年7月1日 星期六
[Raspberry Pi] Portal
- What is Raspberry Pi?
- single-board computer
- Boards
- RPi 1 model B
- RPi 3 model B
- SoC: Broadcom BCM2837 (VideoCore API)
- CPU: Quad Core 1.2GHz 64bit
- GPU: Dual Core VideoCore IV® Multimedia Co-Processor; Open GL ES 2.0; hardware-accelerated OpenVG; 1080p60 H.264 high-profie decode
- WiFi: Broadcom BCM43438
- communication interface GPIO
- Serial Port
- RS232
- SPI (Serial Peripheral Interface)
- Model comparison
- Tutorial
- Software
- toolchain
- bootloader
- kernel/driver/rootfs
- image
- application
- Connection
- Reference
[Raspberry Pi] toolchain
- Compiler
- compile option
-Ofast -mfpu=vfp -mfloat-abi=hard -march=armv6zk -mtune=arm1176jzf-s
[RPi] Raspberry Pi
- Software
- Boot process
- first stage bootloader
- 在 GPU SoC中, 無法修改, 會去 mount SD card 上的FAT32 filesystem
- second stage boot-loader (bootcode.bin) - only released by binary
- retrieve GPU firmware in SD card, and starts the GPU
- GPU firmware (start.elf) - only released by binary
- GPU starts up CPU
- additional fixup.dat will check SDRAM partition
- User codes
- any binaries, e.g. kernel image (kernel.img), U-Boot, bare-bone applications
2017年6月16日 星期五
[License] GPL v.s. LGPL & GPL in Linux
- 簡單比較
- GPL:
- 保護 application
- 較嚴苛
- release binary時, 需要 release source code
- 僅為執行(非修改)此 binary使用, 不用 release source code
- LGPL:
- 保護 library
- 較寬鬆
- dynamically or statically link則無限制
- 在 kernel 上所執行的使用者應用程式都不受 GPL制約
2017年5月30日 星期二
[Company] 清算流程
- 就一人有限公司而言, 基本流程如下
- 向經濟部申請公司解散登記 (必須推舉清算人)
- 向稅捐機關註銷營業與稅籍登記
- 向稅捐機關申報所得稅決算
- 清算人向法院聲請就任清算人
- 申報股利盈餘分配扣繳
- 向稅捐機關清算所得稅
- 清算人向法院聲請清算完結
- Ref:
2017年4月10日 星期一
[Mantis] enable due date
- if you use google cloud deployment to deploy bitnami mantis service
- use ssh to login shell
- edit /opt/bitnami/apps/mantis/htdocs/config/config_inc.php
- add following lines in config/config_inc.php
$g_due_date_update_threshold = DEVELOPER; $g_due_date_view_threshold = REPORTER;
2017年2月25日 星期六
[Project] Jarvis
- 看到 Mark Zuckerberg 在 2016 年完成的 project Jarvis, 整個熱血沸騰. 希望今年有時間也來摸一下吧! 看了一下他設計的架構圖如下
- 看起來滿多細節與技術在裡頭, 譬如光 User Interface 就沒列到喇叭與麥克風, 應該是認為 iOS Voice App 就代表跑在手機上, 而這兩者手機都有!? 但, Language Processing 就可能分成 pre-process (e.g. Speech-to-Text), recognition( 其中包含 semantics analysis等), 看起來有點籠統, 喇叭的輸出應該也有 TTS(Text-to-Speech) 才是, Morgan Freeman的聲音不知是預錄的, 還是有特定的 TTS engine組合而成.
- 若要實作上面的系統, 目前手邊資源: iPhone, Raspberry Pi, 電視, USB camera, 預計架構為: USB camera (including Microphone) 作為 Input, 串接到 Raspberry Pi (RPi), RPi 作為 Server, 上面含有 AI system做任何判斷, 再以 HDMI 串接電視, 作為聲音與影像的輸出. 另外就是應用面的思考了. 360 camera+房仲系統?
- 既有軟體
[Mac] 清除 Mail 相關檔案
Mac OSX Sierra 在 System Information.app (系統資訊) 中加入了儲存空間管理 (Command + U)的功能, 但滿常看到, "郵件" 裡面有許多正在使用的儲存空間, 卻無法移除(如下圖)
可以到 ~/Library/Mail/V4/ 底下, 將一些數字ID的資料夾清除即可.
2017年1月22日 星期日
[Mac] read & writer NTFS by ntfs-3g
- 以前利用更改 /etc/fstab 或是利用工具 Paragon NTFS 來達成, 但在沒有購買軟體的情形下, 還是參考使用了 ntfs-3g
- 從癮科技的教學來看, 需使用 NTFS-3G+Fuse For OSX + fuse_wait, ...但我第一步下載安裝就一直給我顯示版本錯誤了, 後面提的
mount -t ntfs-3g /dev/disk2s5 /Volumes/mountPoint
我也失敗, 就先放棄這作法惹(我的理解, 安裝完應該要有/sbin/mount-ntfs03g
之類的才是...) - 以下是我嘗試後, 目前可用的作法
- 從 MacPort 安裝
sudo port install ntfs-3g
- 查詢要 mount的 ntfs disk並先 unmount, 最後 mount到 newMountPoint
diskutil list diskutil unmount /dev/disk2s5 sudo ntfg-3g /dev/disk2s5 /Volumes/newMountPoint
- Reference
2017年1月17日 星期二
[Toolchain] Autotools & CMake
- Autotools
- autoconf, automake, libtools
- Note: Mac OSX 自 XCode 4.3之後, 沒有內建這些 autotools了. 可以透過 port install autoconf automake
- Open source 三部曲
- ./configure
- 產生 Makefile 及 config.h (所以程式中盡量少用 config.h)
- make
- make install
- flowchart
- 利用 autoscan 建立 configure.ac (舊版 autotool叫做 configure.in)
autoscan mv configure.scan configure.ac
- 產生範本 configure.scan, 自行更名為 configure.ac供後面 autoconf使用. 同時會產生 autoscan.log (但成功的狀態似乎沒填任何東西, 要看過程反而是要用 autoscan --verbose來看)
- 從 verbose可以看到這個 autoscan做了些什麼事, 從掃描 source files開始, 會以目前執行的 directory 當作 srcdir, 分別掃描 cfiles, makefiles, shfiles, 以及瀏覽用到的 function, header, install 及相關變數 lists, 如下 samples (可自行以 open source project 驗證, 或如 reference裡用的 LilyTerm來練習)
autoscan: srcdir = . cfiles: src/console.c src/console.h src/data.h src/dialog.c src/dialog.h src/font.c src/font.h src/lilyterm.h src/main.c src/main.h src/menu.c src/menu.h src/misc.c src/misc.h src/notebook.c src/notebook.h src/pagename.c src/pagename.h src/profile.c src/profile.h src/property.c src/property.h src/window.c src/window.h makefiles: data/Makefile po/Makefile shfiles: src/unit_test.sh function: bzero: src/main.c:314 memset: src/menu.c:1995 src/menu.h:29
vi configure.ac
- configure.ac 基本上就是個 script, 只是裡面呼叫非常多 macros以利 m4 (GNU Marco Processor) 處理, e.g. AC_*( ), 其中 [ ] 為區隔字元, 以及 AC prefix代表 AutoConf 相關 marco; AM_*代表 AutoMake相關marco. 另外注意, macro名稱與左括號 ( 中間不要有空格, e.g. AC_PREREQ([2.69]) 而不是 AC_PREREQ ([2.69])
- #為註解
- 未更改
-
# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) AC_CONFIG_SRCDIR([src/console.c]) AC_CONFIG_HEADERS([config.h]) # Checks for programs. AC_PROG_CXX AC_PROG_CC AC_PROG_INSTALL AC_PROG_MAKE_SET # Checks for libraries. # Checks for header files. AC_PATH_X AC_CHECK_HEADERS([fcntl.h locale.h stdlib.h string.h sys/socket.h unistd.h]) # Checks for typedefs, structures, and compiler characteristics. AC_TYPE_PID_T # Checks for library functions. AC_FUNC_FORK AC_CHECK_FUNCS([bzero memset setenv setlocale socket strcasecmp strstr]) AC_CONFIG_FILES([data/Makefile po/Makefile]) AC_OUTPUT
- 利用 Autotools來建立 Makefile檔案
- Porting UNIX/Linux Applications to OS X
- A tutorial for porting to autoconf & automake
- front-end of make
- CTest
- 目的: 簡化 compile, install linux software to Mac. 可想成 apt-get, 即為 command line based package management
- 操作: port install, port search, port contents
- 通常會放在 /opt/local 底下
- 亦可透過 pkg-config --cflags port, 找到需要的 installed port header與 library
2017年1月15日 星期日
[Blog] 在 blog 中張貼程式碼
- 原理:
- 以 HTML的 pre tag來實作, 如 HTML裡的 <img> 表示圖片、<h1>表示等級1的header等等, pre表示的是 pre-formatted text, 會以定寬字型以及保留空格與換行的方式來處理。
- 設計特別的 class 來指定這些程式碼, 如 Google 的 prettyprint
- 設計 CSS 來 highlight畫面
- 利用 javascript 來做是否為keyword等字的判斷, 來highlight特別的字 (每個語言都有自己的 keywords, 如: class、printf 等等, 這些 keywords因語言不同而不同, 所以應該也要有對不同語言提供不同 keywords highlight的功能)
- 方法:
- 載入上面提到的 CSS (以blog-替程式碼上色提供的 sample為例)與 Javascript (以 Google Code Prettify 為例)
- 在 Blogger中, 新增 HTML/Javascript 小工具
- 在自己的程式碼中輸入程式碼區塊
- 指定為 pre block, 並指定 class 與特定 config (例如特別的語言: lang-*, support list, 或是顯示行號的 linenum)
<pre class="prettyprint lang-cpp linenums">code snippet</pre>
- 需要注意的是, 這邊的 code snippet要經過處理, 也就是有經過 escape符號預處理, 簡單來說, 通常任何程式語言都會有 escape characters, 簡單就是用以告知 compiler/interpreter, 你就是要用該符號, 例如: printf的語法是 printf("what you want to print"), 但你就是要 print 引號 (")的時候怎麼辦咧? 就是加入 escape character (\), 而在 HTML則是輸入 < > 等等, 不過也有網頁服務直接幫你轉換 => HTMLEscape .net
- 另外, 也有很多類似的相關 js 可以套用, 如 SyntaxHighlighter
<style type='text/css'> .pre-highborder{ border: 1px solid #ff0000; padding: 3px 3px 3px 0; } pre.prettyprint, code.prettyprint { border-radius: 8px; -moz-border-radius: 8px; -webkit-border-radius: 8px; padding: 5px; overflow: auto; background-color: #eee !important; color: black; box-shadow: 0 0 5px #999; -moz-box-shadow: 0 0 5px #999; -webkit-box-shadow: 0 0 5px #999; } /*font*/ pre span, code span { font-family: 'Consolas', 'Courier New', 'Microsoft JhengHei', sans-serif !important; font-size: 12px !important; } /*each line*/ li.L0, li.L1, li.L2, li.L3, li.L4, li.L5, li.L6, li.L7, li.L8, li.L9 { margin: 0 !important; padding: 2px 0 2px 4px !important; list-style-type:decimal !important; border-left: 1px solid #999; } /*even line*/ li.L1, li.L3, li.L5, li.L7, li.L9 { background-color: #f6f6f6 !important; } /*odd line*/ li.L0, li.L2, li.L4, li.L6, li.L8 { background-color: #FFF !important; } /*line-number background color*/ ol.linenums { color: black; background-color: #eee; margin-left: 10px; } </style> <script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"> </script>
- 當然也可直接使用網站服務
- Reference
2017年1月14日 星期六
[Codec] Video Codec 參考書目
覺得不錯的參考書目:
- H.264 and MPEG-4 Video Compression
- 雖然年代有點久, 但內容滿適合入門以及了解相關知識,包含簡述codec 發展歷史、codec 觀念 (Chapter Video Coding Concept - 包含 block diagram, e.g. DPCM/DCT video encoder/decoder架構)及 standard相關細節 (e.g. Chapter H.264/MPEG4 Part 10)
- Video Demystified
- 比較偏向訊號面來講解, e.g. 數位訊號(e.g. PAL, color space)、廣播制式(e.g. DVBC/ATSC)
- Next Generation Video Coding and Streaming
- 以 HEVC為主, 滿 spec. 導向, 另外在 container(e.g. mp4, ts), 以及 streaming 著墨較多
以上是目前覺得不錯的書目, 由於工作需要, 所以開始 K相關技術, 若有相關技術可以分享交流, 甚至一起來個讀書會. 都非常歡迎 feedback哦
訂閱:
文章 (Atom)