How to evaluate H.263/H.264/MPEG4 video transmission using the NS2 simulator?


        Before using my work, please read Jirka’s work and my previous article. All the codecs can be found at here. The needed codes for NS2 and an example can be found at here.


[The steps to install my module into NS2]

1.      Put a frametype_ and sendtime_ field in the hdr_cmn header. The frametype_ field is to indicate which frame type the packet belongs to. I frame type is defined to 1, P is defined to 2, and B is defined to 3. The sendtime_ field is to record the packet sending time. It can be used to measure end-to-end delay.


Modify the file packet.h in the common folder


struct hdr_cmn {

  enum dir_t { DOWN= -1, NONE= 0, UP= 1 };

  packet_t ptype_;      // packet type (see above)

  int     size_;                // simulated packet size

  int     uid_;         // unique id

  int     error_;              // error flag

  int     errbitcnt_;     // # of corrupted bits jahn

  int     fecsize_;

  double      ts_;           // timestamp: for q-delay measurement

  int     iface_;              // receiving interface (label)

  dir_t direction_;        // direction: 0=none, 1=up, -1=down

  // source routing

        char src_rt_valid;

  double ts_arr_; // Required by Marker of JOBS

 //add the following three lines

  int frametype_;               // frame type for MPEG video transmission (Henry)

  double sendtime_;  // send time (Henry)

unsigned long int frame_pkt_id_;


2.      Modify the file agent.h in the common folder

class Agent : public Connector {


  Agent(packet_t pktType);

  virtual ~Agent();

  void recv(Packet*, Handler*);



inline packet_t get_pkttype() { return type_; }

// add the following two lines

  inline void set_frametype(int type) { frametype_ = type; } // (Henry)

  inline void set_prio(int prio) { prio_ = prio; }  // (Henry)



  int command(int argc, const char*const* argv);



  int defttl_;                 // default ttl for outgoing pkts

 // add the following line

  int frametype_;                       // frame type for MPEG video transmission




  void flushAVar(TracedVar *v);



3.      Modify the file in the common folder

Agent::Agent(packet_t pkttype) :

  size_(0), type_(pkttype), frametype_(0),

  channel_(0), traceName_(NULL),

  oldValueList_(NULL), app_(0), et_(0)





Agent::initpkt(Packet* p) const


  hdr_cmn* ch = hdr_cmn::access(p);

  ch->uid() = uidcnt_++;

  ch->ptype() = type_;

  ch->size() = size_;

  ch->timestamp() = Scheduler::instance().clock();

  ch->iface() = UNKN_IFACE.value(); // from packet.h (agent is local)

  ch->direction() = hdr_cmn::NONE;


  ch->error() = 0;        /* pkt not corrupt to start with */

 // add the following line

  ch->frametype_= frametype_;


4.      copy the myevalvid folder (contains,, myudp.h,, and myevalvid_sink.h) into ns2.

For example, “ns-allinone-2.28/ns-2.28/myevalvid”


5.      Modify the ns-allinone-2.28/ns-2.28/tcl/lib/ns-default.tcl

Add the following two lines

Agent/myUDP set packetSize_ 1000

Tracefile set debug_ 0


6.      Modify the ns-allinone-2.28/ns-2.28/

Put myevalvid/myudp.o, myevalvid/myevalvid_sink.o and myevalvid/myevalvid.o in the OBJ_CC list


7.      Recompile NS2

./configure ; make clean ; make



This example only runs on cygwin environment. If one wants to run this example on different environment or use other codec. Please download the needed software.

(The steps are almost the same)

1.      Encoding a yuv sequence into MPEG4 data format. It will create compressed raw videos with 30 frames per second, a GOP length of 30 frames with no B-frames. The bitrate-control from XviD does not work, so it is omitted here.

$./xvid_encraw -i akiyo_cif.yuv -w 352 -h 288 -framerate 30 -max_key_interval 30 -o a01.m4v


2.      Following command lines create ISO MP4 files containing the video samples (frames) and a hint track which describes how to packetize the frames for the transport with RTP.


