ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2010年9月30日 星期四

browse git url content

這一頁寫的,原來用 http://git.kernel.org/?p=linux/kernel/git/stable/linux-2.6.33.y.git;a=summary 可以看到 git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-2.6.33.y.git 的內容

筆記: 先前說明 . on building android bsp..

以 ubuntu (debian) 系統為準 --- 都是 command line.. 實做示範
  • cd , ls
  • less , | (space and q), 2>&1 | tee
  • tab 補齊動作
  • command history (up key)
  • Ctrl-C
  • man, info
  • cp
  • mv
  • rm (單一檔,目錄)
  • 目錄:pwd, ~, /
  • 權限:root, sudo, permission denied
  • 編輯器:vi (or Auron suggest one)
user-guide 未提及的 tool:
  • apt-get, aptitude 的安裝 --- debian 的安裝系統 (/etc/apt/sources.list, repository)
有提到的tool build 過程會用到的:
  • curl (proxy)
  • tar (壓,解壓, type 與副檔名)
  • linux 目錄結構 (opt, etc,..)
  • Environment Variable : export and .profile
  • Shell script
Run 的過程才會用到的:
  • tftp server

其他:
  • install package 的download 速度太慢 --- apt cache ?

2010年9月29日 星期三

new NB, 要準備的software

new NB 是 win7 home advance (primere?) Traditional Chinese, 64 bit.
  • 注音輸入法 -- yahoo 輸入有提供 64bit 版本
  • firefox -- 有提供 64 bit 版本
  • VirtualBox -- 好像是 32/64 bit 共用
  • Office -- 好像改 LiberatteOffice (需要 jre)
  • VLC -- 好像是 32/64 共用
Virtualbox 的 VM 預計要安裝
  • ubuntu 10.04 - 32 bit
  • ubuntu 10.04 - 64 bit
  • debian lenny (squeeze ?)
因為 android java version 的問題,搞不好 ubuntu 9.10 也要。 (還是用 update-alternatives ?)
雖然 10.10 快到,但是依照慣例還是發行後一個月再 install 好了
要測試的東西
  • OpenCL -- 但是 HD 5650 的 OpenCL SDK 要 2010 年底才release。
  • 安裝OS到外部 e-SATA HD : 所以要benchmark 一下外部 e-SATA 和內部的performance 有沒有不同。 安裝 HD Tune.

2010年9月28日 星期二

ffmpeg -ffprobe

要看ffmpeg 怎麼找到transport stream 中的 stream 和 format,看 ffprobe 就可以。
ffprobe.c 基本就是open file 然後 show stream , format, packet.
所以所有 stream type identify 的動作都是在 ffprobe.c 中的 open_input_file( ) 完成的。
static int open_input_file(AVFormatContext **fmt_ctx_ptr, const char *filename) { int err, i; AVFormatContext *fmt_ctx; fmt_ctx = avformat_alloc_context(); if ((err = av_open_input_file(&fmt_ctx, filename, iformat, 0, NULL)) < 0) { print_error(filename, err); return err; } /* fill the streams in the format context */ if ((err = av_find_stream_info(fmt_ctx)) < 0) { print_error(filename, err); return err; } dump_format(fmt_ctx, 0, filename, 0); /* bind a decoder to each input stream */ for (i = 0; i < fmt_ctx->nb_streams; i++) { AVStream *stream = fmt_ctx->streams[i]; AVCodec *codec; if (!(codec = avcodec_find_decoder(stream->codec->codec_id))) { fprintf(stderr, "Unsupported codec (id=%d) for input stream %d\n", stream->codec->codec_id, stream->index); } else if (avcodec_open(stream->codec, codec) < 0) { fprintf(stderr, "Error while opening codec for input stream %d\n", stream->index); } } *fmt_ctx_ptr = fmt_ctx; return 0; }
mpeg transport stream 的 probe 方式是: mpegts.c (analyze())
static int analyze(const uint8_t *buf, int size, int packet_size, int *index){ int stat[TS_MAX_PACKET_SIZE]; int i; int x=0; int best_score=0; memset(stat, 0, packet_size*sizeof(int)); for(x=i=0; i<size-3; i++){ if(buf[i] == 0x47 && !(buf[i+1] & 0x80) && (buf[i+3] & 0x30)){ stat[x]++; if(stat[x] > best_score){ best_score= stat[x]; if(index) *index= x; } } x++; if(x == packet_size) x= 0; } return best_score; } 逐一檢查 :
  • byte0 == 0x47
  • byte1 & 0x80 == 0x00
  • byte3 & 0x30 != 0x00
