Skip to content
Snippets Groups Projects
Select Git revision
  • 1fa8c06241c11028b3f9b546ddba897660e08e47
  • master default protected
  • release/202005
  • release/202001
  • release/201912
  • release/windows-test/201910
  • release/201908
  • release/201906
  • release/201905
  • release/201904
  • release/201903
  • release/201902
  • release/201901
  • release/201812
  • release/201811
  • release/201808
  • wip/patches_poly_2017/cedryk_doucet/abderahmane_bouziane
  • releases/beta1
  • android/release_464
  • android/release_463
  • android/release_462
  • android/release_461
  • android/release_460
  • android/release_459
  • android/release_458
  • android/release_457
  • android/release_456
  • android/release_455
  • android/release_454
  • android/release_453
  • android/release_452
  • android/release_451
  • android/release_450
  • android/release_449
  • android/release_448
  • android/release_447
  • android/release_446
  • android/release_445
38 results

VideoManagerCallback.java

  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    VideoManagerCallback.java 5.51 KiB
    /*
     *  Copyright (C) 2015-2016 Savoir-faire Linux Inc.
     *
     *  Author: Adrien Béraud <adrien.beraud@savoirfairelinux.com>
     *          Damien Riegel <damien.riegel@savoirfairelinux.com>
     *
     *  This program is free software; you can redistribute it and/or modify
     *  it under the terms of the GNU General Public License as published by
     *  the Free Software Foundation; either version 3 of the License, or
     *  (at your option) any later version.
     *
     *  This program is distributed in the hope that it will be useful,
     *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     *  GNU General Public License for more details.
     *
     *  You should have received a copy of the GNU General Public License
     *  along with this program. If not, see <http://www.gnu.org/licenses/>.
     */
    package cx.ring.service;
    
    import android.content.res.Configuration;
    import android.hardware.Camera;
    import android.util.Log;
    import android.util.LongSparseArray;
    import android.graphics.Point;
    
    import java.util.HashMap;
    
    
    public class VideoManagerCallback extends VideoCallback
    {
        private static final String TAG = VideoManagerCallback.class.getSimpleName();
    
        private final DRingService mService;
        private final LongSparseArray<DeviceParams> native_params = new LongSparseArray<>();
        private final HashMap<String, DRingService.VideoParams> params = new HashMap<>();
    
        class DeviceParams {
            Point size;
            long rate;
            Camera.CameraInfo infos;
    
            public StringMap toMap(int orientation) {
                StringMap p = new StringMap();
                boolean rotated = (size.x >  size.y) == (orientation == Configuration.ORIENTATION_PORTRAIT);
                p.set("size", Integer.toString(rotated ? size.y : size.x) + "x" + Integer.toString(rotated ? size.x : size.y));
                p.set("rate", Long.toString(rate));
                return p;
            }
        }
    
        public int cameraFront = 0;
        public int cameraBack = 0;
    
        public VideoManagerCallback(DRingService s) {
            mService = s;
        }
    
        public void init() {
            int number_cameras = getNumberOfCameras();
            Camera.CameraInfo camInfo = new Camera.CameraInfo();
            for(int i = 0; i < number_cameras; i++) {
                RingserviceJNI.addVideoDevice(Integer.toString(i));
                Camera.getCameraInfo(i, camInfo);
                if (camInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT)
                    cameraFront = i;
                else
                    cameraBack = i;
                Log.d(TAG, "Camera number " + i);
            }
            RingserviceJNI.setDefaultDevice(Integer.toString(cameraFront));
        }
    
        DeviceParams getNativeParams(int i) {
            return native_params.get(i);
        }
    
        @Override
        public void decodingStarted(String id, String shm_path, int w, int h, boolean is_mixer) {
            mService.decodingStarted(id, shm_path, w, h, is_mixer);
        }
    
        @Override
        public void decodingStopped(String id, String shm_path, boolean is_mixer) {
            mService.decodingStopped(id);
        }
    
        public void setParameters(String camid, int format, int width, int height, int rate) {
            int id = Integer.valueOf(camid);
            DeviceParams p = native_params.get(id);
            DRingService.VideoParams new_params = new DRingService.VideoParams(id, format, p.size.x, p.size.y, rate);
            new_params.rotWidth = width;
            new_params.rotHeight = height;
            mService.setVideoRotation(new_params, p.infos);
            params.put(camid, new_params);
        }
    
        public void startCapture(String camid) {
            DRingService.VideoParams p = params.get(camid);
            if (p == null)
                return;
    
            mService.startCapture(p);
        }
    
        public void stopCapture() {
            mService.stopCapture();
        }
    
        @Override
        public void getCameraInfo(String camid, IntVect formats, UintVect sizes, UintVect rates) {
            int id = Integer.valueOf(camid);
    
            if (id < 0 || id >= getNumberOfCameras())
                return;
    
            Camera cam;
            try {
                cam = Camera.open(id);
            } catch (Exception e) {
                Log.d(TAG, e.getMessage());
                return;
            }
    
            Camera.Parameters param = cam.getParameters();
            cam.release();
    
            getFormats(param, formats);
    
            DeviceParams p = new DeviceParams();
            p.size = getSizeToUse(param);
            sizes.add(p.size.x);
            sizes.add(p.size.y);
            sizes.add(p.size.y);
            sizes.add(p.size.x);
    
            getRates(param, rates);
            p.rate = rates.get(0);
    
            p.infos = new Camera.CameraInfo();
            Camera.getCameraInfo(id, p.infos);
    
            native_params.put(id, p);
        }
    
        private int getNumberOfCameras() {
            return Camera.getNumberOfCameras();
        }
    
        private void getFormats(Camera.Parameters param, IntVect formats_) {
            for(int fmt : param.getSupportedPreviewFormats()) {
                formats_.add(fmt);
            }
        }
    
        private Point getSizeToUse(Camera.Parameters param) {
            int sw = 1280, sh = 720;
            for(Camera.Size s : param.getSupportedPreviewSizes()) {
                if (s.width < sw) {
                    sw = s.width;
                    sh = s.height;
                }
            }
            Log.d(TAG, "Supported size: " + sw + " x " + sh);
            return new Point(sw, sh);
        }
    
        private void getRates(Camera.Parameters param, UintVect rates_) {
            for(int fps[] : param.getSupportedPreviewFpsRange()) {
                int rate = (fps[Camera.Parameters.PREVIEW_FPS_MIN_INDEX] + fps[Camera.Parameters.PREVIEW_FPS_MAX_INDEX])/2;
                rates_.add(rate);
            }
        }
    }