// Copyright (C) 1999 Jean-Marc Valin

#include "BufferedNode.h"
#include "Buffer.h"
#include "Vector.h"
#include "vec.h"

using namespace std;

namespace FD {

class StopRecord;

DECLARE_NODE(StopRecord)
/*Node
 *
 * @name StopRecord
 * @category DSP:Misc
 * @description For SV
 *
 * @input_name INPUT
 * @input_type bool
 * @input_description frame by frame
 *
 * @output_name OUTPUT
 * @output_type bool
 * @output_description false when should stop
 *
 * @parameter_name START
 * @parameter_type int
 * @parameter_value 1
 * @parameter_description Number of true frames before start
 *
 * @parameter_name TIMEOUT
 * @parameter_type int
 * @parameter_description Number of false frames before end
 *
END*/


class StopRecord : public BufferedNode {
   
   int inputID;
   int outputID;
   int timeout;
   int nbFalse;      
   bool decision;
   int nbStart;
   int start;

public:
   StopRecord(string nodeName, ParameterSet params)
      : BufferedNode(nodeName, params)
      , nbFalse(0)
      , decision(true)
      , start(0)
   {
      inputID = addInput("INPUT");
      outputID = addOutput("OUTPUT");
      timeout = dereference_cast<int> (parameters.get("TIMEOUT"));
      if (parameters.exist("START"))
	 nbStart=dereference_cast<int> (parameters.get("START"));
      else
	 nbStart=1;

      inOrder = true;
   }

   void reset()
   {
      decision=true;
      start=0;
      nbFalse=0;
      BufferedNode::reset();
   }

   void calculate(int output_id, int count, Buffer &out)
   {
      ObjectRef inputValue = getInput(inputID, count);

      bool val = dereference_cast<bool> (inputValue);
      if (val)
      {
	 start++;
	 nbFalse=0;
      } else
      {
	 if (start>=nbStart)
	    nbFalse++;
      }

      if (nbFalse>=timeout)
	 decision=false;

      if (decision)
	 out[count] = TrueObject;
      else
	 out[count] = FalseObject;

      
   }

      
};

}//namespace FD


syntax highlighted by Code2HTML, v. 0.9.1