1e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin/*
2e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin**
3e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** Copyright 2013, The Android Open Source Project
4e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin**
5e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** Licensed under the Apache License, Version 2.0 (the "License");
6e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** you may not use this file except in compliance with the License.
7e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** You may obtain a copy of the License at
8e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin**
9e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin**     http://www.apache.org/licenses/LICENSE-2.0
10e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin**
11e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** Unless required by applicable law or agreed to in writing, software
12e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** distributed under the License is distributed on an "AS IS" BASIS,
13e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** See the License for the specific language governing permissions and
15e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin** limitations under the License.
16e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin*/
17e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
18e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin//#define LOG_NDEBUG 0
19e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#define LOG_TAG "ICameraDeviceCallbacks"
20e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include <utils/Log.h>
21e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include <stdint.h>
22e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include <sys/types.h>
23e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
24e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include <binder/Parcel.h>
25e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include <gui/IGraphicBufferProducer.h>
26e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include <gui/Surface.h>
27e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include <utils/Mutex.h>
28e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
297b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <camera/camera2/ICameraDeviceCallbacks.h>
30e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin#include "camera/CameraMetadata.h"
31cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei#include "camera/CaptureResult.h"
32e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
33e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinnamespace android {
34e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
35e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinenum {
36f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    CAMERA_ERROR = IBinder::FIRST_CALL_TRANSACTION,
37f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    CAMERA_IDLE,
38f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    CAPTURE_STARTED,
39e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    RESULT_RECEIVED,
40e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin};
41e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
42e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinclass BpCameraDeviceCallbacks: public BpInterface<ICameraDeviceCallbacks>
43e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin{
44e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinpublic:
45e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    BpCameraDeviceCallbacks(const sp<IBinder>& impl)
46e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        : BpInterface<ICameraDeviceCallbacks>(impl)
47e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    {
48e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
49e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
50cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    void onDeviceError(CameraErrorCode errorCode, const CaptureResultExtras& resultExtras)
51e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    {
52f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        ALOGV("onDeviceError");
53e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        Parcel data, reply;
54e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInterfaceToken(ICameraDeviceCallbacks::getInterfaceDescriptor());
55f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        data.writeInt32(static_cast<int32_t>(errorCode));
56cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        data.writeInt32(1); // to mark presence of CaptureResultExtras object
57cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        resultExtras.writeToParcel(&data);
58f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        remote()->transact(CAMERA_ERROR, data, &reply, IBinder::FLAG_ONEWAY);
59e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeNoException();
60e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
61e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
62f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    void onDeviceIdle()
63f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    {
64f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        ALOGV("onDeviceIdle");
65f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        Parcel data, reply;
66f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        data.writeInterfaceToken(ICameraDeviceCallbacks::getInterfaceDescriptor());
67f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        remote()->transact(CAMERA_IDLE, data, &reply, IBinder::FLAG_ONEWAY);
68f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        data.writeNoException();
69f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
70f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
71cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    void onCaptureStarted(const CaptureResultExtras& result, int64_t timestamp)
72f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    {
73f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        ALOGV("onCaptureStarted");
74f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        Parcel data, reply;
75f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        data.writeInterfaceToken(ICameraDeviceCallbacks::getInterfaceDescriptor());
76cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        data.writeInt32(1); // to mark presence of CaptureResultExtras object
77cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        result.writeToParcel(&data);
78f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        data.writeInt64(timestamp);
79f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        remote()->transact(CAPTURE_STARTED, data, &reply, IBinder::FLAG_ONEWAY);
80f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        data.writeNoException();
81f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    }
82f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
83f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
84cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    void onResultReceived(const CameraMetadata& metadata,
85cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            const CaptureResultExtras& resultExtras) {
86e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        ALOGV("onResultReceived");
87e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        Parcel data, reply;
88e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeInterfaceToken(ICameraDeviceCallbacks::getInterfaceDescriptor());
8911d0d44d583f679638cc927bfffe920e495e90ccZhijun He        data.writeInt32(1); // to mark presence of metadata object
90cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        metadata.writeToParcel(&data);
91cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        data.writeInt32(1); // to mark presence of CaptureResult object
92cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        resultExtras.writeToParcel(&data);
93e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        remote()->transact(RESULT_RECEIVED, data, &reply, IBinder::FLAG_ONEWAY);
94e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        data.writeNoException();
95e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
96e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin};
97e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
98e7ee7637747371635a85fedd24d2190bb1f38651Igor MurashkinIMPLEMENT_META_INTERFACE(CameraDeviceCallbacks,
997b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala                         "android.hardware.camera2.ICameraDeviceCallbacks");
100e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
101e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin// ----------------------------------------------------------------------
102e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
103e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinstatus_t BnCameraDeviceCallbacks::onTransact(
104e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
105e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin{
106e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    ALOGV("onTransact - code = %d", code);
107e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    switch(code) {
108f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case CAMERA_ERROR: {
109f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            ALOGV("onDeviceError");
110f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            CHECK_INTERFACE(ICameraDeviceCallbacks, data, reply);
111f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            CameraErrorCode errorCode =
112f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                    static_cast<CameraErrorCode>(data.readInt32());
113cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            CaptureResultExtras resultExtras;
114cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            if (data.readInt32() != 0) {
115cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                resultExtras.readFromParcel(const_cast<Parcel*>(&data));
116cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            } else {
117cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                ALOGE("No CaptureResultExtras object is present!");
118cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            }
119cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            onDeviceError(errorCode, resultExtras);
120f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            data.readExceptionCode();
121f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            return NO_ERROR;
122f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        } break;
123f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case CAMERA_IDLE: {
124f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            ALOGV("onDeviceIdle");
125e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            CHECK_INTERFACE(ICameraDeviceCallbacks, data, reply);
126f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            onDeviceIdle();
127f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            data.readExceptionCode();
128f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            return NO_ERROR;
129f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        } break;
130f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        case CAPTURE_STARTED: {
131f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            ALOGV("onCaptureStarted");
132f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            CHECK_INTERFACE(ICameraDeviceCallbacks, data, reply);
133cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            CaptureResultExtras result;
134cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            if (data.readInt32() != 0) {
135cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                result.readFromParcel(const_cast<Parcel*>(&data));
136cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            } else {
137cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                ALOGE("No CaptureResultExtras object is present in result!");
138cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            }
139f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            int64_t timestamp = data.readInt64();
140cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            onCaptureStarted(result, timestamp);
141e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            data.readExceptionCode();
142e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            return NO_ERROR;
143e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        } break;
144e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        case RESULT_RECEIVED: {
145f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            ALOGV("onResultReceived");
146e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            CHECK_INTERFACE(ICameraDeviceCallbacks, data, reply);
147cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            CameraMetadata metadata;
14811d0d44d583f679638cc927bfffe920e495e90ccZhijun He            if (data.readInt32() != 0) {
149cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                metadata.readFromParcel(const_cast<Parcel*>(&data));
15011d0d44d583f679638cc927bfffe920e495e90ccZhijun He            } else {
15111d0d44d583f679638cc927bfffe920e495e90ccZhijun He                ALOGW("No metadata object is present in result");
15211d0d44d583f679638cc927bfffe920e495e90ccZhijun He            }
153cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            CaptureResultExtras resultExtras;
154cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            if (data.readInt32() != 0) {
155cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                resultExtras.readFromParcel(const_cast<Parcel*>(&data));
156cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            } else {
157cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                ALOGW("No capture result extras object is present in result");
158cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            }
159cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei            onResultReceived(metadata, resultExtras);
160e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            data.readExceptionCode();
161e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            return NO_ERROR;
162f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        } break;
163e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin        default:
164e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin            return BBinder::onTransact(code, data, reply, flags);
165e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin    }
166e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}
167e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
168e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin// ----------------------------------------------------------------------------
169e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin
170e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkin}; // namespace android
171