以 state[] 作為一個 packet size(188) 的檢測結果。
傳入 10 個 packet_size 來檢查。
這樣,如果傳入的 stream data 剛好是對齊 byte0 的話。最後 state[0]=10.
如果是對齊 byte[1]。state[1]=9

mpegts.c 在 mpegts_probe( ) 里分別 probe 三種type 的 stream:
score = analyze(p->buf, TS_PACKET_SIZE *check_count, TS_PACKET_SIZE , NULL)*CHECK_COUNT/check_count; dvhs_score= analyze(p->buf, TS_DVHS_PACKET_SIZE*check_count, TS_DVHS_PACKET_SIZE, NULL)*CHECK_COUNT/check_count; fec_score = analyze(p->buf, TS_FEC_PACKET_SIZE *check_count, TS_FEC_PACKET_SIZE , NULL)*CHECK_COUNT/check_count; 因為是 sample stream file 是 mpeg2 transport stream,而且第一個 byte 就對齊了 sync byte 0x47,所以第一個 analyz( ) 會 return 10.

而mpegts_probe( ) 最後 return:
AVPROBE_SCORE_MAX + score - CHECK_COUNT 其中 CHECK_COUNT 就是送進去sample 的 packet number (10)。所以計算結果是 AVPROBE_SCORE_MAX。
probe 的結果是得到 fmt -- AVInputFormat 的 fmt

這個 probe 到的 format 再被用來 open stream:
err = av_open_input_stream(ic_ptr, pb, filename, fmt, ap);
av_open_input_stream 實際上是依據 pb, filename create 一個 AVFormatContext 的 structure。把 fmt 填進 structure 中,並且由 fmt 的
read_header( ) 從 stream 中 parsing header information,填入 ap --- AVFormatParameters

2010年9月24日 星期五

ffmpeg 的 ffplay 筆記

mpegts.c 的 mpegts_read_header( ) 負責
mpegts_open_section_filter(ts, SDT_PID, sdt_cb, ts, 1); mpegts_open_section_filter(ts, PAT_PID, pat_cb, ts, 1);
handle_packet( ) 處理 pid, start,

utils.c : av_find_stream_info( )
av_read_frame_internal( )


Data Structure:

AVPacket 好像是基本,裡面最重要的應該就是 *data 和 size。其他都是一些 timestamp 資料。
AVPacketList 就加一個 指向下一個 AVPacket 的 pointer (如其名, linking list)。

PacketQueue 裡面就是一個 AVPacketList,並且有一堆 queue operation,對這個 queue 裡的 AVPacketList 作 put, get, init, end 等動作。

FFPlay 有一個超大 structure : VideoState,裡面有 video, audio 和 subtitle 的 PacketQueue.

這個 VideoState structure 只有在 ffplay.c 里使用到,ffplay.c 里宣告幾個 VideoState 的變數,然後很多 function 都用 VideoState 作
argument... Q_Q

Thread
stream_open -- decode_thread -- refresh_thread
                 |
                component_open -- video_thread, subtitle_thread


decode_thread ( ) 負責讀取 source file/stream,demux 出 audio, video, subtitle 方別放到 audio, video, subtitle 的 packetqueue。

video_thread, subtitle_thread 定時從 對應的 packetqueue 取出 packet 作 decoding 和 rendering.
Audio Stream 用 callback function 實做,因為 audio stream 播放完後會 call callback function,所以從 callbackfunction 讀取 audio 的 packetqueue 資料 decode 就可以。 不必像 video, subtitle 一樣要自己"對齊"時間。


MpegTSContext是 mpegts.c 自己使用的 structure,類似 task context 一樣,定義了一堆state variable。
包含一個
MpegTSFilter *pids[NB_PID_MAX];
MpegTSFilter 是:
struct MpegTSFilter { int pid; int last_cc; /* last cc code (-1 if first packet) */ enum MpegTSFilterType type; union { MpegTSPESFilter pes_filter; MpegTSSectionFilter section_filter; } u; }; 其中 union 裡的兩個 member 是 callbackfunction (跟一堆東西)。 大概就是 parse 到哪一個 pid 就那個 pid 的callback function
比較通用的 structure:


AVInputFormat : 用在 decoding, 是所有 decoder 的 parent class. 定義了 function pointer for read header, packet... etc,所有 decoder 都要實做這些 function,並且宣告一個自己的 AVInputFormat Variable。
AVOutputFormat 也一樣。

build ffmpeg with --disable-optimizations

