Tutorial

Use of this software is generally divided into two steps:

  • Performing static filter analysis

  • Calculating bit width requirements or generating test pictures

In the static filter analysis step, a mathematical analysis of a specific wavelet and transform depth is performed. The result of this analysis is a series of test patterns and abstract mathematical descriptions of the expected signal range.

In the second step, the output of the static analysis is specialised further for a particular picture bit width and quantisation matrix from which concrete signal ranges, test patterns and other information can be computed.

This software provides both command line tools and a Python API (vc2_bit_widths) with which these tasks may be performed. The command line interface will be demonstrated in the examples below.

Static filter analysis

Static filter analysis is typically performed using the vc2-static-filter-analysis command line utility like so:

$ vc2-static-filter-analysis \
    --wavelet-index le_gall_5_3 \
    --dwt-depth 2 \
    --output static_analysis.json

In the example above, the static analysis is performed for a 2-level LeGall (5, 3) wavelet transform and written to static_analysis.json.

Asymmetric transforms can also be specified using the --wavelet-index-ho and --dwt-depth-ho arguments.

For most wavelets and transform depths (as in the example above), the static analysis process completes after a few seconds. For very large wavelets and transform depths, however, the process can take several hours. To monitor the progress the --verbose argument may be used.

The JSON files produced by vc2-static-filter-analysis follow the format described in JSON file format. This file contains theoretical worst-case signal levels in algebraic form along with test patterns for every intermediate value array and filter phase. In this form, however, everything is quite abstractly defined and we must process this file further to produce more useful results.

Calculating bit-width requirements

The vc2-bit-widths-table command line utility may be used to compute a table of concrete signal ranges and bit width requirements:

$ vc2-bit-widths-table \
    static_analysis.json \
    --picture-bit-width 10 \
    --output bit_widths_table.csv

In this example, we use results of the static analysis produced in the previous step to find the signal ranges and bit widths when 10 bit input pictures and the default quantisation matrix are used. (Custom quantisation matrices may be specified using the --custom-quantisation-matrix argument.)

The bit_widths_table.csv file produced may be opened using any spreadsheet package (e.g. Microsoft Excel) and contains a table as illustrated below:

type

level

array_name

lower_bound

test_pattern_min

test_pattern_max

upper_bound

bits

analysis

2

Input

-512

-512

511

511

10

analysis

2

DC

-1024

-1024

1022

1022

11

analysis

2

DC’

-2047

-2046

2046

2047

12

analysis

2

DC’’

-2047

-2046

2046

2047

12

analysis

2

L

-1537

-1535

1534

1535

12

analysis

2

H

-2047

-2046

2046

2047

12

analysis

2

L’

-3071

-3069

3069

3071

13

analysis

2

H’

-4094

-4092

4092

4094

13

synthesis

2

L’

-26806

-4888

4888

26806

14-16

synthesis

2

H’

-6929

-5167

5167

6929

14

synthesis

2

L

-26806

-4888

4888

26806

14-16

synthesis

2

H

-9513

-4345

4345

9513

14-15

synthesis

2

DC’’

-26806

-4888

4888

26806

14-16

synthesis

2

DC’

-30271

-4888

4888

30271

14-16

synthesis

2

DC

-30271

-4888

4888

30271

14-16

synthesis

2

Output

-15136

-2444

2444

15136

13-15

Each row in the table describes a different intermediate value array within a VC-2 analysis or synthesis filter, as identified by the ‘type’, ‘level’ and ‘array_name’ columns (see Terminology). (If required, the table can be broken down further into individual phases using the --show-all-filter-phases argument.)

The ‘lower_bound’ and ‘upper_bound’ columns give an estimate of the worst-case signal levels which could appear in that array. This estimate is guaranteed not to under-estimate the true worst case signal levels but, in the case of synthesis filters, can sometimes be a significant over-estimate.

The ‘test_pattern_min’ and ‘test_pattern_max’ columns give actual signal values resulting from passing the test patterns generated during static analysis through a VC-2 encoder and decoder. In the case of the synthesis transform, the values reported are for whichever quantisation index produces the most extreme value.

The final column gives the number of bits required for a correct VC-2 implementation. This value may be given as a range in the case where the test patterns and theoretical worst case differ significantly. The true bit width requirement is guaranteed to lie somewhere within that range. (See Caveats).

Bounding quantisation indices

The VC-2 specification does not put an upper bound on the quantisation indices which might be used. The vc2-maximum-quantisation-index utility uses the theoretical bounds of the analysis filter (encoder) outputs to determine the largest quantisation index which could sensibly be used for a particular picture bit depth and quantisation matrix:

