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