From b3e68ca2f7d794b58f42ef41f61746f0301daa37 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 15 Apr 2016 15:10:26 -0400 Subject: [PATCH 01/11] Must init videoStore in constuctor --- src/zm_ffmpeg_camera.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/zm_ffmpeg_camera.cpp b/src/zm_ffmpeg_camera.cpp index a32d8aa45..b59d91f11 100644 --- a/src/zm_ffmpeg_camera.cpp +++ b/src/zm_ffmpeg_camera.cpp @@ -61,6 +61,7 @@ FfmpegCamera::FfmpegCamera( int p_id, const std::string &p_path, const std::stri mOpenStart = 0; mReopenThread = 0; wasRecording = false; + videoStore = NULL; #if HAVE_LIBSWSCALE mConvertContext = NULL; From e4f116af2ff9e4dc33f09f46e5544d5b7350fa22 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 15 Apr 2016 15:32:48 -0400 Subject: [PATCH 02/11] more debug and comments, return checking --- src/zm_videostore.cpp | 109 ++++++++++++++++++++++++++++++------------ 1 file changed, 78 insertions(+), 31 deletions(-) diff --git a/src/zm_videostore.cpp b/src/zm_videostore.cpp index ee9002a26..5ef0a9724 100644 --- a/src/zm_videostore.cpp +++ b/src/zm_videostore.cpp @@ -33,7 +33,8 @@ extern "C"{ } VideoStore::VideoStore(const char *filename_in, const char *format_in, - AVStream *input_st, AVStream *inpaud_st, + AVStream *input_st, + AVStream *inpaud_st, int64_t nStartTime) { AVDictionary *pmetadata = NULL; @@ -46,14 +47,20 @@ VideoStore::VideoStore(const char *filename_in, const char *format_in, keyframeMessage = false; keyframeSkipNumber = 0; - - Info("Opening video storage stream %s\n", filename); + Info("Opening video storage stream %s format: %d\n", filename, format); //Init everything we need int ret; av_register_all(); - avformat_alloc_output_context2(&oc, NULL, NULL, filename); + ret = avformat_alloc_output_context2(&oc, NULL, NULL, filename); + if ( ret < 0 ) { + Warning("Could not create video storage stream %s as no output context" + " could be assigned based on filename: %s", + filename, + av_make_error_string(ret).c_str() + ); + } //Couldn't deduce format from filename, trying from format name if (!oc) { @@ -91,17 +98,20 @@ VideoStore::VideoStore(const char *filename_in, const char *format_in, if (inpaud_st) { audio_st = avformat_new_stream(oc, inpaud_st->codec->codec); if (!audio_st) { - Fatal("Unable to create audio out stream\n"); - } - ret=avcodec_copy_context(audio_st->codec, inpaud_st->codec); - if (ret < 0) { - Fatal("Unable to copy audio context %s\n", av_make_error_string(ret).c_str()); - } - audio_st->codec->codec_tag = 0; - if (oc->oformat->flags & AVFMT_GLOBALHEADER) { - audio_st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER; + Error("Unable to create audio out stream\n"); + audio_st = NULL; + } else { + ret=avcodec_copy_context(audio_st->codec, inpaud_st->codec); + if (ret < 0) { + Fatal("Unable to copy audio context %s\n", av_make_error_string(ret).c_str()); + } + audio_st->codec->codec_tag = 0; + if (oc->oformat->flags & AVFMT_GLOBALHEADER) { + audio_st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER; + } } } else { + Debug(3, "No Audio output stream"); audio_st = NULL; } @@ -114,12 +124,18 @@ VideoStore::VideoStore(const char *filename_in, const char *format_in, } } + //av_dict_set(&opts, "movflags", "frag_custom+dash+delay_moov", 0); + //if ((ret = avformat_write_header(ctx, &opts)) < 0) { + //} + //os->ctx_inited = 1; + //avio_flush(ctx->pb); + //av_dict_free(&opts); /* Write the stream header, if any. */ ret = avformat_write_header(oc, NULL); if (ret < 0) { -zm_dump_stream_format(AVFormatContext *oc, 0, 0, 1 ); - Fatal("Error occurred when writing output file header to %s: %s\n", + zm_dump_stream_format( oc, 0, 0, 1 ); + Fatal("Error occurred when writing output file header to %s: %s\n", filename, av_make_error_string(ret).c_str()); } @@ -131,23 +147,37 @@ zm_dump_stream_format(AVFormatContext *oc, 0, 0, 1 ); startTime=av_gettime()-nStartTime;//oc->start_time; Info("VideoStore startTime=%d\n",startTime); -} +} // VideoStore::VideoStore VideoStore::~VideoStore(){ /* Write the trailer before close */ - av_write_trailer(oc); + if ( int rc = av_write_trailer(oc) ) { + Error("Error writing trailer %s", av_err2str( rc ) ); + } else { + Debug(3, "Sucess Writing trailer"); + } - avcodec_close(video_st->codec); + // I wonder if we should be closing the file first. + // I also wonder if we really need to be doing all the context allocation/de-allocation constantly, or whether we can just re-use it. Just do a file open/close/writeheader/etc. + // What if we were only doing audio recording? + if ( video_st ) { + avcodec_close(video_st->codec); + } if (audio_st) { avcodec_close(audio_st->codec); } + // WHen will be not using a file ? if (!(fmt->flags & AVFMT_NOFILE)) { /* Close the output file. */ - avio_close(oc->pb); + if ( int rc = avio_close(oc->pb) ) { + Error("Error closing avio %s", av_err2str( rc ) ); + } + } else { + Debug(3, "Not closing avio because we are not writing to a file."); } - + /* free the stream */ avformat_free_context(oc); } @@ -171,6 +201,9 @@ void VideoStore::dumpPacket( AVPacket *pkt ){ int VideoStore::writeVideoFramePacket(AVPacket *ipkt, AVStream *input_st){//, AVPacket *lastKeyframePkt){ + Debug(3, "before ost_tbcket %d", startTime ); + zm_dump_stream_format( oc, ipkt->stream_index, 0, 1 ); + Debug(3, "before ost_tbcket %d", startTime ); int64_t ost_tb_start_time = av_rescale_q(startTime, AV_TIME_BASE_Q, video_st->time_base); AVPacket opkt, safepkt; @@ -181,7 +214,7 @@ int VideoStore::writeVideoFramePacket(AVPacket *ipkt, AVStream *input_st){//, AV //Scale the PTS of the outgoing packet to be the correct time base if (ipkt->pts != AV_NOPTS_VALUE) { opkt.pts = av_rescale_q(ipkt->pts-startPts, input_st->time_base, video_st->time_base) - ost_tb_start_time; - }else { + } else { opkt.pts = AV_NOPTS_VALUE; } @@ -220,7 +253,7 @@ int VideoStore::writeVideoFramePacket(AVPacket *ipkt, AVStream *input_st){//, AV } else if ((prevDts > 0) && (prevDts >= opkt.dts)) { Warning("%s:%d: DTS out of order: %lld \u226E %lld; discarding frame", __FILE__, __LINE__, prevDts, opkt.dts); prevDts = opkt.dts; - dumpPacket(&opkt); + dumpPacket(&opkt); } else { int ret; @@ -243,32 +276,47 @@ int VideoStore::writeVideoFramePacket(AVPacket *ipkt, AVStream *input_st){//, AV int VideoStore::writeAudioFramePacket(AVPacket *ipkt, AVStream *input_st){ - if(!audio_st) + if(!audio_st) { + Error("Called writeAudioFramePacket when no audio_st"); return -1;//FIXME -ve return codes do not free packet in ffmpeg_camera at the moment + } /*if(!keyframeMessage) return -1;*/ - - int64_t ost_tb_start_time = av_rescale_q(startTime, AV_TIME_BASE_Q, video_st->time_base); + //zm_dump_stream_format( oc, ipkt->stream_index, 0, 1 ); + + // What is this doing? Getting the time of the start of this video chunk? Does that actually make sense? + int64_t ost_tb_start_time = av_rescale_q(startTime, AV_TIME_BASE_Q, audio_st->time_base); AVPacket opkt; av_init_packet(&opkt); + Debug(3, "after init packet" ); //Scale the PTS of the outgoing packet to be the correct time base - if (ipkt->pts != AV_NOPTS_VALUE) + if (ipkt->pts != AV_NOPTS_VALUE) { + Debug(3, "Rescaling output pts"); opkt.pts = av_rescale_q(ipkt->pts-startPts, input_st->time_base, audio_st->time_base) - ost_tb_start_time; - else + } else { + Debug(3, "Setting output pts to AV_NOPTS_VALUE"); opkt.pts = AV_NOPTS_VALUE; + } //Scale the DTS of the outgoing packet to be the correct time base - if(ipkt->dts == AV_NOPTS_VALUE) + if(ipkt->dts == AV_NOPTS_VALUE) { +Debug(4, "ipkt->dts == AV_NOPTS_VALUE %d to %d", AV_NOPTS_VALUE, opkt.dts ); opkt.dts = av_rescale_q(input_st->cur_dts-startDts, AV_TIME_BASE_Q, audio_st->time_base); - else +Debug(4, "ipkt->dts == AV_NOPTS_VALUE %d to %d", AV_NOPTS_VALUE, opkt.dts ); + } else { +Debug(4, "ipkt->dts != AV_NOPTS_VALUE %d to %d", AV_NOPTS_VALUE, opkt.dts ); opkt.dts = av_rescale_q(ipkt->dts-startDts, input_st->time_base, audio_st->time_base); +Debug(4, "ipkt->dts != AV_NOPTS_VALUE %d to %d", AV_NOPTS_VALUE, opkt.dts ); + } opkt.dts -= ost_tb_start_time; + // Seems like it would be really weird for the codec type to NOT be audiu if (audio_st->codec->codec_type == AVMEDIA_TYPE_AUDIO && ipkt->dts != AV_NOPTS_VALUE) { + Debug( 4, "code is audio, dts != AV_NOPTS_VALUE " ); int duration = av_get_audio_frame_duration(input_st->codec, ipkt->size); if(!duration) duration = input_st->codec->frame_size; @@ -287,14 +335,13 @@ int VideoStore::writeAudioFramePacket(AVPacket *ipkt, AVStream *input_st){ opkt.data = ipkt->data; opkt.size = ipkt->size; opkt.stream_index = ipkt->stream_index; - /*opkt.flags |= AV_PKT_FLAG_KEY;*/ int ret; ret = av_interleaved_write_frame(oc, &opkt); if(ret!=0){ Fatal("Error encoding audio frame packet: %s\n", av_make_error_string(ret).c_str()); } - + Debug(4,"Success writing audio frame" ); av_free_packet(&opkt); return 0; } From b9a6273f327ddcbeb896c04850010ef90fe52263 Mon Sep 17 00:00:00 2001 From: Steve Gilvarry Date: Sun, 1 May 2016 15:59:53 +1000 Subject: [PATCH 03/11] Fix dropped part of sql query. --- src/zm_event.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zm_event.cpp b/src/zm_event.cpp index c05b172ce..104900bb8 100644 --- a/src/zm_event.cpp +++ b/src/zm_event.cpp @@ -83,7 +83,7 @@ Event::Event( Monitor *p_monitor, struct timeval p_start_time, const std::string static char sql[ZM_SQL_MED_BUFSIZ]; struct tm *stime = localtime( &start_time.tv_sec ); - snprintf( sql, sizeof(sql), "insert into Events ( MonitorId, Name, StartTime, Width, Height, Cause, Notes ) values ( %d, 'New Event', from_unixtime( %ld ), %d, %d, '%s', '%s' )", monitor->Id(), start_time.tv_sec, monitor->Width(), monitor->Height(), cause.c_str(), notes.c_str() ); + 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 ); if ( mysql_query( &dbconn, sql ) ) { Error( "Can't insert event: %s", mysql_error( &dbconn ) ); From 883b3235284208595c9cf06224767c5f488959d0 Mon Sep 17 00:00:00 2001 From: Disassembler Date: Sun, 29 May 2016 22:16:00 +0200 Subject: [PATCH 04/11] Change encoding of web/lang/cs_cz.php from ISO-8859-2 to UTF-8 --- web/lang/cs_cz.php | 704 ++++++++++++++++++++++----------------------- 1 file changed, 352 insertions(+), 352 deletions(-) diff --git a/web/lang/cs_cz.php b/web/lang/cs_cz.php index b4f26145b..015b62921 100644 --- a/web/lang/cs_cz.php +++ b/web/lang/cs_cz.php @@ -71,60 +71,60 @@ // Simple String Replacements $SLANG = array( - '24BitColour' => '24 bit barevná', - '32BitColour' => '32 bit barevná', // Added - 2011-06-15 - '8BitGrey' => '8 bit šedá škála', + '24BitColour' => '24 bit barevnĂĄ', + '32BitColour' => '32 bit barevnĂĄ', // Added - 2011-06-15 + '8BitGrey' => '8 bit ĹĄedĂĄ ĹĄkĂĄla', 'Action' => 'Akce', - 'Actual' => 'Skutečná', - 'AddNewControl' => 'Přidat nové řízení', - 'AddNewMonitor' => 'Přidat kameru', - 'AddNewUser' => 'Přidat uživatele', - 'AddNewZone' => 'Přidat zónu', + 'Actual' => 'SkutečnĂĄ', + 'AddNewControl' => 'Přidat novĂŠ řízenĂ­', + 'AddNewMonitor' => 'Přidat kameru', + 'AddNewUser' => 'Přidat uĹživatele', + 'AddNewZone' => 'Přidat zĂłnu', 'Alarm' => 'Alarm', - 'AlarmBrFrames' => 'Alarm
Snímky', - 'AlarmFrame' => 'Alarm snímek', - 'AlarmFrameCount' => 'Počet alarm snímků', + 'AlarmBrFrames' => 'Alarm
SnĂ­mky', + 'AlarmFrame' => 'Alarm snĂ­mek', + 'AlarmFrameCount' => 'Počet alarm snĂ­mkĹŻ', 'AlarmLimits' => 'Limity alarmu', 'AlarmMaximumFPS' => 'Alarm Maximum FPS', 'AlarmPx' => 'Alarm Px', 'AlarmRGBUnset' => 'You must set an alarm RGB colour', 'AlarmRefImageBlendPct'=> 'Alarm Reference Image Blend %ge', // Added - 2015-04-18 'Alert' => 'Pozor', - 'All' => 'Všechny', + 'All' => 'VĹĄechny', 'AnalysisFPS' => 'Analysis FPS', // Added - 2015-07-22 'AnalysisUpdateDelay' => 'Analysis Update Delay', // Added - 2015-07-23 - 'Apply' => 'Použít', - 'ApplyingStateChange' => 'Aplikuji změnu stavu', - 'ArchArchived' => 'Pouze archivované', - 'ArchUnarchived' => 'Pouze nearchivované', + 'Apply' => 'PouŞít', + 'ApplyingStateChange' => 'Aplikuji změnu stavu', + 'ArchArchived' => 'Pouze archivovanĂŠ', + 'ArchUnarchived' => 'Pouze nearchivovanĂŠ', 'Archive' => 'Archiv', - 'Archived' => 'Archivován', + 'Archived' => 'ArchivovĂĄn', 'Area' => 'Area', 'AreaUnits' => 'Area (px/%)', - 'AttrAlarmFrames' => 'Alarm snímky', + 'AttrAlarmFrames' => 'Alarm snĂ­mky', 'AttrArchiveStatus' => 'Archiv status', - 'AttrAvgScore' => 'Prům. skóre', - 'AttrCause' => 'Příčina', + 'AttrAvgScore' => 'PrĹŻm. skĂłre', + 'AttrCause' => 'Příčina', 'AttrDate' => 'Datum', - 'AttrDateTime' => 'Datum/Čas', + 'AttrDateTime' => 'Datum/Čas', 'AttrDiskBlocks' => 'Bloky disku', - 'AttrDiskPercent' => 'Zaplnění disku', - 'AttrDuration' => 'Průběh', - 'AttrFrames' => 'Snímky', + 'AttrDiskPercent' => 'ZaplněnĂ­ disku', + 'AttrDuration' => 'PrĹŻběh', + 'AttrFrames' => 'SnĂ­mky', 'AttrId' => 'Id', - 'AttrMaxScore' => 'Max. skóre', + 'AttrMaxScore' => 'Max. skĂłre', 'AttrMonitorId' => 'Kamera Id', - 'AttrMonitorName' => 'Jméno kamery', - 'AttrName' => 'Jméno', + 'AttrMonitorName' => 'JmĂŠno kamery', + 'AttrName' => 'JmĂŠno', 'AttrNotes' => 'Notes', 'AttrSystemLoad' => 'System Load', - 'AttrTime' => 'Čas', - 'AttrTotalScore' => 'Celkové skóre', - 'AttrWeekday' => 'Den v týdnu', + 'AttrTime' => 'Čas', + 'AttrTotalScore' => 'CelkovĂŠ skĂłre', + 'AttrWeekday' => 'Den v tĂ˝dnu', 'Auto' => 'Auto', - 'AutoStopTimeout' => 'Časový limit pro vypršení', + 'AutoStopTimeout' => 'ČasovĂ˝ limit pro vyprĹĄenĂ­', 'Available' => 'Available', // Added - 2009-03-31 - 'AvgBrScore' => 'Prům.
Skóre', + 'AvgBrScore' => 'PrĹŻm.
SkĂłre', 'Background' => 'Background', 'BackgroundFilter' => 'Run filter in background', 'BadAlarmFrameCount' => 'Alarm frame count must be an integer of one or more', @@ -144,7 +144,7 @@ $SLANG = array( 'BadLabelY' => 'Label Y co-ordinate must be set to an integer of zero or more', 'BadMaxFPS' => 'Maximum FPS must be a positive integer or floating point value', 'BadMotionFrameSkip' => 'Motion Frame skip count must be an integer of zero or more', - 'BadNameChars' => 'Jména moho obsahovat pouze alfanumerické znaky a podtržítko či pomlčku', + 'BadNameChars' => 'JmĂŠna moho obsahovat pouze alfanumerickĂŠ znaky a podtrŞítko či pomlčku', 'BadPalette' => 'Palette must be set to a valid value', // Added - 2009-03-31 'BadPath' => 'Path must be set to a valid value', 'BadPort' => 'Port must be set to a valid number', @@ -157,161 +157,161 @@ $SLANG = array( 'BadWarmupCount' => 'Warmup frames must be an integer of zero or more', 'BadWebColour' => 'Web colour must be a valid web colour string', 'BadWidth' => 'Width must be set to a valid value', - 'Bandwidth' => 'Rychlost sítě', + 'Bandwidth' => 'Rychlost sĂ­tě', 'BandwidthHead' => 'Bandwidth', // This is the end of the bandwidth status on the top of the console, different in many language due to phrasing - 'BlobPx' => 'Značka Px', - 'BlobSizes' => 'Velikost značky', - 'Blobs' => 'Značky', - 'Brightness' => 'Světlost', + 'BlobPx' => 'Značka Px', + 'BlobSizes' => 'Velikost značky', + 'Blobs' => 'Značky', + 'Brightness' => 'Světlost', 'Buffer' => 'Buffer', // Added - 2015-04-18 'Buffers' => 'Bufery', 'CSSDescription' => 'Change the default css for this computer', // Added - 2015-04-18 - 'CanAutoFocus' => 'Umí automaticky zaostřit', - 'CanAutoGain' => 'Umí automatický zisk', - 'CanAutoIris' => 'Umí auto iris', - 'CanAutoWhite' => 'Umí automaticky vyvážit bílou', - 'CanAutoZoom' => 'Umí automaticky zoomovat', - 'CanFocus' => 'Umí zaostřit', - 'CanFocusAbs' => 'Umí zaostřit absolutně', - 'CanFocusCon' => 'Umí průběžně zaostřit', - 'CanFocusRel' => 'Umí relativně zaostřit', - 'CanGain' => 'Umí zisk', - 'CanGainAbs' => 'Umí absolutní zisk', - 'CanGainCon' => 'Umí průběžný zisk', - 'CanGainRel' => 'Umí relativní zisk', - 'CanIris' => 'Umí iris', - 'CanIrisAbs' => 'Umí absolutní iris', - 'CanIrisCon' => 'Umí průběžný iris', - 'CanIrisRel' => 'Umí relativní iris', - 'CanMove' => 'Umí pohyb', - 'CanMoveAbs' => 'Umí absoultní pohyb', - 'CanMoveCon' => 'Umí průběžný pohyb', - 'CanMoveDiag' => 'Umí diagonální pohyb', - 'CanMoveMap' => 'Umí mapovaný pohyb', - 'CanMoveRel' => 'Umí relativní pohyb', - 'CanPan' => 'Umí otáčení', - 'CanReset' => 'Umí reset', - 'CanSetPresets' => 'Umí navolit předvolby', - 'CanSleep' => 'Může spát', - 'CanTilt' => 'Umí náklon', + 'CanAutoFocus' => 'UmĂ­ automaticky zaostřit', + 'CanAutoGain' => 'UmĂ­ automatickĂ˝ zisk', + 'CanAutoIris' => 'UmĂ­ auto iris', + 'CanAutoWhite' => 'UmĂ­ automaticky vyvĂĄĹžit bĂ­lou', + 'CanAutoZoom' => 'UmĂ­ automaticky zoomovat', + 'CanFocus' => 'UmĂ­ zaostřit', + 'CanFocusAbs' => 'UmĂ­ zaostřit absolutně', + 'CanFocusCon' => 'UmĂ­ prĹŻběžně zaostřit', + 'CanFocusRel' => 'UmĂ­ relativně zaostřit', + 'CanGain' => 'UmĂ­ zisk', + 'CanGainAbs' => 'UmĂ­ absolutnĂ­ zisk', + 'CanGainCon' => 'UmĂ­ prĹŻběžnĂ˝ zisk', + 'CanGainRel' => 'UmĂ­ relativnĂ­ zisk', + 'CanIris' => 'UmĂ­ iris', + 'CanIrisAbs' => 'UmĂ­ absolutnĂ­ iris', + 'CanIrisCon' => 'UmĂ­ prĹŻběžnĂ˝ iris', + 'CanIrisRel' => 'UmĂ­ relativnĂ­ iris', + 'CanMove' => 'UmĂ­ pohyb', + 'CanMoveAbs' => 'UmĂ­ absoultnĂ­ pohyb', + 'CanMoveCon' => 'UmĂ­ prĹŻběžnĂ˝ pohyb', + 'CanMoveDiag' => 'UmĂ­ diagonĂĄlnĂ­ pohyb', + 'CanMoveMap' => 'UmĂ­ mapovanĂ˝ pohyb', + 'CanMoveRel' => 'UmĂ­ relativnĂ­ pohyb', + 'CanPan' => 'UmĂ­ otáčenĂ­', + 'CanReset' => 'UmĂ­ reset', + 'CanSetPresets' => 'UmĂ­ navolit předvolby', + 'CanSleep' => 'MĹŻĹže spĂĄt', + 'CanTilt' => 'UmĂ­ nĂĄklon', 'CanWake' => 'Lze vzbudit', - 'CanWhite' => 'Umí vyvážení bílé', - 'CanWhiteAbs' => 'Umí absolutní vyvážení bílé', - 'CanWhiteBal' => 'Umí vyvážení bílé', - 'CanWhiteCon' => 'Umí průběžné vyvážení bílé', - 'CanWhiteRel' => 'Umí relativní vyvážení bílé', - 'CanZoom' => 'Umí zoom', - 'CanZoomAbs' => 'Umí absolutní zoom', - 'CanZoomCon' => 'Umí průběžný zoom', - 'CanZoomRel' => 'Umí relativní zoom', - 'Cancel' => 'Zrušit', - 'CancelForcedAlarm' => 'Zastavit spuštěný alarm', - 'CaptureHeight' => 'Výška zdrojového snímku', + 'CanWhite' => 'UmĂ­ vyvĂĄĹženĂ­ bĂ­lĂŠ', + 'CanWhiteAbs' => 'UmĂ­ absolutnĂ­ vyvĂĄĹženĂ­ bĂ­lĂŠ', + 'CanWhiteBal' => 'UmĂ­ vyvĂĄĹženĂ­ bĂ­lĂŠ', + 'CanWhiteCon' => 'UmĂ­ prĹŻběžnĂŠ vyvĂĄĹženĂ­ bĂ­lĂŠ', + 'CanWhiteRel' => 'UmĂ­ relativnĂ­ vyvĂĄĹženĂ­ bĂ­lĂŠ', + 'CanZoom' => 'UmĂ­ zoom', + 'CanZoomAbs' => 'UmĂ­ absolutnĂ­ zoom', + 'CanZoomCon' => 'UmĂ­ prĹŻběžnĂ˝ zoom', + 'CanZoomRel' => 'UmĂ­ relativnĂ­ zoom', + 'Cancel' => 'ZruĹĄit', + 'CancelForcedAlarm' => 'Zastavit spuĹĄtěnĂ˝ alarm', + 'CaptureHeight' => 'Výťka zdrojovĂŠho snĂ­mku', 'CaptureMethod' => 'Capture Method', // Added - 2009-02-08 - 'CapturePalette' => 'Paleta zdrojového snímku', + 'CapturePalette' => 'Paleta zdrojovĂŠho snĂ­mku', 'CaptureResolution' => 'Capture Resolution', // Added - 2015-04-18 - 'CaptureWidth' => 'Šířka zdrojového snímku', - 'Cause' => 'Příčina', - 'CheckMethod' => 'Metoda značkování alarmem', + 'CaptureWidth' => 'Šířka zdrojovĂŠho snĂ­mku', + 'Cause' => 'Příčina', + 'CheckMethod' => 'Metoda značkovĂĄnĂ­ alarmem', 'ChooseDetectedCamera' => 'Choose Detected Camera', // Added - 2009-03-31 'ChooseFilter' => 'Vybrat filtr', 'ChooseLogFormat' => 'Choose a log format', // Added - 2011-06-17 'ChooseLogSelection' => 'Choose a log selection', // Added - 2011-06-17 'ChoosePreset' => 'Choose Preset', 'Clear' => 'Clear', // Added - 2011-06-16 - 'Close' => 'Zavřít', + 'Close' => 'Zavřít', 'Colour' => 'Barva', - 'Command' => 'Příkaz', + 'Command' => 'Příkaz', 'Component' => 'Component', // Added - 2011-06-16 - 'Config' => 'Nastavení', + 'Config' => 'NastavenĂ­', 'ConfiguredFor' => 'Nastaveno pro', 'ConfirmDeleteEvents' => 'Are you sure you wish to delete the selected events?', 'ConfirmPassword' => 'Potvrdit heslo', 'ConjAnd' => 'a', 'ConjOr' => 'nebo', 'Console' => 'Konzola', - 'ContactAdmin' => 'Pro detailní info kontaktujte Vašeho administrátora.', - 'Continue' => 'Pokračovat', + 'ContactAdmin' => 'Pro detailnĂ­ info kontaktujte VaĹĄeho administrĂĄtora.', + 'Continue' => 'Pokračovat', 'Contrast' => 'Kontrast', - 'Control' => 'Řízení', - 'ControlAddress' => 'Adresa řízení', - 'ControlCap' => 'Schopnosti řízení', - 'ControlCaps' => 'Typy řízení', - 'ControlDevice' => 'Zařízení řízení', - 'ControlType' => 'Typ řízení', - 'Controllable' => 'Říditelná', + 'Control' => 'ŘízenĂ­', + 'ControlAddress' => 'Adresa řízenĂ­', + 'ControlCap' => 'Schopnosti řízenĂ­', + 'ControlCaps' => 'Typy řízenĂ­', + 'ControlDevice' => 'ZařízenĂ­ řízenĂ­', + 'ControlType' => 'Typ řízenĂ­', + 'Controllable' => 'ŘíditelnĂĄ', 'Current' => 'Current', // Added - 2015-04-18 'Cycle' => 'Cyklus', - 'CycleWatch' => 'Cyklické prohlížení', + 'CycleWatch' => 'CyklickĂŠ prohlĂ­ĹženĂ­', 'DateTime' => 'Date/Time', // Added - 2011-06-16 'Day' => 'Den', 'Debug' => 'Debug', 'DefaultRate' => 'Default Rate', - 'DefaultScale' => 'Přednastavená velikost', + 'DefaultScale' => 'PřednastavenĂĄ velikost', 'DefaultView' => 'Default View', 'Deinterlacing' => 'Deinterlacing', // Added - 2015-04-18 'Delay' => 'Delay', // Added - 2015-04-18 'Delete' => 'Smazat', - 'DeleteAndNext' => 'Smazat & Další', - 'DeleteAndPrev' => 'Smazat & Předchozí', + 'DeleteAndNext' => 'Smazat & DalĹĄĂ­', + 'DeleteAndPrev' => 'Smazat & PředchozĂ­', 'DeleteSavedFilter' => 'Smazat filtr', 'Description' => 'Popis', 'DetectedCameras' => 'Detected Cameras', // Added - 2009-03-31 'DetectedProfiles' => 'Detected Profiles', // Added - 2015-04-18 'Device' => 'Device', // Added - 2009-02-08 - 'DeviceChannel' => 'Kanál zařízení', - 'DeviceFormat' => 'Formát zařízení', - 'DeviceNumber' => 'Číslo zarízení', - 'DevicePath' => 'Cesta k zařízení', + 'DeviceChannel' => 'KanĂĄl zařízenĂ­', + 'DeviceFormat' => 'FormĂĄt zařízenĂ­', + 'DeviceNumber' => 'Číslo zarĂ­zenĂ­', + 'DevicePath' => 'Cesta k zařízenĂ­', 'Devices' => 'Devices', - 'Dimensions' => 'Rozměry', - 'DisableAlarms' => 'Zakázat alarmy', + 'Dimensions' => 'Rozměry', + 'DisableAlarms' => 'ZakĂĄzat alarmy', 'Disk' => 'Disk', 'Display' => 'Display', // Added - 2011-01-30 'Displaying' => 'Displaying', // Added - 2011-06-16 'DoNativeMotionDetection'=> 'Do Native Motion Detection', - 'Donate' => 'Prosím podpořte', - 'DonateAlready' => 'Ne, už jsem podpořil', - 'DonateEnticement' => 'Již nějakou dobu používáte software ZoneMinder k ochraně svého majetku a předpokládám, že jej shledáváte užitečným. Přestože je ZoneMinder, znovu připomínám, zdarma a volně šířený software, stojí jeho vývoj a podpora nějaké peníze. Pokud byste chtěl/a podpořit budoucí vývoj a nové možnosti softwaru, prosím zvažte darování finanční pomoci. Darování je, samozřejmě, dobrovolné, ale zato velmi ceněné můžete přispět jakou částkou chcete.

Pokud máte zájem podpořit náš tým, prosím, vyberte níže uvedenou možnost, nebo navštivte http://www.zoneminder.com/donate.html.

Děkuji Vám že jste si vybral/a software ZoneMinder a nezapomeňte navštívit fórum na ZoneMinder.com pro podporu a návrhy jak udělat ZoneMinder ještě lepším než je dnes.', - 'DonateRemindDay' => 'Nyní ne, připomenout za 1 den', - 'DonateRemindHour' => 'Nyní ne, připomenout za hodinu', - 'DonateRemindMonth' => 'Nyní ne, připomenout za měsíc', - 'DonateRemindNever' => 'Ne, nechci podpořit ZoneMinder, nepřipomínat', - 'DonateRemindWeek' => 'Nyní ne, připomenout za týden', - 'DonateYes' => 'Ano, chcit podpořit ZoneMinder nyní', - 'Download' => 'Stáhnout', + 'Donate' => 'ProsĂ­m podpořte', + 'DonateAlready' => 'Ne, uĹž jsem podpořil', + 'DonateEnticement' => 'JiĹž nějakou dobu pouŞívĂĄte software ZoneMinder k ochraně svĂŠho majetku a předpoklĂĄdĂĄm, Ĺže jej shledĂĄvĂĄte uĹžitečnĂ˝m. PřestoĹže je ZoneMinder, znovu připomĂ­nĂĄm, zdarma a volně šířenĂ˝ software, stojĂ­ jeho vĂ˝voj a podpora nějakĂŠ penĂ­ze. Pokud byste chtěl/a podpořit budoucĂ­ vĂ˝voj a novĂŠ moĹžnosti softwaru, prosĂ­m zvaĹžte darovĂĄnĂ­ finančnĂ­ pomoci. DarovĂĄnĂ­ je, samozřejmě, dobrovolnĂŠ, ale zato velmi ceněnĂŠ mĹŻĹžete přispět jakou částkou chcete.

Pokud máte zájem podpořit náš tým, prosím, vyberte níže uvedenou možnost, nebo navštivte http://www.zoneminder.com/donate.html.

Děkuji VĂĄm Ĺže jste si vybral/a software ZoneMinder a nezapomeňte navĹĄtĂ­vit fĂłrum na ZoneMinder.com pro podporu a nĂĄvrhy jak udělat ZoneMinder jeĹĄtě lepĹĄĂ­m neĹž je dnes.', + 'DonateRemindDay' => 'NynĂ­ ne, připomenout za 1 den', + 'DonateRemindHour' => 'NynĂ­ ne, připomenout za hodinu', + 'DonateRemindMonth' => 'NynĂ­ ne, připomenout za měsĂ­c', + 'DonateRemindNever' => 'Ne, nechci podpořit ZoneMinder, nepřipomĂ­nat', + 'DonateRemindWeek' => 'NynĂ­ ne, připomenout za tĂ˝den', + 'DonateYes' => 'Ano, chcit podpořit ZoneMinder nynĂ­', + 'Download' => 'StĂĄhnout', 'DuplicateMonitorName' => 'Duplicate Monitor Name', // Added - 2009-03-31 - 'Duration' => 'Průběh', + 'Duration' => 'PrĹŻběh', 'Edit' => 'Editovat', 'Email' => 'Email', 'EnableAlarms' => 'Povolit alarmy', 'Enabled' => 'Povoleno', - 'EnterNewFilterName' => 'Zadejte nové jméno filtru', + 'EnterNewFilterName' => 'Zadejte novĂŠ jmĂŠno filtru', 'Error' => 'Chyba', - 'ErrorBrackets' => 'Chyba, zkontrolujte prosím závorky', - 'ErrorValidValue' => 'Chyba, zkontrolujte že podmínky mají správné hodnoty', + 'ErrorBrackets' => 'Chyba, zkontrolujte prosĂ­m zĂĄvorky', + 'ErrorValidValue' => 'Chyba, zkontrolujte Ĺže podmĂ­nky majĂ­ sprĂĄvnĂŠ hodnoty', 'Etc' => 'atd', - 'Event' => 'Záznam', - 'EventFilter' => 'Filtr záznamů', - 'EventId' => 'Id záznamu', - 'EventName' => 'Jméno záznamu', - 'EventPrefix' => 'Prefix záznamu', - 'Events' => 'Záznamy', + 'Event' => 'ZĂĄznam', + 'EventFilter' => 'Filtr zĂĄznamĹŻ', + 'EventId' => 'Id zĂĄznamu', + 'EventName' => 'JmĂŠno zĂĄznamu', + 'EventPrefix' => 'Prefix zĂĄznamu', + 'Events' => 'ZĂĄznamy', 'Exclude' => 'Vyjmout', 'Execute' => 'Execute', 'Export' => 'Exportovat', - 'ExportDetails' => 'Exportovat detaily záznamu', - 'ExportFailed' => 'Chyba při exportu', - 'ExportFormat' => 'Formát exportovaného souboru', + 'ExportDetails' => 'Exportovat detaily zĂĄznamu', + 'ExportFailed' => 'Chyba při exportu', + 'ExportFormat' => 'FormĂĄt exportovanĂŠho souboru', 'ExportFormatTar' => 'Tar', 'ExportFormatZip' => 'Zip', - 'ExportFrames' => 'Exportovat detaily snímku', - 'ExportImageFiles' => 'Exportovat obrazové soubory', + 'ExportFrames' => 'Exportovat detaily snĂ­mku', + 'ExportImageFiles' => 'Exportovat obrazovĂŠ soubory', 'ExportLog' => 'Export Log', // Added - 2011-06-17 - 'ExportMiscFiles' => 'Exportovat ostatní soubory (jestli existují)', - 'ExportOptions' => 'Možnosti exportu', + 'ExportMiscFiles' => 'Exportovat ostatnĂ­ soubory (jestli existujĂ­)', + 'ExportOptions' => 'MoĹžnosti exportu', 'ExportSucceeded' => 'Export Succeeded', // Added - 2009-02-08 - 'ExportVideoFiles' => 'Exportovat video soubory (jestli existují)', + 'ExportVideoFiles' => 'Exportovat video soubory (jestli existujĂ­)', 'Exporting' => 'Exportuji', 'FPS' => 'fps', 'FPSReportInterval' => 'FPS Interval pro report', @@ -322,159 +322,159 @@ $SLANG = array( 'Ffmpeg' => 'Ffmpeg', // Added - 2009-02-08 'File' => 'Soubor', 'Filter' => 'Filter', // Added - 2015-04-18 - 'FilterArchiveEvents' => 'Archivovat všechny nalezené', - 'FilterDeleteEvents' => 'Smazat všechny nalezené', - 'FilterEmailEvents' => 'Poslat email s detaily nalezených', - 'FilterExecuteEvents' => 'Spustit příkaz na všech nalezených', + 'FilterArchiveEvents' => 'Archivovat vĹĄechny nalezenĂŠ', + 'FilterDeleteEvents' => 'Smazat vĹĄechny nalezenĂŠ', + 'FilterEmailEvents' => 'Poslat email s detaily nalezenĂ˝ch', + 'FilterExecuteEvents' => 'Spustit příkaz na vĹĄech nalezenĂ˝ch', 'FilterLog' => 'Filter log', // Added - 2015-04-18 - 'FilterMessageEvents' => 'Podat zprávu o všech nalezených', + 'FilterMessageEvents' => 'Podat zprĂĄvu o vĹĄech nalezenĂ˝ch', 'FilterPx' => 'Filtr Px', 'FilterUnset' => 'You must specify a filter width and height', - 'FilterUploadEvents' => 'Uploadovat nalezené', + 'FilterUploadEvents' => 'Uploadovat nalezenĂŠ', 'FilterVideoEvents' => 'Create video for all matches', 'Filters' => 'Filtry', - 'First' => 'První', - 'FlippedHori' => 'Překlopený vodorovně', - 'FlippedVert' => 'Překlopený svisle', + 'First' => 'PrvnĂ­', + 'FlippedHori' => 'PřeklopenĂ˝ vodorovně', + 'FlippedVert' => 'PřeklopenĂ˝ svisle', 'FnMocord' => 'Mocord', // Added 2013.08.16. 'FnModect' => 'Modect', // Added 2013.08.16. 'FnMonitor' => 'Monitor', // Added 2013.08.16. 'FnNodect' => 'Nodect', // Added 2013.08.16. 'FnNone' => 'None', // Added 2013.08.16. 'FnRecord' => 'Record', // Added 2013.08.16. - 'Focus' => 'Zaostření', + 'Focus' => 'ZaostřenĂ­', 'ForceAlarm' => 'Spustit alarm', - 'Format' => 'Formát', - 'Frame' => 'Snímek', - 'FrameId' => 'Snímek Id', - 'FrameRate' => 'Rychlost snímků', - 'FrameSkip' => 'Vynechat snímek', - 'Frames' => 'Snímky', + 'Format' => 'FormĂĄt', + 'Frame' => 'SnĂ­mek', + 'FrameId' => 'SnĂ­mek Id', + 'FrameRate' => 'Rychlost snĂ­mkĹŻ', + 'FrameSkip' => 'Vynechat snĂ­mek', + 'Frames' => 'SnĂ­mky', 'Func' => 'Funkce', 'Function' => 'Funkce', 'Gain' => 'Zisk', 'General' => 'General', 'GenerateVideo' => 'Generovat video', 'GeneratingVideo' => 'Generuji video', - 'GoToZoneMinder' => 'Jít na ZoneMinder.com', - 'Grey' => 'Šedá', + 'GoToZoneMinder' => 'JĂ­t na ZoneMinder.com', + 'Grey' => 'Ĺ edĂĄ', 'Group' => 'Group', 'Groups' => 'Skupiny', - 'HasFocusSpeed' => 'Má rychlost zaostření', - 'HasGainSpeed' => 'Má rychlost zisku', - 'HasHomePreset' => 'Má Home volbu', - 'HasIrisSpeed' => 'Má rychlost irisu', - 'HasPanSpeed' => 'Má rychlost otáčení', - 'HasPresets' => 'Má předvolby', - 'HasTiltSpeed' => 'Má rychlost náklonu', - 'HasTurboPan' => 'Má Turbo otáčení', - 'HasTurboTilt' => 'Má Turbo náklon', - 'HasWhiteSpeed' => 'Má rychlost vyvážení bílé', - 'HasZoomSpeed' => 'Má rychlost zoomu', - 'High' => 'Rychlá', - 'HighBW' => 'Rychlá B/W', - 'Home' => 'Domů', + 'HasFocusSpeed' => 'MĂĄ rychlost zaostřenĂ­', + 'HasGainSpeed' => 'MĂĄ rychlost zisku', + 'HasHomePreset' => 'MĂĄ Home volbu', + 'HasIrisSpeed' => 'MĂĄ rychlost irisu', + 'HasPanSpeed' => 'MĂĄ rychlost otáčenĂ­', + 'HasPresets' => 'MĂĄ předvolby', + 'HasTiltSpeed' => 'MĂĄ rychlost nĂĄklonu', + 'HasTurboPan' => 'MĂĄ Turbo otáčenĂ­', + 'HasTurboTilt' => 'MĂĄ Turbo nĂĄklon', + 'HasWhiteSpeed' => 'MĂĄ rychlost vyvĂĄĹženĂ­ bĂ­lĂŠ', + 'HasZoomSpeed' => 'MĂĄ rychlost zoomu', + 'High' => 'RychlĂĄ', + 'HighBW' => 'RychlĂĄ B/W', + 'Home' => 'DomĹŻ', 'Hour' => 'Hodina', - 'Hue' => 'Odstín', + 'Hue' => 'OdstĂ­n', 'Id' => 'Id', - 'Idle' => 'Připraven', + 'Idle' => 'Připraven', 'Ignore' => 'Ignorovat', 'Image' => 'Obraz', - 'ImageBufferSize' => 'Velikost buferu snímků', + 'ImageBufferSize' => 'Velikost buferu snĂ­mkĹŻ', 'Images' => 'Images', - 'In' => 'Dovnitř', - 'Include' => 'Vložit', - 'Inverted' => 'Převráceně', + 'In' => 'Dovnitř', + 'Include' => 'VloĹžit', + 'Inverted' => 'PřevrĂĄceně', 'Iris' => 'Iris', 'KeyString' => 'Key String', 'Label' => 'Label', 'Language' => 'Jazyk', - 'Last' => 'Poslední', + 'Last' => 'PoslednĂ­', 'Layout' => 'Layout', // Added - 2009-02-08 'Level' => 'Level', // Added - 2011-06-16 'Libvlc' => 'Libvlc', - 'LimitResultsPost' => 'výsledků', // This is used at the end of the phrase 'Limit to first N results only' - 'LimitResultsPre' => 'Zobrazit pouze prvních', // This is used at the beginning of the phrase 'Limit to first N results only' + 'LimitResultsPost' => 'vĂ˝sledkĹŻ', // This is used at the end of the phrase 'Limit to first N results only' + 'LimitResultsPre' => 'Zobrazit pouze prvnĂ­ch', // This is used at the beginning of the phrase 'Limit to first N results only' 'Line' => 'Line', // Added - 2011-06-16 'LinkedMonitors' => 'Linked Monitors', 'List' => 'Seznam', 'Load' => 'Load', - 'Local' => 'Lokální', + 'Local' => 'LokĂĄlnĂ­', 'Log' => 'Log', // Added - 2011-06-16 - 'LoggedInAs' => 'Přihlášen jako', + 'LoggedInAs' => 'PřihlĂĄĹĄen jako', 'Logging' => 'Logging', // Added - 2011-06-16 - 'LoggingIn' => 'Přihlašuji', - 'Login' => 'Přihlásit', - 'Logout' => 'Odhlásit', + 'LoggingIn' => 'PřihlaĹĄuji', + 'Login' => 'PřihlĂĄsit', + 'Logout' => 'OdhlĂĄsit', 'Logs' => 'Logs', // Added - 2011-06-17 - 'Low' => 'Pomalá', - 'LowBW' => 'Pomalá B/W', - 'Main' => 'Hlavní', + 'Low' => 'PomalĂĄ', + 'LowBW' => 'PomalĂĄ B/W', + 'Main' => 'HlavnĂ­', 'Man' => 'Man', - 'Manual' => 'Manuál', - 'Mark' => 'Označit', + 'Manual' => 'ManuĂĄl', + 'Mark' => 'Označit', 'Max' => 'Max', 'MaxBandwidth' => 'Max bandwidth', - 'MaxBrScore' => 'Max.
skóre', - 'MaxFocusRange' => 'Max rozsah zaostření', - 'MaxFocusSpeed' => 'Max rychlost zaostření', - 'MaxFocusStep' => 'Max krok zaostření', + 'MaxBrScore' => 'Max.
skĂłre', + 'MaxFocusRange' => 'Max rozsah zaostřenĂ­', + 'MaxFocusSpeed' => 'Max rychlost zaostřenĂ­', + 'MaxFocusStep' => 'Max krok zaostřenĂ­', 'MaxGainRange' => 'Max rozsah zisku', 'MaxGainSpeed' => 'Max rychlost zisku', 'MaxGainStep' => 'Max krok zisku', 'MaxIrisRange' => 'Max rozsah iris', 'MaxIrisSpeed' => 'Max rychlost iris', 'MaxIrisStep' => 'Max krok iris', - 'MaxPanRange' => 'Max rozsah otáčení', - 'MaxPanSpeed' => 'Max rychlost otáčení', - 'MaxPanStep' => 'Max krok otáčení', - 'MaxTiltRange' => 'Max rozsah náklonu', - 'MaxTiltSpeed' => 'Max rychlost náklonu', - 'MaxTiltStep' => 'Max krok náklonu', - 'MaxWhiteRange' => 'Max rozsah vyvážení bílé', - 'MaxWhiteSpeed' => 'Max rychlost vyvážení bílé', - 'MaxWhiteStep' => 'Max krok vyvážení bílé', + 'MaxPanRange' => 'Max rozsah otáčenĂ­', + 'MaxPanSpeed' => 'Max rychlost otáčenĂ­', + 'MaxPanStep' => 'Max krok otáčenĂ­', + 'MaxTiltRange' => 'Max rozsah nĂĄklonu', + 'MaxTiltSpeed' => 'Max rychlost nĂĄklonu', + 'MaxTiltStep' => 'Max krok nĂĄklonu', + 'MaxWhiteRange' => 'Max rozsah vyvĂĄĹženĂ­ bĂ­lĂŠ', + 'MaxWhiteSpeed' => 'Max rychlost vyvĂĄĹženĂ­ bĂ­lĂŠ', + 'MaxWhiteStep' => 'Max krok vyvĂĄĹženĂ­ bĂ­lĂŠ', 'MaxZoomRange' => 'Max rozsah zoomu', 'MaxZoomSpeed' => 'Max rychlost zoomu', 'MaxZoomStep' => 'Max krok zoomu', 'MaximumFPS' => 'Maximum FPS', - 'Medium' => 'Střední', - 'MediumBW' => 'Střední B/W', + 'Medium' => 'StřednĂ­', + 'MediumBW' => 'StřednĂ­ B/W', 'Message' => 'Message', // Added - 2011-06-16 'MinAlarmAreaLtMax' => 'Minimum alarm area should be less than maximum', 'MinAlarmAreaUnset' => 'You must specify the minimum alarm pixel count', - 'MinBlobAreaLtMax' => 'Minimum značkované oblasti by mělo být menší než maximum', + 'MinBlobAreaLtMax' => 'Minimum značkovanĂŠ oblasti by mělo bĂ˝t menĹĄĂ­ neĹž maximum', 'MinBlobAreaUnset' => 'You must specify the minimum blob pixel count', 'MinBlobLtMinFilter' => 'Minimum blob area should be less than or equal to minimum filter area', - 'MinBlobsLtMax' => 'Minimum značek by mělo být menší než maximum', + 'MinBlobsLtMax' => 'Minimum značek by mělo bĂ˝t menĹĄĂ­ neĹž maximum', 'MinBlobsUnset' => 'You must specify the minimum blob count', 'MinFilterAreaLtMax' => 'Minimum filter area should be less than maximum', 'MinFilterAreaUnset' => 'You must specify the minimum filter pixel count', 'MinFilterLtMinAlarm' => 'Minimum filter area should be less than or equal to minimum alarm area', - 'MinFocusRange' => 'Min rozsah zaostření', - 'MinFocusSpeed' => 'Min rychlost zaostření', - 'MinFocusStep' => 'Min krok zaostření', + 'MinFocusRange' => 'Min rozsah zaostřenĂ­', + 'MinFocusSpeed' => 'Min rychlost zaostřenĂ­', + 'MinFocusStep' => 'Min krok zaostřenĂ­', 'MinGainRange' => 'Min rozsah zisku', 'MinGainSpeed' => 'Min rychlost zisku', 'MinGainStep' => 'Min krok zisku', 'MinIrisRange' => 'Min rozsah iris', 'MinIrisSpeed' => 'Min rychlost iris', 'MinIrisStep' => 'Min krok iris', - 'MinPanRange' => 'Min rozsah otáčení', - 'MinPanSpeed' => 'Min rychlost otáčení', - 'MinPanStep' => 'Min krok otáčení', - 'MinPixelThresLtMax' => 'Minimální práh pixelu by měl být menší než maximumální', + 'MinPanRange' => 'Min rozsah otáčenĂ­', + 'MinPanSpeed' => 'Min rychlost otáčenĂ­', + 'MinPanStep' => 'Min krok otáčenĂ­', + 'MinPixelThresLtMax' => 'MinimĂĄlnĂ­ prĂĄh pixelu by měl bĂ˝t menĹĄĂ­ neĹž maximumĂĄlnĂ­', 'MinPixelThresUnset' => 'You must specify a minimum pixel threshold', - 'MinTiltRange' => 'Min rozsah náklonu', - 'MinTiltSpeed' => 'Min rychlost náklonu', - 'MinTiltStep' => 'Min krok náklonu', - 'MinWhiteRange' => 'Min rozsah vyvážení bílé', - 'MinWhiteSpeed' => 'Min rychlost vyvážení bílé', - 'MinWhiteStep' => 'Min krok vyvážení bílé', + 'MinTiltRange' => 'Min rozsah nĂĄklonu', + 'MinTiltSpeed' => 'Min rychlost nĂĄklonu', + 'MinTiltStep' => 'Min krok nĂĄklonu', + 'MinWhiteRange' => 'Min rozsah vyvĂĄĹženĂ­ bĂ­lĂŠ', + 'MinWhiteSpeed' => 'Min rychlost vyvĂĄĹženĂ­ bĂ­lĂŠ', + 'MinWhiteStep' => 'Min krok vyvĂĄĹženĂ­ bĂ­lĂŠ', 'MinZoomRange' => 'Min rozsah zoomu', 'MinZoomSpeed' => 'Min rychlost zoomu', 'MinZoomStep' => 'Min krok zoomu', - 'Misc' => 'Ostatní', + 'Misc' => 'OstatnĂ­', 'Mode' => 'Mode', // Added - 2015-04-18 'Monitor' => 'Kamera', 'MonitorIds' => 'Id kamer', @@ -483,8 +483,8 @@ $SLANG = array( 'MonitorProbe' => 'Monitor Probe', // Added - 2009-03-31 'MonitorProbeIntro' => 'The list below shows detected analog and network cameras and whether they are already being used or available for selection.

Select the desired entry from the list below.

Please note that not all cameras may be detected and that choosing a camera here may overwrite any values you already have configured for the current monitor.

', // Added - 2009-03-31 'Monitors' => 'Kamery', - 'Montage' => 'Sestřih', - 'Month' => 'Měsíc', + 'Montage' => 'Sestřih', + 'Month' => 'MěsĂ­c', 'More' => 'More', // Added - 2011-06-16 'MotionFrameSkip' => 'Motion Frame Skip', 'Move' => 'Pohyb', @@ -493,64 +493,64 @@ $SLANG = array( 'Mtg3widgrx' => '3-wide grid, scaled, enlarge on alarm', // Added 2013.08.15. 'Mtg4widgrd' => '4-wide grid', // Added 2013.08.15. 'MtgDefault' => 'Default', // Added 2013.08.15. - 'MustBeGe' => 'musí být větší nebo rovno než', - 'MustBeLe' => 'musí být menší nebo rovno než', - 'MustConfirmPassword' => 'Musíte potvrdit heslo', - 'MustSupplyPassword' => 'Musíte zadat heslo', - 'MustSupplyUsername' => 'Musíte zadat uživatelské jméno', - 'Name' => 'Jméno', - 'Near' => 'Blízko', - 'Network' => 'Síť', - 'New' => 'Nový', - 'NewGroup' => 'Nová skupina', + 'MustBeGe' => 'musĂ­ bĂ˝t větĹĄĂ­ nebo rovno neĹž', + 'MustBeLe' => 'musĂ­ bĂ˝t menĹĄĂ­ nebo rovno neĹž', + 'MustConfirmPassword' => 'MusĂ­te potvrdit heslo', + 'MustSupplyPassword' => 'MusĂ­te zadat heslo', + 'MustSupplyUsername' => 'MusĂ­te zadat uĹživatelskĂŠ jmĂŠno', + 'Name' => 'JmĂŠno', + 'Near' => 'BlĂ­zko', + 'Network' => 'SĂ­ĹĽ', + 'New' => 'NovĂ˝', + 'NewGroup' => 'NovĂĄ skupina', 'NewLabel' => 'New Label', - 'NewPassword' => 'Nové heslo', - 'NewState' => 'Nový stav', - 'NewUser' => 'Nový uživatel', - 'Next' => 'Další', + 'NewPassword' => 'NovĂŠ heslo', + 'NewState' => 'NovĂ˝ stav', + 'NewUser' => 'NovĂ˝ uĹživatel', + 'Next' => 'DalĹĄĂ­', 'No' => 'Ne', 'NoDetectedCameras' => 'No Detected Cameras', // Added - 2009-03-31 - 'NoFramesRecorded' => 'Pro tento snímek nejsou žádné záznamy', + 'NoFramesRecorded' => 'Pro tento snĂ­mek nejsou ŞådnĂŠ zĂĄznamy', 'NoGroup' => 'No Group', - 'NoSavedFilters' => 'Žádné uložené filtry', - 'NoStatisticsRecorded' => 'Pro tento záznam/snímek nejsou zaznamenány žádné statistiky', - 'None' => 'Zakázat', - 'NoneAvailable' => 'Žádná není dostupná', - 'Normal' => 'Normalní', - 'Notes' => 'Poznámky', - 'NumPresets' => 'Počet předvoleb', + 'NoSavedFilters' => 'ŽådnĂŠ uloĹženĂŠ filtry', + 'NoStatisticsRecorded' => 'Pro tento zĂĄznam/snĂ­mek nejsou zaznamenĂĄny ŞådnĂŠ statistiky', + 'None' => 'ZakĂĄzat', + 'NoneAvailable' => 'ŽådnĂĄ nenĂ­ dostupnĂĄ', + 'Normal' => 'NormalnĂ­', + 'Notes' => 'PoznĂĄmky', + 'NumPresets' => 'Počet předvoleb', 'Off' => 'Off', 'On' => 'On', 'OnvifCredentialsIntro'=> 'Please supply user name and password for the selected camera.
If no user has been created for the camera then the user given here will be created with the given password.

', // Added - 2015-04-18 'OnvifProbe' => 'ONVIF', // Added - 2015-04-18 'OnvifProbeIntro' => 'The list below shows detected ONVIF cameras and whether they are already being used or available for selection.

Select the desired entry from the list below.

Please note that not all cameras may be detected and that choosing a camera here may overwrite any values you already have configured for the current monitor.

', // Added - 2015-04-18 'OpEq' => 'rovno', - 'OpGt' => 'větší', - 'OpGtEq' => 'větší nebo rovno', + 'OpGt' => 'větĹĄĂ­', + 'OpGtEq' => 'větĹĄĂ­ nebo rovno', 'OpIn' => 'nin set', - 'OpLt' => 'menší', - 'OpLtEq' => 'menší nebo rovno', + 'OpLt' => 'menĹĄĂ­', + 'OpLtEq' => 'menĹĄĂ­ nebo rovno', 'OpMatches' => 'obsahuje', - 'OpNe' => 'nerovná se', + 'OpNe' => 'nerovnĂĄ se', 'OpNotIn' => 'nnot in set', 'OpNotMatches' => 'neobsahuje', - 'Open' => 'Otevřít', - 'OptionHelp' => 'MožnostHelp', - 'OptionRestartWarning' => 'Tyto změny se neprojeví\ndokud systém běží. Jakmile\ndokončíte provádění změn prosím\nrestartujte ZoneMinder.', - 'Options' => 'Možnosti', - 'OrEnterNewName' => 'nebo vložte nové jméno', - 'Order' => 'Pořadí', + 'Open' => 'Otevřít', + 'OptionHelp' => 'MoĹžnostHelp', + 'OptionRestartWarning' => 'Tyto změny se neprojevĂ­\ndokud systĂŠm běží. Jakmile\ndokončíte provĂĄděnĂ­ změn prosĂ­m\nrestartujte ZoneMinder.', + 'Options' => 'MoĹžnosti', + 'OrEnterNewName' => 'nebo vloĹžte novĂŠ jmĂŠno', + 'Order' => 'PořadĂ­', 'Orientation' => 'Orientace', 'Out' => 'Ven', - 'OverwriteExisting' => 'Přepsat existující', - 'Paged' => 'Strákově', - 'Pan' => 'Otáčení', + 'OverwriteExisting' => 'Přepsat existujĂ­cĂ­', + 'Paged' => 'StrĂĄkově', + 'Pan' => 'OtáčenĂ­', 'PanLeft' => 'Posunout vlevo', 'PanRight' => 'Posunout vpravo', - 'PanTilt' => 'Otáčení/Náklon', + 'PanTilt' => 'OtáčenĂ­/NĂĄklon', 'Parameter' => 'Parametr', 'Password' => 'Heslo', - 'PasswordsDifferent' => 'Hesla se neshodují', + 'PasswordsDifferent' => 'Hesla se neshodujĂ­', 'Paths' => 'Cesty', 'Pause' => 'Pause', 'Phone' => 'Modem', @@ -559,27 +559,27 @@ $SLANG = array( 'PixelDiff' => 'Pixel Diff', 'Pixels' => 'pixely', 'Play' => 'Play', - 'PlayAll' => 'Přehrát vše', - 'PleaseWait' => 'Prosím čekejte', + 'PlayAll' => 'PřehrĂĄt vĹĄe', + 'PleaseWait' => 'ProsĂ­m čekejte', 'Plugins' => 'Plugins', 'Point' => 'Point', - 'PostEventImageBuffer' => 'Pozáznamový bufer', - 'PreEventImageBuffer' => 'Předzáznamový bufer', + 'PostEventImageBuffer' => 'PozĂĄznamovĂ˝ bufer', + 'PreEventImageBuffer' => 'PředzĂĄznamovĂ˝ bufer', 'PreserveAspect' => 'Preserve Aspect Ratio', - 'Preset' => 'Předvolba', - 'Presets' => 'Předvolby', - 'Prev' => 'Zpět', + 'Preset' => 'Předvolba', + 'Presets' => 'Předvolby', + 'Prev' => 'Zpět', 'Probe' => 'Probe', // Added - 2009-03-31 'ProfileProbe' => 'Stream Probe', // Added - 2015-04-18 'ProfileProbeIntro' => 'The list below shows the existing stream profiles of the selected camera .

Select the desired entry from the list below.

Please note that ZoneMinder cannot configure additional profiles and that choosing a camera here may overwrite any values you already have configured for the current monitor.

', // Added - 2015-04-18 'Progress' => 'Progress', // Added - 2015-04-18 'Protocol' => 'Protocol', 'Rate' => 'Rychlost', - 'Real' => 'Skutečná', - 'Record' => 'Nahrávat', + 'Real' => 'SkutečnĂĄ', + 'Record' => 'NahrĂĄvat', 'RefImageBlendPct' => 'Reference Image Blend %ge', 'Refresh' => 'Obnovit', - 'Remote' => 'Síťová', + 'Remote' => 'SĂ­ĹĽovĂĄ', 'RemoteHostName' => 'Adresa', 'RemoteHostPath' => 'Cesta', 'RemoteHostPort' => 'Port', @@ -587,59 +587,59 @@ $SLANG = array( 'RemoteImageColours' => 'Barvy', 'RemoteMethod' => 'Remote Method', // Added - 2009-02-08 'RemoteProtocol' => 'Remote Protocol', // Added - 2009-02-08 - 'Rename' => 'Přejmenovat', + 'Rename' => 'Přejmenovat', 'Replay' => 'Replay', 'ReplayAll' => 'All Events', 'ReplayGapless' => 'Gapless Events', 'ReplaySingle' => 'Single Event', 'Reset' => 'Reset', - 'ResetEventCounts' => 'Resetovat počty záznamů', + 'ResetEventCounts' => 'Resetovat počty zĂĄznamĹŻ', 'Restart' => 'Restartovat', 'Restarting' => 'Restartuji', - 'RestrictedCameraIds' => 'Povolené id kamer', + 'RestrictedCameraIds' => 'PovolenĂŠ id kamer', 'RestrictedMonitors' => 'Restricted Monitors', - 'ReturnDelay' => 'Prodleva vracení', - 'ReturnLocation' => 'Lokace vrácení', + 'ReturnDelay' => 'Prodleva vracenĂ­', + 'ReturnLocation' => 'Lokace vrĂĄcenĂ­', 'Rewind' => 'Rewind', - 'RotateLeft' => 'Otočit vlevo', - 'RotateRight' => 'Otočit vpravo', + 'RotateLeft' => 'Otočit vlevo', + 'RotateRight' => 'Otočit vpravo', 'RunLocalUpdate' => 'Please run zmupdate.pl to update', // Added - 2011-05-25 - 'RunMode' => 'Režim', + 'RunMode' => 'ReĹžim', 'RunState' => 'Stav', - 'Running' => 'Běží', - 'Save' => 'Uložit', - 'SaveAs' => 'Uložit jako', - 'SaveFilter' => 'Uložit filtr', + 'Running' => 'Běží', + 'Save' => 'UloĹžit', + 'SaveAs' => 'UloĹžit jako', + 'SaveFilter' => 'UloĹžit filtr', 'Scale' => 'Velikost', - 'Score' => 'Skóre', - 'Secs' => 'Délka(s)', - 'Sectionlength' => 'Délka sekce', + 'Score' => 'SkĂłre', + 'Secs' => 'DĂŠlka(s)', + 'Sectionlength' => 'DĂŠlka sekce', 'Select' => 'Vybrat', 'SelectFormat' => 'Select Format', // Added - 2011-06-17 'SelectLog' => 'Select Log', // Added - 2011-06-17 'SelectMonitors' => 'Select Monitors', 'SelfIntersecting' => 'Polygon edges must not intersect', 'Set' => 'Nastavit', - 'SetNewBandwidth' => 'Nastavit novou rychlost sítě', - 'SetPreset' => 'Nastavit předvolbu', - 'Settings' => 'Nastavení', + 'SetNewBandwidth' => 'Nastavit novou rychlost sĂ­tě', + 'SetPreset' => 'Nastavit předvolbu', + 'Settings' => 'NastavenĂ­', 'ShowFilterWindow' => 'Zobrazit filtr', - 'ShowTimeline' => 'Zobrazit časovou linii ', + 'ShowTimeline' => 'Zobrazit časovou linii ', 'SignalCheckColour' => 'Signal Check Colour', 'Size' => 'Velikost', 'SkinDescription' => 'Change the default skin for this computer', // Added - 2011-01-30 - 'Sleep' => 'Spát', - 'SortAsc' => 'Vzestupně', - 'SortBy' => 'Řadit dle', - 'SortDesc' => 'Sestupně', + 'Sleep' => 'SpĂĄt', + 'SortAsc' => 'Vzestupně', + 'SortBy' => 'Řadit dle', + 'SortDesc' => 'Sestupně', 'Source' => 'Zdroj', 'SourceColours' => 'Source Colours', // Added - 2009-02-08 'SourcePath' => 'Source Path', // Added - 2009-02-08 'SourceType' => 'Typ zdroje', 'Speed' => 'Rychlost', - 'SpeedHigh' => 'Vysoká rychlost', - 'SpeedLow' => 'Nízká rychlost', - 'SpeedMedium' => 'Střední rychlost', + 'SpeedHigh' => 'VysokĂĄ rychlost', + 'SpeedLow' => 'NĂ­zkĂĄ rychlost', + 'SpeedMedium' => 'StřednĂ­ rychlost', 'SpeedTurbo' => 'Turbo rychlost', 'Start' => 'Start', 'State' => 'Stav', @@ -648,11 +648,11 @@ $SLANG = array( 'Step' => 'Krok', 'StepBack' => 'Step Back', 'StepForward' => 'Step Forward', - 'StepLarge' => 'Velký krok', - 'StepMedium' => 'Střední krok', - 'StepNone' => 'Žádný krok', - 'StepSmall' => 'Malý krok', - 'Stills' => 'Snímky', + 'StepLarge' => 'VelkĂ˝ krok', + 'StepMedium' => 'StřednĂ­ krok', + 'StepNone' => 'ŽådnĂ˝ krok', + 'StepSmall' => 'MalĂ˝ krok', + 'Stills' => 'SnĂ­mky', 'Stop' => 'Zastavit', 'Stopped' => 'Zastaven', 'Stream' => 'Stream', @@ -661,87 +661,87 @@ $SLANG = array( 'System' => 'System', 'SystemLog' => 'System Log', // Added - 2011-06-16 'TargetColorspace' => 'Target colorspace', // Added - 2015-04-18 - 'Tele' => 'Přiblížit', + 'Tele' => 'PřiblĂ­Ĺžit', 'Thumbnail' => 'Miniatura', - 'Tilt' => 'Náklon', - 'Time' => 'Čas', - 'TimeDelta' => 'Delta času', - 'TimeStamp' => 'Časové razítko', - 'Timeline' => 'Časová linie', + 'Tilt' => 'NĂĄklon', + 'Time' => 'Čas', + 'TimeDelta' => 'Delta času', + 'TimeStamp' => 'ČasovĂŠ razĂ­tko', + 'Timeline' => 'ČasovĂĄ linie', 'TimelineTip1' => 'Pass your mouse over the graph to view a snapshot image and event details.', // Added 2013.08.15. 'TimelineTip2' => 'Click on the coloured sections of the graph, or the image, to view the event.', // Added 2013.08.15. 'TimelineTip3' => 'Click on the background to zoom in to a smaller time period based around your click.', // Added 2013.08.15. 'TimelineTip4' => 'Use the controls below to zoom out or navigate back and forward through the time range.', // Added 2013.08.15. - 'Timestamp' => 'Razítko', - 'TimestampLabelFormat' => 'Formát časového razítka', - 'TimestampLabelX' => 'Časové razítko X', - 'TimestampLabelY' => 'Časové razítko Y', + 'Timestamp' => 'RazĂ­tko', + 'TimestampLabelFormat' => 'FormĂĄt časovĂŠho razĂ­tka', + 'TimestampLabelX' => 'ČasovĂŠ razĂ­tko X', + 'TimestampLabelY' => 'ČasovĂŠ razĂ­tko Y', 'Today' => 'Dnes', - 'Tools' => 'Nástroje', + 'Tools' => 'NĂĄstroje', 'Total' => 'Total', // Added - 2011-06-16 - 'TotalBrScore' => 'Celkové
skóre', - 'TrackDelay' => 'Prodleva dráhy', - 'TrackMotion' => 'Pohyb po dráze', + 'TotalBrScore' => 'CelkovĂŠ
skĂłre', + 'TrackDelay' => 'Prodleva drĂĄhy', + 'TrackMotion' => 'Pohyb po drĂĄze', 'Triggers' => 'Trigery', - 'TurboPanSpeed' => 'Rychlost Turbo otáčení', - 'TurboTiltSpeed' => 'Rychlost Turbo náklonu', + 'TurboPanSpeed' => 'Rychlost Turbo otáčenĂ­', + 'TurboTiltSpeed' => 'Rychlost Turbo nĂĄklonu', 'Type' => 'Typ', 'Unarchive' => 'Vyjmout z archivu', 'Undefined' => 'Undefined', // Added - 2009-02-08 'Units' => 'Jednotky', - 'Unknown' => 'Neznámý', + 'Unknown' => 'NeznĂĄmĂ˝', 'Update' => 'Update', - 'UpdateAvailable' => 'Je dostupný nový update ZoneMinder.', - 'UpdateNotNecessary' => 'Update není potřeba.', + 'UpdateAvailable' => 'Je dostupnĂ˝ novĂ˝ update ZoneMinder.', + 'UpdateNotNecessary' => 'Update nenĂ­ potřeba.', 'Updated' => 'Updated', // Added - 2011-06-16 'Upload' => 'Upload', // Added - 2011-08-23 - 'UseFilter' => 'Použít filtr', - 'UseFilterExprsPost' => ' výrazů', // This is used at the end of the phrase 'use N filter expressions' - 'UseFilterExprsPre' => 'Použít ', // This is used at the beginning of the phrase 'use N filter expressions' + 'UseFilter' => 'PouŞít filtr', + 'UseFilterExprsPost' => ' vĂ˝razĹŻ', // This is used at the end of the phrase 'use N filter expressions' + 'UseFilterExprsPre' => 'PouŞít ', // This is used at the beginning of the phrase 'use N filter expressions' 'UsedPlugins' => 'Used Plugins', - 'User' => 'Uživatel', - 'Username' => 'Uživatelské jméno', - 'Users' => 'Uživatelé', + 'User' => 'UĹživatel', + 'Username' => 'UĹživatelskĂŠ jmĂŠno', + 'Users' => 'UĹživatelĂŠ', 'V4L' => 'V4L', // Added - 2015-04-18 'V4LCapturesPerFrame' => 'Captures Per Frame', // Added - 2015-04-18 'V4LMultiBuffer' => 'Multi Buffering', // Added - 2015-04-18 'Value' => 'Hodnota', 'Version' => 'Verze', 'VersionIgnore' => 'Ignorovat tuto verzi', - 'VersionRemindDay' => 'Připomenout za 1 den', - 'VersionRemindHour' => 'Připomenout za hodinu', - 'VersionRemindNever' => 'Nepřipomínat nové veze', - 'VersionRemindWeek' => 'Připomenout za týden', + 'VersionRemindDay' => 'Připomenout za 1 den', + 'VersionRemindHour' => 'Připomenout za hodinu', + 'VersionRemindNever' => 'NepřipomĂ­nat novĂŠ veze', + 'VersionRemindWeek' => 'Připomenout za tĂ˝den', 'Video' => 'Video', - 'VideoFormat' => 'Video formát', - 'VideoGenFailed' => 'Chyba při generování videa!', - 'VideoGenFiles' => 'Existující video soubory', - 'VideoGenNoFiles' => 'Žádné video soubory nenalezeny', - 'VideoGenParms' => 'Parametry generování videa', - 'VideoGenSucceeded' => 'Video vygenerováno úspěšně!', + 'VideoFormat' => 'Video formĂĄt', + 'VideoGenFailed' => 'Chyba při generovĂĄnĂ­ videa!', + 'VideoGenFiles' => 'ExistujĂ­cĂ­ video soubory', + 'VideoGenNoFiles' => 'ŽådnĂŠ video soubory nenalezeny', + 'VideoGenParms' => 'Parametry generovĂĄnĂ­ videa', + 'VideoGenSucceeded' => 'Video vygenerovĂĄno Ăşspěšně!', 'VideoSize' => 'Velikost videa', 'View' => 'Zobrazit', - 'ViewAll' => 'Zobrazit všechny', - 'ViewEvent' => 'Zobrazit záznam', - 'ViewPaged' => 'Zobrazit strákově', + 'ViewAll' => 'Zobrazit vĹĄechny', + 'ViewEvent' => 'Zobrazit zĂĄznam', + 'ViewPaged' => 'Zobrazit strĂĄkově', 'Wake' => 'Vzbudit', - 'WarmupFrames' => 'Zahřívací snímky', + 'WarmupFrames' => 'ZahřívacĂ­ snĂ­mky', 'Watch' => 'Sledovat', 'Web' => 'Web', - 'WebColour' => 'Webová barva', - 'Week' => 'Týden', - 'White' => 'Bílá', - 'WhiteBalance' => 'Vyvážení bílé', - 'Wide' => 'Oddálit', + 'WebColour' => 'WebovĂĄ barva', + 'Week' => 'TĂ˝den', + 'White' => 'BĂ­lĂĄ', + 'WhiteBalance' => 'VyvĂĄĹženĂ­ bĂ­lĂŠ', + 'Wide' => 'OddĂĄlit', 'X' => 'X', 'X10' => 'X10', - 'X10ActivationString' => 'X10 aktivační řetězec', - 'X10InputAlarmString' => 'X10 input alarm řetězec', - 'X10OutputAlarmString' => 'X10 output alarm řetězec', + 'X10ActivationString' => 'X10 aktivačnĂ­ řetězec', + 'X10InputAlarmString' => 'X10 input alarm řetězec', + 'X10OutputAlarmString' => 'X10 output alarm řetězec', 'Y' => 'Y', 'Yes' => 'Ano', - 'YouNoPerms' => 'K tomuto zdroji nemáte oprávnění.', - 'Zone' => 'Zóna', + 'YouNoPerms' => 'K tomuto zdroji nemĂĄte oprĂĄvněnĂ­.', + 'Zone' => 'ZĂłna', 'ZoneAlarmColour' => 'Barva alarmu (Red/Green/Blue)', 'ZoneArea' => 'Zone Area', 'ZoneExtendAlarmFrames' => 'Extend Alarm Frame Count', @@ -753,21 +753,21 @@ $SLANG = array( 'ZoneMinMaxPixelThres' => 'Min/Max Pixel Threshold (0-255)', 'ZoneMinderLog' => 'ZoneMinder Log', // Added - 2011-06-17 'ZoneOverloadFrames' => 'Overload Frame Ignore Count', - 'Zones' => 'Zóny', + 'Zones' => 'ZĂłny', 'Zoom' => 'Zoom', - 'ZoomIn' => 'Zvětšit', - 'ZoomOut' => 'Zmenšit', + 'ZoomIn' => 'ZvětĹĄit', + 'ZoomOut' => 'ZmenĹĄit', ); // Complex replacements with formatting and/or placements, must be passed through sprintf $CLANG = array( - 'CurrentLogin' => 'Právě je přihlášen \'%1$s\'', + 'CurrentLogin' => 'PrĂĄvě je přihlĂĄĹĄen \'%1$s\'', 'EventCount' => '%1$s %2$s', // For example '37 Events' (from Vlang below) - 'LastEvents' => 'Posledních %1$s %2$s', // For example 'Last 37 Events' (from Vlang below) - 'LatestRelease' => 'Poslední verze je v%1$s, vy máte v%2$s.', + 'LastEvents' => 'PoslednĂ­ch %1$s %2$s', // For example 'Last 37 Events' (from Vlang below) + 'LatestRelease' => 'PoslednĂ­ verze je v%1$s, vy mĂĄte v%2$s.', 'MonitorCount' => '%1$s %2$s', // For example '4 Monitors' (from Vlang below) 'MonitorFunction' => 'Funkce %1$s kamery', - 'RunningRecentVer' => 'Používáte poslední verzi ZoneMinder, v%s.', + 'RunningRecentVer' => 'PouŞívĂĄte poslednĂ­ verzi ZoneMinder, v%s.', 'VersionMismatch' => 'Version mismatch, system is version %1$s, database is %2$s.', // Added - 2011-05-25 ); @@ -805,7 +805,7 @@ $CLANG = array( // Variable arrays expressing plurality, see the zmVlang description above $VLANG = array( - 'Event' => array( 0=>'Záznamů', 1=>'Záznam', 2=>'Záznamy', 5=>'Záznamů' ), + 'Event' => array( 0=>'ZĂĄznamĹŻ', 1=>'ZĂĄznam', 2=>'ZĂĄznamy', 5=>'ZĂĄznamĹŻ' ), 'Monitor' => array( 0=>'Kamer', 1=>'Kamera', 2=>'Kamery', 5=>'Kamer' ), ); From 06923d44ba8ecd0ec02ab424ad998720e369e206 Mon Sep 17 00:00:00 2001 From: Andy Bauer Date: Mon, 6 Jun 2016 16:27:13 -0500 Subject: [PATCH 05/11] Set VIDEO_MAX_FRAME if it is not defined --- src/zm_local_camera.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/zm_local_camera.h b/src/zm_local_camera.h index 335c06ce7..fd73d895d 100644 --- a/src/zm_local_camera.h +++ b/src/zm_local_camera.h @@ -105,6 +105,11 @@ protected: static V4L1Data v4l1_data; #endif // ZM_HAS_V4L1 +// Required on systems with v4l1 but without v4l2 headers +#ifndef VIDEO_MAX_FRAME +#define VIDEO_MAX_FRAME 32 +#endif + #if HAVE_LIBSWSCALE static AVFrame **capturePictures; _AVPIXELFORMAT imagePixFormat; From f289b849013b0604d7386c3183b1aeb096d6ae9b Mon Sep 17 00:00:00 2001 From: Andrew Bauer Date: Mon, 6 Jun 2016 19:04:02 -0500 Subject: [PATCH 06/11] move VIDEO_MAX_FRAME up --- src/zm_local_camera.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/zm_local_camera.h b/src/zm_local_camera.h index fd73d895d..db0a1c671 100644 --- a/src/zm_local_camera.h +++ b/src/zm_local_camera.h @@ -36,6 +36,11 @@ #include #endif // HAVE_LINUX_VIDEODEV2_H +// Required on systems with v4l1 but without v4l2 headers +#ifndef VIDEO_MAX_FRAME +#define VIDEO_MAX_FRAME 32 +#endif + #include "zm_ffmpeg.h" // @@ -105,11 +110,6 @@ protected: static V4L1Data v4l1_data; #endif // ZM_HAS_V4L1 -// Required on systems with v4l1 but without v4l2 headers -#ifndef VIDEO_MAX_FRAME -#define VIDEO_MAX_FRAME 32 -#endif - #if HAVE_LIBSWSCALE static AVFrame **capturePictures; _AVPIXELFORMAT imagePixFormat; From 1069b301a0076ef94f0df1d39166e1014a25236f Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Sun, 12 Jun 2016 15:38:59 -0400 Subject: [PATCH 07/11] functions have been moved from ConfigAdmin to Config --- .../ZoneMinder/lib/ZoneMinder/ConfigAdmin.pm | 276 ------------------ scripts/zmupdate.pl.in | 1 - 2 files changed, 277 deletions(-) delete mode 100644 scripts/ZoneMinder/lib/ZoneMinder/ConfigAdmin.pm diff --git a/scripts/ZoneMinder/lib/ZoneMinder/ConfigAdmin.pm b/scripts/ZoneMinder/lib/ZoneMinder/ConfigAdmin.pm deleted file mode 100644 index f586448fb..000000000 --- a/scripts/ZoneMinder/lib/ZoneMinder/ConfigAdmin.pm +++ /dev/null @@ -1,276 +0,0 @@ -# ========================================================================== -# -# ZoneMinder Config Admin Module, $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 -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# ========================================================================== -# -# This module contains the debug definitions and functions used by the rest -# of the ZoneMinder scripts -# -package ZoneMinder::ConfigAdmin; - -use 5.006; -use strict; -use warnings; - -require Exporter; -require ZoneMinder::Base; - -our @ISA = qw(Exporter ZoneMinder::Base); - -# Items to export into callers namespace by default. Note: do not export -# names by default without a very good reason. Use EXPORT_OK instead. -# Do not simply export all your public functions/methods/constants. - -# This allows declaration use ZoneMinder ':all'; -# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK -# will save memory. -our %EXPORT_TAGS = ( - 'functions' => [ qw( - loadConfigFromDB - saveConfigToDB - ) ] -); -push( @{$EXPORT_TAGS{all}}, @{$EXPORT_TAGS{$_}} ) foreach keys %EXPORT_TAGS; - -our @EXPORT_OK = ( @{ $EXPORT_TAGS{'functions'} } ); - -our @EXPORT = qw(); - -our $VERSION = $ZoneMinder::Base::VERSION; - -# ========================================================================== -# -# Configuration Administration -# -# ========================================================================== - -use ZoneMinder::Config qw(:all); -use ZoneMinder::ConfigData qw(:all); - -use Carp; - -sub loadConfigFromDB -{ - print( "Loading config from DB\n" ); - my $dbh = DBI->connect( "DBI:mysql:database=".$Config{ZM_DB_NAME} - .";host=".$Config{ZM_DB_HOST} - ,$Config{ZM_DB_USER} - ,$Config{ZM_DB_PASS} - ); - - if ( !$dbh ) - { - print( "Error: unable to load options from database: $DBI::errstr\n" ); - return( 0 ); - } - my $sql = "select * from Config"; - my $sth = $dbh->prepare_cached( $sql ) - or croak( "Can't prepare '$sql': ".$dbh->errstr() ); - my $res = $sth->execute() - or croak( "Can't execute: ".$sth->errstr() ); - my $option_count = 0; - while( my $config = $sth->fetchrow_hashref() ) - { - my ( $name, $value ) = ( $config->{Name}, $config->{Value} ); - #print( "Name = '$name'\n" ); - my $option = $options_hash{$name}; - if ( !$option ) - { - warn( "No option '$name' found, removing" ); - next; - } - #next if ( $option->{category} eq 'hidden' ); - if ( defined($value) ) - { - if ( $option->{type} == $types{boolean} ) - { - $option->{value} = $value?"yes":"no"; - } - else - { - $option->{value} = $value; - } - } - $option_count++;; - } - $sth->finish(); - $dbh->disconnect(); - return( $option_count ); -} - -sub saveConfigToDB -{ - print( "Saving config to DB\n" ); - my $dbh = DBI->connect( "DBI:mysql:database=".$Config{ZM_DB_NAME} - .";host=".$Config{ZM_DB_HOST} - ,$Config{ZM_DB_USER} - ,$Config{ZM_DB_PASS} - ); - - if ( !$dbh ) - { - print( "Error: unable to save options to database: $DBI::errstr\n" ); - return( 0 ); - } - - my $ac = $dbh->{AutoCommit}; - $dbh->{AutoCommit} = 0; - - $dbh->do('LOCK TABLE Config WRITE') - or croak( "Can't lock Config table: " . $dbh->errstr() ); - - my $sql = "delete from Config"; - my $res = $dbh->do( $sql ) - or croak( "Can't do '$sql': ".$dbh->errstr() ); - - $sql = "replace into Config set Id = ?, Name = ?, Value = ?, Type = ?, DefaultValue = ?, Hint = ?, Pattern = ?, Format = ?, Prompt = ?, Help = ?, Category = ?, Readonly = ?, Requires = ?"; - my $sth = $dbh->prepare_cached( $sql ) - or croak( "Can't prepare '$sql': ".$dbh->errstr() ); - foreach my $option ( @options ) - { - #next if ( $option->{category} eq 'hidden' ); - #print( $option->{name}."\n" ) if ( !$option->{category} ); - $option->{db_type} = $option->{type}->{db_type}; - $option->{db_hint} = $option->{type}->{hint}; - $option->{db_pattern} = $option->{type}->{pattern}; - $option->{db_format} = $option->{type}->{format}; - if ( $option->{db_type} eq "boolean" ) - { - $option->{db_value} = ($option->{value} eq "yes") - ? "1" - : "0" - ; - } - else - { - $option->{db_value} = $option->{value}; - } - if ( my $requires = $option->{requires} ) - { - $option->{db_requires} = join( ";", - map { - my $value = $_->{value}; - $value = ($value eq "yes") - ? 1 - : 0 - if ( $options_hash{$_->{name}}->{db_type} eq "boolean" ) - ; ( "$_->{name}=$value" ) - } @$requires - ); - } - else - { - } - my $res = $sth->execute( - $option->{id}, - $option->{name}, - $option->{db_value}, - $option->{db_type}, - $option->{default}, - $option->{db_hint}, - $option->{db_pattern}, - $option->{db_format}, - $option->{description}, - $option->{help}, - $option->{category}, - $option->{readonly} ? 1 : 0, - $option->{db_requires} - ) or croak( "Can't execute: ".$sth->errstr() ); - } - $sth->finish(); - - $dbh->do('UNLOCK TABLES'); - $dbh->{AutoCommit} = $ac; - - $dbh->disconnect(); -} - -1; -__END__ - -=head1 NAME - -ZoneMinder::ConfigAdmin - ZoneMinder Configuration Administration module - -=head1 SYNOPSIS - - use ZoneMinder::ConfigAdmin; - use ZoneMinder::ConfigAdmin qw(:all); - - loadConfigFromDB(); - saveConfigToDB(); - -=head1 DESCRIPTION - -The ZoneMinder:ConfigAdmin module contains the master definition of the -ZoneMinder configuration options as well as helper methods. This module is -intended for specialist confguration management and would not normally be -used by end users. - -The configuration held in this module, which was previously in zmconfig.pl, -includes the name, default value, description, help text, type and category -for each option, as well as a number of additional fields in a small number -of cases. - -=head1 METHODS - -=over 4 - -=item loadConfigFromDB (); - -Loads existing configuration from the database (if any) and merges it with -the definitions held in this module. This results in the merging of any new -configuration and the removal of any deprecated configuration while -preserving the existing values of every else. - -=item saveConfigToDB (); - -Saves configuration held in memory to the database. The act of loading and -saving configuration is a convenient way to ensure that the configuration -held in the database corresponds with the most recent definitions and that -all components are using the same set of configuration. - -=back - -=head2 EXPORT - -None by default. -The :data tag will export the various configuration data structures -The :functions tag will export the helper functions. -The :all tag will export all above symbols. - - -=head1 SEE ALSO - -http://www.zoneminder.com - -=head1 AUTHOR - -Philip Coombes, Ephilip.coombes@zoneminder.comE - -=head1 COPYRIGHT AND LICENSE - -Copyright (C) 2001-2008 Philip Coombes - -This library is free software; you can redistribute it and/or modify -it under the same terms as Perl itself, either Perl version 5.8.3 or, -at your option, any later version of Perl 5 you may have available. - - -=cut diff --git a/scripts/zmupdate.pl.in b/scripts/zmupdate.pl.in index ccc76ba02..c0dcd3868 100644 --- a/scripts/zmupdate.pl.in +++ b/scripts/zmupdate.pl.in @@ -72,7 +72,6 @@ use ZoneMinder::Config qw(:all); use ZoneMinder::Logger qw(:all); use ZoneMinder::General qw(:all); use ZoneMinder::Database qw(:all); -use ZoneMinder::ConfigAdmin qw( :functions ); use POSIX; use DBI; use Getopt::Long; From f804f7739dd5f55290a1f188360389a8b48bac6a Mon Sep 17 00:00:00 2001 From: Steve Gilvarry Date: Tue, 14 Jun 2016 20:49:38 +1000 Subject: [PATCH 08/11] Adjust download file path to swap path to match the file generated. --- web/ajax/log.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/ajax/log.php b/web/ajax/log.php index a250c952d..66dcfc2b5 100644 --- a/web/ajax/log.php +++ b/web/ajax/log.php @@ -394,7 +394,7 @@ tr.log-dbg td { } $exportFile = "zm-log.$exportExt"; - $exportPath = "temp/zm-log-$exportKey.$exportExt"; + $exportPath = ZM_PATH_SWAP."/zm-log-$exportKey.$exportExt"; header( "Pragma: public" ); header( "Expires: 0" ); From 08c8da3e8f19089028fa7f72decfe3dffc504a7f Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Fri, 17 Jun 2016 11:37:20 -0400 Subject: [PATCH 09/11] fix extra else and some whitespace --- src/zm_remote_camera_rtsp.cpp | 143 +++++++++++++++++----------------- 1 file changed, 70 insertions(+), 73 deletions(-) diff --git a/src/zm_remote_camera_rtsp.cpp b/src/zm_remote_camera_rtsp.cpp index 32a216231..473bc4409 100644 --- a/src/zm_remote_camera_rtsp.cpp +++ b/src/zm_remote_camera_rtsp.cpp @@ -428,97 +428,95 @@ int RemoteCameraRtsp::CaptureAndRecord( Image &image, bool recording, char* even // Why are we checking for it being the video stream if ( packet.stream_index == mVideoStreamId ) { - while ( !frameComplete && buffer.size() > 0 ) - { - packet.data = buffer.head(); - packet.size = buffer.size(); + while ( !frameComplete && buffer.size() > 0 ) { + packet.data = buffer.head(); + packet.size = buffer.size(); - // So this does the decode + // So this does the decode #if LIBAVCODEC_VERSION_CHECK(52, 23, 0, 23, 0) - int len = avcodec_decode_video2( mCodecContext, mRawFrame, &frameComplete, &packet ); + int len = avcodec_decode_video2( mCodecContext, mRawFrame, &frameComplete, &packet ); #else - int len = avcodec_decode_video( mCodecContext, mRawFrame, &frameComplete, packet.data, packet.size ); + int len = avcodec_decode_video( mCodecContext, mRawFrame, &frameComplete, packet.data, packet.size ); #endif - if ( len < 0 ) - { - Error( "Error while decoding frame %d", frameCount ); - Hexdump( Logger::ERROR, buffer.head(), buffer.size()>256?256:buffer.size() ); - buffer.clear(); - continue; - } - Debug( 2, "Frame: %d - %d/%d", frameCount, len, buffer.size() ); - //if ( buffer.size() < 400 ) - //Hexdump( 0, buffer.head(), buffer.size() ); - - buffer -= len; - } // end while get & decode a frame + if ( len < 0 ) { + Error( "Error while decoding frame %d", frameCount ); + Hexdump( Logger::ERROR, buffer.head(), buffer.size()>256?256:buffer.size() ); + buffer.clear(); + continue; + } + Debug( 2, "Frame: %d - %d/%d", frameCount, len, buffer.size() ); + //if ( buffer.size() < 400 ) + //Hexdump( 0, buffer.head(), buffer.size() ); + + buffer -= len; + } // end while get & decode a frame + + if ( frameComplete ) { + + Debug( 3, "Got frame %d", frameCount ); - if ( frameComplete ) { - - Debug( 3, "Got frame %d", frameCount ); - #if LIBAVUTIL_VERSION_CHECK(54, 6, 0, 6, 0) - av_image_fill_arrays(mFrame->data, mFrame->linesize, - directbuffer, imagePixFormat, width, height, 1); + av_image_fill_arrays(mFrame->data, mFrame->linesize, + directbuffer, imagePixFormat, width, height, 1); #else - avpicture_fill( (AVPicture *)mFrame, directbuffer, - imagePixFormat, width, height); + avpicture_fill( (AVPicture *)mFrame, directbuffer, + imagePixFormat, width, height); #endif - - //Video recording - if ( recording && !wasRecording ) { - //Instantiate the video storage module - videoStore = new VideoStore((const char *)event_file, "mp4", mFormatContext->streams[mVideoStreamId],mAudioStreamId==-1?NULL:mFormatContext->streams[mAudioStreamId],startTime); - wasRecording = true; - strcpy(oldDirectory, event_file); + //Video recording + if ( recording && !wasRecording ) { + //Instantiate the video storage module - } else if ( !recording && wasRecording && videoStore ) { - // Why are we deleting the videostore? Becase for soem reason we are no longer recording? How does that happen? - Info("Deleting videoStore instance"); - delete videoStore; - videoStore = NULL; - } + videoStore = new VideoStore((const char *)event_file, "mp4", mFormatContext->streams[mVideoStreamId],mAudioStreamId==-1?NULL:mFormatContext->streams[mAudioStreamId],startTime); + wasRecording = true; + strcpy(oldDirectory, event_file); - //The directory we are recording to is no longer tied to the current event. Need to re-init the videostore with the correct directory and start recording again - if ( recording && wasRecording && (strcmp(oldDirectory, event_file)!=0) && (packet.flags & AV_PKT_FLAG_KEY) ) { - //don't open new videostore until we're on a key frame..would this require an offset adjustment for the event as a result?...if we store our key frame location with the event will that be enough? - Info("Re-starting video storage module"); - if ( videoStore ) { - delete videoStore; - videoStore = NULL; - } + } else if ( !recording && wasRecording && videoStore ) { + // Why are we deleting the videostore? Becase for soem reason we are no longer recording? How does that happen? + Info("Deleting videoStore instance"); + delete videoStore; + videoStore = NULL; + } - videoStore = new VideoStore((const char *)event_file, "mp4", mFormatContext->streams[mVideoStreamId],mAudioStreamId==-1?NULL:mFormatContext->streams[mAudioStreamId],startTime); - strcpy( oldDirectory, event_file ); - } + //The directory we are recording to is no longer tied to the current event. Need to re-init the videostore with the correct directory and start recording again + if ( recording && wasRecording && (strcmp(oldDirectory, event_file)!=0) && (packet.flags & AV_PKT_FLAG_KEY) ) { + //don't open new videostore until we're on a key frame..would this require an offset adjustment for the event as a result?...if we store our key frame location with the event will that be enough? + Info("Re-starting video storage module"); + if ( videoStore ) { + delete videoStore; + videoStore = NULL; + } - if ( videoStore && recording ) { - //Write the packet to our video store - int ret = videoStore->writeVideoFramePacket(&packet, mFormatContext->streams[mVideoStreamId]);//, &lastKeyframePkt); - if ( ret < 0 ) {//Less than zero and we skipped a frame - av_free_packet( &packet ); - return 0; - } - } + videoStore = new VideoStore((const char *)event_file, "mp4", mFormatContext->streams[mVideoStreamId],mAudioStreamId==-1?NULL:mFormatContext->streams[mAudioStreamId],startTime); + strcpy( oldDirectory, event_file ); + } + + if ( videoStore && recording ) { + //Write the packet to our video store + int ret = videoStore->writeVideoFramePacket(&packet, mFormatContext->streams[mVideoStreamId]);//, &lastKeyframePkt); + if ( ret < 0 ) {//Less than zero and we skipped a frame + av_free_packet( &packet ); + return 0; + } + } #if HAVE_LIBSWSCALE - if(mConvertContext == NULL) { - mConvertContext = sws_getContext( mCodecContext->width, mCodecContext->height, mCodecContext->pix_fmt, width, height, imagePixFormat, SWS_BICUBIC, NULL, NULL, NULL ); + if(mConvertContext == 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"); - } - - 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(mConvertContext == NULL) + Fatal( "Unable to create conversion context"); + } + + 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 RTSP cameras" ); + Fatal( "You must compile ffmpeg with the --enable-swscale option to use RTSP cameras" ); #endif // HAVE_LIBSWSCALE - - frameCount++; - } /* frame complete */ + frameCount++; + + } /* frame complete */ } else if ( packet.stream_index == mAudioStreamId ) { Debug( 4, "Got audio packet" ); if ( videoStore && recording ) { @@ -534,7 +532,6 @@ int RemoteCameraRtsp::CaptureAndRecord( Image &image, bool recording, char* even #endif return 0; } - } else { } } // end if video or audio packet From d8f6cc952dce2e165c7fc12a623480b6428b6fd8 Mon Sep 17 00:00:00 2001 From: Steve Gilvarry Date: Sun, 19 Jun 2016 07:22:14 +1000 Subject: [PATCH 10/11] Fix missing } from merge that was preventing building. --- src/zm_remote_camera_rtsp.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/zm_remote_camera_rtsp.cpp b/src/zm_remote_camera_rtsp.cpp index 473bc4409..85f7af340 100644 --- a/src/zm_remote_camera_rtsp.cpp +++ b/src/zm_remote_camera_rtsp.cpp @@ -532,6 +532,7 @@ int RemoteCameraRtsp::CaptureAndRecord( Image &image, bool recording, char* even #endif return 0; } + } } } // end if video or audio packet From dfc885a12aa691fa4073a5ee2e2348304cfefe77 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Tue, 21 Jun 2016 12:25:13 -0400 Subject: [PATCH 11/11] fix tabs --- src/zm_videostore.cpp | 539 +++++++++++++++++++++--------------------- 1 file changed, 269 insertions(+), 270 deletions(-) diff --git a/src/zm_videostore.cpp b/src/zm_videostore.cpp index 5ef0a9724..47c1be13d 100644 --- a/src/zm_videostore.cpp +++ b/src/zm_videostore.cpp @@ -33,315 +33,314 @@ extern "C"{ } VideoStore::VideoStore(const char *filename_in, const char *format_in, - AVStream *input_st, - AVStream *inpaud_st, - int64_t nStartTime) { - - AVDictionary *pmetadata = NULL; - int dsr; + AVStream *input_st, + AVStream *inpaud_st, + int64_t nStartTime + ) { - //store inputs in variables local to class - filename = filename_in; - format = format_in; - - keyframeMessage = false; - keyframeSkipNumber = 0; + AVDictionary *pmetadata = NULL; + int dsr; - Info("Opening video storage stream %s format: %d\n", filename, format); + //store inputs in variables local to class + filename = filename_in; + format = format_in; - //Init everything we need - int ret; - av_register_all(); + keyframeMessage = false; + keyframeSkipNumber = 0; - ret = avformat_alloc_output_context2(&oc, NULL, NULL, filename); - if ( ret < 0 ) { - Warning("Could not create video storage stream %s as no output context" - " could be assigned based on filename: %s", - filename, - av_make_error_string(ret).c_str() - ); - } - - //Couldn't deduce format from filename, trying from format name + Info("Opening video storage stream %s format: %d\n", filename, format); + + //Init everything we need + int ret; + av_register_all(); + + ret = avformat_alloc_output_context2(&oc, NULL, NULL, filename); + if ( ret < 0 ) { + Warning("Could not create video storage stream %s as no output context" + " could be assigned based on filename: %s", + filename, + av_make_error_string(ret).c_str() + ); + } + + //Couldn't deduce format from filename, trying from format name + if (!oc) { + avformat_alloc_output_context2(&oc, NULL, format, filename); if (!oc) { - avformat_alloc_output_context2(&oc, NULL, format, filename); - if (!oc) { - Fatal("Could not create video storage stream %s as no output context" - " could not be assigned based on filename or format %s", - filename, format); - } + Fatal("Could not create video storage stream %s as no output context" + " could not be assigned based on filename or format %s", + filename, format); } + } - dsr = av_dict_set(&pmetadata, "title", "Zoneminder Security Recording", 0); - if (dsr < 0) Warning("%s:%d: title set failed", __FILE__, __LINE__ ); + dsr = av_dict_set(&pmetadata, "title", "Zoneminder Security Recording", 0); + if (dsr < 0) Warning("%s:%d: title set failed", __FILE__, __LINE__ ); - oc->metadata = pmetadata; - - fmt = oc->oformat; - - video_st = avformat_new_stream(oc, input_st->codec->codec); - if (!video_st) { - Fatal("Unable to create video out stream\n"); - } - - ret = avcodec_copy_context(video_st->codec, input_st->codec); - if (ret < 0) { - Fatal("Unable to copy input video context to output video context " - "%s\n", av_make_error_string(ret).c_str()); - } + oc->metadata = pmetadata; - video_st->codec->codec_tag = 0; - if (oc->oformat->flags & AVFMT_GLOBALHEADER) { - video_st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER; - } - - if (inpaud_st) { - audio_st = avformat_new_stream(oc, inpaud_st->codec->codec); - if (!audio_st) { - Error("Unable to create audio out stream\n"); - audio_st = NULL; - } else { - ret=avcodec_copy_context(audio_st->codec, inpaud_st->codec); - if (ret < 0) { - Fatal("Unable to copy audio context %s\n", av_make_error_string(ret).c_str()); - } - audio_st->codec->codec_tag = 0; - if (oc->oformat->flags & AVFMT_GLOBALHEADER) { - audio_st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER; - } - } + fmt = oc->oformat; + + video_st = avformat_new_stream(oc, input_st->codec->codec); + if (!video_st) { + Fatal("Unable to create video out stream\n"); + } + + ret = avcodec_copy_context(video_st->codec, input_st->codec); + if (ret < 0) { + Fatal("Unable to copy input video context to output video context " + "%s\n", av_make_error_string(ret).c_str()); + } + + video_st->codec->codec_tag = 0; + if (oc->oformat->flags & AVFMT_GLOBALHEADER) { + video_st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER; + } + + if (inpaud_st) { + audio_st = avformat_new_stream(oc, inpaud_st->codec->codec); + if (!audio_st) { + Error("Unable to create audio out stream\n"); + audio_st = NULL; } else { - Debug(3, "No Audio output stream"); - audio_st = NULL; - } - - /* open the output file, if needed */ - if (!(fmt->flags & AVFMT_NOFILE)) { - ret = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,NULL,NULL); - if (ret < 0) { - Fatal("Could not open output file '%s': %s\n", filename, - av_make_error_string(ret).c_str()); - } + ret=avcodec_copy_context(audio_st->codec, inpaud_st->codec); + if (ret < 0) { + Fatal("Unable to copy audio context %s\n", av_make_error_string(ret).c_str()); + } + audio_st->codec->codec_tag = 0; + if (oc->oformat->flags & AVFMT_GLOBALHEADER) { + audio_st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER; + } } + } else { + Debug(3, "No Audio output stream"); + audio_st = NULL; + } - //av_dict_set(&opts, "movflags", "frag_custom+dash+delay_moov", 0); - //if ((ret = avformat_write_header(ctx, &opts)) < 0) { - //} - //os->ctx_inited = 1; - //avio_flush(ctx->pb); - //av_dict_free(&opts); - - /* Write the stream header, if any. */ - ret = avformat_write_header(oc, NULL); + /* open the output file, if needed */ + if (!(fmt->flags & AVFMT_NOFILE)) { + ret = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,NULL,NULL); if (ret < 0) { - zm_dump_stream_format( oc, 0, 0, 1 ); - Fatal("Error occurred when writing output file header to %s: %s\n", - filename, - av_make_error_string(ret).c_str()); + Fatal("Could not open output file '%s': %s\n", filename, + av_make_error_string(ret).c_str()); } - - prevDts = 0; - startPts = 0; - startDts = 0; - filter_in_rescale_delta_last = AV_NOPTS_VALUE; + } - startTime=av_gettime()-nStartTime;//oc->start_time; - Info("VideoStore startTime=%d\n",startTime); + //av_dict_set(&opts, "movflags", "frag_custom+dash+delay_moov", 0); + //if ((ret = avformat_write_header(ctx, &opts)) < 0) { + //} + //os->ctx_inited = 1; + //avio_flush(ctx->pb); + //av_dict_free(&opts); + + /* Write the stream header, if any. */ + ret = avformat_write_header(oc, NULL); + if (ret < 0) { + zm_dump_stream_format( oc, 0, 0, 1 ); + Fatal("Error occurred when writing output file header to %s: %s\n", + filename, + av_make_error_string(ret).c_str()); + } + + prevDts = 0; + startPts = 0; + startDts = 0; + filter_in_rescale_delta_last = AV_NOPTS_VALUE; + + startTime=av_gettime()-nStartTime;//oc->start_time; + Info("VideoStore startTime=%d\n",startTime); } // VideoStore::VideoStore VideoStore::~VideoStore(){ - /* Write the trailer before close */ - if ( int rc = av_write_trailer(oc) ) { - Error("Error writing trailer %s", av_err2str( rc ) ); - } else { - Debug(3, "Sucess Writing trailer"); - } - - // I wonder if we should be closing the file first. - // I also wonder if we really need to be doing all the context allocation/de-allocation constantly, or whether we can just re-use it. Just do a file open/close/writeheader/etc. - // What if we were only doing audio recording? - if ( video_st ) { - avcodec_close(video_st->codec); - } - if (audio_st) { - avcodec_close(audio_st->codec); - } - - // WHen will be not using a file ? - if (!(fmt->flags & AVFMT_NOFILE)) { - /* Close the output file. */ - if ( int rc = avio_close(oc->pb) ) { - Error("Error closing avio %s", av_err2str( rc ) ); - } - } else { - Debug(3, "Not closing avio because we are not writing to a file."); - } + /* Write the trailer before close */ + if ( int rc = av_write_trailer(oc) ) { + Error("Error writing trailer %s", av_err2str( rc ) ); + } else { + Debug(3, "Sucess Writing trailer"); + } - /* free the stream */ - avformat_free_context(oc); + // I wonder if we should be closing the file first. + // I also wonder if we really need to be doing all the context allocation/de-allocation constantly, or whether we can just re-use it. Just do a file open/close/writeheader/etc. + // What if we were only doing audio recording? + if ( video_st ) { + avcodec_close(video_st->codec); + } + if (audio_st) { + avcodec_close(audio_st->codec); + } + + // WHen will be not using a file ? + if (!(fmt->flags & AVFMT_NOFILE)) { + /* Close the output file. */ + if ( int rc = avio_close(oc->pb) ) { + Error("Error closing avio %s", av_err2str( rc ) ); + } + } else { + Debug(3, "Not closing avio because we are not writing to a file."); + } + + /* free the stream */ + avformat_free_context(oc); } void VideoStore::dumpPacket( AVPacket *pkt ){ - char b[10240]; + char b[10240]; - snprintf(b, sizeof(b), " pts: %" PRId64 ", dts: %" PRId64 ", data: %p, size: %d, sindex: %d, dflags: %04x, s-pos: %" PRId64 ", c-duration: %" PRId64 "\n" - , pkt->pts - , pkt->dts - , pkt->data - , pkt->size - , pkt->stream_index - , pkt->flags - , pkt->pos - , pkt->convergence_duration - ); - Info("%s:%d:DEBUG: %s", __FILE__, __LINE__, b); + snprintf(b, sizeof(b), " pts: %" PRId64 ", dts: %" PRId64 ", data: %p, size: %d, sindex: %d, dflags: %04x, s-pos: %" PRId64 ", c-duration: %" PRId64 "\n" + , pkt->pts + , pkt->dts + , pkt->data + , pkt->size + , pkt->stream_index + , pkt->flags + , pkt->pos + , pkt->convergence_duration + ); + Info("%s:%d:DEBUG: %s", __FILE__, __LINE__, b); } int VideoStore::writeVideoFramePacket(AVPacket *ipkt, AVStream *input_st){//, AVPacket *lastKeyframePkt){ - Debug(3, "before ost_tbcket %d", startTime ); - zm_dump_stream_format( oc, ipkt->stream_index, 0, 1 ); - Debug(3, "before ost_tbcket %d", startTime ); - int64_t ost_tb_start_time = av_rescale_q(startTime, AV_TIME_BASE_Q, video_st->time_base); - - AVPacket opkt, safepkt; - AVPicture pict; - - av_init_packet(&opkt); + Debug(3, "before ost_tbcket %d", startTime ); + zm_dump_stream_format( oc, ipkt->stream_index, 0, 1 ); + Debug(3, "before ost_tbcket %d", startTime ); + int64_t ost_tb_start_time = av_rescale_q(startTime, AV_TIME_BASE_Q, video_st->time_base); - //Scale the PTS of the outgoing packet to be the correct time base - if (ipkt->pts != AV_NOPTS_VALUE) { - opkt.pts = av_rescale_q(ipkt->pts-startPts, input_st->time_base, video_st->time_base) - ost_tb_start_time; - } else { - opkt.pts = AV_NOPTS_VALUE; - } - - //Scale the DTS of the outgoing packet to be the correct time base - if(ipkt->dts == AV_NOPTS_VALUE) { - opkt.dts = av_rescale_q(input_st->cur_dts-startDts, AV_TIME_BASE_Q, video_st->time_base); - } else { - opkt.dts = av_rescale_q(ipkt->dts-startDts, input_st->time_base, video_st->time_base); - } + AVPacket opkt, safepkt; + AVPicture pict; - opkt.dts -= ost_tb_start_time; + av_init_packet(&opkt); - opkt.duration = av_rescale_q(ipkt->duration, input_st->time_base, video_st->time_base); - opkt.flags = ipkt->flags; - opkt.pos=-1; + //Scale the PTS of the outgoing packet to be the correct time base + if (ipkt->pts != AV_NOPTS_VALUE) { + opkt.pts = av_rescale_q(ipkt->pts-startPts, input_st->time_base, video_st->time_base) - ost_tb_start_time; + } else { + opkt.pts = AV_NOPTS_VALUE; + } - opkt.data = ipkt->data; - opkt.size = ipkt->size; - opkt.stream_index = ipkt->stream_index; - /*opkt.flags |= AV_PKT_FLAG_KEY;*/ - - if (video_st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (fmt->flags & AVFMT_RAWPICTURE)) { - /* store AVPicture in AVPacket, as expected by the output format */ - avpicture_fill(&pict, opkt.data, video_st->codec->pix_fmt, video_st->codec->width, video_st->codec->height); - opkt.data = (uint8_t *)&pict; - opkt.size = sizeof(AVPicture); - opkt.flags |= AV_PKT_FLAG_KEY; + //Scale the DTS of the outgoing packet to be the correct time base + if(ipkt->dts == AV_NOPTS_VALUE) { + opkt.dts = av_rescale_q(input_st->cur_dts-startDts, AV_TIME_BASE_Q, video_st->time_base); + } else { + opkt.dts = av_rescale_q(ipkt->dts-startDts, input_st->time_base, video_st->time_base); + } + + opkt.dts -= ost_tb_start_time; + + opkt.duration = av_rescale_q(ipkt->duration, input_st->time_base, video_st->time_base); + opkt.flags = ipkt->flags; + opkt.pos=-1; + + opkt.data = ipkt->data; + opkt.size = ipkt->size; + opkt.stream_index = ipkt->stream_index; + /*opkt.flags |= AV_PKT_FLAG_KEY;*/ + + if (video_st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (fmt->flags & AVFMT_RAWPICTURE)) { + /* store AVPicture in AVPacket, as expected by the output format */ + avpicture_fill(&pict, opkt.data, video_st->codec->pix_fmt, video_st->codec->width, video_st->codec->height); + opkt.data = (uint8_t *)&pict; + opkt.size = sizeof(AVPicture); + opkt.flags |= AV_PKT_FLAG_KEY; + } + + memcpy(&safepkt, &opkt, sizeof(AVPacket)); + + if ((opkt.data == NULL)||(opkt.size < 1)) { + Warning("%s:%d: Mangled AVPacket: discarding frame", __FILE__, __LINE__ ); + dumpPacket(&opkt); + + } else if ((prevDts > 0) && (prevDts >= opkt.dts)) { + Warning("%s:%d: DTS out of order: %lld \u226E %lld; discarding frame", __FILE__, __LINE__, prevDts, opkt.dts); + prevDts = opkt.dts; + dumpPacket(&opkt); + + } else { + int ret; + + prevDts = opkt.dts; // Unsure if av_interleaved_write_frame() clobbers opkt.dts when out of order, so storing in advance + ret = av_interleaved_write_frame(oc, &opkt); + if(ret<0){ + // There's nothing we can really do if the frame is rejected, just drop it and get on with the next + Warning("%s:%d: Writing frame [av_interleaved_write_frame()] failed: %s(%d) ", __FILE__, __LINE__, av_make_error_string(ret).c_str(), (ret)); + dumpPacket(&safepkt); } - - memcpy(&safepkt, &opkt, sizeof(AVPacket)); - - if ((opkt.data == NULL)||(opkt.size < 1)) { - Warning("%s:%d: Mangled AVPacket: discarding frame", __FILE__, __LINE__ ); - dumpPacket(&opkt); + } - } else if ((prevDts > 0) && (prevDts >= opkt.dts)) { - Warning("%s:%d: DTS out of order: %lld \u226E %lld; discarding frame", __FILE__, __LINE__, prevDts, opkt.dts); - prevDts = opkt.dts; - dumpPacket(&opkt); + av_free_packet(&opkt); - } else { - int ret; - - prevDts = opkt.dts; // Unsure if av_interleaved_write_frame() clobbers opkt.dts when out of order, so storing in advance - ret = av_interleaved_write_frame(oc, &opkt); - if(ret<0){ - // There's nothing we can really do if the frame is rejected, just drop it and get on with the next - Warning("%s:%d: Writing frame [av_interleaved_write_frame()] failed: %s(%d) ", __FILE__, __LINE__, av_make_error_string(ret).c_str(), (ret)); - dumpPacket(&safepkt); - } - } - - - av_free_packet(&opkt); - - return 0; - + return 0; } int VideoStore::writeAudioFramePacket(AVPacket *ipkt, AVStream *input_st){ - if(!audio_st) { - Error("Called writeAudioFramePacket when no audio_st"); - return -1;//FIXME -ve return codes do not free packet in ffmpeg_camera at the moment - } - /*if(!keyframeMessage) - return -1;*/ - //zm_dump_stream_format( oc, ipkt->stream_index, 0, 1 ); - - // What is this doing? Getting the time of the start of this video chunk? Does that actually make sense? - int64_t ost_tb_start_time = av_rescale_q(startTime, AV_TIME_BASE_Q, audio_st->time_base); - - AVPacket opkt; - - av_init_packet(&opkt); - Debug(3, "after init packet" ); + if(!audio_st) { + Error("Called writeAudioFramePacket when no audio_st"); + return -1;//FIXME -ve return codes do not free packet in ffmpeg_camera at the moment + } + /*if(!keyframeMessage) + return -1;*/ + //zm_dump_stream_format( oc, ipkt->stream_index, 0, 1 ); - - //Scale the PTS of the outgoing packet to be the correct time base - if (ipkt->pts != AV_NOPTS_VALUE) { - Debug(3, "Rescaling output pts"); - opkt.pts = av_rescale_q(ipkt->pts-startPts, input_st->time_base, audio_st->time_base) - ost_tb_start_time; - } else { - Debug(3, "Setting output pts to AV_NOPTS_VALUE"); - opkt.pts = AV_NOPTS_VALUE; - } - - //Scale the DTS of the outgoing packet to be the correct time base - if(ipkt->dts == AV_NOPTS_VALUE) { -Debug(4, "ipkt->dts == AV_NOPTS_VALUE %d to %d", AV_NOPTS_VALUE, opkt.dts ); - opkt.dts = av_rescale_q(input_st->cur_dts-startDts, AV_TIME_BASE_Q, audio_st->time_base); -Debug(4, "ipkt->dts == AV_NOPTS_VALUE %d to %d", AV_NOPTS_VALUE, opkt.dts ); - } else { -Debug(4, "ipkt->dts != AV_NOPTS_VALUE %d to %d", AV_NOPTS_VALUE, opkt.dts ); - opkt.dts = av_rescale_q(ipkt->dts-startDts, input_st->time_base, audio_st->time_base); -Debug(4, "ipkt->dts != AV_NOPTS_VALUE %d to %d", AV_NOPTS_VALUE, opkt.dts ); - } - opkt.dts -= ost_tb_start_time; - - // Seems like it would be really weird for the codec type to NOT be audiu - if (audio_st->codec->codec_type == AVMEDIA_TYPE_AUDIO && ipkt->dts != AV_NOPTS_VALUE) { - Debug( 4, "code is audio, dts != AV_NOPTS_VALUE " ); - int duration = av_get_audio_frame_duration(input_st->codec, ipkt->size); - if(!duration) - duration = input_st->codec->frame_size; - - //FIXME where to get filter_in_rescale_delta_last - //FIXME av_rescale_delta doesn't exist in ubuntu vivid libavtools - opkt.dts = opkt.pts = av_rescale_delta(input_st->time_base, ipkt->dts, - (AVRational){1, input_st->codec->sample_rate}, duration, &filter_in_rescale_delta_last, - audio_st->time_base) - ost_tb_start_time; - } - - opkt.duration = av_rescale_q(ipkt->duration, input_st->time_base, audio_st->time_base); - opkt.pos=-1; - opkt.flags = ipkt->flags; - - opkt.data = ipkt->data; - opkt.size = ipkt->size; - opkt.stream_index = ipkt->stream_index; - - int ret; - ret = av_interleaved_write_frame(oc, &opkt); - if(ret!=0){ - Fatal("Error encoding audio frame packet: %s\n", av_make_error_string(ret).c_str()); - } - Debug(4,"Success writing audio frame" ); - av_free_packet(&opkt); - return 0; + // What is this doing? Getting the time of the start of this video chunk? Does that actually make sense? + int64_t ost_tb_start_time = av_rescale_q(startTime, AV_TIME_BASE_Q, audio_st->time_base); + + AVPacket opkt; + + av_init_packet(&opkt); + Debug(3, "after init packet" ); + + + //Scale the PTS of the outgoing packet to be the correct time base + if (ipkt->pts != AV_NOPTS_VALUE) { + Debug(3, "Rescaling output pts"); + opkt.pts = av_rescale_q(ipkt->pts-startPts, input_st->time_base, audio_st->time_base) - ost_tb_start_time; + } else { + Debug(3, "Setting output pts to AV_NOPTS_VALUE"); + opkt.pts = AV_NOPTS_VALUE; + } + + //Scale the DTS of the outgoing packet to be the correct time base + if(ipkt->dts == AV_NOPTS_VALUE) { + Debug(4, "ipkt->dts == AV_NOPTS_VALUE %d to %d", AV_NOPTS_VALUE, opkt.dts ); + opkt.dts = av_rescale_q(input_st->cur_dts-startDts, AV_TIME_BASE_Q, audio_st->time_base); + Debug(4, "ipkt->dts == AV_NOPTS_VALUE %d to %d", AV_NOPTS_VALUE, opkt.dts ); + } else { + Debug(4, "ipkt->dts != AV_NOPTS_VALUE %d to %d", AV_NOPTS_VALUE, opkt.dts ); + opkt.dts = av_rescale_q(ipkt->dts-startDts, input_st->time_base, audio_st->time_base); + Debug(4, "ipkt->dts != AV_NOPTS_VALUE %d to %d", AV_NOPTS_VALUE, opkt.dts ); + } + opkt.dts -= ost_tb_start_time; + + // Seems like it would be really weird for the codec type to NOT be audiu + if (audio_st->codec->codec_type == AVMEDIA_TYPE_AUDIO && ipkt->dts != AV_NOPTS_VALUE) { + Debug( 4, "code is audio, dts != AV_NOPTS_VALUE " ); + int duration = av_get_audio_frame_duration(input_st->codec, ipkt->size); + if(!duration) + duration = input_st->codec->frame_size; + + //FIXME where to get filter_in_rescale_delta_last + //FIXME av_rescale_delta doesn't exist in ubuntu vivid libavtools + opkt.dts = opkt.pts = av_rescale_delta(input_st->time_base, ipkt->dts, + (AVRational){1, input_st->codec->sample_rate}, duration, &filter_in_rescale_delta_last, + audio_st->time_base) - ost_tb_start_time; + } + + opkt.duration = av_rescale_q(ipkt->duration, input_st->time_base, audio_st->time_base); + opkt.pos=-1; + opkt.flags = ipkt->flags; + + opkt.data = ipkt->data; + opkt.size = ipkt->size; + opkt.stream_index = ipkt->stream_index; + + int ret; + ret = av_interleaved_write_frame(oc, &opkt); + if(ret!=0){ + Fatal("Error encoding audio frame packet: %s\n", av_make_error_string(ret).c_str()); + } + Debug(4,"Success writing audio frame" ); + av_free_packet(&opkt); + return 0; }