// Path: accelerator-core/src/main/java/com/opentok/accelerator/core/GlobalLogLevel.java
// public class GlobalLogLevel {
//   public static short sMaxLogLevel = 0xFF;
// }
// 
// Path: accelerator-core/src/main/java/com/opentok/accelerator/core/utils/LogWrapper.java
// public class LogWrapper {
// 
//   public static final short LOG_ERROR = 0x1;
//   public static final short LOG_WARN = 0x2;
//   public static final short LOG_INFO = 0x4;
//   public static final short LOG_DEBUG = 0x8;
//   public static final short LOG_VERBOSE = 0x10;
// 
//   protected interface RunnableLogger {
//     void log(String tag, String message);
//     void log(String tag, String message, Exception e);
//   }
// 
//   /**
//    * Protected and not final to allow modification by subclasses
//    */
//   protected static SparseArray<RunnableLogger> sLoggers = new SparseArray<RunnableLogger>() {
//     {
//       append(LOG_ERROR, new RunnableLogger() {
//         @Override
//         public void log(String tag, String message) {
//           Log.e(tag, message);
//         }
// 
//         @Override
//         public void log(String tag, String message, Exception e) {
//           Log.e(tag, message, e);
//         }
//       });
// 
//       append(LOG_WARN, new RunnableLogger() {
//         @Override
//         public void log(String tag, String message) {
//           Log.w(tag, message);
//         }
// 
//         @Override
//         public void log(String tag, String message, Exception e) {
//           Log.w(tag, message, e);
//         }
//       });
// 
//       append(LOG_INFO, new RunnableLogger() {
//         @Override
//         public void log(String tag, String message) {
//           Log.i(tag, message);
//         }
// 
//         @Override
//         public void log(String tag, String message, Exception e) {
//           Log.i(tag, message, e);
//         }
//       });
// 
//       append(LOG_DEBUG, new RunnableLogger() {
//         @Override
//         public void log(String tag, String message) {
//           Log.d(tag, message);
//         }
// 
//         @Override
//         public void log(String tag, String message, Exception e) {
//           Log.d(tag, message, e);
//         }
//       });
// 
//       append(LOG_VERBOSE, new RunnableLogger() {
//         @Override
//         public void log(String tag, String message) {
//           Log.v(tag, message);
//         }
// 
//         @Override
//         public void log(String tag, String message, Exception e) {
//           Log.v(tag, message, e);
//         }
//       });
//     }
//   };
// 
//   private short mCurrentLogLevel;
// 
//   public void setLogLevel(short logLevel) {
//     mCurrentLogLevel = logLevel;
//   }
// 
//   public void enableLevels(short levels) {
//     mCurrentLogLevel |= levels;
//   }
// 
//   public void disableLevels(short levels) {
//     mCurrentLogLevel |= (0xFF ^ levels);
//   }
// 
//   public LogWrapper(short logLevel) {
//     setLogLevel(logLevel);
//   }
// 
//   private void log(short level, Object... messages) {
//     RunnableLogger logger;
//     if ((mCurrentLogLevel & level) == 0 || (logger = sLoggers.get(level)) == null) {
//       return;
//     }
//     String logTag = null;
//     StringBuilder message = new StringBuilder();
//     Exception e = null;
//     for(Object element: messages) {
//       if (element instanceof Exception) {
//         e = (Exception) element;
//       } else {
//         if (element == null) {
//           element = "null";
//         }
//         if (logTag == null) {
//           logTag = element.toString();
//         } else {
//           message.append(element.toString());
//         }
//       }
//     }
//     if (e != null) {
//       logger.log(logTag, message.toString(), e);
//     } else {
//       logger.log(logTag, message.toString());
//     }
//   }
// 
//   public void e(Object... messages) {
//     log(LOG_ERROR, messages);
//   }
// 
//   public void d(Object... messages) {
//     log(LOG_DEBUG, messages);
//   }
// 
//   public void w(Object... messages) {
//     log(LOG_WARN, messages);
//   }
// 
//   public void i(Object... messages) {
//     log(LOG_INFO, messages);
//   }
//   public void v(Object... messages) {
//     log(LOG_VERBOSE, messages);
//   }
// 
// }


