aboutsummaryrefslogtreecommitdiff
path: root/android_bench_suite/panorama.diff
diff options
context:
space:
mode:
Diffstat (limited to 'android_bench_suite/panorama.diff')
-rw-r--r--android_bench_suite/panorama.diff763
1 files changed, 0 insertions, 763 deletions
diff --git a/android_bench_suite/panorama.diff b/android_bench_suite/panorama.diff
deleted file mode 100644
index fcd214e2..00000000
--- a/android_bench_suite/panorama.diff
+++ /dev/null
@@ -1,763 +0,0 @@
-diff --git a/jni/Android.mk b/jni/Android.mk
-index 8b816270..d48e0d8e 100755
---- a/jni/Android.mk
-+++ b/jni/Android.mk
-@@ -1,50 +1,53 @@
-+local_target_dir := $(TARGET_OUT_DATA)/local/tmp
-+
- LOCAL_PATH:= $(call my-dir)
-
- include $(CLEAR_VARS)
-
- LOCAL_C_INCLUDES := \
-- $(LOCAL_PATH)/feature_stab/db_vlvm \
-- $(LOCAL_PATH)/feature_stab/src \
-- $(LOCAL_PATH)/feature_stab/src/dbreg \
-- $(LOCAL_PATH)/feature_mos/src \
-- $(LOCAL_PATH)/feature_mos/src/mosaic
--
--LOCAL_CFLAGS := -O3 -DNDEBUG
--LOCAL_CPPFLAGS := -std=gnu++98
--
--LOCAL_SRC_FILES := \
-- feature_mos_jni.cpp \
-- mosaic_renderer_jni.cpp \
-- feature_mos/src/mosaic/trsMatrix.cpp \
-- feature_mos/src/mosaic/AlignFeatures.cpp \
-- feature_mos/src/mosaic/Blend.cpp \
-- feature_mos/src/mosaic/Delaunay.cpp \
-- feature_mos/src/mosaic/ImageUtils.cpp \
-- feature_mos/src/mosaic/Mosaic.cpp \
-- feature_mos/src/mosaic/Pyramid.cpp \
-- feature_mos/src/mosaic_renderer/Renderer.cpp \
-- feature_mos/src/mosaic_renderer/WarpRenderer.cpp \
-- feature_mos/src/mosaic_renderer/SurfaceTextureRenderer.cpp \
-- feature_mos/src/mosaic_renderer/YVURenderer.cpp \
-- feature_mos/src/mosaic_renderer/FrameBuffer.cpp \
-- feature_stab/db_vlvm/db_feature_detection.cpp \
-- feature_stab/db_vlvm/db_feature_matching.cpp \
-- feature_stab/db_vlvm/db_framestitching.cpp \
-- feature_stab/db_vlvm/db_image_homography.cpp \
-- feature_stab/db_vlvm/db_rob_image_homography.cpp \
-- feature_stab/db_vlvm/db_utilities.cpp \
-- feature_stab/db_vlvm/db_utilities_camera.cpp \
-- feature_stab/db_vlvm/db_utilities_indexing.cpp \
-- feature_stab/db_vlvm/db_utilities_linalg.cpp \
-- feature_stab/db_vlvm/db_utilities_poly.cpp \
-- feature_stab/src/dbreg/dbreg.cpp \
-- feature_stab/src/dbreg/dbstabsmooth.cpp \
-- feature_stab/src/dbreg/vp_motionmodel.c
-+ $(LOCAL_PATH)/feature_mos/src \
-+ $(LOCAL_PATH)/feature_stab/src \
-+ $(LOCAL_PATH)/feature_stab/db_vlvm
-
--LOCAL_SHARED_LIBRARIES := liblog libnativehelper libGLESv2
--#LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -ldl -llog -lGLESv2 -L$(TARGET_OUT)
-+LOCAL_SRC_FILES := benchmark.cpp \
-+ feature_mos/src/mosaic/ImageUtils.cpp \
-+ feature_mos/src/mosaic/Mosaic.cpp \
-+ feature_mos/src/mosaic/AlignFeatures.cpp \
-+ feature_mos/src/mosaic/Blend.cpp \
-+ feature_mos/src/mosaic/Pyramid.cpp \
-+ feature_mos/src/mosaic/trsMatrix.cpp \
-+ feature_mos/src/mosaic/Delaunay.cpp \
-+ feature_mos/src/mosaic_renderer/Renderer.cpp \
-+ feature_mos/src/mosaic_renderer/WarpRenderer.cpp \
-+ feature_mos/src/mosaic_renderer/SurfaceTextureRenderer.cpp \
-+ feature_mos/src/mosaic_renderer/YVURenderer.cpp \
-+ feature_mos/src/mosaic_renderer/FrameBuffer.cpp \
-+ feature_stab/db_vlvm/db_rob_image_homography.cpp \
-+ feature_stab/db_vlvm/db_feature_detection.cpp \
-+ feature_stab/db_vlvm/db_image_homography.cpp \
-+ feature_stab/db_vlvm/db_framestitching.cpp \
-+ feature_stab/db_vlvm/db_feature_matching.cpp \
-+ feature_stab/db_vlvm/db_utilities.cpp \
-+ feature_stab/db_vlvm/db_utilities_camera.cpp \
-+ feature_stab/db_vlvm/db_utilities_indexing.cpp \
-+ feature_stab/db_vlvm/db_utilities_linalg.cpp \
-+ feature_stab/db_vlvm/db_utilities_poly.cpp \
-+ feature_stab/src/dbreg/dbstabsmooth.cpp \
-+ feature_stab/src/dbreg/dbreg.cpp \
-+ feature_stab/src/dbreg/vp_motionmodel.c
-
--LOCAL_MODULE_TAGS := optional
-+LOCAL_CFLAGS := -O3 -DNDEBUG -Wno-unused-parameter -Wno-maybe-uninitialized
-+LOCAL_CFLAGS += $(CFLAGS_FOR_BENCH_SUITE)
-+LOCAL_LDFLAGS := $(LDFLAGS_FOR_BENCH_SUITE)
-+LOCAL_CPPFLAGS := -std=c++98
-+LOCAL_MODULE_TAGS := tests
-+LOCAL_MODULE := panorama_bench
-+LOCAL_MODULE_STEM_32 := panorama_bench
-+LOCAL_MODULE_STEM_64 := panorama_bench64
-+LOCAL_MULTILIB := both
-+LOCAL_MODULE_PATH := $(local_target_dir)
-+LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
-+LOCAL_FORCE_STATIC_EXECUTABLE := true
-+LOCAL_STATIC_LIBRARIES := libc libm
-
--LOCAL_MODULE := libjni_legacymosaic
--include $(BUILD_SHARED_LIBRARY)
-+include $(BUILD_EXECUTABLE)
-diff --git a/jni/benchmark.cpp b/jni/benchmark.cpp
-new file mode 100755
-index 00000000..2a6440f4
---- /dev/null
-+++ b/jni/benchmark.cpp
-@@ -0,0 +1,131 @@
-+/*
-+ * Copyright (C) 2012 The Android Open Source Project
-+ *
-+ * Licensed under the Apache License, Version 2.0 (the "License");
-+ * you may not use this file except in compliance with the License.
-+ * You may obtain a copy of the License at
-+ *
-+ * http://www.apache.org/licenses/LICENSE-2.0
-+ *
-+ * Unless required by applicable law or agreed to in writing, software
-+ * distributed under the License is distributed on an "AS IS" BASIS,
-+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-+ * See the License for the specific language governing permissions and
-+ * limitations under the License.
-+ */
-+
-+#include <time.h>
-+#include <sys/types.h>
-+#include <sys/stat.h>
-+#include <unistd.h>
-+
-+#include "mosaic/Mosaic.h"
-+#include "mosaic/ImageUtils.h"
-+
-+#define MAX_FRAMES 200
-+#define KERNEL_ITERATIONS 10
-+
-+const int blendingType = Blend::BLEND_TYPE_HORZ;
-+const int stripType = Blend::STRIP_TYPE_WIDE;
-+
-+ImageType yvuFrames[MAX_FRAMES];
-+
-+int loadImages(const char* basename, int &width, int &height)
-+{
-+ char filename[512];
-+ struct stat filestat;
-+ int i;
-+
-+ for (i = 0; i < MAX_FRAMES; i++) {
-+ sprintf(filename, "%s_%03d.ppm", basename, i + 1);
-+ if (stat(filename, &filestat) != 0) break;
-+ ImageType rgbFrame = ImageUtils::readBinaryPPM(filename, width, height);
-+ yvuFrames[i] = ImageUtils::allocateImage(width, height,
-+ ImageUtils::IMAGE_TYPE_NUM_CHANNELS);
-+ ImageUtils::rgb2yvu(yvuFrames[i], rgbFrame, width, height);
-+ ImageUtils::freeImage(rgbFrame);
-+ }
-+ return i;
-+}
-+
-+int main(int argc, char **argv)
-+{
-+ struct timespec t1, t2, t3;
-+
-+ int width, height;
-+ float totalElapsedTime = 0;
-+
-+ const char *basename;
-+ const char *filename;
-+
-+ if (argc != 3) {
-+ printf("Usage: %s input_dir output_filename\n", argv[0]);
-+ return 0;
-+ } else {
-+ basename = argv[1];
-+ filename = argv[2];
-+ }
-+
-+ // Load the images outside the computational kernel
-+ int totalFrames = loadImages(basename, width, height);
-+
-+ if (totalFrames == 0) {
-+ printf("Image files not found. Make sure %s exists.\n",
-+ basename);
-+ return 1;
-+ }
-+
-+ printf("%d frames loaded\n", totalFrames);
-+
-+
-+ // Interesting stuff is here
-+ for (int iteration = 0; iteration < KERNEL_ITERATIONS; iteration++) {
-+ Mosaic mosaic;
-+
-+ mosaic.initialize(blendingType, stripType, width, height, -1, false, 0);
-+
-+ clock_gettime(CLOCK_MONOTONIC, &t1);
-+ for (int i = 0; i < totalFrames; i++) {
-+ mosaic.addFrame(yvuFrames[i]);
-+ }
-+ clock_gettime(CLOCK_MONOTONIC, &t2);
-+
-+ float progress = 0.0;
-+ bool cancelComputation = false;
-+
-+ mosaic.createMosaic(progress, cancelComputation);
-+
-+ int mosaicWidth, mosaicHeight;
-+ ImageType resultYVU = mosaic.getMosaic(mosaicWidth, mosaicHeight);
-+
-+ ImageType imageRGB = ImageUtils::allocateImage(
-+ mosaicWidth, mosaicHeight, ImageUtils::IMAGE_TYPE_NUM_CHANNELS);
-+
-+ clock_gettime(CLOCK_MONOTONIC, &t3);
-+
-+ float elapsedTime =
-+ (t3.tv_sec - t1.tv_sec) + (t3.tv_nsec - t1.tv_nsec)/1e9;
-+ float addImageTime =
-+ (t2.tv_sec - t1.tv_sec) + (t2.tv_nsec - t1.tv_nsec)/1e9;
-+ float stitchImageTime =
-+ (t3.tv_sec - t2.tv_sec) + (t3.tv_nsec - t2.tv_nsec)/1e9;
-+
-+ totalElapsedTime += elapsedTime;
-+
-+ printf("Iteration %d: %dx%d moasic created: "
-+ "%.2f seconds (%.2f + %.2f)\n",
-+ iteration, mosaicWidth, mosaicHeight,
-+ elapsedTime, addImageTime, stitchImageTime);
-+
-+ // Write the output only once for correctness check
-+ if (iteration == 0) {
-+ ImageUtils::yvu2rgb(imageRGB, resultYVU, mosaicWidth,
-+ mosaicHeight);
-+ ImageUtils::writeBinaryPPM(imageRGB, filename, mosaicWidth,
-+ mosaicHeight);
-+ }
-+ }
-+ printf("Total elapsed time: %.2f seconds\n", totalElapsedTime);
-+
-+ return 0;
-+}
-diff --git a/jni/feature_mos/src/mosaic/AlignFeatures.cpp b/jni/feature_mos/src/mosaic/AlignFeatures.cpp
-index aeabf8f9..703a5ea5 100644
---- a/jni/feature_mos/src/mosaic/AlignFeatures.cpp
-+++ b/jni/feature_mos/src/mosaic/AlignFeatures.cpp
-@@ -30,6 +30,8 @@
-
- #define LOG_TAG "AlignFeatures"
-
-+const double Align::DEFAULT_MAX_DISPARITY = 0.1;
-+
- Align::Align()
- {
- width = height = 0;
-diff --git a/jni/feature_mos/src/mosaic/AlignFeatures.h b/jni/feature_mos/src/mosaic/AlignFeatures.h
-index 19f39051..9999f575 100644
---- a/jni/feature_mos/src/mosaic/AlignFeatures.h
-+++ b/jni/feature_mos/src/mosaic/AlignFeatures.h
-@@ -44,7 +44,7 @@ public:
- ///// Settings for feature-based alignment
- // Number of features to use from corner detection
- static const int DEFAULT_NR_CORNERS=750;
-- static const double DEFAULT_MAX_DISPARITY=0.1;//0.4;
-+ static const double DEFAULT_MAX_DISPARITY;//0.4;
- // Type of homography to model
- static const int DEFAULT_MOTION_MODEL=DB_HOMOGRAPHY_TYPE_R_T;
- // static const int DEFAULT_MOTION_MODEL=DB_HOMOGRAPHY_TYPE_PROJECTIVE;
-diff --git a/jni/feature_mos/src/mosaic/Blend.cpp b/jni/feature_mos/src/mosaic/Blend.cpp
-index e37755de..b6a843a2 100644
---- a/jni/feature_mos/src/mosaic/Blend.cpp
-+++ b/jni/feature_mos/src/mosaic/Blend.cpp
-@@ -26,8 +26,8 @@
- #include "Geometry.h"
- #include "trsMatrix.h"
-
--#include "Log.h"
--#define LOG_TAG "BLEND"
-+const float Blend::LIMIT_SIZE_MULTIPLIER = 50.f * 2.0f;
-+const float Blend::LIMIT_HEIGHT_MULTIPLIER = 2.5f;
-
- Blend::Blend()
- {
-@@ -67,7 +67,6 @@ int Blend::initialize(int blendingType, int stripType, int frame_width, int fram
-
- if (!m_pFrameYPyr || !m_pFrameUPyr || !m_pFrameVPyr)
- {
-- LOGE("Error: Could not allocate pyramids for blending");
- return BLEND_RET_ERROR_MEMORY;
- }
-
-@@ -122,7 +121,6 @@ int Blend::runBlend(MosaicFrame **oframes, MosaicFrame **rframes,
-
- if (numCenters == 0)
- {
-- LOGE("Error: No frames to blend");
- return BLEND_RET_ERROR;
- }
-
-@@ -228,9 +226,6 @@ int Blend::runBlend(MosaicFrame **oframes, MosaicFrame **rframes,
-
- if (xRightMost <= xLeftMost || yBottomMost <= yTopMost)
- {
-- LOGE("RunBlend: aborting -consistency check failed,"
-- "(xLeftMost, xRightMost, yTopMost, yBottomMost): (%d, %d, %d, %d)",
-- xLeftMost, xRightMost, yTopMost, yBottomMost);
- return BLEND_RET_ERROR;
- }
-
-@@ -241,17 +236,12 @@ int Blend::runBlend(MosaicFrame **oframes, MosaicFrame **rframes,
- ret = MosaicSizeCheck(LIMIT_SIZE_MULTIPLIER, LIMIT_HEIGHT_MULTIPLIER);
- if (ret != BLEND_RET_OK)
- {
-- LOGE("RunBlend: aborting - mosaic size check failed, "
-- "(frame_width, frame_height) vs (mosaic_width, mosaic_height): "
-- "(%d, %d) vs (%d, %d)", width, height, Mwidth, Mheight);
- return ret;
- }
-
-- LOGI("Allocate mosaic image for blending - size: %d x %d", Mwidth, Mheight);
- YUVinfo *imgMos = YUVinfo::allocateImage(Mwidth, Mheight);
- if (imgMos == NULL)
- {
-- LOGE("RunBlend: aborting - couldn't alloc %d x %d mosaic image", Mwidth, Mheight);
- return BLEND_RET_ERROR_MEMORY;
- }
-
-@@ -362,7 +352,6 @@ int Blend::FillFramePyramid(MosaicFrame *mb)
- !PyramidShort::BorderReduce(m_pFrameUPyr, m_wb.nlevsC) || !PyramidShort::BorderExpand(m_pFrameUPyr, m_wb.nlevsC, -1) ||
- !PyramidShort::BorderReduce(m_pFrameVPyr, m_wb.nlevsC) || !PyramidShort::BorderExpand(m_pFrameVPyr, m_wb.nlevsC, -1))
- {
-- LOGE("Error: Could not generate Laplacian pyramids");
- return BLEND_RET_ERROR;
- }
- else
-@@ -384,7 +373,6 @@ int Blend::DoMergeAndBlend(MosaicFrame **frames, int nsite,
- m_pMosaicVPyr = PyramidShort::allocatePyramidPacked(m_wb.nlevsC,(unsigned short)rect.Width(),(unsigned short)rect.Height(),BORDER);
- if (!m_pMosaicYPyr || !m_pMosaicUPyr || !m_pMosaicVPyr)
- {
-- LOGE("Error: Could not allocate pyramids for blending");
- return BLEND_RET_ERROR_MEMORY;
- }
-
-@@ -579,6 +567,11 @@ int Blend::DoMergeAndBlend(MosaicFrame **frames, int nsite,
- // Blend
- PerformFinalBlending(imgMos, cropping_rect);
-
-+ if (cropping_rect.Width() <= 0 || cropping_rect.Height() <= 0)
-+ {
-+ return BLEND_RET_ERROR;
-+ }
-+
- if (m_pMosaicVPyr) free(m_pMosaicVPyr);
- if (m_pMosaicUPyr) free(m_pMosaicUPyr);
- if (m_pMosaicYPyr) free(m_pMosaicYPyr);
-@@ -632,7 +625,6 @@ int Blend::PerformFinalBlending(YUVinfo &imgMos, MosaicRect &cropping_rect)
- if (!PyramidShort::BorderExpand(m_pMosaicYPyr, m_wb.nlevs, 1) || !PyramidShort::BorderExpand(m_pMosaicUPyr, m_wb.nlevsC, 1) ||
- !PyramidShort::BorderExpand(m_pMosaicVPyr, m_wb.nlevsC, 1))
- {
-- LOGE("Error: Could not BorderExpand!");
- return BLEND_RET_ERROR;
- }
-
-@@ -785,18 +777,31 @@ int Blend::PerformFinalBlending(YUVinfo &imgMos, MosaicRect &cropping_rect)
- break;
- }
- }
-+
- }
-
-+ RoundingCroppingSizeToMultipleOf8(cropping_rect);
-+
- for(int j=0; j<imgMos.Y.height; j++)
- {
- delete b[j];
- }
-
-- delete b;
-+ delete[] b;
-
- return BLEND_RET_OK;
- }
-
-+void Blend::RoundingCroppingSizeToMultipleOf8(MosaicRect &rect) {
-+ int height = rect.bottom - rect.top + 1;
-+ int residue = height & 7;
-+ rect.bottom -= residue;
-+
-+ int width = rect.right - rect.left + 1;
-+ residue = width & 7;
-+ rect.right -= residue;
-+}
-+
- void Blend::ComputeMask(CSite *csite, BlendRect &vcrect, BlendRect &brect, MosaicRect &rect, YUVinfo &imgMos, int site_idx)
- {
- PyramidShort *dptr = m_pMosaicYPyr;
-diff --git a/jni/feature_mos/src/mosaic/Blend.h b/jni/feature_mos/src/mosaic/Blend.h
-index 6371fdeb..175eacd4 100644
---- a/jni/feature_mos/src/mosaic/Blend.h
-+++ b/jni/feature_mos/src/mosaic/Blend.h
-@@ -119,9 +119,10 @@ protected:
- void CropFinalMosaic(YUVinfo &imgMos, MosaicRect &cropping_rect);
-
- private:
-- static const float LIMIT_SIZE_MULTIPLIER = 5.0f * 2.0f;
-- static const float LIMIT_HEIGHT_MULTIPLIER = 2.5f;
-+ static const float LIMIT_SIZE_MULTIPLIER;
-+ static const float LIMIT_HEIGHT_MULTIPLIER;
- int MosaicSizeCheck(float sizeMultiplier, float heightMultiplier);
-+ void RoundingCroppingSizeToMultipleOf8(MosaicRect& rect);
- };
-
- #endif
-diff --git a/jni/feature_mos/src/mosaic/Delaunay.cpp b/jni/feature_mos/src/mosaic/Delaunay.cpp
-index 82f5d203..0ce09fc5 100644
---- a/jni/feature_mos/src/mosaic/Delaunay.cpp
-+++ b/jni/feature_mos/src/mosaic/Delaunay.cpp
-@@ -24,7 +24,7 @@
-
- #define QQ 9 // Optimal value as determined by testing
- #define DM 38 // 2^(1+DM/2) element sort capability. DM=38 for >10^6 elements
--#define NYL (-1)
-+#define NYL -1
- #define valid(l) ccw(orig(basel), dest(l), dest(basel))
-
-
-diff --git a/jni/feature_mos/src/mosaic/ImageUtils.cpp b/jni/feature_mos/src/mosaic/ImageUtils.cpp
-index 6d0aac0c..daa86060 100644
---- a/jni/feature_mos/src/mosaic/ImageUtils.cpp
-+++ b/jni/feature_mos/src/mosaic/ImageUtils.cpp
-@@ -283,7 +283,7 @@ ImageType ImageUtils::readBinaryPPM(const char *filename, int &width, int &heigh
-
- FILE *imgin = NULL;
- int mval=0, format=0, eret;
-- ImageType ret = IMAGE_TYPE_NOIMAGE;
-+ ImageType ret = NULL;//IMAGE_TYPE_NOIMAGE;
-
- imgin = fopen(filename, "r");
- if (imgin == NULL) {
-diff --git a/jni/feature_mos/src/mosaic/ImageUtils.h b/jni/feature_mos/src/mosaic/ImageUtils.h
-index 87782383..92965ca8 100644
---- a/jni/feature_mos/src/mosaic/ImageUtils.h
-+++ b/jni/feature_mos/src/mosaic/ImageUtils.h
-@@ -47,7 +47,7 @@ public:
- /**
- * Definition of an empty image.
- */
-- static const int IMAGE_TYPE_NOIMAGE = NULL;
-+ static const int IMAGE_TYPE_NOIMAGE = 0;
-
- /**
- * Convert image from BGR (interlaced) to YVU (non-interlaced)
-diff --git a/jni/feature_mos/src/mosaic/Log.h b/jni/feature_mos/src/mosaic/Log.h
-index cf6f14b1..2adfeda9 100644
---- a/jni/feature_mos/src/mosaic/Log.h
-+++ b/jni/feature_mos/src/mosaic/Log.h
-@@ -14,7 +14,7 @@
- * limitations under the License.
- */
- #ifndef LOG_H_
--#define LOG_H_
-+#define LOG_H_
-
- #include <android/log.h>
- #define LOGV(...) __android_log_print(ANDROID_LOG_SILENT, LOG_TAG, __VA_ARGS__)
-diff --git a/jni/feature_mos/src/mosaic/Mosaic.cpp b/jni/feature_mos/src/mosaic/Mosaic.cpp
-index f17c030b..4abc6f68 100644
---- a/jni/feature_mos/src/mosaic/Mosaic.cpp
-+++ b/jni/feature_mos/src/mosaic/Mosaic.cpp
-@@ -26,9 +26,6 @@
- #include "Mosaic.h"
- #include "trsMatrix.h"
-
--#include "Log.h"
--#define LOG_TAG "MOSAIC"
--
- Mosaic::Mosaic()
- {
- initialized = false;
-@@ -47,6 +44,10 @@ Mosaic::~Mosaic()
- delete frames;
- delete rframes;
-
-+ for (int j = 0; j < owned_size; j++)
-+ delete owned_frames[j];
-+ delete owned_frames;
-+
- if (aligner != NULL)
- delete aligner;
- if (blender != NULL)
-@@ -88,13 +89,10 @@ int Mosaic::initialize(int blendingType, int stripType, int width, int height, i
- {
- frames[i] = NULL;
- }
--
--
- }
-
-- LOGV("Initialize %d %d", width, height);
-- LOGV("Frame width %d,%d", width, height);
-- LOGV("Max num frames %d", max_frames);
-+ owned_frames = new ImageType[max_frames];
-+ owned_size = 0;
-
- aligner = new Align();
- aligner->initialize(width, height,quarter_res,thresh_still);
-@@ -107,7 +105,6 @@ int Mosaic::initialize(int blendingType, int stripType, int width, int height, i
- blender->initialize(blendingType, stripType, width, height);
- } else {
- blender = NULL;
-- LOGE("Error: Unknown blending type %d",blendingType);
- return MOSAIC_RET_ERROR;
- }
-
-@@ -123,7 +120,15 @@ int Mosaic::addFrameRGB(ImageType imageRGB)
- imageYVU = ImageUtils::allocateImage(this->width, this->height, ImageUtils::IMAGE_TYPE_NUM_CHANNELS);
- ImageUtils::rgb2yvu(imageYVU, imageRGB, width, height);
-
-- return addFrame(imageYVU);
-+ int existing_frames_size = frames_size;
-+ int ret = addFrame(imageYVU);
-+
-+ if (frames_size > existing_frames_size)
-+ owned_frames[owned_size++] = imageYVU;
-+ else
-+ ImageUtils::freeImage(imageYVU);
-+
-+ return ret;
- }
-
- int Mosaic::addFrame(ImageType imageYVU)
-@@ -146,8 +151,6 @@ int Mosaic::addFrame(ImageType imageYVU)
-
- if (frames_size >= max_frames)
- {
-- LOGV("WARNING: More frames than preallocated, ignoring."
-- "Increase maximum number of frames (-f <max_frames>) to avoid this");
- return MOSAIC_RET_ERROR;
- }
-
-diff --git a/jni/feature_mos/src/mosaic/Mosaic.h b/jni/feature_mos/src/mosaic/Mosaic.h
-index fc6ecd90..9dea6642 100644
---- a/jni/feature_mos/src/mosaic/Mosaic.h
-+++ b/jni/feature_mos/src/mosaic/Mosaic.h
-@@ -181,6 +181,12 @@ protected:
- int frames_size;
- int max_frames;
-
-+ /**
-+ * Implicitly created frames, should be freed by Mosaic.
-+ */
-+ ImageType *owned_frames;
-+ int owned_size;
-+
- /**
- * Initialization state.
- */
-diff --git a/jni/feature_mos/src/mosaic/Pyramid.cpp b/jni/feature_mos/src/mosaic/Pyramid.cpp
-index 945eafba..b022d73d 100644
---- a/jni/feature_mos/src/mosaic/Pyramid.cpp
-+++ b/jni/feature_mos/src/mosaic/Pyramid.cpp
-@@ -154,24 +154,30 @@ void PyramidShort::BorderExpandOdd(PyramidShort *in, PyramidShort *out, PyramidS
- // Vertical Filter
- for (j = -off; j < in->height + off; j++) {
- int j2 = j * 2;
-- for (i = -scr->border; i < scr->width + scr->border; i++) {
-+ int limit = scr->width + scr->border;
-+ for (i = -scr->border; i < limit; i++) {
-+ int t1 = in->ptr[j][i];
-+ int t2 = in->ptr[j+1][i];
- scr->ptr[j2][i] = (short)
-- ((6 * in->ptr[j][i] + (in->ptr[j-1][i] + in->ptr[j+1][i]) + 4) >> 3);
-- scr->ptr[j2+1][i] = (short)((in->ptr[j][i] + in->ptr[j+1][i] + 1) >> 1);
-+ ((6 * t1 + (in->ptr[j-1][i] + t2) + 4) >> 3);
-+ scr->ptr[j2+1][i] = (short)((t1 + t2 + 1) >> 1);
- }
- }
-
- BorderSpread(scr, 0, 0, 3, 3);
-
- // Horizontal Filter
-- for (i = -off; i < scr->width + off; i++) {
-- int i2 = i * 2;
-- for (j = -out->border; j < out->height + out->border; j++) {
-+ int limit = out->height + out->border;
-+ for (j = -out->border; j < limit; j++) {
-+ for (i = -off; i < scr->width + off; i++) {
-+ int i2 = i * 2;
-+ int t1 = scr->ptr[j][i];
-+ int t2 = scr->ptr[j][i+1];
- out->ptr[j][i2] = (short) (out->ptr[j][i2] +
-- (mode * ((6 * scr->ptr[j][i] +
-- scr->ptr[j][i-1] + scr->ptr[j][i+1] + 4) >> 3)));
-+ (mode * ((6 * t1 +
-+ scr->ptr[j][i-1] + t2 + 4) >> 3)));
- out->ptr[j][i2+1] = (short) (out->ptr[j][i2+1] +
-- (mode * ((scr->ptr[j][i] + scr->ptr[j][i+1] + 1) >> 1)));
-+ (mode * ((t1 + t2 + 1) >> 1)));
- }
- }
-
-diff --git a/jni/feature_mos/src/mosaic_renderer/FrameBuffer.cpp b/jni/feature_mos/src/mosaic_renderer/FrameBuffer.cpp
-index 9a07e496..a956f23b 100755
---- a/jni/feature_mos/src/mosaic_renderer/FrameBuffer.cpp
-+++ b/jni/feature_mos/src/mosaic_renderer/FrameBuffer.cpp
-@@ -55,6 +55,8 @@ bool FrameBuffer::Init(int width, int height, GLenum format) {
- GL_TEXTURE_2D,
- mTextureName,
- 0);
-+ checkFramebufferStatus("FrameBuffer.cpp");
-+ checkGlError("framebuffertexture2d");
-
- if (!checkGlError("texture setup")) {
- return false;
-@@ -94,6 +96,3 @@ int FrameBuffer::GetWidth() const {
- int FrameBuffer::GetHeight() const {
- return mHeight;
- }
--
--
--
-diff --git a/jni/feature_mos/src/mosaic_renderer/FrameBuffer.h b/jni/feature_mos/src/mosaic_renderer/FrameBuffer.h
-index b6a20ad1..314b1262 100755
---- a/jni/feature_mos/src/mosaic_renderer/FrameBuffer.h
-+++ b/jni/feature_mos/src/mosaic_renderer/FrameBuffer.h
-@@ -4,7 +4,10 @@
- #include <GLES2/gl2.h>
- #include <GLES2/gl2ext.h>
-
--extern bool checkGlError(const char* op);
-+#define checkGlError(op) checkGLErrorDetail(__FILE__, __LINE__, (op))
-+
-+extern bool checkGLErrorDetail(const char* file, int line, const char* op);
-+extern void checkFramebufferStatus(const char* name);
-
- class FrameBuffer {
- public:
-diff --git a/jni/feature_mos/src/mosaic_renderer/Renderer.cpp b/jni/feature_mos/src/mosaic_renderer/Renderer.cpp
-index c5c143f9..b9938eb6 100755
---- a/jni/feature_mos/src/mosaic_renderer/Renderer.cpp
-+++ b/jni/feature_mos/src/mosaic_renderer/Renderer.cpp
-@@ -87,7 +87,7 @@ GLuint Renderer::createProgram(const char* pVertexSource, const char* pFragmentS
- GLint linkStatus = GL_FALSE;
- glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
-
-- LOGI("Program Linked!");
-+ LOGI("Program Linked (%d)!", program);
-
- if (linkStatus != GL_TRUE)
- {
-diff --git a/jni/feature_stab/db_vlvm/db_utilities_constants.h b/jni/feature_stab/db_vlvm/db_utilities_constants.h
-index 612fc783..07565efd 100644
---- a/jni/feature_stab/db_vlvm/db_utilities_constants.h
-+++ b/jni/feature_stab/db_vlvm/db_utilities_constants.h
-@@ -64,7 +64,7 @@
- #define DB_DEFAULT_ABS_CORNER_THRESHOLD 50000000.0
- #define DB_DEFAULT_REL_CORNER_THRESHOLD 0.00005
- #define DB_DEFAULT_MAX_DISPARITY 0.1
--#define DB_DEFAULT_NO_DISPARITY (-1.0)
-+#define DB_DEFAULT_NO_DISPARITY -1.0
- #define DB_DEFAULT_MAX_TRACK_LENGTH 300
-
- #define DB_DEFAULT_MAX_NR_CAMERAS 1000
-diff --git a/jni/feature_stab/src/dbreg/dbreg.cpp b/jni/feature_stab/src/dbreg/dbreg.cpp
-index dc7d58fe..da06aa2a 100644
---- a/jni/feature_stab/src/dbreg/dbreg.cpp
-+++ b/jni/feature_stab/src/dbreg/dbreg.cpp
-@@ -485,7 +485,8 @@ int db_FrameToReferenceRegistration::AddFrame(const unsigned char * const * im,
- if(m_do_motion_smoothing)
- SmoothMotion();
-
-- db_PrintDoubleMatrix(m_H_ref_to_ins,3,3);
-+ // Disable debug printing
-+ // db_PrintDoubleMatrix(m_H_ref_to_ins,3,3);
-
- db_Copy9(H, m_H_ref_to_ins);
-
-diff --git a/jni/feature_stab/src/dbreg/dbstabsmooth.cpp b/jni/feature_stab/src/dbreg/dbstabsmooth.cpp
-index dffff8ab..2bb5d2e5 100644
---- a/jni/feature_stab/src/dbreg/dbstabsmooth.cpp
-+++ b/jni/feature_stab/src/dbreg/dbstabsmooth.cpp
-@@ -136,7 +136,7 @@ bool db_StabilizationSmoother::smoothMotionAdaptive(/*VP_BIMG *bimg,*/int hsize,
- smoothFactor = minSmoothFactor;
-
- // Find the amount of motion that must be compensated so that no "border" pixels are seen in the stable video
-- for (smoothFactor = smoothFactor; smoothFactor >= minSmoothFactor; smoothFactor -= 0.01) {
-+ for (; smoothFactor >= minSmoothFactor; smoothFactor -= 0.01) {
- // Compute the smoothed motion
- if(!smoothMotion(inmot, &tmpMotion, smoothFactor))
- break;
-diff --git a/jni/feature_stab/src/dbreg/vp_motionmodel.h b/jni/feature_stab/src/dbreg/vp_motionmodel.h
-index 71a7f7e7..a63ac001 100644
---- a/jni/feature_stab/src/dbreg/vp_motionmodel.h
-+++ b/jni/feature_stab/src/dbreg/vp_motionmodel.h
-@@ -120,7 +120,7 @@ enum VP_MOTION_MODEL {
- VP_VFE_AFFINE=120
- };
-
--#define VP_REFID (-1) /* Default ID used for reference frame */
-+#define VP_REFID -1 /* Default ID used for reference frame */
-
- typedef struct {
- VP_TRS par; /* Contains the motion paramerers.
-@@ -205,16 +205,16 @@ typedef struct {
- /* Warp a 2d point (assuming the z component is zero) */
- #define VP_WARP_POINT_2D(inx,iny,m,outx,outy) do {\
- VP_PAR vpTmpWarpPnt___= MWX(m)*(inx)+MWY(m)*(iny)+MWW(m); \
-- (outx) = (MXX(m)*((VP_PAR)(inx))+MXY(m)*((VP_PAR)(iny))+MXW(m))/vpTmpWarpPnt___; \
-- (outy) = (MYX(m)*((VP_PAR)(inx))+MYY(m)*((VP_PAR)(iny))+MYW(m))/vpTmpWarpPnt___; } while (0)
-+ outx = (MXX(m)*((VP_PAR)inx)+MXY(m)*((VP_PAR)iny)+MXW(m))/vpTmpWarpPnt___; \
-+ outy = (MYX(m)*((VP_PAR)inx)+MYY(m)*((VP_PAR)iny)+MYW(m))/vpTmpWarpPnt___; } while (0)
-
- /* Warp a 3d point */
- #define VP_WARP_POINT_3D(inx,iny,inz,m,outx,outy,outz) do {\
-- VP_PAR vpTmpWarpPnt___= MWX(m)*(inx)+MWY(m)*(iny)+MWZ(m)*((VP_PAR)(inz))+MWW(m); \
-- (outx) = (MXX(m)*((VP_PAR)(inx))+MXY(m)*((VP_PAR)(iny))+MXZ(m)*((VP_PAR)(inz))+MXW(m))/vpTmpWarpPnt___; \
-- (outy) = (MYX(m)*((VP_PAR)(inx))+MYY(m)*((VP_PAR)(iny))+MYZ(m)*((VP_PAR)(inz))+MYW(m))/vpTmpWarpPnt___; \
-- (outz) = MZX(m)*((VP_PAR)(inx))+MZY(m)*((VP_PAR)(iny))+MZZ(m)*((VP_PAR)(inz))+MZW(m); \
-- if ((m).type==VP_MOTION_PROJ_3D) (outz)/=vpTmpWarpPnt___; } while (0)
-+ VP_PAR vpTmpWarpPnt___= MWX(m)*(inx)+MWY(m)*(iny)+MWZ(m)*((VP_PAR)inz)+MWW(m); \
-+ outx = (MXX(m)*((VP_PAR)inx)+MXY(m)*((VP_PAR)iny)+MXZ(m)*((VP_PAR)inz)+MXW(m))/vpTmpWarpPnt___; \
-+ outy = (MYX(m)*((VP_PAR)inx)+MYY(m)*((VP_PAR)iny)+MYZ(m)*((VP_PAR)inz)+MYW(m))/vpTmpWarpPnt___; \
-+ outz = MZX(m)*((VP_PAR)inx)+MZY(m)*((VP_PAR)iny)+MZZ(m)*((VP_PAR)inz)+MZW(m); \
-+ if ((m).type==VP_MOTION_PROJ_3D) outz/=vpTmpWarpPnt___; } while (0)
-
- /* Projections of each component */
- #define VP_PROJW_3D(m,x,y,z,f) ( MWX(m)*(x)+MWY(m)*(y)+MWZ(m)*(z)+MWW(m) )
-@@ -224,15 +224,15 @@ typedef struct {
-
- /* Scale Down a matrix by Sfactor */
- #define VP_SCALEDOWN(m,Sfactor) do { \
-- MXW(m) /= (VP_PAR)(Sfactor); MWX(m) *= (VP_PAR)(Sfactor); \
-- MYW(m) /= (VP_PAR)(Sfactor); MWY(m) *= (VP_PAR)(Sfactor); \
-- MZW(m) /= (VP_PAR)(Sfactor); MWZ(m) *= (VP_PAR)(Sfactor); } while (0)
-+ MXW(m) /= (VP_PAR)Sfactor; MWX(m) *= (VP_PAR)Sfactor; \
-+ MYW(m) /= (VP_PAR)Sfactor; MWY(m) *= (VP_PAR)Sfactor; \
-+ MZW(m) /= (VP_PAR)Sfactor; MWZ(m) *= (VP_PAR)Sfactor; } while (0)
-
- /* Scale Up a matrix by Sfactor */
- #define VP_SCALEUP(m,Sfactor) do { \
-- MXW(m) *= (VP_PAR)(Sfactor); MWX(m) /= (VP_PAR)(Sfactor); \
-- MYW(m) *= (VP_PAR)(Sfactor); MWY(m) /= (VP_PAR)(Sfactor); \
-- MZW(m) *= (VP_PAR)(Sfactor); MWZ(m) /= (VP_PAR)(Sfactor); } while (0)
-+ MXW(m) *= (VP_PAR)Sfactor; MWX(m) /= (VP_PAR)Sfactor; \
-+ MYW(m) *= (VP_PAR)Sfactor; MWY(m) /= (VP_PAR)Sfactor; \
-+ MZW(m) *= (VP_PAR)Sfactor; MWZ(m) /= (VP_PAR)Sfactor; } while (0)
-
- /* Normalize the transformation matrix so that MWW is 1 */
- #define VP_NORMALIZE(m) if (MWW(m)!=(VP_PAR)0.0) do { \
-@@ -253,15 +253,15 @@ typedef struct {
-
- /* w' projection given a point x,y,0,f */
- #define VP_PROJZ(m,x,y,f) ( \
-- MWX(m)*((VP_PAR)(x))+MWY(m)*((VP_PAR)(y))+MWW(m)*((VP_PAR)(f)))
-+ MWX(m)*((VP_PAR)x)+MWY(m)*((VP_PAR)y)+MWW(m)*((VP_PAR)f))
-
- /* X Projection given a point x,y,0,f and w' */
- #define VP_PROJX(m,x,y,w,f) (\
-- (MXX(m)*((VP_PAR)(x))+MXY(m)*((VP_PAR)(y))+MXW(m)*((VP_PAR)(f)))/((VP_PAR)(w)))
-+ (MXX(m)*((VP_PAR)x)+MXY(m)*((VP_PAR)y)+MXW(m)*((VP_PAR)f))/((VP_PAR)w))
-
- /* Y Projection given a point x,y,0,f and the w' */
- #define VP_PROJY(m,x,y,w,f) (\
-- (MYX(m)*((VP_PAR)(x))+MYY(m)*((VP_PAR)(y))+MYW(m)*((VP_PAR)(f)))/((VP_PAR)(w)))
-+ (MYX(m)*((VP_PAR)x)+MYY(m)*((VP_PAR)y)+MYW(m)*((VP_PAR)f))/((VP_PAR)w))
-
- /* Set the reference id for a motion */
- #define VP_SET_REFID(m,id) do { (m).refid=id; } while (0)