顯示具有 Linux 標籤的文章。 顯示所有文章
顯示具有 Linux 標籤的文章。 顯示所有文章

2013年5月14日 星期二

如何知道程式所需要連結的函式庫

方法一:使用 ldd

$ ldd /usr/bin/python


linux-gate.so.1 =>  (0x007c4000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0x00d4c000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0x00755000)
libutil.so.1 => /lib/i386-linux-gnu/libutil.so.1 (0x00bea000)
libssl.so.1.0.0 => /lib/i386-linux-gnu/libssl.so.1.0.0 (0x00abb000)
libcrypto.so.1.0.0 => /lib/i386-linux-gnu/libcrypto.so.1.0.0 (0x00dfc000)
libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0x00110000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0x002e3000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x0030d000)
/lib/ld-linux.so.2 (0x00160000)

方法二:使用 lsof -P -T -p <Application_PID>

$ lsof -P -T -p 2047


方法三:使用 objdump -p

$ objdump -p /usr/bin/python

Dynamic Section:
  NEEDED               libpthread.so.0
  NEEDED               libdl.so.2
  NEEDED               libutil.so.1
  NEEDED               libssl.so.1.0.0
  NEEDED               libcrypto.so.1.0.0
  NEEDED               libz.so.1
  NEEDED               libm.so.6
  NEEDED               libc.so.6
  INIT                 0x08059cd4
  FINI                 0x08177ffc
  GNU_HASH             0x080481ac
  STRTAB               0x08051374
  SYMTAB               0x0804a9d4
  STRSZ                0x00006d63
  SYMENT               0x00000010
  DEBUG                0x00000000
  PLTGOT               0x0826bff4
  PLTRELSZ             0x00000cf0
  PLTREL               0x00000011
  JMPREL               0x08058fe4
  REL                  0x08058fbc
  RELSZ                0x00000028
  RELENT               0x00000008
  VERNEED              0x08058e0c
  VERNEEDNUM           0x00000008
  VERSYM               0x080580d8

如果在 ARM 的平台上,使用 objdump -p 是比較快的方式。

2013年2月7日 星期四

GCC configure : --build --host --target

從知道 Cross Compile 這個名詞以來,就看過這三個參數不知道幾次了,但除了剛開始時有想過這個問題之外,後來就沒仔細了解。這個問題是,這三個參數到底是有什麼差別?以自己的經驗,使用最多也只會的是 --host 這個參數(當要對某個程式做 cross compile 時用的),其他我還真的不了解怎麼用!今天總算對它們比較了解!

首先,根據不同的組合,它們有不同的名稱:

Native compiler: --build, --host, --target 都一樣
例:--build=x86 --host=x86 --target=x86

Cross compiler: --build 和 --host 一樣但 --target 不同
例:--build=SH --host=SH --target=ARM

Crossback compiler: --build 和 --target 一樣但 --host 不同
例:--build=x86 --host=MIPS --target=x86

Crossed native compiler: --host 和 --target 一樣但 --build 不同
例:--build=PPC --host=SPARC --target=SPARC

Canadian compiler: --build, --host, --target 都不一樣
例:--build=ARM --host=SH --target=MIPS

2012年11月30日 星期五

如何使用 MP4SetTrackESConfiguration

在使用 MP4v2 製作 .mp4 檔案時,如果你要使用的 Audio 編碼格式是 AAC,那麼你就需要使用 MP4SetTrackESConfiguration 這個函式來設定解碼需要的資料。在網路上看到的例子都是以 FAAC 編碼為居多,大多都可以參考需要的設定,設定 MP4SetTrackESConfiguration 的方式,都是先利用 FAAC 裡的 faacEncGetDecoderSpecificInfo 得到想要的資料,再傳給 MP4SetTrackESConfiguration

像這樣

faacEncGetDecoderSpecificInfo(hEnc, &Config, &ConfigLen);
MP4SetTrackESConfiguration(hFile, AudioTrack, Config, ConfigLen);

