"Fossies" - the Fresh Open Source Software Archive

Member "pfstools-2.2.0/src/octave/pfsget.cpp" (12 Aug 2021, 5248 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 Read frame from pfs stream in GNU Octave
    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: pfsget.cpp,v 1.1 2005/06/15 13:36:54 rafm Exp $
   26  */
   27 
   28 #include <octave/oct.h>
   29 #include <octave/oct-stream.h>
   30 #include <octave/ov-struct.h>
   31 #include <octave/Cell.h>
   32 
   33 //#include "../../config.h"             // conflicts with config.h from octave distribution
   34 
   35 #include <string>
   36 #include <pfs.h>
   37 
   38 #if OCTAVE_MAJOR_VERSION < 4 || (OCTAVE_MAJOR_VERSION == 4 && OCTAVE_MINOR_VERSION < 4)
   39   #define isstruct is_map
   40 #endif
   41 
   42 #define SCRIPT_NAME "pfsget"
   43 
   44 static const char *helpString =
   45 #include "pfsget_help.h"
   46 
   47 DEFUN_DLD( pfsget, args, , helpString)
   48 {
   49   octave_value_list retval;
   50     
   51   int nargin = args.length();
   52 
   53   if( nargin != 1 || !args(0).isstruct() )
   54   {
   55     error( SCRIPT_NAME ": Improper usage!");
   56     return retval;
   57   }
   58 
   59   octave_map pfsStream = args(0).map_value();
   60 
   61   octave_map::const_iterator itFH = pfsStream.seek( "FH" );
   62   if( itFH == pfsStream.end() ||
   63     !pfsStream.contents( itFH )(0).is_real_scalar() )
   64   {
   65     error( SCRIPT_NAME ": FH field missing in the structure or it has wrong type");
   66     return retval;
   67   }  
   68   FILE *fh = (FILE*)((long)(pfsStream.contents( itFH )(0).double_value()));
   69 
   70   octave_map::const_iterator itMode = pfsStream.seek( "MODE" );
   71   if( itMode == pfsStream.end() || !pfsStream.contents( itMode )(0).is_string() )
   72   {
   73     error( SCRIPT_NAME ": MODE field missing in the structure or it has wrong type");
   74     return retval;
   75   }
   76   if( pfsStream.contents( itMode )(0).string_value() != "R" ) {
   77     error( SCRIPT_NAME ": Can not read from stream open for writing." );
   78     return retval;    
   79   }
   80 
   81   
   82   pfsStream.del( "channels" );
   83   pfsStream.del( "tags" );
   84   pfsStream.del( "channelTags" );
   85 
   86   
   87   try {
   88     pfs::DOMIO ctx;
   89     pfs::Frame *frame = ctx.readFrame( fh );
   90     if( frame == NULL ) {         // No more frames
   91                                   
   92       pfsStream.assign( "EOF", octave_value(true) );
   93       
   94     } else {                    // Not EOF
   95 
   96       // Set width and height
   97       {
   98         pfsStream.assign( "columns", octave_value(frame->getWidth()) );
   99         pfsStream.assign( "rows", octave_value(frame->getHeight()) ); 
  100       }
  101     
  102       // Add channels as matrices to pfs stream struct
  103       {
  104         octave_scalar_map channels;
  105         
  106         pfs::ChannelIteratorPtr cit( frame->getChannelIterator() );
  107         while( cit->hasNext() ) {
  108           pfs::Channel *ch = cit->getNext();
  109 
  110           Matrix mat( ch->getRows(), ch->getCols() );
  111           int index = 0;
  112           for( int r = 0; r < ch->getRows(); r++ ) // Copy channel data to Octave matrix
  113             for( int c = 0; c < ch->getCols(); c++ ) {
  114               mat(r,c) = (*ch)(index++);
  115             }      
  116 
  117           channels.assign( ch->getName(), mat );
  118           
  119         }
  120         pfsStream.assign( "channels", octave_value(channels) );
  121         
  122       }
  123 
  124       //Add tags
  125       {
  126         octave_scalar_map tags;
  127         
  128         pfs::TagIteratorPtr it( frame->getTags()->getIterator() );        
  129         while( it->hasNext() ) {
  130           const char *tagName = it->getNext();         
  131           tags.assign( tagName, octave_value( frame->getTags()->getString( tagName )) );
  132         }
  133         
  134         pfsStream.assign( "tags", octave_value(tags) );
  135         
  136         octave_scalar_map channelTagList;
  137 
  138         //Copy all channel tags
  139         pfs::ChannelIteratorPtr cit( frame->getChannelIterator() );
  140         while( cit->hasNext() ) {
  141           pfs::Channel *ch = cit->getNext();
  142 
  143           octave_scalar_map channelTags;
  144           
  145           pfs::TagIteratorPtr tit( ch->getTags()->getIterator() );        
  146           while( tit->hasNext() ) {
  147             const char *tagName = tit->getNext();
  148             channelTags.assign( tagName, octave_value(ch->getTags()->getString( tagName )) );
  149           }
  150           channelTagList.assign( ch->getName(), octave_value(channelTags) );
  151         }        
  152         pfsStream.assign( "channelTags", octave_value(channelTagList) );
  153         
  154       }
  155       
  156     
  157     }
  158     ctx.freeFrame( frame );    
  159   }
  160   catch( pfs::Exception ex )
  161   {
  162     error( "%s: %s", SCRIPT_NAME, ex.getMessage() );
  163   }
  164 //    if( fh != stdin ) fclose( fh );    
  165     
  166   retval.append(pfsStream);  
  167   return retval;
  168 }