diff --git a/scripts/ZoneMinder/lib/ZoneMinder/Event.pm b/scripts/ZoneMinder/lib/ZoneMinder/Event.pm index ea4a2d6c5..a9dc68967 100644 --- a/scripts/ZoneMinder/lib/ZoneMinder/Event.pm +++ b/scripts/ZoneMinder/lib/ZoneMinder/Event.pm @@ -113,6 +113,13 @@ sub getPath { sub Path { my $event = shift; + if ( @_ > 1 ) { + $$event{Path} = $_[1]; + if ( ! -e $$event{Path} ) { + Error("Setting path for event $$event{Id} to $_[1] but does not exist!"); + } + } + if ( ! $$event{Path} ) { my $Storage = $event->Storage(); diff --git a/scripts/zmaudit.pl.in b/scripts/zmaudit.pl.in index a92c1ab4a..9032cbc6d 100644 --- a/scripts/zmaudit.pl.in +++ b/scripts/zmaudit.pl.in @@ -194,10 +194,11 @@ MAIN: while( $loop ) { next if $monitor =~ /\D/; Debug( "Found filesystem monitor '$monitor'" ); - my $fs_events = $fs_monitors->{$monitor} = {}; + $fs_monitors->{$monitor} = {} if ! $fs_monitors->{$monitor}; + my $fs_events = $fs_monitors->{$monitor}; + # De-taint ( my $monitor_dir ) = ( $monitor =~ /^(.*)$/ ); - if ( $Config{ZM_USE_DEEP_STORAGE} ) { foreach my $day_dir ( glob("$monitor_dir/*/*/*") ) { @@ -222,20 +223,27 @@ MAIN: while( $loop ) { Debug( "Checking link $event_link" ); ( my $event = $event_link ) =~ s/^.*\.//; my $event_path = readlink( $event_link ); - if ( $count++ > MAX_AGED_DIRS ) { - $fs_events->{$event} = -1; + + if ( !-e $event_path ) { + aud_print( "Event link $day_dir/$event_link does not point to valid target" ); + if ( confirm() ) { + ( $event_link ) = ( $event_link =~ /^(.*)$/ ); # De-taint + unlink( $event_link ); + $cleaned = 1; + } } else { - if ( !-e $event_path ) { - aud_print( "Event link $day_dir/$event_link does not point to valid target" ); - if ( confirm() ) { - ( $event_link ) = ( $event_link =~ /^(.*)$/ ); # De-taint - unlink( $event_link ); - $cleaned = 1; - } + my $Event = $fs_events->{$event} = new ZoneMinder::Event(); + $$Event{Id} = $event; + $$Event{Path} = $event_path; + $Event->MonitorId( $monitor_dir ); + $Event->StorageId( $Storage->Id() ); + if ( $count++ > MAX_AGED_DIRS ) { + $Event->age( -1 ); } else { - $fs_events->{$event} = (time() - ($^T - ((-M $event_path) * 24*60*60))); - } # event path exists - } + $Event->age( (time() - ($^T - ((-M $event_path ) * 24*60*60))) ); + } + + } # event path exists } # end foreach event_link chdir( $Storage->Path() ); } # end foreach day dir @@ -252,11 +260,17 @@ MAIN: while( $loop ) { closedir( DIR ); my $count = 0; foreach my $event ( @temp_events ) { + my $Event = $fs_events->{$event} = new ZoneMinder::Event(); + $$Event{Id} = $event; + #$$Event{Path} = $event_path; + $Event->MonitorId( $monitor_dir ); + $Event->StorageId( $Storage->Id() ); if ( $count++ > MAX_AGED_DIRS ) { - $fs_events->{$event} = -1; + $Event->age( -1 ); } else { - $fs_events->{$event} = (time() - ($^T - ((-M $event) * 24*60*60))); + $Event->age( (time() - ($^T - ((-M $event ) * 24*60*60))) ); } + } # end foreach event chdir( $Storage->Path() ); } # if USE_DEEP_STORAGE @@ -271,18 +285,18 @@ MAIN: while( $loop ) { if ( my $db_events = $db_monitors->{$monitor_id} ) { next if ! $fs_events; - foreach my $fs_event ( sort { $a <=> $b } keys %$fs_events ) { - my $age = $fs_events->{$fs_event}; - if ( !defined($db_events->{$fs_event}) && ($age < 0 || ($age > $Config{ZM_AUDIT_MIN_AGE})) ) { - aud_print( "Filesystem event '$$Storage{Path}/$monitor_id/$fs_event' does not exist in database" ); + foreach my $fs_event_id ( sort { $a <=> $b } keys %$fs_events ) { + + my $Event = $fs_events->{$fs_event_id}; + + my $age = $$Event{age}; + + if ( !defined($db_events->{$fs_event_id}) && ($age < 0 || ($age > $Config{ZM_AUDIT_MIN_AGE})) ) { + aud_print( "Filesystem event '$$Storage{Path}/$monitor_id/$fs_event_id' does not exist in database" ); if ( confirm() ) { - my $Event = new ZoneMinder::Event( $fs_event ); -# Must set these because the db event does not exist, however these are not enough. - $Event->MonitorId( $monitor_id ); - $Event->StorageId( $Storage->Id() ); $Event->delete_files(); $cleaned = 1; - delete $fs_events->{$fs_event}; + delete $fs_events->{$fs_event_id}; } # end if confirm } # end if ! in db events and old enough } # end foreach fs event diff --git a/src/zm_ffmpeg.cpp b/src/zm_ffmpeg.cpp index ac6cd60bd..2c6a74d2f 100644 --- a/src/zm_ffmpeg.cpp +++ b/src/zm_ffmpeg.cpp @@ -150,11 +150,14 @@ int SWScale::Convert(const uint8_t* in_buffer, const size_t in_buffer_size, uint Error("NULL Input or output buffer"); return -1; } - - if(!width || !height) { - Error("Invalid width or height"); - return -3; - } + // if(in_pf == 0 || out_pf == 0) { + // Error("Invalid input or output pixel formats"); + // return -2; + // } + // if(!width || !height) { + // Error("Invalid width or height"); + // return -3; + // } #if LIBSWSCALE_VERSION_CHECK(0, 8, 0, 8, 0) /* Warn if the input or output pixelformat is not supported */ @@ -196,19 +199,22 @@ int SWScale::Convert(const uint8_t* in_buffer, const size_t in_buffer_size, uint /* Fill in the buffers */ #if LIBAVUTIL_VERSION_CHECK(54, 6, 0, 6, 0) - if(av_image_fill_arrays(input_avframe->data, input_avframe->linesize, - (uint8_t*)in_buffer, in_pf, width, height, 1) <= 0) - { + if (av_image_fill_arrays(input_avframe->data, input_avframe->linesize, + (uint8_t*) in_buffer, in_pf, width, height, 1) <= 0) { #else - if(avpicture_fill( (AVPicture*)input_avframe, (uint8_t*)in_buffer, - in_pf, width, height ) <= 0) - { + if (avpicture_fill((AVPicture*) input_avframe, (uint8_t*) in_buffer, + in_pf, width, height) <= 0) { #endif Error("Failed filling input frame with input buffer"); return -7; } - - if(!avpicture_fill( (AVPicture*)output_avframe, out_buffer, out_pf, width, height ) ) { +#if LIBAVUTIL_VERSION_CHECK(54, 6, 0, 6, 0) + if (av_image_fill_arrays(output_avframe->data, output_avframe->linesize, + out_buffer, out_pf, width, height, 1) <= 0) { +#else + if (avpicture_fill((AVPicture*) output_avframe, out_buffer, out_pf, width, + height) <= 0) { +#endif Error("Failed filling output frame with output buffer"); return -8; } @@ -353,8 +359,7 @@ int hacked_up_context2_for_older_ffmpeg(AVFormatContext **avctx, AVOutputFormat } } -static void zm_log_fps(double d, const char *postfix) -{ +static void zm_log_fps(double d, const char *postfix) { uint64_t v = lrintf(d * 100); if (!v) { Debug(3, "%1.4f %s", d, postfix); diff --git a/src/zm_ffmpeg_camera.cpp b/src/zm_ffmpeg_camera.cpp index e270eadd3..1c6f1acba 100644 --- a/src/zm_ffmpeg_camera.cpp +++ b/src/zm_ffmpeg_camera.cpp @@ -601,7 +601,16 @@ int FfmpegCamera::CaptureAndRecord( Image &image, bool recording, char* event_fi //Instantiate the video storage module Debug(3, "recording and ! wasRecording %s", event_file); - videoStore = new VideoStore((const char *)event_file, "mp4", mFormatContext->streams[mVideoStreamId],mAudioStreamId==-1?NULL:mFormatContext->streams[mAudioStreamId],startTime, this->getMonitor()->getOrientation() ); + if (mAudioStreamId == -1 && !record_audio) { + videoStore = new VideoStore((const char *) event_file, "mp4", + mFormatContext->streams[mVideoStreamId], + NULL, startTime, this->getMonitor()->getOrientation() ); + } else { + videoStore = new VideoStore((const char *) event_file, "mp4", + mFormatContext->streams[mVideoStreamId], + mFormatContext->streams[mAudioStreamId], + startTime, this->getMonitor()->getOrientation() ); + } wasRecording = true; strcpy(oldDirectory, event_file); @@ -626,7 +635,16 @@ int FfmpegCamera::CaptureAndRecord( Image &image, bool recording, char* event_fi videoStore = NULL; } - videoStore = new VideoStore((const char *)event_file, "mp4", mFormatContext->streams[mVideoStreamId],mAudioStreamId==-1?NULL:mFormatContext->streams[mAudioStreamId],startTime, this->getMonitor()->getOrientation()); + if (mAudioStreamId == -1 && !record_audio) { + videoStore = new VideoStore((const char *) event_file, "mp4", + mFormatContext->streams[mVideoStreamId], + NULL, startTime, this->getMonitor()->getOrientation() ); + } else { + videoStore = new VideoStore((const char *) event_file, "mp4", + mFormatContext->streams[mVideoStreamId], + mFormatContext->streams[mAudioStreamId], + startTime, this->getMonitor()->getOrientation() ); + } strcpy(oldDirectory, event_file); } @@ -641,13 +659,20 @@ int FfmpegCamera::CaptureAndRecord( Image &image, bool recording, char* event_fi #if HAVE_LIBSWSCALE if ( mConvertContext == NULL ) { - mConvertContext = sws_getContext( mCodecContext->width, mCodecContext->height, mCodecContext->pix_fmt, width, height, imagePixFormat, SWS_BICUBIC, NULL, NULL, NULL ); + mConvertContext = sws_getContext(mCodecContext->width, + mCodecContext->height, + mCodecContext->pix_fmt, + width, height, + imagePixFormat, SWS_BICUBIC, NULL, + NULL, NULL); if ( mConvertContext == NULL ) Fatal( "Unable to create conversion context for %s", mPath.c_str() ); } - if ( sws_scale( mConvertContext, mRawFrame->data, mRawFrame->linesize, 0, mCodecContext->height, mFrame->data, mFrame->linesize ) < 0 ) - Fatal( "Unable to convert raw format %u to target format %u at frame %d", mCodecContext->pix_fmt, imagePixFormat, frameCount ); + if (sws_scale(mConvertContext, mRawFrame->data, mRawFrame->linesize, + 0, mCodecContext->height, mFrame->data, mFrame->linesize) < 0) + Fatal("Unable to convert raw format %u to target format %u at frame %d", + mCodecContext->pix_fmt, imagePixFormat, frameCount); #else // HAVE_LIBSWSCALE Fatal( "You must compile ffmpeg with the --enable-swscale option to use ffmpeg cameras" ); #endif // HAVE_LIBSWSCALE