這是剛好你用的是 FAAC library,但如果你用的是別的 library 該怎麼辦呢?

2012年11月26日 星期一

MP4v2 - 製作MP4檔案格式

從接觸電腦以來,對於影片的檔案格式的區分,就只有依它的副檔名來判斷,.avi 就說它是 .avi 的影片檔,.rm 就只知道它是用 real player 播放的 .rm 檔案,.mp4 就說它是 .mp4 影片檔。不然,也是只有在用某一種播放器時,知道需要對映什麼樣的副檔名,才能看到影片的內容,像大學時很流行的PowerDVD,要看電影用它就對了,也只知道要去打開 .dat 的檔案才能看到。其它像是編碼格式,H.264、MPEG 、MP3等,那時真的不了解它們的意義是什麼?就算修了多媒體影像的課,對於那時的我來說,都只是見樹不見林的階段,一點都不知道全貌是什麼。一直到了需要自己把影片檔案,從頭到尾生出來之後,才真正了解影像聲音的編碼到底在做什麼,它為什麼一定播放器支援才能播放,為什麼沒有解碼器不能看。

一般我們所說的影片檔案格式,像 .mp4 、.avi 、.mkv 、.wmv...,它們都是“容器”,也就是說,它是用來放影像和聲音的,而影像是用什麼編碼的,或聲音是用什麼編碼的,那就看你怎麼搭配(當然,這是理論上的說法,最主要還是得看規格怎麼定),要符合它們所定的格式,對映的播放器才知道怎麼播。所以,有些播放器不能看,就是這個原因,因為它根本就不了解別的容器的意義。如果只是因為沒有安裝需要的解碼器,那還有機會可以看,只要為它安裝就行了,它和不了解容器規格的原因不同,它只是少了那個解碼器。

2012年11月13日 星期二

Linux Shell Script 空字串比較

在 shell script 中遇到一件奇怪的事,雖然了解之後也就沒什麼,但是在找問題的過程中,真的是困擾很久。因為問題是出在 Embedded System 的環境上,所以一開始看到的訊息很難猜到它大概位置,只好土法練鋼,一段一段地執行,邊執行邊找問題點。它的訊息是這樣的

sh: : unknown operand

沒有行數,沒有關鍵字元,真是不知道問題在哪!在重開了不知道幾次的機器之後,終於讓我找到問題是什麼!

#Find thd path while SD card plugin
if [ -e /mnt/sd ]; then
       mmc=`ls /mnt/sd`
fi
if [ ${mmc} != "" ]; then
       #Do something
fi

RGB to YUV(YCbCr)


比較常用 RGB 來表示顏色,很容易可以找到 RGB 的配色表。但是如果要用 YCbCr 來表示顏色該怎麼辦?本來以為也有類似的顏色表可以找,但是一直沒找到,反而找到的都是公式,如下所示

這是 RGB 轉 YUV 的公式


    Y=R*0.299+G*0.587+B*0.114;
    U=R*-0.169+G*-0.332+B*0.5+128;
    V=R*0.5+G*-0.419+B*0.0813+128;

也有 YUV 轉 RGB 的公式

    R = Y+(1.4075*(V-128));
    G= Y-(0.3455*(U-128)-(V-128)));
    B= Y+(1.779*(U-128));

如果要用,就用 Excel 或是 Google 試算表來計算,還蠻方便的!

Linux Kill 指令

一個 deamon 程式,是常駐在系統背景的程式。一旦開始啟動執行了之後,就無法用一般的方式去控制它,結束它。deamon 也是 process,所以會有 PID (Process identifier),也能透過 IPC 的方式來溝通,自然也就能送終止訊號給 deamon,或者其他的訊號讓它做別的事。

Linux Kill 指令,主要就是用來送訊號給 Process 的指令,如果想要停止某個 Process,很簡單,只要先利用 ps 指令,找到你想要終止的 Process 的 PID,就可以利用 Kill 指令去停止它。底下是利用 ps -aux 指令的執行結果。箭頭指的那一行就是 PID。


