Labels

Friday 28 August 2015

what are storage classes in c?

Storage Classes in C:


From C compiler’s point of view, a variable name identifies some physical location within the computer where the string of bits representing the variable’s value is stored. There are basically two kinds of locations in a computer where such a value may be kept— Memory and CPU registers. It is the variable’s storage class that determines in which of these two locations the value is stored.

a variable’s storage class tells us:
(a)   Where the variable would be stored.
(b)   What will be the initial value of the variable, if initial value is not specifically assigned.(i.e. the default initial value).
(c)  What is the scope of the variable; i.e. in which functions the value of the variable would be available.
(d)  What is the life of the variable; i.e. how long would the variable exist.

There are four storage classes in C:

1. Automatic storage class
2. Register storage class
3. Static storage class
4. External storage class
Let us examine these storage classes one by one.

1. Automatic storage class:


The features of a variable defined to have an automatic storage
class are as under:
 
Storage                              Memory.

Default initial value  − An unpredictable value, which is often called a garbage value.

Scope                              −   Local to the block in which the variable is defined.

Life                                  −  Till the control remains within the block in which the variable is defined.Following program shows how an automatic storage class variable is declared, and the fact that if the variable is not initialized it contains a garbage value.

main( )
{
   auto int i, j ;
   printf ( "\n%d %d", i, j ) ;
}

The output of the above program could be...
1211 221

where, 1211 and 221 are garbage values of i and j. When you run this program you may get different values, since garbage values  are unpredictable. So always make it a point that you initialize the automatic variables properly, otherwise you are likely to get unexpected results. Note that the keyword for this storage class is auto, and not automatic.


2. Register storage class:


The features of a variable defined to be of register storage class are as under:
 
Storage                          -     CPU registers. 

Default initial value    -     Garbage value.

Scope                             -     Local to the block in which the variable is defined.

Life                                -    Till the control remains within the block in which the variable is defined.

A value stored in a CPU register can always be accessed faster than the one that is stored in memory. Therefore, if a variable is used at many places in a program it is better to declare its storage class as register. A good example of frequently used variables is loop counters. We can name their storage class as register.
main( )
{
   register int i ;
   for ( i = 1 ; i <= 10 ; i++ )
     printf ( "\n%d", i ) ;
}
Here, even though we have declared the storage class of i as register, we cannot say for sure that the value of i would be stored in a CPU register. Why? Because the number of CPU registers are limited, and they may be busy doing some other task. What happens in such an event... the variable works as if its storage class
is auto.

NOTE: Not every type of variable can be stored in a CPU register.

For example, if the microprocessor has 16-bit registers then they cannot hold a float value or a double value, which require 4 and 8 bytes respectively. However, if you use the register storage class for a float or a double variable you won’t get any error messages. All that would happen is the compiler would treat the variables to be of auto storage class.

3. Static storage class:


The features of a variable defined to have a static storage class are as under: 

Storage                          −      Memory.

Default initial value     −      Zero. 

Scope                             −      Local to the block in which the variable is defined.

Life                              − Value of the variable persists between different function calls.
main( )
{
     increment( ) ;
     increment( ) ;
     increment( ) ;
}
increment( )
{
     static int i = 1 ;
     printf ( "%d\n", i ) ;
     i = i + 1 ;
}
output: 1 2 3

the function increment( ) gets called from main( ) thrice. Each time it increments the value of i and prints it. static makes the variable exist even if the function returns. so next time increment called it won't create new memory for variable i and it will use the existing memory of i (created in first call).

 4. External storage class


The features of a variable whose storage class has been defined as external are as follows:

Storage                                   
−     Memory.

Default initial value              −     Zero.

Scope                                       −     Global.

Life                   −     As long as the program’s execution doesn’t come to an end.

 
External variables differ from those we have already discussed in that their scope is global, not local. External variables are declared outside all functions, yet are available to all functions that care to use them. Here is an example to illustrate this fact.

int i ;

main( )
{
     printf ( "\ni = %d", i ) ;
     increment( ) ;
     increment( ) ;
     decrement( ) ;
     decrement( ) ;
}

