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

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.   // display screen size reduction. 
  65.   int screenx_div_h,screenx_div_l,screeny_div_h,screeny_div_l;
  66.   unsigned char * shiftedSource[3];
  67.   int original_horizontal_size;
  68.   int original_vertical_size;
  69.   int clipping_y_h, clipping_y_l;
  70.    
  71.      
  72.   // X11 related variables
  73.   XVisualInfo vinfo;
  74.   XEvent event;
  75.   Display *display;
  76.   Window window;
  77.   int horizontal_size, vertical_size;
  78.   GC gc;
  79.   unsigned char pixel[256];
  80.   int bpp;
  81.   int rgb_mode;
  82. #ifdef SOLARIS_SDK_XIL
  83.   int bands;
  84.   XilSystemState State;
  85.   int resized;
  86.   float horizontal_factor, vertical_factor;
  87.   XilMemoryStorage xilstorage1, xilstorage2;
  88.   XilImage ximage, ximage2, resized_image, displayimage;
  89. #else
  90.   XImage *ximage, *ximage2;
  91. #ifdef SH_MEM
  92.   int shmem_flag;
  93.   XShmSegmentInfo shminfo1, shminfo2;
  94.   int CompletionType;
  95.   int xwidth;
  96. #endif // SH_MEM
  97. #endif // SOLARIS_SDK_XIL
  98.  protected:
  99.   static void* dither_thread(DisplayX11* d);
  100.   static void* display_thread(DisplayX11* d);
  101.   int dither_image_rgb24(unsigned char* src[], unsigned char* dithered_image);
  102. #ifdef SOLARIS_SDK_XIL
  103.   void display_image(XilImage ximage, unsigned char *dithered_image);
  104. #else
  105. #ifdef LINUX
  106.   int dither_image_rgb16(unsigned char* src[], unsigned char* dithered_image);
  107.   void dither_bw_rgb16(unsigned char * src, unsigned short * dithered_img,
  108.                        int height, int width, int display_width, int step);
  109. #endif
  110.   void display_image(XImage *ximage, unsigned char *dithered_image);
  111. #endif
  112.   void dither_image(unsigned char *src[]);
  113.   void ditherframe(unsigned char *src[]);
  114.   void dithertop(unsigned char *src[], unsigned char *dst);
  115.   void ditherbot(unsigned char *src[], unsigned char *dst);
  116.   void ditherframe444(unsigned char *src[]);
  117.   void dithertop444(unsigned char *src[], unsigned char *dst);
  118.   void ditherbot444(unsigned char *src[], unsigned char *dst);
  119.   static int HandleXError(Display*, XErrorEvent*){ gXErrorFlag=1; return 0; }
  120.   void InstallXErrorHandler(){ XSetErrorHandler(DisplayX11::HandleXError); XFlush(display); }
  121.   void DeInstallXErrorHandler(){ XSetErrorHandler(NULL); XFlush(display); }
  122.   void exit_display(void);
  123. #ifdef SOLARIS_SDK_XIL
  124.   int resize();
  125.   Xil_unsigned8* getImage1Data(){
  126.     xil_export(ximage);
  127.     xil_get_memory_storage(ximage, &xilstorage1);
  128.     return xilstorage1.byte.data;
  129.   }
  130.   Xil_unsigned8* getImage2Data(){
  131.     xil_export(ximage2);
  132.     xil_get_memory_storage(ximage2, &xilstorage2);
  133.     return xilstorage2.byte.data;
  134.   }
  135. #endif // SOLARIS_SDK_XIL
  136.  public:
  137.   DisplayX11(const char* title, Synchronization* s=0);
  138.   ~DisplayX11();
  139.   unsigned char* getClpTable() const { return clp; }
  140.   int init(int h_size, int v_size,int sx_div_h=1,int sx_div_l=1,
  141.            int sy_div_h=1,int sy_div_l=1,
  142.            int clip_y_l=0, int clip_y_h=0);
  143.   void display_second_field(void);
  144.   void dither(unsigned char *src[]);
  145. };
  146. inline void DisplayX11::dither(unsigned char *src[]){
  147.   display_lock.lock();
  148.   while (source) display_cond.wait(&display_lock);
  149.   shiftedSource[0]=src[0]+clipping_y_l*original_horizontal_size;
  150.   shiftedSource[1]=src[1]+clipping_y_l/2*original_horizontal_size/2;
  151.   shiftedSource[2]=src[2]+clipping_y_l/2*original_horizontal_size/2;
  152.   source=shiftedSource;
  153.   display_lock.unlock();
  154. #if defined(IRIX) || defined(SOLARIS_SDK_XIL) || defined(LINUX)
  155.   dither_thread(this);
  156. #else
  157.   if (athr_create((void*(*)(void*))dither_thread, this, &thread_id)<0){
  158.     error("could not create display thread");
  159.     athr_exit(0);
  160.   }
  161. #endif
  162. }
  163. inline void DisplayX11::display_second_field(){
  164. #if defined(IRIX) || defined(SOLARIS_SDK_XIL) || defined(LINUX)
  165.   display_thread(this);
  166. #else
  167.   if (athr_create((void*(*)(void*))display_thread, this, &thread_id)<0){
  168.     error("could not create display thread");
  169.     athr_exit(0);
  170.   }
  171. #endif
  172. }
  173. #endif // __display_hh