# # 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 outputting. 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 <