2013-03-17 07:45:21 +08:00
//
// ZoneMinder Event Class Implementation, $Date$, $Revision$
// Copyright (C) 2001-2008 Philip Coombes
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
2016-12-26 23:23:16 +08:00
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
2013-03-17 07:45:21 +08:00
//
# include <fcntl.h>
# include <sys/socket.h>
# include <arpa/inet.h>
# include <sys/un.h>
# include <sys/uio.h>
# include <sys/ipc.h>
# include <sys/msg.h>
# include <getopt.h>
# include <arpa/inet.h>
# include <glob.h>
# include "zm.h"
# include "zm_db.h"
# include "zm_time.h"
# include "zm_mpeg.h"
# include "zm_signal.h"
# include "zm_event.h"
# include "zm_monitor.h"
2015-02-24 22:20:55 +08:00
// sendfile tricks
extern " C "
{
# include "zm_sendfile.h"
}
2013-03-17 07:45:21 +08:00
# if HAVE_SYS_SENDFILE_H
# include <sys/sendfile.h>
# endif
//#define USE_PREPARED_SQL 1
bool Event : : initialised = false ;
char Event : : capture_file_format [ PATH_MAX ] ;
char Event : : analyse_file_format [ PATH_MAX ] ;
char Event : : general_file_format [ PATH_MAX ] ;
Feature h264 videostorage (#1882)
* Moved writing of configure options from Controller to Model. Fixes #191.
* Initial commit for saving events as videos :)
* Add zm_video.cpp to autotools
* Add zm_video.h to autotools
* Search for MP4V2 header file 3 times: mp4v2/mp4v2.h, mp4v2.h, mp4.h
* Fix serve memory leak
* Few minor code improvements
* Added the ability to override preset, tune, profile and few other improvements
* Correctly write SPS & PPS from x264 encoder headers
* Remove unnessecary SPS & PPS writing code
* Imported missing files from master to feature-h264-videostorage
* Audio support including fixes for dts/pts, split on keyframe and update to mkv extension to prevent ffmpeg problems writing rtsp audio to mp4 containter (header problem)
* Updates to make gcc happy
* Add html5 video control to timeline and event to support mkv playback
* Add zm_videostore.cpp to CMakeLists.txt
* Remove Modern Branch for now
* Fix minor bug
* Option handled added in master, removing duplicate declaration
* Add CaptureandRecord from zm_camera.h
* Putting placeholder in for CaptureAndRecord function
* Removed duplicate code and brackets
* add digest auth file for cmake
Conflicts:
src/CMakeLists.txt
* Add web dir back into Makefile.am
Revert "Removed web from SUBDIRS in Makefile.am"
This reverts commit d9bbcdf3a94cba4d8955fcd03bd965ed2772f34d.
* Add CaptureAndRecord to vlc, still need to make it record
* Resolve SegFault on videostore
* Swap to mp4 container
* mp4 changes
* spaces to tabs, hide video stuff if video writer is turned off
* Make timeline open event.mp4 instead of mkv
* Missed mkv in timeline.js
* Fix some issues from the merge conflict
* Resolve post merge build issues with braces
* Fix whitespace
* Update Jpeg and Video options for passthrough options
* Whitespace fix zm_camera.h
* Fix array mkssing comma
* Add support for Jpeg save options for h264 branch snapshot. Might remove altogether if snapshots not needed
* Update VideoStoreData memory size comment
* Change from config.use_mkv_storage to per monitor option VideoWriter from video branch
* Fix bracket issues post merge
* Clean up comments and add av_free_packet
* Convert from event_directory to event file as per Video branch
* Testing videojs for video playback
* Fixed a missing bracket post merge and also SQL_values now used for EventID and Monitors
* bring recent improvements in ffmpeg capture function into captureandrecord
* Remove pict from writeAudioFramePacket as not used
* Add translate options for h264 Storage options in Monitor and update en_gb file
* Cherry-Pick from iconnor - make it compile on ubuntu 15.04. Which is libav 56.1.0
Conflicts:
src/zm_ffmpeg.cpp
src/zm_remote_camera_rtsp.cpp
Conflicts:
distros/ubuntu1204/changelog
* Clean up videostore code and remove lots of unused code
* proof of concept for dynamic/automatic video rotation using video-js plugin zoomrotate
Conflicts:
web/skins/classic/views/event.php
* removed redundant field in sql query
Conflicts:
web/skins/classic/views/event.php
* local storage of video js plugin
* Beautify!
Make the code somewhat readable.
* added missing videojs.zoomrotate.js file
added missing videojs.zoomrotate.js file
* Typo
added missing "
* Added missing brackets
* fix to display thumbnails when only storing snapshot.jpg
* added control for video playback rate
Conflicts:
web/skins/classic/views/event.php
* dynamically create jpegs from video file for viewing in browser
* fix timeline view for SaveJPEGs monitors (without enabled VideoWriter)
* only expose monitor info which are being used in client
* fix segmentation fault in zma with ubuntu 14.04 and ffmpeg 2.5.8 (gcc 4.8)
when libx264 is not installed
* better way of detecting showing image or video in timeline and event view
instead of Monitor.VideoWriter, Event.DefaultVideo is used, so even if
VideoWriter/SaveJPEG option is changed, a valid image or video will always be
displayed for historical events in both timeline and event view
this also fixes loading videos in timeline view
* Fixes problem of crashing zmc when bad packet arrives causing av_interleaved_write_frame() to return non-zero (-22). Prefilters common packet issues. Add metadata title to generated video file
* Remove syslog.h
* fixed SaveJPEGs are not working
which is caused in errors introduced when merging with master
* Update README.md
* Fix build warnings specific to h264 branch, unused FrameImg, unused ret and int64_t snprintf issues
* Fix PRId64 issue in travis, builds locally fine, but I can see a gcc version issue here
* Fix PRId64 issue in travis, another try
* Try "STDC_FORMAT_MACROS" to see if that helps Travis on gcc 4.6.3
* Revert space removal around PRId64
* video branch ffmpeg 2.9 fixes
ffmpeg 2.9 patched removed SSE2 CPU
* Add FFMPEGInit back
* use webvvt to overlay timestamp (honoring Monitor.LabelFormat) to videos in timeline and event
also fixed bug which prevented seeking in timeline video preview
* ffmpeg 3.0 API build failure fixes
* Update README.md
* merge all the commits from the messed up iconnor_video branch
* fix whitespace
* revert
* whitespace fixes
* spelling fix
* put back some text
* add these back
* fix spelling mistake
* Steal some packet dumping routines from ffmpeg. Convert them to use our logging routines
* add a test and error message if the codec is not h264
* these have been removed in master
* add a view to check auth and just send the video
* add some comments, and dump filename and AVFormatContext on failure to write header
* add the toggle for RecordAudio so that the checkbox works to turn off Audio
* Must init videoStore in constuctor
* more debug and comments, return checking
* Fix dropped part of sql query.
* fix extra else and some whitespace
* Fix missing } from merge that was preventing building.
* fix tabs
* get rid of use of separator, just use \n
* Restore lost fixes for deprecation
* Why are these failing
* Respect record_audio flag when setting up video file so dont try and initiliase mp4 with unsupported audio
* Forgot that I was trying to solve case of stream is true and record_audio
is false.
* Pass swscale_ctx back in to getCachedContext or it will create new
context every frame and leak memory like a mofo.
* Add libx264-dev and libmp4v2-dev to build requires to save hassle of
ensuring they are installed before build.
* Merge my Rotation/Orientation work and fixes for bad h264 streams
* need arpa/inet for reverse lookups
* pull in the new byte range code for viewing videos
* Move our recording flag deeper into closeevent
* add braces and only call closeEvent if there is an event
* deprecate the z_frame_rate stuff which is deprecated in ffmpeg
* remark out some debugging
* fix for video on stream 1
* fix audio_stream to audio_st
* Ignore bad decodes
* fix problems with content-length causing viewing to not work in chrome/android
* change logic of sending file contents to handle an off by one and be more readable
* Some fixes pointed out by Maxim Romanov. Also simply the loading of events to not join the Monitors table
* fix to sql for timeline
* added RecordAudio to sql in README
* Use sub queries instead of joins to fix errors when using new mysql defaults.
* fix sql queries
* Dockerfile to build feature-h264-videostorage
* Must cast codec
* add php-acpu as a dependency
* require php5-acpu
* fix typo
* remove extra /
* Add a line for out-of-tree builds to do api/lib/Cake/bootstrap.php
* delete merge conflict files
* delete merge conflict files
2017-05-16 10:02:48 +08:00
char Event : : video_file_format [ PATH_MAX ] ;
2013-03-17 07:45:21 +08:00
int Event : : pre_alarm_count = 0 ;
Event : : PreAlarmData Event : : pre_alarm_data [ MAX_PRE_ALARM_FRAMES ] = { { 0 } } ;
Feature h264 videostorage (#1882)
* Moved writing of configure options from Controller to Model. Fixes #191.
* Initial commit for saving events as videos :)
* Add zm_video.cpp to autotools
* Add zm_video.h to autotools
* Search for MP4V2 header file 3 times: mp4v2/mp4v2.h, mp4v2.h, mp4.h
* Fix serve memory leak
* Few minor code improvements
* Added the ability to override preset, tune, profile and few other improvements
* Correctly write SPS & PPS from x264 encoder headers
* Remove unnessecary SPS & PPS writing code
* Imported missing files from master to feature-h264-videostorage
* Audio support including fixes for dts/pts, split on keyframe and update to mkv extension to prevent ffmpeg problems writing rtsp audio to mp4 containter (header problem)
* Updates to make gcc happy
* Add html5 video control to timeline and event to support mkv playback
* Add zm_videostore.cpp to CMakeLists.txt
* Remove Modern Branch for now
* Fix minor bug
* Option handled added in master, removing duplicate declaration
* Add CaptureandRecord from zm_camera.h
* Putting placeholder in for CaptureAndRecord function
* Removed duplicate code and brackets
* add digest auth file for cmake
Conflicts:
src/CMakeLists.txt
* Add web dir back into Makefile.am
Revert "Removed web from SUBDIRS in Makefile.am"
This reverts commit d9bbcdf3a94cba4d8955fcd03bd965ed2772f34d.
* Add CaptureAndRecord to vlc, still need to make it record
* Resolve SegFault on videostore
* Swap to mp4 container
* mp4 changes
* spaces to tabs, hide video stuff if video writer is turned off
* Make timeline open event.mp4 instead of mkv
* Missed mkv in timeline.js
* Fix some issues from the merge conflict
* Resolve post merge build issues with braces
* Fix whitespace
* Update Jpeg and Video options for passthrough options
* Whitespace fix zm_camera.h
* Fix array mkssing comma
* Add support for Jpeg save options for h264 branch snapshot. Might remove altogether if snapshots not needed
* Update VideoStoreData memory size comment
* Change from config.use_mkv_storage to per monitor option VideoWriter from video branch
* Fix bracket issues post merge
* Clean up comments and add av_free_packet
* Convert from event_directory to event file as per Video branch
* Testing videojs for video playback
* Fixed a missing bracket post merge and also SQL_values now used for EventID and Monitors
* bring recent improvements in ffmpeg capture function into captureandrecord
* Remove pict from writeAudioFramePacket as not used
* Add translate options for h264 Storage options in Monitor and update en_gb file
* Cherry-Pick from iconnor - make it compile on ubuntu 15.04. Which is libav 56.1.0
Conflicts:
src/zm_ffmpeg.cpp
src/zm_remote_camera_rtsp.cpp
Conflicts:
distros/ubuntu1204/changelog
* Clean up videostore code and remove lots of unused code
* proof of concept for dynamic/automatic video rotation using video-js plugin zoomrotate
Conflicts:
web/skins/classic/views/event.php
* removed redundant field in sql query
Conflicts:
web/skins/classic/views/event.php
* local storage of video js plugin
* Beautify!
Make the code somewhat readable.
* added missing videojs.zoomrotate.js file
added missing videojs.zoomrotate.js file
* Typo
added missing "
* Added missing brackets
* fix to display thumbnails when only storing snapshot.jpg
* added control for video playback rate
Conflicts:
web/skins/classic/views/event.php
* dynamically create jpegs from video file for viewing in browser
* fix timeline view for SaveJPEGs monitors (without enabled VideoWriter)
* only expose monitor info which are being used in client
* fix segmentation fault in zma with ubuntu 14.04 and ffmpeg 2.5.8 (gcc 4.8)
when libx264 is not installed
* better way of detecting showing image or video in timeline and event view
instead of Monitor.VideoWriter, Event.DefaultVideo is used, so even if
VideoWriter/SaveJPEG option is changed, a valid image or video will always be
displayed for historical events in both timeline and event view
this also fixes loading videos in timeline view
* Fixes problem of crashing zmc when bad packet arrives causing av_interleaved_write_frame() to return non-zero (-22). Prefilters common packet issues. Add metadata title to generated video file
* Remove syslog.h
* fixed SaveJPEGs are not working
which is caused in errors introduced when merging with master
* Update README.md
* Fix build warnings specific to h264 branch, unused FrameImg, unused ret and int64_t snprintf issues
* Fix PRId64 issue in travis, builds locally fine, but I can see a gcc version issue here
* Fix PRId64 issue in travis, another try
* Try "STDC_FORMAT_MACROS" to see if that helps Travis on gcc 4.6.3
* Revert space removal around PRId64
* video branch ffmpeg 2.9 fixes
ffmpeg 2.9 patched removed SSE2 CPU
* Add FFMPEGInit back
* use webvvt to overlay timestamp (honoring Monitor.LabelFormat) to videos in timeline and event
also fixed bug which prevented seeking in timeline video preview
* ffmpeg 3.0 API build failure fixes
* Update README.md
* merge all the commits from the messed up iconnor_video branch
* fix whitespace
* revert
* whitespace fixes
* spelling fix
* put back some text
* add these back
* fix spelling mistake
* Steal some packet dumping routines from ffmpeg. Convert them to use our logging routines
* add a test and error message if the codec is not h264
* these have been removed in master
* add a view to check auth and just send the video
* add some comments, and dump filename and AVFormatContext on failure to write header
* add the toggle for RecordAudio so that the checkbox works to turn off Audio
* Must init videoStore in constuctor
* more debug and comments, return checking
* Fix dropped part of sql query.
* fix extra else and some whitespace
* Fix missing } from merge that was preventing building.
* fix tabs
* get rid of use of separator, just use \n
* Restore lost fixes for deprecation
* Why are these failing
* Respect record_audio flag when setting up video file so dont try and initiliase mp4 with unsupported audio
* Forgot that I was trying to solve case of stream is true and record_audio
is false.
* Pass swscale_ctx back in to getCachedContext or it will create new
context every frame and leak memory like a mofo.
* Add libx264-dev and libmp4v2-dev to build requires to save hassle of
ensuring they are installed before build.
* Merge my Rotation/Orientation work and fixes for bad h264 streams
* need arpa/inet for reverse lookups
* pull in the new byte range code for viewing videos
* Move our recording flag deeper into closeevent
* add braces and only call closeEvent if there is an event
* deprecate the z_frame_rate stuff which is deprecated in ffmpeg
* remark out some debugging
* fix for video on stream 1
* fix audio_stream to audio_st
* Ignore bad decodes
* fix problems with content-length causing viewing to not work in chrome/android
* change logic of sending file contents to handle an off by one and be more readable
* Some fixes pointed out by Maxim Romanov. Also simply the loading of events to not join the Monitors table
* fix to sql for timeline
* added RecordAudio to sql in README
* Use sub queries instead of joins to fix errors when using new mysql defaults.
* fix sql queries
* Dockerfile to build feature-h264-videostorage
* Must cast codec
* add php-acpu as a dependency
* require php5-acpu
* fix typo
* remove extra /
* Add a line for out-of-tree builds to do api/lib/Cake/bootstrap.php
* delete merge conflict files
* delete merge conflict files
2017-05-16 10:02:48 +08:00
Event : : Event ( Monitor * p_monitor , struct timeval p_start_time , const std : : string & p_cause , const StringSetMap & p_noteSetMap , bool p_videoEvent ) :
2016-04-04 22:11:48 +08:00
monitor ( p_monitor ) ,
start_time ( p_start_time ) ,
cause ( p_cause ) ,
Feature h264 videostorage (#1882)
* Moved writing of configure options from Controller to Model. Fixes #191.
* Initial commit for saving events as videos :)
* Add zm_video.cpp to autotools
* Add zm_video.h to autotools
* Search for MP4V2 header file 3 times: mp4v2/mp4v2.h, mp4v2.h, mp4.h
* Fix serve memory leak
* Few minor code improvements
* Added the ability to override preset, tune, profile and few other improvements
* Correctly write SPS & PPS from x264 encoder headers
* Remove unnessecary SPS & PPS writing code
* Imported missing files from master to feature-h264-videostorage
* Audio support including fixes for dts/pts, split on keyframe and update to mkv extension to prevent ffmpeg problems writing rtsp audio to mp4 containter (header problem)
* Updates to make gcc happy
* Add html5 video control to timeline and event to support mkv playback
* Add zm_videostore.cpp to CMakeLists.txt
* Remove Modern Branch for now
* Fix minor bug
* Option handled added in master, removing duplicate declaration
* Add CaptureandRecord from zm_camera.h
* Putting placeholder in for CaptureAndRecord function
* Removed duplicate code and brackets
* add digest auth file for cmake
Conflicts:
src/CMakeLists.txt
* Add web dir back into Makefile.am
Revert "Removed web from SUBDIRS in Makefile.am"
This reverts commit d9bbcdf3a94cba4d8955fcd03bd965ed2772f34d.
* Add CaptureAndRecord to vlc, still need to make it record
* Resolve SegFault on videostore
* Swap to mp4 container
* mp4 changes
* spaces to tabs, hide video stuff if video writer is turned off
* Make timeline open event.mp4 instead of mkv
* Missed mkv in timeline.js
* Fix some issues from the merge conflict
* Resolve post merge build issues with braces
* Fix whitespace
* Update Jpeg and Video options for passthrough options
* Whitespace fix zm_camera.h
* Fix array mkssing comma
* Add support for Jpeg save options for h264 branch snapshot. Might remove altogether if snapshots not needed
* Update VideoStoreData memory size comment
* Change from config.use_mkv_storage to per monitor option VideoWriter from video branch
* Fix bracket issues post merge
* Clean up comments and add av_free_packet
* Convert from event_directory to event file as per Video branch
* Testing videojs for video playback
* Fixed a missing bracket post merge and also SQL_values now used for EventID and Monitors
* bring recent improvements in ffmpeg capture function into captureandrecord
* Remove pict from writeAudioFramePacket as not used
* Add translate options for h264 Storage options in Monitor and update en_gb file
* Cherry-Pick from iconnor - make it compile on ubuntu 15.04. Which is libav 56.1.0
Conflicts:
src/zm_ffmpeg.cpp
src/zm_remote_camera_rtsp.cpp
Conflicts:
distros/ubuntu1204/changelog
* Clean up videostore code and remove lots of unused code
* proof of concept for dynamic/automatic video rotation using video-js plugin zoomrotate
Conflicts:
web/skins/classic/views/event.php
* removed redundant field in sql query
Conflicts:
web/skins/classic/views/event.php
* local storage of video js plugin
* Beautify!
Make the code somewhat readable.
* added missing videojs.zoomrotate.js file
added missing videojs.zoomrotate.js file
* Typo
added missing "
* Added missing brackets
* fix to display thumbnails when only storing snapshot.jpg
* added control for video playback rate
Conflicts:
web/skins/classic/views/event.php
* dynamically create jpegs from video file for viewing in browser
* fix timeline view for SaveJPEGs monitors (without enabled VideoWriter)
* only expose monitor info which are being used in client
* fix segmentation fault in zma with ubuntu 14.04 and ffmpeg 2.5.8 (gcc 4.8)
when libx264 is not installed
* better way of detecting showing image or video in timeline and event view
instead of Monitor.VideoWriter, Event.DefaultVideo is used, so even if
VideoWriter/SaveJPEG option is changed, a valid image or video will always be
displayed for historical events in both timeline and event view
this also fixes loading videos in timeline view
* Fixes problem of crashing zmc when bad packet arrives causing av_interleaved_write_frame() to return non-zero (-22). Prefilters common packet issues. Add metadata title to generated video file
* Remove syslog.h
* fixed SaveJPEGs are not working
which is caused in errors introduced when merging with master
* Update README.md
* Fix build warnings specific to h264 branch, unused FrameImg, unused ret and int64_t snprintf issues
* Fix PRId64 issue in travis, builds locally fine, but I can see a gcc version issue here
* Fix PRId64 issue in travis, another try
* Try "STDC_FORMAT_MACROS" to see if that helps Travis on gcc 4.6.3
* Revert space removal around PRId64
* video branch ffmpeg 2.9 fixes
ffmpeg 2.9 patched removed SSE2 CPU
* Add FFMPEGInit back
* use webvvt to overlay timestamp (honoring Monitor.LabelFormat) to videos in timeline and event
also fixed bug which prevented seeking in timeline video preview
* ffmpeg 3.0 API build failure fixes
* Update README.md
* merge all the commits from the messed up iconnor_video branch
* fix whitespace
* revert
* whitespace fixes
* spelling fix
* put back some text
* add these back
* fix spelling mistake
* Steal some packet dumping routines from ffmpeg. Convert them to use our logging routines
* add a test and error message if the codec is not h264
* these have been removed in master
* add a view to check auth and just send the video
* add some comments, and dump filename and AVFormatContext on failure to write header
* add the toggle for RecordAudio so that the checkbox works to turn off Audio
* Must init videoStore in constuctor
* more debug and comments, return checking
* Fix dropped part of sql query.
* fix extra else and some whitespace
* Fix missing } from merge that was preventing building.
* fix tabs
* get rid of use of separator, just use \n
* Restore lost fixes for deprecation
* Why are these failing
* Respect record_audio flag when setting up video file so dont try and initiliase mp4 with unsupported audio
* Forgot that I was trying to solve case of stream is true and record_audio
is false.
* Pass swscale_ctx back in to getCachedContext or it will create new
context every frame and leak memory like a mofo.
* Add libx264-dev and libmp4v2-dev to build requires to save hassle of
ensuring they are installed before build.
* Merge my Rotation/Orientation work and fixes for bad h264 streams
* need arpa/inet for reverse lookups
* pull in the new byte range code for viewing videos
* Move our recording flag deeper into closeevent
* add braces and only call closeEvent if there is an event
* deprecate the z_frame_rate stuff which is deprecated in ffmpeg
* remark out some debugging
* fix for video on stream 1
* fix audio_stream to audio_st
* Ignore bad decodes
* fix problems with content-length causing viewing to not work in chrome/android
* change logic of sending file contents to handle an off by one and be more readable
* Some fixes pointed out by Maxim Romanov. Also simply the loading of events to not join the Monitors table
* fix to sql for timeline
* added RecordAudio to sql in README
* Use sub queries instead of joins to fix errors when using new mysql defaults.
* fix sql queries
* Dockerfile to build feature-h264-videostorage
* Must cast codec
* add php-acpu as a dependency
* require php5-acpu
* fix typo
* remove extra /
* Add a line for out-of-tree builds to do api/lib/Cake/bootstrap.php
* delete merge conflict files
* delete merge conflict files
2017-05-16 10:02:48 +08:00
noteSetMap ( p_noteSetMap ) ,
videoEvent ( p_videoEvent ) ,
videowriter ( NULL )
2013-03-17 07:45:21 +08:00
{
2016-04-04 22:11:48 +08:00
if ( ! initialised )
Initialise ( ) ;
std : : string notes ;
createNotes ( notes ) ;
bool untimedEvent = false ;
2017-05-17 00:04:56 +08:00
if ( ! start_time . tv_sec ) {
2016-04-04 22:11:48 +08:00
untimedEvent = true ;
gettimeofday ( & start_time , 0 ) ;
}
static char sql [ ZM_SQL_MED_BUFSIZ ] ;
struct tm * stime = localtime ( & start_time . tv_sec ) ;
Feature h264 videostorage (#1882)
* Moved writing of configure options from Controller to Model. Fixes #191.
* Initial commit for saving events as videos :)
* Add zm_video.cpp to autotools
* Add zm_video.h to autotools
* Search for MP4V2 header file 3 times: mp4v2/mp4v2.h, mp4v2.h, mp4.h
* Fix serve memory leak
* Few minor code improvements
* Added the ability to override preset, tune, profile and few other improvements
* Correctly write SPS & PPS from x264 encoder headers
* Remove unnessecary SPS & PPS writing code
* Imported missing files from master to feature-h264-videostorage
* Audio support including fixes for dts/pts, split on keyframe and update to mkv extension to prevent ffmpeg problems writing rtsp audio to mp4 containter (header problem)
* Updates to make gcc happy
* Add html5 video control to timeline and event to support mkv playback
* Add zm_videostore.cpp to CMakeLists.txt
* Remove Modern Branch for now
* Fix minor bug
* Option handled added in master, removing duplicate declaration
* Add CaptureandRecord from zm_camera.h
* Putting placeholder in for CaptureAndRecord function
* Removed duplicate code and brackets
* add digest auth file for cmake
Conflicts:
src/CMakeLists.txt
* Add web dir back into Makefile.am
Revert "Removed web from SUBDIRS in Makefile.am"
This reverts commit d9bbcdf3a94cba4d8955fcd03bd965ed2772f34d.
* Add CaptureAndRecord to vlc, still need to make it record
* Resolve SegFault on videostore
* Swap to mp4 container
* mp4 changes
* spaces to tabs, hide video stuff if video writer is turned off
* Make timeline open event.mp4 instead of mkv
* Missed mkv in timeline.js
* Fix some issues from the merge conflict
* Resolve post merge build issues with braces
* Fix whitespace
* Update Jpeg and Video options for passthrough options
* Whitespace fix zm_camera.h
* Fix array mkssing comma
* Add support for Jpeg save options for h264 branch snapshot. Might remove altogether if snapshots not needed
* Update VideoStoreData memory size comment
* Change from config.use_mkv_storage to per monitor option VideoWriter from video branch
* Fix bracket issues post merge
* Clean up comments and add av_free_packet
* Convert from event_directory to event file as per Video branch
* Testing videojs for video playback
* Fixed a missing bracket post merge and also SQL_values now used for EventID and Monitors
* bring recent improvements in ffmpeg capture function into captureandrecord
* Remove pict from writeAudioFramePacket as not used
* Add translate options for h264 Storage options in Monitor and update en_gb file
* Cherry-Pick from iconnor - make it compile on ubuntu 15.04. Which is libav 56.1.0
Conflicts:
src/zm_ffmpeg.cpp
src/zm_remote_camera_rtsp.cpp
Conflicts:
distros/ubuntu1204/changelog
* Clean up videostore code and remove lots of unused code
* proof of concept for dynamic/automatic video rotation using video-js plugin zoomrotate
Conflicts:
web/skins/classic/views/event.php
* removed redundant field in sql query
Conflicts:
web/skins/classic/views/event.php
* local storage of video js plugin
* Beautify!
Make the code somewhat readable.
* added missing videojs.zoomrotate.js file
added missing videojs.zoomrotate.js file
* Typo
added missing "
* Added missing brackets
* fix to display thumbnails when only storing snapshot.jpg
* added control for video playback rate
Conflicts:
web/skins/classic/views/event.php
* dynamically create jpegs from video file for viewing in browser
* fix timeline view for SaveJPEGs monitors (without enabled VideoWriter)
* only expose monitor info which are being used in client
* fix segmentation fault in zma with ubuntu 14.04 and ffmpeg 2.5.8 (gcc 4.8)
when libx264 is not installed
* better way of detecting showing image or video in timeline and event view
instead of Monitor.VideoWriter, Event.DefaultVideo is used, so even if
VideoWriter/SaveJPEG option is changed, a valid image or video will always be
displayed for historical events in both timeline and event view
this also fixes loading videos in timeline view
* Fixes problem of crashing zmc when bad packet arrives causing av_interleaved_write_frame() to return non-zero (-22). Prefilters common packet issues. Add metadata title to generated video file
* Remove syslog.h
* fixed SaveJPEGs are not working
which is caused in errors introduced when merging with master
* Update README.md
* Fix build warnings specific to h264 branch, unused FrameImg, unused ret and int64_t snprintf issues
* Fix PRId64 issue in travis, builds locally fine, but I can see a gcc version issue here
* Fix PRId64 issue in travis, another try
* Try "STDC_FORMAT_MACROS" to see if that helps Travis on gcc 4.6.3
* Revert space removal around PRId64
* video branch ffmpeg 2.9 fixes
ffmpeg 2.9 patched removed SSE2 CPU
* Add FFMPEGInit back
* use webvvt to overlay timestamp (honoring Monitor.LabelFormat) to videos in timeline and event
also fixed bug which prevented seeking in timeline video preview
* ffmpeg 3.0 API build failure fixes
* Update README.md
* merge all the commits from the messed up iconnor_video branch
* fix whitespace
* revert
* whitespace fixes
* spelling fix
* put back some text
* add these back
* fix spelling mistake
* Steal some packet dumping routines from ffmpeg. Convert them to use our logging routines
* add a test and error message if the codec is not h264
* these have been removed in master
* add a view to check auth and just send the video
* add some comments, and dump filename and AVFormatContext on failure to write header
* add the toggle for RecordAudio so that the checkbox works to turn off Audio
* Must init videoStore in constuctor
* more debug and comments, return checking
* Fix dropped part of sql query.
* fix extra else and some whitespace
* Fix missing } from merge that was preventing building.
* fix tabs
* get rid of use of separator, just use \n
* Restore lost fixes for deprecation
* Why are these failing
* Respect record_audio flag when setting up video file so dont try and initiliase mp4 with unsupported audio
* Forgot that I was trying to solve case of stream is true and record_audio
is false.
* Pass swscale_ctx back in to getCachedContext or it will create new
context every frame and leak memory like a mofo.
* Add libx264-dev and libmp4v2-dev to build requires to save hassle of
ensuring they are installed before build.
* Merge my Rotation/Orientation work and fixes for bad h264 streams
* need arpa/inet for reverse lookups
* pull in the new byte range code for viewing videos
* Move our recording flag deeper into closeevent
* add braces and only call closeEvent if there is an event
* deprecate the z_frame_rate stuff which is deprecated in ffmpeg
* remark out some debugging
* fix for video on stream 1
* fix audio_stream to audio_st
* Ignore bad decodes
* fix problems with content-length causing viewing to not work in chrome/android
* change logic of sending file contents to handle an off by one and be more readable
* Some fixes pointed out by Maxim Romanov. Also simply the loading of events to not join the Monitors table
* fix to sql for timeline
* added RecordAudio to sql in README
* Use sub queries instead of joins to fix errors when using new mysql defaults.
* fix sql queries
* Dockerfile to build feature-h264-videostorage
* Must cast codec
* add php-acpu as a dependency
* require php5-acpu
* fix typo
* remove extra /
* Add a line for out-of-tree builds to do api/lib/Cake/bootstrap.php
* delete merge conflict files
* delete merge conflict files
2017-05-16 10:02:48 +08:00
snprintf ( sql , sizeof ( sql ) , " insert into Events ( MonitorId, Name, StartTime, Width, Height, Cause, Notes, Videoed ) values ( %d, 'New Event', from_unixtime( %ld ), %d, %d, '%s', '%s', '%d' ) " , monitor - > Id ( ) , start_time . tv_sec , monitor - > Width ( ) , monitor - > Height ( ) , cause . c_str ( ) , notes . c_str ( ) , videoEvent ) ;
2017-05-17 00:04:56 +08:00
if ( mysql_query ( & dbconn , sql ) ) {
2016-04-04 22:11:48 +08:00
Error ( " Can't insert event: %s " , mysql_error ( & dbconn ) ) ;
exit ( mysql_errno ( & dbconn ) ) ;
}
id = mysql_insert_id ( & dbconn ) ;
2017-05-17 00:04:56 +08:00
if ( untimedEvent ) {
2016-04-04 22:11:48 +08:00
Warning ( " Event %d has zero time, setting to current " , id ) ;
}
end_time . tv_sec = 0 ;
frames = 0 ;
alarm_frames = 0 ;
tot_score = 0 ;
max_score = 0 ;
2017-05-20 02:24:49 +08:00
struct stat statbuf ;
2017-05-20 02:52:45 +08:00
char id_file [ PATH_MAX ] ;
2017-05-20 02:24:49 +08:00
2017-05-17 00:04:56 +08:00
if ( config . use_deep_storage ) {
2016-04-04 22:11:48 +08:00
char * path_ptr = path ;
path_ptr + = snprintf ( path_ptr , sizeof ( path ) , " %s/%d " , config . dir_events , monitor - > Id ( ) ) ;
int dt_parts [ 6 ] ;
dt_parts [ 0 ] = stime - > tm_year - 100 ;
dt_parts [ 1 ] = stime - > tm_mon + 1 ;
dt_parts [ 2 ] = stime - > tm_mday ;
dt_parts [ 3 ] = stime - > tm_hour ;
dt_parts [ 4 ] = stime - > tm_min ;
dt_parts [ 5 ] = stime - > tm_sec ;
char date_path [ PATH_MAX ] = " " ;
char time_path [ PATH_MAX ] = " " ;
char * time_path_ptr = time_path ;
2017-05-17 00:04:56 +08:00
for ( unsigned int i = 0 ; i < sizeof ( dt_parts ) / sizeof ( * dt_parts ) ; i + + ) {
2016-04-04 22:11:48 +08:00
path_ptr + = snprintf ( path_ptr , sizeof ( path ) - ( path_ptr - path ) , " /%02d " , dt_parts [ i ] ) ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
errno = 0 ;
if ( stat ( path , & statbuf ) ) {
2017-05-17 00:04:56 +08:00
if ( errno = = ENOENT | | errno = = ENOTDIR ) {
if ( mkdir ( path , 0755 ) ) {
2016-04-04 22:11:48 +08:00
Fatal ( " Can't mkdir %s: %s " , path , strerror ( errno ) ) ;
}
} else {
Warning ( " Error stat'ing %s, may be fatal. error is %s " , path , strerror ( errno ) ) ;
2013-03-17 07:45:21 +08:00
}
2016-04-04 22:11:48 +08:00
}
if ( i = = 2 )
strncpy ( date_path , path , sizeof ( date_path ) ) ;
else if ( i > = 3 )
time_path_ptr + = snprintf ( time_path_ptr , sizeof ( time_path ) - ( time_path_ptr - time_path ) , " %s%02d " , i > 3 ? " / " : " " , dt_parts [ i ] ) ;
2013-03-17 07:45:21 +08:00
}
2016-04-04 22:11:48 +08:00
// Create event id symlink
snprintf ( id_file , sizeof ( id_file ) , " %s/.%d " , date_path , id ) ;
if ( symlink ( time_path , id_file ) < 0 )
Fatal ( " Can't symlink %s -> %s: %s " , id_file , path , strerror ( errno ) ) ;
2017-05-17 00:04:56 +08:00
} else {
2016-04-04 22:11:48 +08:00
snprintf ( path , sizeof ( path ) , " %s/%d/%d " , config . dir_events , monitor - > Id ( ) , id ) ;
2017-05-20 01:30:08 +08:00
2016-04-04 22:11:48 +08:00
errno = 0 ;
stat ( path , & statbuf ) ;
2017-05-17 00:04:56 +08:00
if ( errno = = ENOENT | | errno = = ENOTDIR ) {
if ( mkdir ( path , 0755 ) ) {
2016-04-04 22:11:48 +08:00
Error ( " Can't mkdir %s: %s " , path , strerror ( errno ) ) ;
}
2013-03-17 07:45:21 +08:00
}
2017-05-20 02:24:49 +08:00
} // deep storage or not
2017-05-20 02:52:45 +08:00
// Create empty id tag file
snprintf ( id_file , sizeof ( id_file ) , " %s/.%d " , path , id ) ;
if ( FILE * id_fp = fopen ( id_file , " w " ) )
fclose ( id_fp ) ;
else
Fatal ( " Can't fopen %s: %s " , id_file , strerror ( errno ) ) ;
2017-05-20 02:24:49 +08:00
2016-04-04 22:11:48 +08:00
last_db_frame = 0 ;
Feature h264 videostorage (#1882)
* Moved writing of configure options from Controller to Model. Fixes #191.
* Initial commit for saving events as videos :)
* Add zm_video.cpp to autotools
* Add zm_video.h to autotools
* Search for MP4V2 header file 3 times: mp4v2/mp4v2.h, mp4v2.h, mp4.h
* Fix serve memory leak
* Few minor code improvements
* Added the ability to override preset, tune, profile and few other improvements
* Correctly write SPS & PPS from x264 encoder headers
* Remove unnessecary SPS & PPS writing code
* Imported missing files from master to feature-h264-videostorage
* Audio support including fixes for dts/pts, split on keyframe and update to mkv extension to prevent ffmpeg problems writing rtsp audio to mp4 containter (header problem)
* Updates to make gcc happy
* Add html5 video control to timeline and event to support mkv playback
* Add zm_videostore.cpp to CMakeLists.txt
* Remove Modern Branch for now
* Fix minor bug
* Option handled added in master, removing duplicate declaration
* Add CaptureandRecord from zm_camera.h
* Putting placeholder in for CaptureAndRecord function
* Removed duplicate code and brackets
* add digest auth file for cmake
Conflicts:
src/CMakeLists.txt
* Add web dir back into Makefile.am
Revert "Removed web from SUBDIRS in Makefile.am"
This reverts commit d9bbcdf3a94cba4d8955fcd03bd965ed2772f34d.
* Add CaptureAndRecord to vlc, still need to make it record
* Resolve SegFault on videostore
* Swap to mp4 container
* mp4 changes
* spaces to tabs, hide video stuff if video writer is turned off
* Make timeline open event.mp4 instead of mkv
* Missed mkv in timeline.js
* Fix some issues from the merge conflict
* Resolve post merge build issues with braces
* Fix whitespace
* Update Jpeg and Video options for passthrough options
* Whitespace fix zm_camera.h
* Fix array mkssing comma
* Add support for Jpeg save options for h264 branch snapshot. Might remove altogether if snapshots not needed
* Update VideoStoreData memory size comment
* Change from config.use_mkv_storage to per monitor option VideoWriter from video branch
* Fix bracket issues post merge
* Clean up comments and add av_free_packet
* Convert from event_directory to event file as per Video branch
* Testing videojs for video playback
* Fixed a missing bracket post merge and also SQL_values now used for EventID and Monitors
* bring recent improvements in ffmpeg capture function into captureandrecord
* Remove pict from writeAudioFramePacket as not used
* Add translate options for h264 Storage options in Monitor and update en_gb file
* Cherry-Pick from iconnor - make it compile on ubuntu 15.04. Which is libav 56.1.0
Conflicts:
src/zm_ffmpeg.cpp
src/zm_remote_camera_rtsp.cpp
Conflicts:
distros/ubuntu1204/changelog
* Clean up videostore code and remove lots of unused code
* proof of concept for dynamic/automatic video rotation using video-js plugin zoomrotate
Conflicts:
web/skins/classic/views/event.php
* removed redundant field in sql query
Conflicts:
web/skins/classic/views/event.php
* local storage of video js plugin
* Beautify!
Make the code somewhat readable.
* added missing videojs.zoomrotate.js file
added missing videojs.zoomrotate.js file
* Typo
added missing "
* Added missing brackets
* fix to display thumbnails when only storing snapshot.jpg
* added control for video playback rate
Conflicts:
web/skins/classic/views/event.php
* dynamically create jpegs from video file for viewing in browser
* fix timeline view for SaveJPEGs monitors (without enabled VideoWriter)
* only expose monitor info which are being used in client
* fix segmentation fault in zma with ubuntu 14.04 and ffmpeg 2.5.8 (gcc 4.8)
when libx264 is not installed
* better way of detecting showing image or video in timeline and event view
instead of Monitor.VideoWriter, Event.DefaultVideo is used, so even if
VideoWriter/SaveJPEG option is changed, a valid image or video will always be
displayed for historical events in both timeline and event view
this also fixes loading videos in timeline view
* Fixes problem of crashing zmc when bad packet arrives causing av_interleaved_write_frame() to return non-zero (-22). Prefilters common packet issues. Add metadata title to generated video file
* Remove syslog.h
* fixed SaveJPEGs are not working
which is caused in errors introduced when merging with master
* Update README.md
* Fix build warnings specific to h264 branch, unused FrameImg, unused ret and int64_t snprintf issues
* Fix PRId64 issue in travis, builds locally fine, but I can see a gcc version issue here
* Fix PRId64 issue in travis, another try
* Try "STDC_FORMAT_MACROS" to see if that helps Travis on gcc 4.6.3
* Revert space removal around PRId64
* video branch ffmpeg 2.9 fixes
ffmpeg 2.9 patched removed SSE2 CPU
* Add FFMPEGInit back
* use webvvt to overlay timestamp (honoring Monitor.LabelFormat) to videos in timeline and event
also fixed bug which prevented seeking in timeline video preview
* ffmpeg 3.0 API build failure fixes
* Update README.md
* merge all the commits from the messed up iconnor_video branch
* fix whitespace
* revert
* whitespace fixes
* spelling fix
* put back some text
* add these back
* fix spelling mistake
* Steal some packet dumping routines from ffmpeg. Convert them to use our logging routines
* add a test and error message if the codec is not h264
* these have been removed in master
* add a view to check auth and just send the video
* add some comments, and dump filename and AVFormatContext on failure to write header
* add the toggle for RecordAudio so that the checkbox works to turn off Audio
* Must init videoStore in constuctor
* more debug and comments, return checking
* Fix dropped part of sql query.
* fix extra else and some whitespace
* Fix missing } from merge that was preventing building.
* fix tabs
* get rid of use of separator, just use \n
* Restore lost fixes for deprecation
* Why are these failing
* Respect record_audio flag when setting up video file so dont try and initiliase mp4 with unsupported audio
* Forgot that I was trying to solve case of stream is true and record_audio
is false.
* Pass swscale_ctx back in to getCachedContext or it will create new
context every frame and leak memory like a mofo.
* Add libx264-dev and libmp4v2-dev to build requires to save hassle of
ensuring they are installed before build.
* Merge my Rotation/Orientation work and fixes for bad h264 streams
* need arpa/inet for reverse lookups
* pull in the new byte range code for viewing videos
* Move our recording flag deeper into closeevent
* add braces and only call closeEvent if there is an event
* deprecate the z_frame_rate stuff which is deprecated in ffmpeg
* remark out some debugging
* fix for video on stream 1
* fix audio_stream to audio_st
* Ignore bad decodes
* fix problems with content-length causing viewing to not work in chrome/android
* change logic of sending file contents to handle an off by one and be more readable
* Some fixes pointed out by Maxim Romanov. Also simply the loading of events to not join the Monitors table
* fix to sql for timeline
* added RecordAudio to sql in README
* Use sub queries instead of joins to fix errors when using new mysql defaults.
* fix sql queries
* Dockerfile to build feature-h264-videostorage
* Must cast codec
* add php-acpu as a dependency
* require php5-acpu
* fix typo
* remove extra /
* Add a line for out-of-tree builds to do api/lib/Cake/bootstrap.php
* delete merge conflict files
* delete merge conflict files
2017-05-16 10:02:48 +08:00
video_name [ 0 ] = 0 ;
/* Save as video */
if ( monitor - > GetOptVideoWriter ( ) ! = 0 ) {
snprintf ( video_name , sizeof ( video_name ) , " %d-%s " , id , " video.mp4 " ) ;
snprintf ( video_file , sizeof ( video_file ) , video_file_format , path , video_name ) ;
snprintf ( timecodes_name , sizeof ( timecodes_name ) , " %d-%s " , id , " video.timecodes " ) ;
snprintf ( timecodes_file , sizeof ( timecodes_file ) , video_file_format , path , timecodes_name ) ;
/* X264 MP4 video writer */
if ( monitor - > GetOptVideoWriter ( ) = = 1 ) {
# if ZM_HAVE_VIDEOWRITER_X264MP4
videowriter = new X264MP4Writer ( video_file , monitor - > Width ( ) , monitor - > Height ( ) , monitor - > Colours ( ) , monitor - > SubpixelOrder ( ) , monitor - > GetOptEncoderParams ( ) ) ;
# else
Error ( " ZoneMinder was not compiled with the X264 MP4 video writer, check dependencies (x264 and mp4v2) " ) ;
# endif
}
if ( videowriter ! = NULL ) {
/* Open the video stream */
2017-05-17 00:04:56 +08:00
int nRet = videowriter - > Open ( ) ;
Feature h264 videostorage (#1882)
* Moved writing of configure options from Controller to Model. Fixes #191.
* Initial commit for saving events as videos :)
* Add zm_video.cpp to autotools
* Add zm_video.h to autotools
* Search for MP4V2 header file 3 times: mp4v2/mp4v2.h, mp4v2.h, mp4.h
* Fix serve memory leak
* Few minor code improvements
* Added the ability to override preset, tune, profile and few other improvements
* Correctly write SPS & PPS from x264 encoder headers
* Remove unnessecary SPS & PPS writing code
* Imported missing files from master to feature-h264-videostorage
* Audio support including fixes for dts/pts, split on keyframe and update to mkv extension to prevent ffmpeg problems writing rtsp audio to mp4 containter (header problem)
* Updates to make gcc happy
* Add html5 video control to timeline and event to support mkv playback
* Add zm_videostore.cpp to CMakeLists.txt
* Remove Modern Branch for now
* Fix minor bug
* Option handled added in master, removing duplicate declaration
* Add CaptureandRecord from zm_camera.h
* Putting placeholder in for CaptureAndRecord function
* Removed duplicate code and brackets
* add digest auth file for cmake
Conflicts:
src/CMakeLists.txt
* Add web dir back into Makefile.am
Revert "Removed web from SUBDIRS in Makefile.am"
This reverts commit d9bbcdf3a94cba4d8955fcd03bd965ed2772f34d.
* Add CaptureAndRecord to vlc, still need to make it record
* Resolve SegFault on videostore
* Swap to mp4 container
* mp4 changes
* spaces to tabs, hide video stuff if video writer is turned off
* Make timeline open event.mp4 instead of mkv
* Missed mkv in timeline.js
* Fix some issues from the merge conflict
* Resolve post merge build issues with braces
* Fix whitespace
* Update Jpeg and Video options for passthrough options
* Whitespace fix zm_camera.h
* Fix array mkssing comma
* Add support for Jpeg save options for h264 branch snapshot. Might remove altogether if snapshots not needed
* Update VideoStoreData memory size comment
* Change from config.use_mkv_storage to per monitor option VideoWriter from video branch
* Fix bracket issues post merge
* Clean up comments and add av_free_packet
* Convert from event_directory to event file as per Video branch
* Testing videojs for video playback
* Fixed a missing bracket post merge and also SQL_values now used for EventID and Monitors
* bring recent improvements in ffmpeg capture function into captureandrecord
* Remove pict from writeAudioFramePacket as not used
* Add translate options for h264 Storage options in Monitor and update en_gb file
* Cherry-Pick from iconnor - make it compile on ubuntu 15.04. Which is libav 56.1.0
Conflicts:
src/zm_ffmpeg.cpp
src/zm_remote_camera_rtsp.cpp
Conflicts:
distros/ubuntu1204/changelog
* Clean up videostore code and remove lots of unused code
* proof of concept for dynamic/automatic video rotation using video-js plugin zoomrotate
Conflicts:
web/skins/classic/views/event.php
* removed redundant field in sql query
Conflicts:
web/skins/classic/views/event.php
* local storage of video js plugin
* Beautify!
Make the code somewhat readable.
* added missing videojs.zoomrotate.js file
added missing videojs.zoomrotate.js file
* Typo
added missing "
* Added missing brackets
* fix to display thumbnails when only storing snapshot.jpg
* added control for video playback rate
Conflicts:
web/skins/classic/views/event.php
* dynamically create jpegs from video file for viewing in browser
* fix timeline view for SaveJPEGs monitors (without enabled VideoWriter)
* only expose monitor info which are being used in client
* fix segmentation fault in zma with ubuntu 14.04 and ffmpeg 2.5.8 (gcc 4.8)
when libx264 is not installed
* better way of detecting showing image or video in timeline and event view
instead of Monitor.VideoWriter, Event.DefaultVideo is used, so even if
VideoWriter/SaveJPEG option is changed, a valid image or video will always be
displayed for historical events in both timeline and event view
this also fixes loading videos in timeline view
* Fixes problem of crashing zmc when bad packet arrives causing av_interleaved_write_frame() to return non-zero (-22). Prefilters common packet issues. Add metadata title to generated video file
* Remove syslog.h
* fixed SaveJPEGs are not working
which is caused in errors introduced when merging with master
* Update README.md
* Fix build warnings specific to h264 branch, unused FrameImg, unused ret and int64_t snprintf issues
* Fix PRId64 issue in travis, builds locally fine, but I can see a gcc version issue here
* Fix PRId64 issue in travis, another try
* Try "STDC_FORMAT_MACROS" to see if that helps Travis on gcc 4.6.3
* Revert space removal around PRId64
* video branch ffmpeg 2.9 fixes
ffmpeg 2.9 patched removed SSE2 CPU
* Add FFMPEGInit back
* use webvvt to overlay timestamp (honoring Monitor.LabelFormat) to videos in timeline and event
also fixed bug which prevented seeking in timeline video preview
* ffmpeg 3.0 API build failure fixes
* Update README.md
* merge all the commits from the messed up iconnor_video branch
* fix whitespace
* revert
* whitespace fixes
* spelling fix
* put back some text
* add these back
* fix spelling mistake
* Steal some packet dumping routines from ffmpeg. Convert them to use our logging routines
* add a test and error message if the codec is not h264
* these have been removed in master
* add a view to check auth and just send the video
* add some comments, and dump filename and AVFormatContext on failure to write header
* add the toggle for RecordAudio so that the checkbox works to turn off Audio
* Must init videoStore in constuctor
* more debug and comments, return checking
* Fix dropped part of sql query.
* fix extra else and some whitespace
* Fix missing } from merge that was preventing building.
* fix tabs
* get rid of use of separator, just use \n
* Restore lost fixes for deprecation
* Why are these failing
* Respect record_audio flag when setting up video file so dont try and initiliase mp4 with unsupported audio
* Forgot that I was trying to solve case of stream is true and record_audio
is false.
* Pass swscale_ctx back in to getCachedContext or it will create new
context every frame and leak memory like a mofo.
* Add libx264-dev and libmp4v2-dev to build requires to save hassle of
ensuring they are installed before build.
* Merge my Rotation/Orientation work and fixes for bad h264 streams
* need arpa/inet for reverse lookups
* pull in the new byte range code for viewing videos
* Move our recording flag deeper into closeevent
* add braces and only call closeEvent if there is an event
* deprecate the z_frame_rate stuff which is deprecated in ffmpeg
* remark out some debugging
* fix for video on stream 1
* fix audio_stream to audio_st
* Ignore bad decodes
* fix problems with content-length causing viewing to not work in chrome/android
* change logic of sending file contents to handle an off by one and be more readable
* Some fixes pointed out by Maxim Romanov. Also simply the loading of events to not join the Monitors table
* fix to sql for timeline
* added RecordAudio to sql in README
* Use sub queries instead of joins to fix errors when using new mysql defaults.
* fix sql queries
* Dockerfile to build feature-h264-videostorage
* Must cast codec
* add php-acpu as a dependency
* require php5-acpu
* fix typo
* remove extra /
* Add a line for out-of-tree builds to do api/lib/Cake/bootstrap.php
* delete merge conflict files
* delete merge conflict files
2017-05-16 10:02:48 +08:00
if ( nRet ! = 0 ) {
Error ( " Failed opening video stream " ) ;
delete videowriter ;
videowriter = NULL ;
}
/* Create timecodes file */
timecodes_fd = fopen ( timecodes_file , " wb " ) ;
if ( timecodes_fd = = NULL ) {
Error ( " Failed creating timecodes file " ) ;
}
}
} else {
/* No video object */
videowriter = NULL ;
}
2017-05-17 00:04:56 +08:00
} // Event::Event( Monitor *p_monitor, struct timeval p_start_time, const std::string &p_cause, const StringSetMap &p_noteSetMap, bool p_videoEvent )
2013-03-17 07:45:21 +08:00
2017-05-17 00:04:56 +08:00
Event : : ~ Event ( ) {
static char sql [ ZM_SQL_MED_BUFSIZ ] ;
struct DeltaTimeval delta_time ;
DELTA_TIMEVAL ( delta_time , end_time , start_time , DT_PREC_2 ) ;
if ( frames > last_db_frame ) {
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
Debug ( 1 , " Adding closing frame %d to DB " , frames ) ;
snprintf ( sql , sizeof ( sql ) , " insert into Frames ( EventId, FrameId, TimeStamp, Delta ) values ( %d, %d, from_unixtime( %ld ), %s%ld.%02ld ) " , id , frames , end_time . tv_sec , delta_time . positive ? " " : " - " , delta_time . sec , delta_time . fsec ) ;
2017-05-17 00:04:56 +08:00
if ( mysql_query ( & dbconn , sql ) ) {
2016-04-04 22:11:48 +08:00
Error ( " Can't insert frame: %s " , mysql_error ( & dbconn ) ) ;
exit ( mysql_errno ( & dbconn ) ) ;
2013-03-17 07:45:21 +08:00
}
2016-04-04 22:11:48 +08:00
}
Feature h264 videostorage (#1882)
* Moved writing of configure options from Controller to Model. Fixes #191.
* Initial commit for saving events as videos :)
* Add zm_video.cpp to autotools
* Add zm_video.h to autotools
* Search for MP4V2 header file 3 times: mp4v2/mp4v2.h, mp4v2.h, mp4.h
* Fix serve memory leak
* Few minor code improvements
* Added the ability to override preset, tune, profile and few other improvements
* Correctly write SPS & PPS from x264 encoder headers
* Remove unnessecary SPS & PPS writing code
* Imported missing files from master to feature-h264-videostorage
* Audio support including fixes for dts/pts, split on keyframe and update to mkv extension to prevent ffmpeg problems writing rtsp audio to mp4 containter (header problem)
* Updates to make gcc happy
* Add html5 video control to timeline and event to support mkv playback
* Add zm_videostore.cpp to CMakeLists.txt
* Remove Modern Branch for now
* Fix minor bug
* Option handled added in master, removing duplicate declaration
* Add CaptureandRecord from zm_camera.h
* Putting placeholder in for CaptureAndRecord function
* Removed duplicate code and brackets
* add digest auth file for cmake
Conflicts:
src/CMakeLists.txt
* Add web dir back into Makefile.am
Revert "Removed web from SUBDIRS in Makefile.am"
This reverts commit d9bbcdf3a94cba4d8955fcd03bd965ed2772f34d.
* Add CaptureAndRecord to vlc, still need to make it record
* Resolve SegFault on videostore
* Swap to mp4 container
* mp4 changes
* spaces to tabs, hide video stuff if video writer is turned off
* Make timeline open event.mp4 instead of mkv
* Missed mkv in timeline.js
* Fix some issues from the merge conflict
* Resolve post merge build issues with braces
* Fix whitespace
* Update Jpeg and Video options for passthrough options
* Whitespace fix zm_camera.h
* Fix array mkssing comma
* Add support for Jpeg save options for h264 branch snapshot. Might remove altogether if snapshots not needed
* Update VideoStoreData memory size comment
* Change from config.use_mkv_storage to per monitor option VideoWriter from video branch
* Fix bracket issues post merge
* Clean up comments and add av_free_packet
* Convert from event_directory to event file as per Video branch
* Testing videojs for video playback
* Fixed a missing bracket post merge and also SQL_values now used for EventID and Monitors
* bring recent improvements in ffmpeg capture function into captureandrecord
* Remove pict from writeAudioFramePacket as not used
* Add translate options for h264 Storage options in Monitor and update en_gb file
* Cherry-Pick from iconnor - make it compile on ubuntu 15.04. Which is libav 56.1.0
Conflicts:
src/zm_ffmpeg.cpp
src/zm_remote_camera_rtsp.cpp
Conflicts:
distros/ubuntu1204/changelog
* Clean up videostore code and remove lots of unused code
* proof of concept for dynamic/automatic video rotation using video-js plugin zoomrotate
Conflicts:
web/skins/classic/views/event.php
* removed redundant field in sql query
Conflicts:
web/skins/classic/views/event.php
* local storage of video js plugin
* Beautify!
Make the code somewhat readable.
* added missing videojs.zoomrotate.js file
added missing videojs.zoomrotate.js file
* Typo
added missing "
* Added missing brackets
* fix to display thumbnails when only storing snapshot.jpg
* added control for video playback rate
Conflicts:
web/skins/classic/views/event.php
* dynamically create jpegs from video file for viewing in browser
* fix timeline view for SaveJPEGs monitors (without enabled VideoWriter)
* only expose monitor info which are being used in client
* fix segmentation fault in zma with ubuntu 14.04 and ffmpeg 2.5.8 (gcc 4.8)
when libx264 is not installed
* better way of detecting showing image or video in timeline and event view
instead of Monitor.VideoWriter, Event.DefaultVideo is used, so even if
VideoWriter/SaveJPEG option is changed, a valid image or video will always be
displayed for historical events in both timeline and event view
this also fixes loading videos in timeline view
* Fixes problem of crashing zmc when bad packet arrives causing av_interleaved_write_frame() to return non-zero (-22). Prefilters common packet issues. Add metadata title to generated video file
* Remove syslog.h
* fixed SaveJPEGs are not working
which is caused in errors introduced when merging with master
* Update README.md
* Fix build warnings specific to h264 branch, unused FrameImg, unused ret and int64_t snprintf issues
* Fix PRId64 issue in travis, builds locally fine, but I can see a gcc version issue here
* Fix PRId64 issue in travis, another try
* Try "STDC_FORMAT_MACROS" to see if that helps Travis on gcc 4.6.3
* Revert space removal around PRId64
* video branch ffmpeg 2.9 fixes
ffmpeg 2.9 patched removed SSE2 CPU
* Add FFMPEGInit back
* use webvvt to overlay timestamp (honoring Monitor.LabelFormat) to videos in timeline and event
also fixed bug which prevented seeking in timeline video preview
* ffmpeg 3.0 API build failure fixes
* Update README.md
* merge all the commits from the messed up iconnor_video branch
* fix whitespace
* revert
* whitespace fixes
* spelling fix
* put back some text
* add these back
* fix spelling mistake
* Steal some packet dumping routines from ffmpeg. Convert them to use our logging routines
* add a test and error message if the codec is not h264
* these have been removed in master
* add a view to check auth and just send the video
* add some comments, and dump filename and AVFormatContext on failure to write header
* add the toggle for RecordAudio so that the checkbox works to turn off Audio
* Must init videoStore in constuctor
* more debug and comments, return checking
* Fix dropped part of sql query.
* fix extra else and some whitespace
* Fix missing } from merge that was preventing building.
* fix tabs
* get rid of use of separator, just use \n
* Restore lost fixes for deprecation
* Why are these failing
* Respect record_audio flag when setting up video file so dont try and initiliase mp4 with unsupported audio
* Forgot that I was trying to solve case of stream is true and record_audio
is false.
* Pass swscale_ctx back in to getCachedContext or it will create new
context every frame and leak memory like a mofo.
* Add libx264-dev and libmp4v2-dev to build requires to save hassle of
ensuring they are installed before build.
* Merge my Rotation/Orientation work and fixes for bad h264 streams
* need arpa/inet for reverse lookups
* pull in the new byte range code for viewing videos
* Move our recording flag deeper into closeevent
* add braces and only call closeEvent if there is an event
* deprecate the z_frame_rate stuff which is deprecated in ffmpeg
* remark out some debugging
* fix for video on stream 1
* fix audio_stream to audio_st
* Ignore bad decodes
* fix problems with content-length causing viewing to not work in chrome/android
* change logic of sending file contents to handle an off by one and be more readable
* Some fixes pointed out by Maxim Romanov. Also simply the loading of events to not join the Monitors table
* fix to sql for timeline
* added RecordAudio to sql in README
* Use sub queries instead of joins to fix errors when using new mysql defaults.
* fix sql queries
* Dockerfile to build feature-h264-videostorage
* Must cast codec
* add php-acpu as a dependency
* require php5-acpu
* fix typo
* remove extra /
* Add a line for out-of-tree builds to do api/lib/Cake/bootstrap.php
* delete merge conflict files
* delete merge conflict files
2017-05-16 10:02:48 +08:00
/* Close the video file */
if ( videowriter ! = NULL ) {
2017-05-17 00:04:56 +08:00
int nRet = videowriter - > Close ( ) ;
Feature h264 videostorage (#1882)
* Moved writing of configure options from Controller to Model. Fixes #191.
* Initial commit for saving events as videos :)
* Add zm_video.cpp to autotools
* Add zm_video.h to autotools
* Search for MP4V2 header file 3 times: mp4v2/mp4v2.h, mp4v2.h, mp4.h
* Fix serve memory leak
* Few minor code improvements
* Added the ability to override preset, tune, profile and few other improvements
* Correctly write SPS & PPS from x264 encoder headers
* Remove unnessecary SPS & PPS writing code
* Imported missing files from master to feature-h264-videostorage
* Audio support including fixes for dts/pts, split on keyframe and update to mkv extension to prevent ffmpeg problems writing rtsp audio to mp4 containter (header problem)
* Updates to make gcc happy
* Add html5 video control to timeline and event to support mkv playback
* Add zm_videostore.cpp to CMakeLists.txt
* Remove Modern Branch for now
* Fix minor bug
* Option handled added in master, removing duplicate declaration
* Add CaptureandRecord from zm_camera.h
* Putting placeholder in for CaptureAndRecord function
* Removed duplicate code and brackets
* add digest auth file for cmake
Conflicts:
src/CMakeLists.txt
* Add web dir back into Makefile.am
Revert "Removed web from SUBDIRS in Makefile.am"
This reverts commit d9bbcdf3a94cba4d8955fcd03bd965ed2772f34d.
* Add CaptureAndRecord to vlc, still need to make it record
* Resolve SegFault on videostore
* Swap to mp4 container
* mp4 changes
* spaces to tabs, hide video stuff if video writer is turned off
* Make timeline open event.mp4 instead of mkv
* Missed mkv in timeline.js
* Fix some issues from the merge conflict
* Resolve post merge build issues with braces
* Fix whitespace
* Update Jpeg and Video options for passthrough options
* Whitespace fix zm_camera.h
* Fix array mkssing comma
* Add support for Jpeg save options for h264 branch snapshot. Might remove altogether if snapshots not needed
* Update VideoStoreData memory size comment
* Change from config.use_mkv_storage to per monitor option VideoWriter from video branch
* Fix bracket issues post merge
* Clean up comments and add av_free_packet
* Convert from event_directory to event file as per Video branch
* Testing videojs for video playback
* Fixed a missing bracket post merge and also SQL_values now used for EventID and Monitors
* bring recent improvements in ffmpeg capture function into captureandrecord
* Remove pict from writeAudioFramePacket as not used
* Add translate options for h264 Storage options in Monitor and update en_gb file
* Cherry-Pick from iconnor - make it compile on ubuntu 15.04. Which is libav 56.1.0
Conflicts:
src/zm_ffmpeg.cpp
src/zm_remote_camera_rtsp.cpp
Conflicts:
distros/ubuntu1204/changelog
* Clean up videostore code and remove lots of unused code
* proof of concept for dynamic/automatic video rotation using video-js plugin zoomrotate
Conflicts:
web/skins/classic/views/event.php
* removed redundant field in sql query
Conflicts:
web/skins/classic/views/event.php
* local storage of video js plugin
* Beautify!
Make the code somewhat readable.
* added missing videojs.zoomrotate.js file
added missing videojs.zoomrotate.js file
* Typo
added missing "
* Added missing brackets
* fix to display thumbnails when only storing snapshot.jpg
* added control for video playback rate
Conflicts:
web/skins/classic/views/event.php
* dynamically create jpegs from video file for viewing in browser
* fix timeline view for SaveJPEGs monitors (without enabled VideoWriter)
* only expose monitor info which are being used in client
* fix segmentation fault in zma with ubuntu 14.04 and ffmpeg 2.5.8 (gcc 4.8)
when libx264 is not installed
* better way of detecting showing image or video in timeline and event view
instead of Monitor.VideoWriter, Event.DefaultVideo is used, so even if
VideoWriter/SaveJPEG option is changed, a valid image or video will always be
displayed for historical events in both timeline and event view
this also fixes loading videos in timeline view
* Fixes problem of crashing zmc when bad packet arrives causing av_interleaved_write_frame() to return non-zero (-22). Prefilters common packet issues. Add metadata title to generated video file
* Remove syslog.h
* fixed SaveJPEGs are not working
which is caused in errors introduced when merging with master
* Update README.md
* Fix build warnings specific to h264 branch, unused FrameImg, unused ret and int64_t snprintf issues
* Fix PRId64 issue in travis, builds locally fine, but I can see a gcc version issue here
* Fix PRId64 issue in travis, another try
* Try "STDC_FORMAT_MACROS" to see if that helps Travis on gcc 4.6.3
* Revert space removal around PRId64
* video branch ffmpeg 2.9 fixes
ffmpeg 2.9 patched removed SSE2 CPU
* Add FFMPEGInit back
* use webvvt to overlay timestamp (honoring Monitor.LabelFormat) to videos in timeline and event
also fixed bug which prevented seeking in timeline video preview
* ffmpeg 3.0 API build failure fixes
* Update README.md
* merge all the commits from the messed up iconnor_video branch
* fix whitespace
* revert
* whitespace fixes
* spelling fix
* put back some text
* add these back
* fix spelling mistake
* Steal some packet dumping routines from ffmpeg. Convert them to use our logging routines
* add a test and error message if the codec is not h264
* these have been removed in master
* add a view to check auth and just send the video
* add some comments, and dump filename and AVFormatContext on failure to write header
* add the toggle for RecordAudio so that the checkbox works to turn off Audio
* Must init videoStore in constuctor
* more debug and comments, return checking
* Fix dropped part of sql query.
* fix extra else and some whitespace
* Fix missing } from merge that was preventing building.
* fix tabs
* get rid of use of separator, just use \n
* Restore lost fixes for deprecation
* Why are these failing
* Respect record_audio flag when setting up video file so dont try and initiliase mp4 with unsupported audio
* Forgot that I was trying to solve case of stream is true and record_audio
is false.
* Pass swscale_ctx back in to getCachedContext or it will create new
context every frame and leak memory like a mofo.
* Add libx264-dev and libmp4v2-dev to build requires to save hassle of
ensuring they are installed before build.
* Merge my Rotation/Orientation work and fixes for bad h264 streams
* need arpa/inet for reverse lookups
* pull in the new byte range code for viewing videos
* Move our recording flag deeper into closeevent
* add braces and only call closeEvent if there is an event
* deprecate the z_frame_rate stuff which is deprecated in ffmpeg
* remark out some debugging
* fix for video on stream 1
* fix audio_stream to audio_st
* Ignore bad decodes
* fix problems with content-length causing viewing to not work in chrome/android
* change logic of sending file contents to handle an off by one and be more readable
* Some fixes pointed out by Maxim Romanov. Also simply the loading of events to not join the Monitors table
* fix to sql for timeline
* added RecordAudio to sql in README
* Use sub queries instead of joins to fix errors when using new mysql defaults.
* fix sql queries
* Dockerfile to build feature-h264-videostorage
* Must cast codec
* add php-acpu as a dependency
* require php5-acpu
* fix typo
* remove extra /
* Add a line for out-of-tree builds to do api/lib/Cake/bootstrap.php
* delete merge conflict files
* delete merge conflict files
2017-05-16 10:02:48 +08:00
if ( nRet ! = 0 ) {
Error ( " Failed closing video stream " ) ;
}
delete videowriter ;
videowriter = NULL ;
/* Close the timecodes file */
fclose ( timecodes_fd ) ;
timecodes_fd = NULL ;
}
snprintf ( sql , sizeof ( sql ) , " update Events set Name='%s%d', EndTime = from_unixtime( %ld ), Length = %s%ld.%02ld, Frames = %d, AlarmFrames = %d, TotScore = %d, AvgScore = %d, MaxScore = %d, DefaultVideo = '%s' where Id = %d " , monitor - > EventPrefix ( ) , id , end_time . tv_sec , delta_time . positive ? " " : " - " , delta_time . sec , delta_time . fsec , frames , alarm_frames , tot_score , ( int ) ( alarm_frames ? ( tot_score / alarm_frames ) : 0 ) , max_score , video_name , id ) ;
2017-05-17 00:04:56 +08:00
if ( mysql_query ( & dbconn , sql ) ) {
2016-04-04 22:11:48 +08:00
Error ( " Can't update event: %s " , mysql_error ( & dbconn ) ) ;
exit ( mysql_errno ( & dbconn ) ) ;
}
2013-03-17 07:45:21 +08:00
}
2017-05-17 00:04:56 +08:00
void Event : : createNotes ( std : : string & notes ) {
2016-04-04 22:11:48 +08:00
notes . clear ( ) ;
2017-05-17 00:04:56 +08:00
for ( StringSetMap : : const_iterator mapIter = noteSetMap . begin ( ) ; mapIter ! = noteSetMap . end ( ) ; mapIter + + ) {
2016-04-04 22:11:48 +08:00
notes + = mapIter - > first ;
notes + = " : " ;
const StringSet & stringSet = mapIter - > second ;
2017-05-17 00:04:56 +08:00
for ( StringSet : : const_iterator setIter = stringSet . begin ( ) ; setIter ! = stringSet . end ( ) ; setIter + + ) {
2016-04-04 22:11:48 +08:00
if ( setIter ! = stringSet . begin ( ) )
notes + = " , " ;
notes + = * setIter ;
2013-03-17 07:45:21 +08:00
}
2016-04-04 22:11:48 +08:00
}
2013-03-17 07:45:21 +08:00
}
int Event : : sd = - 1 ;
2017-05-17 00:04:56 +08:00
bool Event : : WriteFrameImage ( Image * image , struct timeval timestamp , const char * event_file , bool alarm_frame ) {
2016-04-04 22:11:48 +08:00
Image * ImgToWrite ;
Image * ts_image = NULL ;
2017-04-14 04:51:50 +08:00
if ( ! config . timestamp_on_capture ) // stash the image we plan to use in another pointer regardless if timestamped.
2016-04-04 22:11:48 +08:00
{
ts_image = new Image ( * image ) ;
monitor - > TimestampImage ( ts_image , & timestamp ) ;
ImgToWrite = ts_image ;
2017-05-17 00:04:56 +08:00
} else
2016-04-04 22:11:48 +08:00
ImgToWrite = image ;
2017-01-17 01:56:09 +08:00
int thisquality = ( alarm_frame & & ( config . jpeg_alarm_file_quality > config . jpeg_file_quality ) ) ? config . jpeg_alarm_file_quality : 0 ; // quality to use, zero is default
ImgToWrite - > WriteJpeg ( event_file , thisquality , ( monitor - > Exif ( ) ? timestamp : ( timeval ) { 0 , 0 } ) ) ; // exif is only timestamp at present this switches on or off for write
2016-04-04 22:11:48 +08:00
if ( ts_image ) delete ( ts_image ) ; // clean up if used.
return ( true ) ;
2013-03-17 07:45:21 +08:00
}
2017-05-17 00:04:56 +08:00
bool Event : : WriteFrameVideo ( const Image * image , const struct timeval timestamp , VideoWriter * videow ) {
Feature h264 videostorage (#1882)
* Moved writing of configure options from Controller to Model. Fixes #191.
* Initial commit for saving events as videos :)
* Add zm_video.cpp to autotools
* Add zm_video.h to autotools
* Search for MP4V2 header file 3 times: mp4v2/mp4v2.h, mp4v2.h, mp4.h
* Fix serve memory leak
* Few minor code improvements
* Added the ability to override preset, tune, profile and few other improvements
* Correctly write SPS & PPS from x264 encoder headers
* Remove unnessecary SPS & PPS writing code
* Imported missing files from master to feature-h264-videostorage
* Audio support including fixes for dts/pts, split on keyframe and update to mkv extension to prevent ffmpeg problems writing rtsp audio to mp4 containter (header problem)
* Updates to make gcc happy
* Add html5 video control to timeline and event to support mkv playback
* Add zm_videostore.cpp to CMakeLists.txt
* Remove Modern Branch for now
* Fix minor bug
* Option handled added in master, removing duplicate declaration
* Add CaptureandRecord from zm_camera.h
* Putting placeholder in for CaptureAndRecord function
* Removed duplicate code and brackets
* add digest auth file for cmake
Conflicts:
src/CMakeLists.txt
* Add web dir back into Makefile.am
Revert "Removed web from SUBDIRS in Makefile.am"
This reverts commit d9bbcdf3a94cba4d8955fcd03bd965ed2772f34d.
* Add CaptureAndRecord to vlc, still need to make it record
* Resolve SegFault on videostore
* Swap to mp4 container
* mp4 changes
* spaces to tabs, hide video stuff if video writer is turned off
* Make timeline open event.mp4 instead of mkv
* Missed mkv in timeline.js
* Fix some issues from the merge conflict
* Resolve post merge build issues with braces
* Fix whitespace
* Update Jpeg and Video options for passthrough options
* Whitespace fix zm_camera.h
* Fix array mkssing comma
* Add support for Jpeg save options for h264 branch snapshot. Might remove altogether if snapshots not needed
* Update VideoStoreData memory size comment
* Change from config.use_mkv_storage to per monitor option VideoWriter from video branch
* Fix bracket issues post merge
* Clean up comments and add av_free_packet
* Convert from event_directory to event file as per Video branch
* Testing videojs for video playback
* Fixed a missing bracket post merge and also SQL_values now used for EventID and Monitors
* bring recent improvements in ffmpeg capture function into captureandrecord
* Remove pict from writeAudioFramePacket as not used
* Add translate options for h264 Storage options in Monitor and update en_gb file
* Cherry-Pick from iconnor - make it compile on ubuntu 15.04. Which is libav 56.1.0
Conflicts:
src/zm_ffmpeg.cpp
src/zm_remote_camera_rtsp.cpp
Conflicts:
distros/ubuntu1204/changelog
* Clean up videostore code and remove lots of unused code
* proof of concept for dynamic/automatic video rotation using video-js plugin zoomrotate
Conflicts:
web/skins/classic/views/event.php
* removed redundant field in sql query
Conflicts:
web/skins/classic/views/event.php
* local storage of video js plugin
* Beautify!
Make the code somewhat readable.
* added missing videojs.zoomrotate.js file
added missing videojs.zoomrotate.js file
* Typo
added missing "
* Added missing brackets
* fix to display thumbnails when only storing snapshot.jpg
* added control for video playback rate
Conflicts:
web/skins/classic/views/event.php
* dynamically create jpegs from video file for viewing in browser
* fix timeline view for SaveJPEGs monitors (without enabled VideoWriter)
* only expose monitor info which are being used in client
* fix segmentation fault in zma with ubuntu 14.04 and ffmpeg 2.5.8 (gcc 4.8)
when libx264 is not installed
* better way of detecting showing image or video in timeline and event view
instead of Monitor.VideoWriter, Event.DefaultVideo is used, so even if
VideoWriter/SaveJPEG option is changed, a valid image or video will always be
displayed for historical events in both timeline and event view
this also fixes loading videos in timeline view
* Fixes problem of crashing zmc when bad packet arrives causing av_interleaved_write_frame() to return non-zero (-22). Prefilters common packet issues. Add metadata title to generated video file
* Remove syslog.h
* fixed SaveJPEGs are not working
which is caused in errors introduced when merging with master
* Update README.md
* Fix build warnings specific to h264 branch, unused FrameImg, unused ret and int64_t snprintf issues
* Fix PRId64 issue in travis, builds locally fine, but I can see a gcc version issue here
* Fix PRId64 issue in travis, another try
* Try "STDC_FORMAT_MACROS" to see if that helps Travis on gcc 4.6.3
* Revert space removal around PRId64
* video branch ffmpeg 2.9 fixes
ffmpeg 2.9 patched removed SSE2 CPU
* Add FFMPEGInit back
* use webvvt to overlay timestamp (honoring Monitor.LabelFormat) to videos in timeline and event
also fixed bug which prevented seeking in timeline video preview
* ffmpeg 3.0 API build failure fixes
* Update README.md
* merge all the commits from the messed up iconnor_video branch
* fix whitespace
* revert
* whitespace fixes
* spelling fix
* put back some text
* add these back
* fix spelling mistake
* Steal some packet dumping routines from ffmpeg. Convert them to use our logging routines
* add a test and error message if the codec is not h264
* these have been removed in master
* add a view to check auth and just send the video
* add some comments, and dump filename and AVFormatContext on failure to write header
* add the toggle for RecordAudio so that the checkbox works to turn off Audio
* Must init videoStore in constuctor
* more debug and comments, return checking
* Fix dropped part of sql query.
* fix extra else and some whitespace
* Fix missing } from merge that was preventing building.
* fix tabs
* get rid of use of separator, just use \n
* Restore lost fixes for deprecation
* Why are these failing
* Respect record_audio flag when setting up video file so dont try and initiliase mp4 with unsupported audio
* Forgot that I was trying to solve case of stream is true and record_audio
is false.
* Pass swscale_ctx back in to getCachedContext or it will create new
context every frame and leak memory like a mofo.
* Add libx264-dev and libmp4v2-dev to build requires to save hassle of
ensuring they are installed before build.
* Merge my Rotation/Orientation work and fixes for bad h264 streams
* need arpa/inet for reverse lookups
* pull in the new byte range code for viewing videos
* Move our recording flag deeper into closeevent
* add braces and only call closeEvent if there is an event
* deprecate the z_frame_rate stuff which is deprecated in ffmpeg
* remark out some debugging
* fix for video on stream 1
* fix audio_stream to audio_st
* Ignore bad decodes
* fix problems with content-length causing viewing to not work in chrome/android
* change logic of sending file contents to handle an off by one and be more readable
* Some fixes pointed out by Maxim Romanov. Also simply the loading of events to not join the Monitors table
* fix to sql for timeline
* added RecordAudio to sql in README
* Use sub queries instead of joins to fix errors when using new mysql defaults.
* fix sql queries
* Dockerfile to build feature-h264-videostorage
* Must cast codec
* add php-acpu as a dependency
* require php5-acpu
* fix typo
* remove extra /
* Add a line for out-of-tree builds to do api/lib/Cake/bootstrap.php
* delete merge conflict files
* delete merge conflict files
2017-05-16 10:02:48 +08:00
const Image * frameimg = image ;
Image ts_image ;
/* Checking for invalid parameters */
2017-05-17 00:04:56 +08:00
if ( videow = = NULL ) {
Feature h264 videostorage (#1882)
* Moved writing of configure options from Controller to Model. Fixes #191.
* Initial commit for saving events as videos :)
* Add zm_video.cpp to autotools
* Add zm_video.h to autotools
* Search for MP4V2 header file 3 times: mp4v2/mp4v2.h, mp4v2.h, mp4.h
* Fix serve memory leak
* Few minor code improvements
* Added the ability to override preset, tune, profile and few other improvements
* Correctly write SPS & PPS from x264 encoder headers
* Remove unnessecary SPS & PPS writing code
* Imported missing files from master to feature-h264-videostorage
* Audio support including fixes for dts/pts, split on keyframe and update to mkv extension to prevent ffmpeg problems writing rtsp audio to mp4 containter (header problem)
* Updates to make gcc happy
* Add html5 video control to timeline and event to support mkv playback
* Add zm_videostore.cpp to CMakeLists.txt
* Remove Modern Branch for now
* Fix minor bug
* Option handled added in master, removing duplicate declaration
* Add CaptureandRecord from zm_camera.h
* Putting placeholder in for CaptureAndRecord function
* Removed duplicate code and brackets
* add digest auth file for cmake
Conflicts:
src/CMakeLists.txt
* Add web dir back into Makefile.am
Revert "Removed web from SUBDIRS in Makefile.am"
This reverts commit d9bbcdf3a94cba4d8955fcd03bd965ed2772f34d.
* Add CaptureAndRecord to vlc, still need to make it record
* Resolve SegFault on videostore
* Swap to mp4 container
* mp4 changes
* spaces to tabs, hide video stuff if video writer is turned off
* Make timeline open event.mp4 instead of mkv
* Missed mkv in timeline.js
* Fix some issues from the merge conflict
* Resolve post merge build issues with braces
* Fix whitespace
* Update Jpeg and Video options for passthrough options
* Whitespace fix zm_camera.h
* Fix array mkssing comma
* Add support for Jpeg save options for h264 branch snapshot. Might remove altogether if snapshots not needed
* Update VideoStoreData memory size comment
* Change from config.use_mkv_storage to per monitor option VideoWriter from video branch
* Fix bracket issues post merge
* Clean up comments and add av_free_packet
* Convert from event_directory to event file as per Video branch
* Testing videojs for video playback
* Fixed a missing bracket post merge and also SQL_values now used for EventID and Monitors
* bring recent improvements in ffmpeg capture function into captureandrecord
* Remove pict from writeAudioFramePacket as not used
* Add translate options for h264 Storage options in Monitor and update en_gb file
* Cherry-Pick from iconnor - make it compile on ubuntu 15.04. Which is libav 56.1.0
Conflicts:
src/zm_ffmpeg.cpp
src/zm_remote_camera_rtsp.cpp
Conflicts:
distros/ubuntu1204/changelog
* Clean up videostore code and remove lots of unused code
* proof of concept for dynamic/automatic video rotation using video-js plugin zoomrotate
Conflicts:
web/skins/classic/views/event.php
* removed redundant field in sql query
Conflicts:
web/skins/classic/views/event.php
* local storage of video js plugin
* Beautify!
Make the code somewhat readable.
* added missing videojs.zoomrotate.js file
added missing videojs.zoomrotate.js file
* Typo
added missing "
* Added missing brackets
* fix to display thumbnails when only storing snapshot.jpg
* added control for video playback rate
Conflicts:
web/skins/classic/views/event.php
* dynamically create jpegs from video file for viewing in browser
* fix timeline view for SaveJPEGs monitors (without enabled VideoWriter)
* only expose monitor info which are being used in client
* fix segmentation fault in zma with ubuntu 14.04 and ffmpeg 2.5.8 (gcc 4.8)
when libx264 is not installed
* better way of detecting showing image or video in timeline and event view
instead of Monitor.VideoWriter, Event.DefaultVideo is used, so even if
VideoWriter/SaveJPEG option is changed, a valid image or video will always be
displayed for historical events in both timeline and event view
this also fixes loading videos in timeline view
* Fixes problem of crashing zmc when bad packet arrives causing av_interleaved_write_frame() to return non-zero (-22). Prefilters common packet issues. Add metadata title to generated video file
* Remove syslog.h
* fixed SaveJPEGs are not working
which is caused in errors introduced when merging with master
* Update README.md
* Fix build warnings specific to h264 branch, unused FrameImg, unused ret and int64_t snprintf issues
* Fix PRId64 issue in travis, builds locally fine, but I can see a gcc version issue here
* Fix PRId64 issue in travis, another try
* Try "STDC_FORMAT_MACROS" to see if that helps Travis on gcc 4.6.3
* Revert space removal around PRId64
* video branch ffmpeg 2.9 fixes
ffmpeg 2.9 patched removed SSE2 CPU
* Add FFMPEGInit back
* use webvvt to overlay timestamp (honoring Monitor.LabelFormat) to videos in timeline and event
also fixed bug which prevented seeking in timeline video preview
* ffmpeg 3.0 API build failure fixes
* Update README.md
* merge all the commits from the messed up iconnor_video branch
* fix whitespace
* revert
* whitespace fixes
* spelling fix
* put back some text
* add these back
* fix spelling mistake
* Steal some packet dumping routines from ffmpeg. Convert them to use our logging routines
* add a test and error message if the codec is not h264
* these have been removed in master
* add a view to check auth and just send the video
* add some comments, and dump filename and AVFormatContext on failure to write header
* add the toggle for RecordAudio so that the checkbox works to turn off Audio
* Must init videoStore in constuctor
* more debug and comments, return checking
* Fix dropped part of sql query.
* fix extra else and some whitespace
* Fix missing } from merge that was preventing building.
* fix tabs
* get rid of use of separator, just use \n
* Restore lost fixes for deprecation
* Why are these failing
* Respect record_audio flag when setting up video file so dont try and initiliase mp4 with unsupported audio
* Forgot that I was trying to solve case of stream is true and record_audio
is false.
* Pass swscale_ctx back in to getCachedContext or it will create new
context every frame and leak memory like a mofo.
* Add libx264-dev and libmp4v2-dev to build requires to save hassle of
ensuring they are installed before build.
* Merge my Rotation/Orientation work and fixes for bad h264 streams
* need arpa/inet for reverse lookups
* pull in the new byte range code for viewing videos
* Move our recording flag deeper into closeevent
* add braces and only call closeEvent if there is an event
* deprecate the z_frame_rate stuff which is deprecated in ffmpeg
* remark out some debugging
* fix for video on stream 1
* fix audio_stream to audio_st
* Ignore bad decodes
* fix problems with content-length causing viewing to not work in chrome/android
* change logic of sending file contents to handle an off by one and be more readable
* Some fixes pointed out by Maxim Romanov. Also simply the loading of events to not join the Monitors table
* fix to sql for timeline
* added RecordAudio to sql in README
* Use sub queries instead of joins to fix errors when using new mysql defaults.
* fix sql queries
* Dockerfile to build feature-h264-videostorage
* Must cast codec
* add php-acpu as a dependency
* require php5-acpu
* fix typo
* remove extra /
* Add a line for out-of-tree builds to do api/lib/Cake/bootstrap.php
* delete merge conflict files
* delete merge conflict files
2017-05-16 10:02:48 +08:00
Error ( " NULL Video object " ) ;
return false ;
}
/* If the image does not contain a timestamp, add the timestamp */
if ( ! config . timestamp_on_capture ) {
ts_image = * image ;
monitor - > TimestampImage ( & ts_image , & timestamp ) ;
frameimg = & ts_image ;
}
/* Calculate delta time */
struct DeltaTimeval delta_time3 ;
DELTA_TIMEVAL ( delta_time3 , timestamp , start_time , DT_PREC_3 ) ;
unsigned int timeMS = ( delta_time3 . sec * delta_time3 . prec ) + delta_time3 . fsec ;
/* Encode and write the frame */
if ( videowriter - > Encode ( frameimg , timeMS ) ! = 0 ) {
Error ( " Failed encoding video frame " ) ;
}
/* Add the frame to the timecodes file */
2017-05-20 01:30:08 +08:00
fprintf ( timecodes_fd , " %u \n " , timeMS ) ;
Feature h264 videostorage (#1882)
* Moved writing of configure options from Controller to Model. Fixes #191.
* Initial commit for saving events as videos :)
* Add zm_video.cpp to autotools
* Add zm_video.h to autotools
* Search for MP4V2 header file 3 times: mp4v2/mp4v2.h, mp4v2.h, mp4.h
* Fix serve memory leak
* Few minor code improvements
* Added the ability to override preset, tune, profile and few other improvements
* Correctly write SPS & PPS from x264 encoder headers
* Remove unnessecary SPS & PPS writing code
* Imported missing files from master to feature-h264-videostorage
* Audio support including fixes for dts/pts, split on keyframe and update to mkv extension to prevent ffmpeg problems writing rtsp audio to mp4 containter (header problem)
* Updates to make gcc happy
* Add html5 video control to timeline and event to support mkv playback
* Add zm_videostore.cpp to CMakeLists.txt
* Remove Modern Branch for now
* Fix minor bug
* Option handled added in master, removing duplicate declaration
* Add CaptureandRecord from zm_camera.h
* Putting placeholder in for CaptureAndRecord function
* Removed duplicate code and brackets
* add digest auth file for cmake
Conflicts:
src/CMakeLists.txt
* Add web dir back into Makefile.am
Revert "Removed web from SUBDIRS in Makefile.am"
This reverts commit d9bbcdf3a94cba4d8955fcd03bd965ed2772f34d.
* Add CaptureAndRecord to vlc, still need to make it record
* Resolve SegFault on videostore
* Swap to mp4 container
* mp4 changes
* spaces to tabs, hide video stuff if video writer is turned off
* Make timeline open event.mp4 instead of mkv
* Missed mkv in timeline.js
* Fix some issues from the merge conflict
* Resolve post merge build issues with braces
* Fix whitespace
* Update Jpeg and Video options for passthrough options
* Whitespace fix zm_camera.h
* Fix array mkssing comma
* Add support for Jpeg save options for h264 branch snapshot. Might remove altogether if snapshots not needed
* Update VideoStoreData memory size comment
* Change from config.use_mkv_storage to per monitor option VideoWriter from video branch
* Fix bracket issues post merge
* Clean up comments and add av_free_packet
* Convert from event_directory to event file as per Video branch
* Testing videojs for video playback
* Fixed a missing bracket post merge and also SQL_values now used for EventID and Monitors
* bring recent improvements in ffmpeg capture function into captureandrecord
* Remove pict from writeAudioFramePacket as not used
* Add translate options for h264 Storage options in Monitor and update en_gb file
* Cherry-Pick from iconnor - make it compile on ubuntu 15.04. Which is libav 56.1.0
Conflicts:
src/zm_ffmpeg.cpp
src/zm_remote_camera_rtsp.cpp
Conflicts:
distros/ubuntu1204/changelog
* Clean up videostore code and remove lots of unused code
* proof of concept for dynamic/automatic video rotation using video-js plugin zoomrotate
Conflicts:
web/skins/classic/views/event.php
* removed redundant field in sql query
Conflicts:
web/skins/classic/views/event.php
* local storage of video js plugin
* Beautify!
Make the code somewhat readable.
* added missing videojs.zoomrotate.js file
added missing videojs.zoomrotate.js file
* Typo
added missing "
* Added missing brackets
* fix to display thumbnails when only storing snapshot.jpg
* added control for video playback rate
Conflicts:
web/skins/classic/views/event.php
* dynamically create jpegs from video file for viewing in browser
* fix timeline view for SaveJPEGs monitors (without enabled VideoWriter)
* only expose monitor info which are being used in client
* fix segmentation fault in zma with ubuntu 14.04 and ffmpeg 2.5.8 (gcc 4.8)
when libx264 is not installed
* better way of detecting showing image or video in timeline and event view
instead of Monitor.VideoWriter, Event.DefaultVideo is used, so even if
VideoWriter/SaveJPEG option is changed, a valid image or video will always be
displayed for historical events in both timeline and event view
this also fixes loading videos in timeline view
* Fixes problem of crashing zmc when bad packet arrives causing av_interleaved_write_frame() to return non-zero (-22). Prefilters common packet issues. Add metadata title to generated video file
* Remove syslog.h
* fixed SaveJPEGs are not working
which is caused in errors introduced when merging with master
* Update README.md
* Fix build warnings specific to h264 branch, unused FrameImg, unused ret and int64_t snprintf issues
* Fix PRId64 issue in travis, builds locally fine, but I can see a gcc version issue here
* Fix PRId64 issue in travis, another try
* Try "STDC_FORMAT_MACROS" to see if that helps Travis on gcc 4.6.3
* Revert space removal around PRId64
* video branch ffmpeg 2.9 fixes
ffmpeg 2.9 patched removed SSE2 CPU
* Add FFMPEGInit back
* use webvvt to overlay timestamp (honoring Monitor.LabelFormat) to videos in timeline and event
also fixed bug which prevented seeking in timeline video preview
* ffmpeg 3.0 API build failure fixes
* Update README.md
* merge all the commits from the messed up iconnor_video branch
* fix whitespace
* revert
* whitespace fixes
* spelling fix
* put back some text
* add these back
* fix spelling mistake
* Steal some packet dumping routines from ffmpeg. Convert them to use our logging routines
* add a test and error message if the codec is not h264
* these have been removed in master
* add a view to check auth and just send the video
* add some comments, and dump filename and AVFormatContext on failure to write header
* add the toggle for RecordAudio so that the checkbox works to turn off Audio
* Must init videoStore in constuctor
* more debug and comments, return checking
* Fix dropped part of sql query.
* fix extra else and some whitespace
* Fix missing } from merge that was preventing building.
* fix tabs
* get rid of use of separator, just use \n
* Restore lost fixes for deprecation
* Why are these failing
* Respect record_audio flag when setting up video file so dont try and initiliase mp4 with unsupported audio
* Forgot that I was trying to solve case of stream is true and record_audio
is false.
* Pass swscale_ctx back in to getCachedContext or it will create new
context every frame and leak memory like a mofo.
* Add libx264-dev and libmp4v2-dev to build requires to save hassle of
ensuring they are installed before build.
* Merge my Rotation/Orientation work and fixes for bad h264 streams
* need arpa/inet for reverse lookups
* pull in the new byte range code for viewing videos
* Move our recording flag deeper into closeevent
* add braces and only call closeEvent if there is an event
* deprecate the z_frame_rate stuff which is deprecated in ffmpeg
* remark out some debugging
* fix for video on stream 1
* fix audio_stream to audio_st
* Ignore bad decodes
* fix problems with content-length causing viewing to not work in chrome/android
* change logic of sending file contents to handle an off by one and be more readable
* Some fixes pointed out by Maxim Romanov. Also simply the loading of events to not join the Monitors table
* fix to sql for timeline
* added RecordAudio to sql in README
* Use sub queries instead of joins to fix errors when using new mysql defaults.
* fix sql queries
* Dockerfile to build feature-h264-videostorage
* Must cast codec
* add php-acpu as a dependency
* require php5-acpu
* fix typo
* remove extra /
* Add a line for out-of-tree builds to do api/lib/Cake/bootstrap.php
* delete merge conflict files
* delete merge conflict files
2017-05-16 10:02:48 +08:00
return ( true ) ;
}
2017-05-17 00:04:56 +08:00
void Event : : updateNotes ( const StringSetMap & newNoteSetMap ) {
2016-04-04 22:11:48 +08:00
bool update = false ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
//Info( "Checking notes, %d <> %d", noteSetMap.size(), newNoteSetMap.size() );
2017-05-17 00:04:56 +08:00
if ( newNoteSetMap . size ( ) > 0 ) {
if ( noteSetMap . size ( ) = = 0 ) {
2016-04-04 22:11:48 +08:00
noteSetMap = newNoteSetMap ;
update = true ;
2017-05-17 00:04:56 +08:00
} else {
for ( StringSetMap : : const_iterator newNoteSetMapIter = newNoteSetMap . begin ( ) ; newNoteSetMapIter ! = newNoteSetMap . end ( ) ; newNoteSetMapIter + + ) {
2016-04-04 22:11:48 +08:00
const std : : string & newNoteGroup = newNoteSetMapIter - > first ;
const StringSet & newNoteSet = newNoteSetMapIter - > second ;
//Info( "Got %d new strings", newNoteSet.size() );
2017-05-17 00:04:56 +08:00
if ( newNoteSet . size ( ) > 0 ) {
2016-04-04 22:11:48 +08:00
StringSetMap : : iterator noteSetMapIter = noteSetMap . find ( newNoteGroup ) ;
2017-05-17 00:04:56 +08:00
if ( noteSetMapIter = = noteSetMap . end ( ) ) {
2016-04-04 22:11:48 +08:00
//Info( "Can't find note group %s, copying %d strings", newNoteGroup.c_str(), newNoteSet.size() );
noteSetMap . insert ( StringSetMap : : value_type ( newNoteGroup , newNoteSet ) ) ;
2013-03-17 07:45:21 +08:00
update = true ;
2017-05-17 00:04:56 +08:00
} else {
2016-04-04 22:11:48 +08:00
StringSet & noteSet = noteSetMapIter - > second ;
//Info( "Found note group %s, got %d strings", newNoteGroup.c_str(), newNoteSet.size() );
2017-05-17 00:04:56 +08:00
for ( StringSet : : const_iterator newNoteSetIter = newNoteSet . begin ( ) ; newNoteSetIter ! = newNoteSet . end ( ) ; newNoteSetIter + + ) {
2016-04-04 22:11:48 +08:00
const std : : string & newNote = * newNoteSetIter ;
StringSet : : iterator noteSetIter = noteSet . find ( newNote ) ;
2017-05-17 00:04:56 +08:00
if ( noteSetIter = = noteSet . end ( ) ) {
2016-04-04 22:11:48 +08:00
noteSet . insert ( newNote ) ;
update = true ;
}
2013-03-17 07:45:21 +08:00
}
2016-04-04 22:11:48 +08:00
}
2013-03-17 07:45:21 +08:00
}
2016-04-04 22:11:48 +08:00
}
2013-03-17 07:45:21 +08:00
}
2016-04-04 22:11:48 +08:00
}
2013-03-17 07:45:21 +08:00
2017-05-17 00:04:56 +08:00
if ( update ) {
2016-04-04 22:11:48 +08:00
std : : string notes ;
createNotes ( notes ) ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
Debug ( 2 , " Updating notes for event %d, '%s' " , id , notes . c_str ( ) ) ;
static char sql [ ZM_SQL_MED_BUFSIZ ] ;
2013-03-17 07:45:21 +08:00
# if USE_PREPARED_SQL
2016-04-04 22:11:48 +08:00
static MYSQL_STMT * stmt = 0 ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
char notesStr [ ZM_SQL_MED_BUFSIZ ] = " " ;
unsigned long notesLen = 0 ;
2013-03-17 07:45:21 +08:00
2017-05-17 00:04:56 +08:00
if ( ! stmt ) {
2016-04-04 22:11:48 +08:00
const char * sql = " update Events set Notes = ? where Id = ? " ;
stmt = mysql_stmt_init ( & dbconn ) ;
2017-05-17 00:04:56 +08:00
if ( mysql_stmt_prepare ( stmt , sql , strlen ( sql ) ) ) {
2016-04-04 22:11:48 +08:00
Fatal ( " Unable to prepare sql '%s': %s " , sql , mysql_stmt_error ( stmt ) ) ;
}
/* Get the parameter count from the statement */
2017-05-17 00:04:56 +08:00
if ( mysql_stmt_param_count ( stmt ) ! = 2 ) {
2016-04-04 22:11:48 +08:00
Fatal ( " Unexpected parameter count %ld in sql '%s' " , mysql_stmt_param_count ( stmt ) , sql ) ;
}
MYSQL_BIND bind [ 2 ] ;
memset ( bind , 0 , sizeof ( bind ) ) ;
/* STRING PARAM */
bind [ 0 ] . buffer_type = MYSQL_TYPE_STRING ;
bind [ 0 ] . buffer = ( char * ) notesStr ;
bind [ 0 ] . buffer_length = sizeof ( notesStr ) ;
bind [ 0 ] . is_null = 0 ;
bind [ 0 ] . length = & notesLen ;
bind [ 1 ] . buffer_type = MYSQL_TYPE_LONG ;
bind [ 1 ] . buffer = ( char * ) & id ;
bind [ 1 ] . is_null = 0 ;
bind [ 1 ] . length = 0 ;
/* Bind the buffers */
2017-05-17 00:04:56 +08:00
if ( mysql_stmt_bind_param ( stmt , bind ) ) {
2016-04-04 22:11:48 +08:00
Fatal ( " Unable to bind sql '%s': %s " , sql , mysql_stmt_error ( stmt ) ) ;
}
}
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
strncpy ( notesStr , notes . c_str ( ) , sizeof ( notesStr ) ) ;
notesLen = notes . length ( ) ;
2013-03-17 07:45:21 +08:00
2017-05-17 00:04:56 +08:00
if ( mysql_stmt_execute ( stmt ) ) {
2016-04-04 22:11:48 +08:00
Fatal ( " Unable to execute sql '%s': %s " , sql , mysql_stmt_error ( stmt ) ) ;
}
2013-03-17 07:45:21 +08:00
# else
2016-04-04 22:11:48 +08:00
static char escapedNotes [ ZM_SQL_MED_BUFSIZ ] ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
mysql_real_escape_string ( & dbconn , escapedNotes , notes . c_str ( ) , notes . length ( ) ) ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
snprintf ( sql , sizeof ( sql ) , " update Events set Notes = '%s' where Id = %d " , escapedNotes , id ) ;
2017-05-17 00:04:56 +08:00
if ( mysql_query ( & dbconn , sql ) ) {
2016-04-04 22:11:48 +08:00
Error ( " Can't insert event: %s " , mysql_error ( & dbconn ) ) ;
2013-03-17 07:45:21 +08:00
}
2016-04-04 22:11:48 +08:00
# endif
}
2013-03-17 07:45:21 +08:00
}
2017-05-17 00:04:56 +08:00
void Event : : AddFrames ( int n_frames , Image * * images , struct timeval * * timestamps ) {
2016-04-04 22:11:48 +08:00
for ( int i = 0 ; i < n_frames ; i + = ZM_SQL_BATCH_SIZE ) {
AddFramesInternal ( n_frames , i , images , timestamps ) ;
}
2013-10-27 09:41:12 +08:00
}
2017-05-17 00:04:56 +08:00
void Event : : AddFramesInternal ( int n_frames , int start_frame , Image * * images , struct timeval * * timestamps ) {
2016-04-04 22:11:48 +08:00
static char sql [ ZM_SQL_LGE_BUFSIZ ] ;
strncpy ( sql , " insert into Frames ( EventId, FrameId, TimeStamp, Delta ) values " , sizeof ( sql ) ) ;
int frameCount = 0 ;
2017-05-17 00:04:56 +08:00
for ( int i = start_frame ; i < n_frames & & i - start_frame < ZM_SQL_BATCH_SIZE ; i + + ) {
if ( ! timestamps [ i ] - > tv_sec ) {
2016-04-04 22:11:48 +08:00
Debug ( 1 , " Not adding pre-capture frame %d, zero timestamp " , i ) ;
continue ;
}
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
frames + + ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
static char event_file [ PATH_MAX ] ;
snprintf ( event_file , sizeof ( event_file ) , capture_file_format , path , frames ) ;
Feature h264 videostorage (#1882)
* Moved writing of configure options from Controller to Model. Fixes #191.
* Initial commit for saving events as videos :)
* Add zm_video.cpp to autotools
* Add zm_video.h to autotools
* Search for MP4V2 header file 3 times: mp4v2/mp4v2.h, mp4v2.h, mp4.h
* Fix serve memory leak
* Few minor code improvements
* Added the ability to override preset, tune, profile and few other improvements
* Correctly write SPS & PPS from x264 encoder headers
* Remove unnessecary SPS & PPS writing code
* Imported missing files from master to feature-h264-videostorage
* Audio support including fixes for dts/pts, split on keyframe and update to mkv extension to prevent ffmpeg problems writing rtsp audio to mp4 containter (header problem)
* Updates to make gcc happy
* Add html5 video control to timeline and event to support mkv playback
* Add zm_videostore.cpp to CMakeLists.txt
* Remove Modern Branch for now
* Fix minor bug
* Option handled added in master, removing duplicate declaration
* Add CaptureandRecord from zm_camera.h
* Putting placeholder in for CaptureAndRecord function
* Removed duplicate code and brackets
* add digest auth file for cmake
Conflicts:
src/CMakeLists.txt
* Add web dir back into Makefile.am
Revert "Removed web from SUBDIRS in Makefile.am"
This reverts commit d9bbcdf3a94cba4d8955fcd03bd965ed2772f34d.
* Add CaptureAndRecord to vlc, still need to make it record
* Resolve SegFault on videostore
* Swap to mp4 container
* mp4 changes
* spaces to tabs, hide video stuff if video writer is turned off
* Make timeline open event.mp4 instead of mkv
* Missed mkv in timeline.js
* Fix some issues from the merge conflict
* Resolve post merge build issues with braces
* Fix whitespace
* Update Jpeg and Video options for passthrough options
* Whitespace fix zm_camera.h
* Fix array mkssing comma
* Add support for Jpeg save options for h264 branch snapshot. Might remove altogether if snapshots not needed
* Update VideoStoreData memory size comment
* Change from config.use_mkv_storage to per monitor option VideoWriter from video branch
* Fix bracket issues post merge
* Clean up comments and add av_free_packet
* Convert from event_directory to event file as per Video branch
* Testing videojs for video playback
* Fixed a missing bracket post merge and also SQL_values now used for EventID and Monitors
* bring recent improvements in ffmpeg capture function into captureandrecord
* Remove pict from writeAudioFramePacket as not used
* Add translate options for h264 Storage options in Monitor and update en_gb file
* Cherry-Pick from iconnor - make it compile on ubuntu 15.04. Which is libav 56.1.0
Conflicts:
src/zm_ffmpeg.cpp
src/zm_remote_camera_rtsp.cpp
Conflicts:
distros/ubuntu1204/changelog
* Clean up videostore code and remove lots of unused code
* proof of concept for dynamic/automatic video rotation using video-js plugin zoomrotate
Conflicts:
web/skins/classic/views/event.php
* removed redundant field in sql query
Conflicts:
web/skins/classic/views/event.php
* local storage of video js plugin
* Beautify!
Make the code somewhat readable.
* added missing videojs.zoomrotate.js file
added missing videojs.zoomrotate.js file
* Typo
added missing "
* Added missing brackets
* fix to display thumbnails when only storing snapshot.jpg
* added control for video playback rate
Conflicts:
web/skins/classic/views/event.php
* dynamically create jpegs from video file for viewing in browser
* fix timeline view for SaveJPEGs monitors (without enabled VideoWriter)
* only expose monitor info which are being used in client
* fix segmentation fault in zma with ubuntu 14.04 and ffmpeg 2.5.8 (gcc 4.8)
when libx264 is not installed
* better way of detecting showing image or video in timeline and event view
instead of Monitor.VideoWriter, Event.DefaultVideo is used, so even if
VideoWriter/SaveJPEG option is changed, a valid image or video will always be
displayed for historical events in both timeline and event view
this also fixes loading videos in timeline view
* Fixes problem of crashing zmc when bad packet arrives causing av_interleaved_write_frame() to return non-zero (-22). Prefilters common packet issues. Add metadata title to generated video file
* Remove syslog.h
* fixed SaveJPEGs are not working
which is caused in errors introduced when merging with master
* Update README.md
* Fix build warnings specific to h264 branch, unused FrameImg, unused ret and int64_t snprintf issues
* Fix PRId64 issue in travis, builds locally fine, but I can see a gcc version issue here
* Fix PRId64 issue in travis, another try
* Try "STDC_FORMAT_MACROS" to see if that helps Travis on gcc 4.6.3
* Revert space removal around PRId64
* video branch ffmpeg 2.9 fixes
ffmpeg 2.9 patched removed SSE2 CPU
* Add FFMPEGInit back
* use webvvt to overlay timestamp (honoring Monitor.LabelFormat) to videos in timeline and event
also fixed bug which prevented seeking in timeline video preview
* ffmpeg 3.0 API build failure fixes
* Update README.md
* merge all the commits from the messed up iconnor_video branch
* fix whitespace
* revert
* whitespace fixes
* spelling fix
* put back some text
* add these back
* fix spelling mistake
* Steal some packet dumping routines from ffmpeg. Convert them to use our logging routines
* add a test and error message if the codec is not h264
* these have been removed in master
* add a view to check auth and just send the video
* add some comments, and dump filename and AVFormatContext on failure to write header
* add the toggle for RecordAudio so that the checkbox works to turn off Audio
* Must init videoStore in constuctor
* more debug and comments, return checking
* Fix dropped part of sql query.
* fix extra else and some whitespace
* Fix missing } from merge that was preventing building.
* fix tabs
* get rid of use of separator, just use \n
* Restore lost fixes for deprecation
* Why are these failing
* Respect record_audio flag when setting up video file so dont try and initiliase mp4 with unsupported audio
* Forgot that I was trying to solve case of stream is true and record_audio
is false.
* Pass swscale_ctx back in to getCachedContext or it will create new
context every frame and leak memory like a mofo.
* Add libx264-dev and libmp4v2-dev to build requires to save hassle of
ensuring they are installed before build.
* Merge my Rotation/Orientation work and fixes for bad h264 streams
* need arpa/inet for reverse lookups
* pull in the new byte range code for viewing videos
* Move our recording flag deeper into closeevent
* add braces and only call closeEvent if there is an event
* deprecate the z_frame_rate stuff which is deprecated in ffmpeg
* remark out some debugging
* fix for video on stream 1
* fix audio_stream to audio_st
* Ignore bad decodes
* fix problems with content-length causing viewing to not work in chrome/android
* change logic of sending file contents to handle an off by one and be more readable
* Some fixes pointed out by Maxim Romanov. Also simply the loading of events to not join the Monitors table
* fix to sql for timeline
* added RecordAudio to sql in README
* Use sub queries instead of joins to fix errors when using new mysql defaults.
* fix sql queries
* Dockerfile to build feature-h264-videostorage
* Must cast codec
* add php-acpu as a dependency
* require php5-acpu
* fix typo
* remove extra /
* Add a line for out-of-tree builds to do api/lib/Cake/bootstrap.php
* delete merge conflict files
* delete merge conflict files
2017-05-16 10:02:48 +08:00
if ( monitor - > GetOptSaveJPEGs ( ) & 4 ) {
//If this is the first frame, we should add a thumbnail to the event directory
if ( frames = = 10 ) {
char snapshot_file [ PATH_MAX ] ;
snprintf ( snapshot_file , sizeof ( snapshot_file ) , " %s/snapshot.jpg " , path ) ;
WriteFrameImage ( images [ i ] , * ( timestamps [ i ] ) , snapshot_file ) ;
}
}
if ( monitor - > GetOptSaveJPEGs ( ) & 1 ) {
Debug ( 1 , " Writing pre-capture frame %d " , frames ) ;
WriteFrameImage ( images [ i ] , * ( timestamps [ i ] ) , event_file ) ;
}
if ( videowriter ! = NULL ) {
WriteFrameVideo ( images [ i ] , * ( timestamps [ i ] ) , videowriter ) ;
}
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
struct DeltaTimeval delta_time ;
DELTA_TIMEVAL ( delta_time , * ( timestamps [ i ] ) , start_time , DT_PREC_2 ) ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
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 ) ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
frameCount + + ;
}
2013-03-17 07:45:21 +08:00
2017-05-17 00:04:56 +08:00
if ( frameCount ) {
2016-04-04 22:11:48 +08:00
Debug ( 1 , " Adding %d/%d frames to DB " , frameCount , n_frames ) ;
* ( sql + strlen ( sql ) - 2 ) = ' \0 ' ;
2017-05-17 00:04:56 +08:00
if ( mysql_query ( & dbconn , sql ) ) {
2016-04-04 22:11:48 +08:00
Error ( " Can't insert frames: %s " , mysql_error ( & dbconn ) ) ;
exit ( mysql_errno ( & dbconn ) ) ;
2013-03-17 07:45:21 +08:00
}
2016-04-04 22:11:48 +08:00
last_db_frame = frames ;
2017-05-17 00:04:56 +08:00
} else {
2016-04-04 22:11:48 +08:00
Debug ( 1 , " No valid pre-capture frames to add " ) ;
}
2013-03-17 07:45:21 +08:00
}
2017-05-17 00:04:56 +08:00
void Event : : AddFrame ( Image * image , struct timeval timestamp , int score , Image * alarm_image ) {
if ( ! timestamp . tv_sec ) {
2016-04-04 22:11:48 +08:00
Debug ( 1 , " Not adding new frame, zero timestamp " ) ;
return ;
}
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
frames + + ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
static char event_file [ PATH_MAX ] ;
snprintf ( event_file , sizeof ( event_file ) , capture_file_format , path , frames ) ;
2013-03-17 07:45:21 +08:00
Feature h264 videostorage (#1882)
* Moved writing of configure options from Controller to Model. Fixes #191.
* Initial commit for saving events as videos :)
* Add zm_video.cpp to autotools
* Add zm_video.h to autotools
* Search for MP4V2 header file 3 times: mp4v2/mp4v2.h, mp4v2.h, mp4.h
* Fix serve memory leak
* Few minor code improvements
* Added the ability to override preset, tune, profile and few other improvements
* Correctly write SPS & PPS from x264 encoder headers
* Remove unnessecary SPS & PPS writing code
* Imported missing files from master to feature-h264-videostorage
* Audio support including fixes for dts/pts, split on keyframe and update to mkv extension to prevent ffmpeg problems writing rtsp audio to mp4 containter (header problem)
* Updates to make gcc happy
* Add html5 video control to timeline and event to support mkv playback
* Add zm_videostore.cpp to CMakeLists.txt
* Remove Modern Branch for now
* Fix minor bug
* Option handled added in master, removing duplicate declaration
* Add CaptureandRecord from zm_camera.h
* Putting placeholder in for CaptureAndRecord function
* Removed duplicate code and brackets
* add digest auth file for cmake
Conflicts:
src/CMakeLists.txt
* Add web dir back into Makefile.am
Revert "Removed web from SUBDIRS in Makefile.am"
This reverts commit d9bbcdf3a94cba4d8955fcd03bd965ed2772f34d.
* Add CaptureAndRecord to vlc, still need to make it record
* Resolve SegFault on videostore
* Swap to mp4 container
* mp4 changes
* spaces to tabs, hide video stuff if video writer is turned off
* Make timeline open event.mp4 instead of mkv
* Missed mkv in timeline.js
* Fix some issues from the merge conflict
* Resolve post merge build issues with braces
* Fix whitespace
* Update Jpeg and Video options for passthrough options
* Whitespace fix zm_camera.h
* Fix array mkssing comma
* Add support for Jpeg save options for h264 branch snapshot. Might remove altogether if snapshots not needed
* Update VideoStoreData memory size comment
* Change from config.use_mkv_storage to per monitor option VideoWriter from video branch
* Fix bracket issues post merge
* Clean up comments and add av_free_packet
* Convert from event_directory to event file as per Video branch
* Testing videojs for video playback
* Fixed a missing bracket post merge and also SQL_values now used for EventID and Monitors
* bring recent improvements in ffmpeg capture function into captureandrecord
* Remove pict from writeAudioFramePacket as not used
* Add translate options for h264 Storage options in Monitor and update en_gb file
* Cherry-Pick from iconnor - make it compile on ubuntu 15.04. Which is libav 56.1.0
Conflicts:
src/zm_ffmpeg.cpp
src/zm_remote_camera_rtsp.cpp
Conflicts:
distros/ubuntu1204/changelog
* Clean up videostore code and remove lots of unused code
* proof of concept for dynamic/automatic video rotation using video-js plugin zoomrotate
Conflicts:
web/skins/classic/views/event.php
* removed redundant field in sql query
Conflicts:
web/skins/classic/views/event.php
* local storage of video js plugin
* Beautify!
Make the code somewhat readable.
* added missing videojs.zoomrotate.js file
added missing videojs.zoomrotate.js file
* Typo
added missing "
* Added missing brackets
* fix to display thumbnails when only storing snapshot.jpg
* added control for video playback rate
Conflicts:
web/skins/classic/views/event.php
* dynamically create jpegs from video file for viewing in browser
* fix timeline view for SaveJPEGs monitors (without enabled VideoWriter)
* only expose monitor info which are being used in client
* fix segmentation fault in zma with ubuntu 14.04 and ffmpeg 2.5.8 (gcc 4.8)
when libx264 is not installed
* better way of detecting showing image or video in timeline and event view
instead of Monitor.VideoWriter, Event.DefaultVideo is used, so even if
VideoWriter/SaveJPEG option is changed, a valid image or video will always be
displayed for historical events in both timeline and event view
this also fixes loading videos in timeline view
* Fixes problem of crashing zmc when bad packet arrives causing av_interleaved_write_frame() to return non-zero (-22). Prefilters common packet issues. Add metadata title to generated video file
* Remove syslog.h
* fixed SaveJPEGs are not working
which is caused in errors introduced when merging with master
* Update README.md
* Fix build warnings specific to h264 branch, unused FrameImg, unused ret and int64_t snprintf issues
* Fix PRId64 issue in travis, builds locally fine, but I can see a gcc version issue here
* Fix PRId64 issue in travis, another try
* Try "STDC_FORMAT_MACROS" to see if that helps Travis on gcc 4.6.3
* Revert space removal around PRId64
* video branch ffmpeg 2.9 fixes
ffmpeg 2.9 patched removed SSE2 CPU
* Add FFMPEGInit back
* use webvvt to overlay timestamp (honoring Monitor.LabelFormat) to videos in timeline and event
also fixed bug which prevented seeking in timeline video preview
* ffmpeg 3.0 API build failure fixes
* Update README.md
* merge all the commits from the messed up iconnor_video branch
* fix whitespace
* revert
* whitespace fixes
* spelling fix
* put back some text
* add these back
* fix spelling mistake
* Steal some packet dumping routines from ffmpeg. Convert them to use our logging routines
* add a test and error message if the codec is not h264
* these have been removed in master
* add a view to check auth and just send the video
* add some comments, and dump filename and AVFormatContext on failure to write header
* add the toggle for RecordAudio so that the checkbox works to turn off Audio
* Must init videoStore in constuctor
* more debug and comments, return checking
* Fix dropped part of sql query.
* fix extra else and some whitespace
* Fix missing } from merge that was preventing building.
* fix tabs
* get rid of use of separator, just use \n
* Restore lost fixes for deprecation
* Why are these failing
* Respect record_audio flag when setting up video file so dont try and initiliase mp4 with unsupported audio
* Forgot that I was trying to solve case of stream is true and record_audio
is false.
* Pass swscale_ctx back in to getCachedContext or it will create new
context every frame and leak memory like a mofo.
* Add libx264-dev and libmp4v2-dev to build requires to save hassle of
ensuring they are installed before build.
* Merge my Rotation/Orientation work and fixes for bad h264 streams
* need arpa/inet for reverse lookups
* pull in the new byte range code for viewing videos
* Move our recording flag deeper into closeevent
* add braces and only call closeEvent if there is an event
* deprecate the z_frame_rate stuff which is deprecated in ffmpeg
* remark out some debugging
* fix for video on stream 1
* fix audio_stream to audio_st
* Ignore bad decodes
* fix problems with content-length causing viewing to not work in chrome/android
* change logic of sending file contents to handle an off by one and be more readable
* Some fixes pointed out by Maxim Romanov. Also simply the loading of events to not join the Monitors table
* fix to sql for timeline
* added RecordAudio to sql in README
* Use sub queries instead of joins to fix errors when using new mysql defaults.
* fix sql queries
* Dockerfile to build feature-h264-videostorage
* Must cast codec
* add php-acpu as a dependency
* require php5-acpu
* fix typo
* remove extra /
* Add a line for out-of-tree builds to do api/lib/Cake/bootstrap.php
* delete merge conflict files
* delete merge conflict files
2017-05-16 10:02:48 +08:00
if ( monitor - > GetOptSaveJPEGs ( ) & 4 ) {
//If this is the first frame, we should add a thumbnail to the event directory
if ( frames = = 10 ) {
char snapshot_file [ PATH_MAX ] ;
snprintf ( snapshot_file , sizeof ( snapshot_file ) , " %s/snapshot.jpg " , path ) ;
WriteFrameImage ( image , timestamp , snapshot_file ) ;
}
}
if ( monitor - > GetOptSaveJPEGs ( ) & 1 ) {
Debug ( 1 , " Writing capture frame %d " , frames ) ;
WriteFrameImage ( image , timestamp , event_file ) ;
}
if ( videowriter ! = NULL ) {
WriteFrameVideo ( image , timestamp , videowriter ) ;
}
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
struct DeltaTimeval delta_time ;
DELTA_TIMEVAL ( delta_time , timestamp , start_time , DT_PREC_2 ) ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
const char * frame_type = score > 0 ? " Alarm " : ( score < 0 ? " Bulk " : " Normal " ) ;
if ( score < 0 )
score = 0 ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
bool db_frame = ( strcmp ( frame_type , " Bulk " ) ! = 0 ) | | ( ( frames % config . bulk_frame_interval ) = = 0 ) | | ! frames ;
2017-05-17 00:04:56 +08:00
if ( db_frame ) {
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
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 ) ;
2017-05-17 00:04:56 +08:00
if ( mysql_query ( & dbconn , sql ) ) {
2016-04-04 22:11:48 +08:00
Error ( " Can't insert frame: %s " , mysql_error ( & dbconn ) ) ;
exit ( mysql_errno ( & dbconn ) ) ;
}
last_db_frame = frames ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
// We are writing a Bulk frame
2017-05-17 00:04:56 +08:00
if ( ! strcmp ( frame_type , " Bulk " ) ) {
2017-05-20 02:43:49 +08:00
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
) ;
2017-05-17 00:04:56 +08:00
if ( mysql_query ( & dbconn , sql ) ) {
2016-04-04 22:11:48 +08:00
Error ( " Can't update event: %s " , mysql_error ( & dbconn ) ) ;
exit ( mysql_errno ( & dbconn ) ) ;
}
2013-03-17 07:45:21 +08:00
}
2016-04-04 22:11:48 +08:00
}
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
end_time = timestamp ;
2013-03-17 07:45:21 +08:00
2017-05-17 00:04:56 +08:00
// We are writing an Alarm frame
if ( ! strcmp ( frame_type , " Alarm " ) ) {
2016-04-04 22:11:48 +08:00
alarm_frames + + ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
tot_score + = score ;
if ( score > ( int ) max_score )
max_score = score ;
2013-03-17 07:45:21 +08:00
2017-05-17 00:04:56 +08:00
if ( alarm_image ) {
2016-04-04 22:11:48 +08:00
snprintf ( event_file , sizeof ( event_file ) , analyse_file_format , path , frames ) ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
Debug ( 1 , " Writing analysis frame %d " , frames ) ;
Feature h264 videostorage (#1882)
* Moved writing of configure options from Controller to Model. Fixes #191.
* Initial commit for saving events as videos :)
* Add zm_video.cpp to autotools
* Add zm_video.h to autotools
* Search for MP4V2 header file 3 times: mp4v2/mp4v2.h, mp4v2.h, mp4.h
* Fix serve memory leak
* Few minor code improvements
* Added the ability to override preset, tune, profile and few other improvements
* Correctly write SPS & PPS from x264 encoder headers
* Remove unnessecary SPS & PPS writing code
* Imported missing files from master to feature-h264-videostorage
* Audio support including fixes for dts/pts, split on keyframe and update to mkv extension to prevent ffmpeg problems writing rtsp audio to mp4 containter (header problem)
* Updates to make gcc happy
* Add html5 video control to timeline and event to support mkv playback
* Add zm_videostore.cpp to CMakeLists.txt
* Remove Modern Branch for now
* Fix minor bug
* Option handled added in master, removing duplicate declaration
* Add CaptureandRecord from zm_camera.h
* Putting placeholder in for CaptureAndRecord function
* Removed duplicate code and brackets
* add digest auth file for cmake
Conflicts:
src/CMakeLists.txt
* Add web dir back into Makefile.am
Revert "Removed web from SUBDIRS in Makefile.am"
This reverts commit d9bbcdf3a94cba4d8955fcd03bd965ed2772f34d.
* Add CaptureAndRecord to vlc, still need to make it record
* Resolve SegFault on videostore
* Swap to mp4 container
* mp4 changes
* spaces to tabs, hide video stuff if video writer is turned off
* Make timeline open event.mp4 instead of mkv
* Missed mkv in timeline.js
* Fix some issues from the merge conflict
* Resolve post merge build issues with braces
* Fix whitespace
* Update Jpeg and Video options for passthrough options
* Whitespace fix zm_camera.h
* Fix array mkssing comma
* Add support for Jpeg save options for h264 branch snapshot. Might remove altogether if snapshots not needed
* Update VideoStoreData memory size comment
* Change from config.use_mkv_storage to per monitor option VideoWriter from video branch
* Fix bracket issues post merge
* Clean up comments and add av_free_packet
* Convert from event_directory to event file as per Video branch
* Testing videojs for video playback
* Fixed a missing bracket post merge and also SQL_values now used for EventID and Monitors
* bring recent improvements in ffmpeg capture function into captureandrecord
* Remove pict from writeAudioFramePacket as not used
* Add translate options for h264 Storage options in Monitor and update en_gb file
* Cherry-Pick from iconnor - make it compile on ubuntu 15.04. Which is libav 56.1.0
Conflicts:
src/zm_ffmpeg.cpp
src/zm_remote_camera_rtsp.cpp
Conflicts:
distros/ubuntu1204/changelog
* Clean up videostore code and remove lots of unused code
* proof of concept for dynamic/automatic video rotation using video-js plugin zoomrotate
Conflicts:
web/skins/classic/views/event.php
* removed redundant field in sql query
Conflicts:
web/skins/classic/views/event.php
* local storage of video js plugin
* Beautify!
Make the code somewhat readable.
* added missing videojs.zoomrotate.js file
added missing videojs.zoomrotate.js file
* Typo
added missing "
* Added missing brackets
* fix to display thumbnails when only storing snapshot.jpg
* added control for video playback rate
Conflicts:
web/skins/classic/views/event.php
* dynamically create jpegs from video file for viewing in browser
* fix timeline view for SaveJPEGs monitors (without enabled VideoWriter)
* only expose monitor info which are being used in client
* fix segmentation fault in zma with ubuntu 14.04 and ffmpeg 2.5.8 (gcc 4.8)
when libx264 is not installed
* better way of detecting showing image or video in timeline and event view
instead of Monitor.VideoWriter, Event.DefaultVideo is used, so even if
VideoWriter/SaveJPEG option is changed, a valid image or video will always be
displayed for historical events in both timeline and event view
this also fixes loading videos in timeline view
* Fixes problem of crashing zmc when bad packet arrives causing av_interleaved_write_frame() to return non-zero (-22). Prefilters common packet issues. Add metadata title to generated video file
* Remove syslog.h
* fixed SaveJPEGs are not working
which is caused in errors introduced when merging with master
* Update README.md
* Fix build warnings specific to h264 branch, unused FrameImg, unused ret and int64_t snprintf issues
* Fix PRId64 issue in travis, builds locally fine, but I can see a gcc version issue here
* Fix PRId64 issue in travis, another try
* Try "STDC_FORMAT_MACROS" to see if that helps Travis on gcc 4.6.3
* Revert space removal around PRId64
* video branch ffmpeg 2.9 fixes
ffmpeg 2.9 patched removed SSE2 CPU
* Add FFMPEGInit back
* use webvvt to overlay timestamp (honoring Monitor.LabelFormat) to videos in timeline and event
also fixed bug which prevented seeking in timeline video preview
* ffmpeg 3.0 API build failure fixes
* Update README.md
* merge all the commits from the messed up iconnor_video branch
* fix whitespace
* revert
* whitespace fixes
* spelling fix
* put back some text
* add these back
* fix spelling mistake
* Steal some packet dumping routines from ffmpeg. Convert them to use our logging routines
* add a test and error message if the codec is not h264
* these have been removed in master
* add a view to check auth and just send the video
* add some comments, and dump filename and AVFormatContext on failure to write header
* add the toggle for RecordAudio so that the checkbox works to turn off Audio
* Must init videoStore in constuctor
* more debug and comments, return checking
* Fix dropped part of sql query.
* fix extra else and some whitespace
* Fix missing } from merge that was preventing building.
* fix tabs
* get rid of use of separator, just use \n
* Restore lost fixes for deprecation
* Why are these failing
* Respect record_audio flag when setting up video file so dont try and initiliase mp4 with unsupported audio
* Forgot that I was trying to solve case of stream is true and record_audio
is false.
* Pass swscale_ctx back in to getCachedContext or it will create new
context every frame and leak memory like a mofo.
* Add libx264-dev and libmp4v2-dev to build requires to save hassle of
ensuring they are installed before build.
* Merge my Rotation/Orientation work and fixes for bad h264 streams
* need arpa/inet for reverse lookups
* pull in the new byte range code for viewing videos
* Move our recording flag deeper into closeevent
* add braces and only call closeEvent if there is an event
* deprecate the z_frame_rate stuff which is deprecated in ffmpeg
* remark out some debugging
* fix for video on stream 1
* fix audio_stream to audio_st
* Ignore bad decodes
* fix problems with content-length causing viewing to not work in chrome/android
* change logic of sending file contents to handle an off by one and be more readable
* Some fixes pointed out by Maxim Romanov. Also simply the loading of events to not join the Monitors table
* fix to sql for timeline
* added RecordAudio to sql in README
* Use sub queries instead of joins to fix errors when using new mysql defaults.
* fix sql queries
* Dockerfile to build feature-h264-videostorage
* Must cast codec
* add php-acpu as a dependency
* require php5-acpu
* fix typo
* remove extra /
* Add a line for out-of-tree builds to do api/lib/Cake/bootstrap.php
* delete merge conflict files
* delete merge conflict files
2017-05-16 10:02:48 +08:00
if ( monitor - > GetOptSaveJPEGs ( ) & 2 ) {
WriteFrameImage ( alarm_image , timestamp , event_file , true ) ;
}
2013-03-17 07:45:21 +08:00
}
2016-04-04 22:11:48 +08:00
}
2017-05-20 01:30:08 +08:00
2016-04-04 22:11:48 +08:00
/* This makes viewing the diagnostic images impossible because it keeps deleting them
2017-05-20 02:43:49 +08:00
if ( config . record_diag_images ) {
2016-04-04 22:11:48 +08:00
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 ) ;
2017-05-20 02:43:49 +08:00
if ( glob_status ! = 0 ) {
if ( glob_status < 0 ) {
2016-04-04 22:11:48 +08:00
Error ( " Can't glob '%s': %s " , diag_glob , strerror ( errno ) ) ;
2017-05-20 02:43:49 +08:00
} else {
2016-04-04 22:11:48 +08:00
Debug ( 1 , " Can't glob '%s': %d " , diag_glob , glob_status ) ;
}
2017-05-20 02:43:49 +08:00
} else {
2016-04-04 22:11:48 +08:00
char new_diag_path [ PATH_MAX ] = " " ;
2017-05-20 02:43:49 +08:00
for ( int i = 0 ; i < pglob . gl_pathc ; i + + ) {
2016-04-04 22:11:48 +08:00
char * diag_path = pglob . gl_pathv [ i ] ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
char * diag_file = strstr ( diag_path , " diag- " ) ;
2013-03-17 07:45:21 +08:00
2017-05-20 02:43:49 +08:00
if ( diag_file ) {
2016-04-04 22:11:48 +08:00
snprintf ( new_diag_path , sizeof ( new_diag_path ) , general_file_format , path , frames , diag_file ) ;
2013-03-17 07:45:21 +08:00
2017-05-20 02:43:49 +08:00
if ( rename ( diag_path , new_diag_path ) < 0 ) {
2016-04-04 22:11:48 +08:00
Error ( " Can't rename '%s' to '%s': %s " , diag_path , new_diag_path , strerror ( errno ) ) ;
}
2013-03-17 07:45:21 +08:00
}
2016-04-04 22:11:48 +08:00
}
2013-03-17 07:45:21 +08:00
}
2016-04-04 22:11:48 +08:00
globfree ( & pglob ) ;
}
*/
2013-03-17 07:45:21 +08:00
}
2017-05-17 00:04:56 +08:00
bool EventStream : : loadInitialEventData ( int monitor_id , time_t event_time ) {
2016-04-04 22:11:48 +08:00
static char sql [ ZM_SQL_SML_BUFSIZ ] ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
snprintf ( sql , sizeof ( sql ) , " select Id from Events where MonitorId = %d and unix_timestamp( EndTime ) > %ld order by Id asc limit 1 " , monitor_id , event_time ) ;
2013-03-17 07:45:21 +08:00
2017-05-17 00:04:56 +08:00
if ( mysql_query ( & dbconn , sql ) ) {
2016-04-04 22:11:48 +08:00
Error ( " Can't run query: %s " , mysql_error ( & dbconn ) ) ;
exit ( mysql_errno ( & dbconn ) ) ;
}
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
MYSQL_RES * result = mysql_store_result ( & dbconn ) ;
2017-05-17 00:04:56 +08:00
if ( ! result ) {
2016-04-04 22:11:48 +08:00
Error ( " Can't use query result: %s " , mysql_error ( & dbconn ) ) ;
exit ( mysql_errno ( & dbconn ) ) ;
}
MYSQL_ROW dbrow = mysql_fetch_row ( result ) ;
2013-03-17 07:45:21 +08:00
2017-05-17 00:04:56 +08:00
if ( mysql_errno ( & dbconn ) ) {
2016-04-04 22:11:48 +08:00
Error ( " Can't fetch row: %s " , mysql_error ( & dbconn ) ) ;
exit ( mysql_errno ( & dbconn ) ) ;
}
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
int init_event_id = atoi ( dbrow [ 0 ] ) ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
mysql_free_result ( result ) ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
loadEventData ( init_event_id ) ;
2013-03-17 07:45:21 +08:00
2017-05-17 00:04:56 +08:00
if ( event_time ) {
2016-04-04 22:11:48 +08:00
curr_stream_time = event_time ;
curr_frame_id = 1 ;
2017-05-17 00:04:56 +08:00
if ( event_time > = event_data - > start_time ) {
for ( unsigned int i = 0 ; i < event_data - > frame_count ; i + + ) {
2016-04-04 22:11:48 +08:00
//Info( "eft %d > et %d", event_data->frames[i].timestamp, event_time );
2017-05-17 00:04:56 +08:00
if ( event_data - > frames [ i ] . timestamp > = event_time ) {
2016-04-04 22:11:48 +08:00
curr_frame_id = i + 1 ;
Debug ( 3 , " Set cst:%.2f " , curr_stream_time ) ;
Debug ( 3 , " Set cfid:%d " , curr_frame_id ) ;
break ;
2013-03-17 07:45:21 +08:00
}
2016-04-04 22:11:48 +08:00
}
Debug ( 3 , " Skipping %ld frames " , event_data - > frame_count ) ;
2013-03-17 07:45:21 +08:00
}
2016-04-04 22:11:48 +08:00
}
return ( true ) ;
2013-03-17 07:45:21 +08:00
}
2017-05-17 00:04:56 +08:00
bool EventStream : : loadInitialEventData ( int init_event_id , unsigned int init_frame_id ) {
2016-04-04 22:11:48 +08:00
loadEventData ( init_event_id ) ;
2017-05-17 00:04:56 +08:00
if ( init_frame_id ) {
2016-04-04 22:11:48 +08:00
curr_stream_time = event_data - > frames [ init_frame_id - 1 ] . timestamp ;
curr_frame_id = init_frame_id ;
2017-05-17 00:04:56 +08:00
} else {
2016-04-04 22:11:48 +08:00
curr_stream_time = event_data - > start_time ;
}
return ( true ) ;
}
2013-03-17 07:45:21 +08:00
2017-05-17 00:04:56 +08:00
bool EventStream : : loadEventData ( int event_id ) {
2016-04-04 22:11:48 +08:00
static char sql [ ZM_SQL_MED_BUFSIZ ] ;
2017-05-20 02:43:49 +08:00
snprintf ( sql , sizeof ( sql ) , " select MonitorId, Frames, unix_timestamp( StartTime ) as StartTimestamp, (SELECT max(Delta)-min(Delta) FROM Frames WHERE EventId=Events.Id) as Duration, DefaultVideo from Events Id = %d " , event_id ) ;
2016-04-04 22:11:48 +08:00
2017-05-17 00:04:56 +08:00
if ( mysql_query ( & dbconn , sql ) ) {
2016-04-04 22:11:48 +08:00
Error ( " Can't run query: %s " , mysql_error ( & dbconn ) ) ;
exit ( mysql_errno ( & dbconn ) ) ;
}
MYSQL_RES * result = mysql_store_result ( & dbconn ) ;
2017-05-17 00:04:56 +08:00
if ( ! result ) {
2016-04-04 22:11:48 +08:00
Error ( " Can't use query result: %s " , mysql_error ( & dbconn ) ) ;
exit ( mysql_errno ( & dbconn ) ) ;
}
2017-05-17 00:04:56 +08:00
if ( ! mysql_num_rows ( result ) ) {
2016-04-04 22:11:48 +08:00
Fatal ( " Unable to load event %d, not found in DB " , event_id ) ;
}
MYSQL_ROW dbrow = mysql_fetch_row ( result ) ;
2017-05-17 00:04:56 +08:00
if ( mysql_errno ( & dbconn ) ) {
2016-04-04 22:11:48 +08:00
Error ( " Can't fetch row: %s " , mysql_error ( & dbconn ) ) ;
exit ( mysql_errno ( & dbconn ) ) ;
}
delete event_data ;
event_data = new EventData ;
event_data - > event_id = event_id ;
event_data - > monitor_id = atoi ( dbrow [ 0 ] ) ;
2017-05-20 02:43:49 +08:00
event_data - > start_time = atoi ( dbrow [ 2 ] ) ;
2017-05-17 00:04:56 +08:00
if ( config . use_deep_storage ) {
2016-04-04 22:11:48 +08:00
struct tm * event_time = localtime ( & event_data - > start_time ) ;
if ( config . dir_events [ 0 ] = = ' / ' )
snprintf ( event_data - > path , sizeof ( event_data - > path ) , " %s/%ld/%02d/%02d/%02d/%02d/%02d/%02d " , config . dir_events , event_data - > monitor_id , event_time - > tm_year - 100 , event_time - > tm_mon + 1 , event_time - > tm_mday , event_time - > tm_hour , event_time - > tm_min , event_time - > tm_sec ) ;
else
snprintf ( event_data - > path , sizeof ( event_data - > path ) , " %s/%s/%ld/%02d/%02d/%02d/%02d/%02d/%02d " , staticConfig . PATH_WEB . c_str ( ) , config . dir_events , event_data - > monitor_id , event_time - > tm_year - 100 , event_time - > tm_mon + 1 , event_time - > tm_mday , event_time - > tm_hour , event_time - > tm_min , event_time - > tm_sec ) ;
2017-05-17 00:04:56 +08:00
} else {
2016-04-04 22:11:48 +08:00
if ( config . dir_events [ 0 ] = = ' / ' )
snprintf ( event_data - > path , sizeof ( event_data - > path ) , " %s/%ld/%ld " , config . dir_events , event_data - > monitor_id , event_data - > event_id ) ;
2013-03-17 07:45:21 +08:00
else
2016-04-04 22:11:48 +08:00
snprintf ( event_data - > path , sizeof ( event_data - > path ) , " %s/%s/%ld/%ld " , staticConfig . PATH_WEB . c_str ( ) , config . dir_events , event_data - > monitor_id , event_data - > event_id ) ;
}
2017-05-20 02:43:49 +08:00
event_data - > frame_count = dbrow [ 1 ] = = NULL ? 0 : atoi ( dbrow [ 1 ] ) ;
event_data - > duration = atof ( dbrow [ 3 ] ) ;
strncpy ( event_data - > video_file , dbrow [ 4 ] , sizeof ( event_data - > video_file ) - 1 ) ;
2016-04-04 22:11:48 +08:00
updateFrameRate ( ( double ) event_data - > frame_count / event_data - > duration ) ;
mysql_free_result ( result ) ;
snprintf ( sql , sizeof ( sql ) , " select FrameId, unix_timestamp( `TimeStamp` ), Delta from Frames where EventId = %d order by FrameId asc " , event_id ) ;
2017-05-17 00:04:56 +08:00
if ( mysql_query ( & dbconn , sql ) ) {
2016-04-04 22:11:48 +08:00
Error ( " Can't run query: %s " , mysql_error ( & dbconn ) ) ;
exit ( mysql_errno ( & dbconn ) ) ;
}
result = mysql_store_result ( & dbconn ) ;
2017-05-17 00:04:56 +08:00
if ( ! result ) {
2016-04-04 22:11:48 +08:00
Error ( " Can't use query result: %s " , mysql_error ( & dbconn ) ) ;
exit ( mysql_errno ( & dbconn ) ) ;
}
event_data - > n_frames = mysql_num_rows ( result ) ;
event_data - > frames = new FrameData [ event_data - > frame_count ] ;
int id , last_id = 0 ;
time_t timestamp , last_timestamp = event_data - > start_time ;
double delta , last_delta = 0.0 ;
2017-05-17 00:04:56 +08:00
while ( ( dbrow = mysql_fetch_row ( result ) ) ) {
2016-04-04 22:11:48 +08:00
id = atoi ( dbrow [ 0 ] ) ;
timestamp = atoi ( dbrow [ 1 ] ) ;
delta = atof ( dbrow [ 2 ] ) ;
int id_diff = id - last_id ;
double frame_delta = ( delta - last_delta ) / id_diff ;
2017-05-17 00:04:56 +08:00
if ( id_diff > 1 ) {
for ( int i = last_id + 1 ; i < id ; i + + ) {
2016-04-04 22:11:48 +08:00
event_data - > frames [ i - 1 ] . timestamp = ( time_t ) ( last_timestamp + ( ( i - last_id ) * frame_delta ) ) ;
event_data - > frames [ i - 1 ] . offset = ( time_t ) ( event_data - > frames [ i - 1 ] . timestamp - event_data - > start_time ) ;
event_data - > frames [ i - 1 ] . delta = frame_delta ;
event_data - > frames [ i - 1 ] . in_db = false ;
}
2013-03-17 07:45:21 +08:00
}
2016-04-04 22:11:48 +08:00
event_data - > frames [ id - 1 ] . timestamp = timestamp ;
event_data - > frames [ id - 1 ] . offset = ( time_t ) ( event_data - > frames [ id - 1 ] . timestamp - event_data - > start_time ) ;
event_data - > frames [ id - 1 ] . delta = id > 1 ? frame_delta : 0.0 ;
event_data - > frames [ id - 1 ] . in_db = true ;
last_id = id ;
last_delta = delta ;
last_timestamp = timestamp ;
}
2017-05-17 00:04:56 +08:00
if ( mysql_errno ( & dbconn ) ) {
2016-04-04 22:11:48 +08:00
Error ( " Can't fetch row: %s " , mysql_error ( & dbconn ) ) ;
exit ( mysql_errno ( & dbconn ) ) ;
}
//for ( int i = 0; i < 250; i++ )
//{
//Info( "%d -> %d @ %f (%d)", i+1, event_data->frames[i].timestamp, event_data->frames[i].delta, event_data->frames[i].in_db );
//}
mysql_free_result ( result ) ;
2017-05-17 00:04:56 +08:00
if ( forceEventChange | | mode = = MODE_ALL_GAPLESS ) {
2016-04-04 22:11:48 +08:00
if ( replay_rate > 0 )
curr_stream_time = event_data - > frames [ 0 ] . timestamp ;
else
curr_stream_time = event_data - > frames [ event_data - > frame_count - 1 ] . timestamp ;
}
Debug ( 2 , " Event:%ld, Frames:%ld, Duration: %.2f " , event_data - > event_id , event_data - > frame_count , event_data - > duration ) ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
return ( true ) ;
2013-03-17 07:45:21 +08:00
}
2017-05-17 00:04:56 +08:00
void EventStream : : processCommand ( const CmdMsg * msg ) {
2017-05-20 01:30:08 +08:00
Debug ( 2 , " Got message, type %d, msg %d " , msg - > msg_type , msg - > msg_data [ 0 ] ) ;
2016-04-04 22:11:48 +08:00
// Check for incoming command
2017-05-17 00:04:56 +08:00
switch ( ( MsgCommand ) msg - > msg_data [ 0 ] ) {
2016-04-04 22:11:48 +08:00
case CMD_PAUSE :
2017-05-20 01:35:13 +08:00
{
Debug ( 1 , " Got PAUSE command " ) ;
2013-03-17 07:45:21 +08:00
2017-05-20 01:35:13 +08:00
// Set paused flag
paused = true ;
replay_rate = ZM_RATE_BASE ;
last_frame_sent = TV_2_FLOAT ( now ) ;
break ;
}
2016-04-04 22:11:48 +08:00
case CMD_PLAY :
{
2017-05-20 01:35:13 +08:00
Debug ( 1 , " Got PLAY command " ) ;
if ( paused )
{
// Clear paused flag
paused = false ;
}
2016-04-04 22:11:48 +08:00
2017-05-20 01:35:13 +08:00
// If we are in single event mode and at the last frame, replay the current event
if ( ( mode = = MODE_SINGLE ) & & ( ( unsigned int ) curr_frame_id = = event_data - > frame_count ) )
curr_frame_id = 1 ;
2016-04-04 22:11:48 +08:00
2017-05-20 01:35:13 +08:00
replay_rate = ZM_RATE_BASE ;
break ;
}
2016-04-04 22:11:48 +08:00
case CMD_VARPLAY :
{
2017-05-20 01:35:13 +08:00
Debug ( 1 , " Got VARPLAY command " ) ;
if ( paused )
{
// Clear paused flag
paused = false ;
}
replay_rate = ntohs ( ( ( unsigned char ) msg - > msg_data [ 2 ] < < 8 ) | ( unsigned char ) msg - > msg_data [ 1 ] ) - 32768 ;
break ;
2016-04-04 22:11:48 +08:00
}
case CMD_STOP :
2017-05-20 01:35:13 +08:00
{
Debug ( 1 , " Got STOP command " ) ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
// Clear paused flag
paused = false ;
2017-05-20 01:35:13 +08:00
break ;
2016-04-04 22:11:48 +08:00
}
2017-05-20 01:35:13 +08:00
case CMD_FASTFWD :
{
Debug ( 1 , " Got FAST FWD command " ) ;
if ( paused ) {
// Clear paused flag
paused = false ;
}
// Set play rate
switch ( replay_rate ) {
case 2 * ZM_RATE_BASE :
replay_rate = 5 * ZM_RATE_BASE ;
break ;
case 5 * ZM_RATE_BASE :
replay_rate = 10 * ZM_RATE_BASE ;
break ;
case 10 * ZM_RATE_BASE :
replay_rate = 25 * ZM_RATE_BASE ;
break ;
case 25 * ZM_RATE_BASE :
case 50 * ZM_RATE_BASE :
replay_rate = 50 * ZM_RATE_BASE ;
break ;
default :
replay_rate = 2 * ZM_RATE_BASE ;
break ;
}
break ;
2016-04-04 22:11:48 +08:00
}
case CMD_SLOWFWD :
2017-05-20 01:35:13 +08:00
{
Debug ( 1 , " Got SLOW FWD command " ) ;
// Set paused flag
paused = true ;
// Set play rate
replay_rate = ZM_RATE_BASE ;
// Set step
step = 1 ;
break ;
}
2016-04-04 22:11:48 +08:00
case CMD_SLOWREV :
2017-05-20 01:35:13 +08:00
{
Debug ( 1 , " Got SLOW REV command " ) ;
// Set paused flag
paused = true ;
// Set play rate
replay_rate = ZM_RATE_BASE ;
// Set step
step = - 1 ;
break ;
2016-04-04 22:11:48 +08:00
}
2017-05-20 01:35:13 +08:00
case CMD_FASTREV :
{
Debug ( 1 , " Got FAST REV command " ) ;
if ( paused ) {
// Clear paused flag
paused = false ;
}
// Set play rate
switch ( replay_rate ) {
case - 2 * ZM_RATE_BASE :
replay_rate = - 5 * ZM_RATE_BASE ;
break ;
case - 5 * ZM_RATE_BASE :
replay_rate = - 10 * ZM_RATE_BASE ;
break ;
case - 10 * ZM_RATE_BASE :
replay_rate = - 25 * ZM_RATE_BASE ;
break ;
case - 25 * ZM_RATE_BASE :
case - 50 * ZM_RATE_BASE :
replay_rate = - 50 * ZM_RATE_BASE ;
break ;
default :
replay_rate = - 2 * ZM_RATE_BASE ;
break ;
}
break ;
2016-04-04 22:11:48 +08:00
}
case CMD_ZOOMIN :
2017-05-20 01:35:13 +08:00
{
x = ( ( unsigned char ) msg - > msg_data [ 1 ] < < 8 ) | ( unsigned char ) msg - > msg_data [ 2 ] ;
y = ( ( unsigned char ) msg - > msg_data [ 3 ] < < 8 ) | ( unsigned char ) msg - > msg_data [ 4 ] ;
Debug ( 1 , " Got ZOOM IN command, to %d,%d " , x , y ) ;
switch ( zoom ) {
case 100 :
zoom = 150 ;
break ;
case 150 :
zoom = 200 ;
break ;
case 200 :
zoom = 300 ;
break ;
case 300 :
zoom = 400 ;
break ;
case 400 :
default :
zoom = 500 ;
break ;
}
break ;
2016-04-04 22:11:48 +08:00
}
case CMD_ZOOMOUT :
2017-05-20 01:35:13 +08:00
{
Debug ( 1 , " Got ZOOM OUT command " ) ;
switch ( zoom ) {
case 500 :
zoom = 400 ;
break ;
case 400 :
zoom = 300 ;
break ;
case 300 :
zoom = 200 ;
break ;
case 200 :
zoom = 150 ;
break ;
case 150 :
default :
zoom = 100 ;
break ;
}
break ;
2016-04-04 22:11:48 +08:00
}
case CMD_PAN :
2017-05-20 01:35:13 +08:00
{
x = ( ( unsigned char ) msg - > msg_data [ 1 ] < < 8 ) | ( unsigned char ) msg - > msg_data [ 2 ] ;
y = ( ( unsigned char ) msg - > msg_data [ 3 ] < < 8 ) | ( unsigned char ) msg - > msg_data [ 4 ] ;
Debug ( 1 , " Got PAN command, to %d,%d " , x , y ) ;
break ;
}
2016-04-04 22:11:48 +08:00
case CMD_SCALE :
2017-05-20 01:35:13 +08:00
{
scale = ( ( unsigned char ) msg - > msg_data [ 1 ] < < 8 ) | ( unsigned char ) msg - > msg_data [ 2 ] ;
Debug ( 1 , " Got SCALE command, to %d " , scale ) ;
break ;
}
2016-04-04 22:11:48 +08:00
case CMD_PREV :
2017-05-20 01:35:13 +08:00
{
Debug ( 1 , " Got PREV command " ) ;
if ( replay_rate > = 0 )
curr_frame_id = 0 ;
else
curr_frame_id = event_data - > frame_count + 1 ;
paused = false ;
forceEventChange = true ;
break ;
}
2016-04-04 22:11:48 +08:00
case CMD_NEXT :
2017-05-20 01:35:13 +08:00
{
Debug ( 1 , " Got NEXT command " ) ;
if ( replay_rate > = 0 )
curr_frame_id = event_data - > frame_count + 1 ;
else
curr_frame_id = 0 ;
paused = false ;
forceEventChange = true ;
break ;
}
2016-04-04 22:11:48 +08:00
case CMD_SEEK :
2017-05-20 01:35:13 +08:00
{
int offset = ( ( unsigned char ) msg - > msg_data [ 1 ] < < 24 ) | ( ( unsigned char ) msg - > msg_data [ 2 ] < < 16 ) | ( ( unsigned char ) msg - > msg_data [ 3 ] < < 8 ) | ( unsigned char ) msg - > msg_data [ 4 ] ;
curr_frame_id = ( int ) ( event_data - > frame_count * offset / event_data - > duration ) ;
Debug ( 1 , " Got SEEK command, to %d (new cfid: %d) " , offset , curr_frame_id ) ;
break ;
}
2016-04-04 22:11:48 +08:00
case CMD_QUERY :
2017-05-20 01:35:13 +08:00
{
Debug ( 1 , " Got QUERY command, sending STATUS " ) ;
break ;
}
case CMD_QUIT :
{
Info ( " User initiated exit - CMD_QUIT " ) ;
break ;
}
2016-04-04 22:11:48 +08:00
default :
2017-05-20 01:35:13 +08:00
{
// Do nothing, for now
}
2016-04-04 22:11:48 +08:00
}
struct {
int event ;
int progress ;
int rate ;
int zoom ;
bool paused ;
} status_data ;
status_data . event = event_data - > event_id ;
status_data . progress = ( int ) event_data - > frames [ curr_frame_id - 1 ] . offset ;
status_data . rate = replay_rate ;
status_data . zoom = zoom ;
status_data . paused = paused ;
Debug ( 2 , " E:%d, P:%d, p:%d R:%d, Z:%d " ,
status_data . event ,
status_data . paused ,
status_data . progress ,
status_data . rate ,
status_data . zoom
) ;
DataMsg status_msg ;
status_msg . msg_type = MSG_DATA_EVENT ;
memcpy ( & status_msg . msg_data , & status_data , sizeof ( status_data ) ) ;
2017-05-17 00:04:56 +08:00
if ( sendto ( sd , & status_msg , sizeof ( status_msg ) , MSG_DONTWAIT , ( sockaddr * ) & rem_addr , sizeof ( rem_addr ) ) < 0 ) {
2016-04-04 22:11:48 +08:00
//if ( errno != EAGAIN )
{
Error ( " Can't sendto on sd %d: %s " , sd , strerror ( errno ) ) ;
exit ( - 1 ) ;
}
}
// quit after sending a status, if this was a quit request
if ( ( MsgCommand ) msg - > msg_data [ 0 ] = = CMD_QUIT )
exit ( 0 ) ;
updateFrameRate ( ( double ) event_data - > frame_count / event_data - > duration ) ;
}
2013-03-17 07:45:21 +08:00
2017-05-17 00:04:56 +08:00
void EventStream : : checkEventLoaded ( ) {
2016-04-04 22:11:48 +08:00
bool reload_event = false ;
static char sql [ ZM_SQL_SML_BUFSIZ ] ;
2017-05-17 00:04:56 +08:00
if ( curr_frame_id < = 0 ) {
2016-04-04 22:11:48 +08:00
snprintf ( sql , sizeof ( sql ) , " select Id from Events where MonitorId = %ld and Id < %ld order by Id desc limit 1 " , event_data - > monitor_id , event_data - > event_id ) ;
reload_event = true ;
2017-05-17 00:04:56 +08:00
} else if ( ( unsigned int ) curr_frame_id > event_data - > frame_count ) {
2016-04-04 22:11:48 +08:00
snprintf ( sql , sizeof ( sql ) , " select Id from Events where MonitorId = %ld and Id > %ld order by Id asc limit 1 " , event_data - > monitor_id , event_data - > event_id ) ;
reload_event = true ;
}
2017-05-17 00:04:56 +08:00
if ( reload_event ) {
if ( forceEventChange | | mode ! = MODE_SINGLE ) {
2016-04-04 22:11:48 +08:00
//Info( "SQL:%s", sql );
2017-05-17 00:04:56 +08:00
if ( mysql_query ( & dbconn , sql ) ) {
2016-04-04 22:11:48 +08:00
Error ( " Can't run query: %s " , mysql_error ( & dbconn ) ) ;
exit ( mysql_errno ( & dbconn ) ) ;
}
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
MYSQL_RES * result = mysql_store_result ( & dbconn ) ;
2017-05-17 00:04:56 +08:00
if ( ! result ) {
2016-04-04 22:11:48 +08:00
Error ( " Can't use query result: %s " , mysql_error ( & dbconn ) ) ;
exit ( mysql_errno ( & dbconn ) ) ;
}
MYSQL_ROW dbrow = mysql_fetch_row ( result ) ;
2013-03-17 07:45:21 +08:00
2017-05-17 00:04:56 +08:00
if ( mysql_errno ( & dbconn ) ) {
2016-04-04 22:11:48 +08:00
Error ( " Can't fetch row: %s " , mysql_error ( & dbconn ) ) ;
exit ( mysql_errno ( & dbconn ) ) ;
}
2013-03-17 07:45:21 +08:00
2017-05-17 00:04:56 +08:00
if ( dbrow ) {
2016-04-04 22:11:48 +08:00
int event_id = atoi ( dbrow [ 0 ] ) ;
Debug ( 1 , " Loading new event %d " , event_id ) ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
loadEventData ( event_id ) ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
Debug ( 2 , " Current frame id = %d " , curr_frame_id ) ;
if ( replay_rate < 0 )
curr_frame_id = event_data - > frame_count ;
2013-03-17 07:45:21 +08:00
else
2016-04-04 22:11:48 +08:00
curr_frame_id = 1 ;
Debug ( 2 , " New frame id = %d " , curr_frame_id ) ;
2017-05-17 00:04:56 +08:00
} else {
2016-04-04 22:11:48 +08:00
if ( curr_frame_id < = 0 )
curr_frame_id = 1 ;
else
curr_frame_id = event_data - > frame_count ;
paused = true ;
}
mysql_free_result ( result ) ;
forceEventChange = false ;
2017-05-17 00:04:56 +08:00
} else {
2016-04-04 22:11:48 +08:00
if ( curr_frame_id < = 0 )
curr_frame_id = 1 ;
else
curr_frame_id = event_data - > frame_count ;
paused = true ;
2013-03-17 07:45:21 +08:00
}
2016-04-04 22:11:48 +08:00
}
2013-03-17 07:45:21 +08:00
}
2017-05-17 00:04:56 +08:00
bool EventStream : : sendFrame ( int delta_us ) {
2016-04-04 22:11:48 +08:00
Debug ( 2 , " Sending frame %d " , curr_frame_id ) ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
static char filepath [ PATH_MAX ] ;
static struct stat filestat ;
FILE * fdj = NULL ;
2017-05-20 01:30:08 +08:00
2016-04-04 22:11:48 +08:00
snprintf ( filepath , sizeof ( filepath ) , Event : : capture_file_format , event_data - > path , curr_frame_id ) ;
2013-03-17 07:45:21 +08:00
# if HAVE_LIBAVCODEC
2017-05-17 00:04:56 +08:00
if ( type = = STREAM_MPEG ) {
2016-04-04 22:11:48 +08:00
Image image ( filepath ) ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
Image * send_image = prepareImage ( & image ) ;
2013-03-17 07:45:21 +08:00
2017-05-17 00:04:56 +08:00
if ( ! vid_stream ) {
2016-04-04 22:11:48 +08:00
vid_stream = new VideoStream ( " pipe: " , format , bitrate , effective_fps , send_image - > Colours ( ) , send_image - > SubpixelOrder ( ) , send_image - > Width ( ) , send_image - > Height ( ) ) ;
fprintf ( stdout , " Content-type: %s \r \n \r \n " , vid_stream - > MimeType ( ) ) ;
vid_stream - > OpenStream ( ) ;
2013-03-17 07:45:21 +08:00
}
2016-04-04 22:11:48 +08:00
/* double pts = */ vid_stream - > EncodeFrame ( send_image - > Buffer ( ) , send_image - > Size ( ) , config . mpeg_timed_frames , delta_us * 1000 ) ;
2017-05-17 00:04:56 +08:00
} else
2013-03-17 07:45:21 +08:00
# endif // HAVE_LIBAVCODEC
2016-04-04 22:11:48 +08:00
{
static unsigned char temp_img_buffer [ ZM_MAX_IMAGE_SIZE ] ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
int img_buffer_size = 0 ;
uint8_t * img_buffer = temp_img_buffer ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
bool send_raw = ( ( scale > = ZM_SCALE_BASE ) & & ( zoom = = ZM_SCALE_BASE ) ) ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
fprintf ( stdout , " --ZoneMinderFrame \r \n " ) ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
if ( type ! = STREAM_JPEG )
send_raw = false ;
2013-03-17 07:45:21 +08:00
2017-05-17 00:04:56 +08:00
if ( send_raw ) {
2016-04-04 22:11:48 +08:00
fdj = fopen ( filepath , " rb " ) ;
2017-05-17 00:04:56 +08:00
if ( ! fdj ) {
2016-04-04 22:11:48 +08:00
Error ( " Can't open %s: %s " , filepath , strerror ( errno ) ) ;
return ( false ) ;
}
2017-05-20 01:30:08 +08:00
# if HAVE_SENDFILE
2016-04-04 22:11:48 +08:00
if ( fstat ( fileno ( fdj ) , & filestat ) < 0 ) {
2017-05-17 00:04:56 +08:00
Error ( " Failed getting information about file %s: %s " , filepath , strerror ( errno ) ) ;
return ( false ) ;
}
2013-03-17 07:45:21 +08:00
# else
2017-05-17 00:04:56 +08:00
img_buffer_size = fread ( img_buffer , 1 , sizeof ( temp_img_buffer ) , fdj ) ;
2013-03-17 07:45:21 +08:00
# endif
2017-05-17 00:04:56 +08:00
} else {
2016-04-04 22:11:48 +08:00
Image image ( filepath ) ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
Image * send_image = prepareImage ( & image ) ;
2013-03-17 07:45:21 +08:00
2017-05-17 00:04:56 +08:00
switch ( type ) {
2016-04-04 22:11:48 +08:00
case STREAM_JPEG :
send_image - > EncodeJpeg ( img_buffer , & img_buffer_size ) ;
break ;
case STREAM_ZIP :
2013-10-05 04:20:39 +08:00
# if HAVE_ZLIB_H
2016-04-04 22:11:48 +08:00
unsigned long zip_buffer_size ;
send_image - > Zip ( img_buffer , & zip_buffer_size ) ;
img_buffer_size = zip_buffer_size ;
break ;
2013-10-05 04:20:39 +08:00
# else
2016-04-04 22:11:48 +08:00
Error ( " zlib is required for zipped images. Falling back to raw image " ) ;
type = STREAM_RAW ;
2013-10-05 04:20:39 +08:00
# endif // HAVE_ZLIB_H
2016-04-04 22:11:48 +08:00
case STREAM_RAW :
img_buffer = ( uint8_t * ) ( send_image - > Buffer ( ) ) ;
img_buffer_size = send_image - > Size ( ) ;
break ;
default :
Fatal ( " Unexpected frame type %d " , type ) ;
break ;
}
}
2013-03-17 07:45:21 +08:00
2017-05-17 00:04:56 +08:00
switch ( type ) {
2016-04-04 22:11:48 +08:00
case STREAM_JPEG :
fprintf ( stdout , " Content-Type: image/jpeg \r \n " ) ;
break ;
case STREAM_RAW :
fprintf ( stdout , " Content-Type: image/x-rgb \r \n " ) ;
break ;
case STREAM_ZIP :
fprintf ( stdout , " Content-Type: image/x-rgbz \r \n " ) ;
break ;
default :
Fatal ( " Unexpected frame type %d " , type ) ;
break ;
}
2013-03-17 07:45:21 +08:00
2017-05-17 00:04:56 +08:00
if ( send_raw ) {
2017-05-20 01:30:08 +08:00
# if HAVE_SENDFILE
2017-05-17 00:04:56 +08:00
fprintf ( stdout , " Content-Length: %d \r \n \r \n " , ( int ) filestat . st_size ) ;
if ( zm_sendfile ( fileno ( stdout ) , fileno ( fdj ) , 0 , ( int ) filestat . st_size ) ! = ( int ) filestat . st_size ) {
/* sendfile() failed, use standard way instead */
img_buffer_size = fread ( img_buffer , 1 , sizeof ( temp_img_buffer ) , fdj ) ;
if ( fwrite ( img_buffer , img_buffer_size , 1 , stdout ) ! = 1 ) {
Error ( " Unable to send raw frame %u: %s " , curr_frame_id , strerror ( errno ) ) ;
return ( false ) ;
}
}
# else
fprintf ( stdout , " Content-Length: %d \r \n \r \n " , img_buffer_size ) ;
2016-04-04 22:11:48 +08:00
if ( fwrite ( img_buffer , img_buffer_size , 1 , stdout ) ! = 1 ) {
Error ( " Unable to send raw frame %u: %s " , curr_frame_id , strerror ( errno ) ) ;
return ( false ) ;
}
Feature h264 videostorage (#1882)
* Moved writing of configure options from Controller to Model. Fixes #191.
* Initial commit for saving events as videos :)
* Add zm_video.cpp to autotools
* Add zm_video.h to autotools
* Search for MP4V2 header file 3 times: mp4v2/mp4v2.h, mp4v2.h, mp4.h
* Fix serve memory leak
* Few minor code improvements
* Added the ability to override preset, tune, profile and few other improvements
* Correctly write SPS & PPS from x264 encoder headers
* Remove unnessecary SPS & PPS writing code
* Imported missing files from master to feature-h264-videostorage
* Audio support including fixes for dts/pts, split on keyframe and update to mkv extension to prevent ffmpeg problems writing rtsp audio to mp4 containter (header problem)
* Updates to make gcc happy
* Add html5 video control to timeline and event to support mkv playback
* Add zm_videostore.cpp to CMakeLists.txt
* Remove Modern Branch for now
* Fix minor bug
* Option handled added in master, removing duplicate declaration
* Add CaptureandRecord from zm_camera.h
* Putting placeholder in for CaptureAndRecord function
* Removed duplicate code and brackets
* add digest auth file for cmake
Conflicts:
src/CMakeLists.txt
* Add web dir back into Makefile.am
Revert "Removed web from SUBDIRS in Makefile.am"
This reverts commit d9bbcdf3a94cba4d8955fcd03bd965ed2772f34d.
* Add CaptureAndRecord to vlc, still need to make it record
* Resolve SegFault on videostore
* Swap to mp4 container
* mp4 changes
* spaces to tabs, hide video stuff if video writer is turned off
* Make timeline open event.mp4 instead of mkv
* Missed mkv in timeline.js
* Fix some issues from the merge conflict
* Resolve post merge build issues with braces
* Fix whitespace
* Update Jpeg and Video options for passthrough options
* Whitespace fix zm_camera.h
* Fix array mkssing comma
* Add support for Jpeg save options for h264 branch snapshot. Might remove altogether if snapshots not needed
* Update VideoStoreData memory size comment
* Change from config.use_mkv_storage to per monitor option VideoWriter from video branch
* Fix bracket issues post merge
* Clean up comments and add av_free_packet
* Convert from event_directory to event file as per Video branch
* Testing videojs for video playback
* Fixed a missing bracket post merge and also SQL_values now used for EventID and Monitors
* bring recent improvements in ffmpeg capture function into captureandrecord
* Remove pict from writeAudioFramePacket as not used
* Add translate options for h264 Storage options in Monitor and update en_gb file
* Cherry-Pick from iconnor - make it compile on ubuntu 15.04. Which is libav 56.1.0
Conflicts:
src/zm_ffmpeg.cpp
src/zm_remote_camera_rtsp.cpp
Conflicts:
distros/ubuntu1204/changelog
* Clean up videostore code and remove lots of unused code
* proof of concept for dynamic/automatic video rotation using video-js plugin zoomrotate
Conflicts:
web/skins/classic/views/event.php
* removed redundant field in sql query
Conflicts:
web/skins/classic/views/event.php
* local storage of video js plugin
* Beautify!
Make the code somewhat readable.
* added missing videojs.zoomrotate.js file
added missing videojs.zoomrotate.js file
* Typo
added missing "
* Added missing brackets
* fix to display thumbnails when only storing snapshot.jpg
* added control for video playback rate
Conflicts:
web/skins/classic/views/event.php
* dynamically create jpegs from video file for viewing in browser
* fix timeline view for SaveJPEGs monitors (without enabled VideoWriter)
* only expose monitor info which are being used in client
* fix segmentation fault in zma with ubuntu 14.04 and ffmpeg 2.5.8 (gcc 4.8)
when libx264 is not installed
* better way of detecting showing image or video in timeline and event view
instead of Monitor.VideoWriter, Event.DefaultVideo is used, so even if
VideoWriter/SaveJPEG option is changed, a valid image or video will always be
displayed for historical events in both timeline and event view
this also fixes loading videos in timeline view
* Fixes problem of crashing zmc when bad packet arrives causing av_interleaved_write_frame() to return non-zero (-22). Prefilters common packet issues. Add metadata title to generated video file
* Remove syslog.h
* fixed SaveJPEGs are not working
which is caused in errors introduced when merging with master
* Update README.md
* Fix build warnings specific to h264 branch, unused FrameImg, unused ret and int64_t snprintf issues
* Fix PRId64 issue in travis, builds locally fine, but I can see a gcc version issue here
* Fix PRId64 issue in travis, another try
* Try "STDC_FORMAT_MACROS" to see if that helps Travis on gcc 4.6.3
* Revert space removal around PRId64
* video branch ffmpeg 2.9 fixes
ffmpeg 2.9 patched removed SSE2 CPU
* Add FFMPEGInit back
* use webvvt to overlay timestamp (honoring Monitor.LabelFormat) to videos in timeline and event
also fixed bug which prevented seeking in timeline video preview
* ffmpeg 3.0 API build failure fixes
* Update README.md
* merge all the commits from the messed up iconnor_video branch
* fix whitespace
* revert
* whitespace fixes
* spelling fix
* put back some text
* add these back
* fix spelling mistake
* Steal some packet dumping routines from ffmpeg. Convert them to use our logging routines
* add a test and error message if the codec is not h264
* these have been removed in master
* add a view to check auth and just send the video
* add some comments, and dump filename and AVFormatContext on failure to write header
* add the toggle for RecordAudio so that the checkbox works to turn off Audio
* Must init videoStore in constuctor
* more debug and comments, return checking
* Fix dropped part of sql query.
* fix extra else and some whitespace
* Fix missing } from merge that was preventing building.
* fix tabs
* get rid of use of separator, just use \n
* Restore lost fixes for deprecation
* Why are these failing
* Respect record_audio flag when setting up video file so dont try and initiliase mp4 with unsupported audio
* Forgot that I was trying to solve case of stream is true and record_audio
is false.
* Pass swscale_ctx back in to getCachedContext or it will create new
context every frame and leak memory like a mofo.
* Add libx264-dev and libmp4v2-dev to build requires to save hassle of
ensuring they are installed before build.
* Merge my Rotation/Orientation work and fixes for bad h264 streams
* need arpa/inet for reverse lookups
* pull in the new byte range code for viewing videos
* Move our recording flag deeper into closeevent
* add braces and only call closeEvent if there is an event
* deprecate the z_frame_rate stuff which is deprecated in ffmpeg
* remark out some debugging
* fix for video on stream 1
* fix audio_stream to audio_st
* Ignore bad decodes
* fix problems with content-length causing viewing to not work in chrome/android
* change logic of sending file contents to handle an off by one and be more readable
* Some fixes pointed out by Maxim Romanov. Also simply the loading of events to not join the Monitors table
* fix to sql for timeline
* added RecordAudio to sql in README
* Use sub queries instead of joins to fix errors when using new mysql defaults.
* fix sql queries
* Dockerfile to build feature-h264-videostorage
* Must cast codec
* add php-acpu as a dependency
* require php5-acpu
* fix typo
* remove extra /
* Add a line for out-of-tree builds to do api/lib/Cake/bootstrap.php
* delete merge conflict files
* delete merge conflict files
2017-05-16 10:02:48 +08:00
# endif
2017-05-17 00:04:56 +08:00
fclose ( fdj ) ; /* Close the file handle */
} else {
fprintf ( stdout , " Content-Length: %d \r \n \r \n " , img_buffer_size ) ;
if ( fwrite ( img_buffer , img_buffer_size , 1 , stdout ) ! = 1 ) {
Error ( " Unable to send stream frame: %s " , strerror ( errno ) ) ;
return ( false ) ;
}
2013-03-17 07:45:21 +08:00
}
2017-05-20 01:30:08 +08:00
2016-04-04 22:11:48 +08:00
fprintf ( stdout , " \r \n \r \n " ) ;
fflush ( stdout ) ;
}
last_frame_sent = TV_2_FLOAT ( now ) ;
return ( true ) ;
2013-03-17 07:45:21 +08:00
}
2017-05-17 00:04:56 +08:00
void EventStream : : runStream ( ) {
2016-04-04 22:11:48 +08:00
Event : : Initialise ( ) ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
openComms ( ) ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
checkInitialised ( ) ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
updateFrameRate ( ( double ) event_data - > frame_count / event_data - > duration ) ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
if ( type = = STREAM_JPEG )
fprintf ( stdout , " Content-Type: multipart/x-mixed-replace;boundary=ZoneMinderFrame \r \n \r \n " ) ;
2013-03-17 07:45:21 +08:00
2017-05-17 00:04:56 +08:00
if ( ! event_data ) {
2016-04-04 22:11:48 +08:00
sendTextFrame ( " No event data found " ) ;
exit ( 0 ) ;
}
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
unsigned int delta_us = 0 ;
2017-05-17 00:04:56 +08:00
while ( ! zm_terminate ) {
2016-04-04 22:11:48 +08:00
gettimeofday ( & now , NULL ) ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
while ( checkCommandQueue ( ) ) ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
if ( step ! = 0 )
curr_frame_id + = step ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
checkEventLoaded ( ) ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
// Get current frame data
FrameData * frame_data = & event_data - > frames [ curr_frame_id - 1 ] ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
//Info( "cst:%.2f", curr_stream_time );
//Info( "cfid:%d", curr_frame_id );
//Info( "fdt:%d", frame_data->timestamp );
2017-05-17 00:04:56 +08:00
if ( ! paused ) {
2016-04-04 22:11:48 +08:00
bool in_event = true ;
double time_to_event = 0 ;
2017-05-17 00:04:56 +08:00
if ( replay_rate > 0 ) {
2016-04-04 22:11:48 +08:00
time_to_event = event_data - > frames [ 0 ] . timestamp - curr_stream_time ;
if ( time_to_event > 0 )
in_event = false ;
2017-05-17 00:04:56 +08:00
} else if ( replay_rate < 0 ) {
2016-04-04 22:11:48 +08:00
time_to_event = curr_stream_time - event_data - > frames [ event_data - > frame_count - 1 ] . timestamp ;
if ( time_to_event > 0 )
in_event = false ;
}
2017-05-17 00:04:56 +08:00
if ( ! in_event ) {
2016-04-04 22:11:48 +08:00
double actual_delta_time = TV_2_FLOAT ( now ) - last_frame_sent ;
2017-05-17 00:04:56 +08:00
if ( actual_delta_time > 1 ) {
2016-04-04 22:11:48 +08:00
static char frame_text [ 64 ] ;
snprintf ( frame_text , sizeof ( frame_text ) , " Time to next event = %d seconds " , ( int ) time_to_event ) ;
if ( ! sendTextFrame ( frame_text ) )
zm_terminate = true ;
2013-03-17 07:45:21 +08:00
}
2016-04-04 22:11:48 +08:00
//else
//{
usleep ( STREAM_PAUSE_WAIT ) ;
//curr_stream_time += (replay_rate>0?1:-1) * ((1.0L * replay_rate * STREAM_PAUSE_WAIT)/(ZM_RATE_BASE * 1000000));
curr_stream_time + = ( 1.0 L * replay_rate * STREAM_PAUSE_WAIT ) / ( ZM_RATE_BASE * 1000000 ) ;
//}
continue ;
}
}
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
// Figure out if we should send this frame
bool send_frame = false ;
2017-05-17 00:04:56 +08:00
if ( ! paused ) {
2016-04-04 22:11:48 +08:00
// If we are streaming and this frame is due to be sent
2017-05-17 00:04:56 +08:00
if ( ( ( curr_frame_id - 1 ) % frame_mod ) = = 0 ) {
2016-04-04 22:11:48 +08:00
delta_us = ( unsigned int ) ( frame_data - > delta * 1000000 ) ;
// if effective > base we should speed up frame delivery
delta_us = ( unsigned int ) ( ( delta_us * base_fps ) / effective_fps ) ;
// but must not exceed maxfps
2017-05-20 01:30:08 +08:00
delta_us = max ( delta_us , 1000000 / maxfps ) ;
2016-04-04 22:11:48 +08:00
send_frame = true ;
}
2017-05-17 00:04:56 +08:00
} else if ( step ! = 0 ) {
2016-04-04 22:11:48 +08:00
// We are paused and are just stepping forward or backward one frame
step = 0 ;
send_frame = true ;
2017-05-17 00:04:56 +08:00
} else {
2016-04-04 22:11:48 +08:00
// We are paused, and doing nothing
double actual_delta_time = TV_2_FLOAT ( now ) - last_frame_sent ;
2017-05-17 00:04:56 +08:00
if ( actual_delta_time > MAX_STREAM_DELAY ) {
2016-04-04 22:11:48 +08:00
// Send keepalive
Debug ( 2 , " Sending keepalive frame " ) ;
send_frame = true ;
}
}
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
if ( send_frame )
if ( ! sendFrame ( delta_us ) )
zm_terminate = true ;
2013-03-17 07:45:21 +08:00
2016-04-04 22:11:48 +08:00
curr_stream_time = frame_data - > timestamp ;
2013-03-17 07:45:21 +08:00
2017-05-17 00:04:56 +08:00
if ( ! paused ) {
2016-04-04 22:11:48 +08:00
curr_frame_id + = replay_rate > 0 ? 1 : - 1 ;
2017-05-17 00:04:56 +08:00
if ( send_frame & & type ! = STREAM_MPEG ) {
2016-04-04 22:11:48 +08:00
Debug ( 3 , " dUs: %d " , delta_us ) ;
usleep ( delta_us ) ;
}
2017-05-17 00:04:56 +08:00
} else {
2016-04-04 22:11:48 +08:00
usleep ( ( unsigned long ) ( ( 1000000 * ZM_RATE_BASE ) / ( ( base_fps ? base_fps : 1 ) * abs ( replay_rate * 2 ) ) ) ) ;
2013-03-17 07:45:21 +08:00
}
2016-04-04 22:11:48 +08:00
}
2013-03-17 07:45:21 +08:00
# if HAVE_LIBAVCODEC
2016-04-04 22:11:48 +08:00
if ( type = = STREAM_MPEG )
delete vid_stream ;
2013-03-17 07:45:21 +08:00
# endif // HAVE_LIBAVCODEC
2016-04-04 22:11:48 +08:00
closeComms ( ) ;
2013-03-17 07:45:21 +08:00
}