import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.media.Image;
import android.media.ImageReader;
import android.os.Build;
import android.os.Handler;
import android.view.View;
import com.opentok.accelerator.core.GlobalLogLevel;
import com.opentok.accelerator.core.utils.LogWrapper;
import com.opentok.android.BaseVideoCapturer;
import java.io.FileOutputStream;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
     */
    @TargetApi(Build.VERSION_CODES.KITKAT)
    public ScreenSharingCapturer(Context context, View view, ImageReader imageReader) {
        this.contentView = view;
        this.mImageReader = imageReader;
        this.mImageReader.setOnImageAvailableListener(new ImageAvailableListener(), null);

        this.width = contentView.getWidth();
        this.height = contentView.getHeight();

    }

    @Override
    public void init() {

    }

    @Override
    public int startCapture() {
        LOG.d(LOG_TAG, "Start Screensharing Capturer");
        capturing = true;
        mHandler.postDelayed(newFrame, 1000 / fps);
        return 0;
    }

    @Override
    public int stopCapture() {
        LOG.d(LOG_TAG, "Stop Screensharing Capturer");
        capturing = false;
        mHandler.removeCallbacks(newFrame);
// Path: accelerator-core/src/main/java/com/opentok/accelerator/core/GlobalLogLevel.java
// public class GlobalLogLevel {
//   public static short sMaxLogLevel = 0xFF;
// }
// 
// Path: accelerator-core/src/main/java/com/opentok/accelerator/core/utils/LogWrapper.java
// public class LogWrapper {
// 
//   public static final short LOG_ERROR = 0x1;
//   public static final short LOG_WARN = 0x2;
//   public static final short LOG_INFO = 0x4;
//   public static final short LOG_DEBUG = 0x8;
//   public static final short LOG_VERBOSE = 0x10;
// 
//   protected interface RunnableLogger {
//     void log(String tag, String message);
//     void log(String tag, String message, Exception e);
//   }
// 
//   /**
//    * Protected and not final to allow modification by subclasses
//    */
//   protected static SparseArray<RunnableLogger> sLoggers = new SparseArray<RunnableLogger>() {
//     {
//       append(LOG_ERROR, new RunnableLogger() {
//         @Override
//         public void log(String tag, String message) {
//           Log.e(tag, message);
//         }
// 
//         @Override
//         public void log(String tag, String message, Exception e) {
//           Log.e(tag, message, e);
//         }
//       });
// 
//       append(LOG_WARN, new RunnableLogger() {
//         @Override
//         public void log(String tag, String message) {
//           Log.w(tag, message);
//         }
// 
//         @Override
//         public void log(String tag, String message, Exception e) {
//           Log.w(tag, message, e);
//         }
//       });
// 
//       append(LOG_INFO, new RunnableLogger() {
//         @Override
//         public void log(String tag, String message) {
//           Log.i(tag, message);
//         }
// 
//         @Override
//         public void log(String tag, String message, Exception e) {
//           Log.i(tag, message, e);
//         }
//       });
// 
//       append(LOG_DEBUG, new RunnableLogger() {
//         @Override
//         public void log(String tag, String message) {
//           Log.d(tag, message);
//         }
// 
//         @Override
//         public void log(String tag, String message, Exception e) {
//           Log.d(tag, message, e);
//         }
//       });
// 
//       append(LOG_VERBOSE, new RunnableLogger() {
//         @Override
//         public void log(String tag, String message) {
//           Log.v(tag, message);
//         }
// 
//         @Override
//         public void log(String tag, String message, Exception e) {
//           Log.v(tag, message, e);
//         }
//       });
//     }
//   };
// 
//   private short mCurrentLogLevel;
// 
//   public void setLogLevel(short logLevel) {
//     mCurrentLogLevel = logLevel;
//   }
// 
//   public void enableLevels(short levels) {
//     mCurrentLogLevel |= levels;
//   }
// 
//   public void disableLevels(short levels) {
//     mCurrentLogLevel |= (0xFF ^ levels);
//   }
// 
//   public LogWrapper(short logLevel) {
//     setLogLevel(logLevel);
//   }
// 
//   private void log(short level, Object... messages) {
//     RunnableLogger logger;
//     if ((mCurrentLogLevel & level) == 0 || (logger = sLoggers.get(level)) == null) {
//       return;
//     }
//     String logTag = null;
//     StringBuilder message = new StringBuilder();
//     Exception e = null;
//     for(Object element: messages) {
//       if (element instanceof Exception) {
//         e = (Exception) element;
//       } else {
//         if (element == null) {
//           element = "null";
//         }
//         if (logTag == null) {
//           logTag = element.toString();
//         } else {
//           message.append(element.toString());
//         }
//       }
//     }
//     if (e != null) {
//       logger.log(logTag, message.toString(), e);
//     } else {
//       logger.log(logTag, message.toString());
//     }
//   }
// 
//   public void e(Object... messages) {
//     log(LOG_ERROR, messages);
//   }
// 
//   public void d(Object... messages) {
//     log(LOG_DEBUG, messages);
//   }
// 
//   public void w(Object... messages) {
//     log(LOG_WARN, messages);
//   }
// 
//   public void i(Object... messages) {
//     log(LOG_INFO, messages);
//   }
//   public void v(Object... messages) {
//     log(LOG_VERBOSE, messages);
//   }
// 
// }


// Path: accelerator-core/src/main/java/com/opentok/accelerator/core/screensharing/ScreenSharingCapturer.java
import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.media.Image;
import android.media.ImageReader;
import android.os.Build;
import android.os.Handler;
import android.view.View;
import com.opentok.accelerator.core.GlobalLogLevel;
import com.opentok.accelerator.core.utils.LogWrapper;
import com.opentok.android.BaseVideoCapturer;
import java.io.FileOutputStream;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

     */
    @TargetApi(Build.VERSION_CODES.KITKAT)
    public ScreenSharingCapturer(Context context, View view, ImageReader imageReader) {
        this.contentView = view;
        this.mImageReader = imageReader;
        this.mImageReader.setOnImageAvailableListener(new ImageAvailableListener(), null);

        this.width = contentView.getWidth();
        this.height = contentView.getHeight();

    }

    @Override
    public void init() {

    }

    @Override
    public int startCapture() {
        LOG.d(LOG_TAG, "Start Screensharing Capturer");
        capturing = true;
        mHandler.postDelayed(newFrame, 1000 / fps);
        return 0;
    }

    @Override
    public int stopCapture() {
        LOG.d(LOG_TAG, "Stop Screensharing Capturer");
        capturing = false;
        mHandler.removeCallbacks(newFrame);
        return 0;