Changeset 1351
- Timestamp:
- Mar 20, 2009 7:36:52 PM (15 years ago)
- Location:
- trunk/packages/vizservers
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/packages/vizservers/configure
r1309 r1351 6509 6509 6510 6510 6511 oldLIBS=$LIBS 6512 LIBS=-lavcodec 6513 6514 for ac_func in img_convert 6515 do 6516 as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` 6517 { $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 6518 $as_echo_n "checking for $ac_func... " >&6; } 6519 if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then 6520 $as_echo_n "(cached) " >&6 6521 else 6522 cat >conftest.$ac_ext <<_ACEOF 6523 /* confdefs.h. */ 6524 _ACEOF 6525 cat confdefs.h >>conftest.$ac_ext 6526 cat >>conftest.$ac_ext <<_ACEOF 6527 /* end confdefs.h. */ 6528 /* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func. 6529 For example, HP-UX 11i <limits.h> declares gettimeofday. */ 6530 #define $ac_func innocuous_$ac_func 6531 6532 /* System header to define __stub macros and hopefully few prototypes, 6533 which can conflict with char $ac_func (); below. 6534 Prefer <limits.h> to <assert.h> if __STDC__ is defined, since 6535 <limits.h> exists even on freestanding compilers. */ 6536 6537 #ifdef __STDC__ 6538 # include <limits.h> 6539 #else 6540 # include <assert.h> 6541 #endif 6542 6543 #undef $ac_func 6544 6545 /* Override any GCC internal prototype to avoid an error. 6546 Use char because int might match the return type of a GCC 6547 builtin and then its argument prototype would still apply. */ 6548 #ifdef __cplusplus 6549 extern "C" 6550 #endif 6551 char $ac_func (); 6552 /* The GNU C library defines this for functions which it implements 6553 to always fail with ENOSYS. Some functions are actually named 6554 something starting with __ and the normal name is an alias. */ 6555 #if defined __stub_$ac_func || defined __stub___$ac_func 6556 choke me 6557 #endif 6558 6559 int 6560 main () 6561 { 6562 return $ac_func (); 6563 ; 6564 return 0; 6565 } 6566 _ACEOF 6567 rm -f conftest.$ac_objext conftest$ac_exeext 6568 if { (ac_try="$ac_link" 6569 case "(($ac_try" in 6570 *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; 6571 *) ac_try_echo=$ac_try;; 6572 esac 6573 eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" 6574 $as_echo "$ac_try_echo") >&5 6575 (eval "$ac_link") 2>conftest.er1 6576 ac_status=$? 6577 grep -v '^ *+' conftest.er1 >conftest.err 6578 rm -f conftest.er1 6579 cat conftest.err >&5 6580 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 6581 (exit $ac_status); } && { 6582 test -z "$ac_cxx_werror_flag" || 6583 test ! -s conftest.err 6584 } && test -s conftest$ac_exeext && { 6585 test "$cross_compiling" = yes || 6586 $as_test_x conftest$ac_exeext 6587 }; then 6588 eval "$as_ac_var=yes" 6589 else 6590 $as_echo "$as_me: failed program was:" >&5 6591 sed 's/^/| /' conftest.$ac_ext >&5 6592 6593 eval "$as_ac_var=no" 6594 fi 6595 6596 rm -rf conftest.dSYM 6597 rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ 6598 conftest$ac_exeext conftest.$ac_ext 6599 fi 6600 ac_res=`eval 'as_val=${'$as_ac_var'} 6601 $as_echo "$as_val"'` 6602 { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 6603 $as_echo "$ac_res" >&6; } 6604 as_val=`eval 'as_val=${'$as_ac_var'} 6605 $as_echo "$as_val"'` 6606 if test "x$as_val" = x""yes; then 6607 cat >>confdefs.h <<_ACEOF 6608 #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 6609 _ACEOF 6610 6611 fi 6612 done 6613 6614 LIBS=$oldLIBS 6615 6511 6616 { $as_echo "$as_me:$LINENO: checking for nVidia Cg installation" >&5 6512 6617 $as_echo_n "checking for nVidia Cg installation... " >&6; } -
trunk/packages/vizservers/configure.in
r1309 r1351 186 186 AC_CHECK_HEADERS([ffmpeg/avcodec.h libavcodec/avcodec.h ffmpeg/avformat.h libavformat/avformat.h ffmpeg/avutil.h libavutil/avutil.h]) 187 187 188 oldLIBS=$LIBS 189 LIBS=-lavcodec 190 AC_CHECK_FUNCS(img_convert) 191 LIBS=$oldLIBS 192 188 193 AC_MSG_CHECKING([for nVidia Cg installation]) 189 194 CG_DIR="" -
trunk/packages/vizservers/nanoscale/config.h.in
r1309 r1351 15 15 /* Define to 1 if you have the <ffmpeg/avutil.h> header file. */ 16 16 #undef HAVE_FFMPEG_AVUTIL_H 17 18 /* Define to 1 if you have the `img_convert' function. */ 19 #undef HAVE_IMG_CONVERT 17 20 18 21 /* Define to 1 if you have the <inttypes.h> header file. */ -
trunk/packages/vizservers/nanovis/Command.cpp
r1328 r1351 815 815 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 816 816 #endif 817 NanoVis::ppm_write("nv> print -bytes");817 NanoVis::ppm_write("nv>image -bytes %d -type print"); 818 818 NanoVis::resize_offscreen_buffer(w, h); 819 819 return TCL_OK; … … 1806 1806 1807 1807 static int 1808 FlowCaptureOp(ClientData cdata, Tcl_Interp *interp, int objc, 1809 Tcl_Obj *const *objv) 1810 { 1811 Rappture::Outcome result; 1812 int total_frame_count; 1813 1814 if (Tcl_GetIntFromObj(interp, objv[2], &total_frame_count) != TCL_OK) { 1815 return TCL_ERROR; 1816 } 1808 FlowVideoOp(ClientData cdata, Tcl_Interp *interp, int objc, 1809 Tcl_Obj *const *objv) 1810 { 1811 int width, height; // Resolution of video. 1812 int numFrames; // Total number of frames. 1813 float frameRate; // Frame rate of the video. 1814 float bitRate; // Bit rate of the vide. 1815 1816 if ((Tcl_GetIntFromObj(interp, objv[2], &width) != TCL_OK) || 1817 (Tcl_GetIntFromObj(interp, objv[3], &height) != TCL_OK) || 1818 (Tcl_GetIntFromObj(interp, objv[4], &numFrames) != TCL_OK) || 1819 (GetFloatFromObj(interp, objv[5], &frameRate) != TCL_OK) || 1820 (GetFloatFromObj(interp, objv[6], &bitRate) != TCL_OK)) { 1821 return TCL_ERROR; 1822 } 1823 if ((width<0) || (width>SHRT_MAX) || (height<0) || (height>SHRT_MAX)) { 1824 Tcl_AppendResult(interp, "bad dimensions for video", (char *)NULL); 1825 return TCL_ERROR; 1826 } 1827 if ((frameRate < 0.0f) || (frameRate > 30.0f)) { 1828 Tcl_AppendResult(interp, "bad frame rate \"", Tcl_GetString(objv[5]), 1829 "\"", (char *)NULL); 1830 return TCL_ERROR; 1831 } 1832 if ((bitRate < 0.0f) || (frameRate > 30.0f)) { 1833 Tcl_AppendResult(interp, "bad bit rate \"", Tcl_GetString(objv[6]), 1834 "\"", (char *)NULL); 1835 return TCL_ERROR; 1836 } 1837 1817 1838 if (NanoVis::licRenderer) { 1818 1839 NanoVis::licRenderer->activate(); … … 1822 1843 } 1823 1844 1845 // Save the old dimensions of the offscreen buffer. 1846 int oldWidth, oldHeight; 1847 oldWidth = NanoVis::win_width; 1848 oldHeight = NanoVis::win_height; 1849 1850 if ((width != oldWidth) || (height != oldHeight)) { 1851 // Resize to the requested size. 1852 NanoVis::resize_offscreen_buffer(width, height); 1853 } 1854 1824 1855 char fileName[128]; 1825 1856 sprintf(fileName,"/tmp/flow%d.mpeg", getpid()); 1826 1857 1827 1828 1858 Trace("FLOW started\n"); 1829 1859 1830 Rappture::AVTranslate movie(NanoVis::win_width, NanoVis::win_height); 1860 Rappture::Outcome result; 1861 Rappture::AVTranslate movie(width, height, frameRate, bitRate); 1831 1862 1832 1863 int pad = 0; … … 1837 1868 movie.init(result, fileName); 1838 1869 1839 for (int frame_count = 0; frame_count < total_frame_count; frame_count++) { 1840 1870 for (int i = 0; i < numFrames; i++) { 1841 1871 // Generate the latest frame and send it back to the client 1842 1872 if (NanoVis::licRenderer && … … 1854 1884 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 1855 1885 1856 // this is done before bmp_write_to_file because bmp_write_to_file1886 // This is done before bmp_write_to_file because bmp_write_to_file 1857 1887 // turns rgb data to bgr 1858 movie.append(result, NanoVis::screen_buffer, pad);1888 movie.append(result, NanoVis::screen_buffer, pad); 1859 1889 // NanoVis::bmp_write_to_file(frame_count, fileName); 1860 1890 } … … 1874 1904 Rappture::Buffer data; 1875 1905 data.load(fileName); 1876 char command[512]; 1877 sprintf(command,"nv>file -bytes %lu\n", (unsigned long)data.size()); 1878 NanoVis::sendDataToClient(command,data.bytes(), data.size()); 1879 if (remove(fileName) != 0) { 1880 fprintf(stderr, "Error deleting flow movie file: %s\n", fileName); 1881 fflush(stderr); 1882 } 1883 1906 1907 // Build the command string for the client. 1908 char command[200]; 1909 sprintf(command,"nv>image -bytes %lu -type movie\n", 1910 (unsigned long)data.size()); 1911 1912 NanoVis::sendDataToClient(command, data.bytes(), data.size()); 1913 if (unlink(fileName) != 0) { 1914 Tcl_AppendResult(interp, "can't unlink temporary movie file \"", 1915 fileName, "\": ", Tcl_PosixError(interp), (char *)NULL); 1916 return TCL_ERROR; 1917 } 1884 1918 return TCL_OK; 1885 1919 } … … 1962 1996 static Rappture::CmdSpec flowSliceOps[] = { 1963 1997 {"position", 1, FlowSlicePositionOp, 5, 5, "axis value",}, 1964 {"visible", 1, FlowSliceVisibleOp, 5, 5, " bool axis",},1998 {"visible", 1, FlowSliceVisibleOp, 5, 5, "axis bool",}, 1965 1999 }; 1966 2000 static int nFlowSliceOps = NumCmdSpecs(flowSliceOps); … … 1981 2015 1982 2016 static int 1983 FlowParticle VisibleOp(ClientData cdata, Tcl_Interp *interp, int objc,2017 FlowParticlesVisibleOp(ClientData cdata, Tcl_Interp *interp, int objc, 1984 2018 Tcl_Obj *const *objv) 1985 2019 { … … 1993 2027 } 1994 2028 1995 static Rappture::CmdSpec flowParticle Ops[] = {1996 {"visible", 1, FlowParticle VisibleOp, 4, 4, "on|off",},2029 static Rappture::CmdSpec flowParticlesOps[] = { 2030 {"visible", 1, FlowParticlesVisibleOp, 4, 4, "on|off",}, 1997 2031 }; 1998 static int nFlowParticle Ops = NumCmdSpecs(flowParticleOps);1999 2000 static int 2001 FlowParticle Op(ClientData cdata, Tcl_Interp *interp, int objc,2032 static int nFlowParticlesOps = NumCmdSpecs(flowParticlesOps); 2033 2034 static int 2035 FlowParticlesOp(ClientData cdata, Tcl_Interp *interp, int objc, 2002 2036 Tcl_Obj *const *objv) 2003 2037 { 2004 2038 Tcl_ObjCmdProc *proc; 2005 2039 2006 proc = Rappture::GetOpFromObj(interp, nFlowParticle Ops, flowParticleOps,2040 proc = Rappture::GetOpFromObj(interp, nFlowParticlesOps, flowParticlesOps, 2007 2041 Rappture::CMDSPEC_ARG2, objc, objv, 0); 2008 2042 if (proc == NULL) { … … 2013 2047 2014 2048 static int 2015 Flow PlayOp(ClientData cdata, Tcl_Interp *interp, int objc,2049 FlowNextOp(ClientData cdata, Tcl_Interp *interp, int objc, 2016 2050 Tcl_Obj *const *objv) 2017 2051 { 2018 if (NanoVis::licRenderer && 2019 !NanoVis::licRenderer->isActivated()) { 2052 if (!NanoVis::licRenderer->isActivated()) { 2020 2053 NanoVis::licRenderer->activate(); 2021 2054 } 2022 if (NanoVis::particleRenderer && 2023 !NanoVis::particleRenderer->isActivated()) { 2055 if (!NanoVis::particleRenderer->isActivated()) { 2024 2056 NanoVis::particleRenderer->activate(); 2025 2057 } … … 2028 2060 2029 2061 // Generate the latest frame and send it back to the client 2030 if (NanoVis::licRenderer && 2031 NanoVis::licRenderer->isActivated()) { 2062 if (NanoVis::licRenderer->isActivated()) { 2032 2063 NanoVis::licRenderer->convolve(); 2033 2064 } 2034 if (NanoVis::particleRenderer && 2035 NanoVis::particleRenderer->isActivated()) { 2036 NanoVis::particleRenderer->advect(); 2037 } 2065 NanoVis::particleRenderer->advect(); 2038 2066 NanoVis::offscreen_buffer_capture(); //enable offscreen render 2039 2067 NanoVis::display(); 2040 2041 2068 NanoVis::read_screen(); 2069 2042 2070 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 2043 2071 2044 2072 // NanoVis::bmp_write_to_file(frame_count, fileName); 2045 2046 2073 Trace("FLOW end\n"); 2047 2074 return TCL_OK; … … 2086 2113 2087 2114 static Rappture::CmdSpec flowOps[] = { 2088 {"capture", 1, FlowCaptureOp, 3, 3, "frames",},2089 2115 {"data", 1, FlowDataOp, 3, 0, "oper ?args?",}, 2090 2116 {"lic", 1, FlowLicOp, 3, 3, "on|off",}, 2091 {"particle ", 2, FlowParticleOp,3, 0, "oper ?args?",},2092 {" play", 2, FlowPlayOp, 2, 2, "",},2117 {"particles", 2, FlowParticlesOp, 3, 0, "oper ?args?",}, 2118 {"next", 2, FlowNextOp, 2, 2, "",}, 2093 2119 {"reset", 1, FlowResetOp, 2, 2, "",}, 2094 2120 {"slice", 1, FlowSliceOp, 3, 0, "oper ?args?",}, 2095 {"vectorid", 1, FlowVectorIdOp, 3, 3, "index",}, 2121 {"vectorid", 2, FlowVectorIdOp, 3, 3, "index",}, 2122 {"video", 2, FlowVideoOp, 7, 7, 2123 "width height numFrames frameRate bitRate ",}, 2096 2124 }; 2097 2125 static int nFlowOps = NumCmdSpecs(flowOps); … … 2103 2131 * flow capture frames filename 2104 2132 * flow lic on|off 2105 * flow particle visible on|off2106 * flow particle slice <volumeId>2107 * flow particle slicepos <value>2108 * flow play2133 * flow particles visible on|off 2134 * flow slice visible axis on|off 2135 * flow slice position axis value 2136 * flow next 2109 2137 * flow reset 2110 2138 * flow vectorid <volumeId> -
trunk/packages/vizservers/nanovis/Makefile.in
r1310 r1351 36 36 DX_INC_SPEC = -I$(DX_DIR)/include 37 37 DX_LIB_SPEC = -L$(DX_DIR)/lib_linux -lDXcallm 38 FF_LIB_SPEC = -lavformat -lavcodec 38 FF_LIB_SPEC = -lavformat -lavcodec -lavutil 39 39 # might also need -lavutil 40 40 GL_INC_SPEC = -I/usr/include/GL … … 71 71 $(RP_LIB_SPEC) \ 72 72 $(DX_LIB_SPEC) \ 73 $(FF_LIB_SPEC) \74 73 $(IMG_LIB_SPEC) \ 75 74 $(R2_LIB_SPEC) \ … … 79 78 $(CG_LIB_SPEC) \ 80 79 $(GL_LIB_SPEC) \ 80 $(FF_LIB_SPEC) \ 81 81 $(EXTRA_LIBS) \ 82 82 -Wl,-rpath,$(LD_RUN_PATH) -
trunk/packages/vizservers/nanovis/RpAVTranslate.cpp
r1338 r1351 13 13 */ 14 14 15 #include "RpAVTranslate.h" 15 16 #include "nvconf.h" 16 17 17 18 #include <cstdlib> … … 19 20 #include <cstring> 20 21 #include <cmath> 21 22 22 #include <fstream> 23 23 #include <assert.h> 24 25 extern "C" { 26 #ifdef HAVE_FFMPEG_MEM_H 27 #include <ffmpeg/mem.h> 28 #endif 29 #ifdef HAVE_LIBAVUTIL_MEM_H 30 #include <libavutil/mem.h> 31 #endif 32 } 33 34 #include "RpAVTranslate.h" 24 35 25 36 #ifndef M_PI … … 29 40 using namespace Rappture; 30 41 31 extern int img_convert(AVPicture *dst, int dst_pix_fmt, 32 const AVPicture *src, int src_pix_fmt, 33 int src_width, int src_height); 34 35 AVTranslate::AVTranslate(size_t width, size_t height ) 42 AVTranslate::AVTranslate(size_t width, size_t height) : 43 _width (width), 44 _height (height), 45 _bitRate(400000), 46 _frameRate(25.0f), 47 _videoOutbufSize(200000), 48 _videoOutbuf(NULL), 49 _fmtPtr(NULL), 50 _ocPtr(NULL), 51 _avStreamPtr(NULL), 52 _pictPtr(NULL), 53 _rgbPictPtr(NULL) 54 { 55 } 56 57 AVTranslate::AVTranslate(size_t width, size_t height, size_t bitRate, 58 float frameRate) 36 59 : _width (width), 37 60 _height (height), 38 _bit_rate(400000), 39 _stream_frame_rate(25), 40 _video_outbuf_size (200000), 41 _video_outbuf (NULL), 42 _fmt (NULL), 43 _oc (NULL), 44 _video_st (NULL), 45 _picture(NULL), 46 _rgb_picture(NULL) 47 {} 48 49 AVTranslate::AVTranslate(size_t width, size_t height, size_t bit_rate, 50 double frame_rate) 51 : _width (width), 52 _height (height), 53 _bit_rate(bit_rate), 54 _stream_frame_rate(frame_rate), 55 _video_outbuf_size (200000), 56 _video_outbuf (NULL), 57 _fmt (NULL), 58 _oc (NULL), 59 _video_st (NULL), 60 _picture(NULL), 61 _rgb_picture(NULL) 62 {} 61 _bitRate(bitRate), 62 _frameRate(frameRate), 63 _videoOutbufSize(200000), 64 _videoOutbuf(NULL), 65 _fmtPtr(NULL), 66 _ocPtr(NULL), 67 _avStreamPtr(NULL), 68 _pictPtr(NULL), 69 _rgbPictPtr(NULL) 70 { 71 } 63 72 64 73 /** … … 84 93 AVTranslate::init(Outcome &status, const char *filename) 85 94 { 95 status.addContext("Rappture::AVTranslate::init()"); 86 96 /* initialize libavcodec, and register all codecs and formats */ 87 97 av_register_all(); … … 89 99 /* auto detect the output format from the name. default is 90 100 mpeg. */ 91 _fmt = guess_format(NULL, filename, NULL);92 if (_fmt == NULL) {101 _fmtPtr = guess_format(NULL, filename, NULL); 102 if (_fmtPtr == NULL) { 93 103 /* 94 104 printf( "Could not deduce output format from" 95 105 "file extension: using MPEG.\n"); 96 106 */ 97 _fmt = guess_format("mpeg", NULL, NULL);98 } 99 if (_fmt == NULL) {107 _fmtPtr = guess_format("mpeg", NULL, NULL); 108 } 109 if (_fmtPtr == NULL) { 100 110 status.addError("Could not find suitable output format"); 101 status.addContext("Rappture::AVTranslate::init()");102 return false;103 } 104 111 return false; 112 } 113 114 #ifdef notdef 105 115 /* allocate the output media context */ 106 _oc = av_alloc_format_context(); 107 if (!_oc) { 116 _ocPtr = av_alloc_format_context(); 117 #else 118 _ocPtr = avformat_alloc_context(); 119 #endif 120 if (!_ocPtr) { 108 121 status.addError("Memory error while allocating format context"); 109 122 return false; 110 123 } 111 _oc ->oformat = _fmt;112 snprintf(_oc ->filename, sizeof(_oc->filename), "%s", filename);124 _ocPtr->oformat = _fmtPtr; 125 snprintf(_ocPtr->filename, sizeof(_ocPtr->filename), "%s", filename); 113 126 114 127 /* add the video stream using the default format codecs 115 128 and initialize the codecs */ 116 _video_st = NULL; 117 if (_fmt->video_codec != CODEC_ID_NONE) { 118 if ( (!addVideoStream(status, _fmt->video_codec,&_video_st)) ) { 119 status.addContext("Rappture::AVTranslate::init()"); 129 _avStreamPtr = NULL; 130 if (_fmtPtr->video_codec != CODEC_ID_NONE) { 131 if ( (!addVideoStream(status, _fmtPtr->video_codec,&_avStreamPtr)) ) { 120 132 return false; 121 133 } … … 124 136 /* set the output parameters (must be done even if no 125 137 parameters). */ 126 if (av_set_parameters(_oc , NULL) < 0) {138 if (av_set_parameters(_ocPtr, NULL) < 0) { 127 139 status.addError("Invalid output format parameters"); 128 status.addContext("Rappture::AVTranslate::init()"); 129 return false; 130 } 131 132 dump_format(_oc, 0, filename, 1); 140 return false; 141 } 142 143 dump_format(_ocPtr, 0, filename, 1); 133 144 134 145 /* now that all the parameters are set, we can open the 135 146 video codec and allocate the necessary encode buffers */ 136 if (_ video_st) {147 if (_avStreamPtr) { 137 148 if (!openVideo(status)) { 138 status.addContext("Rappture::AVTranslate::init()");139 149 return false; 140 150 } … … 142 152 143 153 /* open the output file, if needed */ 144 if (!(_fmt ->flags & AVFMT_NOFILE)) {145 if (url_fopen(&_oc ->pb, filename, URL_WRONLY) < 0) {154 if (!(_fmtPtr->flags & AVFMT_NOFILE)) { 155 if (url_fopen(&_ocPtr->pb, filename, URL_WRONLY) < 0) { 146 156 status.addError("Could not open '%s'", filename); 147 status.addContext("Rappture::AVTranslate::init()");148 157 return false; 149 158 } … … 151 160 152 161 /* write the stream header, if any */ 153 av_write_header(_oc); 154 return true; 155 } 156 157 bool 158 AVTranslate::append(Outcome &status, uint8_t *rgb_data, size_t line_pad) 159 { 160 161 if (rgb_data == NULL) { 162 status.addError("rdb_data pointer is NULL"); 163 status.addContext("Rappture::AVTranslate::append()"); 164 return false; 165 } 166 167 uint8_t *pdatat = _rgb_picture->data[0]; 168 uint8_t *rgbcurr = rgb_data; 169 162 av_write_header(_ocPtr); 163 return true; 164 } 165 166 bool 167 AVTranslate::append(Outcome &status, uint8_t *rgbData, size_t linePad) 168 { 169 status.addContext("Rappture::AVTranslate::append()"); 170 if (rgbData == NULL) { 171 status.addError("rdbData pointer is NULL"); 172 return false; 173 } 174 175 uint8_t *destPtr = _rgbPictPtr->data[0]; 176 uint8_t *srcPtr = rgbData; 170 177 for (size_t y = 0; y < _height; y++) { 171 178 for (size_t x = 0; x < _width; x++) { 172 pdatat[0] = rgbcurr[0]; 173 pdatat[1] = rgbcurr[1]; 174 pdatat[2] = rgbcurr[2]; 175 176 rgbcurr += 3; 177 pdatat +=3; 179 destPtr[0] = srcPtr[0]; 180 destPtr[1] = srcPtr[1]; 181 destPtr[2] = srcPtr[2]; 182 srcPtr += 3; 183 destPtr +=3; 178 184 } 179 rgbcurr += line_pad; 180 } 181 185 srcPtr += linePad; 186 } 187 188 #ifdef HAVE_IMG_CONVERT 182 189 // use img_convert instead of sws_scale because img_convert 183 190 // is lgpl nad sws_scale is gpl 184 img_convert((AVPicture *)_pict ure, PIX_FMT_YUV420P,185 (AVPicture *)_rgb _picture, PIX_FMT_RGB24,191 img_convert((AVPicture *)_pictPtr, PIX_FMT_YUV420P, 192 (AVPicture *)_rgbPictPtr, PIX_FMT_RGB24, 186 193 _width, _height); 194 #endif /*HAVE_IMG_CONVERT*/ 187 195 writeVideoFrame(status); 188 196 … … 197 205 198 206 /* close each codec */ 199 if (_ video_st) {207 if (_avStreamPtr) { 200 208 closeVideo(status); 201 209 } 202 210 203 211 /* write the trailer, if any */ 204 av_write_trailer(_oc );212 av_write_trailer(_ocPtr); 205 213 206 214 /* free the streams */ 207 for(i = 0; i < _oc ->nb_streams; i++) {208 av_freep(&_oc ->streams[i]->codec);209 // _oc ->streams[i]->codec = NULL;210 211 av_freep(&_oc ->streams[i]);212 // _oc ->streams[i] = NULL;213 } 214 215 if (!(_fmt ->flags & AVFMT_NOFILE)) {215 for(i = 0; i < _ocPtr->nb_streams; i++) { 216 av_freep(&_ocPtr->streams[i]->codec); 217 // _ocPtr->streams[i]->codec = NULL; 218 219 av_freep(&_ocPtr->streams[i]); 220 // _ocPtr->streams[i] = NULL; 221 } 222 223 if (!(_fmtPtr->flags & AVFMT_NOFILE)) { 216 224 /* close the output file */ 217 url_fclose(_oc ->pb);225 url_fclose(_ocPtr->pb); 218 226 } 219 227 220 228 /* free the stream */ 221 av_free(_oc );222 _oc = NULL;229 av_free(_ocPtr); 230 _ocPtr = NULL; 223 231 return true; 224 232 } … … 227 235 /* add a video output stream */ 228 236 bool 229 AVTranslate::addVideoStream(Outcome &status, CodecID codec_id, AVStream **st) 230 { 231 AVCodecContext *c; 232 // AVStream *st; 233 234 if (!st) { 237 AVTranslate::addVideoStream(Outcome &status, CodecID codec_id, 238 AVStream **streamPtrPtr) 239 { 240 status.addContext("Rappture::AVTranslate::add_video_stream()"); 241 if (streamPtrPtr == NULL) { 235 242 status.addError("AVStream **st is NULL"); 236 status.addContext("Rappture::AVTranslate::add_video_stream()");237 return false;238 } 239 240 *st = av_new_stream(_oc, 0);241 if ( !(*st)) {243 return false; 244 } 245 246 AVStream *streamPtr; 247 streamPtr = av_new_stream(_ocPtr, 0); 248 if (streamPtr == NULL) { 242 249 status.addError("Could not alloc stream"); 243 status.addContext("Rappture::AVTranslate::add_video_stream()");244 return false;245 } 246 247 c = (*st)->codec;248 c ->codec_id = codec_id;249 c ->codec_type = CODEC_TYPE_VIDEO;250 return false; 251 } 252 253 AVCodecContext *codecPtr; 254 codecPtr = streamPtr->codec; 255 codecPtr->codec_id = codec_id; 256 codecPtr->codec_type = CODEC_TYPE_VIDEO; 250 257 251 258 /* put sample parameters */ 252 c ->bit_rate = _bit_rate;259 codecPtr->bit_rate = _bitRate; 253 260 /* resolution must be a multiple of two */ 254 c ->width = _width;255 c ->height = _height;261 codecPtr->width = _width; 262 codecPtr->height = _height; 256 263 /* time base: this is the fundamental unit of time (in seconds) in terms 257 264 of which frame timestamps are represented. for fixed-fps content, 258 265 timebase should be 1/framerate and timestamp increments should be 259 266 identically 1. */ 260 c->time_base.den = _stream_frame_rate; 261 c->time_base.num = 1; 262 c->gop_size = 12; /* emit one intra frame every twelve frames at most */ 263 c->pix_fmt = PIX_FMT_YUV420P; 264 if (c->codec_id == CODEC_ID_MPEG2VIDEO) { 267 codecPtr->time_base.den = _frameRate; 268 codecPtr->time_base.num = 1; 269 codecPtr->gop_size = 12; /* emit one intra frame every twelve frames at 270 * most */ 271 codecPtr->pix_fmt = PIX_FMT_YUV420P; 272 if (codecPtr->codec_id == CODEC_ID_MPEG2VIDEO) { 265 273 /* just for testing, we also add B frames */ 266 c ->max_b_frames = 2;267 } 268 if (c ->codec_id == CODEC_ID_MPEG1VIDEO) {274 codecPtr->max_b_frames = 2; 275 } 276 if (codecPtr->codec_id == CODEC_ID_MPEG1VIDEO) { 269 277 /* Needed to avoid using macroblocks in which some coeffs overflow. 270 278 This does not happen with normal video, it just happens here as 271 279 the motion of the chroma plane does not match the luma plane. */ 272 c ->mb_decision=2;280 codecPtr->mb_decision=2; 273 281 } 274 282 // some formats want stream headers to be separate 275 if( !strcmp(_oc->oformat->name, "mp4") 276 || !strcmp(_oc->oformat->name, "mov") 277 || !strcmp(_oc->oformat->name, "3gp")) { 278 c->flags |= CODEC_FLAG_GLOBAL_HEADER; 279 } 280 281 return true; 282 } 283 284 bool 285 AVTranslate::allocPicture(Outcome &status, int pix_fmt, AVFrame **p) 286 { 287 // AVFrame *p = NULL; 288 uint8_t *p_buf = NULL; 289 int size = 0; 290 291 if (p == NULL) { 283 if((strcmp(_ocPtr->oformat->name, "mp4") == 0) || 284 (strcmp(_ocPtr->oformat->name, "mov") == 0) || 285 (strcmp(_ocPtr->oformat->name, "3gp") == 0)) { 286 codecPtr->flags |= CODEC_FLAG_GLOBAL_HEADER; 287 } 288 *streamPtrPtr = streamPtr; 289 return true; 290 } 291 292 bool 293 AVTranslate::allocPicture(Outcome &status, int pixFmt, AVFrame **framePtrPtr) 294 { 295 status.addContext("Rappture::AVTranslate::allocPicture()"); 296 if (framePtrPtr == NULL) { 292 297 status.addError("AVFrame **p == NULL"); 293 status.addContext("Rappture::AVTranslate::allocPicture()");294 return false;295 } 296 297 *p= avcodec_alloc_frame();298 if ( *p== NULL) {298 return false; 299 } 300 301 AVFrame *framePtr; 302 framePtr = avcodec_alloc_frame(); 303 if (framePtr == NULL) { 299 304 status.addError("Memory error: Could not alloc frame"); 300 status.addContext("Rappture::AVTranslate::allocPicture()"); 301 return false; 302 } 303 size = avpicture_get_size(pix_fmt, _width, _height); 304 p_buf = (uint8_t *) av_malloc(size); 305 if (!p_buf) { 306 av_free(*p); 307 *p = NULL; 305 return false; 306 } 307 308 size_t size; 309 size = avpicture_get_size(pixFmt, _width, _height); 310 311 uint8_t *bits; 312 bits = (uint8_t *)av_malloc(size); 313 if (bits == NULL) { 314 av_free(framePtr); 308 315 status.addError("Memory error: Could not alloc picture buffer"); 309 status.addContext("Rappture::AVTranslate::allocPicture()");310 return false;311 }312 avpicture_fill((AVPicture *)(*p), p_buf, pix_fmt, _width, _height);316 return false; 317 } 318 avpicture_fill((AVPicture *)framePtr, bits, pixFmt, _width, _height); 319 *framePtrPtr = framePtr; 313 320 return true; 314 321 } … … 320 327 AVCodecContext *c; 321 328 322 c = _video_st->codec; 329 status.addContext("Rappture::AVTranslate::openVideo()"); 330 c = _avStreamPtr->codec; 323 331 324 332 /* find the video encoder */ … … 326 334 if (!codec) { 327 335 status.addError("codec not found"); 328 status.addContext("Rappture::AVTranslate::open_video()");329 336 return false; 330 337 } … … 333 340 if (avcodec_open(c, codec) < 0) { 334 341 status.addError("could not open codec"); 335 status.addContext("Rappture::AVTranslate::open_video()"); 336 return false; 337 } 338 339 _video_outbuf = NULL; 340 if (!(_oc->oformat->flags & AVFMT_RAWPICTURE)) { 342 return false; 343 } 344 345 _videoOutbuf = NULL; 346 if (!(_ocPtr->oformat->flags & AVFMT_RAWPICTURE)) { 341 347 /* allocate output buffer */ 342 348 /* XXX: API change will be done */ … … 345 351 they're freed appropriately (such as using av_free for buffers 346 352 allocated with av_malloc) */ 347 _video_outbuf = (uint8_t *) av_malloc(_video_outbuf_size); 348 } 349 350 /* allocate the encoded raw picture */ 351 if (!allocPicture(status, c->pix_fmt,&_picture)) { 352 status.addContext("Rappture::AVTranslate::openVideo()"); 353 return false; 354 } 355 356 /* 357 if (!picture) { 358 status.addError("Could not allocate picture"); 359 status.addContext("Rappture::AVTranslate::openVideo()"); 360 return false; 361 } 362 */ 363 364 if (!allocPicture(status, PIX_FMT_RGB24,&_rgb_picture)) { 365 status.addContext("Rappture::AVTranslate::openVideo()"); 366 return false; 367 } 368 369 /* 370 if (!rgb_picture) { 371 status.addError("Could not allocate temporary picture"); 372 status.addContext("Rappture::AVTranslate::open_video()"); 373 return false; 374 } 375 */ 376 353 _videoOutbuf = (uint8_t *) av_malloc(_videoOutbufSize); 354 } 355 /* Allocate the encoded raw picture */ 356 if (!allocPicture(status, c->pix_fmt, &_pictPtr)) { 357 return false; 358 } 359 if (!allocPicture(status, PIX_FMT_RGB24, &_rgbPictPtr)) { 360 status.addError("allocPicture: can't allocate picture"); 361 return false; 362 } 377 363 return true; 378 364 } … … 381 367 AVTranslate::writeVideoFrame(Outcome &status) 382 368 { 383 int out_size, ret;384 AVCodecContext *c; 385 386 c = _video_st->codec;369 AVCodecContext *codecPtr; 370 371 status.addContext("Rappture::AVTranslate::writeVideoframe()"); 372 codecPtr = _avStreamPtr->codec; 387 373 388 374 /* encode the image */ 389 out_size = avcodec_encode_video(c, _video_outbuf, 390 _video_outbuf_size, _picture); 391 392 /* if zero size, it means the image was buffered */ 393 if (out_size > 0) { 394 AVPacket pkt; 395 av_init_packet(&pkt); 396 397 pkt.pts = av_rescale_q( c->coded_frame->pts, 398 c->time_base, 399 _video_st->time_base); 400 401 if (c->coded_frame->key_frame) { 402 pkt.flags |= PKT_FLAG_KEY; 403 } 404 pkt.stream_index = _video_st->index; 405 pkt.data = _video_outbuf; 406 pkt.size = out_size; 407 408 /* write the compressed frame in the media file */ 409 ret = av_write_frame(_oc, &pkt); 410 } else { 411 ret = 0; 412 } 413 414 if (ret != 0) { 375 int size; 376 size = avcodec_encode_video(codecPtr, _videoOutbuf, _videoOutbufSize, 377 _pictPtr); 378 if (size < 0) { 415 379 status.addError("Error while writing video frame"); 416 status.addContext("Rappture::AVTranslate::writeVideoframe()");417 380 return false; 418 381 } 382 if (size == 0) { 383 return true; /* Image was buffered */ 384 } 385 AVPacket pkt; 386 av_init_packet(&pkt); 387 388 pkt.pts = av_rescale_q(codecPtr->coded_frame->pts, codecPtr->time_base, 389 _avStreamPtr->time_base); 390 if (codecPtr->coded_frame->key_frame) { 391 pkt.flags |= PKT_FLAG_KEY; 392 } 393 pkt.stream_index = _avStreamPtr->index; 394 pkt.data = _videoOutbuf; 395 pkt.size = size; 396 397 /* write the compressed frame i the media file */ 398 if (av_write_frame(_ocPtr, &pkt) < 0) { 399 status.addError("Error while writing video frame"); 400 return false; 401 } 419 402 return true; 420 403 } … … 424 407 AVTranslate::closeVideo(Outcome &status) 425 408 { 426 avcodec_close(_video_st->codec); 427 428 av_free(_picture->data[0]); 429 _picture->data[0] = NULL; 430 431 av_free(_picture); 432 _picture = NULL; 433 434 av_free(_rgb_picture->data[0]); 435 _rgb_picture->data[0] = NULL; 436 437 av_free(_rgb_picture); 438 _rgb_picture = NULL; 439 440 av_free(_video_outbuf); 441 _video_outbuf = NULL; 409 if (_avStreamPtr != NULL) { 410 avcodec_close(_avStreamPtr->codec); 411 } 412 if (_pictPtr != NULL) { 413 av_free(_pictPtr->data[0]); 414 av_free(_pictPtr); 415 _pictPtr = NULL; 416 } 417 if (_rgbPictPtr != NULL) { 418 av_free(_rgbPictPtr->data[0]); 419 av_free(_rgbPictPtr); 420 _rgbPictPtr = NULL; 421 } 422 if (_videoOutbuf != NULL) { 423 av_free(_videoOutbuf); 424 _videoOutbuf = NULL; 425 } 442 426 return true; 443 427 } -
trunk/packages/vizservers/nanovis/RpAVTranslate.h
r1325 r1351 35 35 AVTranslate(size_t width, size_t height); 36 36 37 AVTranslate(size_t width, size_t height, size_t bit_rate, 38 double frame_rate); 37 AVTranslate(size_t width, size_t height, size_t bitRate, float frameRate); 39 38 40 39 virtual ~AVTranslate(); 41 40 42 41 bool init(Outcome &status, const char *filename ); 43 bool append(Outcome &status, uint8_t *rgb _data, size_t line_pad);42 bool append(Outcome &status, uint8_t *rgbData, size_t linePad); 44 43 bool done(Outcome &status); 45 44 46 45 private: 47 bool addVideoStream(Outcome &status, CodecID codec _id, AVStream **stream);48 bool allocPicture(Outcome &status, int pix _fmt, AVFrame **pic );46 bool addVideoStream(Outcome &status, CodecID codecId, AVStream **stream); 47 bool allocPicture(Outcome &status, int pixFmt, AVFrame **pic ); 49 48 bool openVideo(Outcome &status); 50 49 bool writeVideoFrame(Outcome &status); … … 53 52 size_t _width; 54 53 size_t _height; 55 size_t _bit _rate;56 double _stream_frame_rate;// frames/seconds57 size_t _video _outbuf_size;58 uint8_t *_video _outbuf;54 size_t _bitRate; 55 float _frameRate; // frames/seconds 56 size_t _videoOutbufSize; 57 uint8_t *_videoOutbuf; 59 58 60 61 AVOutputFormat *_fmt; 62 AVFormatContext *_oc; 63 AVStream *_video_st; 64 AVFrame *_picture; 65 AVFrame *_rgb_picture; 59 size_t width(void) { 60 return _width; 61 } 62 void width(size_t width) { 63 _width = width; 64 } 65 size_t height(void) { 66 return _width; 67 } 68 void height(size_t width) { 69 _width = width; 70 } 71 size_t bitRate(void) { 72 return _bitRate; 73 } 74 void bitRate(size_t bitRate) { 75 _bitRate = bitRate; 76 } 77 float frameRate(void) { 78 return _frameRate; 79 } 80 void frameRate(size_t frameRate) { 81 _frameRate = frameRate; 82 } 83 AVOutputFormat *_fmtPtr; 84 AVFormatContext *_ocPtr; 85 AVStream *_avStreamPtr; 86 AVFrame *_pictPtr, *_rgbPictPtr; 66 87 67 88 }; -
trunk/packages/vizservers/nanovis/nanovis.cpp
r1331 r1351 150 150 bool volume_mode = true; 151 151 152 #ifdef notdef153 // color table for built-in transfer function editor154 float color_table[256][4];155 #endif156 157 152 // in Command.cpp 158 153 extern Tcl_Interp *initTcl(); … … 412 407 CGprogram program; 413 408 program = cgCreateProgramFromFile(context, CG_SOURCE, path, profile, 414 409 entryPoint, NULL); 415 410 cgGLLoadProgram(program); 416 411 417 412 CGerror LastError = cgGetError(); 418 413 if (LastError) 419 420 421 414 { 415 printf("Error message: %s\n", cgGetLastListing(context)); 416 } 422 417 423 418 delete [] path; … … 503 498 if (vol->pointsetIndex != -1) { 504 499 if (((unsigned int) vol->pointsetIndex) < pointSet.size() && 505 500 pointSet[vol->pointsetIndex] != NULL) { 506 501 delete pointSet[vol->pointsetIndex]; 507 502 pointSet[vol->pointsetIndex] = 0; … … 511 506 } 512 507 volume[index] = new Volume(0.f, 0.f, 0.f, width, height, depth, 1., 513 508 n_component, data, vmin, vmax, nzero_min); 514 509 return volume[index]; 515 510 } … … 551 546 } 552 547 553 #ifdef notdef554 //Update the transfer function using local GUI in the non-server mode555 void556 update_tf_texture()557 {558 glutSetWindow(NanoVis::render_window);559 560 //fprintf(stderr, "tf update\n");561 TransferFunction *tf = NanoVis::get_transfunc("default");562 if (tf == NULL) {563 return;564 }565 566 float data[256*4];567 for(int i=0; i<256; i++) {568 data[4*i+0] = color_table[i][0];569 data[4*i+1] = color_table[i][1];570 data[4*i+2] = color_table[i][2];571 data[4*i+3] = color_table[i][3];572 //fprintf(stderr, "(%f,%f,%f,%f) ", data[4*i+0], data[4*i+1], data[4*i+2], data[4*i+3]);573 }574 575 tf->update(data);576 577 #ifdef EVENTLOG578 float param[3] = {0,0,0};579 Event* tmp = new Event(EVENT_ROTATE, param, NvGetTimeInterval());580 tmp->write(event_log);581 delete tmp;582 #endif583 }584 #endif585 586 548 int 587 549 NanoVis::render_legend(TransferFunction *tf, double min, double max, 588 550 int width, int height, const char* volArg) 589 551 { 590 552 if (debug_flag) { … … 660 622 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, final_depth_rb); 661 623 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, 662 624 win_width, win_height); 663 625 glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, 664 626 GL_TEXTURE_2D, final_color_tex, 0); 665 627 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, 666 628 GL_RENDERBUFFER_EXT, final_depth_rb); 667 629 668 630 GLenum status; … … 701 663 //fprintf(stderr, "screen_buffer size: %d\n", sizeof(screen_buffer)); 702 664 if (debug_flag) { 703 665 fprintf(stderr, "screen_buffer size: %d %d\n", w, h); 704 666 } 705 667 … … 718 680 719 681 if (debug_flag) { 720 682 fprintf(stderr, "before deleteframebuffers\n"); 721 683 } 722 684 glDeleteFramebuffersEXT(1, &final_fbo); … … 750 712 glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, final_depth_rb); 751 713 glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, 752 714 win_width, win_height); 753 715 glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, 754 716 GL_TEXTURE_2D, final_color_tex, 0); 755 717 glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, 756 718 GL_RENDERBUFFER_EXT, final_depth_rb); 757 719 758 720 GLenum status; 759 721 if (!CheckFBO(&status)) { 760 722 PrintFBOStatus(status, "final_fbo"); 761 723 DoExit(3); 762 724 } 763 725 764 726 //CHECK_FRAMEBUFFER_STATUS(); 765 727 if (debug_flag) { 766 728 fprintf(stderr, "change camera\n"); 767 729 } 768 730 //change the camera setting … … 801 763 { 802 764 //random placement on a slice 803 float* data = new float[particleRenderer->psys_width * particleRenderer->psys_height * 4]; 804 bzero(data, sizeof(float)*4* particleRenderer->psys_width * particleRenderer->psys_height); 765 size_t n = particleRenderer->psys_width * particleRenderer->psys_height * 4; 766 float* data = new float[n]; 767 memset(data, 0, sizeof(float)* n); 805 768 806 769 int index; … … 822 785 data[4*index+3]= rand() / ((float) RAND_MAX) * 0.5 + 0.5f; //shorter life span, quicker iterations 823 786 } 824 /*825 826 827 828 829 830 831 832 */787 /* 788 else 789 { 790 data[4*index] = 0; 791 data[4*index+1]= 0; 792 data[4*index+2]= 0; 793 data[4*index+3]= 0; 794 } 795 */ 833 796 } 834 797 } … … 912 875 NanoVis::initGL(void) 913 876 { 914 if (debug_flag) {915 916 }917 //buffer to store data read from the screen918 if (screen_buffer) {919 920 921 }922 screen_buffer = new unsigned char[4*win_width*win_height];923 assert(screen_buffer != NULL);924 925 //create the camera with default setting926 cam = new NvCamera(0, 0, win_width, win_height,927 928 929 930 931 glEnable(GL_TEXTURE_2D);932 glShadeModel(GL_FLAT);933 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);934 935 glClearColor(0,0,0,1);936 //glClearColor(0.7,0.7,0.7,1);937 glClear(GL_COLOR_BUFFER_BIT);938 939 //initialize lighting940 GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};941 GLfloat mat_shininess[] = {30.0};942 GLfloat white_light[] = {1.0, 1.0, 1.0, 1.0};943 GLfloat green_light[] = {0.1, 0.5, 0.1, 1.0};944 945 glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);946 glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);947 glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light);948 glLightfv(GL_LIGHT0, GL_SPECULAR, white_light);949 glLightfv(GL_LIGHT1, GL_DIFFUSE, green_light);950 glLightfv(GL_LIGHT1, GL_SPECULAR, white_light);951 952 // init table of transfer functions953 Tcl_InitHashTable(&tftable, TCL_STRING_KEYS);954 955 //check if performance query is supported956 if(check_query_support()){957 958 959 }960 961 init_offscreen_buffer(); //frame buffer object for offscreen rendering962 963 //create volume renderer and add volumes to it964 vol_renderer = new VolumeRenderer();965 966 // create967 renderContext = new graphics::RenderContext();877 if (debug_flag) { 878 fprintf(stderr, "in initGL\n"); 879 } 880 //buffer to store data read from the screen 881 if (screen_buffer) { 882 delete[] screen_buffer; 883 screen_buffer = NULL; 884 } 885 screen_buffer = new unsigned char[4*win_width*win_height]; 886 assert(screen_buffer != NULL); 887 888 //create the camera with default setting 889 cam = new NvCamera(0, 0, win_width, win_height, 890 def_eye_x, def_eye_y, def_eye_z, /* location. */ 891 def_target_x, def_target_y, def_target_z, /* target. */ 892 def_rot_x, def_rot_y, def_rot_z); /* angle. */ 893 894 glEnable(GL_TEXTURE_2D); 895 glShadeModel(GL_FLAT); 896 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 897 898 glClearColor(0,0,0,1); 899 //glClearColor(0.7,0.7,0.7,1); 900 glClear(GL_COLOR_BUFFER_BIT); 901 902 //initialize lighting 903 GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0}; 904 GLfloat mat_shininess[] = {30.0}; 905 GLfloat white_light[] = {1.0, 1.0, 1.0, 1.0}; 906 GLfloat green_light[] = {0.1, 0.5, 0.1, 1.0}; 907 908 glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); 909 glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); 910 glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light); 911 glLightfv(GL_LIGHT0, GL_SPECULAR, white_light); 912 glLightfv(GL_LIGHT1, GL_DIFFUSE, green_light); 913 glLightfv(GL_LIGHT1, GL_SPECULAR, white_light); 914 915 // init table of transfer functions 916 Tcl_InitHashTable(&tftable, TCL_STRING_KEYS); 917 918 //check if performance query is supported 919 if(check_query_support()){ 920 //create queries to count number of rendered pixels 921 perf = new PerfQuery(); 922 } 923 924 init_offscreen_buffer(); //frame buffer object for offscreen rendering 925 926 //create volume renderer and add volumes to it 927 vol_renderer = new VolumeRenderer(); 928 929 // create 930 renderContext = new graphics::RenderContext(); 968 931 969 //create an 2D plane renderer970 plane_render = new PlaneRenderer(g_context, win_width, win_height);932 //create an 2D plane renderer 933 plane_render = new PlaneRenderer(g_context, win_width, win_height); 971 934 #if PROTOTYPE 972 make_test_2D_data();935 make_test_2D_data(); 973 936 #endif /* PROTOTYPE */ 974 plane_render->add_plane(plane[0], get_transfunc("default")); 975 976 //assert(glGetError()==0); 977 978 #ifdef notdef 979 init_particle_system(); 980 NanoVis::init_lic(); 981 #endif 982 if (debug_flag) { 983 fprintf(stderr, "leaving initGL\n"); 984 } 937 plane_render->add_plane(plane[0], get_transfunc("default")); 938 939 //assert(glGetError()==0); 940 941 if (debug_flag) { 942 fprintf(stderr, "leaving initGL\n"); 943 } 985 944 } 986 945 … … 1279 1238 NanoVis::sendDataToClient(const char *command, const char *data, size_t dlen) 1280 1239 { 1281 /*1282 char header[200];1283 1284 // Generate the PPM binary file header1285 sprintf(header, "P6 %d %d %d\n", win_width, win_height, PPM_MAXVAL);1286 1287 size_t header_length = strlen(header);1288 size_t data_length = win_width * win_height * 3;1289 1290 char command[200];1291 sprintf(command, "%s %lu\n", prefix,1292 1293 */1294 1295 // size_t wordsPerRow = (win_width * 24 + 31) / 32;1296 // size_t bytesPerRow = wordsPerRow * 4;1297 // size_t rowLength = win_width * 3;1240 /* 1241 char header[200]; 1242 1243 // Generate the PPM binary file header 1244 sprintf(header, "P6 %d %d %d\n", win_width, win_height, PPM_MAXVAL); 1245 1246 size_t header_length = strlen(header); 1247 size_t data_length = win_width * win_height * 3; 1248 1249 char command[200]; 1250 sprintf(command, "%s %lu\n", prefix, 1251 (unsigned long)header_length + data_length); 1252 */ 1253 1254 // size_t wordsPerRow = (win_width * 24 + 31) / 32; 1255 // size_t bytesPerRow = wordsPerRow * 4; 1256 // size_t rowLength = win_width * 3; 1298 1257 size_t nRecs = 2; 1299 1258 … … 1303 1262 // Write the nanovisviewer command, then the image header and data. 1304 1263 // Command 1305 // FIXME: shouldn't have to cast this1264 // FIXME: shouldn't have to cast this 1306 1265 iov[0].iov_base = (char *)command; 1307 1266 iov[0].iov_len = strlen(command); 1308 1267 // Data 1309 // FIXME: shouldn't have to cast this1268 // FIXME: shouldn't have to cast this 1310 1269 iov[1].iov_base = (char *)data; 1311 1270 iov[1].iov_len = dlen; … … 1316 1275 } 1317 1276 1318 #ifdef notdef1319 //draw vectors1320 void draw_arrows()1321 {1322 glColor4f(0.,0.,1.,1.);1323 for(int i=0; i<NMESH; i++){1324 for(int j=0; j<NMESH; j++){1325 Vector2 v = grid.get(i, j);1326 1327 int x1 = i*DM;1328 int y1 = j*DM;1329 1330 int x2 = x1 + v.x;1331 int y2 = y1 + v.y;1332 1333 glBegin(GL_LINES);1334 glVertex2d(x1, y1);1335 glVertex2d(x2, y2);1336 glEnd();1337 }1338 }1339 }1340 #endif1341 1342 1277 1343 1278 /*----------------------------------------------------*/ … … 1350 1285 glutSetWindow(render_window); 1351 1286 1352 #ifdef notdef1353 struct timespec ts;1354 ts.tv_sec = 0;1355 ts.tv_nsec = 300000000;1356 nanosleep(&ts, 0);1357 #endif1358 1287 #ifdef XINETD 1359 1288 xinetd_listen(); … … 1398 1327 1399 1328 1400 #ifdef notdef1401 1402 static int1403 particle_distance_sort(const void* a, const void* b)1404 {1405 if((*((Particle*)a)).aux > (*((Particle*)b)).aux) {1406 return -1;1407 } else {1408 return 1;1409 }1410 }1411 1412 void soft_read_verts()1413 {1414 glReadPixels(0, 0, psys->psys_width, psys->psys_height, GL_RGB, GL_FLOAT,1415 vert);1416 //fprintf(stderr, "soft_read_vert");1417 1418 //cpu sort the distance1419 Particle* p;1420 p = (Particle*)malloc(sizeof(Particle)*psys->psys_width*psys->psys_height);1421 for (int i=0; i<psys->psys_width * psys->psys_height; i++) {1422 float x = vert[3*i];1423 float y = vert[3*i+1];1424 float z = vert[3*i+2];1425 float dx, dy, dz;1426 dx = x - cam->x();1427 dy = y - cam->y();1428 dz = z - cam->z();1429 float dis = (dx * dx) + (dy * dy) + (dz * dz);1430 p[i].x = x;1431 p[i].y = y;1432 p[i].z = z;1433 p[i].aux = dis;1434 }1435 1436 qsort(p, psys->psys_width * psys->psys_height, sizeof(Particle), particle_distance_sort);1437 1438 for(int i=0; i<psys->psys_width * psys->psys_height; i++){1439 vert[3*i] = p[i].x;1440 vert[3*i+1] = p[i].y;1441 vert[3*i+2] = p[i].z;1442 }1443 1444 free(p);1445 }1446 #endif1447 1448 #ifdef notdef1449 //display the content of a texture as a screen aligned quad1450 void1451 display_texture(NVISid tex, int width, int height)1452 {1453 glPushMatrix();1454 1455 glEnable(GL_TEXTURE_2D);1456 glBindTexture(GL_TEXTURE_RECTANGLE_NV, tex);1457 1458 glViewport(0, 0, width, height);1459 glMatrixMode(GL_PROJECTION);1460 glLoadIdentity();1461 gluOrtho2D(0, width, 0, height);1462 glMatrixMode(GL_MODELVIEW);1463 glLoadIdentity();1464 1465 cgGLBindProgram(m_passthru_fprog);1466 cgGLEnableProfile(CG_PROFILE_FP30);1467 1468 cgGLSetParameter4f(m_passthru_scale_param, 1.0, 1.0, 1.0, 1.0);1469 cgGLSetParameter4f(m_passthru_bias_param, 0.0, 0.0, 0.0, 0.0);1470 1471 draw_quad(width, height, width, height);1472 cgGLDisableProfile(CG_PROFILE_FP30);1473 1474 glPopMatrix();1475 1476 //assert(glGetError()==0);1477 }1478 #endif1479 1480 1481 //draw vertices in the main memory1482 #ifdef notdef1483 void1484 soft_display_verts()1485 {1486 glDisable(GL_TEXTURE_2D);1487 glEnable(GL_BLEND);1488 1489 glPointSize(0.5);1490 glColor4f(0,0.8,0.8,0.6);1491 glBegin(GL_POINTS);1492 {1493 for(int i=0; i < psys->psys_width * psys->psys_height; i++){1494 glVertex3f(vert[3*i], vert[3*i+1], vert[3*i+2]);1495 }1496 }1497 glEnd();1498 //fprintf(stderr, "soft_display_vert");1499 }1500 #endif1501 1329 1502 1330 #if 0 … … 1534 1362 float(ppass%pstage), float((pstage+pstage)-(ppass%pstage)-1)); 1535 1363 glUniform3fARB(oddevenMergeSort.getUniformLocation("Param2"), 1536 1364 float(psys_width), float(psys_height), float(ppass)); 1537 1365 glUniform1iARB(oddevenMergeSort.getUniformLocation("Data"), 0); 1538 1366 staticdebugmsg("sort","stage "<<pstage<<" pass "<<ppass); … … 1672 1500 } 1673 1501 1674 #ifdef notdef1675 void1676 draw_axis()1677 {1678 glDisable(GL_TEXTURE_2D);1679 glEnable(GL_DEPTH_TEST);1680 1681 //red x1682 glColor3f(1,0,0);1683 glBegin(GL_LINES);1684 {1685 glVertex3f(0,0,0);1686 glVertex3f(1.5,0,0);1687 }1688 glEnd();1689 1690 //blue y1691 glColor3f(0,0,1);1692 glBegin(GL_LINES);1693 {1694 glVertex3f(0,0,0);1695 glVertex3f(0,1.5,0);1696 }1697 glEnd();1698 1699 //green z1700 glColor3f(0,1,0);1701 glBegin(GL_LINES);1702 {1703 glVertex3f(0,0,0);1704 glVertex3f(0,0,1.5);1705 }1706 glEnd();1707 1708 glEnable(GL_TEXTURE_2D);1709 glDisable(GL_DEPTH_TEST);1710 }1711 #endif1712 1713 1502 void NanoVis::update() 1714 1503 { … … 1892 1681 if (volume_mode) { 1893 1682 if (debug_flag) { 1894 1683 fprintf(stderr, "in display: volume_mode\n"); 1895 1684 } 1896 1685 //3D rendering mode … … 1943 1732 grid->render(); 1944 1733 } 1945 if ( licRenderer && licRenderer->isActivated()) {1734 if ((licRenderer != NULL) && (licRenderer->isActivated())) { 1946 1735 licRenderer->render(); 1947 1736 } 1948 if ( particleRenderer && particleRenderer->isActivated()) {1737 if ((particleRenderer != NULL) && (particleRenderer->isActivated())) { 1949 1738 particleRenderer->render(); 1950 1739 } … … 1960 1749 1961 1750 if (debug_flag) { 1962 1751 fprintf(stderr, "in display: render heightmap\n"); 1963 1752 } 1964 1753 for (unsigned int i = 0; i < heightMap.size(); ++i) { … … 1968 1757 } 1969 1758 glPopMatrix(); 1970 } else {1759 } else { 1971 1760 //2D rendering mode 1972 1761 perf->enable(); … … 2046 1835 NanoVis::keyboard(unsigned char key, int x, int y) 2047 1836 { 2048 /*2049 bool log = false;2050 2051 switch (key) {2052 case 'q':2053 DoExit(0);2054 break;2055 case '+':2056 lic_slice_z+=0.05;2057 licRenderer->set_offset(lic_slice_z);2058 break;2059 case '-':2060 lic_slice_z-=0.05;2061 licRenderer->set_offset(lic_slice_z);2062 break;2063 case ',':2064 lic_slice_x+=0.05;2065 //init_particles();2066 break;2067 case '.':2068 lic_slice_x-=0.05;2069 //init_particles();2070 break;2071 case '1':2072 //advect = true;2073 break;2074 case '2':2075 //psys_x+=0.05;2076 break;2077 case '3':2078 //psys_x-=0.05;2079 break;2080 case 'w': //zoom out2081 cam->z(cam->z() - 0.05);2082 log = true;2083 break;2084 case 's': //zoom in2085 cam->z(cam->z() + 0.05);2086 log = true;2087 break;2088 case 'a': //left2089 cam->x(cam->x() - 0.05);2090 log = true;2091 break;2092 case 'd': //right2093 cam->x(cam->x() + 0.05);2094 log = true;2095 break;2096 case 'i':2097 //init_particles();2098 break;2099 case 'v':2100 vol_renderer->switch_volume_mode();2101 break;2102 case 'b':2103 vol_renderer->switch_slice_mode();2104 break;2105 case 'n':2106 resize_offscreen_buffer(win_width*2, win_height*2);2107 break;2108 case 'm':2109 resize_offscreen_buffer(win_width/2, win_height/2);2110 break;2111 default:2112 break;2113 }2114 */2115 1837 #ifdef EVENTLOG 2116 if(log){2117 2118 2119 2120 2121 2122 2123 2124 }1838 if(log){ 1839 float param[3]; 1840 param[0] = cam->x(); 1841 param[1] = cam->y(); 1842 param[2] = cam->z(); 1843 Event* tmp = new Event(EVENT_MOVE, param, NvGetTimeInterval()); 1844 tmp->write(event_log); 1845 delete tmp; 1846 } 2125 1847 #endif 2126 1848 } … … 2171 1893 #endif /*XINETD*/ 2172 1894 2173 #ifdef notdef2174 2175 #ifdef XINETD2176 void2177 init_service()2178 {2179 if (!NanoVis::debug_flag) {2180 //open log and map stderr to log file2181 xinetd_log = fopen("/tmp/log.txt", "w");2182 close(2);2183 dup2(fileno(xinetd_log), 2);2184 dup2(2,1);2185 }2186 //flush junk2187 fflush(stdout);2188 fflush(stderr);2189 }2190 2191 void2192 end_service()2193 {2194 //close log file2195 fclose(xinetd_log);2196 }2197 #endif /*XINETD*/2198 2199 void2200 init_event_log()2201 {2202 event_log = fopen("event.txt", "w");2203 assert(event_log!=0);2204 2205 struct timeval time;2206 gettimeofday(&time, NULL);2207 cur_time = time.tv_sec*1000. + time.tv_usec/1000.;2208 }2209 2210 void2211 end_event_log()2212 {2213 fclose(event_log);2214 }2215 2216 double2217 get_time_interval()2218 {2219 struct timeval time;2220 gettimeofday(&time, NULL);2221 double new_time = time.tv_sec*1000. + time.tv_usec/1000.;2222 2223 double interval = new_time - cur_time;2224 cur_time = new_time;2225 return interval;2226 }2227 #endif2228 2229 1895 void 2230 1896 NanoVis::render() 2231 1897 { 2232 if (NanoVis::licRenderer && NanoVis::licRenderer->isActivated()) 2233 { 2234 NanoVis::licRenderer->convolve(); 2235 } 2236 2237 if (NanoVis::particleRenderer && NanoVis::particleRenderer->isActivated()) 2238 { 2239 NanoVis::particleRenderer->advect(); 2240 } 2241 2242 NanoVis::update(); 2243 2244 display(); 2245 glutSwapBuffers(); 2246 1898 if ((NanoVis::licRenderer != NULL) && 1899 (NanoVis::licRenderer->isActivated())) { 1900 NanoVis::licRenderer->convolve(); 1901 } 1902 1903 if ((NanoVis::particleRenderer != NULL) && 1904 (NanoVis::particleRenderer->isActivated())) { 1905 NanoVis::particleRenderer->advect(); 1906 } 1907 1908 NanoVis::update(); 1909 display(); 1910 glutSwapBuffers(); 2247 1911 } 2248 1912 … … 2250 1914 NanoVis::resize(int x, int y) 2251 1915 { 2252 1916 glViewport(0, 0, x, y); 2253 1917 } 2254 1918 … … 2364 2028 bmp_write_to_file(1, "/tmp"); 2365 2029 } else { 2366 NanoVis::ppm_write("nv>image - bytes");2030 NanoVis::ppm_write("nv>image -type image -bytes"); 2367 2031 } 2368 2032 #endif … … 2435 2099 if (optopt < 4) { 2436 2100 fprintf(stderr, "argument missing for --%s option\n", 2437 2101 long_options[optopt].name); 2438 2102 } else { 2439 2103 fprintf(stderr, "argument missing for -%c option\n", optopt); … … 2536 2200 NanoVis::resize_offscreen_buffer(NanoVis::win_width, NanoVis::win_height); 2537 2201 2538 #ifndef XINETD2539 /*2540 CGprofile newProfile;2541 newProfile = cgGetProfile("fp30");2542 if (newProfile == CG_PROFILE_UNKNOWN)2543 printf("unknown profile\n");2544 else printf("fp30 know profile\n");2545 2546 int n = NanoVis::n_volumes;2547 std::ifstream fdata;2548 fdata.open("flow2d.dx", std::ios::in);2549 load_vector_stream(n, fdata);2550 Volume *volPtr = NanoVis::volume[n];2551 2552 if (volPtr != NULL) {2553 //volPtr->set_n_slice(256-n);2554 volPtr->set_n_slice(512-n);2555 volPtr->disable_cutplane(0);2556 volPtr->disable_cutplane(1);2557 volPtr->disable_cutplane(2);2558 2559 NanoVis::vol_renderer->add_volume(volPtr,2560 NanoVis::get_transfunc("default"));2561 }2562 2563 2564 if (NanoVis::particleRenderer != NULL) {2565 NanoVis::particleRenderer->setVectorField(volPtr->id, 1.0f,2566 volPtr->height / (float)volPtr->width,2567 volPtr->depth / (float)volPtr->width,2568 volPtr->wAxis.max());2569 NanoVis::initParticle();2570 }2571 if (NanoVis::licRenderer != NULL) {2572 NanoVis::licRenderer->setVectorField(volPtr->id,2573 1.0f / volPtr->aspect_ratio_width,2574 1.0f / volPtr->aspect_ratio_height,2575 1.0f / volPtr->aspect_ratio_depth,2576 volPtr->wAxis.max());2577 NanoVis::licRenderer->set_offset(NanoVis::lic_slice_z);2578 }2579 */2580 #endif2581 2202 glutMainLoop(); 2582 2583 2203 DoExit(0); 2584 2204 } … … 2592 2212 resize_offscreen_buffer(width, height); 2593 2213 2594 /*2595 plane_render->set_screen_size(width, height);2596 2597 // generate data for the legend2598 float data[512];2599 for (int i=0; i < 256; i++) {2600 2601 }2602 plane[0] = new Texture2D(256, 2, GL_FLOAT, GL_LINEAR, 1, data);2603 int index = plane_render->add_plane(plane[0], tf);2604 plane_render->set_active_plane(index);2605 2606 offscreen_buffer_capture();2607 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //clear screen2608 2609 //plane_render->render();2610 // INSOO : is going to implement here for the topview of the heightmap2611 heightmap->render(renderContext);2612 2613 // INSOO2614 glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, screen_buffer);2615 //glReadPixels(0, 0, width, height, GL_BGR, GL_UNSIGNED_BYTE, screen_buffer); // INSOO's2616 */2214 /* 2215 plane_render->set_screen_size(width, height); 2216 2217 // generate data for the legend 2218 float data[512]; 2219 for (int i=0; i < 256; i++) { 2220 data[i] = data[i+256] = (float)(i/255.0); 2221 } 2222 plane[0] = new Texture2D(256, 2, GL_FLOAT, GL_LINEAR, 1, data); 2223 int index = plane_render->add_plane(plane[0], tf); 2224 plane_render->set_active_plane(index); 2225 2226 offscreen_buffer_capture(); 2227 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //clear screen 2228 2229 //plane_render->render(); 2230 // INSOO : is going to implement here for the topview of the heightmap 2231 heightmap->render(renderContext); 2232 2233 // INSOO 2234 glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, screen_buffer); 2235 //glReadPixels(0, 0, width, height, GL_BGR, GL_UNSIGNED_BYTE, screen_buffer); // INSOO's 2236 */ 2617 2237 2618 2238 … … 2629 2249 offscreen_buffer_capture(); 2630 2250 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //clear screen 2631 2632 2251 //glEnable(GL_TEXTURE_2D); 2252 //glEnable(GL_DEPTH_TEST); 2633 2253 //heightmap->render_topview(renderContext, width, height); 2634 2254 //NanoVis::display(); -
trunk/packages/vizservers/pymolproxy/pymolproxy.c
r1341 r1351 1840 1840 Tcl_CreateCommand(interp, "pan", PanCmd, &proxy, NULL); 1841 1841 Tcl_CreateCommand(interp, "png", PngCmd, &proxy, NULL); 1842 Tcl_CreateCommand(interp, "print", PrintCmd, &proxy, NULL); 1842 1843 Tcl_CreateCommand(interp, "raw", RawCmd, &proxy, NULL); 1843 1844 Tcl_CreateCommand(interp, "reset", ResetCmd, &proxy, NULL);
Note: See TracChangeset
for help on using the changeset viewer.