vr_composer.cpp revision 15561b082ff4da3121be20d55b05a074ddd15a5c
1aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara#include "vr_composer.h"
2aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
30b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara#include <binder/IPCThreadState.h>
40b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara#include <binder/PermissionCache.h>
50b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara
6aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoaranamespace android {
7aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoaranamespace dvr {
80b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoaranamespace {
90b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara
100b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoarabool CheckPermission() {
110b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara  const android::IPCThreadState* ipc = android::IPCThreadState::self();
120b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara  const pid_t pid = ipc->getCallingPid();
130b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara  const uid_t uid = ipc->getCallingUid();
140b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara  const bool permission = PermissionCache::checkPermission(
150b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara      String16("android.permission.RESTRICTED_VR_ACCESS"), pid, uid);
160b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara  if (!permission)
170b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara    ALOGE("permission denied to pid=%d uid=%u", pid, uid);
180b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara
190b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara  return permission;
200b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara}
210b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara
220b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara}  // namespace
23aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
24aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel NicoaraVrComposer::VrComposer() {}
25aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
26aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel NicoaraVrComposer::~VrComposer() {}
27aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
28aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoarabinder::Status VrComposer::registerObserver(
29aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    const sp<IVrComposerCallback>& callback) {
30aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
31aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
320b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara  if (!CheckPermission())
330b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara    return binder::Status::fromStatusT(PERMISSION_DENIED);
340b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara
35aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  if (callback_.get()) {
36aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    ALOGE("Failed to register callback, already registered");
37aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    return binder::Status::fromStatusT(ALREADY_EXISTS);
38aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  }
39aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
40aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  callback_ = callback;
41aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  IInterface::asBinder(callback_)->linkToDeath(this);
42aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  return binder::Status::ok();
43aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara}
44aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
4515561b082ff4da3121be20d55b05a074ddd15a5cPat Plunkettbinder::Status VrComposer::clearObserver() {
4615561b082ff4da3121be20d55b05a074ddd15a5cPat Plunkett  std::lock_guard<std::mutex> guard(mutex_);
4715561b082ff4da3121be20d55b05a074ddd15a5cPat Plunkett  callback_ = nullptr;
4815561b082ff4da3121be20d55b05a074ddd15a5cPat Plunkett  return binder::Status::ok();
4915561b082ff4da3121be20d55b05a074ddd15a5cPat Plunkett}
5015561b082ff4da3121be20d55b05a074ddd15a5cPat Plunkett
51aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoarabase::unique_fd VrComposer::OnNewFrame(const ComposerView::Frame& frame) {
52aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
53aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
54aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  if (!callback_.get())
55aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    return base::unique_fd();
56aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
57aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ParcelableComposerFrame parcelable_frame(frame);
58aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ParcelableUniqueFd fence;
59aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  binder::Status ret = callback_->onNewFrame(parcelable_frame, &fence);
60aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  if (!ret.isOk())
61aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    ALOGE("Failed to send new frame: %s", ret.toString8().string());
62aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
63aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  return fence.fence();
64aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara}
65aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
66aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoaravoid VrComposer::binderDied(const wp<IBinder>& /* who */) {
67aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
68aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
69aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  callback_ = nullptr;
70aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara}
71aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
72aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara}  // namespace dvr
73aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara}  // namespace android
74