因為要用 gdb run,所以用 --disable-optimizations 的 option。 結果會出現: In file included from /home/ffmpeg/ffmpeg/libavcodec/x86/dsputil_mmx.c:31: /home/ffmpeg/ffmpeg/libavcodec/x86/dsputil_mmx.h: In function ‘transpose4x4’: /home/ffmpeg/ffmpeg/libavcodec/x86/dsputil_mmx.h:98: error: can't find a register in class ‘GENERAL_REGS’ while reloading ‘asm’ /home/ffmpeg/ffmpeg/libavcodec/x86/dsputil_mmx.h:98: error: ‘asm’ operand has impossible constraints make: *** [libavcodec/x86/dsputil_mmx.o] Error 1 google 的結果說是 gcc 的問題,好像是 ebp 可不可以拿來用的問題。 但是 apply 所有 google 到的 solution 都沒有效。 所以,只好... configure --disable-mmx --disable-mmx2 --disable-optimizations --disable-stripping 這樣就 OK 了... 很糟糕又丟臉的方法,但是主要是要 trace transport stream 的 decoding process,所以 assembly optimize 部份可以先略過...

2010年9月16日 星期四

log - build and install x264

********************************************************************** Done. The new package has been installed and saved to /home/charles-chang/1seg/x264/x264_1:0.20100917-1_i386.deb You can remove it from your system anytime using: http://www.blogger.com/img/blank.gif dpkg -r x264 ********************************************************************** 這一篇 (http://wiki.videolan.org/User:J-b#live555_.28optional.29 ) 好像說得比較清楚,可以用自己的 dependent library,在自己的 folder build,不會跟 system 混在一起。

2010年9月13日 星期一

Personal Cloud Server

個人Cloud Server 提供的功能:
  • Storage Service
  • Media Service
  • Document Service
  • Location Service
  • 日誌通知,自動...

Storage Service: 提供存取Service 儲存空間的能力,user 可以利用任何有網路能力的裝置讀取,儲存資料 到 Server。 Media Service: 提供播放,儲存媒體 (Photo, Music, Video) 的能力。User 可以利用任何有網路能力的裝置,播放Server 內的媒體,也可以將設備端的媒體儲存到 Server Document Service: 提供讀取,修改媒體的能力。 Location Service: 紀錄位置的能力。提供更精細的導航功能。與 個人化的 LBS。 日誌的能力: User 可以設定發送通知到特定裝置的能力。或是自行下載資料。
User 的上網裝置不限 PC,應該要涵蓋 phone,MID (乃至於電冰箱,洗衣機,media adaptor 等)。 所以 Service 提供的方式,以 WEB 為佳。 日誌的能力就是類似 web application 的 媒體播放為例,以 WEB 提供 Streamming 播放的工具。所有上網裝置街可以開啟該網頁播放音樂。 作為媒體儲存裝置,client 可以將即時錄製的內容儲存在Server中,不受client device 的local storage 限制。 合併起來,Service 可以作為媒體轉發中心:one client take video and store at server, other clients get realtime streamming video. --- idea from Jordan.
Personal Cloud Server 與使用一般 網路公司提供的 Cloud Service 不同的地方:
  • 資料內容完全由自己掌控 (隱私資料的保護)
  • 提供Server 所在環境的互動資料 (ipcam, power-plug control, TV streaming, telephone divert. 防盜通知..)
  • 提供的儲存空間大小
  • 自由安裝軟體的權利
  • 可以依照需要提出分享的功能
  • 直接提供媒體播放的能力: hdmi out.
沒有利用到的部份: 計算能力,一般cloude service 都包含計算。personal cloud server 沒有提供大量計算的能力。所以頂多只能算是 Personal Cloud Storage。
其他的功能: Personal Cloud Storage 之間的互連協定。可以分享一部分的頻寬,空間與其他 Storage Server 合作,形成更大的 P2P 網路。

2010年9月7日 星期二

原來Beagleboard UART connector 用工頭是因為TX/RX沒有交換,所以要用交換頭。 Beagleboard 有內建nandflash..

2010年9月1日 星期三

android - java 1.5

donut (android 1.6) 要用 java 1.5 來buold,可惜目前主流 dist 都已經update 到 1.6。 所以就要安裝 1.5 ,然後用 update_alternate 來改。 用 aptitude search java5 會列出一堆,install sun-java5-jdk 安裝完後,看看 /usr/bin 下有多少java* 用 update-alternatives --config java* 一個一個改為java5 就可以了。
其實也可以用設環境變數的方法...

標籤

網誌存檔