a new generation of ViTooKi input/output classes with multiplexing has emerged!

HOW DOES IT WORK?

First, we start at the new ByteStream base class, which is inherited by 
FileByteStream and HttpByteStream. They implement direct byte-wise access
for reading/writing to file/http respectively.
 * open/close
 * read into given buffer from stream
 * write from given buffer to stream

-- MultiCast UDP ByteStream will follow!


an arbitrary Url is passed to static ContainerFile::loadContainerInfo,
and there, according to the protocol (http://, file://, ...) the correct
ByteStream is instantiated. Then, according to the filename suffix, 
the correct specialized ContainerFile (VIT, OGG, MKV, ...) is called
to extract the header information and to build a ContainerInfo with
all VideoESInfo and AudioESInfos in this container.
Also the fitting MuxDemuxIO class is set and connected to the ContainerInfo.


MuxDemuxIO is capable of handling one input stream (a container ByteStream)
but demuxes the container into the separate elementary streams and
bypasses it to connected BufferedIOs.
So  one (or more) VideoESInfo BufferedIOs and one (or more) AudioESInfo
BufferedIOs can be dynamically connected to a MuxDemuxIO.


later, when the DataChannel has to be initiated with an InputIO for
a certain ESInfo (elementary stream), we use
static IOCreator::creatInput(myVideo/AudioESInfo)
which sets up a BufferedIO and connects it to a ContainerInfo MuxDemuxIO.
From now on, we can start the DataChannel and the frames are going
to the right elemStreams and connected AdaptorChains.



Write support is happening on the other side of the chain, so just
create a MuxDemuxIO with the according output ByteStream (eg.FileByteStream)

muxio = new VITMuxDemuxIO(new FileByteStream(filename,false));

Then create BufferedIOs for the wanted Datachannel elemStreams and
connect the BufferedIOs with the muxDemuxIO in the constructor.

output = new BufferedIO(out_ves, muxio, true);

then connect the DataChannel, set the DataSink with the BufferedIO output,
start it and wait until the file is written ;)

vdc=new DataChannel(input, in_ves, adaptchain);
vdc->insert(new DataSink(0, output, "127.0.0.1", 0));
vdc->play(0, 0.0);
vdc->start();


the BufferedIOs are "balanced", so according to the frame CTS timestamps,
the frames are sorted and interleaved into the container stream, which
gives immediate playout performance, when such a container stream
is opend again!

