コード例 #1
0
ファイル: zm_event.cpp プロジェクト: SteveGilvarry/ZoneMinder
void Event::AddFramesInternal( int n_frames, int start_frame, Image **images, struct timeval **timestamps ) {
  static char sql[ZM_SQL_LGE_BUFSIZ];
  strncpy(sql, "insert into Frames ( EventId, FrameId, TimeStamp, Delta ) values ", sizeof(sql));
  int frameCount = 0;
  for ( int i = start_frame; i < n_frames && i - start_frame < ZM_SQL_BATCH_SIZE; i++ ) {
    if ( timestamps[i]->tv_sec <= 0 ) {
      Debug(1, "Not adding pre-capture frame %d, zero or less than 0 timestamp", i);
      continue;
    }

    frames++;

    static char event_file[PATH_MAX];
    snprintf(event_file, sizeof(event_file), staticConfig.capture_file_format, path, frames);
    if ( monitor->GetOptSaveJPEGs() & 1 ) {
      Debug(1, "Writing pre-capture frame %d", frames);
      WriteFrameImage(images[i], *(timestamps[i]), event_file);
    } else {
      //If this is the first frame, we should add a thumbnail to the event directory
      // ICON: We are working through the pre-event frames so this snapshot won't 
      // neccessarily be of the motion.  But some events are less than 10 frames, 
      // so I am changing this to 1, but we should overwrite it later with a better snapshot.
      if ( frames == 1 ) {
        char snapshot_file[PATH_MAX];
        snprintf(snapshot_file, sizeof(snapshot_file), "%s/snapshot.jpg", path);
        WriteFrameImage(images[i], *(timestamps[i]), snapshot_file);
      }
    }
    if ( videowriter != NULL ) {
      WriteFrameVideo(images[i], *(timestamps[i]), videowriter);
    }

    struct DeltaTimeval delta_time;
    DELTA_TIMEVAL( delta_time, *(timestamps[i]), start_time, DT_PREC_2 );
    // Delta is Decimal(8,2) so 6 integer digits and 2 decimal digits
    if ( delta_time.sec > 999999 ) {
      Warning("Invalid delta_time from_unixtime(%ld), %s%ld.%02ld", 
           timestamps[i]->tv_sec, delta_time.positive?"":"-", delta_time.sec, delta_time.fsec );
        delta_time.sec = 0;
    }

    int sql_len = strlen(sql);
    snprintf(sql+sql_len, sizeof(sql)-sql_len, "( %" PRIu64 ", %d, from_unixtime(%ld), %s%ld.%02ld ), ", id, frames, timestamps[i]->tv_sec, delta_time.positive?"":"-", delta_time.sec, delta_time.fsec);

    frameCount++;
  } // end foreach frame

  if ( frameCount ) {
    Debug(1, "Adding %d/%d frames to DB", frameCount, n_frames);
    *(sql+strlen(sql)-2) = '\0';
    db_mutex.lock();
    if ( mysql_query( &dbconn, sql ) ) {
      Error("Can't insert frames: %s, sql was (%s)", mysql_error(&dbconn), sql);
    }
    db_mutex.unlock();
    last_db_frame = frames;
  } else {
    Debug(1, "No valid pre-capture frames to add");
  }
}
コード例 #2
0
ファイル: zm_event.cpp プロジェクト: mywaiting/ZoneMinder
void Event::AddFrames( int n_frames, Image **images, struct timeval **timestamps )
{
    static char sql[BUFSIZ];
    strncpy( sql, "insert into Frames ( EventId, FrameId, TimeStamp, Delta ) values ", BUFSIZ );
    for ( int i = 0; i < n_frames; i++ )
    {
        frames++;

        static char event_file[PATH_MAX];
        snprintf( event_file, sizeof(event_file), capture_file_format, path, frames );

        Debug( 1, "Writing pre-capture frame %d", frames );
        WriteFrameImage( images[i], *(timestamps[i]), event_file );

        struct DeltaTimeval delta_time;
        DELTA_TIMEVAL( delta_time, *(timestamps[i]), start_time, DT_PREC_2 );

        int sql_len = strlen(sql);
        snprintf( sql+sql_len, sizeof(sql)-sql_len, "( %d, %d, from_unixtime(%ld), %s%ld.%02ld ), ", id, frames, timestamps[i]->tv_sec, delta_time.positive?"":"-", delta_time.sec, delta_time.fsec );
    }

    Debug( 1, "Adding %d frames to DB", n_frames );
    *(sql+strlen(sql)-2) = '\0';
    if ( mysql_query( &dbconn, sql ) )
    {
        Error( "Can't insert frames: %s", mysql_error( &dbconn ) );
        exit( mysql_errno( &dbconn ) );
    }

    last_db_frame = frames;
}
コード例 #3
0
ファイル: zm_event.cpp プロジェクト: rodoviario/ZoneMinder
void Event::AddFramesInternal( int n_frames, int start_frame, Image **images, struct timeval **timestamps )
{
    static char sql[ZM_SQL_LGE_BUFSIZ];
    strncpy( sql, "insert into Frames ( EventId, FrameId, TimeStamp, Delta ) values ", sizeof(sql) );
    int frameCount = 0;
    for ( int i = start_frame; i < n_frames && i - start_frame < ZM_SQL_BATCH_SIZE; i++ )
    {
        if ( !timestamps[i]->tv_sec )
        {
            Debug( 1, "Not adding pre-capture frame %d, zero timestamp", i );
            continue;
        }

        frames++;

        static char event_file[PATH_MAX];
        snprintf( event_file, sizeof(event_file), capture_file_format, path, frames );

        Debug( 1, "Writing pre-capture frame %d", frames );
        WriteFrameImage( images[i], *(timestamps[i]), event_file );

        struct DeltaTimeval delta_time;
        DELTA_TIMEVAL( delta_time, *(timestamps[i]), start_time, DT_PREC_2 );

        int sql_len = strlen(sql);
        snprintf( sql+sql_len, sizeof(sql)-sql_len, "( %d, %d, from_unixtime(%ld), %s%ld.%02ld ), ", id, frames, timestamps[i]->tv_sec, delta_time.positive?"":"-", delta_time.sec, delta_time.fsec );

        frameCount++;
    }

    if ( frameCount )
    {
        Debug( 1, "Adding %d/%d frames to DB", frameCount, n_frames );
        *(sql+strlen(sql)-2) = '\0';
        if ( mysql_query( &dbconn, sql ) )
        {
            Error( "Can't insert frames: %s", mysql_error( &dbconn ) );
            exit( mysql_errno( &dbconn ) );
        }
        last_db_frame = frames;
    }
    else
    {
        Debug( 1, "No valid pre-capture frames to add" );
    }
}
コード例 #4
0
ファイル: zm_event.cpp プロジェクト: rodoviario/ZoneMinder
void Event::AddFrame( Image *image, struct timeval timestamp, int score, Image *alarm_image )
{
    if ( !timestamp.tv_sec )
    {
        Debug( 1, "Not adding new frame, zero timestamp" );
        return;
    }

    frames++;

    static char event_file[PATH_MAX];
    snprintf( event_file, sizeof(event_file), capture_file_format, path, frames );

    Debug( 1, "Writing capture frame %d", frames );
    WriteFrameImage( image, timestamp, event_file );

    struct DeltaTimeval delta_time;
    DELTA_TIMEVAL( delta_time, timestamp, start_time, DT_PREC_2 );

    const char *frame_type = score>0?"Alarm":(score<0?"Bulk":"Normal");
    if ( score < 0 )
        score = 0;

    bool db_frame = (strcmp(frame_type,"Bulk") != 0) || ((frames%config.bulk_frame_interval)==0) || !frames;
    if ( db_frame )
    {

        Debug( 1, "Adding frame %d of type \"%s\" to DB", frames, frame_type );
        static char sql[ZM_SQL_MED_BUFSIZ];
        snprintf( sql, sizeof(sql), "insert into Frames ( EventId, FrameId, Type, TimeStamp, Delta, Score ) values ( %d, %d, '%s', from_unixtime( %ld ), %s%ld.%02ld, %d )", id, frames, frame_type, timestamp.tv_sec, delta_time.positive?"":"-", delta_time.sec, delta_time.fsec, score );
        if ( mysql_query( &dbconn, sql ) )
        {
            Error( "Can't insert frame: %s", mysql_error( &dbconn ) );
            exit( mysql_errno( &dbconn ) );
        }
        last_db_frame = frames;

        // We are writing a Bulk frame
        if ( !strcmp( frame_type,"Bulk") )
        {
            snprintf( sql, sizeof(sql), "update Events set Length = %s%ld.%02ld, Frames = %d, AlarmFrames = %d, TotScore = %d, AvgScore = %d, MaxScore = %d where Id = %d", delta_time.positive?"":"-", delta_time.sec, delta_time.fsec, frames, alarm_frames, tot_score, (int)(alarm_frames?(tot_score/alarm_frames):0), max_score, id );
            if ( mysql_query( &dbconn, sql ) )
            {
                Error( "Can't update event: %s", mysql_error( &dbconn ) );
                exit( mysql_errno( &dbconn ) );
            }
        }
    }

    end_time = timestamp;

        // We are writing an Alarm frame
        if ( !strcmp( frame_type,"Alarm") )
    {
        alarm_frames++;

        tot_score += score;
        if ( score > (int)max_score )
            max_score = score;

        if ( alarm_image )
        {
            snprintf( event_file, sizeof(event_file), analyse_file_format, path, frames );

            Debug( 1, "Writing analysis frame %d", frames );
            WriteFrameImage( alarm_image, timestamp, event_file, true );
        }
    }
    
    /* This makes viewing the diagnostic images impossible because it keeps deleting them
    if ( config.record_diag_images )
    {
        char diag_glob[PATH_MAX] = "";

        snprintf( diag_glob, sizeof(diag_glob), "%s/%d/diag-*.jpg", config.dir_events, monitor->Id() );
        glob_t pglob;
        int glob_status = glob( diag_glob, 0, 0, &pglob );
        if ( glob_status != 0 )
        {
            if ( glob_status < 0 )
            {
                Error( "Can't glob '%s': %s", diag_glob, strerror(errno) );
            }
            else
            {
                Debug( 1, "Can't glob '%s': %d", diag_glob, glob_status );
            }
        }
        else
        {
            char new_diag_path[PATH_MAX] = "";
            for ( int i = 0; i < pglob.gl_pathc; i++ )
            {
                char *diag_path = pglob.gl_pathv[i];

                char *diag_file = strstr( diag_path, "diag-" );

                if ( diag_file )
                {
                    snprintf( new_diag_path, sizeof(new_diag_path), general_file_format, path, frames, diag_file );

                    if ( rename( diag_path, new_diag_path ) < 0 )
                    {
                        Error( "Can't rename '%s' to '%s': %s", diag_path, new_diag_path, strerror(errno) );
                    }
                }
            }
        }
        globfree( &pglob );
    }
    */
}
コード例 #5
0
ファイル: zm_event.cpp プロジェクト: SteveGilvarry/ZoneMinder
void Event::AddFrame(Image *image, struct timeval timestamp, int score, Image *alarm_image) {
  if ( !timestamp.tv_sec ) {
    Debug(1, "Not adding new frame, zero timestamp");
    return;
  }

  frames++;

  static char event_file[PATH_MAX];
  snprintf(event_file, sizeof(event_file), staticConfig.capture_file_format, path, frames);

  if ( monitor->GetOptSaveJPEGs() & 1 ) {
    Debug(1, "Writing capture frame %d to %s", frames, event_file);
    if ( ! WriteFrameImage(image, timestamp, event_file) ) {
      Error("Failed to write frame image");
    }
  } else {
    //If this is the first frame, we should add a thumbnail to the event directory
    if ( frames == 1 || score > (int)max_score ) {
      char snapshot_file[PATH_MAX];
      snprintf(snapshot_file, sizeof(snapshot_file), "%s/snapshot.jpg", path);
      WriteFrameImage(image, timestamp, snapshot_file);
    }
    // The first frame with a score will be the frame that alarmed the event
    if (!alarm_frame_written && score > 0) {
      alarm_frame_written = true;
      char alarm_file[PATH_MAX];
      snprintf(alarm_file, sizeof(alarm_file), "%s/alarm.jpg", path);
      WriteFrameImage(image, timestamp, alarm_file);
    }
  }
  if ( videowriter != NULL ) {
Debug(3, "Writing video");
    WriteFrameVideo(image, timestamp, videowriter);
  }

  struct DeltaTimeval delta_time;
  DELTA_TIMEVAL(delta_time, timestamp, start_time, DT_PREC_2);

  FrameType frame_type = score>0?ALARM:(score<0?BULK:NORMAL);
  // < 0 means no motion detection is being done.
  if ( score < 0 )
    score = 0;

  bool db_frame = ( frame_type != BULK ) || (!frames) || ((frames%config.bulk_frame_interval)==0) ;
  if ( db_frame ) {

    Debug( 1, "Adding frame %d of type \"%s\" to DB", frames, Event::frame_type_names[frame_type] );
    static char sql[ZM_SQL_MED_BUFSIZ];
    snprintf(sql, sizeof(sql),
        "INSERT INTO Frames ( EventId, FrameId, Type, TimeStamp, Delta, Score )"
        " VALUES ( %" PRIu64 ", %d, '%s', from_unixtime( %ld ), %s%ld.%02ld, %d )",
        id, frames, frame_type_names[frame_type], timestamp.tv_sec, delta_time.positive?"":"-", delta_time.sec, delta_time.fsec, score);
    db_mutex.lock();
    if ( mysql_query(&dbconn, sql) ) {
      Error("Can't insert frame: %s", mysql_error(&dbconn));
      Error("SQL was %s", sql);
      db_mutex.unlock();
      return;
    }
    db_mutex.unlock();
    last_db_frame = frames;

    // We are writing a Bulk frame
    if ( frame_type == BULK ) {
      snprintf(sql, sizeof(sql), 
          "UPDATE Events SET Length = %s%ld.%02ld, Frames = %d, AlarmFrames = %d, TotScore = %d, AvgScore = %d, MaxScore = %d where Id = %" PRIu64, 
          ( delta_time.positive?"":"-" ),
          delta_time.sec, delta_time.fsec,
          frames, 
          alarm_frames,
          tot_score,
          (int)(alarm_frames?(tot_score/alarm_frames):0),
          max_score,
          id
          );
      db_mutex.lock();
      while ( mysql_query(&dbconn, sql) && !zm_terminate ) {
        Error("Can't update event: %s", mysql_error(&dbconn));
        db_mutex.unlock();
        sleep(1);
        db_mutex.lock();
      }
      db_mutex.unlock();
    }
  } // end if db_frame

  end_time = timestamp;

  // We are writing an Alarm frame
  if ( frame_type == ALARM ) {
    alarm_frames++;

    tot_score += score;
    if ( score > (int)max_score )
      max_score = score;

    if ( alarm_image ) {
      if ( monitor->GetOptSaveJPEGs() & 2 ) {
        snprintf(event_file, sizeof(event_file), staticConfig.analyse_file_format, path, frames);
        Debug(1, "Writing analysis frame %d", frames);
        if ( ! WriteFrameImage(alarm_image, timestamp, event_file, true) ) {
          Error("Failed to write analysis frame image");
        }
      }
    }
  }

  /* This makes viewing the diagnostic images impossible because it keeps deleting them
  if ( config.record_diag_images ) {
    char diag_glob[PATH_MAX] = "";

    snprintf( diag_glob, sizeof(diag_glob), "%s/%d/diag-*.jpg", staticConfig.DIR_EVENTS.c_str(), monitor->Id() );
    glob_t pglob;
    int glob_status = glob( diag_glob, 0, 0, &pglob );
    if ( glob_status != 0 ) {
      if ( glob_status < 0 ) {
        Error( "Can't glob '%s': %s", diag_glob, strerror(errno) );
      } else {
        Debug( 1, "Can't glob '%s': %d", diag_glob, glob_status );
      }
    } else {
      char new_diag_path[PATH_MAX] = "";
      for ( int i = 0; i < pglob.gl_pathc; i++ ) {
        char *diag_path = pglob.gl_pathv[i];

        char *diag_file = strstr( diag_path, "diag-" );

        if ( diag_file ) {
          snprintf( new_diag_path, sizeof(new_diag_path), general_file_format, path, frames, diag_file );

          if ( rename( diag_path, new_diag_path ) < 0 ) {
            Error( "Can't rename '%s' to '%s': %s", diag_path, new_diag_path, strerror(errno) );
          }
        }
      }
    }
    globfree( &pglob );
  }
  */
}