Home | History | Annotate | Download | only in camera
      1 /*
      2 **
      3 ** Copyright 2008, The Android Open Source Project
      4 **
      5 ** Licensed under the Apache License, Version 2.0 (the "License");
      6 ** you may not use this file except in compliance with the License.
      7 ** You may obtain a copy of the License at
      8 **
      9 **     http://www.apache.org/licenses/LICENSE-2.0
     10 **
     11 ** Unless required by applicable law or agreed to in writing, software
     12 ** distributed under the License is distributed on an "AS IS" BASIS,
     13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 ** See the License for the specific language governing permissions and
     15 ** limitations under the License.
     16 */
     17 
     18 //#define LOG_NDEBUG 0
     19 #define LOG_TAG "ICamera"
     20 #include <utils/Log.h>
     21 #include <stdint.h>
     22 #include <sys/types.h>
     23 #include <binder/Parcel.h>
     24 #include <camera/ICamera.h>
     25 #include <gui/IGraphicBufferProducer.h>
     26 #include <gui/Surface.h>
     27 
     28 namespace android {
     29 
     30 enum {
     31     DISCONNECT = IBinder::FIRST_CALL_TRANSACTION,
     32     SET_PREVIEW_TARGET,
     33     SET_PREVIEW_CALLBACK_FLAG,
     34     SET_PREVIEW_CALLBACK_TARGET,
     35     START_PREVIEW,
     36     STOP_PREVIEW,
     37     AUTO_FOCUS,
     38     CANCEL_AUTO_FOCUS,
     39     TAKE_PICTURE,
     40     SET_PARAMETERS,
     41     GET_PARAMETERS,
     42     SEND_COMMAND,
     43     CONNECT,
     44     LOCK,
     45     UNLOCK,
     46     PREVIEW_ENABLED,
     47     START_RECORDING,
     48     STOP_RECORDING,
     49     RECORDING_ENABLED,
     50     RELEASE_RECORDING_FRAME,
     51     STORE_META_DATA_IN_BUFFERS,
     52 };
     53 
     54 class BpCamera: public BpInterface<ICamera>
     55 {
     56 public:
     57     BpCamera(const sp<IBinder>& impl)
     58         : BpInterface<ICamera>(impl)
     59     {
     60     }
     61 
     62     // disconnect from camera service
     63     void disconnect()
     64     {
     65         ALOGV("disconnect");
     66         Parcel data, reply;
     67         data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
     68         remote()->transact(DISCONNECT, data, &reply);
     69         reply.readExceptionCode();
     70     }
     71 
     72     // pass the buffered IGraphicBufferProducer to the camera service
     73     status_t setPreviewTarget(const sp<IGraphicBufferProducer>& bufferProducer)
     74     {
     75         ALOGV("setPreviewTarget");
     76         Parcel data, reply;
     77         data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
     78         sp<IBinder> b(bufferProducer->asBinder());
     79         data.writeStrongBinder(b);
     80         remote()->transact(SET_PREVIEW_TARGET, data, &reply);
     81         return reply.readInt32();
     82     }
     83 
     84     // set the preview callback flag to affect how the received frames from
     85     // preview are handled. See Camera.h for details.
     86     void setPreviewCallbackFlag(int flag)
     87     {
     88         ALOGV("setPreviewCallbackFlag(%d)", flag);
     89         Parcel data, reply;
     90         data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
     91         data.writeInt32(flag);
     92         remote()->transact(SET_PREVIEW_CALLBACK_FLAG, data, &reply);
     93     }
     94 
     95     status_t setPreviewCallbackTarget(
     96             const sp<IGraphicBufferProducer>& callbackProducer)
     97     {
     98         ALOGV("setPreviewCallbackTarget");
     99         Parcel data, reply;
    100         data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
    101         sp<IBinder> b(callbackProducer->asBinder());
    102         data.writeStrongBinder(b);
    103         remote()->transact(SET_PREVIEW_CALLBACK_TARGET, data, &reply);
    104         return reply.readInt32();
    105     }
    106 
    107     // start preview mode, must call setPreviewTarget first
    108     status_t startPreview()
    109     {
    110         ALOGV("startPreview");
    111         Parcel data, reply;
    112         data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
    113         remote()->transact(START_PREVIEW, data, &reply);
    114         return reply.readInt32();
    115     }
    116 
    117     // start recording mode, must call setPreviewTarget first
    118     status_t startRecording()
    119     {
    120         ALOGV("startRecording");
    121         Parcel data, reply;
    122         data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
    123         remote()->transact(START_RECORDING, data, &reply);
    124         return reply.readInt32();
    125     }
    126 
    127     // stop preview mode
    128     void stopPreview()
    129     {
    130         ALOGV("stopPreview");
    131         Parcel data, reply;
    132         data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
    133         remote()->transact(STOP_PREVIEW, data, &reply);
    134     }
    135 
    136     // stop recording mode
    137     void stopRecording()
    138     {
    139         ALOGV("stopRecording");
    140         Parcel data, reply;
    141         data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
    142         remote()->transact(STOP_RECORDING, data, &reply);
    143     }
    144 
    145     void releaseRecordingFrame(const sp<IMemory>& mem)
    146     {
    147         ALOGV("releaseRecordingFrame");
    148         Parcel data, reply;
    149         data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
    150         data.writeStrongBinder(mem->asBinder());
    151         remote()->transact(RELEASE_RECORDING_FRAME, data, &reply);
    152     }
    153 
    154     status_t storeMetaDataInBuffers(bool enabled)
    155     {
    156         ALOGV("storeMetaDataInBuffers: %s", enabled? "true": "false");
    157         Parcel data, reply;
    158         data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
    159         data.writeInt32(enabled);
    160         remote()->transact(STORE_META_DATA_IN_BUFFERS, data, &reply);
    161         return reply.readInt32();
    162     }
    163 
    164     // check preview state
    165     bool previewEnabled()
    166     {
    167         ALOGV("previewEnabled");
    168         Parcel data, reply;
    169         data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
    170         remote()->transact(PREVIEW_ENABLED, data, &reply);
    171         return reply.readInt32();
    172     }
    173 
    174     // check recording state
    175     bool recordingEnabled()
    176     {
    177         ALOGV("recordingEnabled");
    178         Parcel data, reply;
    179         data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
    180         remote()->transact(RECORDING_ENABLED, data, &reply);
    181         return reply.readInt32();
    182     }
    183 
    184     // auto focus
    185     status_t autoFocus()
    186     {
    187         ALOGV("autoFocus");
    188         Parcel data, reply;
    189         data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
    190         remote()->transact(AUTO_FOCUS, data, &reply);
    191         status_t ret = reply.readInt32();
    192         return ret;
    193     }
    194 
    195     // cancel focus
    196     status_t cancelAutoFocus()
    197     {
    198         ALOGV("cancelAutoFocus");
    199         Parcel data, reply;
    200         data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
    201         remote()->transact(CANCEL_AUTO_FOCUS, data, &reply);
    202         status_t ret = reply.readInt32();
    203         return ret;
    204     }
    205 
    206     // take a picture - returns an IMemory (ref-counted mmap)
    207     status_t takePicture(int msgType)
    208     {
    209         ALOGV("takePicture: 0x%x", msgType);
    210         Parcel data, reply;
    211         data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
    212         data.writeInt32(msgType);
    213         remote()->transact(TAKE_PICTURE, data, &reply);
    214         status_t ret = reply.readInt32();
    215         return ret;
    216     }
    217 
    218     // set preview/capture parameters - key/value pairs
    219     status_t setParameters(const String8& params)
    220     {
    221         ALOGV("setParameters");
    222         Parcel data, reply;
    223         data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
    224         data.writeString8(params);
    225         remote()->transact(SET_PARAMETERS, data, &reply);
    226         return reply.readInt32();
    227     }
    228 
    229     // get preview/capture parameters - key/value pairs
    230     String8 getParameters() const
    231     {
    232         ALOGV("getParameters");
    233         Parcel data, reply;
    234         data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
    235         remote()->transact(GET_PARAMETERS, data, &reply);
    236         return reply.readString8();
    237     }
    238     virtual status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2)
    239     {
    240         ALOGV("sendCommand");
    241         Parcel data, reply;
    242         data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
    243         data.writeInt32(cmd);
    244         data.writeInt32(arg1);
    245         data.writeInt32(arg2);
    246         remote()->transact(SEND_COMMAND, data, &reply);
    247         return reply.readInt32();
    248     }
    249     virtual status_t connect(const sp<ICameraClient>& cameraClient)
    250     {
    251         Parcel data, reply;
    252         data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
    253         data.writeStrongBinder(cameraClient->asBinder());
    254         remote()->transact(CONNECT, data, &reply);
    255         return reply.readInt32();
    256     }
    257     virtual status_t lock()
    258     {
    259         Parcel data, reply;
    260         data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
    261         remote()->transact(LOCK, data, &reply);
    262         return reply.readInt32();
    263     }
    264     virtual status_t unlock()
    265     {
    266         Parcel data, reply;
    267         data.writeInterfaceToken(ICamera::getInterfaceDescriptor());
    268         remote()->transact(UNLOCK, data, &reply);
    269         return reply.readInt32();
    270     }
    271 };
    272 
    273 IMPLEMENT_META_INTERFACE(Camera, "android.hardware.ICamera");
    274 
    275 // ----------------------------------------------------------------------
    276 
    277 status_t BnCamera::onTransact(
    278     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
    279 {
    280     switch(code) {
    281         case DISCONNECT: {
    282             ALOGV("DISCONNECT");
    283             CHECK_INTERFACE(ICamera, data, reply);
    284             disconnect();
    285             reply->writeNoException();
    286             return NO_ERROR;
    287         } break;
    288         case SET_PREVIEW_TARGET: {
    289             ALOGV("SET_PREVIEW_TARGET");
    290             CHECK_INTERFACE(ICamera, data, reply);
    291             sp<IGraphicBufferProducer> st =
    292                 interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
    293             reply->writeInt32(setPreviewTarget(st));
    294             return NO_ERROR;
    295         } break;
    296         case SET_PREVIEW_CALLBACK_FLAG: {
    297             ALOGV("SET_PREVIEW_CALLBACK_TYPE");
    298             CHECK_INTERFACE(ICamera, data, reply);
    299             int callback_flag = data.readInt32();
    300             setPreviewCallbackFlag(callback_flag);
    301             return NO_ERROR;
    302         } break;
    303         case SET_PREVIEW_CALLBACK_TARGET: {
    304             ALOGV("SET_PREVIEW_CALLBACK_TARGET");
    305             CHECK_INTERFACE(ICamera, data, reply);
    306             sp<IGraphicBufferProducer> cp =
    307                 interface_cast<IGraphicBufferProducer>(data.readStrongBinder());
    308             reply->writeInt32(setPreviewCallbackTarget(cp));
    309             return NO_ERROR;
    310         }
    311         case START_PREVIEW: {
    312             ALOGV("START_PREVIEW");
    313             CHECK_INTERFACE(ICamera, data, reply);
    314             reply->writeInt32(startPreview());
    315             return NO_ERROR;
    316         } break;
    317         case START_RECORDING: {
    318             ALOGV("START_RECORDING");
    319             CHECK_INTERFACE(ICamera, data, reply);
    320             reply->writeInt32(startRecording());
    321             return NO_ERROR;
    322         } break;
    323         case STOP_PREVIEW: {
    324             ALOGV("STOP_PREVIEW");
    325             CHECK_INTERFACE(ICamera, data, reply);
    326             stopPreview();
    327             return NO_ERROR;
    328         } break;
    329         case STOP_RECORDING: {
    330             ALOGV("STOP_RECORDING");
    331             CHECK_INTERFACE(ICamera, data, reply);
    332             stopRecording();
    333             return NO_ERROR;
    334         } break;
    335         case RELEASE_RECORDING_FRAME: {
    336             ALOGV("RELEASE_RECORDING_FRAME");
    337             CHECK_INTERFACE(ICamera, data, reply);
    338             sp<IMemory> mem = interface_cast<IMemory>(data.readStrongBinder());
    339             releaseRecordingFrame(mem);
    340             return NO_ERROR;
    341         } break;
    342         case STORE_META_DATA_IN_BUFFERS: {
    343             ALOGV("STORE_META_DATA_IN_BUFFERS");
    344             CHECK_INTERFACE(ICamera, data, reply);
    345             bool enabled = data.readInt32();
    346             reply->writeInt32(storeMetaDataInBuffers(enabled));
    347             return NO_ERROR;
    348         } break;
    349         case PREVIEW_ENABLED: {
    350             ALOGV("PREVIEW_ENABLED");
    351             CHECK_INTERFACE(ICamera, data, reply);
    352             reply->writeInt32(previewEnabled());
    353             return NO_ERROR;
    354         } break;
    355         case RECORDING_ENABLED: {
    356             ALOGV("RECORDING_ENABLED");
    357             CHECK_INTERFACE(ICamera, data, reply);
    358             reply->writeInt32(recordingEnabled());
    359             return NO_ERROR;
    360         } break;
    361         case AUTO_FOCUS: {
    362             ALOGV("AUTO_FOCUS");
    363             CHECK_INTERFACE(ICamera, data, reply);
    364             reply->writeInt32(autoFocus());
    365             return NO_ERROR;
    366         } break;
    367         case CANCEL_AUTO_FOCUS: {
    368             ALOGV("CANCEL_AUTO_FOCUS");
    369             CHECK_INTERFACE(ICamera, data, reply);
    370             reply->writeInt32(cancelAutoFocus());
    371             return NO_ERROR;
    372         } break;
    373         case TAKE_PICTURE: {
    374             ALOGV("TAKE_PICTURE");
    375             CHECK_INTERFACE(ICamera, data, reply);
    376             int msgType = data.readInt32();
    377             reply->writeInt32(takePicture(msgType));
    378             return NO_ERROR;
    379         } break;
    380         case SET_PARAMETERS: {
    381             ALOGV("SET_PARAMETERS");
    382             CHECK_INTERFACE(ICamera, data, reply);
    383             String8 params(data.readString8());
    384             reply->writeInt32(setParameters(params));
    385             return NO_ERROR;
    386          } break;
    387         case GET_PARAMETERS: {
    388             ALOGV("GET_PARAMETERS");
    389             CHECK_INTERFACE(ICamera, data, reply);
    390              reply->writeString8(getParameters());
    391             return NO_ERROR;
    392          } break;
    393         case SEND_COMMAND: {
    394             ALOGV("SEND_COMMAND");
    395             CHECK_INTERFACE(ICamera, data, reply);
    396             int command = data.readInt32();
    397             int arg1 = data.readInt32();
    398             int arg2 = data.readInt32();
    399             reply->writeInt32(sendCommand(command, arg1, arg2));
    400             return NO_ERROR;
    401          } break;
    402         case CONNECT: {
    403             CHECK_INTERFACE(ICamera, data, reply);
    404             sp<ICameraClient> cameraClient = interface_cast<ICameraClient>(data.readStrongBinder());
    405             reply->writeInt32(connect(cameraClient));
    406             return NO_ERROR;
    407         } break;
    408         case LOCK: {
    409             CHECK_INTERFACE(ICamera, data, reply);
    410             reply->writeInt32(lock());
    411             return NO_ERROR;
    412         } break;
    413         case UNLOCK: {
    414             CHECK_INTERFACE(ICamera, data, reply);
    415             reply->writeInt32(unlock());
    416             return NO_ERROR;
    417         } break;
    418         default:
    419             return BBinder::onTransact(code, data, reply, flags);
    420     }
    421 }
    422 
    423 // ----------------------------------------------------------------------------
    424 
    425 }; // namespace android
    426