increment( )
{
     i = i + 1 ;
     printf ( "\non incrementing i = %d", i ) ;
}

decrement( )
{
     i = i - 1 ;
     printf ( "\non decrementing i = %d", i ) ;
}

The output would be:
i = 0
on incrementing i = 1
on incrementing i = 2
on decrementing i = 1
on decrementing i = 0


Which to Use When???


Use static storage class only if you want the value of a variable to persist between different function calls.

− Use register storage class for only those variables that are being used very often in a program. Reason is, there are very few CPU registers at our disposal and many of them might be busy doing something else. Make careful utilization of the scarce resources. A typical application of register storage class is loop counters, which get used a number of times in a program.

− Use extern storage class for only those variables that are being used by almost all the functions in the program. This would avoid unnecessary passing of these variables as arguments when making a function call. Declaring all the variables as extern would amount to a lot of wastage of memory space because these variables would remain active throughout the life of the program.

− If you don’t have any of the express needs mentioned above, then use the auto storage class. In fact most of the times we end up using the auto variables, because often it so happens that once we have used the variables in a function we don’t mind loosing them.











 




Friday 21 August 2015

linux alias command usage

When you are navigating up a very long directory structure, you may be using
cd ..\..\ with multiple ..\’s depending on how many directories you want to go
up as shown below.
# mkdir -p
/tmp/very/long/directory/structure/that/is/too/deep
# cd /tmp/very/long/directory/structure/that/is/too/deep
# pwd
/tmp/very/long/directory/structure/that/is/too/deep
# cd ../../../../
# pwd
/tmp/very/long/directory/structure
 Instead of executing cd ../../../.. to navigate four levels up, use one of the
following three alias methods:

Method 1: Navigate up the directory using “..n”

In the example below, ..4 is used to go up 4 directory level, ..3 to go up 3
directory level, ..2 to go up 2 directory level. Add the following alias to your
~/.bash_profile and re-login.

alias ..="cd .."
alias ..2="cd ../.."
alias ..3="cd ../../.."
alias ..4="cd ../../../.."
alias ..5="cd ../../../../.."

# cd
/tmp/very/long/directory/structure/that/is/too/deep
# ..4
[Note: use ..4 to go up 4 directory level]
# pwd
/tmp/very/long/directory/structure/
 Method 2: Navigate up the directory using only dots

In the example below, ..... (five dots) is used to go up 4 directory level.
Typing 5 dots to go up 4 directory structure is really easy to remember, as
when you type the first two dots, you are thinking “going up one directory”,
after that every additional dot, is to go one level up. So, use .... (four dots) to
go up 3 directory level and .. (two dots) to go up 1 directory level. Add the
following alias to your ~/.bash_profile and re-login for the ..... (five dots) to
work properly.

alias ..="cd .."
alias ...="cd ../.."
alias ....="cd ../../.."
alias .....="cd ../../../.."
alias ......="cd ../../../../.."

# cd /tmp/very/long/directory/structure/that/is/too/deep
# .....
[Note: use ..... (five dots) to go up 4 directory level]
# pwd
/tmp/very/long/directory/structure/
 Method 3: Navigate up the directory using cd followed by
consecutive dots


In the example below, cd..... (cd followed by five dots) is used to go up 4
directory level. Making it 5 dots to go up 4 directory structure is really easy to
remember, as when you type the first two dots, you are thinking “going up
one directory”, after that every additional dot, is to go one level up. So, use
cd.... (cd followed by four dots) to go up 3 directory level and cd... (cd
followed by three dots) to go up 2 directory level. Add the following alias to
your ~/.bash_profile and re-login for the above cd..... (five dots) to work
properly.

alias cd..="cd .."
alias cd...="cd ../.."

alias cd....="cd ../../.."
alias cd.....="cd ../../../.."
alias cd......="cd ../../../../.."

# cd /tmp/very/long/directory/structure/that/is/too/deep
# cd.....
[Note: use cd..... to go up 4 directory level]
# pwd
/tmp/very/long/directory/structure
 Method 5: Navigate up the directory using cd followed by number

In the example below, cd4 (cd followed by number 4) is used to go up 4
directory level.

