CameraBase基类和Camera类介绍

  • CameraBase基类介绍

这个类的定义如下:

template <typename TCam, typename TCamTraits = CameraTraits<TCam> >

class CameraBase : public IBinder::DeathRecipient

{

public:

    typedef typename TCamTraits::TCamListener       TCamListener;

    typedef typename TCamTraits::TCamUser           TCamUser;

    typedef typename TCamTraits::TCamCallbacks      TCamCallbacks;

    typedef typename TCamTraits::TCamConnectService TCamConnectService;

    static sp<TCam>      connect(int cameraId,

                                 const String16& clientPackageName,

                                 int clientUid, int clientPid);

    virtual void         disconnect();

    void                 setListener(const sp<TCamListener>& listener);

    static int           getNumberOfCameras();

    static status_t      getCameraInfo(int cameraId,

                                       /*out*/

                                       struct hardware::CameraInfo* cameraInfo);

    sp<TCamUser>         remote();

    // Status is set to 'UNKNOWN_ERROR' after successful (re)connection

    status_t             getStatus();

protected:

    CameraBase(int cameraId);

    virtual              ~CameraBase();

   

    // TCamCallbacks implementation

   

    virtual void         notifyCallback(int32_t msgType, int32_t ext,

                                        int32_t ext2);

   

    // Common instance variables

   

    Mutex                            mLock;

    virtual void                     binderDied(const wp<IBinder>& who);

    // helper function to obtain camera service handle

    static const sp<::android::hardware::ICameraService> getCameraService();

    sp<TCamUser>                     mCamera;

    status_t                         mStatus;

    sp<TCamListener>                 mListener;

    const int                        mCameraId;

    typedef CameraBase<TCam>         CameraBaseT;

};

从定义来看,这运用了模板,并使用了我们前一章定义的萃取器并设置TCamTraits = CameraTraits<TCam>,这里来获取camera特性。同时为了避免编译错误我们通知  

 typedef typename TCamTraits::TCamListener       TCamListener;

    typedef typename TCamTraits::TCamUser           TCamUser;

    typedef typename TCamTraits::TCamCallbacks      TCamCallbacks;

    typedef typename TCamTraits::TCamConnectService TCamConnectService;

这些传过来的类型,而不是变量,便于后续的使用。后续当我们使用这个基类的时候由于未指定Tcam,后续需要指定Tcam,类似于CameraBase<TCam>.

这个类继承public IBinder::DeathRecipient通过virtual void  binderDied(const wp<IBinder>& who);用来监听binder绑定的进程是否退出。

    class DeathRecipient : public virtual RefBase

    {

    public:

        virtual void binderDied(const wp<IBinder>& who) = 0;

};

这里虚函数的实现是在Z:\SA800U_Android9.0_R01_r220\frameworks\av\camera\CameraBase.cpp

内容如下:

template <typename TCam, typename TCamTraits>

void CameraBase<TCam, TCamTraits>::binderDied(const wp<IBinder>& /*who*/) {

    ALOGW("mediaserver's remote binder Camera object died");

    notifyCallback(CAMERA_MSG_ERROR, CAMERA_ERROR_SERVER_DIED, /*ext2*/0);

}

  • Camera类介绍

先上定义代码如下:

Z:\SA800U_Android9.0_R01_r220\frameworks\av\include\camera\Camera.h

class Camera :

    public CameraBase<Camera>,

    public ::android::hardware::BnCameraClient

