content: ///*
  //The contents of this file are subject to the Mozilla Public License
  //Version 1.1 (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.mozilla.org/MPL/
  //
  //Software distributed under the License is distributed on an "AS IS"
  //basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
  //License for the specific language governing rights and limitations
  //under the License.
  //
  //The Original Code is collection of files collectively known as Open Camera.
  //
  //The Initial Developer of the Original Code is Almalence Inc.
  //Portions created by Initial Developer are Copyright (C) 2013 
  //by Almalence Inc. All Rights Reserved.
  // */
  //
  //package com.almalence.plugins.processing.sequence;
  //
  //import java.io.ByteArrayOutputStream;
  //import java.util.List;
  //
  //import android.content.SharedPreferences;
  //import android.graphics.Bitmap;
  //import android.graphics.Bitmap.Config;
  //import android.graphics.ImageFormat;
  //import android.graphics.Matrix;
  //import android.graphics.Rect;
  //import android.preference.PreferenceManager;
  //import android.util.Log;
  //
  //import com.almalence.SwapHeap;
  //import com.almalence.util.Size;
  //
  ///* <!-- +++
  //import com.almalence.opencam_plus.ApplicationScreen;
  //+++ --> */
  ////<!-- -+-
  //import com.almalence.opencam.ApplicationScreen;
  ////-+- -->
  //
  //public class AlmaCLRShot
  //{
  //	private final String		TAG				= this.getClass().getName()
  //														.substring(this.getClass().getName().lastIndexOf(".") + 1);
  //
  //	private int					IMAGE_TO_LAYOUT	= 8;
  //	private static final int	MAX_INPUT_FRAME	= 8;
  //	
  //	private static final int    MPIX_5 			= 5000000;
  //
  //	private List<byte[]>		mJpegData;
  //	private Size				mPreviewSize;
  //	private Size				mInputFrameSize;
  //	private int					mNumOfFrame;
  //	private int[]				ARGBBuffer		= null;
  //	private int[]				mCrop			= null;
  //	private int					mSensitivity;	// sensitivity:
  //												// default
  //												// is
  //												// 0,
  //												// useful
  //												// range
  //												// is
  //												// [-15..+15]
  //	private int					mMinSize;		// minSize:
  //												// the
  //												// smallest
  //												// object
  //												// size
  //												// which
  //												// will
  //												// be
  //												// detected
  //												// (object
  //												// area,
  //												// in
  //												// pixels).
  //	private int					mGhosting;
  //
  //	private int					mOutNV21		= 0;
  //	private Rect[]				mBoarderRect	= null;
  //
  //	private static final Object	syncObject		= new Object();
  //
  //	private AlmaCLRShot()
  //	{
  //		super();
  //	}
  //
  //	private static final AlmaCLRShot	mInstance	= new AlmaCLRShot();
  //
  //	public static AlmaCLRShot getInstance()
  //	{
  //		return mInstance;
  //	}
  //
  //	public void addYUVInputFrame(List<Integer> inputFrame, Size size) throws Exception
  //	{
  //		mNumOfFrame = inputFrame.size();
  //		mInputFrameSize = size;
  //
  //		//Log.d(TAG, "mInputFrameSize WxH = " + mInputFrameSize.getWidth() + " x " + mInputFrameSize.getHeight());
  //
  //		if (mNumOfFrame < 1 && mNumOfFrame > 8)
  //		{
  //			throw new Exception("Number of input frame is wrong");
  //		}
  //
  //		Initialize();
  //
  //		int[] PointOfYUVData = new int[mNumOfFrame];
  //		int[] LengthOfYUVData = new int[mNumOfFrame];
  //
  //		int data_lenght = mInputFrameSize.getWidth() * mInputFrameSize.getHeight() + 2
  //				* ((mInputFrameSize.getWidth() + 1) / 2) * ((mInputFrameSize.getHeight() + 1) / 2);
  //		for (int i = 0; i < mNumOfFrame; i++)
  //		{
  //			PointOfYUVData[i] = inputFrame.get(i);
  //			LengthOfYUVData[i] = data_lenght;
  //			if (PointOfYUVData[i] == 0)
  //			{
  //				Log.d(TAG, "Out of Memory in Native");
  //				throw new Exception("Out of Memory in Native");
  //			}
  //		}
  //
  //		int error = addYUVInputFrames(PointOfYUVData, LengthOfYUVData, mNumOfFrame, size.getWidth(), size.getHeight());
  //		if (error < 0)
  //		{
  //			Log.d(TAG, "Out Of Memory");
  //			throw new Exception("Out Of Memory");
  //		} else if (error < MAX_INPUT_FRAME)
  //		{
  //			Log.d(TAG, "YUV data is wrong in " + error + " frame");
  //			throw new Exception("Out Of Memory");
  //		}
  //
  //		return;
  //	}
  //
  //	public boolean initialize(Size previewSize, int sensitivity, int minSize, int ghosting,
  //			int[] sports_order) throws Exception
  //	{
  //		mGhosting = ghosting;
  //		mPreviewSize = previewSize;
  //		mSensitivity = sensitivity;
  //		mMinSize = minSize;
  //
  //		if (!mPreviewSize.isValid())
  //		{
  //			Log.d(TAG, "Preview size is wrong");
  //			throw new Exception("Too Many Input Frame");
  //		}
  //
  //		if (mSensitivity < -15 || mSensitivity > 15)
  //		{
  //			Log.d(TAG, "Sensitivity value is wrong");
  //			throw new Exception("Sensitivity value is wrong");
  //		}
  //
  //		if (mMinSize < 0 || mMinSize > mInputFrameSize.getWidth() * mInputFrameSize.getHeight())
  //		{
  //			Log.d(TAG, "MinSize value is wrong");
  //			throw new Exception("Sensitivity value is wrong");
  //		}
  //
  //		mCrop = new int[5];
  //		mCrop[4] = 0;
  //		
  //		if(mInputFrameSize.getWidth() * mInputFrameSize.getHeight() > MPIX_5)
  //			this.IMAGE_TO_LAYOUT = 16;
  //		else
  //			this.IMAGE_TO_LAYOUT = 8;
  //
  //		removeProcessing(sports_order);
  //
  //		return true;
  //	}
  //
  //	private Bitmap rotateBitmap(Bitmap b, int w, int h, float angle)
  //	{
  //		if (b == null)
  //		{
  //			return b;
  //		}
  //		if (angle == 0)
  //		{
  //			return b;
  //		}
  //		Matrix matrix = new Matrix();
  //		matrix.preRotate(angle);
  //		Bitmap rotImage = Bitmap.createBitmap(b, 0, 0, w, h, matrix, true);
  //		b.recycle();
  //		return rotImage;
  //	}
  //
  //	public Bitmap getPreviewBitmap()
  //	{
  //		Bitmap bitmap = Bitmap.createBitmap(mPreviewSize.getWidth(), mPreviewSize.getHeight(), Config.ARGB_8888);
  //
  //		Rect rect = new Rect(0, 0, mInputFrameSize.getWidth(), mInputFrameSize.getHeight());
  //		ARGBBuffer = NV21toARGB(mOutNV21, mInputFrameSize, rect, mPreviewSize);
  //		bitmap.setPixels(ARGBBuffer, 0, mPreviewSize.getWidth(), 0, 0, mPreviewSize.getWidth(),
  //				mPreviewSize.getHeight());
  //		ARGBBuffer = null;
  //
  //		return bitmap;
  //	}
  //
  //	public byte[] processingSaveData()
  //	{
  //		byte[] jpegBuffer = null;
  //
  //		android.graphics.YuvImage out = new android.graphics.YuvImage(SwapHeap.SwapFromHeap(mOutNV21,
  //				mInputFrameSize.getWidth() * mInputFrameSize.getHeight() * 3 / 2), ImageFormat.NV21,
  //				mInputFrameSize.getWidth(), mInputFrameSize.getHeight(), null);
  //		mOutNV21 = 0;
  //		try
  //		{
  //			ByteArrayOutputStream os = new ByteArrayOutputStream();
  //
  //			Rect r = new Rect(mCrop[0], mCrop[1], mCrop[0] + mCrop[2], mCrop[1] + mCrop[3]);
  //
  //			SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ApplicationScreen.getMainContext());
  //			int jpegQuality = Integer.parseInt(prefs.getString(ApplicationScreen.sJPEGQualityPref, "95"));
  //			if (!out.compressToJpeg(r, jpegQuality, os))
  //			{
  //				Log.d(TAG, "the compression is not successful");
  //			}
  //			jpegBuffer = os.toByteArray();
  //			os.close();
  //
  //		} catch (Exception e)
  //		{
  //			Log.d(TAG, "Exception occured");
  //			e.printStackTrace();
  //		}
  //
  //		return jpegBuffer;
  //	}
  //
  //	public void release()
  //	{
  //		synchronized (syncObject)
  //		{
  //			Release(mNumOfFrame);
  //
  //			mPreviewSize = null;
  //			mInputFrameSize = null;
  //
  //			ARGBBuffer = null;
  //			mCrop = null;
  //
  //			mBoarderRect = null;
  //
  //			IMAGE_TO_LAYOUT = 8;
  //
  //			if (mOutNV21 != 0)
  //			{
  //				SwapHeap.FreeFromHeap(mOutNV21);
  //				mOutNV21 = 0;
  //			}
  //
  //			try
  //			{
  //				this.finalize();
  //			} catch (Throwable e)
  //			{
  //				Log.d(TAG, "Instance is not finalized correctly");
  //				e.printStackTrace();
  //			}
  //		}
  //		return;
  //	}
  //
  //	private synchronized void removeProcessing(int[] sports_order)
  //	{
  //		if (mOutNV21 != 0)
  //		{
  //			SwapHeap.FreeFromHeap(mOutNV21);
  //			mOutNV21 = 0;
  //		}
  //
  //		mOutNV21 = MovObjProcess(mNumOfFrame, mInputFrameSize, mSensitivity, mMinSize, null, mCrop, null, mGhosting,
  //				IMAGE_TO_LAYOUT, sports_order);
  //		return;
  //	}
  //
  //	private static native String Initialize();
  //
  //	private static native int Release(int nFrames);
  //
  //	private static native int ConvertFromJpeg(int[] frame, int[] frame_len, int nFrames, int sx, int sy);
  //
  //	private static native int addYUVInputFrames(int[] frame, int[] frame_len, int nFrames, int sx, int sy);
  //
  //	private static native int[] NV21toARGB(int inptr, Size src, Rect rect, Size dst);
  //
  //	private static native int MovObjProcess(int nFrames, Size size, int sensitivity, int minSize, int[] base_area, int[] crop, byte[] layout,
  //			int ghosting, int ratio, int[] sports_order);
  //
  //	static
  //	{
  //		System.loadLibrary("utils-image");
  //		System.loadLibrary("almalib");
  //		System.loadLibrary("almashot-moving");
  //	}
  //}