H.264 SVC performance evaluation over SDN (1)

 

[Goal]

Try to duplicate the important video packets when the switch sends out packets over loss link in order to improve the delivered video quality.

 

[Advantage]

The sender does not need to send the redundant packets at the source. The controller can know the status of each link from source to destination. When the link loss rate is high, the controller can send the command to ask the switch to duplicate the important packets when the switch sends out the important packets.

 

[Read in advance]

myEvalSVC-Mininet: H.264 SVC video transmission evaluation over Mininet

 

[Assumption]

Base layer packets are tagged with TOS=0x64, enhancement layer 1 packets are tagged with TOS=0x6E, and enhancement layer 2 packet are tagged with TOS=0x78.

 

[Evaluation Environment]

H1------SW----H2   

The link loss rate from SW to H2 is set to 5%

Experiment 1: No any protection

Experiment 2: Duplicate the base packets twice when the switch sends out the base layer packets.

 

(test.py)

#!/usr/bin/python

 

from mininet.topo import Topo

from mininet.net import Mininet

from mininet.node import CPULimitedHost

from mininet.link import TCLink

from mininet.util import dumpNodeConnections

from mininet.log import setLogLevel

from mininet.cli import CLI

 

class SingleSwitchTopo(Topo):

    "Single switch connected to n hosts."

    def __init__(self, n=2, **opts):

        Topo.__init__(self, **opts)

        switch = self.addSwitch('s1')

        for h in range(n):

            #Each host gets 50%/n of system CPU

            host = self.addHost('h%s' % (h + 1), cpu=.5/n)

            #10 Mbps, 5ms delay, 0% Loss, 1000 packet queue

            self.addLink(host, switch, bw=10, delay='5ms', loss=5, max_queue_size=1000, use_htb=True)

 

def perfTest():

    "Create network and run simple performance test"

    topo = SingleSwitchTopo(n=2)

    net = Mininet(topo=topo,host=CPULimitedHost, link=TCLink)

    net.start()

    print "Dumping host connections"

    dumpNodeConnections(net.hosts)

    print "Testing network connectivity"

    net.pingAll()

    #print "Testing bandwidth between h1 and h2"

    h1, h2 = net.get('h1', 'h2')

    #net.iperf((h1, h2))

    CLI(net)

    net.stop()

 

if __name__=='__main__':

    setLogLevel('info')

    perfTest()

 

[Experiment 1]

 

Open two terminals for h1 and h2. Run the H.264 receiver program at h2 and the sending program at h1.

 

Open another terminal to do the video performance evaluation.

 

 

 

 

 

The average result PSNR is 23.2.

 

[Experiment 2]

Kill the default controller and we will set the rules manually.

 

Back to original mininet environment to set the rules.

 

Do the performance evaluation again.

 

 

 

 

The result PSNR is 35.2. That is better than Experiment 1.

 

Dr. Chih-Heng Ke

Department of Computer Science and Information Engineering, National Quemoy University, Kinmen, Taiwan

Email: smallko@gmail.com / smallko@nqu.edu.tw