Subversion Repositories shark

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * Copyright (c) 1992 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.
 */


/*
 * Portions of this software Copyright (c) 1995 Brown 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 BROWN 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 BROWN
 * UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * BROWN 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 BROWN UNIVERSITY HAS NO OBLIGATION TO PROVIDE MAINTENANCE,
 * SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 */



#include "video.h"
#include "dither.h"
#include "mpeg.h"               /* for ImageDesc */

#define NUM_COLORS 256          /* number of entries in colormap */
                                /* for gray-scale dithering */

/* Range values for lum, cr, cb. */
extern int LUM_RANGE;
extern int CR_RANGE;
extern int CB_RANGE;

/* Array that remaps color numbers to actual pixel values used by X server. */

extern unsigned char pixel[256];

/* Arrays holding quantized value ranged for lum, cr, and cb. */

extern int *lum_values;
extern int *cr_values;
extern int *cb_values;


/* ----------------------------- MNI Header -----------------------------------
@NAME       : InitColormap
@INPUT      : (none)
@OUTPUT     : *NumColors - number of entries in the newly-created colormap
              *Map - an array of colourmap entries; each one contains a
                     red, green, and blue byte-values (0 .. 255).  
                     *Map[i] gives the colour to display a pixel value i.
@RETURNS    : (none)
@DESCRIPTION: Creates a colour map used for most dithering methods
              (everything except full-colour, gray, and monochrome).
              The colour map itself is pretty self-explanatory -- a
              pixel with value i is to be displayed using the red, green
              and blue values in *Map[i] after InitColormap() is done.
@METHOD     :
@GLOBALS    :
@CALLS      :
@CREATED    : 95/3/4, Greg Ward: based on InitColorDisplay(), from gdith.c
                                 in the original Berkeley player
@MODIFIED   :
---------------------------------------------------------------------------- */

#ifndef DISABLE_DITHER
static void
InitColormap (int *NumColors, ColormapEntry **Map)
{
   int i, lum_num, cr_num, cb_num;

   *NumColors =  LUM_RANGE*CB_RANGE*CR_RANGE;
   *Map = (ColormapEntry *) malloc (*NumColors * sizeof (ColormapEntry));

   for (i = 0; i < *NumColors; i++)
   {
      lum_num = (i / (CR_RANGE*CB_RANGE))%LUM_RANGE;
      cr_num = (i / CB_RANGE)%CR_RANGE;
      cb_num = i % CB_RANGE;
     
/*      ConvertColor(lum_values[lum_num], cr_values[cr_num], cb_values[cb_num],
                   &(*Map)[i].red, &(*Map)[i].green, &(*Map)[i].blue);
*/

      pixel[i] = i;
   }
}
#endif


/* ----------------------------- MNI Header -----------------------------------
@NAME       : InitGrayColormap
@INPUT      : (none)
@OUTPUT     : *NumColors - number of entries in the newly-created colormap
              *Map - an array of colourmap entries
@RETURNS    : (none)
@DESCRIPTION: Creates a colour map used for gray-scale dithering, i.e.
              the red/green/blue values are the same for any given
              pixel value.
@METHOD     :
@GLOBALS    :
@CALLS      :
@CREATED    : 95/3/4, Greg Ward: based on InitGrayDisplay(), from gdith.c
                                 in the original Berkeley player
@MODIFIED   :
---------------------------------------------------------------------------- */

#ifndef DISABLE_DITHER
static void
InitGrayColormap (int *NumColors, ColormapEntry **Map)
{
   int  i;
 
//cprintf("InitGColor...\n");
   *NumColors =  NUM_COLORS;
   *Map = (ColormapEntry *) malloc (*NumColors * sizeof (ColormapEntry));

   for (i = 0; i < *NumColors; i++)
   {
      (*Map)[i].red = (*Map)[i].green = (*Map)[i].blue = i;
      pixel[i] = i;
   }
}
#endif


