interface_cast做什么的?&&Android中真正的Player

本文解析了Android中MediaPlayer的工作原理,重点介绍了interface_cast的使用方法及如何创建真正的Player对象。此外,还探讨了不同类型的Player(如PVPlayer、StagefrightPlayer等)及其应用场景。

http://blog.youkuaiyun.com/myarrow/article/details/7054589

1. 前面对interface_cast已经进行了详解,为加深理解,现单独把结果抛出来。

它本身是一个模板,如:interface_cast<IMediaPlayer>(reply.readStrongBinder());

2. reply.readStrongBinder());返回的结果是一个新创建的BpBinder对象。

3. interface_cast<IMediaPlayer>(BpBinder);新创建一个BpMediaPlayer对象并返回,且在创建BpMediaPlayer时把BpBinder做为其参数,结果是把BpBinder对象赋值给其基类BpRefBase中的mRemote来保存。

4. BpMediaPlayer对象由MediaPlayer的mPlayer来保存。

 

大家经常讲,把性能搞好,并稳定就行了。不懂原理又怎么能把它搞好搞稳呢?其结果是把问题搞大。“深入其内部,才能将其征服


Android中真正的Player

http://blog.youkuaiyun.com/myarrow/article/details/7054631

1.  在前面的介绍中,从Java到MediaPlayer---Binder---MediaPlayerService::Client已经讲清楚了。可是,在MediaPlayerService::Client <MediaPlayerService::create-> new Client / MediaPlayerService::Client::setDataSource->getPlayerType/createPlayer->android::createPlayer>中调用android::createPlayer之后,并把新创建的真正的Player保存到MediaPlayerService::Client中的mPlayer之后就没有下文了。

 

2. 真正的Player到底是什么样的?

根据本人的了解,有PVPlayer, StagefrightPlayer,MidiFile,VorbisPlayer,每个Player处理不同的媒体类型,他们通过getPlayerType(const char* url)的返回值进行分工完成。每个Player都有自己的特长,并做自己善于做的事情。详细分工情况见代码:sp<MediaPlayerBase> createPlayer(player_type playerType, void* cookie,
        notify_callback_f notifyFunc)
函数。

3. 如果要在自己的芯片上实现硬件Demux和硬件Decoder(如对于机顶盒中的TS流),怎么办呢?

据本人了解,有两种办法:

1)基于MediaPlayerInterface接口,实现其中所有的接口函数,自已创建一个XXPlayer,并增加到android::createPlayer中。每个接口函数的具体实现就与以前在Linux环境下实现的方式一样,简单吧,以前的成果都可以用上了。

2)在现在的Player(如StagefrightPlayer)中写Extractor和Decoder插件。

为了实现第二种方案,需要先了解StagefrightPlayer的架构。为什么两种方案都需要了解呢,因为怎么做,取决于你的首席架构师或CTO等。



<think>我们正在处理用户的问题:用户询问关于C++中`interface_cast<ICameraService>`的使用或实现。 根据之前提供的引用[1],它提到了ActivityManagerService继承自IActivityManager.Stub,并且提到了AIDL框架。同时,用户的问题集中在C++中的interface_cast,这与Android的Binder机制有关,特别是在C++层。 在Android系统中,Binder用于进程间通信(IPC)。在C++层,Binder框架提供了一些模板函数和类来实现接口的转换。其中,interface_cast是一个模板函数,用于将IBinder对象转换为特定的接口类型。 具体来说,interface_cast是在IInterface.h中定义的,通常通过宏定义来实现。例如,对于ICameraService接口,可能会有如下声明: 在ICameraService.h中,可能会使用DECLARE_META_INTERFACE宏来声明接口,这个宏会定义一个静态的asInterface函数,而interface_cast内部就是调用这个asInterface函数。 实现步骤: 1. 首先,需要定义ICameraService接口,该接口应该继承自IInterface。 2. 然后,使用DECLARE_META_INTERFACE(ICameraService)声明必要的静态函数和描述符。 3. 在另一个地方(通常是.cpp文件)使用IMPLEMENT_META_INTERFACE(ICameraService, "android.hardware.ICameraService")来实现这些函数。 interface_cast的使用方式通常是: sp<ICameraService> cameraService = interface_cast<ICameraService>(binder); 其中,binder是一个指向IBinder对象的指针(sp<IBinder>)。这个函数会尝试将IBinder对象转换为ICameraService接口。 下面我们详细说明:</think>### C++ `interface_cast<ICameraService>` 的实现与使用 在 Android Binder IPC 框架中,`interface_cast` 是用于将 `IBinder` 对象转换为具体接口类型的模板函数,其核心实现位于 `IInterface.h` 头文件中: ```cpp // IInterface.h 中的关键定义 template<typename INTERFACE> inline sp<INTERFACE> interface_cast(const sp<IBinder>& obj) { return INTERFACE::asInterface(obj); } ``` #### 实现原理 1. **接口声明** 接口需继承 `IInterface` 并使用 `DECLARE_META_INTERFACE` 宏声明元信息: ```cpp class ICameraService : public IInterface { public: DECLARE_META_INTERFACE(CameraService); // 声明描述符和 asInterface() virtual void connect(const sp<ICameraClient>& client) = 0; }; ``` 2. **接口实现** 在 `.cpp` 文件中使用 `IMPLEMENT_META_INTERFACE` 实现转换逻辑: ```cpp IMPLEMENT_META_INTERFACE(CameraService, "android.hardware.ICameraService"); ``` 该宏展开后生成: ```cpp ::android::sp<ICameraService> ICameraService::asInterface( const ::android::sp<::android::IBinder>& obj) { if (obj == nullptr) return nullptr; // 查询本地代理对象 ::android::sp<ICameraService> intr = static_cast<ICameraService*>(obj->queryLocalInterface(descriptor).get()); if (intr == nullptr) { intr = new BpCameraService(obj); // 创建代理对象 } return intr; } ``` #### 使用场景 ```cpp // 获取 CameraService sp<IBinder> binder = defaultServiceManager()->getService(String16("camera")); sp<ICameraService> cameraService = interface_cast<ICameraService>(binder); // 调用接口方法 if (cameraService != nullptr) { cameraService->connect(cameraClient); // 调用跨进程方法 } ``` 1. **服务端**:继承 `BnCameraService` 实现具体逻辑 2. **客户端**:通过 `interface_cast` 获取代理对象 `BpCameraService` #### 关键机制 - **对象转换**:`interface_cast` 触发 `asInterface()` 调用,自动创建代理对象 `BpCameraService` - **跨进程通信**:`BpCameraService` 将方法调用打包为 `Parcel` 通过 Binder 驱动发送 - **接口描述符**:字符串 `"android.hardware.ICameraService"` 用于识别接口[^1] --- ### 相关问题 1. Binder 驱动如何在内核层处理 `Parcel` 数据? 2. 如何实现自定义的 Android 系统服务并通过 Binder 暴露接口? 3. `BnCameraService` 和 `BpCameraService` 在 Binder 通信中的具体作用是什么? 4. 在多进程场景下,Binder 如何管理接口对象的生命周期? [^1]: 引用自 Android 源码 `IInterface.h` 及 Binder 框架实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值