       $./MP4Box -hint -mtu 1024 -fps 30 -add a01.m4v a01.mp4


3.      The mp4trace tool from EvalVid is able to send a hinted mp4-file per RTP/UDP to a specified destination host. The output of mp4trace will be needed later, so it should be redirected to a file.

$./mp4trace -f -s 12346 a01.mp4 > st_a01

4.      First, I use a simple topology to test the MPEG4 video delivery over a best-effort service network. The simulation environment is shown below. S1 will use the data in the file st to transmit packets to D1. The script file can refer to be_a01.tcl.

S1  ----  R1 --- R2  ---- D1

     $ns2 be_a01.tcl


set ns [new Simulator]


set nd [open w]

$ns trace-all $nd


set max_fragmented_size   1024


#add udp header(8 bytes) and IP header (20bytes)

set packetSize  1052


set s1 [$ns node]

set r1 [$ns node]

set r2 [$ns node]

set d1 [$ns node]


$ns duplex-link  $s1 $r1  10Mb   1ms DropTail

$ns simplex-link $r1 $r2  640kb  1ms DropTail

$ns simplex-link $r2 $r1  640Mb  1ms DropTail

$ns duplex-link  $r2 $d1  10Mb   1ms DropTail


set qr1r2 [[$ns link $r1 $r2] queue]

$qr1r2 set limit_ 50


set udp1 [new Agent/myUDP]

$ns attach-agent $s1 $udp1

$udp1 set packetSize_ $packetSize

$udp1 set_filename sd_a01

set null1 [new Agent/myEvalvid_Sink]

$ns attach-agent $d1 $null1

$ns connect $udp1 $null1

$null1 set_filename rd_a01


set original_file_name st_a01

set trace_file_name video1.dat

set original_file_id [open $original_file_name r]

set trace_file_id [open $trace_file_name w]


set pre_time 0


while {[eof $original_file_id] == 0} {

    gets $original_file_id current_line


    scan $current_line "%d%s%d%d%f" no_ frametype_ length_ tmp1_ tmp2_

    set time [expr int(($tmp2_ - $pre_time)*1000000.0)]


    if { $frametype_ == "I" } {

        set type_v 1

        set prio_p 0



    if { $frametype_ == "P" } {

        set type_v 2

        set prio_p 0



    if { $frametype_ == "B" } {

        set type_v 3

        set prio_p 0



    if { $frametype_ == "H" } {

        set type_v 1

        set prio_p 0



    puts  $trace_file_id "$time $length_ $type_v $prio_p $max_fragmented_size"

    set pre_time $tmp2_



close $original_file_id

close $trace_file_id

set end_sim_time $tmp2_

puts "$end_sim_time"


set trace_file [new Tracefile]

$trace_file filename $trace_file_name

set video1 [new Application/Traffic/myEvalvid]

$video1 attach-agent $udp1

$video1 attach-tracefile $trace_file


proc finish {} {

        global ns nd

        $ns flush-trace

        close $nd

        exit 0



$ns at 0.0 "$video1 start"

$ns at $end_sim_time "$video1 stop"

$ns at [expr $end_sim_time + 1.0] "$null1 closefile"

$ns at [expr $end_sim_time + 1.0] "finish"


$ns run


5.      After simulation, ns2 will create two files, sd_a01 and rd_a01. The file sd_a01 is to record the sending time of each packet while the file rd_a01 is used to record the received time of each packet.


6.      The next step is the reconstruction of the transmitted video as it is seen by the receiver. For this, the video and trace files are processed by etmp4 (Evaluate Traces of MP4-file transmission):

$./etmp4 sd_a01 rd_a01 st_a01 a01.mp4 a01e 
This generates a (possibly corrupted) video file, where all frames that got lost or were corrupted are deleted from the original video track.

7.      Decode the received video to yuv format. (Please use ffmpeg to decode the compressed file. It won’t cause any error in most cases. If you use other codec to decode, it may cause errors in most cases.)


$./ffmpeg -i a01e.mp4 a01e.yuv  


8.      Compute the PSNR.

$./psnr.exe 352 288 420 akiyo_cif.yuv a01e.yuv


Last modified: 2005/12/22


Author : Chih-Heng, Ke



Phd candidate, EE Department, NCKU, Taiwan
Posted by remos
1. sudo
2. apt-get install rar
3. apt-get install rar
Posted by remos

[펌]우분투 ns2

분류없음 2008.06.09 00:00

우분투 7.10 에 NS2 설치 (Installing ns2.31 on Ubuntu7.10)


작성일 : 2008년 1월 23일

작성자 : 곰팅이


참고 사이트 :


1. ns-allinone-2.31  다운로드와 설치 (Download ns-allinone-2.31 and Install)


1) 먼저 "ns-allinone-2.31" 소스를 임의의 디렉토리에 다운로드 받음


나의 경우 /usr 디렉토리에 다운로드 받음.


[다운로드]   <-- 소스다운로드 (



  $ cd /usr/

  $ tar xzvf ns-allinone-2.31.tar.gz
  $ cd ns-allinone-2.31
  $ sudo apt-get install -f build-essential libxt-dev libxt6 libsm-dev libsm6 libice-dev libice6 libxmu-dev



2) ns2 설치하기



2. 환경변수설정 (Set environment variables)


1) 환경변수 파일을 열음

  $ gedit ~/.bashrc

2) 아래와 같은 환경변수 설정을 추가




  # PATH

3) 수정이 완료되면 저장 후 닫기


4) 소스파일 적용하기

 $ source ~/.bashrc

위의 환경변수 설정 단계는 중요! 만약 이런경우 당신은 ns를 실행할 수 없음

(당신의 x-window를 다시 실행한 경우, 즉, 로그아웃 후 재 로구인, 시스템 재부팅)

왜? 환경변수 설정이 초기화 되므로... 다시 소스를 적용하면 가능함.

자! 여기까지 설치 완료!!

3. ns2 실행

 $ ns


"%"가 출력되면 성공이다. 여기서 다시 "$"로 돌아가기 위해 "exit"를 입력!


[곰팅의 출력결과]



4. 설치된 ns2 파일 유효성 검사

  $ cd ns-2.31
 $ ./validate

시간이 오래걸림...--;;


5. 출력가능한 에러메세지 (3단계 실행시 "$ns" )

 The program 'ns' is currently not installed. You can install it by typing:
sudo apt-get install host  '''(don't do this)'''
Make sure you have the 'universe' component enabled
bash: ns: command not found


해결법) 참고사이트 원문에서 환경변수 파일안에 /your/path 라고 되어있는 부분을  ns-allinone-2.31 디렉토리가 위치한 폴더의 경로로 수정할 것!


위의 에러 메세지는 환경변수 설정이 잘못되서 출력되는 메세지임.

[곰팅의 에러 출력메세지]
" 'ns' 프로그램은 현재 설치되어 있지 않습니다.  ..."


Posted by remos

RTS/CTS 802.11

분류없음 2008.03.14 20:43

1. RTS / CTS 클리어링

RTS (Request to Send)와 CTS (Clear to Send)
- 충돌을 막기 위해 802.11은 영역내의 상태를 보기위해 이 두가지를 사용한다.

RTS와 CTS는 BSS(Base Station System)내의 모든 스테이션을 조용하게 만든다.
- 이것이 완료되면 스테이션은 충돌에 대한 위험부담없이 데이터를 전송할 수 있다.

그러나 이것은 상당 부분의 데이터 전송 용량을 소비한다.
- 고수용 용량 환경과 전송에 현저한 충돌이 존재하는 환경에서 사용
- 저수용 용량 환경에서는 거의 사용 안한다.

RTS / CTS 교환이 이루어지게 할것인지 말것이지는 관리자가 설정이 가능하다.
- 장치 드라이버에서 조정되는 것이 허용된다면 RTS threshold를 조정한다.
- RTS/CTS 교환은 스레쉬홀드 값보다 큰 경우에만 이루어진다.
- 위에 말한 고수용 용량과 저수용 용량을 관리자가 임의로 스레쉬홀드에 정할수 있다.

2. MAC 접근 모드와 타이밍
무선 매체에 대한 접근은 조정함수를 이용한다.
DCF (Distributed Coordination Function)
- CSMA/CA 접근 메커니즘 기초이다.
- 충돌을 피하기위해 임의의 지연(back-off)를 사용한다.
- 좀더 나은 환경을 위해 RTS/CTS 클리어링 기법을 사용하기도 한다.
PCF (Point Coordination Function)
- 무경쟁 서비스 제공
- 현재 구현되어 있는 곳이 거의 없음.
[ 반송파 감지 기능과 네트워크 할당 벡터]
반송파 감지(CS)에는 두가지 방법이 있다.
- 물리적 반송파 감지 기능 : 물리층 제공이며 사용되는 매체와 변조방식에 의존된다.
                                                  별로 좋지 않다. (비싸다)
- 가상 반송파 감지 기능
   . 네트워크 할당 백터 (NAV : Network Allocation Vector)가 제공
   . 고정된 시간동안 매체를 예약
   . NAV가 0이 될때까지 다른 스테이션은 매체를 사용할수 없다.


① 송신측은 회선상태를 알아보기 위해 RTS를 보낸다.
- 이것은 RTS/CTS 교환을 예로 든것이다.
- 송신측에서 보낸 RTS에는 NAV를 설정한다.
- RTS는 모든 스테이션이 듣게 되고, 따라서 모든 스테이션은 NAV가 0이 될때까지 기다리게 된다.
② 수신측은 SIFS(바로 뒤에 설명한다)만큼 기다린후 CTS를 보낸다.
- 수신측에서 보낸 CTS에도 NAV가 설정되어 있다.
- 모든 스테이션이 송신측이 보낸 RTS를 들을 필요는 없으며, 수신측에서 더 짧은 NAV를 가진 CTS로 응답한다.
③ SIFS만큼 기다린후 프레임이 보내진다.
④ SIFS만큼 기다린후 수신측에서 ACK를 보낸다.
- ACK를 보냄과 동시에 NAV는 0으로 설정된다.
- 이후 DIFS(역시 바로 뒤에서 설명한다)만큼 기다린후 다시 치열한 경쟁 윈도우에 들어간다.
- 조각화된 프레임의 경우 프레임의 전송 갯수가 많아진다.
[ 프레임 간격 ]

짧은 프레임 간격
- SIFE (Short Interframe Space)
- RTS/CTS 프레임이나 ACK 프레임같은 최 우선권을 가진 프레임 전송에 사용
- 이것은 가장 짧은 간격을 가지므로 뒤에 설명할 다른 간격보다 더 빨리 전송권을 획득할 수 있다.
PCF 프레임 간격
- PIFS는 무경쟁 주기동안 전송할 데이터를 가진 스테이션이 획득한다.
- DIFS보다 우선권을 가진다.
- 그러나 현재 PCF가 구현된 곳은 별로 없다.
DCF 프레임 간격
- DIFS는 가장 평범한 프레임 간격이다.
- 스테이션이 프레임 전송이 끝나서 NAV가 0으로 설정되면 반드시 DIFS만큼 기다린후 다음 통신이 제개된다.
확장 프레임 간격
- EIFS는 고정된 간격이 아니다.
- 전송 오류시에만 발생한다.
3. DCF를 이용한 경쟁 기반 접근
① 각 스테이션은 매체가 사용중인지 아닌지를 검사한다.
- 만일 사용중이라면 Back-off 알고리즘으로 전송을 연기하다.
② 만일 매체가 DIFS보다 긴시간동안 사용하지 않았다면 전송은 즉시 일어날 수 있다.
- 모든 프레임이 에러없이 전송이 완료되어 NAV가 0이 되면 매체는 반드시 DIFS만큼 비워져야한다.
- 만일 에러 발생시 매체는 EIFS동안 비워져야한다.
③ 만일 매체가 사용중이라면 기다린다.
④ 에러복구는 전송 스테이션에 책임이 있다.
- ACK는 유일한 전송보장 도구이며 이것을 받지 못했을경우 전송 스테이션은 프레임의 재전송 카운터를 1 증가시키고 재전송한다.
- 이것은 성공할때까지 반복된다. (물론 제약은 있다)
⑤ 만일 스테이션이 NAV보다 긴 매체를 예약 받으면 NAV를 업데이트 시킨다.
- 송신 스테이션은 처음에 RTS를 보낼때 프레임을 보내는데 필요한 시간을 계산해 NAV를 설정한다.
⑥ 확장 프레임 시퀀스는 설정된 스레쉬홀드 값보다 더 큰 상위 수준의 패킷에 필요하다.
- 앞에서도 알아봤듯이 RTS 스레쉬홀드보다 큰 패킷은 RTS/CTS 교환을 사용한다.
- 조각화 스레쉬홀드 값보다 큰 패킷은 조각화 된다.
- 스레쉬홀드는 문지방이라는 사전적 의미를 가지고 있으며 관리자가 설정하거나 디폴트로 설정된 한계값이다.
- 조각화 Threshold가 1500byte로 설정되어있다면 2000byte의 프레임은 조각화된다.
[ DCF와 에러 복구 ]
에러복구는 전적으로 송신 스테이션의 책임이다.
에러 발생시 송신 스테이션은 재전송 카운터를 증가시키며 재 전송을 한다.
재전송 카운터에는 두가지가 있다.
- 짧은 재전송 카운터 : RTS 스레쉬홀드보다 작은 프레임
- 긴 재시도 카운터 : RTS 스레쉬홀드보다 큰 프레임
- 두가지 종류의 재시도 카운터가 사용되는 이유는 버퍼 공간에 따른 버퍼 공간의 양을 줄이기 위한것이다.
. 만일 재시도 최대값에 도달하면 프레임을 버려지고 상위 프로토콜에 기록된다.
4. 조각화와 재조립
조각화는 간섭시 신뢰성을 높여준다.
조각화 Threshold를 넘는 프레임은 조각화된다.
같은 조각은 같은 시퀀스 넘버를 가지며, 순서에 따라 조각 번호를 가진다.
- 이것은 IP의 조각화와 같은 내용이다.
- 만일 '반지의 제왕'과 '실미도'를 전송한다고 가정한다.
두 파일 모두 조각화 스레쉬홀드를 넘는다고 가정하며, 조각화가 일어났다고 가정한다. 동시에 전송되는 두 조각화된 프레임중 어떤것이 반지의 제왕이고 실미도인지 구분하기 위해 각 조각마다 시퀀스 넘버가 주어진다. 반지의 제왕에는 0, 실미도에는 1.. 이렇게 주어지며 반지의 제왕 프레임들중 순서에 따라 조각 번호가 주어진다. 따라서 수신 스테이션은 두 파일을 모두 받아 각 시퀀스 넘버별로 분류한후 조각 번호로 순서를 맞추어 원 파일을 복원한다.

- 위의 그림에서 보다시피 조각들은 다음 조각의 ACK까지의 NAV를 설정한다.
- 마지막 조각 3의 ACK를 보낸후 NAV는 0으로 되어 다시 DIFS만큼 기다린후 치열한 경쟁 윈도우에 돌입한다.

출처 : [기타] 블로그 집필 - 飛上
Posted by remos


분류없음 2008.03.13 21:57
Posted by remos

ns 802.11

2008.03.13 21:37

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.


분류없음 2008.03.12 05:43
Posted by remos
Posted by remos




Posted by remos

서강대 수시 동영상4

2007.10.01 01:07

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

티스토리 툴바