display.hh
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:5k
源码类别:

DVD

开发平台:

Unix_Linux

  1. /*
  2.    File: display.hh
  3.    By: Alex Theo de Jong, NIST
  4.        with help from Reinhard Baier (Fokus/GMD, Germany)
  5.    
  6.    Created: February 1996
  7.    Description:
  8.    Multi-Threaded display class (NOT for IRIX NATIVE, see notes). Display class 
  9.    handles display of raw video frames under X11. Synchronization is provided by
  10.    use of the "sync" object. The display is threaded in order to increase 
  11.    performance on Multi-processor machines such as the SUN Sparc 10 MP. 
  12.    Notes:
  13. 1  Since process switching is expensive and SGI Irix 5.3 does not support
  14.    Multi-Threading, I don't thread when using SGI Irix. This would in fact
  15.    drop performance. On SUN Solaris either with an MP machine or without, the
  16.    performance is better when using Multi-threading.
  17. 2  I tried using the SOLARIS graphical libraries (XIL) but have not been very
  18.    successful in improving performance with these libraries (Performce was measured
  19.    on a SUN Ultra Sparc Created 3D). It turns out that the dither function 
  20.    provided by XIL is slower then software dithering and X display. Please
  21.    drop me a line if you can help me out with this :-)  A nice feature us the
  22.    scaling option. It resizes the image when the users resizes the window. 
  23.    Performance drops unfortunately.
  24.    Use the -DSOLARIS_SDK_XIL flag to compile with the XIL library. Note that
  25.    the full Solaris Software Development Kit needs to be installed.
  26.    Using 24 bit TrueColor can be switched on by using the -D24BITSCOLORS.
  27.    This only works for MPEG 1 sequences (behaviour is undefined otherwise.
  28. */
  29. #ifndef __display_hh
  30. #define __display_hh
  31. #ifdef __GNUG__
  32. #pragma interface
  33. #endif
  34. #include <X11/Xlib.h>
  35. #include <X11/Xutil.h>
  36. #ifdef SOLARIS_SDK_XIL
  37. #undef NULL  // to avoid compiler warning
  38. #include <xil/xil.h>
  39. #else
  40. #ifdef SH_MEM
  41. #include <X11/extensions/XShm.h>
  42. #include <sys/ipc.h>
  43. #include <sys/shm.h>
  44. #endif // SH_MEM
  45. #endif // SOLARIS_SDK_XIL
  46. static int gXErrorFlag;
  47. class DisplayX11 {
  48.   Synchronization* sync;     // Synchronization object for Audio/Video sync
  49. #ifdef USE_OPENPTC
  50.   Console *con;
  51.   Format *form;
  52. #endif
  53.   // MT stuff
  54.   unsigned char** source;    // in order to thread display
  55.   MutexLock display_lock;    // synchronization stuff
  56.   Condition display_cond;
  57.   athr_t thread_id;
  58.   int terminated;
  59.  
  60.   unsigned char *clp;  // clipping table (created at inistantiation)
  61.   unsigned char *dithered_image, *dithered_image2;
  62.   unsigned char ytab[16*(256+16)];
  63.   unsigned char uvtab[256*269+270];
  64.   // X11 related variables
  65.   XVisualInfo vinfo;
  66.   XEvent event;
  67.   Display *display;
  68.   Window window;
  69.   int horizontal_size, vertical_size;
  70.   GC gc;
  71.   unsigned char pixel[256];
  72.   int bpp;
  73.   int rgb_mode;
  74. #ifdef SOLARIS_SDK_XIL
  75.   int bands;
  76.   XilSystemState State;
  77.   int resized;
  78.   float horizontal_factor, vertical_factor;
  79.   XilMemoryStorage xilstorage1, xilstorage2;
  80.   XilImage ximage, ximage2, resized_image, displayimage;
  81. #else
  82.   XImage *ximage, *ximage2;
  83. #ifdef SH_MEM
  84.   int shmem_flag;
  85.   XShmSegmentInfo shminfo1, shminfo2;
  86.   int CompletionType;
  87.   int xwidth;
  88. #endif // SH_MEM
  89. #endif // SOLARIS_SDK_XIL
  90.  protected:
  91.   static void* dither_thread(DisplayX11* d);
  92.   static void* display_thread(DisplayX11* d);
  93. #ifdef SOLARIS_SDK_XIL
  94.   int dither_image_rgb24(unsigned char* src[], unsigned char* dithered_image);
  95.   void display_image(XilImage ximage, unsigned char *dithered_image);
  96. #else
  97. #ifdef LINUX
  98.   int dither_image_rgb16(unsigned char* src[], unsigned char* dithered_image);
  99. #endif
  100.   void display_image(XImage *ximage, unsigned char *dithered_image);
  101. #endif
  102.   void dither_image(unsigned char *src[]);
  103.   void ditherframe(unsigned char *src[]);
  104.   void dithertop(unsigned char *src[], unsigned char *dst);
  105.   void ditherbot(unsigned char *src[], unsigned char *dst);
  106.   void ditherframe444(unsigned char *src[]);
  107.   void dithertop444(unsigned char *src[], unsigned char *dst);
  108.   void ditherbot444(unsigned char *src[], unsigned char *dst);
  109.   static int HandleXError(Display*, XErrorEvent*){ gXErrorFlag=1; return 0; }
  110.   void InstallXErrorHandler(){ XSetErrorHandler(DisplayX11::HandleXError); XFlush(display); }
  111.   void DeInstallXErrorHandler(){ XSetErrorHandler(NULL); XFlush(display); }
  112.   void exit_display(void);
  113. #ifdef SOLARIS_SDK_XIL
  114.   int resize();
  115.   Xil_unsigned8* getImage1Data(){
  116.     xil_export(ximage);
  117.     xil_get_memory_storage(ximage, &xilstorage1);
  118.     return xilstorage1.byte.data;
  119.   }
  120.   Xil_unsigned8* getImage2Data(){
  121.     xil_export(ximage2);
  122.     xil_get_memory_storage(ximage2, &xilstorage2);
  123.     return xilstorage2.byte.data;
  124.   }
  125. #endif // SOLARIS_SDK_XIL
  126.  public:
  127.   DisplayX11(const char* title, Synchronization* s=0);
  128.   ~DisplayX11();
  129.   unsigned char* getClpTable() const { return clp; }
  130.   int init(int h_size, int v_size);
  131.   void display_second_field(void);
  132.   void dither(unsigned char *src[]);
  133. };
  134. inline void DisplayX11::dither(unsigned char *src[]){
  135.   display_lock.lock();
  136.   while (source) display_cond.wait(&display_lock);
  137.   source=src;
  138.   display_lock.unlock();
  139. #if defined(IRIX) || defined(SOLARIS_SDK_XIL) || defined(LINUX)
  140.   dither_thread(this);
  141. #else
  142.   if (athr_create((void*(*)(void*))dither_thread, this, &thread_id)<0){
  143.     error("could not create display thread");
  144.     athr_exit(0);
  145.   }
  146. #endif
  147. }
  148. inline void DisplayX11::display_second_field(){
  149. #if defined(IRIX) || defined(SOLARIS_SDK_XIL) || defined(LINUX)
  150.   display_thread(this);
  151. #else
  152.   if (athr_create((void*(*)(void*))display_thread, this, &thread_id)<0){
  153.     error("could not create display thread");
  154.     athr_exit(0);
  155.   }
  156. #endif
  157. }
  158. #endif // __display_hh