1/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.camera.one.v2.sharedimagereader;
18
19import com.android.camera.async.HandlerFactory;
20import com.android.camera.async.Lifetime;
21import com.android.camera.async.Observable;
22import com.android.camera.async.Updatable;
23import com.android.camera.one.v2.camera2proxy.ImageReaderProxy;
24import com.android.camera.one.v2.core.RequestBuilder;
25import com.android.camera.one.v2.sharedimagereader.imagedistributor.ImageDistributor;
26import com.android.camera.one.v2.sharedimagereader.imagedistributor.ImageDistributorFactory;
27import com.android.camera.one.v2.sharedimagereader.ticketpool.FiniteTicketPool;
28import com.android.camera.one.v2.sharedimagereader.ticketpool.TicketPool;
29
30/**
31 * Usage:
32 * <p>
33 * Ensure that *all* capture requests send to the camera device update the
34 * global timestamp queue with the timestamp associated with the image as soon
35 * as it arrives.
36 * <p>
37 * Add the OnImageAvailableListener to the image reader in a separate thread.
38 * <p>
39 * Use the {@link ManagedImageReader} to create image streams to add to
40 * {@link RequestBuilder}s to interact with the camera and ImageReader.
41 */
42public class SharedImageReaderFactory {
43    private final Updatable<Long> mGlobalTimestampQueue;
44    private final ManagedImageReader mSharedImageReader;
45    private final Observable<Integer> mAvailableImageCount;
46
47    /**
48     * @param lifetime The lifetime of the SharedImageReader, and other
49     *            components, to produce. Note that this may be shorter than the
50     *            lifetime of the provided ImageReader.
51     * @param imageReader The ImageReader to wrap. Note that this can outlive
52     * @param handlerFactory Used for create handler threads on which to receive
53     *            callbacks from the platform.
54     */
55    public SharedImageReaderFactory(Lifetime lifetime, ImageReaderProxy imageReader,
56            HandlerFactory handlerFactory) {
57        ImageDistributorFactory imageDistributorFactory = new ImageDistributorFactory(new
58                Lifetime(lifetime), imageReader, handlerFactory);
59        ImageDistributor imageDistributor = imageDistributorFactory.provideImageDistributor();
60        mGlobalTimestampQueue = imageDistributorFactory.provideGlobalTimestampCallback();
61
62        TicketPool ticketPool = new FiniteTicketPool(imageReader.getMaxImages() - 2);
63        mAvailableImageCount = ticketPool.getAvailableTicketCount();
64        mSharedImageReader = new ManagedImageReader(
65                new Lifetime(lifetime), ticketPool, imageReader.getSurface(), imageDistributor);
66    }
67
68    public Updatable<Long> provideGlobalTimestampQueue() {
69        return mGlobalTimestampQueue;
70    }
71
72    public ManagedImageReader provideSharedImageReader() {
73        return mSharedImageReader;
74    }
75
76    public Observable<Integer> provideAvailableImageCount() {
77        return mAvailableImageCount;
78    }
79}
80