$ vc2-maximum-quantisation-index \
    static_analysis.json \
    --picture-bit-width 10
55

As before, custom quantisation matrices may be specified using the --custom-quantisation-matrix argument, otherwise the default quantisation matrix will be assumed.

Optimising synthesis test patterns

The vc2-optimise-synthesis-test-patterns command attempts to enhance the synthesis filter test patterns produced by vc2-static-filter-analysis to produce even larger signal values.

The test patterns produced by vc2-static-filter-analysis are the result of a heuristic designed to be likely to elicit extreme signal values, but worst-case signal levels are not guaranteed. For analysis transforms (encoding), this heuristic performs very well, however synthesis transforms (decoding) are more challenging due to the non-linearity introduced during quantisation (see Non-linearity).

A stochastic optimisation algorithm is used by vc2-optimise-synthesis-test-patterns to manipulate the initial test pattern. This process repeatedly encodes, quantises and then decodes modified test patterns using a full implementation of the VC-2 integer filtering process. As a consequence, the optimised test signals are able to exploit quirks of the integer rounding and quantisation errors introduced by a particular codec configuration. As a result, the optimised test patterns are very tightly matched to that particular configuration, but can achieve substantial worst-case signal level increases.

The command may be used with its default parameters like so:

$ vc2-optimise-synthesis-test-patterns \
    static_analysis.json \
    --picture-bit-width 10 \
    --output optimised_patterns.json

In this example, the test patterns will be optimised for codecs operating on 10 bit pictures and using the default quantisation matrix, with the resulting test patterns being written to optimised_patterns.json. The --verbose argument may be used to give a greater indication of progress.

The level of improvement achieved, and the algorithm runtime, are highly dependent on the careful tuning of the search parameters (see Choosing parameters). It may be expected that to produce useful improvements several hours of optimisation will be required.

The vc2-bit-widths-table command may be provided with the optimised test patterns to generate a table showing the signal ranges and bit widths reached by the optimised test signal:

$ vc2-bit-widths-table \
    static_analysis.json \
    optimised_patterns.json \
    --output optimised_bit_widths_table.csv

Generating test pictures

The vc2-bit-width-test-pictures command may be used to generate a series of test pictures containing test patterns suitable for passing through a VC-2 encoder or decoder.

As a simple example, set of test patterns generated as above may be turned into a collection of HD test pictures like so:

$ mkdir test_pictures
$ vc2-bit-width-test-pictures \
    static_analysis.json \
    1920 1080 \
    --picture-bit-width 10 \
    --output-directory test_pictures

The generated test pictures contain test patterns packed together as illustrated in the example below:

_images/example_test_picture.png

The test pictures are split into analysis and synthesis test pictures.

The analysis test pictures may be fed directly to an encoder.

The synthesis test pictures are further split up into groups which should be quantised to different levels. These pictures should be individually encoded such that every picture slice is quantised with the specified quantisation index. These encoded pictures may then be fed to a decoder implementation.

See Test picture format and usage for a more detailed explanation of how these test pictures should be used.

Bundling analyses and test pattern data files

When a large number of analyses have been performed (using, e.g. vc2-static-filter-analysis), a correspondingly large set of analysis JSON files will also accumulate. These can be bundled together, along with any optimised synthesis test patterns test (from vc2-optimise-synthesis-test-patterns) into a compressed bundle file.

As well as substantially reducing the diskspace required to store the analysis files, specific analyses and optimised test patterns may be extracted on demand using a built-in index.

The vc2-bundle command may be used to create and query bundle files. For example, if you have a number of static filter analyses with filenames like static_filter_analysis_*.json and optimised synthesis test patterns with filenames like optimised_synthesis_test_patterns_*.json, a bundle can be produced using vc2-bundle create like so:

$ vc2-bundle create bundle.zip \
    --static-filter-analyses static_filter_analysis_*.json \
    --optimised-synthesis-test-patterns optimised_synthesis_test_patterns_*.json

Individual analyses may be extracted like so:

$ vc2-bundle extract-static-filter-analyses \
    bundle.zip \
    --wavelet-index haar_with_shift \
    --dwt-depth 1 \
    --output extracted.json

And so too can optimised synthesis test patterns:

$ vc2-bundle extract-optimised-static-synthesis-test-patterns \
    bundle.zip \
    --wavelet-index haar_with_shift \
    --dwt-depth 1 \
    --picture-bit-width 10 \
    --output extracted.json