Android Ipcam

Embed Size (px)

Citation preview

  • 8/13/2019 Android Ipcam

    1/5

    sorce code from : https://code.google.com/p/android-camera-axis/source/browse/trunk/serealisation/src/de/mjpegsample/MjpegView/MjpegView.java?r=33

    package de.mjpegsample.MjpegView;

    import java.io.IOException;

    import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.PorterDuff;import android.graphics.PorterDuffXfermode;import android.graphics.Rect;import android.graphics.Typeface;import android.util.AttributeSet;import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceView;

    public class MjpegView extends SurfaceView implements SurfaceHolder.Callback {public final static int POSITION_UPPER_LEFT = 9;

    public final static int POSITION_UPPER_RIGHT = 3;public final static int POSITION_LOWER_LEFT = 12;public final static int POSITION_LOWER_RIGHT = 6;

    public final static int SIZE_STANDARD = 1;public final static int SIZE_BEST_FIT = 4;public final static int SIZE_FULLSCREEN = 8;

    private MjpegViewThread thread;private MjpegInputStream mIn = null;private boolean showFps = false;private boolean mRun = false;private boolean surfaceDone = false;

    private Paint overlayPaint;private int overlayTextColor;private int overlayBackgroundColor;private int ovlPos;private int dispWidth;private int dispHeight;private int displayMode;private boolean resume = false;

    private Context context;

    public class MjpegViewThread extends Thread {private SurfaceHolder mSurfaceHolder;

    private int frameCounter = 0;private long start;private Bitmap ovl;

    public MjpegViewThread(SurfaceHolder surfaceHolder, Context context) {

    mSurfaceHolder = surfaceHolder;}

    private Rect destRect(int bmw, int bmh) {

  • 8/13/2019 Android Ipcam

    2/5

    int tempx;int tempy;if (displayMode == MjpegView.SIZE_STANDARD) {

    tempx = (dispWidth / 2) - (bmw / 2);tempy = (dispHeight / 2) - (bmh / 2);return new Rect(tempx, tempy, bmw + tempx, bmh +

    tempy);}if (displayMode == MjpegView.SIZE_BEST_FIT) {

    float bmasp = (float) bmw / (float) bmh;bmw = dispWidth;bmh = (int) (dispWidth / bmasp);if (bmh > dispHeight) {

    bmh = dispHeight;bmw = (int) (dispHeight * bmasp);

    }tempx = (dispWidth / 2) - (bmw / 2);tempy = (dispHeight / 2) - (bmh / 2);return new Rect(tempx, tempy, bmw + tempx, bmh +

    tempy);}if (displayMode == MjpegView.SIZE_FULLSCREEN)

    return new Rect(0, 0, dispWidth, dispHeight);return null;

    }

    public void setSurfaceSize(int width, int height) {synchronized (mSurfaceHolder) {

    dispWidth = width;dispHeight = height;

    }}

    private Bitmap makeFpsOverlay(Paint p, String text) {Rect b = new Rect();p.getTextBounds(text, 0, text.length(), b);int bwidth = b.width() + 2;

    int bheight = b.height() + 2;Bitmap bm = Bitmap.createBitmap(bwidth, bheight,Bitmap.Config.ARGB_8888);

    Canvas c = new Canvas(bm);p.setColor(overlayBackgroundColor);c.drawRect(0, 0, bwidth, bheight, p);p.setColor(overlayTextColor);c.drawText(text, -b.left + 1,

    (bheight / 2) - ((p.ascent() + p.descent()) / 2) + 1, p);

    return bm;}

    public void run() {start = System.currentTimeMillis();PorterDuffXfermode mode = new PorterDuffXfermode(

    PorterDuff.Mode.DST_OVER);Bitmap bm;int width;int height;Rect destRect;Canvas c = null;Paint p = new Paint();

  • 8/13/2019 Android Ipcam

    3/5

    String fps = "";while (mRun) {

    if (surfaceDone) {try {

    c = mSurfaceHolder.lockCanvas();synchronized (mSurfaceHolder) {

    try {bm = mIn.readMjp

    egFrame();destRect = destR

    ect(bm.getWidth(),

    bm.getHeight());c.drawColor(Colo

    r.BLACK);c.drawBitmap(bm,

    null, destRect, p);if (showFps) {

    p.setXfermode(mode);

    if (ovl!= null) {

    height = ((ovlPos & 1) == 1) ? destRect.top

    : destRect.bottom

    - ovl.getHeight();

    width = ((ovlPos & 8) == 8) ? destRect.left

    : destRect.right

    - ovl.getWidth();

    c.drawBitmap(ovl, width, height, null);}

    p.setXfermode(null);frameCou

    nter++;if ((Sys

    tem.currentTimeMillis() - start) >= 1000) {

    fps = String.valueOf(frameCounter)

    + "fps";

    frameCounter = 0;

    start = System.currentTimeMillis();

    ovl = makeFpsOverlay(overlayPaint, fps);}

    }} catch (IOException e)

    {}

    }} finally {

  • 8/13/2019 Android Ipcam

    4/5

    if (c != null)mSurfaceHolder.unlockCan

    vasAndPost(c);}

    }}

    }}

    private void init(Context context) {

    this.context = context;SurfaceHolder holder = getHolder();holder.addCallback(this);thread = new MjpegViewThread(holder, context);setFocusable(true);if (!resume) {

    resume = true;overlayPaint = new Paint();overlayPaint.setTextAlign(Paint.Align.LEFT);overlayPaint.setTextSize(12);overlayPaint.setTypeface(Typeface.DEFAULT);overlayTextColor = Color.WHITE;overlayBackgroundColor = Color.BLACK;

    ovlPos = MjpegView.POSITION_LOWER_RIGHT;displayMode = MjpegView.SIZE_STANDARD;dispWidth = getWidth();dispHeight = getHeight();Log.i("AppLog", "init");

    }}

    public void startPlayback() {if (mIn != null) {

    mRun = true;thread.start();

    }

    }

    public void resumePlayback() {mRun = true;init(context);Log.i("AppLog", "resume");thread.start();

    }

    public void stopPlayback() {mRun = false;boolean retry = true;while (retry) {

    try {thread.join();retry = false;

    } catch (InterruptedException e) {}

    }}

    public MjpegView(Context context, AttributeSet attrs) {super(context, attrs);

  • 8/13/2019 Android Ipcam

    5/5

    init(context);}

    public void surfaceChanged(SurfaceHolder holder, int f, int w, int h) {thread.setSurfaceSize(w, h);

    }

    public void surfaceDestroyed(SurfaceHolder holder) {surfaceDone = false;stopPlayback();

    }

    public MjpegView(Context context) {super(context);init(context);

    }

    public void surfaceCreated(SurfaceHolder holder) {surfaceDone = true;

    }

    public void showFps(boolean b) {showFps = b;

    }

    public void setSource(MjpegInputStream source) {mIn = source;startPlayback();

    }

    public void setOverlayPaint(Paint p) {overlayPaint = p;

    }

    public void setOverlayTextColor(int c) {overlayTextColor = c;

    }

    public void setOverlayBackgroundColor(int c) {overlayBackgroundColor = c;

    }

    public void setOverlayPosition(int p) {ovlPos = p;

    }

    public void setDisplayMode(int s) {displayMode = s;

    }}

    Show details Hide detailsChange log

    r33 by nahelou.jerome on Feb 22, 2011 Diff