diff options
author | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2006-08-19 03:12:28 +0000 |
---|---|---|
committer | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2006-08-19 03:12:28 +0000 |
commit | 1fd361a1ea06e44286c213ca1f814f49306fdc43 (patch) | |
tree | 64c8c96cf54d8718847339a403e5e67b922e8c3f /converter/ppm/ppmtompeg/parse_huff.pl | |
download | netpbm-mirror-1fd361a1ea06e44286c213ca1f814f49306fdc43.tar.gz netpbm-mirror-1fd361a1ea06e44286c213ca1f814f49306fdc43.tar.xz netpbm-mirror-1fd361a1ea06e44286c213ca1f814f49306fdc43.zip |
Create Subversion repository
git-svn-id: http://svn.code.sf.net/p/netpbm/code/trunk@1 9d0c8265-081b-0410-96cb-a4ca84ce46f8
Diffstat (limited to 'converter/ppm/ppmtompeg/parse_huff.pl')
-rw-r--r-- | converter/ppm/ppmtompeg/parse_huff.pl | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/converter/ppm/ppmtompeg/parse_huff.pl b/converter/ppm/ppmtompeg/parse_huff.pl new file mode 100644 index 00000000..1fc6466c --- /dev/null +++ b/converter/ppm/ppmtompeg/parse_huff.pl @@ -0,0 +1,198 @@ +# +# Copyright (c) 1993 The Regents of the University of California. +# All rights reserved. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation for any purpose, without fee, and without written agreement is +# hereby granted, provided that the above copyright notice and the following +# two paragraphs appear in all copies of this software. +# +# IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR +# DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT +# OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF +# CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, +# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS +# ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO +# PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +# + +# +# $Header: /n/picasso/users/dwallach/vid2/mpeg_encode/RCS/parse_huff.pl,v 1.3 1993/01/18 10:56:03 dwallach Exp $ +# $Log: parse_huff.pl,v $ +# Revision 1.3 1993/01/18 10:56:03 dwallach +# got RCS headers in huff.c and huff.h working +# +# Revision 1.3 1993/01/18 10:56:03 dwallach +# got RCS headers in huff.c and huff.h working +# +# Revision 1.2 1993/01/18 10:17:29 dwallach +# RCS headers installed, code indented uniformly +# +# Revision 1.2 1993/01/18 10:17:29 dwallach +# RCS headers installed, code indented uniformly +# +# + +# this program's purpose in life is to parse the Huffman tables +# and output C code which is awfully useful for translation + +# typical usage: +# perl parse_huff.pl huffman.table +# ---> generates huff.c and huff.h + +# source format: # is a comment character +# Otherwise, there are three tab-separated fields in a line: +# Run, Level, and VLC Code +# Run and Level are integers, corresponding to the RLE coding. +# The VLC code is what bits to generate, and is expected to be +# composed of 1, 0, space, and 's'. Spaces are ignored, and +# s corresponds to the sign bit. In the output of this program, +# We'll completely right-shift the data, with a 0 for the sign +# bit. The encoder will make appropriate changes before outputing. + + +open(HUFFC, "> huff.c") || die "Can't write huff.c: $!\n"; +open(HUFFH, "> huff.h") || die "Can't write huff.h: $!\n"; + +sub encode { + local($run, $level, $vlc) = @_; + local($result) = 0; + local($tmp); + $vlc =~ s/\s//g; # remove whitespace + + local($bits) = length($vlc); + + foreach (split(//, $vlc)) { + $_ = 0 if $_ eq 's'; + $result = ($result << 1) + $_; + } + + $tmp = sprintf("0x%x", $result); + eval "\$vlc$run[$level] = \$tmp"; + eval "\$bits$run[$level] = \$bits"; +} + +while(<>) { + chop; + s/\s*#.*$//; # remove comments + next if /^\s*$/; # continue if the line is purely whitespace + + ($run, $level, $vlc) = split(/\t/); + &encode($run, $level, $vlc); + + # + # we have the +1's to insure the sizes of C arrays are correct + # + $maxlevel[$run] = $level+1 if $level >= $maxlevel[$run]; + $maxlevel = $level+1 if $level >= $maxlevel; + $maxrun = $run+1 if $run >= $maxrun; +} + +# +# fix the entries that aren't defined +# +for($run = 0; $run < $maxrun; $run++) { + eval "\$vlc$run[0] = '0x0' if \$vlc$run[0] eq ''"; + eval "\$bits$run[0] = '0' if \$bits$run[0] eq ''"; +} + +# +# now, output some C code +# + +printf HUFFC <<'EOF', $maxrun, join(", ", @maxlevel); +/* + * Copyright (c) 1993 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice and the following + * two paragraphs appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +/* + * $Header: /n/picasso/users/dwallach/vid2/mpeg_encode/RCS/parse_huff.pl,v 1.3 1993/01/18 10:56:03 dwallach Exp $ + */ + +/* + * THIS FILE IS MACHINE GENERATED! DO NOT EDIT! + */ +#include "mtypes.h" +#include "huff.h" + +int huff_maxlevel[%s] = { %s }; + +EOF +for($run = 0; $run < $maxrun; $run++) { + printf HUFFC <<EOF, eval "join(', ', \@vlc$run)", eval "join(', ', \@bits$run)"; +uint32 huff_table$run[$maxlevel[$run]] = { %s }; +int huff_bits$run[$maxlevel[$run]] = { %s }; + +EOF +} + +printf HUFFC "uint32 *huff_table[$maxrun] = { "; +for($run = 0; $run < $maxrun; $run++) { + printf HUFFC "%shuff_table$run", ($run)?", ":""; +} +printf HUFFC " };\n"; + +printf HUFFC "int *huff_bits[$maxrun] = { "; +for($run = 0; $run < $maxrun; $run++) { + printf HUFFC "%shuff_bits$run", ($run)?", ":""; +} +printf HUFFC " };\n"; +close HUFFC; + +printf HUFFH <<'EOF', $maxrun, $maxlevel; +/* + * Copyright (c) 1993 The Regents of the University of California. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose, without fee, and without written agreement is + * hereby granted, provided that the above copyright notice and the following + * two paragraphs appear in all copies of this software. + * + * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +/* + * $Header: /n/picasso/users/dwallach/vid2/mpeg_encode/RCS/parse_huff.pl,v 1.3 1993/01/18 10:56:03 dwallach Exp $ + */ + +/* + * THIS FILE IS MACHINE GENERATED! DO NOT EDIT! + */ +#define HUFF_MAXRUN %s +#define HUFF_MAXLEVEL %s + +extern int huff_maxlevel[]; +extern uint32 *huff_table[]; +extern int *huff_bits[]; +EOF + |