home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 9 / CD_ASCQ_09_1193.iso / news / 4441 / mpegcode / src / parse_hu.pl < prev    next >
Text File  |  1993-09-27  |  7KB  |  199 lines

  1. # Copyright (c) 1993 The Regents of the University of California.
  2. # All rights reserved.
  3. # Permission to use, copy, modify, and distribute this software and its
  4. # documentation for any purpose, without fee, and without written agreement is
  5. # hereby granted, provided that the above copyright notice and the following
  6. # two paragraphs appear in all copies of this software.
  7. # IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
  8. # DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
  9. # OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
  10. # CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  11. # THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
  12. # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  13. # AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  14. # ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
  15. # PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  16.  
  17. #  
  18. #  $Header: /n/picasso/users/dwallach/vid2/mpeg_encode/RCS/parse_huff.pl,v 1.3 1993/01/18 10:56:03 dwallach Exp $
  19. #  $Log: parse_huff.pl,v $
  20. # Revision 1.3  1993/01/18  10:56:03  dwallach
  21. # got RCS headers in huff.c and huff.h working
  22. #
  23. # Revision 1.3  1993/01/18  10:56:03  dwallach
  24. # got RCS headers in huff.c and huff.h working
  25. #
  26. # Revision 1.2  1993/01/18  10:17:29  dwallach
  27. # RCS headers installed, code indented uniformly
  28. #
  29. # Revision 1.2  1993/01/18  10:17:29  dwallach
  30. # RCS headers installed, code indented uniformly
  31. #
  32. #
  33.  
  34. # this program's purpose in life is to parse the Huffman tables
  35. # and output C code which is awfully useful for translation
  36.  
  37. # typical usage:
  38. # perl parse_huff.pl huffman.table
  39. # ---> generates huff.c and huff.h
  40.  
  41. # source format:  # is a comment character
  42. # Otherwise, there are three tab-separated fields in a line:
  43. #    Run, Level, and VLC Code
  44. # Run and Level are integers, corresponding to the RLE coding.
  45. # The VLC code is what bits to generate, and is expected to be
  46. #    composed of 1, 0, space, and 's'.  Spaces are ignored, and
  47. #    s corresponds to the sign bit.  In the output of this program,
  48. #    We'll completely right-shift the data, with a 0 for the sign
  49. #    bit.  The encoder will make appropriate changes before outputing.
  50.  
  51.  
  52. open(HUFFC, "> huff.c") || die "Can't write huff.c: $!\n";
  53. open(HUFFH, "> huff.h") || die "Can't write huff.h: $!\n";
  54.  
  55. sub encode {
  56.     local($run, $level, $vlc) = @_;
  57.     local($result) = 0;
  58.     local($tmp);
  59.     $vlc =~ s/\s//g;           # remove whitespace
  60.  
  61.     local($bits) = length($vlc);
  62.  
  63.     foreach (split(//, $vlc)) {
  64.     $_ = 0 if $_ eq 's';
  65.     $result = ($result << 1) + $_;
  66.     }
  67.  
  68.     $tmp = sprintf("0x%x", $result);
  69.     eval "\$vlc$run[$level] = \$tmp";
  70.     eval "\$bits$run[$level] = \$bits";
  71. }
  72.  
  73. while(<>) {
  74.     chop;
  75.     s/\s*#.*$//;       # remove comments
  76.     next if /^\s*$/;   # continue if the line is purely whitespace
  77.  
  78.     ($run, $level, $vlc) = split(/\t/);
  79.     &encode($run, $level, $vlc);
  80.  
  81.     #
  82.     # we have the +1's to insure the sizes of C arrays are correct
  83.     #
  84.     $maxlevel[$run] = $level+1 if $level >= $maxlevel[$run];
  85.     $maxlevel = $level+1 if $level >= $maxlevel;
  86.     $maxrun = $run+1 if $run >= $maxrun;
  87. }
  88.  
  89. #
  90. # fix the entries that aren't defined
  91. #
  92. for($run = 0; $run < $maxrun; $run++) {
  93.     eval "\$vlc$run[0] = '0x0' if \$vlc$run[0] eq ''";
  94.     eval "\$bits$run[0] = '0' if \$bits$run[0] eq ''";
  95. }
  96.  
  97. #
  98. # now, output some C code
  99. #
  100.  
  101. printf HUFFC <<'EOF', $maxrun, join(", ", @maxlevel);
  102. /*
  103.  * Copyright (c) 1993 The Regents of the University of California.
  104.  * All rights reserved.
  105.  *
  106.  * Permission to use, copy, modify, and distribute this software and its
  107.  * documentation for any purpose, without fee, and without written agreement is
  108.  * hereby granted, provided that the above copyright notice and the following
  109.  * two paragraphs appear in all copies of this software.
  110.  *
  111.  * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
  112.  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
  113.  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
  114.  * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  115.  *
  116.  * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
  117.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  118.  * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  119.  * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
  120.  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  121.  */
  122.  
  123. /*  
  124.  *  $Header: /n/picasso/users/dwallach/vid2/mpeg_encode/RCS/parse_huff.pl,v 1.3 1993/01/18 10:56:03 dwallach Exp $
  125.  */
  126.  
  127. /*  
  128.  *  THIS FILE IS MACHINE GENERATED!  DO NOT EDIT!
  129.  */
  130. #include "mtypes.h"
  131. #include "huff.h"
  132.  
  133. int huff_maxlevel[%s] = { %s };
  134.  
  135. EOF
  136. for($run = 0; $run < $maxrun; $run++) {
  137.     printf HUFFC <<EOF, eval "join(', ', \@vlc$run)", eval "join(', ', \@bits$run)";
  138. uint32 huff_table$run[$maxlevel[$run]] = { %s };
  139. int huff_bits$run[$maxlevel[$run]] = { %s };
  140.  
  141. EOF
  142. }
  143.  
  144. printf HUFFC "uint32 *huff_table[$maxrun] = { ";
  145. for($run = 0; $run < $maxrun; $run++) {
  146.     printf HUFFC "%shuff_table$run", ($run)?", ":"";
  147. }
  148. printf HUFFC " };\n";
  149.  
  150. printf HUFFC "int *huff_bits[$maxrun] = { ";
  151. for($run = 0; $run < $maxrun; $run++) {
  152.     printf HUFFC "%shuff_bits$run", ($run)?", ":"";
  153. }
  154. printf HUFFC " };\n";
  155. close HUFFC;
  156.  
  157. printf HUFFH <<'EOF', $maxrun, $maxlevel;
  158. /*
  159.  * Copyright (c) 1993 The Regents of the University of California.
  160.  * All rights reserved.
  161.  *
  162.  * Permission to use, copy, modify, and distribute this software and its
  163.  * documentation for any purpose, without fee, and without written agreement is
  164.  * hereby granted, provided that the above copyright notice and the following
  165.  * two paragraphs appear in all copies of this software.
  166.  *
  167.  * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
  168.  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
  169.  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
  170.  * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  171.  *
  172.  * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
  173.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  174.  * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  175.  * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
  176.  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  177.  */
  178.  
  179. /*  
  180.  *  $Header: /n/picasso/users/dwallach/vid2/mpeg_encode/RCS/parse_huff.pl,v 1.3 1993/01/18 10:56:03 dwallach Exp $
  181.  */
  182.  
  183. /*  
  184.  *  THIS FILE IS MACHINE GENERATED!  DO NOT EDIT!
  185.  */
  186. #define HUFF_MAXRUN    %s
  187. #define HUFF_MAXLEVEL    %s
  188.  
  189. extern int huff_maxlevel[];
  190. extern uint32 *huff_table[];
  191. extern int *huff_bits[];
  192. EOF
  193.  
  194.