// started from https://github.com/google/grafika/blob/f3c8c3dee60153f471312e21acac8b3a3cddd7dc/src/com/android/grafika/CameraUtils.java
/*
* Copyright 2014 Google Inc. All rights reserved.
*
* 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.
*/
package io.cine.android.streaming;
import android.hardware.Camera;
import android.util.Log;
import java.util.List;
/**
* Camera-related utility functions.
*/
public class CameraUtils {
private static final String TAG = "CameraUtils";
/**
* Attempts to find a preview size that matches the provided width and height (which
* specify the dimensions of the encoded video). If it fails to find a match it just
* uses the default preview size for video.
* <p/>
* TODO: should do a best-fit match, e.g.
* https://github.com/commonsguy/cwac-camera/blob/master/camera/src/com/commonsware/cwac/camera/CameraUtils.java
*/
public static void choosePreviewSize(Camera.Parameters parms, int width, int height) {
// We should make sure that the requested MPEG size is less than the preferred
// size, and has the same aspect ratio.
Camera.Size ppsfv = parms.getPreferredPreviewSizeForVideo();
if (ppsfv != null) {
Log.d(TAG, "Camera preferred preview size for video is " +
ppsfv.width + "x" + ppsfv.height);
}
for (Camera.Size size : parms.getSupportedPreviewSizes()) {
Log.d(TAG, "supported: " + size.width + "x" + size.height);
}
for (Camera.Size size : parms.getSupportedPreviewSizes()) {
if (size.width == width && size.height == height) {
Log.d(TAG, "setting preview size: " + width + "x" + height);
parms.setPreviewSize(width, height);
return;
}
}
Log.w(TAG, "Unable to set preview size to " + width + "x" + height);
if (ppsfv != null) {
parms.setPreviewSize(ppsfv.width, ppsfv.height);
}
// else use whatever the default size is
}
/**
* Attempts to find a fixed preview frame rate that matches the desired frame rate.
* <p/>
* It doesn't seem like there's a great deal of flexibility here.
* <p/>
* TODO: follow the recipe from http://stackoverflow.com/questions/22639336/#22645327
*
* @return The expected frame rate, in thousands of frames per second.
*/
public static int chooseFixedPreviewFps(Camera.Parameters parms, int desiredThousandFps) {
List<int[]> supported = parms.getSupportedPreviewFpsRange();
for (int[] entry : supported) {
Log.d(TAG, "entry: " + entry[0] + " - " + entry[1]);
if ((entry[0] == entry[1]) && (entry[0] == desiredThousandFps)) {
parms.setPreviewFpsRange(entry[0], entry[1]);
return entry[0];
}
}
int[] tmp = new int[2];
parms.getPreviewFpsRange(tmp);
int guess;
if (tmp[0] == tmp[1]) {
guess = tmp[0];
} else {
guess = tmp[1] / 2; // shrug
}
Log.d(TAG, "Couldn't find match for " + desiredThousandFps + ", using " + guess);
return guess;
}
}