// Multicast code http://cvs.icculus.org/cvs/smpeg2/plaympeg.c?rev=1.4 // Multicast info http://www.cisco.com/univercd/cc/td/doc/cisintwk/ito_doc/ipmulti.htm#xtocid4 // liblame description http://ca.geocities.com/dennis_L76/LAME_v3r70/LAME_v3r70.html // libFAME code http://lists.debian.org/debian-user-spanish/2005/01/msg00380.html // libYUV http://veejay.dyne.org/trac.cgi/browser/trunk/veejay-current/ // YUV conversion code http://cvlab.epfl.ch/~jpilet/videosource/frame_8cc-source.html // libFAME yuv format specification http://www.linuxmanpages.com/man3/fame_start_frame.3.php // YUV420 format specification http://encyclopedia.laborlawtalk.com/YUV_4:2:0 // man HOWTOs http://www.cs.hmc.edu/qref/writing_man_pages.html http://www.schweikhardt.net/man_page_howto.html ========================================================================== TASKS (client) ========================================================================== MessageBox: [x] - Make it. [x] - Make icons. [x] - Test it. [ ] - Make it scaleable (using the unit calculation from mainwindow) SplashScreen: [ ] - Make it. [ ] - Make setProgress method, with text. [ ] - Control it from mainwindow constructor. 1) Create / Show it in the beginning. 2) Call setProgress at key points in the code. 3) Hide / Destroy it at the end. Mainwindow: [x] - Clean out mgui code. [x] - Make generic gui layout code. [x] - Make icons. [x] - Make statusbar. [x] - Make flashing record bar. [ ] - Show network connection status in statusbar. [ ] - Show camera connection status in statusbar. [x] - Save movie messagebox (yes/no/dunno) [x] - Create snapshot thumbnails from dv stream instead of the widget. [x] - Make sure the same frame is shown in thumbnail as the one actually shot on the server. [x] - Show recordtime in client window. [x] - Clear / update taskbar. [ ] - Make new messagebox when asking to save movie. (Save, Delete, Cancel, Save in one week) [x] - Make "clear" button in mainwindow, to remove last patient, before the next enters. [x] - Realscale all window components. [x] - Realscale all icons (use highresolution icons and scale them down) [x] - Add mute/unmute buttons to the interface. [x] - Calculate the number of screenshot thumbnails in the history. [ ] - Show the audio (muted/unmuted) status in the statusbar. [ ] - Show recording status in the statusbar. [ ] - Use QLinguist [ ] - Test it. [ ] - Reimplement freeze using a buffered image (so it does not disappear when the window is redrawn) CPRQueryDialog: [x] - Make it! [x] - Clean out unnesessary code. [x] - Make cancel posibility (return code 0 should do something useful) [x] - Insert timer for network connection timeout. [x] - Send connection status info to mainwindow. [x] - Make icon (backspace) [ ] - Test it. Encoder: [x] - Send savestate signal. [x] - Make all data sent before deleting network object. (flush) [x] - Remove ffmpeg code. [x] - Make use of 2.6 kernel (through raw1394) [x] - Crash bug, when network connection is broken, during transfer. [x] - Send the mute/unmute signal to the server. Decoder: [x] - Enable sound decoding for the network stream. [x] - Remove ffmpeg code. [x] - Make use of 2.6 kernel (through raw1394) [x] - Set flags on frame objects. [x] - Skip every second frame to save cpu (configurable) [x] - Add dv file fallback, when firewire fails. Camera: [x] - Add initialize method (constructor should do nothing). [%] - Add getStatus methods. (implemented through error object) Player: [x] - Remove ffmpeg code. [x] - Use libdv for dv decoding [x] - Create library functions for drawing in the decoded videoframes, for use with overlay. [x] - Draw networkstatus, recordingtime, and record indication when fullscreen. [ ] - Draw the sound status in the overlay (muted/unmuted). AboutBox [x] - Make it [ ] - Make quit button (Somewhat hidden from the main program.) ========================================================================== TASKS (server) ========================================================================== ImgEncoder: [x] - Make libjpeg calls work again. [x] - Save jpeg files in special cpr hieracy 'encrypted'! [ ] - Clean up code! [ ] - Make save method configurable in options file. MovEncoder: [x] - Test Mpeg4. (no good) [x] - Remove ffmpeg code. [x] - Enable sound. [x] - Find good quality settings (Best quality less than 22mb/s realtime encoded) [x] - Multithread encoding, for multi cpu support. [x] - libFame frames have no timecodes!!! [x] - Fix audio sync problem. [x] - Make audio quality configurable [x] - Files turning too big (>2gb) must automatically close and continue in another file [x] - Add ISO11172 multiplexing [ ] - Double check the ISO11172 compliance. AudioEncoder: [ ] - Multiplexer: [ ] - Timecodes are stirred! Main: [x] - Save movie signal handling. [x] - Read server root folder from config. [x] - Use correct filenames and paths. [x] - Check for writabilty before trying to do any writing. [x] - Create fallback, when unable to write the requested filename. [x] - Permissions on server file writing. Files: u+wr g+r a+x - Directories: u+wrx g+rx a+rx. [ ] - Permissions on server file writing to be read from config. [x] - Open med create unique ========================================================================== TASKS (common) ========================================================================== Man pages: [x] - Write man page for 'miav' [x] - Write man page for 'miav.conf' [ ] - Update the man pages to represent the actual conf file. Makesystem: [x] - "Port" to automake/autoconf [x] - Make LibSDL detection in configure script [x] - Make LibJpeg detection in configure script [%] - Make ffmpeg detection in configure script (removed) [x] - Make server standalone compilable (through flag to configure) [x] - Include pixmaps and tools in distdir. [x] - Make pixmaps correctly intalled. [x] - Make QT link correctly on fedora core 1 [x] - Make libJpeg link correctly on fedora core 1 [x] - Make configuration files installed in $(prefix)/etc/miav MiavConfig: [x] - Integrate file parser. [x] - Use error object. [x] - Make code for input validity test. [x] - Initialize one global configuration object. [x] - BUG: Parse error when string occur with length 1 [x] - Test it. ErrorObject: [x] - Make it. [x] - Maintain error string stack, instead of appending. [x] - Make it thread safe. [x] - Make pushError take any number parameters and parse them on to sprintf [x] - Make it a superclass. [x] - Create a textmode version subclass (for the server). [x] - Create a QT version subclass (callback to mainwindow with messagebox). [x] - Append to log, whenever error occur. FFMpegWrapper: [%] - Make it.(FFMPEG is on its way out of the project) ========================================================================== SAVE THE MOVIE? ========================================================================== When the stop button is clicked, a msg box pops up, "Save? [yes, no, dunno]" network connection is no killed before this has been answered, and an empty frame has been send to the server with the answer. On the serverside, a variable describing wether the file is to be saved (SAVE), deleted (DELETE), og scheduled for later descision (LATER). It is initialized with LATER, in order to prevent errors due to a malfunction leading to a disconnection. If a flag is recieved, the state is overwritten. If the state is SAVE, when the connection is terminated, the file is moved to a folder containing permanent data store. If the state is DELETE, the file is moved to a folder containing files scheduled for deletion, when more space is needed (no files are removed at this point) If the state is LATER, the file is moved to a folder containing files with this purpose. A cron job examines this folder regularly (test how often). If a file has been here for more than a week, the administrator is contacted by email. ===================== Multiple recordings ===================== Definitions: Camera Decoder - "input" (global) Transmitter - "network connection" (one pr. session) Buffer Player - "output" (global) Implementations: Camera { set active transmitter to NULL start decoder start player } Camera::start(cpr) { start transmitter set active transmitter to the new transmitter } Camera::stop { tell transmitter that the last frame has been read set active transmitter to NULL } Decoder { while(!done) { read frame push it to the player push it to the active transmitter } } Transmitter(cpr) { connect while(!last frame read && !queue empty) { send frame over the network } disconnect } Player { while(!done) { show frame } } Frame { properties: flags; (FREEZE, SNAPSHOT, SAVESTATE) }