知道了PID之後,就能利用 Kill 指令,去終止 Process。
例如:Kill 2942,就能終止 PID 為 2942 的 Process

這樣的使用方式,算是比較常見的,但如果說你自己寫了一個 deamon,你希望你的deamon,在收到特定的訊號之後能依照你的要求執行,那該怎麼做?

2012年11月1日 星期四

FFmpeg tutorial practice - tutorial04

在Tutorial04裡,主要是修改一些 Coding 方式,主要使用不同的 threads 來處理 Video 和 Audio,一方面讓程式架構較模組化,另一方面是為了之後 Video/Audio 同步之用。如果有從 Tutorial01 一直實驗上來,大概要改的東西都在前面講過了,下面就列出,我花了比較久的時間的部份。

有一段程式碼是為了結束程式所要使用的

// will interrupt blocking functions if we quit!
url_set_interrupt_cb(decode_interrupt_cb);

int decode_interrupt_cb(void) {
    return (global_video_state && global_video_state->quit);
}

但是因為 url_set_interrupt_cb 在 FFmpeg-1.0 中已經不再使用了,所以要改成下面的方式

int decode_interrupt_cb(void *ctx) {
    return (global_video_state && global_video_state->quit);
}

static const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };

pFormatCtx->interrupt_callback = int_cb;

2012年10月28日 星期日

FFmpeg tutorial practice - tutorial03

能夠把Video顯示在螢幕上之後,接著繼續加入Audio,也就是 Tutorial03 的目的。(如果還沒試過 Tutorial01,請先從 FFmpeg tutorial practice - tutorial01 開始練習) 播放Audio,一樣是借用SDL(Simple DirectMedia Layer),讓你能聽到聲音。主要的概念是從檔案中讀取 Audio stream 之後,把每一個 Audio 的 Packet 掫取出來 decode,把 decode 完成的資料傳給 SDL 去做播放的動作。其中,要注意 Audio 格式能不能被 decode,也就是你使用的 FFmpeg 的 libraries 是否支援你所要用的格式,如果不支援,那一定聽不到正確的聲音的。

FFmpeg tutorial practice - tutorial02

試過了 FFmpeg tutorial practice - tutorial01 之後,接著繼續 tutorial02。Tutorial02主要是要讓 Video 能顯示在螢幕上,而 Tutorial01只是讓畫面先存起來。為了能顯示在螢幕上,必須先研究一個新的東西,叫做SDL(Simple DirectMedia Layer),它是跨平台的函式庫,主要用來處理一些低層的操作,像聲音、鍵盤、滑鼠、OpenGL 3D硬體、2D video buffer等。我也是第一次接觸這個東西,不過,如果你學會如何使用第三方的函式庫的能力之後,只要有好的文件及 Sample Code,要了解是不會太難的。

2012年10月22日 星期一

FFmpeg tutorial practice - tutorial01

FFmpeg 是很有名的 Open source software,它提供了很強大的 Libraries 可以讓你使用,如果你對內部的程式有興趣的話,還可以下載它的原始碼來仔細看看。FFmpeg 網站的文件其實還算不少,但是要能讓你有個入門的說明,真的要花時間好好研究。我在其中找到了較入門且詳細的說明文件,但是它一開始就表明了文件已經過時了,一些原本在 Sample code 裡的程式碼所用的 API 可能都已經不再使用,所以要參考的人注意。也因為這樣,自己就花了一些時間,試著重新建構 Sample code,讓它可以正常編譯且運作。 

原始的說明網站在這裡,有興趣的同好也可以去看看。它提供了8個 tutorial examples,這裡是第一個,也就是 tutorial01。如果一開始直接拿過來編譯,會出現警告和錯誤,這裡就是把這些問題解決的過程。

2012年10月13日 星期六

Linux kernel Map

想知道更多有關於 Linux Kernel 的東西嗎?已經有人幫你整理好了!
筆者也是花了一些時間才找到,因為之前看過但沒有特別記下來,還好 Google 幫了大忙。


有興趣的同好可以連結到它的網站