By the end of the semester, we finished a GUI based H.261 Codec and YUV.
The GUI was done with Java, and the CPU intensive code was done with C++.
The C++ code can be compiled for any platform, and called using a native
Java interface.  This allows our program to be run on any platform. The
program performs the following functions:

1). Display/Play stepwise or continuously a .QCIf and .CIF YUV file without
any encoding performed.

2). Decode and display stepwise or continuously a .h261 encoded file
produced with our encoder.

3). Encode and save stepwise or continuously a .QCIF and .CIF YUV file, and
display the decoded output. Encoding options include:
             +  Two choices of Motion Estimators : Exhaustive Search
(Optimal) and 
                 Horizontal/Vertical Minimum (Sub-Optimal, but faster)
             +  Quantization step-size between 2-62 (even numbers)
             +  An option to use an adaptive threshold filter of any
specified level

                                                 *  *  *  *  *

Two other functions are possible with minor alterations to the C++ code:

1). The ability to display residues instead of frame pels.
 
2). The ability to save a .h261 encoded file in YUV format.

                                                 *  *  *  *  *

Here are some results from experiments we conducted:

1). We encoded a YUV file with all equal parameters, with the exception of
theEstimator scheme. We found that the Sub-Optimal scheme was much, however
the resulting file turned out to be slightly larger than that produced with
the Optimal scheme.  One .QCIF file with 300 frames encoded with the
optimal motion estimator took over 30 minutes to finish, and resulted in a
file size of 417492 bytes.  With the sub-optimal motion estimator, it took
only 4 minutes, and resulted in a file size of 429912 bytes (only slightly
larger, but significantly faster).  We found one exception to this with a
video file of many consecutive still images. In this case, the sub-optimal
motion estimator actually produced a slightly smaller file. We think this
could be due to some sort of noise.

2). We encoded a file with different quantization step-sizes and adaptive
threshold levels. With the threshold level set to zero, we found that files
encoded with larger quantization step-sizes resulted in smaller file sizes.
Raising the threshold level increased the runs of zeros in each macroblock,
and so further decreased the file size. However, the tradeoff for
decreasing the filesize with either quantization, or an adaptive threshold,
or both, is lower picture quality.

3). We also did an experiment where we nullified/disabled the Motion
Estimator and viewed the residue between two consecutive images. The
resulting residues had more contours since the motion estimator assumed a
displacement of (0,0).
Link to our code