"Fossies" - the Fresh Open Source Software Archive

Member "pfstools-2.2.0/src/matlab/pfsput.cpp" (12 Aug 2021, 6607 Bytes) of package /linux/privat/pfstools-2.2.0.tgz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 /**
    2  * @brief Write frame to pfs stream in MATLAB
    3  * 
    4  * This file is a part of PFSTOOLS package.
    5  * ---------------------------------------------------------------------- 
    6  * Copyright (C) 2003,2004 Rafal Mantiuk and Grzegorz Krawczyk
    7  * 
    8  *  This program is free software; you can redistribute it and/or modify
    9  *  it under the terms of the GNU General Public License as published by
   10  *  the Free Software Foundation; either version 2 of the License, or
   11  *  (at your option) any later version.
   12  *
   13  *  This program is distributed in the hope that it will be useful,
   14  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
   15  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   16  *  GNU General Public License for more details.
   17  *
   18  *  You should have received a copy of the GNU General Public License
   19  *  along with this program; if not, write to the Free Software
   20  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   21  * ---------------------------------------------------------------------- 
   22  *
   23  * @author Rafal Mantiuk, <mantiuk@mpi-sb.mpg.de>
   24  *
   25  * $Id: pfsput.cpp,v 1.6 2008/05/06 17:11:35 rafm Exp $
   26  */
   27 
   28 #include "compatibility.h"
   29 
   30 #include <stdio.h>
   31 #include <stdlib.h>
   32 #include <fcntl.h>
   33 
   34 #include <list>
   35 
   36 #include "mex.h"
   37 #include "mex_utils.h"
   38 
   39 #define SCRIPT_NAME "pfsput"
   40 #define error mexErrMsgTxt
   41 
   42 #include <pfs.h>
   43 
   44 
   45 void mexFunction(int nlhs, mxArray *plhs[],
   46                  int nrhs, const mxArray *prhs[])
   47 {     
   48 
   49   /* Check for proper number of arguments. */
   50   if( nrhs != 1 || !mxIsStruct( prhs[0] ) ) 
   51     error(SCRIPT_NAME ": Improper usage!");
   52  
   53   const mxArray *pfs_stream = prhs[0];
   54   
   55   mxArray *f_fid = mxGetField( pfs_stream, 0, "FID" );
   56   if( f_fid == NULL || !is_mex_scalar( f_fid ) )
   57   {
   58     error( SCRIPT_NAME ": FH field missing in the structure or it has wrong type");
   59   }
   60   
   61   int fid = (int)get_mex_double( f_fid );
   62 
   63   // Check mode
   64   {                             
   65     mxArray *f_mode = mxGetField( pfs_stream, 0, "MODE" );
   66     if( f_mode == NULL ) {
   67       error( SCRIPT_NAME ": MODE field missing in the structure or it has wrong type");
   68     }
   69     if( strcmp( "W", get_mex_string( f_mode ) ) ) {
   70       error( SCRIPT_NAME ": Can not write to the stream that is open for reading." );
   71     }
   72   }
   73 
   74   // Get width & height
   75   int width, height;
   76   {                             
   77     mxArray *f_cols, *f_rows;
   78     f_cols = mxGetField( pfs_stream, 0, "columns" );
   79     f_rows = mxGetField( pfs_stream, 0, "rows" );
   80 
   81     if( !is_mex_scalar( f_cols ) || !is_mex_scalar( f_rows ) )
   82     {
   83       error( SCRIPT_NAME ": 'rows' and 'columns' fields missing in the structure or it have wrong type");
   84     }
   85     width = (int)get_mex_double( f_cols );
   86     height = (int)get_mex_double( f_rows );
   87   }
   88 
   89   // Get channels
   90   int ch_count;
   91   mxArray *f_channels;
   92   {
   93     f_channels = mxGetField( pfs_stream, 0, "channels" );
   94     if( f_channels == NULL || !mxIsStruct( f_channels ) ) 
   95       error( SCRIPT_NAME ": 'channels' field missing in the structure or it has wrong type");
   96     ch_count = mxGetNumberOfFields( f_channels );
   97   }  
   98   
   99   try {
  100     pfs::DOMIO ctx;
  101     pfs::Frame *frame = ctx.createFrame( width, height );
  102 
  103     // For each channel in the 'channels' map
  104     for( int ch = 0; ch < ch_count; ch++ ) {
  105       const char *channelName = mxGetFieldNameByNumber( f_channels, ch );
  106 
  107       mxArray *f_data = mxGetFieldByNumber( f_channels, 0, ch );
  108 
  109       if( !(mxIsDouble( f_data ) || mxIsSingle( f_data )) || mxIsComplex( f_data ) ) {
  110         throw pfs::Exception( "all channels must be given as real matrices" );
  111       }
  112       
  113       if( mxGetM( f_data ) != height || mxGetN( f_data ) != width ) {
  114         throw pfs::Exception( "size of the channel must be the same as given in pfsopen" );
  115       }
  116       
  117       pfs::Channel *pfsChannel = frame->createChannel( channelName );
  118 
  119       // Copy matrix to pfs::Channel
  120       copy_mex_to_pfschannel( f_data, pfsChannel );
  121     }
  122 
  123     // Copy frame tags
  124     {
  125       mxArray *tags, *f_rows;
  126       tags = mxGetField( pfs_stream, 0, "tags" );
  127       if( tags != NULL ) {        
  128         if( !mxIsStruct( f_channels ) ) 
  129           error( SCRIPT_NAME ": 'tags' field has wrong type");
  130         int tag_count = mxGetNumberOfFields( tags );
  131 
  132         for( int t = 0; t < tag_count; t++ ) {
  133           const char *tag_name = mxGetFieldNameByNumber( tags, t );
  134           mxArray *tag_value = mxGetFieldByNumber( tags, 0, t );
  135 
  136 //        printf( "tag: %s = %s\n", tag_name, get_mex_string( tag_value ) );
  137           frame->getTags()->setString( tag_name, get_mex_string( tag_value ) );
  138         
  139         }
  140       }
  141       
  142       
  143     }
  144     
  145     /* Not implemented - hopefuly nobody uses this
  146 
  147     // Copy channel tags
  148     {
  149       Octave_map::const_iterator itChTags = pfsStream.seek( "channelTags" );
  150       if( itChTags != pfsStream.end() ) {
  151         if( !pfsStream.contents( itChTags )(0).isstruct() )
  152         {
  153           throw pfs::Exception( "'channelTags' field must be a structure" );  
  154         }
  155         Octave_map tagChannels = pfsStream.contents( itChTags )(0).map_value();
  156         for( Octave_map::iterator itCh = tagChannels.begin(); itCh != tagChannels.end(); itCh++ ) {
  157           std::string channelName = tagChannels.key(itCh);
  158           if( !tagChannels.contents( itCh )(0).isstruct() ) {
  159             throw pfs::Exception( "each channelTags file must be a structure" );  
  160           }
  161           pfs::Channel *pfsChannel = frame->getChannel( channelName.c_str() );
  162           if( pfsChannel == NULL ) {
  163             throw pfs::Exception( "can not set channel tag if channel is missing" );
  164           }
  165           
  166           Octave_map tags = tagChannels.contents( itCh )(0).map_value();
  167           for( Octave_map::iterator itTag = tags.begin(); itTag != tags.end(); itTag++ ) {
  168             std::string tagName = tags.key(itTag);
  169             if( !tags.contents( itTag )(0).is_string() ) 
  170               throw pfs::Exception( "all channel tags must be given as strings" );
  171             std::string tagValue = tags.contents( itTag )(0).string_value();
  172             pfsChannel->getTags()->setString( tagName.c_str(), tagValue.c_str() );
  173           }
  174         }
  175       }
  176       
  177     }
  178 */
  179 
  180 
  181 //    FILE *fh = fdopen( fid, "a" );
  182     FILE *fh = fdopen( dup( fid ), "w" );
  183     if( fh == NULL ) 
  184       error( SCRIPT_NAME ": Cannot open file for writing" );
  185     
  186     ctx.writeFrame( frame, fh );
  187     ctx.freeFrame( frame );
  188     fclose( fh );
  189     
  190     //fsync( fid );
  191 
  192   }
  193   catch( pfs::Exception ex )
  194   {
  195     char error_message[100];
  196     sprintf( error_message, "%s: %s", SCRIPT_NAME, ex.getMessage() );
  197     error( error_message );      
  198   }    
  199     
  200 }
  201 
  202