zoukankan      html  css  js  c++  java
  • Camera构架分析【一】

    //客户端源码实现
    
    namespace android {
    
    class ICameraService : public IInterface
    {
    public:
        enum {
            CONNECT = IBinder::FIRST_CALL_TRANSACTION,
        };
    
    public:
        DECLARE_META_INTERFACE(CameraService);
    
        virtual sp<ICamera>     connect(const sp<ICameraClient>& cameraClient) = 0;
    };
    
    // ----------------------------------------------------------------------------
    
    class BnCameraService: public BnInterface<ICameraService>
    {
    public:
        virtual status_t    onTransact( uint32_t code,
                                        const Parcel& data,
                                        Parcel* reply,
                                        uint32_t flags = 0);
    };
    
    }; // namespace android
    
    #endif
    
    
    #ifndef ANDROID_HARDWARE_ICAMERA_APP_H#define ANDROID_HARDWARE_ICAMERA_APP_H#include <utils/RefBase.h>#include <binder/IInterface.h>#include <binder/Parcel.h>#include <binder/IMemory.h>#include <utils/Timers.h>namespace android {class ICameraClient: public IInterface{public: DECLARE_META_INTERFACE(CameraClient); virtual void notifyCallback(int32_t msgType, int32_t ext1, int32_t ext2) = 0; virtual void dataCallback(int32_t msgType, const sp<IMemory>& data) = 0; virtual void dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& data) = 0;};// ----------------------------------------------------------------------------class BnCameraClient:public BnInterface<ICameraClient> //说明了BnCameraClient的开头Bn* 含义是继承了BnInterface的类型。{public: virtual status_t onTransact( uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0);};}; // namespace android#endif
    
    服务端源码:
    
    namespace android {
    
    class ICameraService : public IInterface
    {
    public:
        enum {
            CONNECT = IBinder::FIRST_CALL_TRANSACTION,
        };
    
    public:
        DECLARE_META_INTERFACE(CameraService);
    
        virtual sp<ICamera>     connect(const sp<ICameraClient>& cameraClient) = 0;
    };
    
    // ----------------------------------------------------------------------------
    
    class BnCameraService: public BnInterface<ICameraService>
    {
    public:
        virtual status_t    onTransact( uint32_t code,
                                        const Parcel& data,
                                        Parcel* reply,
                                        uint32_t flags = 0);
    };
    
    }; // namespace android
    
    #endif
    
    
    其中的i字母开头的为这个接口类型继承:
    
    class IInterface : public virtual RefBase
    {
    public:
                IInterface();
                sp<IBinder>         asBinder();
                sp<const IBinder>   asBinder() const;
                
    protected:
        virtual                     ~IInterface();
        virtual IBinder*            onAsBinder() = 0;
    };
    
    
    其他有关的Bn,Bp,I开头的接口属性定义在这个文件中,IInterface.h
    
    /* Copyright Statement:
     *
     * This software/firmware and related documentation ("MediaTek Software") are
     * protected under relevant copyright laws. The information contained herein
     * is confidential and proprietary to MediaTek Inc. and/or its licensors.
     * Without the prior written permission of MediaTek inc. and/or its licensors,
     * any reproduction, modification, use or disclosure of MediaTek Software,
     * and information contained herein, in whole or in part, shall be strictly prohibited.
     *
     * MediaTek Inc. (C) 2010. All rights reserved.
     *
     * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
     * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
     * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
     * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
     * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
     * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
     * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
     * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
     * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
     * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
     * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
     * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
     * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
     * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
     * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
     * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
     * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
     * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
     */
    
    /*
     * Copyright (C) 2005 The Android Open Source Project
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    //
    #ifndef ANDROID_IINTERFACE_H
    #define ANDROID_IINTERFACE_H
    
    #include <binder/Binder.h>
    
    namespace android {
    
    // ----------------------------------------------------------------------
    
    class IInterface : public virtual RefBase
    {
    public:
                IInterface();
                sp<IBinder>         asBinder();
                sp<const IBinder>   asBinder() const;
                
    protected:
        virtual                     ~IInterface();
        virtual IBinder*            onAsBinder() = 0;
    };
    
    // ----------------------------------------------------------------------
    
    template<typename INTERFACE>
    inline sp<INTERFACE> interface_cast(const sp<IBinder>& obj)
    {
        return INTERFACE::asInterface(obj);
    }
    
    // ----------------------------------------------------------------------
    
    template<typename INTERFACE>
    class BnInterface : public INTERFACE, public BBinder
    {
    public:
        virtual sp<IInterface>      queryLocalInterface(const String16& _descriptor);
        virtual const String16&     getInterfaceDescriptor() const;
    
    protected:
        virtual IBinder*            onAsBinder();
    };
    
    // ----------------------------------------------------------------------
    
    template<typename INTERFACE>
    class BpInterface : public INTERFACE, public BpRefBase
    {
    public:
                                    BpInterface(const sp<IBinder>& remote);
    
    protected:
        virtual IBinder*            onAsBinder();
    };
    
    // ----------------------------------------------------------------------
    
    #define DECLARE_META_INTERFACE(INTERFACE)                               \
        static const String16 descriptor;                                   \
        static sp<I##INTERFACE> asInterface(const sp<IBinder>& obj);        \
        virtual const String16& getInterfaceDescriptor() const;             \
        I##INTERFACE();                                                     \
        virtual ~I##INTERFACE();                                            \
    
    
    #define IMPLEMENT_META_INTERFACE(INTERFACE, NAME)                       \
        const String16 I##INTERFACE::descriptor(NAME);                      \
        const String16& I##INTERFACE::getInterfaceDescriptor() const {      \
            return I##INTERFACE::descriptor;                                \
        }                                                                   \
        sp<I##INTERFACE> I##INTERFACE::asInterface(const sp<IBinder>& obj)  \
        {                                                                   \
            sp<I##INTERFACE> intr;                                          \
            if (obj != NULL) {                                              \
                intr = static_cast<I##INTERFACE*>(                          \
                    obj->queryLocalInterface(                               \
                            I##INTERFACE::descriptor).get());               \
                if (intr == NULL) {                                         \
                    intr = new Bp##INTERFACE(obj);                          \
                }                                                           \
            }                                                               \
            return intr;                                                    \
        }                                                                   \
        I##INTERFACE::I##INTERFACE() { }                                    \
        I##INTERFACE::~I##INTERFACE() { }                                   \
    
    
    #define CHECK_INTERFACE(interface, data, reply)                         \
        if (!data.checkInterface(this)) { return PERMISSION_DENIED; }       \
    
    
    // ----------------------------------------------------------------------
    // No user-serviceable parts after this...
    
    template<typename INTERFACE>
    inline sp<IInterface> BnInterface<INTERFACE>::queryLocalInterface(
            const String16& _descriptor)
    {
        if (_descriptor == INTERFACE::descriptor) return this;
        return NULL;
    }
    
    template<typename INTERFACE>
    inline const String16& BnInterface<INTERFACE>::getInterfaceDescriptor() const
    {
        return INTERFACE::getInterfaceDescriptor();
    }
    
    template<typename INTERFACE>
    IBinder* BnInterface<INTERFACE>::onAsBinder()
    {
        return this;
    }
    
    template<typename INTERFACE>
    inline BpInterface<INTERFACE>::BpInterface(const sp<IBinder>& remote)
        : BpRefBase(remote)
    {
    }
    
    template<typename INTERFACE>
    inline IBinder* BpInterface<INTERFACE>::onAsBinder()
    {
        return remote();
    }
        
    // ----------------------------------------------------------------------
    
    }; // namespace android
    
    #endif // ANDROID_IINTERFACE_H
    
    
    
    
    
    
    


  • 相关阅读:
    iscsi一致性的测试验证方法
    ceph各个版本之间参数变化分析
    rgw的rgw_thread_pool_size配置调整
    rgw前端替换civetweb为beast
    配置内网访问的TV
    关于vm.min_free_kbytes的合理设置推测
    rbd的删除回收站功能
    python爬取微博热门话题榜
    Selenium+Pytest自动化测试框架—禅道实战
    python带参数装饰器的两种写法
  • 原文地址:https://www.cnblogs.com/yuzaipiaofei/p/4124366.html
Copyright © 2011-2022 走看看