2010年10月15日 星期五

JPEG library support data source from memory buffer

Independent JPEG Group's JPEG software發佈的jpeg library之前一直只能從檔案讀取jpg的檔案,版本Version 8 以上已經支援從記憶體內存讀取,這對於在網路存取圖檔時很方便。

jpeg_stdio_src (j_decompress_ptr cinfo, FILE * infile); //從檔案讀取

jpeg_mem_src (j_decompress_ptr cinfo,unsigned char * inbuffer, unsigned long insize); //從記憶體讀取

2010年9月9日 星期四

Spacserv 攝影機監控及修改JWebcamPlayer.java

這次主要利用ARM7連接 USB camera,組合成一個IP camera,並利用網頁來監看畫面。
在Spcaview的套件中有三個主要的執行檔,其功能在說明書有介紹
spcaview: 經由sdl傳送影像及聲音
spcaserv: 由TCP server傳送影像流
spcacat: 抓取影像

在這個套件中有包含網頁如何實現動態網頁的java程式,由於對java非常不熟,所以稍微看一下程式碼並做一些修改,所以順便記錄一下修改的過程。
因為我最主要想瞭解網頁中圖像的更新率,所以目標就是多增加一行數字計算fps。

在java applet中程式碼執行的流程為
init() --> start() -->paint() -->stop() -->destroy()
所以trace時就由這個順序開始,
在網頁中show圖形主要是在 public void start(),分析一下重要的部分

connection = new Socket(m_strServer, port); //連上server,預設是127.0.0.1
while(!m_stop)
{
byte [] b = {'O','K',0,0, 0,0,0,0,0,0,0,0,0}; // command
out.write(b); // write control command to server
n = in.read(buffer, 0, HDRLEN); // read header
buffer2[i] = buffer[i+HDRLEN]; // copy picture to buffer2
BufferedImage image = ImageIO.read(new ByteArrayInputStream(buffer2)); //tranform buffer2 to bufferedImage
if(do_overlay) {} // If mouse click,it will show control picture
ImageIcon ii = new ImageIcon(image); // show picture by icon
count++;
if(count==10)
{
endtime = System.currentTimeMillis();
fps=10000/(endtime-starttime);
starttime=endtime;
aaa=0;
}
m_label.setText(Long.toString(fps)); // show fps
m_label.setIcon(ii);
} //while

修改完後,在DOS下compile
C:\>javac JWebcamPlayer.java
C:\>jar cvf JWebcamPlayer.jar *.class
將所有檔案copy到 HTTP server,並把index-sample.html 改成index.html

Target board開機後
1. # Boa &
2. # /usr/spcaserv -d /dev/video0 -s 320x240 -f jpg -g
3. 開啟IE,網址輸入Target board IP

大功告成。每秒有30張以上




以後來把多台的IPcam的影像顯示在同一張網頁上。

2010年2月2日 星期二

Compile gdb and gdbserver for arm

由於廠商並未提供arm上面的gdb,所以必須自行編譯gdb。
編譯的流程主要參考OPENCSL ,簡略的紀錄我的過程

TARGET:S3C6410
Toolchain: gcc-4.2.2-eabi
流程:
# get new version from http://ftp.gnu.org/gnu/gdb (我下載的是gdb-7.0.1.tar.bz2)
# tar jxvf gdb-7.0.1.tar.bz2
# cd gdb-7.0.1
# mkdir gdb-host gdb-target
# cd gdb-host
# ../configure --target=arm-linux --prefix=$(pwd)
# make
# make install (arm-linux-gdb in bin directory)
# cd gdb-target
# CC=arm-linux-gcc ../gdb/gdbserver/configure --host=arm-linux --prefix=$(pwd)
# make (gdbserver in .)

由於我產生的gdb是使用shared-library所以要把toolchain的library燒到版子。

進行遠端除錯:
ARM:
$ ./gdbserver 192.168.0.53:3333 mplayer -ac mad -vo fbdev test.mpg
Process mplayer created; pid = 910
Listening on port 3333

PC:
# /gdb-7.0.1/gdb-host/bin/arm-linux-gdb mplayer
(gdb) target remote 192.168.0.100:3333 (連上TARGET的IP)
(gdb) b main
(gdb) r
The "remote" target does not support "run". Try "help target" or "continue".
run好像不能用,用continue
(gdb) c
Breakpoint 1, main (argc=6, argv=0xbef7fe24) at mplayer.c:2282
接下來就可自行debug


參考資料:
OPENCSL
GDB指令快查

2010年1月29日 星期五

利用automake自動產生Makefile

雖然自己寫個Makefile就行,但是open source project很多都利用這個工具來產生Makefile,還是來了解一下它吧。

假如我目錄下有 hello.c a.c兩個檔案

執行步驟:

1.#autoscan 產生 configure.scan


2.修改 configure.scan

# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.64])
AC_INIT(hello, 0.1, ecken@ecken.com)
AM_INIT_AUTOMAKE(hello,0.1)

AC_CONFIG_SRCDIR([hello.c])
#AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.

AC_OUTPUT(Makefile)


3.更改configure.scan檔名
#mv configure.scan configure.in

4.執行 aclocal
# aclocal

5.執行 autoconf
#autoconf

6.自行編輯Makefile.am
#vi Makefile.am
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=hello
hello_SOURCES=hello.c a.c

7.執行automake 產生Makefile.in
# automake -a

這樣就可以執行./configure 產生Makefile

所以整個需要須改手動更改新增的檔案有configure.in, Makefile.am



參考資料:

邱小新の工作筆記
陳雍穆(armor)
zjsxycli的空間