/* ----------------------------- MNI Header -----------------------------------
@NAME       : InitDither
@INPUT      : Image - pointer to the image descriptor for the current MPEG
@OUTPUT     : Image->ColormapSize, Image->Colormap - the colour map for
              this movie, as initialized by either InitColormap or
              InitGrayColormap (unless the current dithering scheme
              is full colour, in which case there is no colour map)
@RETURNS    : (none)
@DESCRIPTION: Does all initialization particular to the type of dithering
              being used.  Basically, sets up the internal data structures
              needed by the dithering code, and then sets up a colour map
              needed to display the pixels output by the ditherers.
@METHOD     :
@GLOBALS    :
@CALLS      : InitColor     (for most dithering methods)
              InitColormap  (for most dithering methods)
              InitGrayColormap (for gray-scale dithering)
              Init(..)Dither  (.. = the current dithering method)
@CREATED    : 95/3/3, Greg Ward: taken mostly from main() in the original
                                 Berkeley player
@MODIFIED   :
---------------------------------------------------------------------------- */

void
InitDither (ImageDesc *Image)
{
   LUM_RANGE = 8;
   CR_RANGE = 4;
   CB_RANGE = 4;

//cprintf("InitDitherin'...\n");
   switch (Image->vid_stream->ditherType)
   {
#ifndef DISABLE_DITHER
      case HYBRID_DITHER:
         InitColor ();
         InitHybridDither ();
         InitColormap (&Image->ColormapSize, &Image->Colormap);
         break;

      case HYBRID2_DITHER:
         InitColor ();
         InitHybridErrorDither ();
         InitColormap (&Image->ColormapSize, &Image->Colormap);
         break;

      case FS4_DITHER:
         InitColor ();
         InitFS4Dither ();
         InitColormap (&Image->ColormapSize, &Image->Colormap);
         break;

      case FS2_DITHER:
         InitColor ();
         InitFS2Dither ();
         InitColormap (&Image->ColormapSize, &Image->Colormap);
         break;

      case FS2FAST_DITHER:
         InitColor ();
         InitFS2FastDither ();
         InitColormap (&Image->ColormapSize, &Image->Colormap);
         break;

      case Twox2_DITHER:
         InitColor ();
         Init2x2Dither ();
         InitColormap (&Image->ColormapSize, &Image->Colormap);
         PostInit2x2Dither ();
         break;

      case GRAY_DITHER:
//cprintf("InitGray\n");
         InitGrayColormap (&Image->ColormapSize, &Image->Colormap);
         break;
#endif
      case FULL_COLOR_DITHER:
         wpixel[0] = 0xff;
         wpixel[1] = 0xff00;
         wpixel[2] = 0xff0000;
         Image->vid_stream->matched_depth=24;
         InitColorDither(1);
         Image->ColormapSize = -1;
         Image->Colormap = NULL;
         break;

#ifndef DISABLE_DITHER

      // MG      
      case HALF_COLOR_DITHER:
         wpixel[2] = 0x001f;
         wpixel[1] = 0x07e0;
         wpixel[0] = 0xf800;
         Image->vid_stream->matched_depth=16;
         InitColorDither(1);
         Image->ColormapSize = -1;
         Image->Colormap = NULL;
         break;

     case NO_DITHER:
         break;

      case ORDERED_DITHER:
         InitColor ();
         InitOrderedDither ();
         InitColormap (&Image->ColormapSize, &Image->Colormap);
         break;

      case MONO_DITHER:
      case MONO_THRESHOLD:
         break;

      case ORDERED2_DITHER:
         InitColor ();
         InitColormap (&Image->ColormapSize, &Image->Colormap);
         InitOrdered2Dither ();
         break;

      case MBORDERED_DITHER:
         InitColor ();
         InitColormap (&Image->ColormapSize, &Image->Colormap);
         InitMBOrderedDither ();
         break;

      case PPM_DITHER:
         Image->ColormapSize = -1;
         Image->Colormap = NULL;
         wpixel[0] = 0xff;
         wpixel[1] = 0xff00;
         wpixel[2] = 0xff0000;
         Image->vid_stream->matched_depth=24;
         InitColorDither(TRUE);
         break;
#endif
   }
}  


void ExecuteDisplay(VidStream *vid_stream, XInfo *xinfo)
{
  char dummy;
  int depth, result;
  static int rate_deal = -1;
  static int one_frame_time;
  register int usec, sec;
 

  vid_stream->totNumFrames++;

  if (partialFlag) {
    if ((endFrame != -1) && (vid_stream->totNumFrames > endFrame)) {

      vid_stream->film_has_ended=TRUE;
      if (loopFlag) {
              clear_data_stream(vid_stream);
      } else DestroyVidStream(vid_stream, xinfo);
      return;
    }
    if (vid_stream->totNumFrames < startFrame) {
      return;
    }
  }
}