alias cd1="cd .."
alias cd2="cd ../.."
alias cd3="cd ../../.."
alias cd4="cd ../../../.."
alias cd5="cd ../../../../.."





C++ by Herbert Schildt

Tuesday 11 August 2015

what is RTP, RTSP and RTCP?

RTP (Real Time Protocol)
Real-Time Protocol (RTP) is a transport protocol that was developed for streaming data. RTP includes extra data fields not present in TCP. It provides a timestamp andsequence number to facilitate the data transport timing, and allows control of the media server so that the video stream is served at the correct rate for real-time display. The media player then uses these RTP fields to assemble the received packets into the correct order and playback rate.
  • Sequence number
    The value of this 16-bit number increments by one for each packet. It is used by the player to detect packet loss and then to sequence the packets in the correct order. The initial number for a stream session is chosen at random.
  • Timestamp
    This is a sampling instance derived from a reference clock to allow for synchronization and jitter calculations. It is monotonic and linear in time.
  • Source identfiers
    CSRC is a unique identifier for the synchronization of the RTP stream. One or more CSRCs exist when the RTP stream is carrying information for multiple media sources. This could be the case for a video mix between two sources or for embedded content.
In a sense, RTP is not a true transport protocol, and it is designed to use UDP as a packet transport mechanism. In other words, RTP usually runs on UDP, and uses its multiplexing and checksum features. Note that RTP does not provide any control of the quality of service or reservation of network resources.

rtp_header.png 




RTCP (Real Time Control Protocol)
RTCP is used in conjunction with RTP. In other words, whenever an RTP connection is made, an RTCP connection also needs to be made. This connection is made using a second neighboring UDP port; if the RTP connection uses port 1500, then the RTCP connection uses port 1501.
RTCP gives feedback to each participant in an RTP session that can be used to control the session. The messages includes reception reports, including number of packets lost and jitter statistics (early or late arrivals). This information potentially can be used by higher layer applications to modify the transmission. For example, the bit rate of a stream could be changed to counter network congestion. Some RTCP messages relate to control of a video conference with multiple participants.
RTCP provides the following features:
  • Allow synchronization between different media types, such as video and audio. It has timestamp that is used by the receiver to align the clocks in each different RTP stream so that video and audio signals can be synced.
  • Report reception quality to the senders.
  • Provide identification of the senders in the RTP session so that new receivers can join and figure out which streams they need to obtain in order to participate fully.




Session Description Protocol (SDP)
SDP is a media description format intended for describing multimedia sessions, including video-conferencing. It includes session announcement and session invitation. Below is a sample of SDP.
v=0
o=- 32176 32176 IN IP4 13.16.32.209
s=ONetworkRenderer
i=OLiveBroadcast
c=IN IP4 221.1.0.1
t=0 0
b=AS:32
a=x-qt-text-nam:ONetwork Renderer
a=x-qt-text-inf:OLive Broadcast
a=x-qt-text-cmt:source application:ONetwork Renderer
a=x-qt-text-aut:
a=x-qt-text-cpy:
a=range:npt=0-
m=audio 22002 RTP/AVP 96
a=rtpmap:96 MP4A-LATM/44100/1
a=fmtp:96 cpresent=0;config=400024100000
a=control:trackID=1
The description of the sdp is shown below:
v: Version
o: Originator, session identifier, version, network type, protocol type, address
s: Subject
i: Information
c: Connection type, address
t: Start and stop times
m: Media type, port number, transport protocol, RTP profile
a: Dynamic payload type description
When we changed something in the sdp, the client should start a new session to see the effect of the changes. It works the same way as the html file. The web server holds the new html pages, and a client needs to refresh the the page to see any changes made.




RTSP (Real Time Streaming Protocol)
RTSP provides a means for users to control media sessions. RTSP does not actually provide for the transport of video signals but it allows these signals to be controlled by a user. The RTSP (Real Time Streaming Protocol) is a network control protocol to control streaming media servers. The protocol is used for establishing and controlling media sessions between the the streaming server and client. RTSP is considered more of a framework than a protocol. RTSP is designed to work on top ofRTP to both control and deliver real-time content.

streaming_link.png 

