Alexander Alekhin [Wed, 4 Dec 2019 15:50:06 +0000 (15:50 +0000)]
Merge pull request #16045 from YashasSamaga:cuda4dnn-hotfix-log1p-expm1
Alexander Alekhin [Wed, 4 Dec 2019 15:49:46 +0000 (15:49 +0000)]
Merge pull request #16037 from alalek:dnn_test_fix_skip_vulkan
Alexander Alekhin [Tue, 3 Dec 2019 20:09:21 +0000 (20:09 +0000)]
Merge pull request #15972 from TolyaTalamanov:at/ftext-primitive
Pinaev Danil [Tue, 3 Dec 2019 16:14:13 +0000 (19:14 +0300)]
Merge pull request #16031 from aDanPin:dm/streaming_auto_meta
G-API-NG/Streaming: don't require explicit metadata in compileStreaming()
* First probably working version
Hardcode gose to setSource() :)
* Pre final version of move metadata declaration from compileStreaming() to setSource().
* G-API-NG/Streaming: recovered the existing Streaming functionality
- The auto-meta test is disabling since it crashes.
- Restored .gitignore
* G-API-NG/Streaming: Made the meta-less compileStreaming() work
- Works fine even with OpenCV backend;
- Fluid doesn't support such kind of compilation so far - to be fixed
* G-API-NG/Streaming: Fix Fluid to support meta-less compilation
- Introduced a notion of metadata-sensitive passes and slightly
refactored GCompiler and GFluidBackend to support that
- Fixed a TwoVideoSourcesFail test on streaming
* Add three smoke streaming tests to gapi_streaming_tests.
All three teste run pipeline with two different input sets
1) SmokeTest_Two_Const_Mats test run pipeline with two const Mats
2) SmokeTest_One_Video_One_Const_Scalar test run pipleline with Mat(video source) and const Scalar
3) SmokeTest_One_Video_One_Const_Vector test run pipeline with Mat(video source) and const Vector
# Please enter the commit message for your changes. Lines starting
* style fix
* Some review stuff
* Some review stuff
Talamanov, Anatoliy [Tue, 3 Dec 2019 10:13:06 +0000 (13:13 +0300)]
Implement cv::gapi::wip::draw::FText
YashasSamaga [Tue, 3 Dec 2019 09:55:35 +0000 (15:25 +0530)]
fix expm1 and log1p for __half/__half2
Alexander Alekhin [Mon, 2 Dec 2019 15:22:10 +0000 (18:22 +0300)]
dnn(test): fix Vulkan skip test tag
Alexander Alekhin [Mon, 2 Dec 2019 13:18:07 +0000 (16:18 +0300)]
Merge remote-tracking branch 'upstream/3.4' into merge-3.4
Lubov Batanina [Mon, 2 Dec 2019 13:16:06 +0000 (16:16 +0300)]
Merge pull request #15537 from l-bat:ngraph
* Support nGraph
* Fix resize
Alexander Alekhin [Sun, 1 Dec 2019 21:07:26 +0000 (21:07 +0000)]
Merge pull request #16025 from dkurt:thebhatman/Mish_swish_3.4
Manjunath Bhat [Sun, 1 Dec 2019 21:06:17 +0000 (02:36 +0530)]
Merge pull request #15808 from thebhatman:Mish_swish
* Added Swish and Mish activations
* Fixed whitespace errors
* Kernel implementation done
* Added function for launching kernel
* Changed type of 1.0
* Attempt to add test for Swish and Mish
* Resolving type mismatch for log
* exp from device
* Use log1pexp instead of adding 1
* Added openCL kernels
thebhatman [Sun, 1 Dec 2019 08:00:58 +0000 (11:00 +0300)]
Port Swish and Mish layers
Alexander Alekhin [Sat, 30 Nov 2019 20:20:56 +0000 (20:20 +0000)]
Merge pull request #16006 from sajarindider:typo
sajarindider [Thu, 21 Nov 2019 19:10:50 +0000 (14:10 -0500)]
fixed Scheimpflug typo
Alexander Alekhin [Fri, 29 Nov 2019 14:29:37 +0000 (17:29 +0300)]
Merge remote-tracking branch 'upstream/3.4' into merge-3.4
Vadim Levin [Fri, 29 Nov 2019 13:24:13 +0000 (16:24 +0300)]
Merge pull request #15955 from VadimLevin:dev/vlevin/generator_tests
Tests for argument conversion of Python bindings generator
* Tests for parsing elemental types from Python bindings
- Add positive and negative tests for int, float, double, size_t,
const char*, bool.
- Tests with wrong conversion behavior are skipped.
* Move implicit conversion of bool to integer/floating types to wrong
conversion behavior.
Alexander Alekhin [Fri, 29 Nov 2019 11:38:21 +0000 (11:38 +0000)]
Merge pull request #16017 from berak:fix_svm_train_auto
berak [Thu, 28 Nov 2019 19:33:58 +0000 (20:33 +0100)]
ml: fix check in SVM::trainAuto
Pinaev Danil [Thu, 28 Nov 2019 13:25:20 +0000 (16:25 +0300)]
Merge pull request #15695 from aDanPin:dp/incorrect_use_of_muve_fix
Fix incorrect use of std::move() in g-api perf tests
* First version
* Fix perfomace tests
Replace
c.apply(...);
with
cc = c.compile(...);
cc(...);
* Remove output meta arguments from .compile()
* Style fix
* Remove useless commented string
* Stick to common pattern : i.e. use gin() and gout() explicitly.
* Use cc(gin(...), gout(...)) in all cases.
Alexander Alekhin [Wed, 27 Nov 2019 19:23:27 +0000 (19:23 +0000)]
Merge pull request #15998 from alalek:ts_count_skip_exception
Alexander Alekhin [Wed, 27 Nov 2019 19:23:09 +0000 (19:23 +0000)]
Merge pull request #15994 from SSteve:affine_transform_docs
Alexander Alekhin [Wed, 27 Nov 2019 19:19:34 +0000 (19:19 +0000)]
Merge pull request #15839 from alalek:core_simd_v_setall_template
atalaman [Wed, 27 Nov 2019 15:21:00 +0000 (18:21 +0300)]
Merge pull request #15869 from TolyaTalamanov:at/plaidml-backend
G-API: Implement PlaidML2 backend
* PlaidML backend init version
* Add test
* Support multiply inputs/outputs in PlaidML2 backend
* Fix comment to review
* Add HAVE_PLAIDML macros
* Move plaidml tests to separate file
* Fix comment to review
* Fix cmake warning
* Fix comments to review
* Fix typos
overload -> overflow
* Fix comments to review
* Clean up
* Remove spaces from cmake scripts
* Disable tests with bitwise operations
* Use plaidml::exec::Binder
Dmitry Matveev [Wed, 27 Nov 2019 14:54:17 +0000 (17:54 +0300)]
Merge pull request #15753 from dmatveev:dm/ng-5000-security_barrier-interactive_face
G-API: Introduced Security Barrier & Interactive Face Detection samples
* G-API-NG/Samples: Added samples & relevant changes
- Security barrier camera sample
- Age/Gender/Emotions recognition sample
- GIEBackend now loads CPU extension libraries
- A couple of API-level workarounds added to deal with cv::Mat/Blob conversions
* G-API-NG/Samples: removed HAVE_INF_ENGINE remnants
Alexander Alekhin [Tue, 26 Nov 2019 18:35:28 +0000 (18:35 +0000)]
Merge pull request #16001 from alalek:backport_15995
Alexander Alekhin [Tue, 26 Nov 2019 15:52:04 +0000 (15:52 +0000)]
Merge pull request #15995 from bwignall:typo
Alexander Alekhin [Tue, 26 Nov 2019 15:48:22 +0000 (15:48 +0000)]
Merge pull request #15991 from collinbrake:feature_grammar_fixes_8
Brian Wignall [Tue, 26 Nov 2019 00:55:07 +0000 (19:55 -0500)]
Fix some typos
Alexander Alekhin [Tue, 26 Nov 2019 11:01:18 +0000 (14:01 +0300)]
ts: count skipped tests via SkipTestException
- apply tag 'skip_other'
Brian Wignall [Tue, 26 Nov 2019 00:55:07 +0000 (19:55 -0500)]
Fix some typos
Steve Nicholson [Tue, 26 Nov 2019 00:31:03 +0000 (16:31 -0800)]
Rename parameter R to H in AffineWarper member declarations
Alexander Alekhin [Mon, 25 Nov 2019 20:04:47 +0000 (20:04 +0000)]
Merge pull request #15986 from dkurt:fix_15863
Alexander Alekhin [Mon, 25 Nov 2019 20:04:25 +0000 (20:04 +0000)]
Merge pull request #15978 from alalek:videoio_refactor_v4l
Maksim Shabunin [Mon, 25 Nov 2019 20:03:16 +0000 (20:03 +0000)]
Merge pull request #15959 from mshabunin:refactor-ml-tests
ml: refactored tests
* use parametrized tests where appropriate
* use stable theRNG in most tests
* use modern style with EXPECT_/ASSERT_ checks
Collin Brake [Mon, 25 Nov 2019 18:41:55 +0000 (13:41 -0500)]
grammar corrections
Dmitry Kurtaev [Sun, 24 Nov 2019 18:59:25 +0000 (21:59 +0300)]
Resolve https://github.com/opencv/opencv/issues/15863
Alexander Alekhin [Sun, 24 Nov 2019 09:39:48 +0000 (09:39 +0000)]
Merge pull request #15980 from SSteve:doxygen_links
Steve Nicholson [Sat, 23 Nov 2019 22:03:14 +0000 (14:03 -0800)]
Update links to Doxygen website
Alexander Alekhin [Sat, 23 Nov 2019 22:59:01 +0000 (22:59 +0000)]
Merge pull request #15975 from SSteve:ios_install
Steve Nicholson [Fri, 22 Nov 2019 23:38:53 +0000 (15:38 -0800)]
Update and add information to iOS build instructions.
Alexander Alekhin [Fri, 22 Nov 2019 21:03:52 +0000 (21:03 +0000)]
videoio(v4l2): use logging, update handling of EBUSY, device closing
- DEBUG logging compilation is enabled for all videoio backends
- eliminate output through perror(), stderr
Alexander Alekhin [Fri, 22 Nov 2019 22:47:13 +0000 (22:47 +0000)]
Merge remote-tracking branch 'upstream/3.4' into merge-3.4
Vadim Levin [Fri, 22 Nov 2019 22:10:16 +0000 (01:10 +0300)]
Merge pull request #15973 from VadimLevin:dev/vlevin/video_capture_inf_loop
* Fix infinite loop when trying to change state of the busy camera
- Add finite number of attempts in tryIoctl functions
10 by default.
* Introduced new flag for ioctl call to handle EBUSY
Alexander Alekhin [Fri, 22 Nov 2019 21:36:01 +0000 (21:36 +0000)]
Merge pull request #15971 from alalek:core_kmeans_handle_overflow
Natsu [Fri, 22 Nov 2019 15:42:25 +0000 (23:42 +0800)]
Merge pull request #15970 from akemimadoka:master
* Fix android armv7 c++_static init crash
* core: move initialization of 'ios_base::Init' for Android
Alexander Alekhin [Fri, 22 Nov 2019 10:52:28 +0000 (10:52 +0000)]
core(kmeans): bailout if can't select cluster center
Alexander Alekhin [Thu, 21 Nov 2019 17:36:10 +0000 (17:36 +0000)]
Merge pull request #15968 from alalek:fix_msa_build
Alexander Alekhin [Thu, 21 Nov 2019 15:59:41 +0000 (18:59 +0300)]
core: fix MSA build
Alexander Alekhin [Thu, 21 Nov 2019 13:04:09 +0000 (13:04 +0000)]
Merge pull request #15962 from alalek:dnn_fix_ie_opencvlayer
Alexander Alekhin [Wed, 20 Nov 2019 21:42:26 +0000 (21:42 +0000)]
dnn: fix registration of custom OpenCVLayer
- do not require extensions library
Alexander Alekhin [Wed, 20 Nov 2019 19:05:15 +0000 (19:05 +0000)]
Merge pull request #15951 from alalek:python_reduce_code_size
Alexander Alekhin [Wed, 20 Nov 2019 15:43:32 +0000 (15:43 +0000)]
Merge pull request #15956 from lorenzolightsgdwarf:dnn_fix_tf_ssd
Everton Constantino [Wed, 20 Nov 2019 10:41:07 +0000 (07:41 -0300)]
Merge pull request #15494 from everton1984:hal_vector_get_n
Improving VSX performance of integral function
* Adding support for vector get function on VSX datatypes so the
integral function gains a bit of performance.
* Removing get as a datatype member function and implementing a new HAL
instruction v_extract_n to get the n-th element of a vector register.
* Adding SSE/NEON/AVX intrinsics.
* Implement new HAL instruction v_broadcast_element on VSX/AVX/NEON/SSE.
* core(simd): add tests for v_extract_n/v_broadcast_element
- updated docs
- commented out code to repair compilation
- added WASM and MSA default implementations
* core(simd): fix compilation
- x86: avoid _mm256_extract_epi64/32/16/8 with MSVS 2015
- x86: _mm_extract_epi64 is 64-bit only
* cleanup
Lorenzo Lucignano [Wed, 20 Nov 2019 09:45:57 +0000 (10:45 +0100)]
Samples DNN: tf_text_graph_sd.py loads box coder variance and box NMS params from config file
Alexander Alekhin [Wed, 20 Nov 2019 07:32:06 +0000 (07:32 +0000)]
Merge pull request #15950 from alalek:ffmpeg_update_master
Alexander Alekhin [Tue, 19 Nov 2019 22:43:28 +0000 (22:43 +0000)]
python: reduce code size of cv2.cpp
Alexander Alekhin [Tue, 19 Nov 2019 22:04:44 +0000 (22:04 +0000)]
ffmpeg/4.x: update FFmpeg plugin
Alexander Alekhin [Tue, 19 Nov 2019 19:13:38 +0000 (19:13 +0000)]
Merge remote-tracking branch 'upstream/3.4' into merge-3.4
Alexander Alekhin [Tue, 19 Nov 2019 18:45:39 +0000 (18:45 +0000)]
Merge pull request #15939 from alalek:ffmpeg_update_3.4
Alexander Alekhin [Tue, 19 Nov 2019 18:39:56 +0000 (18:39 +0000)]
Merge pull request #15918 from alalek:python_debug_parameter
Alexander Alekhin [Tue, 19 Nov 2019 18:08:45 +0000 (21:08 +0300)]
Merge pull request #15925 from alalek:core_test_simd_cpp_emulation
core(test): extending tests with SIMD C++ emulation code (intrin_cpp.hpp)
* core(test): test SIMD CPP emulation code (intrin_cpp.hpp)
* core(simd): eliminate build warnings from intrin_cpp.hpp
Alexander Alekhin [Tue, 19 Nov 2019 14:25:28 +0000 (14:25 +0000)]
Merge pull request #15946 from alalek:fix_js_test_features2d
Alexander Alekhin [Tue, 19 Nov 2019 14:25:12 +0000 (14:25 +0000)]
Merge pull request #15945 from alalek:dnn_ie_extension_handling
Alexander Alekhin [Tue, 19 Nov 2019 13:24:58 +0000 (13:24 +0000)]
Merge pull request #15919 from alalek:python_fix_arginfo
Alexander Alekhin [Tue, 19 Nov 2019 11:08:19 +0000 (11:08 +0000)]
Merge pull request #15935 from rgarnov:rg/fix_own_mat_empty
Alexander Alekhin [Tue, 19 Nov 2019 07:40:12 +0000 (07:40 +0000)]
js(test): update features2d test
Alexander Alekhin [Tue, 19 Nov 2019 06:55:14 +0000 (06:55 +0000)]
dnn: update InferenceEngine extension handling
Alexander Alekhin [Mon, 18 Nov 2019 19:13:45 +0000 (19:13 +0000)]
ffmpeg/3.4: update FFmpeg wrapper
Alexander Alekhin [Mon, 18 Nov 2019 18:56:57 +0000 (18:56 +0000)]
videoio: fix ffmpeg wrapper build
Alexander Alekhin [Mon, 18 Nov 2019 18:26:00 +0000 (18:26 +0000)]
Merge pull request #15938 from alalek:backport_15290
Alexander Alekhin [Mon, 18 Nov 2019 18:23:48 +0000 (18:23 +0000)]
Merge pull request #15937 from clunietp:3.4-fix-13577
cudawarped [Mon, 18 Nov 2019 14:07:06 +0000 (14:07 +0000)]
videoio: retrieve encoded frames through FFmpeg backend
- backport 15290
- add extra test case
cudawarped [Mon, 18 Nov 2019 14:07:06 +0000 (14:07 +0000)]
Merge pull request #15290 from cudawarped:ffmpeg_raw_retrieve
Add retrieve encoded frame to VideoCapture
* Add capacity to retrieve the encoded frame from a VideoCapture object.
* Correct raw codec and pixle format output from ffmpeg capture.
* Remove warnings from build.
* Added VideoCaptureRaw subclass.
* Include abstract base class VideoCaptureBase and rename new subclass VideoContainer as suggested by mshabunin.
* Remove using.
* Change base class name for compatibility with jave bindings generator.
* Move grab and retrieve and add override specifier
* Add setRaw and readRaw to IVideoCapture interface
-setRaw to disable video decoding and enable bitstream filters from mp4 to h254 and h265.
-readRaw to return the raw undecoded/filtered bitstream.
Add createRawCapture to initiate a backend with setRaw enabled.
Remove inheritance and use an independant VideoContainer subclass with IVideoCapture member.
* Address unused parameter warings.
Remove VideoContainer from python bindings as it no longer returns a Mat.
Use opencv type uchar instead of unsigned char.
Add missing destructor to VideoContainer class.
* Address build warnings and include all params in documentation.
* Include deprecated bitstream filtering API.
* Update codec_id query to work with older ffmpeg api's.
Change api version defines to be consistent - most recent api version first.
* Fix typo.
* Update test to work with naming of new files in the extra repo
* Investigate test failure
* Check bytes read by ffmpeg
* Removed mp4 video container test
* Applied suggested changes.
* videoio: rework API for extraction of RAW video streams
- FFmpeg only
* address review comments
Ruslan Garnov [Mon, 18 Nov 2019 12:39:10 +0000 (15:39 +0300)]
Fixed own::Mat::empty() for non md case
clunietp [Mon, 18 Nov 2019 12:41:34 +0000 (07:41 -0500)]
Fix 13577
Orest Chura [Mon, 18 Nov 2019 12:13:05 +0000 (15:13 +0300)]
Merge pull request #15888 from OrestChura:facebeautification_gapi_sample
Introducing the sample of Face Beautification algorithm implemented via Graph-API
* Introducing the sample of Face Beautification algorithm implemented via Graph-API
- 'gapi/samples/face_beautification.cpp' added
- FIXME added in 'gcpukernel.hpp'
* INF_ENGINE fix
- preprocessing clauses added not to run the sample without Inference Engine
* INF_ENGINE fix 2
- warnings removed
* Fixes
- checking IE version cut as there is no dependency
- some alignments fixed
- the comment about preprocessing commands fixed
* ie::backend() issue fix (according to dmatveev)
- as the sample needs the cv::gapi::ie::backend() to be defined regardless of having IE or not, there is its throw-error definition in `giebackend.cpp` now (by dmatveev)
- for the same reason, #includes in `giebackend.hpp` are fixed
- HAVE_INF_ENGINE check is removed from the sample
Alexander Alekhin [Sun, 17 Nov 2019 22:51:16 +0000 (22:51 +0000)]
Merge remote-tracking branch 'upstream/3.4' into merge-3.4
Alexander Alekhin [Sun, 17 Nov 2019 22:39:27 +0000 (01:39 +0300)]
imgproc: fix bit-exact GaussianBlur() / sepFilter2D() (#15855)
* imgproc: fix bit-exact GaussianBlur() / sepFilter2D()
- avoid kernels with bad approximation
- GaussiabBlur - apply error-diffusion approximation for kernel (8-bit fraction)
* java(test): update features2d ref data
* test: update test_facedetect
Sebastián Gurin [Sat, 16 Nov 2019 21:29:38 +0000 (18:29 -0300)]
Merge pull request #15503 from cancerberoSgx:js-test-puppeteer
Js test puppeteer
* run_puppeteer.js / tests
* js run test section
* rollback html
* whitespace
* js: update OpenCV.js tests infrastructure
* js: exclude puppeteer from default 'npm install'
* js: update notes
* js: more fixes in run_puppeteer
* fix build folder
Alexander Alekhin [Sat, 16 Nov 2019 19:45:37 +0000 (19:45 +0000)]
Merge pull request #15917 from ChipKerchner:demosaicingToHal2
Maxim Pashchenkov [Fri, 15 Nov 2019 16:42:12 +0000 (19:42 +0300)]
Merge pull request #15100 from Volskig:cam_multiplexing_function_v
Implement Camera Multiplexing API
* IdideoCapture + two wrong function
function waitAny
Add errors catcher
Stub for Python added.
Sifting warnings
One test added
Two tests for camera and Perf tests added
* Perf sync and async tests for waitAny() added, waitAnyInterior() deleted, getDeviceHandle() deleted
* Variable OPENCV_TEST_CAMERA_LIST added
* Without fps set
* ASSERT_FAILED for environment variable
* Perf tests is DISABLED_
* --Trailing whitespace
* Return false from cap.cpp deleted
* Two functions deleted from interface, +range for, +environment variable in test_camera
* Space deleted
* printf deleted, perror added
* CV_WRAP deleted, cv2 cleared from stubs
* -- space
* default timeout added
* @param changed
* place of waitAny changed
* --whitespace
* ++function description
* function description changed
* revert unused changes
* videoio: rework API for VideoCapture::waitAny()
Alexander Alekhin [Fri, 15 Nov 2019 14:29:51 +0000 (17:29 +0300)]
python: force using of ArgInfo
Alexander Alekhin [Fri, 15 Nov 2019 15:37:56 +0000 (18:37 +0300)]
python: emit bindings conversion failures on OPENCV_PYTHON_DEBUG=1
ChipKerchner [Fri, 15 Nov 2019 13:42:03 +0000 (07:42 -0600)]
Convert demosiacing with variable number of gradients to HAL - 5.5x faster
Alexander Alekhin [Fri, 15 Nov 2019 11:04:05 +0000 (11:04 +0000)]
Merge pull request #15911 from l-bat:fix_reducel2
Alexander Alekhin [Thu, 14 Nov 2019 14:55:24 +0000 (14:55 +0000)]
Merge pull request #15852 from akhakim:gauss_blur_kernel_5x5
Alexander Alekhin [Thu, 14 Nov 2019 14:22:01 +0000 (14:22 +0000)]
Merge pull request #15896 from alalek:build_gcc_9
Alexander Alekhin [Thu, 14 Nov 2019 14:07:05 +0000 (14:07 +0000)]
Merge pull request #15906 from anton-potapov:gapi_fluid_i420_support
Liubov Batanina [Thu, 14 Nov 2019 12:30:53 +0000 (15:30 +0300)]
Fix ReduceL2
Anna Khakimova [Fri, 8 Nov 2019 08:15:40 +0000 (11:15 +0300)]
GAPI Fluid: SIMD optimization for sep filters 5x5 kernel size (gaussBlur)
Alexander Alekhin [Thu, 14 Nov 2019 10:33:29 +0000 (10:33 +0000)]
Merge pull request #15905 from alalek:issue_15904
Anton Potapov [Wed, 13 Nov 2019 12:05:56 +0000 (15:05 +0300)]
G-API (Fluid) core support for I420
- Extended NV12 support in Fluid Core engine to cover I420
Alexander Alekhin [Wed, 13 Nov 2019 17:02:08 +0000 (17:02 +0000)]
Merge pull request #15900 from komakai:fix-osx-build
Sebastián Gurin [Wed, 13 Nov 2019 15:14:53 +0000 (12:14 -0300)]
Merge pull request #15425 from cancerberoSgx:nodejs
JS - adds a tutorial about running opencv.js in Node.js
Alexander Alekhin [Wed, 13 Nov 2019 14:53:14 +0000 (14:53 +0000)]
Merge pull request #15874 from akhakim:runsepfilter_5x5_kernel_size
Giles Payne [Tue, 12 Nov 2019 23:30:30 +0000 (08:30 +0900)]
Fix MacOS build
Alexander Alekhin [Wed, 13 Nov 2019 11:13:17 +0000 (14:13 +0300)]
imgproc(IPP): disable ippiDistanceTransform_3x3_8u32f_C1R
Alexander Alekhin [Tue, 12 Nov 2019 22:57:15 +0000 (22:57 +0000)]
Merge pull request #15891 from alalek:issue_15886
Alexander Alekhin [Tue, 12 Nov 2019 22:56:51 +0000 (22:56 +0000)]
Merge pull request #15883 from cbachhuber:refactor-opencl-information
Christoph Bachhuber [Sun, 10 Nov 2019 12:18:57 +0000 (13:18 +0100)]
Refactor for clarity and avoiding code duplication
Implement GArik's comments
Remove unnecessary c_str()
Fix brace position