summaryrefslogtreecommitdiffstats
path: root/kernel/kls_ljpeg/ljpeg2ppm/ljpgtopnm.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/kls_ljpeg/ljpeg2ppm/ljpgtopnm.c')
-rw-r--r--kernel/kls_ljpeg/ljpeg2ppm/ljpgtopnm.c263
1 files changed, 263 insertions, 0 deletions
diff --git a/kernel/kls_ljpeg/ljpeg2ppm/ljpgtopnm.c b/kernel/kls_ljpeg/ljpeg2ppm/ljpgtopnm.c
new file mode 100644
index 0000000..c975892
--- /dev/null
+++ b/kernel/kls_ljpeg/ljpeg2ppm/ljpgtopnm.c
@@ -0,0 +1,263 @@
+/*
+ * ljpgtopnm.c --
+ *
+ * This is the main routine for the lossless JPEG decoder. Large
+ * parts are stolen from the IJG code, so:
+ *
+ * Copyright (C) 1991, 1992, Thomas G. Lane.
+ * Part of the Independent JPEG Group's software.
+ * See the file Copyright for more details.
+ *
+ * Copyright (c) 1993 Brian C. Smith, The Regents of the University
+ * of California
+ * All rights reserved.
+ *
+ * Copyright (c) 1994 Kongji Huang and Brian C. Smith.
+ * Cornell University
+ * 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 CORNELL UNIVERSITY 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 CORNELL
+ * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * CORNELL UNIVERSITY 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 CORNELL UNIVERSITY HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <malloc.h>
+#include <string.h>
+#include "jpeg.h"
+#include "mcu.h"
+#include "proto.h"
+
+/*
+ * input and output file pointers
+ */
+FILE *inFile, *outFile;
+void FreeArray2D(char **);
+
+void WritePmHeader(DecompressInfo dcInfo);
+
+/*
+ *--------------------------------------------------------------
+ *
+ * ReadJpegData --
+ *
+ * This is an interface routine to the JPEG library. The
+ * JPEG library calls this routine to "get more data"
+ *
+ * Results:
+ * Number of bytes actually returned.
+ *
+ * Side effects:
+ * None.
+ *
+ *--------------------------------------------------------------
+ */
+int
+ReadJpegData (buffer, numBytes)
+ char *buffer; /* Place to put new data */
+ int numBytes; /* Number of bytes to put */
+{
+ return fread(buffer, 1, numBytes, inFile);
+}
+
+/*
+ *--------------------------------------------------------------
+ *
+ * WritePmHeader --
+ *
+ * Output Portable Pixmap (PPM) or Portable
+ * Graymap (PGM) image header.
+ *
+ * Results:
+ * None.
+ *
+ * Side effects:
+ * The PPM or PGM header is written to file
+ * pointed by outFile.
+ *
+ *--------------------------------------------------------------
+ */
+void
+WritePmHeader(dcInfo)
+DecompressInfo dcInfo;
+{
+ switch(dcInfo.numComponents) {
+ case 1: /* pgm */
+ if (dcInfo.dataPrecision==8) {
+ fprintf(outFile,"P5\n%d %d\n255\n",
+ dcInfo.imageWidth,dcInfo.imageHeight);
+ } else {
+ fprintf(outFile,"P5\n%d %d\n%d\n",
+ dcInfo.imageWidth,dcInfo.imageHeight,
+ ((1<<dcInfo.dataPrecision)-1));
+ }
+ break;
+ case 3: /* ppm */
+ if (dcInfo.dataPrecision==8) {
+ fprintf(outFile,"P6\n%d %d\n255\n",
+ dcInfo.imageWidth,dcInfo.imageHeight);
+ } else {
+ fprintf(outFile,"P6\n%d %d\n%d\n",
+ dcInfo.imageWidth,dcInfo.imageHeight,
+ ((1<<dcInfo.dataPrecision)-1));
+ }
+ break;
+ default:
+ fprintf(stderr,"Error: Unsupported image format.\n");
+ exit(-1);
+ }
+}
+
+/*
+ *--------------------------------------------------------------
+ *
+ * ArgParser --
+ *
+ * Command line parser.
+ *
+ * Results:
+ * Command line parameters and options are passed out.
+ *
+ * Side effects:
+ * None.
+ *
+ *--------------------------------------------------------------
+ */
+static void
+ArgParser(argc,argv,verbose,linFile,loutFile)
+ int argc;
+ char **argv;
+ int *verbose;
+ FILE **linFile, **loutFile;
+{
+ int argn;
+ char *arg;
+ const char *usage="ppmtoljpeg [ -v -h ] [ inFile [outFile] ]";
+ int NumOfFile=0;
+
+ /*
+ * default values
+ */
+ *linFile=stdin;
+ *loutFile=stdout;
+ *verbose=0;
+
+ for (argn = 1; argn < argc; argn++) {
+ arg=argv[argn];
+ if (*arg != '-') { /* process a file name */
+ if (NumOfFile==0) {
+ if ((*linFile=fopen(arg,"r"))==NULL) {
+ fprintf(stderr,"Can't open %s\n",arg);
+ exit(-1);
+ }
+ }
+ if (NumOfFile==1) {
+ if ((*loutFile=fopen(arg,"w"))==NULL) {
+ fprintf(stderr,"Can't open %s\n",arg);
+ exit(-1);
+ }
+ }
+ if (NumOfFile>1) {
+ fprintf(stderr,"%s\n",usage);
+ exit(-1);
+ }
+ NumOfFile++;
+ }
+ else { /* precess a option */
+ arg++;
+ switch (*arg) {
+ case 'h':
+ /* help flag */
+ fprintf(stderr,"Decode a lossless JPEG image into ");
+ fprintf(stderr,"a PPM or PGM image.\n");
+ fprintf(stderr,"Usage:\n");
+ fprintf(stderr,"%s\n",usage);
+ fprintf(stderr,"Default input: stdin\n");
+ fprintf(stderr,"Default output: stdout\n");
+ fprintf(stderr,"-h help\n");
+ fprintf(stderr,"-v verbose\n");
+ exit(1);
+ break;
+ case 'v':
+ /* verbose flag */
+ *verbose=1;
+ break;
+ default:
+ fprintf(stderr,"%s\n",usage);
+ exit(-1);
+ }
+ }
+ }
+}
+
+int
+main(argc, argv)
+ int argc;
+ char **argv;
+{
+ DecompressInfo dcInfo;
+ int verbose;
+
+ /*
+ * Process command line parameters.
+ */
+ MEMSET(&dcInfo, 0, sizeof(dcInfo));
+ ArgParser(argc,argv,&verbose,&inFile,&outFile);
+
+ /*
+ * Read the JPEG File header, up to scan header, and initialize all
+ * the variables in the decompression information structure.
+ */
+ ReadFileHeader (&dcInfo);
+
+ /*
+ * Loop through each scan in image. ReadScanHeader returns
+ * 0 once it consumes and EOI marker.
+ */
+ if (!ReadScanHeader (&dcInfo)) {
+ fprintf (stderr, "Empty JPEG file\n");
+ exit (1);
+ }
+
+ /*
+ * Output image parameter if verbose flag is on.
+ */
+ if (verbose) {
+ fprintf(stderr,"sample precision=%d\n",dcInfo.dataPrecision);
+ fprintf(stderr,"image height=%d\n",dcInfo.imageHeight);
+ fprintf(stderr,"image width=%d\n",dcInfo.imageWidth);
+ fprintf(stderr,"component=%d\n",dcInfo.numComponents);
+ }
+
+ /*
+ * Write PPM or PGM image header. Decode the image bits
+ * stream. Clean up everything when finished decoding.
+ */
+ WritePmHeader(dcInfo);
+ DecoderStructInit(&dcInfo);
+ HuffDecoderInit(&dcInfo);
+ DecodeImage(&dcInfo);
+ FreeArray2D(mcuROW1);
+ FreeArray2D(mcuROW2);
+
+ if (ReadScanHeader (&dcInfo)) {
+ fprintf (stderr, "Warning: multiple scans detected in JPEG file\n");
+ fprintf (stderr, " not currently supported\n");
+ fprintf (stderr, " ignoring extra scans\n");
+ }
+
+ return 0;
+}