{

public:

    enum {

        USE_CALLING_UID = ::android::hardware::ICameraService::USE_CALLING_UID

    };

    enum {

        USE_CALLING_PID = ::android::hardware::ICameraService::USE_CALLING_PID

    };

            // construct a camera client from an existing remote

    static  sp<Camera>  create(const sp<::android::hardware::ICamera>& camera);

    static  sp<Camera>  connect(int cameraId,

                                const String16& clientPackageName,

                                int clientUid, int clientPid);

    static  status_t  connectLegacy(int cameraId, int halVersion,

                                     const String16& clientPackageName,

                                     int clientUid, sp<Camera>& camera);

            virtual     ~Camera();

            status_t    reconnect();

            status_t    lock();

            status_t    unlock();

            // pass the buffered IGraphicBufferProducer to the camera service

            status_t    setPreviewTarget(const sp<IGraphicBufferProducer>& bufferProducer);

            // start preview mode, must call setPreviewTarget first

            status_t    startPreview();

            // stop preview mode

            void        stopPreview();

            // get preview state

            bool        previewEnabled();

            // start recording mode, must call setPreviewTarget first

            status_t    startRecording();

            // stop recording mode

            void        stopRecording();

            // get recording state

            bool        recordingEnabled();

            // release a recording frame

            void        releaseRecordingFrame(const sp<IMemory>& mem);

            // release a recording frame handle

            void        releaseRecordingFrameHandle(native_handle_t *handle);

            // release a batch of recording frame handles

            void        releaseRecordingFrameHandleBatch(

                    const std::vector<native_handle_t*> handles);

            // autoFocus - status returned from callback

            status_t    autoFocus();

            // cancel auto focus

            status_t    cancelAutoFocus();

            // take a picture - picture returned from callback

            status_t    takePicture(int msgType);

            // set preview/capture parameters - key/value pairs

            status_t    setParameters(const String8& params);

            // get preview/capture parameters - key/value pairs

            String8     getParameters() const;

            // send command to camera driver

            status_t    sendCommand(int32_t cmd, int32_t arg1, int32_t arg2);

            // Tell camera how to pass video buffers. videoBufferMode is one of VIDEO_BUFFER_MODE_*.

            // Returns OK if the specified video buffer mode is supported. If videoBufferMode is

            // VIDEO_BUFFER_MODE_BUFFER_QUEUE, setVideoTarget() must be called before starting

            // video recording.

            status_t    setVideoBufferMode(int32_t videoBufferMode);

            // Set the video buffer producer for camera to use in VIDEO_BUFFER_MODE_BUFFER_QUEUE

            // mode.

            status_t    setVideoTarget(const sp<IGraphicBufferProducer>& bufferProducer);

            void        setListener(const sp<CameraListener>& listener);

            void        setRecordingProxyListener(const sp<ICameraRecordingProxyListener>& listener);

            // Configure preview callbacks to app. Only one of the older

            // callbacks or the callback surface can be active at the same time;

            // enabling one will disable the other if active. Flags can be

            // disabled by calling it with CAMERA_FRAME_CALLBACK_FLAG_NOOP, and

            // Target by calling it with a NULL interface.

            void        setPreviewCallbackFlags(int preview_callback_flag);

            status_t    setPreviewCallbackTarget(

                    const sp<IGraphicBufferProducer>& callbackProducer);

            sp<ICameraRecordingProxy> getRecordingProxy();

    // ICameraClient interface

    virtual void        notifyCallback(int32_t msgType, int32_t ext, int32_t ext2);

    virtual void        dataCallback(int32_t msgType, const sp<IMemory>& dataPtr,

                                     camera_frame_metadata_t *metadata);

    virtual void        dataCallbackTimestamp(nsecs_t timestamp, int32_t msgType, const sp<IMemory>& dataPtr);

    virtual void        recordingFrameHandleCallbackTimestamp(nsecs_t timestamp, native_handle_t* handle);

    virtual void        recordingFrameHandleCallbackTimestampBatch(

                                const std::vector<nsecs_t>& timestamps,

                                const std::vector<native_handle_t*>& handles);

    class RecordingProxy : public BnCameraRecordingProxy

    {

    public:

        explicit RecordingProxy(const sp<Camera>& camera);

        // ICameraRecordingProxy interface

        virtual status_t startRecording(const sp<ICameraRecordingProxyListener>& listener);

        virtual void stopRecording();

        virtual void releaseRecordingFrame(const sp<IMemory>& mem);

        virtual void releaseRecordingFrameHandle(native_handle_t* handle);

        virtual void releaseRecordingFrameHandleBatch(

                const std::vector<native_handle_t*>& handles);

    private:

        sp<Camera>         mCamera;

    };

protected:

    explicit            Camera(int cameraId);

                        Camera(const Camera&);

                        Camera& operator=(const Camera);

    sp<ICameraRecordingProxyListener>  mRecordingProxyListener;

    friend class        CameraBase;

};

可以看到这个类继承两个父类,其中CameraBase已经讲过了不必多述,

接下来讲一下另一个父类BnCameraClient。

  • BnCameraClient

这个类是用来进行binder通信的,最终我们Camera是作为客户端需要调用binder服务端CameraService执行我们需要的动作,这里牵扯到跨进程通信,Camera Service在安卓启动过程中就会被系统拉起来等待客户端的调用。

首先看下这个类的定义:

Z:\SA800U_Android9.0_R01_r220\frameworks\av\include\camera\android\hardware\ICameraClient.h

class BnCameraClient: public android::BnInterface<ICameraClient>

{

public:

    virtual status_t    onTransact( uint32_t code,

                                    const Parcel& data,

                                    Parcel* reply,

                                    uint32_t flags = 0);

};

可以看到这个类又继承自BnInterface并传入了IcameraClient作为其模板类型,我们先来看看这个BnInterface的定义

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();

};

可以看到这个类继承自INTERFACE模板参数以及继承自Bbinder,那么返回去也会就是BnCameraClient同样会继承IcameraClient,BnInterface为一个通用模板类,安卓framework native中很多服务都用到这个类,这个主要是用来进行binder通信。其中BBinder启动重要作用。

class BBinder : public Ibinder

这个类继承自Ibinder.

这部分涉及到安卓native的binder跨进程通信。

我们回到IcameraClient它的定义跟BnCameraClient在同一个文件中,定义一些CameraClient的一些功能,BnCameraClient作为跨进程服务者存在,所以它只定义一个onTransact函数。

这里使用虚函数来定义,给子类实现多态性。

这样我们大体的类关系可以梳理一下如下图:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基类和抽象是C++中的两个重要概念,它们有一些区别和联系。 虚基类是被"virtual"继承的,任何都可以成为虚基类。虚基类的主要作用是解决多重继承中的菱形继承问题,即当一个派生同时继承了两个基类,而这两个基类又共同继承自同一个虚基类时,通过虚基类可以避免派生中出现两份虚基类的实例。虚基类没有纯虚函数的要求。 抽象是至少包含一个纯虚函数的,它不能被实例化,即不能创建抽象的对象。抽象的主要作用是作为基类,为派生提供接口和规范。派生必须实现抽象中的纯虚函数才能被实例化。抽象可以包含非纯虚函数和数据成员。 以下是一个示例代码,展示了虚基类和抽象的使用: ```cpp // 虚基类 class Base { public: int x; }; // 派生1 class Derived1 : virtual public Base { public: int y; }; // 派生2 class Derived2 : virtual public Base { public: int z; }; // 最终派生 class FinalDerived : public Derived1, public Derived2 { public: int sum() { return x + y + z; } }; // 抽象 class AbstractClass { public: virtual void pureVirtualFunction() = 0; void nonVirtualFunction() { // 非纯虚函数的实现 } }; int main() { FinalDerived obj; obj.x = 1; obj.y = 2; obj.z = 3; int result = obj.sum(); // 输出:6 AbstractClass* ptr; // ptr = new AbstractClass(); // 错误,抽象不能被实例化 // 抽象可以作为指针型使用 ptr->pureVirtualFunction(); // 调用派生中的实现 return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值