Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0c91fbbc authored by Jiwen Cai's avatar Jiwen Cai Committed by Android (Google) Code Review
Browse files

Merge "dvr_api GetExternalSurface returns ANativeWindow" into oc-dev

parents 4f20f9cf 960bcfff
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -381,6 +381,7 @@ extern "C" {

struct DvrWriteBufferQueue {
  std::shared_ptr<android::dvr::ProducerQueue> producer_queue_;
  ANativeWindow* native_window_{nullptr};
};

struct DvrReadBufferQueue {
+0 −1
Original line number Diff line number Diff line
@@ -49,7 +49,6 @@ LOCAL_STATIC_LIBRARIES := \
LOCAL_SHARED_LIBRARIES := \
    android.hardware.graphics.bufferqueue@1.0 \
    android.hidl.token@1.0-utils \
    libandroid_runtime \
    libbase \
    libnativewindow \

+26 −10
Original line number Diff line number Diff line
#include "include/dvr/dvr_buffer_queue.h"

#include <android/native_window.h>
#include <gui/Surface.h>
#include <private/dvr/buffer_hub_queue_client.h>
#include <private/dvr/buffer_hub_queue_producer.h>

#include <android_runtime/android_view_Surface.h>

#define CHECK_PARAM(param)                                               \
  LOG_ALWAYS_FATAL_IF(param == nullptr, "%s: " #param "cannot be NULL.", \
                      __FUNCTION__)
@@ -15,6 +14,9 @@ using namespace android;
extern "C" {

void dvrWriteBufferQueueDestroy(DvrWriteBufferQueue* write_queue) {
  if (write_queue != nullptr && write_queue->native_window_ != nullptr) {
    ANativeWindow_release(write_queue->native_window_);
  }
  delete write_queue;
}

@@ -23,16 +25,30 @@ size_t dvrWriteBufferQueueGetCapacity(DvrWriteBufferQueue* write_queue) {
  return write_queue->producer_queue_->capacity();
}

jobject dvrWriteBufferQueueGetExternalSurface(DvrWriteBufferQueue* write_queue,
                                              JNIEnv* env) {
  CHECK_PARAM(env);
int dvrWriteBufferQueueGetExternalSurface(DvrWriteBufferQueue* write_queue,
                                          ANativeWindow** out_window) {
  CHECK_PARAM(write_queue);
  CHECK_PARAM(out_window);

  // Lazy creation of |native_window_|.
  if (write_queue->native_window_ == nullptr) {
    std::shared_ptr<dvr::BufferHubQueueCore> core =
        dvr::BufferHubQueueCore::Create(write_queue->producer_queue_);
    if (core == nullptr) {
      ALOGE(
          "dvrWriteBufferQueueGetExternalSurface: Failed to create native "
          "window.");
      return -ENOMEM;
    }

    sp<IGraphicBufferProducer> gbp = new dvr::BufferHubQueueProducer(core);
    sp<Surface> surface = new Surface(gbp, true);
    write_queue->native_window_ = static_cast<ANativeWindow*>(surface.get());
    ANativeWindow_acquire(write_queue->native_window_);
  }

  return android_view_Surface_createFromIGraphicBufferProducer(
      env, new dvr::BufferHubQueueProducer(core));
  *out_window = write_queue->native_window_;
  return 0;
}

int dvrWriteBufferQueueCreateReadQueue(DvrWriteBufferQueue* write_queue,
+4 −3
Original line number Diff line number Diff line
@@ -6,12 +6,13 @@
#include <stdint.h>

#include <dvr/dvr_hardware_composer_defs.h>
#include <jni.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef struct ANativeWindow ANativeWindow;

typedef struct DvrPoseAsync DvrPoseAsync;

typedef struct DvrDisplayManagerClient DvrDisplayManagerClient;
@@ -89,8 +90,8 @@ typedef int (*DvrReadBufferReleaseAsyncPtr)(DvrReadBuffer* client);
typedef void (*DvrWriteBufferQueueDestroyPtr)(DvrWriteBufferQueue* write_queue);
typedef size_t (*DvrWriteBufferQueueGetCapacityPtr)(
    DvrWriteBufferQueue* write_queue);
typedef jobject (*DvrWriteBufferQueueGetExternalSurfacePtr)(
    DvrWriteBufferQueue* write_queue, JNIEnv* env);
typedef int (*DvrWriteBufferQueueGetExternalSurfacePtr)(
    DvrWriteBufferQueue* write_queue, ANativeWindow** out_window);
typedef int (*DvrWriteBufferQueueCreateReadQueuePtr)(
    DvrWriteBufferQueue* write_queue, DvrReadBufferQueue** out_read_queue);
typedef int (*DvrWriteBufferQueueDequeuePtr)(DvrWriteBufferQueue* write_queue,
+8 −5
Original line number Diff line number Diff line
@@ -2,12 +2,13 @@
#define ANDROID_DVR_BUFFER_QUEUE_H_

#include <dvr/dvr_buffer.h>
#include <jni.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef struct ANativeWindow ANativeWindow;

typedef struct DvrWriteBufferQueue DvrWriteBufferQueue;
typedef struct DvrReadBufferQueue DvrReadBufferQueue;

@@ -15,10 +16,12 @@ typedef struct DvrReadBufferQueue DvrReadBufferQueue;
void dvrWriteBufferQueueDestroy(DvrWriteBufferQueue* write_queue);
size_t dvrWriteBufferQueueGetCapacity(DvrWriteBufferQueue* write_queue);

// Returns ANativeWindow in the form of jobject. Can be casted to ANativeWindow
// using ANativeWindow_fromSurface NDK API.
jobject dvrWriteBufferQueueGetExternalSurface(DvrWriteBufferQueue* write_queue,
                                              JNIEnv* env);
// Returns ANativeWindow. Can be casted to a Java Surface using
// ANativeWindow_toSurface NDK API. Note that this method does not acquire an
// additional reference to the ANativeWindow returned, don't call
// ANativeWindow_release on it.
int dvrWriteBufferQueueGetExternalSurface(DvrWriteBufferQueue* write_queue,
                                          ANativeWindow** out_window);

int dvrWriteBufferQueueCreateReadQueue(DvrWriteBufferQueue* write_queue,
                                       DvrReadBufferQueue** out_read_queue);
Loading