package io.fotoapparat.hardware.v2.stream;
import android.support.annotation.NonNull;
import java.util.LinkedHashSet;
import java.util.Set;
import io.fotoapparat.hardware.v2.parameters.ParametersProvider;
import io.fotoapparat.log.Logger;
import io.fotoapparat.preview.Frame;
import io.fotoapparat.preview.FrameProcessor;
import io.fotoapparat.preview.PreviewStream;
/**
* {@link PreviewStream} of Camera v2.
*/
@SuppressWarnings("NewApi")
public class PreviewStream2 implements PreviewStream,
OnImageAcquiredObserver.OnFrameAcquiredListener {
private final OnImageAcquiredObserver imageAcquiredObserver;
private final ParametersProvider parametersProvider;
private final Logger logger;
private final Set<FrameProcessor> frameProcessors = new LinkedHashSet<>();
public PreviewStream2(OnImageAcquiredObserver imageAcquiredObserver,
ParametersProvider parametersProvider,
Logger logger) {
this.imageAcquiredObserver = imageAcquiredObserver;
this.parametersProvider = parametersProvider;
this.logger = logger;
}
@Override
public void addFrameToBuffer() {
// Does nothing
}
@Override
public void addProcessor(@NonNull FrameProcessor processor) {
synchronized (frameProcessors) {
frameProcessors.add(processor);
}
}
@Override
public void removeProcessor(@NonNull FrameProcessor processor) {
synchronized (frameProcessors) {
frameProcessors.remove(processor);
}
}
@Override
public void start() {
imageAcquiredObserver.setListener(this);
logger.log("Frame processors are currently not supported in Camera2. To use them please switch to Camera1.");
}
@Override
public void onFrameAcquired(byte[] bytes) {
synchronized (frameProcessors) {
dispatchFrame(bytes);
}
}
private void dispatchFrame(byte[] image) {
final Frame frame = new Frame(parametersProvider.getPreviewSize(), image, 0);
for (FrameProcessor frameProcessor : frameProcessors) {
frameProcessor.processFrame(frame);
}
}
}