corrade-vassal – Rev 1
?pathlinks?
/*
* CVS identifier:
*
* $Id: LayersInfo.java,v 1.7 2001/04/15 14:31:22 grosbois Exp $
*
* Class: LayersInfo
*
* Description: Specification of a layer
*
*
*
* COPYRIGHT:
*
* This software module was originally developed by Raphaël Grosbois and
* Diego Santa Cruz (Swiss Federal Institute of Technology-EPFL); Joel
* Askelöf (Ericsson Radio Systems AB); and Bertrand Berthelot, David
* Bouchard, Félix Henry, Gerard Mozelle and Patrice Onno (Canon Research
* Centre France S.A) in the course of development of the JPEG2000
* standard as specified by ISO/IEC 15444 (JPEG 2000 Standard). This
* software module is an implementation of a part of the JPEG 2000
* Standard. Swiss Federal Institute of Technology-EPFL, Ericsson Radio
* Systems AB and Canon Research Centre France S.A (collectively JJ2000
* Partners) agree not to assert against ISO/IEC and users of the JPEG
* 2000 Standard (Users) any of their rights under the copyright, not
* including other intellectual property rights, for this software module
* with respect to the usage by ISO/IEC and Users of this software module
* or modifications thereof for use in hardware or software products
* claiming conformance to the JPEG 2000 Standard. Those intending to use
* this software module in hardware or software products are advised that
* their use may infringe existing patents. The original developers of
* this software module, JJ2000 Partners and ISO/IEC assume no liability
* for use of this software module or modifications thereof. No license
* or right to this software module is granted for non JPEG 2000 Standard
* conforming products. JJ2000 Partners have full right to use this
* software module for his/her own purpose, assign or donate this
* software module to any third party and to inhibit third parties from
* using this software module for non JPEG 2000 Standard conforming
* products. This copyright notice must be included in all copies or
* derivative works of this software module.
*
* Copyright (c) 1999/2000 JJ2000 Partners.
* */
using System;
namespace CSJ2K.j2k.entropy.encoder
{
/// <summary> This class stores the specification of a layer distribution in the bit
/// stream. The specification is made of optimization points and a number of
/// extra layers to add between the optimization points. Each optimization
/// point creates a layer which is optimized by the rate allocator to the
/// specified target bitrate. The extra layers are added by the rate allocator
/// between the optimized layers, with the difference that they are not
/// optimized (i.e. they have no precise target bitrate).
///
/// <p>The overall target bitrate for the bit stream is always added as the
/// last optimization point without any extra layers after it. If there are
/// some optimization points whose target bitrate is larger than the overall
/// target bitrate, the overall target bitrate will still appear as the last
/// optimization point, even though it does not follow the increasing target
/// bitrate order of the other optimization points. The rate allocator is
/// responsible for eliminating layers that have target bitrates larger than
/// the overall target bitrate.</p>
///
/// <p>Optimization points can be added with the addOptPoint() method. It takes
/// the target bitrate for the optimized layer and the number of extra layers
/// to add after it.</p>
///
/// <p>Information about the total number of layers, total number of
/// optimization points, target bitrates, etc. can be obtained with the other
/// methods.</p>
///
/// </summary>
public class LayersInfo
{
/// <summary> Returns the overall target bitrate for the entire bit stream.
///
/// </summary>
/// <returns> The overall target bitrate
///
/// </returns>
virtual public float TotBitrate
{
get
{
return totbrate;
}
}
/// <summary> Returns the total number of layers, according to the layer
/// specification of this object and the overall target bitrate.
///
/// </summary>
/// <returns> The total number of layers, according to the layer spec.
///
/// </returns>
virtual public int TotNumLayers
{
get
{
return totlyrs;
}
}
/// <summary> Returns the number of layers to optimize, or optimization points, as
/// specified by this object.
///
/// </summary>
/// <returns> The number of optimization points
///
/// </returns>
virtual public int NOptPoints
{
get
{
// overall target bitrate is counted as extra
return nopt + 1;
}
}
/// <summary>The initial size for the arrays: 10 </summary>
private const int SZ_INIT = 10;
/// <summary>The size increment for the arrays </summary>
private const int SZ_INCR = 5;
/// <summary>The total number of layers </summary>
// Starts at 1: overall target bitrate is always an extra optimized layer
internal int totlyrs = 1;
/// <summary>The overall target bitrate, for the whole bit stream </summary>
internal float totbrate;
/// <summary>The number of optimized layers, or optimization points, without
/// counting the extra one coming from the overall target bitrate
/// </summary>
internal int nopt;
/// <summary>The target bitrate to which specified layers should be optimized. </summary>
internal float[] optbrate = new float[SZ_INIT];
/// <summary>The number of extra layers to be added after an optimized layer. After
/// the layer that is optimized to optbrate[i], extralyrs[i] extra layers
/// should be added. These layers are allocated between the bitrate
/// optbrate[i] and the next optimized bitrate optbrate[i+1] or, if it does
/// not exist, the overall target bitrate.
/// </summary>
internal int[] extralyrs = new int[SZ_INIT];
/// <summary> Creates a new LayersInfo object. The overall target bitrate 'brate' is
/// always an extra optimization point, with no extra layers are after
/// it. Note that any optimization points that are added with addOptPoint()
/// are always added before the overall target bitrate.
///
/// </summary>
/// <param name="brate">The overall target bitrate for the bit stream
///
/// </param>
public LayersInfo(float brate)
{
if (brate <= 0)
{
throw new System.ArgumentException("Overall target bitrate must " + "be a positive number");
}
totbrate = brate;
}
/// <summary> Returns the target bitrate of the optmimization point 'n'.
///
/// </summary>
/// <param name="n">The optimization point index (starts at 0).
///
/// </param>
/// <returns> The target bitrate (in bpp) for the optimization point 'n'.
///
/// </returns>
public virtual float getTargetBitrate(int n)
{
// overall target bitrate is counted as extra
return (n < nopt)?optbrate[n]:totbrate;
}
/// <summary> Returns the number of extra layers to add after the optimization point
/// 'n', but before optimization point 'n+1'. If there is no optimization
/// point 'n+1' then they should be added before the overall target
/// bitrate.
///
/// </summary>
/// <param name="n">The optimization point index (starts at 0).
///
/// </param>
/// <returns> The number of extra (unoptimized) layers to add after the
/// optimization point 'n'
///
/// </returns>
public virtual int getExtraLayers(int n)
{
// overall target bitrate is counted as extra
return (n < nopt)?extralyrs[n]:0;
}
/// <summary> Adds a new optimization point, with target bitrate 'brate' and with
/// 'elyrs' (unoptimized) extra layers after it. The target bitrate 'brate'
/// must be larger than the previous optimization point. The arguments are
/// checked and IllegalArgumentException is thrown if they are not correct.
///
/// </summary>
/// <param name="brate">The target bitrate for the optimized layer.
///
/// </param>
/// <param name="elyrs">The number of extra (unoptimized) layers to add after the
/// optimized layer.
///
/// </param>
public virtual void addOptPoint(float brate, int elyrs)
{
// Check validity of arguments
if (brate <= 0)
{
throw new System.ArgumentException("Target bitrate must be positive");
}
if (elyrs < 0)
{
throw new System.ArgumentException("The number of extra layers " + "must be 0 or more");
}
if (nopt > 0 && optbrate[nopt - 1] >= brate)
{
throw new System.ArgumentException("New optimization point must have " + "a target bitrate higher than the " + "preceding one");
}
// Check room for new optimization point
if (optbrate.Length == nopt)
{
// Need more room
float[] tbr = optbrate;
int[] tel = extralyrs;
// both arrays always have same size
optbrate = new float[optbrate.Length + SZ_INCR];
extralyrs = new int[extralyrs.Length + SZ_INCR];
Array.Copy(tbr, 0, optbrate, 0, nopt);
Array.Copy(tel, 0, extralyrs, 0, nopt);
}
// Add new optimization point
optbrate[nopt] = brate;
extralyrs[nopt] = elyrs;
nopt++;
// Update total number of layers
totlyrs += 1 + elyrs;
}
}
}
Generated by GNU Enscript 1.6.5.90.