rtsp 
RTSP is one of the number of different protocols have been developed to facilitate real-time streaming of multimedia content. Streaming means that the mean frame rate of the video viewed at the player is dictated by the transmitted frame rate. The delivery rate has to be controlled so that the video data arrives just before it is required for display on the player. The associated audio track or tracks must also remain synchronized to the video. IP data transmission is not a synchronous process and delivery is by best effort. To achieve synchronism, timing references have to be embedded in the stream.

rtsp_tcp.png 
It delivers content as a unicast stream. It is an application-level protocol that was created specifically to control the delivery of real-time data, such as audio and video content. It is implemented over a correction-oriented transport protocol. It supports player control actions such as stopping, pausing, rewinding, and fast-forwarding.
If the connection URL uses RTSP, RTSP automatically negotiates the best delivery mechanism for the content. It then directs the RTP protocol to deliver streaming content using UDP, or using a TCP-based protocol on a network that does not support UDP.
The default transport layer port number is 554. 
streaming_control.png 
  • OPTIONS
    An OPTIONS request returns the request types the server will accept.
  • DESCRIBE
    A DESCRIBE request includes an RTSP URL (rtsp://...), and the type of reply data that can be handled. The default port for the RTSP protocol is 554 for both UDP and TCP transports. This reply includes the presentation description, typically inSession Description Protocol (SDP) format. Among other things, the presentation description lists the media streams controlled with the aggregate URL. In the typical case, there is one media stream each for audio and video.
  • SETUP
    A SETUP request specifies how a single media stream must be transported. This must be done before a PLAY request is sent. The request contains the media stream URL and a transport specifier. This specifier typically includes a local port for receiving RTP data (audio or video), and another for RTCP data (meta information). The server reply usually confirms the chosen parameters, and fills in the missing parts, such as the server's chosen ports. Each media stream must be configured using SETUP before an aggregate play request may be sent.
  • PLAY
    A PLAY request will cause one or all media streams to be played. Play requests can be stacked by sending multiple PLAY requests. The URL may be the aggregate URL (to play all media streams), or a single media stream URL (to play only that stream). A range can be specified. If no range is specified, the stream is played from the beginning and plays to the end, or, if the stream is paused, it is resumed at the point it was paused.
  • PAUSE
    A PAUSE request temporarily halts one or all media streams, so it can later be resumed with a PLAY request. The request contains an aggregate or media stream URL. A range parameter on a PAUSE request specifies when to pause. When the range parameter is omitted, the pause occurs immediately and indefinitely.
  • RECORD
    The RECORD request can be used to send a stream to the server for storage.
  • TEARDOWN
    A TEARDOWN request is used to terminate the session. It stops all media streams and frees all session related data on the server.
A streaming server works with the client to send audio and/or video over the Internet or Intranet and play it almost immediately. They allow real-time 'broadcasting' of live events, and the ability to control the play-back of on-demand content. Playback begins as soon as sufficient data has downloaded. The viewer can skip to a point part way through a clip without needing to download the beginning. If the data can not be downloaded fast enough, a streamed web cast sacrifices quality in order for the viewing to remain synchronised with the original timing of the content.
With Windows Media Server, RTSP supports the following features:
  • RTP packets can stream over UDP or over TCP. If the client can tolerate packet loss, streaming over UDP can be more efficient than TCP because UDP does not incur the overhead of retransmitting lost packets.
  • The encapsulation of Advanced Streaming Format (ASF) packets in RTP is proprietary.
  • The description of the ASF file, called ASF encapsulated in SDP, is proprietary.
  • WMS supports retransmission of lost RTP packets sent over UDP. This behavior allows a client to give up on expired RTP packets, which in turn helps the client avoid falling behind after losing packets.
  • WMS supports a forward error correction (FEC) scheme for RTP packets.
  • Streaming with RTSP fails if a firewall separates the client and server, and the firewall blocks the ports and protocols that RTSP uses. This problem is especially common with home Internet gateways. Even if the gateway has a built-in RTSP NAT, streaming might fail at times.
  • RTSP has the overhead of requiring multiple requests before playback can begin. However, the client can pipeline many of these requests and send them over a single TCP connection, in which case WMP does not need to block waiting for a response.

rtsp_rfc.png

what is live streaming and on demand streaming?

live_vs_ondemand.png


One of the primary reasons that producers use streaming servers is because once video is stored (or cached) on a hard drive, it's very easy to copy. Streaming video can be cache-less, which makes it inherently more secure.
Most Internet Video is delivered by progressive download. For example, YouTube video is delivered by progressive download.
What's happening when we watch a movie from a web site? First, the video file is placed on a server. Second, we click a link to that file on a web page. The server sends the data to us. It may appear to be streaming since playback can begin almost immediately. The progressive download feature in most media players allows them to begin playing the file as soon as enough data has been downloaded.
Years ago, the only acceptable way to deliver video was via streaming protocols such as RTSP, RTP, or RTCP that required proprietary players and expensive servers. Often referred to as Streaming Video, these solutions were costly and did not scale well but offered more functionality at the time. Yet, as technology has evolved, there was a wholesale migration towards to a new way of delivering video delivery via the standard HTTP protocol (often referred to as Progressive Download). Less expensive, it also scales well. This shift has occurred due to customer acceptance once the technology evolved to include many of the features that were once only possible with streaming protocols.
By using metadata attached to encoded files, progressive download can now allow users full seek and navigation at any time without requiring full file download. By using bandwidth throttling (specify bit rate that files should be delivered at), it is now possible to deliver only the amount of video that will be viewed, preventing wasted bandwidth. 
To maximize security, no-cache headers can be used to prevent browsers from storing content in cache and further DRM protection is easily available from partners.
So, with the broader availability of high-bandwidth networks and new media delivery features of web server, the differences that previously favored the use of a stream server over a web server for delivering digital media content have blurred. In non-multicast streaming scenarios, depending upon your business need, a stream server or a web server can both be viable options for digital media content delivery today.
However, in many ways it is inferior to adaptive streaming - Http Live Streaming (HLS) which will be described later.

download_and_play_vs_streaming.png 


Progressive download can be achieved using a regular web (http) server. The client (player) handles the buffering and playing during the download process.
The quality of the file from the progressive download is pre-determined. A user watching from a mobile connection on a 3 inch screen will have the same video as a user watching from a cable modem connection on a 1080p TV. The player is unable to dynamically adjust based on the user's network and screen conditions. Furthermore, if a user starts in a high-bandwidth environment, then moves to a low-bandwidth environment, HTTP Progressive Download is completely unable to keep pace. HLS, however, handles this scenario gracefully with minimal rebuffering and lag.

 web_server_vs_streaming_server.png

what is streaming? how it is different from downloading?

Video Streaming - Terminology
  • Encode
    To convert raw audio and/or video content into compressed form using technologies such as MPEG.
  • Transcode
    To convert a video signal that is encoded in one technology (MPEG-2) into another (MPEG-4).
  • Transrate
    To change the bit rate of compressed video stream.
  • Transmux
    To convert to a different container format without changing the file contents.
  • Pull
    A Pull is a connection initiated by a streaming server to receive a broadcast from a designated encoder for re-distribution across a network.
  • Push
    A Push is a connection initiated by an encoder to a streaming server to receive a broadcast for re-distribution across a network. This requires a username and password.
  • Latency
    Latency refers to the amount of time taken for data to complete a return trip between two points.
  • ABR
    Adaptive BitRate Video Streaming, the protocol developed by apple and used for iOS (and many products)
  • RTMP
    Real Time Media Protocol, developed by Adobe used by Flash
  • CBR (Constant Bit Rate) encoding
    The encoding software attempt to keep the total bits/second constant through the entire video. This makes the size of the file predictable and easier to stream. Most modern CODECs will allow you to set an upper threshold on the bit rate and allow the rate to drop when it is not required for quality to help reduce the amount of bandwidth used.
  • Variable bit rate encoding (VBR)
    A method of encoding video that first analyses the video and then compresses it. While it can take up to twice as long to encode the video, they are compressed at an optimal rate for the smallest file size. The variability in the data rate of the data stream does not make it appropriate for RTSP streamed content, but good for progressive download or video on CDs or other physical media.