From 7564d0c2fb6925501a8bd1de04f88d597a55af3c Mon Sep 17 00:00:00 2001 From: jbeoris Date: Sat, 23 Jan 2016 00:04:05 -0800 Subject: [PATCH 1/7] attempt to add night vision filter --- filters/Basic/NightVisionVideoFilter.cpp | 126 +++++++++++++++++++++++ filters/Basic/NightVisionVideoFilter.h | 63 ++++++++++++ filters/Basic/SepiaVideoFilter.cpp | 22 ++-- filters/FilterFactory.cpp | 2 + 4 files changed, 202 insertions(+), 11 deletions(-) create mode 100644 filters/Basic/NightVisionVideoFilter.cpp create mode 100644 filters/Basic/NightVisionVideoFilter.h diff --git a/filters/Basic/NightVisionVideoFilter.cpp b/filters/Basic/NightVisionVideoFilter.cpp new file mode 100644 index 00000000..3d4f90a7 --- /dev/null +++ b/filters/Basic/NightVisionVideoFilter.cpp @@ -0,0 +1,126 @@ + +#include + +#include + + +#ifdef TARGET_OS_IPHONE + +#include +#include +#include +#include + +#endif + +namespace videocore { namespace filters { + + bool SepiaVideoFilter::s_registered = SepiaVideoFilter::registerFilter(); + + bool + SepiaVideoFilter::registerFilter() + { + FilterFactory::_register("com.videocore.filters.sepia", []() { return new SepiaVideoFilter(); }); + return true; + } + + SepiaVideoFilter::SepiaVideoFilter() + : IVideoFilter(), m_initialized(false), m_bound(false) + { + + } + SepiaVideoFilter::~SepiaVideoFilter() + { + glDeleteProgram(m_program); + glDeleteVertexArrays(1, &m_vao); + } + + const char * const + SepiaVideoFilter::vertexKernel() const + { + + KERNEL(GL_ES2_3, m_language, + attribute vec2 aPos; + attribute vec2 aCoord; + varying vec2 vCoord; + uniform mat4 uMat; + void main(void) { + gl_Position = uMat * vec4(aPos,0.,1.); + vCoord = aCoord; + } + ) + + return nullptr; + } + + const char * const + SepiaVideoFilter::pixelKernel() const + { + + KERNEL(GL_ES2_3, m_language, + precision mediump float; + varying vec2 vCoord; + uniform sampler2D uTex0; + const vec3 NV = vec3(0.2, 1.0, 0.2); + void main(void) { + vec4 color = texture2D(uTex0, vCoord); + float gray = dot(color.rgb, vec3(0.3, 0.59, 0.11)); + vec3 sepiaColor = vec3(gray) * NV; + color.rgb = mix(color.rgb, sepiaColor, 0.75); + gl_FragColor = color; + } + ) + + return nullptr; + } + void + SepiaVideoFilter::initialize() + { + switch(m_language) { + case GL_ES2_3: + case GL_2: { + setProgram(build_program(vertexKernel(), pixelKernel())); + glGenVertexArrays(1, &m_vao); + glBindVertexArray(m_vao); + m_uMatrix = glGetUniformLocation(m_program, "uMat"); + int attrpos = glGetAttribLocation(m_program, "aPos"); + int attrtex = glGetAttribLocation(m_program, "aCoord"); + int unitex = glGetUniformLocation(m_program, "uTex0"); + glUniform1i(unitex, 0); + glEnableVertexAttribArray(attrpos); + glEnableVertexAttribArray(attrtex); + glVertexAttribPointer(attrpos, BUFFER_SIZE_POSITION, GL_FLOAT, GL_FALSE, BUFFER_STRIDE, BUFFER_OFFSET_POSITION); + glVertexAttribPointer(attrtex, BUFFER_SIZE_POSITION, GL_FLOAT, GL_FALSE, BUFFER_STRIDE, BUFFER_OFFSET_TEXTURE); + m_initialized = true; + } + break; + case GL_3: + break; + } + } + void + SepiaVideoFilter::bind() + { + switch(m_language) { + case GL_ES2_3: + case GL_2: + if(!m_bound) { + if(!initialized()) { + initialize(); + } + glUseProgram(m_program); + glBindVertexArray(m_vao); + } + glUniformMatrix4fv(m_uMatrix, 1, GL_FALSE, &m_matrix[0][0]); + break; + case GL_3: + break; + } + } + void + SepiaVideoFilter::unbind() + { + m_bound = false; + } +} +} \ No newline at end of file diff --git a/filters/Basic/NightVisionVideoFilter.h b/filters/Basic/NightVisionVideoFilter.h new file mode 100644 index 00000000..047b9cb3 --- /dev/null +++ b/filters/Basic/NightVisionVideoFilter.h @@ -0,0 +1,63 @@ +/* + + Video Core + Copyright (c) 2014 James G. Hurley + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ +#ifndef videocore_NightVisionVideoFilter_h +#define videocore_NightVisionVideoFilter_h +#include + +namespace videocore { + namespace filters { + class NightVisionVideoFilter : public IVideoFilter { + + public: + NightVisionVideoFilter(); + ~NightVisionVideoFilter(); + + public: + virtual void initialize(); + virtual bool initialized() const { return m_initialized; }; + virtual std::string const name() { return "com.videocore.filters.nightVision"; }; + virtual void bind(); + virtual void unbind(); + + public: + + const char * const vertexKernel() const ; + const char * const pixelKernel() const ; + + private: + static bool registerFilter(); + static bool s_registered; + private: + + unsigned int m_vao; + unsigned int m_uMatrix; + bool m_initialized; + bool m_bound; + + }; + } +} + +#endif /* defined(videocore_NightVisionVideoFilter_h) */ diff --git a/filters/Basic/SepiaVideoFilter.cpp b/filters/Basic/SepiaVideoFilter.cpp index 59cd2ba5..11f8d289 100644 --- a/filters/Basic/SepiaVideoFilter.cpp +++ b/filters/Basic/SepiaVideoFilter.cpp @@ -1,5 +1,5 @@ -#include +#include #include @@ -15,28 +15,28 @@ namespace videocore { namespace filters { - bool SepiaVideoFilter::s_registered = SepiaVideoFilter::registerFilter(); + bool NightVisionVideoFilter::s_registered = NightVisionVideoFilter::registerFilter(); bool - SepiaVideoFilter::registerFilter() + NightVisionVideoFilter::registerFilter() { - FilterFactory::_register("com.videocore.filters.sepia", []() { return new SepiaVideoFilter(); }); + FilterFactory::_register("com.videocore.filters.nightVision", []() { return new NightVisionVideoFilter(); }); return true; } - SepiaVideoFilter::SepiaVideoFilter() + NightVisionVideoFilter::SepiaVideoFilter() : IVideoFilter(), m_initialized(false), m_bound(false) { } - SepiaVideoFilter::~SepiaVideoFilter() + NightVisionVideoFilter::~NightVisionVideoFilter() { glDeleteProgram(m_program); glDeleteVertexArrays(1, &m_vao); } const char * const - SepiaVideoFilter::vertexKernel() const + NightVisionVideoFilter::vertexKernel() const { KERNEL(GL_ES2_3, m_language, @@ -54,7 +54,7 @@ namespace videocore { namespace filters { } const char * const - SepiaVideoFilter::pixelKernel() const + NightVisionVideoFilter::pixelKernel() const { KERNEL(GL_ES2_3, m_language, @@ -74,7 +74,7 @@ namespace videocore { namespace filters { return nullptr; } void - SepiaVideoFilter::initialize() + NightVisionVideoFilter::initialize() { switch(m_language) { case GL_ES2_3: @@ -99,7 +99,7 @@ namespace videocore { namespace filters { } } void - SepiaVideoFilter::bind() + NightVisionVideoFilter::bind() { switch(m_language) { case GL_ES2_3: @@ -118,7 +118,7 @@ namespace videocore { namespace filters { } } void - SepiaVideoFilter::unbind() + NightVisionVideoFilter::unbind() { m_bound = false; } diff --git a/filters/FilterFactory.cpp b/filters/FilterFactory.cpp index 13b8722d..1e6e0cb8 100644 --- a/filters/FilterFactory.cpp +++ b/filters/FilterFactory.cpp @@ -5,6 +5,7 @@ #include #include #include +#include namespace videocore { std::map* FilterFactory::s_registration = nullptr ; @@ -17,6 +18,7 @@ namespace videocore { filters::SepiaVideoFilter s; filters::FisheyeVideoFilter f; filters::GlowVideoFilter gl; + filters::NightVisionVideoFilter n; } } IFilter* From c0399144ed028745939f489dd79856a92232d904 Mon Sep 17 00:00:00 2001 From: jbeoris Date: Sat, 23 Jan 2016 00:12:44 -0800 Subject: [PATCH 2/7] fixes --- filters/Basic/NightVisionVideoFilter.cpp | 26 ++++++++++++------------ filters/Basic/SepiaVideoFilter.cpp | 22 ++++++++++---------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/filters/Basic/NightVisionVideoFilter.cpp b/filters/Basic/NightVisionVideoFilter.cpp index 3d4f90a7..a8670382 100644 --- a/filters/Basic/NightVisionVideoFilter.cpp +++ b/filters/Basic/NightVisionVideoFilter.cpp @@ -1,5 +1,5 @@ -#include +#include #include @@ -15,28 +15,28 @@ namespace videocore { namespace filters { - bool SepiaVideoFilter::s_registered = SepiaVideoFilter::registerFilter(); + bool NightVisionVideoFilter::s_registered = NightVisionVideoFilter::registerFilter(); bool - SepiaVideoFilter::registerFilter() + NightVisionVideoFilter::registerFilter() { - FilterFactory::_register("com.videocore.filters.sepia", []() { return new SepiaVideoFilter(); }); + FilterFactory::_register("com.videocore.filters.nightVision", []() { return new NightVisionVideoFilter(); }); return true; } - SepiaVideoFilter::SepiaVideoFilter() + NightVisionVideoFilter::NightVisionVideoFilter() : IVideoFilter(), m_initialized(false), m_bound(false) { } - SepiaVideoFilter::~SepiaVideoFilter() + NightVisionVideoFilter::~NightVisionVideoFilter() { glDeleteProgram(m_program); glDeleteVertexArrays(1, &m_vao); } const char * const - SepiaVideoFilter::vertexKernel() const + NightVisionVideoFilter::vertexKernel() const { KERNEL(GL_ES2_3, m_language, @@ -54,7 +54,7 @@ namespace videocore { namespace filters { } const char * const - SepiaVideoFilter::pixelKernel() const + NightVisionVideoFilter::pixelKernel() const { KERNEL(GL_ES2_3, m_language, @@ -65,8 +65,8 @@ namespace videocore { namespace filters { void main(void) { vec4 color = texture2D(uTex0, vCoord); float gray = dot(color.rgb, vec3(0.3, 0.59, 0.11)); - vec3 sepiaColor = vec3(gray) * NV; - color.rgb = mix(color.rgb, sepiaColor, 0.75); + vec3 nightVisionaColor = vec3(gray) * NV; + color.rgb = mix(color.rgb, nightVisionColor, 0.75); gl_FragColor = color; } ) @@ -74,7 +74,7 @@ namespace videocore { namespace filters { return nullptr; } void - SepiaVideoFilter::initialize() + NightVisionVideoFilter::initialize() { switch(m_language) { case GL_ES2_3: @@ -99,7 +99,7 @@ namespace videocore { namespace filters { } } void - SepiaVideoFilter::bind() + NightVisionVideoFilter::bind() { switch(m_language) { case GL_ES2_3: @@ -118,7 +118,7 @@ namespace videocore { namespace filters { } } void - SepiaVideoFilter::unbind() + NightVisionVideoFilter::unbind() { m_bound = false; } diff --git a/filters/Basic/SepiaVideoFilter.cpp b/filters/Basic/SepiaVideoFilter.cpp index 11f8d289..59cd2ba5 100644 --- a/filters/Basic/SepiaVideoFilter.cpp +++ b/filters/Basic/SepiaVideoFilter.cpp @@ -1,5 +1,5 @@ -#include +#include #include @@ -15,28 +15,28 @@ namespace videocore { namespace filters { - bool NightVisionVideoFilter::s_registered = NightVisionVideoFilter::registerFilter(); + bool SepiaVideoFilter::s_registered = SepiaVideoFilter::registerFilter(); bool - NightVisionVideoFilter::registerFilter() + SepiaVideoFilter::registerFilter() { - FilterFactory::_register("com.videocore.filters.nightVision", []() { return new NightVisionVideoFilter(); }); + FilterFactory::_register("com.videocore.filters.sepia", []() { return new SepiaVideoFilter(); }); return true; } - NightVisionVideoFilter::SepiaVideoFilter() + SepiaVideoFilter::SepiaVideoFilter() : IVideoFilter(), m_initialized(false), m_bound(false) { } - NightVisionVideoFilter::~NightVisionVideoFilter() + SepiaVideoFilter::~SepiaVideoFilter() { glDeleteProgram(m_program); glDeleteVertexArrays(1, &m_vao); } const char * const - NightVisionVideoFilter::vertexKernel() const + SepiaVideoFilter::vertexKernel() const { KERNEL(GL_ES2_3, m_language, @@ -54,7 +54,7 @@ namespace videocore { namespace filters { } const char * const - NightVisionVideoFilter::pixelKernel() const + SepiaVideoFilter::pixelKernel() const { KERNEL(GL_ES2_3, m_language, @@ -74,7 +74,7 @@ namespace videocore { namespace filters { return nullptr; } void - NightVisionVideoFilter::initialize() + SepiaVideoFilter::initialize() { switch(m_language) { case GL_ES2_3: @@ -99,7 +99,7 @@ namespace videocore { namespace filters { } } void - NightVisionVideoFilter::bind() + SepiaVideoFilter::bind() { switch(m_language) { case GL_ES2_3: @@ -118,7 +118,7 @@ namespace videocore { namespace filters { } } void - NightVisionVideoFilter::unbind() + SepiaVideoFilter::unbind() { m_bound = false; } From cec9c1c3dea4818a03d1ccc91aabdd6aa9b834fc Mon Sep 17 00:00:00 2001 From: jbeoris Date: Sat, 23 Jan 2016 00:20:42 -0800 Subject: [PATCH 3/7] expose night vision filter to api --- api/iOS/VCSimpleSession.h | 3 ++- api/iOS/VCSimpleSession.mm | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/api/iOS/VCSimpleSession.h b/api/iOS/VCSimpleSession.h index 7009aa46..0bd37cf5 100644 --- a/api/iOS/VCSimpleSession.h +++ b/api/iOS/VCSimpleSession.h @@ -66,7 +66,8 @@ typedef NS_ENUM(NSInteger, VCFilter) { VCFilterInvertColors, VCFilterSepia, VCFilterFisheye, - VCFilterGlow + VCFilterGlow, + VCFilterNightVision }; @protocol VCSessionDelegate diff --git a/api/iOS/VCSimpleSession.mm b/api/iOS/VCSimpleSession.mm index 8339d000..679d6219 100644 --- a/api/iOS/VCSimpleSession.mm +++ b/api/iOS/VCSimpleSession.mm @@ -689,6 +689,9 @@ - (void)setFilter:(VCFilter)filterToChange { case VCFilterGlow: filterName = @"com.videocore.filters.glow"; break; + case VCFilterNightVision: + filterName = @"com.videocore.filters.nightVision"; + break; default: break; } From 5f52fb803656317fdc93a235641b381bff1c4218 Mon Sep 17 00:00:00 2001 From: jbeoris Date: Sat, 23 Jan 2016 00:35:04 -0800 Subject: [PATCH 4/7] update night vision --- filters/Basic/NightVisionVideoFilter.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/filters/Basic/NightVisionVideoFilter.cpp b/filters/Basic/NightVisionVideoFilter.cpp index a8670382..131e01a6 100644 --- a/filters/Basic/NightVisionVideoFilter.cpp +++ b/filters/Basic/NightVisionVideoFilter.cpp @@ -61,10 +61,10 @@ namespace videocore { namespace filters { precision mediump float; varying vec2 vCoord; uniform sampler2D uTex0; - const vec3 NV = vec3(0.2, 1.0, 0.2); + const vec3 NV = vec3(0.6, 1.0, 0.6); void main(void) { vec4 color = texture2D(uTex0, vCoord); - float gray = dot(color.rgb, vec3(0.3, 0.59, 0.11)); + float gray = dot(color.rgb, vec3(0.3, 0.59, 0.3)); vec3 nightVisionaColor = vec3(gray) * NV; color.rgb = mix(color.rgb, nightVisionColor, 0.75); gl_FragColor = color; From 4171cce52639ba9fb1c5f5fb350368e02a2af73e Mon Sep 17 00:00:00 2001 From: jbeoris Date: Sat, 23 Jan 2016 07:25:38 -0800 Subject: [PATCH 5/7] test nightvision filter with sepia settings --- filters/Basic/NightVisionVideoFilter.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/filters/Basic/NightVisionVideoFilter.cpp b/filters/Basic/NightVisionVideoFilter.cpp index 131e01a6..43788af5 100644 --- a/filters/Basic/NightVisionVideoFilter.cpp +++ b/filters/Basic/NightVisionVideoFilter.cpp @@ -61,12 +61,12 @@ namespace videocore { namespace filters { precision mediump float; varying vec2 vCoord; uniform sampler2D uTex0; - const vec3 NV = vec3(0.6, 1.0, 0.6); + const vec3 SEPIA = vec3(1.2, 1.0, 0.8); void main(void) { vec4 color = texture2D(uTex0, vCoord); - float gray = dot(color.rgb, vec3(0.3, 0.59, 0.3)); - vec3 nightVisionaColor = vec3(gray) * NV; - color.rgb = mix(color.rgb, nightVisionColor, 0.75); + float gray = dot(color.rgb, vec3(0.3, 0.59, 0.11)); + vec3 sepiaColor = vec3(gray) * SEPIA; + color.rgb = mix(color.rgb, sepiaColor, 0.75); gl_FragColor = color; } ) From 3845fe880b00cc8a3483a484accbd752573077d3 Mon Sep 17 00:00:00 2001 From: jbeoris Date: Sat, 23 Jan 2016 07:50:24 -0800 Subject: [PATCH 6/7] Finalize Nightvision filter --- filters/Basic/NightVisionVideoFilter.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/filters/Basic/NightVisionVideoFilter.cpp b/filters/Basic/NightVisionVideoFilter.cpp index 43788af5..60f43f6e 100644 --- a/filters/Basic/NightVisionVideoFilter.cpp +++ b/filters/Basic/NightVisionVideoFilter.cpp @@ -57,19 +57,18 @@ namespace videocore { namespace filters { NightVisionVideoFilter::pixelKernel() const { - KERNEL(GL_ES2_3, m_language, + KERNEL(GL_ES2_3, m_language, precision mediump float; varying vec2 vCoord; uniform sampler2D uTex0; - const vec3 SEPIA = vec3(1.2, 1.0, 0.8); + const vec3 SEPIA = vec3(0.6, 1.6, 0.6); void main(void) { vec4 color = texture2D(uTex0, vCoord); float gray = dot(color.rgb, vec3(0.3, 0.59, 0.11)); vec3 sepiaColor = vec3(gray) * SEPIA; color.rgb = mix(color.rgb, sepiaColor, 0.75); gl_FragColor = color; - } - ) + } ) return nullptr; } From 297f69814e00ace26dcec5acff13f76754f5688e Mon Sep 17 00:00:00 2001 From: jbeoris Date: Sat, 23 Jan 2016 07:53:31 -0800 Subject: [PATCH 7/7] update var names --- filters/Basic/NightVisionVideoFilter.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/filters/Basic/NightVisionVideoFilter.cpp b/filters/Basic/NightVisionVideoFilter.cpp index 60f43f6e..ce2b4ff7 100644 --- a/filters/Basic/NightVisionVideoFilter.cpp +++ b/filters/Basic/NightVisionVideoFilter.cpp @@ -61,12 +61,12 @@ namespace videocore { namespace filters { precision mediump float; varying vec2 vCoord; uniform sampler2D uTex0; - const vec3 SEPIA = vec3(0.6, 1.6, 0.6); + const vec3 NVIS = vec3(0.6, 1.6, 0.6); void main(void) { vec4 color = texture2D(uTex0, vCoord); float gray = dot(color.rgb, vec3(0.3, 0.59, 0.11)); - vec3 sepiaColor = vec3(gray) * SEPIA; - color.rgb = mix(color.rgb, sepiaColor, 0.75); + vec3 nvisColor = vec3(gray) * NVIS; + color.rgb = mix(color.rgb, nvisColor, 0.75); gl_FragColor = color; } )