Revert "Remove direct libgui reference from omx server side"
This reverts commit 482f60ccccc12e6afe24f9ba503496ce65d1ba43.
Reason for revert: b/130058749 camera recording hang
Bug: 130058749
Change-Id: I358bc9c62c48328c01c8611c7e6f77d16affff54
(cherry picked from commit b4979c59d93a6ca2be7e65489fc39896bfdc2c96)
diff --git a/media/codec2/hidl/client/Android.bp b/media/codec2/hidl/client/Android.bp
index 965e438..f92d1af 100644
--- a/media/codec2/hidl/client/Android.bp
+++ b/media/codec2/hidl/client/Android.bp
@@ -20,6 +20,7 @@
"libhidltransport",
"liblog",
"libstagefright_bufferpool@2.0",
+ "libstagefright_bufferqueue_helper",
"libui",
"libutils",
],
diff --git a/media/codec2/sfplugin/Android.bp b/media/codec2/sfplugin/Android.bp
index 66457e7..a212651 100644
--- a/media/codec2/sfplugin/Android.bp
+++ b/media/codec2/sfplugin/Android.bp
@@ -40,6 +40,7 @@
"libmedia",
"libmedia_omx",
"libsfplugin_ccodec_utils",
+ "libstagefright_bufferqueue_helper",
"libstagefright_codecbase",
"libstagefright_foundation",
"libstagefright_omx_utils",
diff --git a/media/libmedia/Android.bp b/media/libmedia/Android.bp
index 1d33590..a529628 100644
--- a/media/libmedia/Android.bp
+++ b/media/libmedia/Android.bp
@@ -65,6 +65,7 @@
"MediaCodecInfo.cpp",
"OMXBuffer.cpp",
"omx/1.0/WGraphicBufferSource.cpp",
+ "omx/1.0/WOmx.cpp",
"omx/1.0/WOmxBufferSource.cpp",
"omx/1.0/WOmxNode.cpp",
"omx/1.0/WOmxObserver.cpp",
@@ -74,16 +75,13 @@
local_include_dirs: ["aidl"],
export_aidl_headers: true,
},
-
- local_include_dirs: [
- "include",
- ],
shared_libs: [
"android.hidl.token@1.0-utils",
"android.hardware.media.omx@1.0",
"libbinder",
"libcutils",
+ "libgui",
"libhidlbase",
"libhidltransport",
"liblog",
@@ -95,84 +93,21 @@
export_shared_lib_headers: [
"android.hidl.token@1.0-utils",
"android.hardware.media.omx@1.0",
+ "libgui",
"libstagefright_foundation",
"libui",
],
header_libs: [
- "libstagefright_headers",
- "media_plugin_headers",
+ "libmedia_headers",
],
export_header_lib_headers: [
- "libstagefright_headers",
- "media_plugin_headers",
+ "libmedia_headers",
],
export_include_dirs: [
"aidl",
- "include",
- ],
-
- cflags: [
- "-Werror",
- "-Wno-error=deprecated-declarations",
- "-Wall",
- ],
-
- sanitize: {
- misc_undefined: [
- "unsigned-integer-overflow",
- "signed-integer-overflow",
- ],
- cfi: true,
- },
-}
-
-
-cc_library_shared {
- name: "libmedia_omx_client",
-
- srcs: [
- "omx/1.0/WOmx.cpp",
- ],
-
- local_include_dirs: [
- "include",
- ],
-
- shared_libs: [
- "libbinder",
- "libcutils",
- "libgui",
- "libhidlbase",
- "libhidltransport",
- "liblog",
- "libmedia_omx",
- "libstagefright_foundation",
- "libui",
- "libutils",
- ],
-
- export_shared_lib_headers: [
- "libgui",
- "libmedia_omx",
- "libstagefright_foundation",
- "libui",
- ],
-
- header_libs: [
- "libstagefright_headers",
- "media_plugin_headers",
- ],
-
- export_header_lib_headers: [
- "libstagefright_headers",
- "media_plugin_headers",
- ],
-
- export_include_dirs: [
- "include",
],
cflags: [
diff --git a/media/libmedia/IOMX.cpp b/media/libmedia/IOMX.cpp
index bc0c2cd..747b88f 100644
--- a/media/libmedia/IOMX.cpp
+++ b/media/libmedia/IOMX.cpp
@@ -27,6 +27,7 @@
#include <media/openmax/OMX_IndexExt.h>
#include <media/OMXBuffer.h>
#include <utils/NativeHandle.h>
+#include <gui/IGraphicBufferProducer.h>
#include <media/omx/1.0/WOmxNode.h>
#include <android/IGraphicBufferSource.h>
@@ -61,6 +62,79 @@
SET_QUIRKS,
};
+class BpOMX : public BpInterface<IOMX> {
+public:
+ explicit BpOMX(const sp<IBinder> &impl)
+ : BpInterface<IOMX>(impl) {
+ }
+
+ virtual status_t listNodes(List<ComponentInfo> *list) {
+ list->clear();
+
+ Parcel data, reply;
+ data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
+ remote()->transact(LIST_NODES, data, &reply);
+
+ int32_t n = reply.readInt32();
+ for (int32_t i = 0; i < n; ++i) {
+ list->push_back(ComponentInfo());
+ ComponentInfo &info = *--list->end();
+
+ info.mName = reply.readString8();
+ int32_t numRoles = reply.readInt32();
+ for (int32_t j = 0; j < numRoles; ++j) {
+ info.mRoles.push_back(reply.readString8());
+ }
+ }
+
+ return OK;
+ }
+
+ virtual status_t allocateNode(
+ const char *name, const sp<IOMXObserver> &observer,
+ sp<IOMXNode> *omxNode) {
+ Parcel data, reply;
+ data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
+ data.writeCString(name);
+ data.writeStrongBinder(IInterface::asBinder(observer));
+ remote()->transact(ALLOCATE_NODE, data, &reply);
+
+ status_t err = reply.readInt32();
+ if (err == OK) {
+ *omxNode = IOMXNode::asInterface(reply.readStrongBinder());
+ } else {
+ omxNode->clear();
+ }
+
+ return err;
+ }
+
+ virtual status_t createInputSurface(
+ sp<IGraphicBufferProducer> *bufferProducer,
+ sp<IGraphicBufferSource> *bufferSource) {
+ Parcel data, reply;
+ status_t err;
+ data.writeInterfaceToken(IOMX::getInterfaceDescriptor());
+ err = remote()->transact(CREATE_INPUT_SURFACE, data, &reply);
+ if (err != OK) {
+ ALOGW("binder transaction failed: %d", err);
+ return err;
+ }
+
+ err = reply.readInt32();
+ if (err != OK) {
+ return err;
+ }
+
+ *bufferProducer = IGraphicBufferProducer::asInterface(
+ reply.readStrongBinder());
+ *bufferSource = IGraphicBufferSource::asInterface(
+ reply.readStrongBinder());
+
+ return err;
+ }
+};
+
class BpOMXNode : public BpInterface<IOMXNode> {
public:
explicit BpOMXNode(const sp<IBinder> &impl)
@@ -477,6 +551,7 @@
}
};
+IMPLEMENT_META_INTERFACE(OMX, "android.hardware.IOMX");
IMPLEMENT_HYBRID_META_INTERFACE(OMXNode, "android.hardware.IOMXNode");
////////////////////////////////////////////////////////////////////////////////
@@ -487,6 +562,82 @@
return PERMISSION_DENIED; \
} } while (0)
+status_t BnOMX::onTransact(
+ uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
+ switch (code) {
+ case LIST_NODES:
+ {
+ CHECK_OMX_INTERFACE(IOMX, data, reply);
+
+ List<ComponentInfo> list;
+ listNodes(&list);
+
+ reply->writeInt32(list.size());
+ for (List<ComponentInfo>::iterator it = list.begin();
+ it != list.end(); ++it) {
+ ComponentInfo &cur = *it;
+
+ reply->writeString8(cur.mName);
+ reply->writeInt32(cur.mRoles.size());
+ for (List<String8>::iterator role_it = cur.mRoles.begin();
+ role_it != cur.mRoles.end(); ++role_it) {
+ reply->writeString8(*role_it);
+ }
+ }
+
+ return NO_ERROR;
+ }
+
+ case ALLOCATE_NODE:
+ {
+ CHECK_OMX_INTERFACE(IOMX, data, reply);
+
+ const char *name = data.readCString();
+
+ sp<IOMXObserver> observer =
+ interface_cast<IOMXObserver>(data.readStrongBinder());
+
+ if (name == NULL || observer == NULL) {
+ ALOGE("b/26392700");
+ reply->writeInt32(INVALID_OPERATION);
+ return NO_ERROR;
+ }
+
+ sp<IOMXNode> omxNode;
+
+ status_t err = allocateNode(name, observer, &omxNode);
+
+ reply->writeInt32(err);
+ if (err == OK) {
+ reply->writeStrongBinder(IInterface::asBinder(omxNode));
+ }
+
+ return NO_ERROR;
+ }
+
+ case CREATE_INPUT_SURFACE:
+ {
+ CHECK_OMX_INTERFACE(IOMX, data, reply);
+
+ sp<IGraphicBufferProducer> bufferProducer;
+ sp<IGraphicBufferSource> bufferSource;
+ status_t err = createInputSurface(&bufferProducer, &bufferSource);
+
+ reply->writeInt32(err);
+
+ if (err == OK) {
+ reply->writeStrongBinder(IInterface::asBinder(bufferProducer));
+ reply->writeStrongBinder(IInterface::asBinder(bufferSource));
+ }
+
+ return NO_ERROR;
+ }
+
+ default:
+ return BBinder::onTransact(code, data, reply, flags);
+ }
+}
+
status_t BnOMXNode::onTransact(
uint32_t code, const Parcel &data, Parcel *reply, uint32_t flags) {
switch (code) {
diff --git a/media/libmedia/include/media/IOMX.h b/media/libmedia/include/media/IOMX.h
index 7e7c2d2..e69c02d 100644
--- a/media/libmedia/include/media/IOMX.h
+++ b/media/libmedia/include/media/IOMX.h
@@ -47,8 +47,9 @@
using hardware::media::omx::V1_0::IOmxNode;
-class IOMX : public RefBase {
+class IOMX : public IInterface {
public:
+ DECLARE_META_INTERFACE(OMX);
typedef uint32_t buffer_id;
@@ -223,6 +224,14 @@
};
////////////////////////////////////////////////////////////////////////////////
+
+class BnOMX : public BnInterface<IOMX> {
+public:
+ virtual status_t onTransact(
+ uint32_t code, const Parcel &data, Parcel *reply,
+ uint32_t flags = 0);
+};
+
class BnOMXNode : public BnInterface<IOMXNode> {
public:
virtual status_t onTransact(
diff --git a/media/libmedia/include/media/omx/1.0/Conversion.h b/media/libmedia/include/media/omx/1.0/Conversion.h
index babda22..3700a23 100644
--- a/media/libmedia/include/media/omx/1.0/Conversion.h
+++ b/media/libmedia/include/media/omx/1.0/Conversion.h
@@ -31,12 +31,12 @@
#include <ui/FenceTime.h>
#include <cutils/native_handle.h>
-#include <ui/BufferQueueDefs.h>
#include <ui/GraphicBuffer.h>
#include <media/OMXFenceParcelable.h>
#include <media/OMXBuffer.h>
#include <media/hardware/VideoAPI.h>
#include <media/stagefright/MediaErrors.h>
+#include <gui/IGraphicBufferProducer.h>
#include <android/hardware/media/omx/1.0/types.h>
#include <android/hardware/media/omx/1.0/IOmx.h>
@@ -282,8 +282,8 @@
case TIMED_OUT:
case ERROR_UNSUPPORTED:
case UNKNOWN_ERROR:
- case BufferQueueDefs::RELEASE_ALL_BUFFERS:
- case BufferQueueDefs::BUFFER_NEEDS_REALLOCATION:
+ case IGraphicBufferProducer::RELEASE_ALL_BUFFERS:
+ case IGraphicBufferProducer::BUFFER_NEEDS_REALLOCATION:
return static_cast<Status>(l);
case NOT_ENOUGH_DATA:
return Status::BUFFER_NEEDS_REALLOCATION;
diff --git a/media/libmedia/include/media/omx/1.0/WOmx.h b/media/libmedia/include/media/omx/1.0/WOmx.h
index 0680eec..f13546e 100644
--- a/media/libmedia/include/media/omx/1.0/WOmx.h
+++ b/media/libmedia/include/media/omx/1.0/WOmx.h
@@ -47,6 +47,7 @@
using ::android::List;
using ::android::IOMX;
+using ::android::BnOMX;
/**
* Wrapper classes for conversion
@@ -57,7 +58,7 @@
* - TW = Treble Wrapper --- It wraps a legacy object inside a Treble object.
*/
-struct LWOmx : public IOMX {
+struct LWOmx : public BnOMX {
sp<IOmx> mBase;
LWOmx(sp<IOmx> const& base);
status_t listNodes(List<IOMX::ComponentInfo>* list) override;
diff --git a/media/libmediaplayer2/Android.bp b/media/libmediaplayer2/Android.bp
index dca6bb6..08519cd 100644
--- a/media/libmediaplayer2/Android.bp
+++ b/media/libmediaplayer2/Android.bp
@@ -38,7 +38,6 @@
export_shared_lib_headers: [
"libaudioclient",
"libbinder",
- "libgui",
"libmedia_omx",
],
diff --git a/media/libstagefright/Android.bp b/media/libstagefright/Android.bp
index 5932518..b05718c 100644
--- a/media/libstagefright/Android.bp
+++ b/media/libstagefright/Android.bp
@@ -187,7 +187,6 @@
"liblog",
"libmedia",
"libmedia_omx",
- "libmedia_omx_client",
"libaudioclient",
"libmediametrics",
"libmediautils",
diff --git a/media/libstagefright/bqhelper/GraphicBufferSource.cpp b/media/libstagefright/bqhelper/GraphicBufferSource.cpp
index c897d2d..a4374c9 100644
--- a/media/libstagefright/bqhelper/GraphicBufferSource.cpp
+++ b/media/libstagefright/bqhelper/GraphicBufferSource.cpp
@@ -281,27 +281,6 @@
}
};
-struct GraphicBufferSource::ConsumerProxy : public BufferQueue::ConsumerListener {
- ConsumerProxy(const sp<GraphicBufferSource> &gbs) : mGbs(gbs) {}
-
- ~ConsumerProxy() = default;
-
- void onFrameAvailable(const BufferItem& item) override {
- mGbs->onFrameAvailable(item);
- }
-
- void onBuffersReleased() override {
- mGbs->onBuffersReleased();
- }
-
- void onSidebandStreamChanged() override {
- mGbs->onSidebandStreamChanged();
- }
-
-private:
- sp<GraphicBufferSource> mGbs;
-};
-
GraphicBufferSource::GraphicBufferSource() :
mInitCheck(UNKNOWN_ERROR),
mNumAvailableUnacquiredBuffers(0),
@@ -338,7 +317,8 @@
// reference once the ctor ends, as that would cause the refcount of 'this'
// dropping to 0 at the end of the ctor. Since all we need is a wp<...>
// that's what we create.
- wp<BufferQueue::ConsumerListener> listener = new ConsumerProxy(this);
+ wp<BufferQueue::ConsumerListener> listener =
+ static_cast<BufferQueue::ConsumerListener*>(this);
sp<IConsumerListener> proxy =
new BufferQueue::ProxyConsumerListener(listener);
diff --git a/media/libstagefright/bqhelper/include/media/stagefright/bqhelper/GraphicBufferSource.h b/media/libstagefright/bqhelper/include/media/stagefright/bqhelper/GraphicBufferSource.h
index f182f2f..abc8910 100644
--- a/media/libstagefright/bqhelper/include/media/stagefright/bqhelper/GraphicBufferSource.h
+++ b/media/libstagefright/bqhelper/include/media/stagefright/bqhelper/GraphicBufferSource.h
@@ -68,7 +68,7 @@
* (even if it was dropped) to reencode it after an interval if no further
* frames are sent by the producer.
*/
-class GraphicBufferSource : public RefBase {
+class GraphicBufferSource : public BufferQueue::ConsumerListener {
public:
GraphicBufferSource();
@@ -192,7 +192,6 @@
protected:
// BQ::ConsumerListener interface
// ------------------------------
- struct ConsumerProxy;
// BufferQueue::ConsumerListener interface, called when a new frame of
// data is available. If we're executing and a codec buffer is
@@ -200,17 +199,17 @@
// into the codec buffer, and call Empty[This]Buffer. If we're not yet
// executing or there's no codec buffer available, we just increment
// mNumFramesAvailable and return.
- void onFrameAvailable(const BufferItem& item) ;
+ void onFrameAvailable(const BufferItem& item) override;
// BufferQueue::ConsumerListener interface, called when the client has
// released one or more GraphicBuffers. We clear out the appropriate
// set of mBufferSlot entries.
- void onBuffersReleased() ;
+ void onBuffersReleased() override;
// BufferQueue::ConsumerListener interface, called when the client has
// changed the sideband stream. GraphicBufferSource doesn't handle sideband
// streams so this is a no-op (and should never be called).
- void onSidebandStreamChanged() ;
+ void onSidebandStreamChanged() override;
private:
// Lock, covers all member variables.
diff --git a/media/libstagefright/omx/Android.bp b/media/libstagefright/omx/Android.bp
index 0c50752..15952e3 100644
--- a/media/libstagefright/omx/Android.bp
+++ b/media/libstagefright/omx/Android.bp
@@ -6,6 +6,7 @@
},
srcs: [
+ "BWGraphicBufferSource.cpp",
"OMXMaster.cpp",
"OMXNodeInstance.cpp",
"OMXUtils.cpp",
@@ -38,6 +39,7 @@
"libutils",
"liblog",
"libui",
+ "libgui",
"libcutils",
"libstagefright_foundation",
"libstagefright_bufferqueue_helper",
@@ -53,6 +55,7 @@
],
export_shared_lib_headers: [
+ "libmedia_omx",
"libstagefright_foundation",
"libstagefright_xmlparser",
"libutils",
diff --git a/media/libstagefright/omx/BWGraphicBufferSource.cpp b/media/libstagefright/omx/BWGraphicBufferSource.cpp
new file mode 100644
index 0000000..fa30a46
--- /dev/null
+++ b/media/libstagefright/omx/BWGraphicBufferSource.cpp
@@ -0,0 +1,180 @@
+/*
+ * Copyright 2017, 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.
+ */
+
+//#define LOG_NDEBUG 0
+#define LOG_TAG "BWGraphicBufferSource"
+
+#include <media/stagefright/omx/BWGraphicBufferSource.h>
+#include <media/stagefright/omx/OMXUtils.h>
+#include <media/openmax/OMX_Component.h>
+#include <media/openmax/OMX_IndexExt.h>
+#include <media/OMXBuffer.h>
+#include <media/IOMX.h>
+
+namespace android {
+
+static const OMX_U32 kPortIndexInput = 0;
+
+struct BWGraphicBufferSource::BWOmxNodeWrapper : public IOmxNodeWrapper {
+ sp<IOMXNode> mOMXNode;
+
+ BWOmxNodeWrapper(const sp<IOMXNode> &omxNode): mOMXNode(omxNode) {
+ }
+
+ virtual status_t emptyBuffer(
+ int32_t bufferId, uint32_t flags,
+ const sp<GraphicBuffer> &buffer,
+ int64_t timestamp, int fenceFd) override {
+ return mOMXNode->emptyBuffer(bufferId, buffer, flags, timestamp, fenceFd);
+ }
+
+ virtual void dispatchDataSpaceChanged(
+ int32_t dataSpace, int32_t aspects, int32_t pixelFormat) override {
+ omx_message msg;
+ msg.type = omx_message::EVENT;
+ msg.fenceFd = -1;
+ msg.u.event_data.event = OMX_EventDataSpaceChanged;
+ msg.u.event_data.data1 = dataSpace;
+ msg.u.event_data.data2 = aspects;
+ msg.u.event_data.data3 = pixelFormat;
+ mOMXNode->dispatchMessage(msg);
+ }
+};
+
+struct BWGraphicBufferSource::BWOMXBufferSource : public BnOMXBufferSource {
+ sp<OmxGraphicBufferSource> mSource;
+
+ BWOMXBufferSource(const sp<OmxGraphicBufferSource> &source): mSource(source) {
+ }
+
+ Status onOmxExecuting() override {
+ return mSource->onOmxExecuting();
+ }
+
+ Status onOmxIdle() override {
+ return mSource->onOmxIdle();
+ }
+
+ Status onOmxLoaded() override {
+ return mSource->onOmxLoaded();
+ }
+
+ Status onInputBufferAdded(int bufferId) override {
+ return mSource->onInputBufferAdded(bufferId);
+ }
+
+ Status onInputBufferEmptied(
+ int bufferId, const OMXFenceParcelable& fenceParcel) override {
+ return mSource->onInputBufferEmptied(bufferId, fenceParcel.get());
+ }
+};
+
+BWGraphicBufferSource::BWGraphicBufferSource(
+ sp<OmxGraphicBufferSource> const& base) :
+ mBase(base),
+ mOMXBufferSource(new BWOMXBufferSource(base)) {
+}
+
+::android::binder::Status BWGraphicBufferSource::configure(
+ const sp<IOMXNode>& omxNode, int32_t dataSpace) {
+ // Do setInputSurface() first, the node will try to enable metadata
+ // mode on input, and does necessary error checking. If this fails,
+ // we can't use this input surface on the node.
+ status_t err = omxNode->setInputSurface(mOMXBufferSource);
+ if (err != NO_ERROR) {
+ ALOGE("Unable to set input surface: %d", err);
+ return Status::fromStatusT(err);
+ }
+
+ // use consumer usage bits queried from encoder, but always add
+ // HW_VIDEO_ENCODER for backward compatibility.
+ uint32_t consumerUsage;
+ if (omxNode->getParameter(
+ (OMX_INDEXTYPE)OMX_IndexParamConsumerUsageBits,
+ &consumerUsage, sizeof(consumerUsage)) != OK) {
+ consumerUsage = 0;
+ }
+
+ OMX_PARAM_PORTDEFINITIONTYPE def;
+ InitOMXParams(&def);
+ def.nPortIndex = kPortIndexInput;
+
+ err = omxNode->getParameter(
+ OMX_IndexParamPortDefinition, &def, sizeof(def));
+ if (err != NO_ERROR) {
+ ALOGE("Failed to get port definition: %d", err);
+ return Status::fromStatusT(UNKNOWN_ERROR);
+ }
+
+ return Status::fromStatusT(mBase->configure(
+ new BWOmxNodeWrapper(omxNode),
+ dataSpace,
+ def.nBufferCountActual,
+ def.format.video.nFrameWidth,
+ def.format.video.nFrameHeight,
+ consumerUsage));
+}
+
+::android::binder::Status BWGraphicBufferSource::setSuspend(
+ bool suspend, int64_t timeUs) {
+ return Status::fromStatusT(mBase->setSuspend(suspend, timeUs));
+}
+
+::android::binder::Status BWGraphicBufferSource::setRepeatPreviousFrameDelayUs(
+ int64_t repeatAfterUs) {
+ return Status::fromStatusT(mBase->setRepeatPreviousFrameDelayUs(repeatAfterUs));
+}
+
+::android::binder::Status BWGraphicBufferSource::setMaxFps(float maxFps) {
+ return Status::fromStatusT(mBase->setMaxFps(maxFps));
+}
+
+::android::binder::Status BWGraphicBufferSource::setTimeLapseConfig(
+ double fps, double captureFps) {
+ return Status::fromStatusT(mBase->setTimeLapseConfig(
+ fps, captureFps));
+}
+
+::android::binder::Status BWGraphicBufferSource::setStartTimeUs(
+ int64_t startTimeUs) {
+ return Status::fromStatusT(mBase->setStartTimeUs(startTimeUs));
+}
+
+::android::binder::Status BWGraphicBufferSource::setStopTimeUs(
+ int64_t stopTimeUs) {
+ return Status::fromStatusT(mBase->setStopTimeUs(stopTimeUs));
+}
+
+::android::binder::Status BWGraphicBufferSource::getStopTimeOffsetUs(
+ int64_t *stopTimeOffsetUs) {
+ return Status::fromStatusT(mBase->getStopTimeOffsetUs(stopTimeOffsetUs));
+}
+
+::android::binder::Status BWGraphicBufferSource::setColorAspects(
+ int32_t aspects) {
+ return Status::fromStatusT(mBase->setColorAspects(aspects));
+}
+
+::android::binder::Status BWGraphicBufferSource::setTimeOffsetUs(
+ int64_t timeOffsetsUs) {
+ return Status::fromStatusT(mBase->setTimeOffsetUs(timeOffsetsUs));
+}
+
+::android::binder::Status BWGraphicBufferSource::signalEndOfInputStream() {
+ return Status::fromStatusT(mBase->signalEndOfInputStream());
+}
+
+} // namespace android
diff --git a/media/libstagefright/omx/include/media/stagefright/omx/BWGraphicBufferSource.h b/media/libstagefright/omx/include/media/stagefright/omx/BWGraphicBufferSource.h
new file mode 100644
index 0000000..0efff22
--- /dev/null
+++ b/media/libstagefright/omx/include/media/stagefright/omx/BWGraphicBufferSource.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2017, 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 BWGRAPHIC_BUFFER_SOURCE_H_
+#define BWGRAPHIC_BUFFER_SOURCE_H_
+
+#include <binder/Binder.h>
+#include <binder/Status.h>
+#include <android/BnGraphicBufferSource.h>
+#include <android/BnOMXBufferSource.h>
+#include <media/IOMX.h>
+
+#include "OmxGraphicBufferSource.h"
+#include "IOmxNodeWrapper.h"
+
+namespace android {
+
+using ::android::binder::Status;
+using ::android::BnGraphicBufferSource;
+using ::android::OmxGraphicBufferSource;
+using ::android::IOMXNode;
+using ::android::sp;
+
+struct BWGraphicBufferSource : public BnGraphicBufferSource {
+ struct BWOMXBufferSource;
+ struct BWOmxNodeWrapper;
+
+ sp<OmxGraphicBufferSource> mBase;
+ sp<IOMXBufferSource> mOMXBufferSource;
+
+ BWGraphicBufferSource(sp<OmxGraphicBufferSource> const &base);
+
+ Status configure(
+ const sp<IOMXNode>& omxNode, int32_t dataSpace) override;
+ Status setSuspend(bool suspend, int64_t timeUs) override;
+ Status setRepeatPreviousFrameDelayUs(
+ int64_t repeatAfterUs) override;
+ Status setMaxFps(float maxFps) override;
+ Status setTimeLapseConfig(
+ double fps, double captureFps) override;
+ Status setStartTimeUs(int64_t startTimeUs) override;
+ Status setStopTimeUs(int64_t stopTimeUs) override;
+ Status getStopTimeOffsetUs(int64_t* stopTimeOffsetUs) override;
+ Status setColorAspects(int32_t aspects) override;
+ Status setTimeOffsetUs(int64_t timeOffsetsUs) override;
+ Status signalEndOfInputStream() override;
+};
+
+} // namespace android
+
+#endif // ANDROID_HARDWARE_MEDIA_OMX_V1_0_WGRAPHICBUFFERSOURCE_H
diff --git a/media/ndk/Android.bp b/media/ndk/Android.bp
index 7d1c88b..a4f5730 100644
--- a/media/ndk/Android.bp
+++ b/media/ndk/Android.bp
@@ -81,6 +81,7 @@
"libmediadrm",
"libstagefright",
"libstagefright_foundation",
+ "libstagefright_bufferqueue_helper",
"liblog",
"libutils",
"libcutils",
diff --git a/media/ndk/NdkImageReader.cpp b/media/ndk/NdkImageReader.cpp
index baa4fc7..22e15d3 100644
--- a/media/ndk/NdkImageReader.cpp
+++ b/media/ndk/NdkImageReader.cpp
@@ -29,7 +29,7 @@
#include <ui/PublicFormat.h>
#include <private/android/AHardwareBufferHelpers.h>
#include <grallocusage/GrallocUsageConversion.h>
-#include <gui/bufferqueue/1.0/WGraphicBufferProducer.h>
+#include <media/stagefright/bqhelper/WGraphicBufferProducer.h>
using namespace android;
diff --git a/services/mediacodec/Android.mk b/services/mediacodec/Android.mk
index 473e21c..9cc19a3 100644
--- a/services/mediacodec/Android.mk
+++ b/services/mediacodec/Android.mk
@@ -32,6 +32,7 @@
endif
LOCAL_SRC_FILES := main_codecservice.cpp
LOCAL_SHARED_LIBRARIES := \
+ libmedia_omx \
libbinder \
libutils \
liblog \
diff --git a/services/mediacodec/main_codecservice.cpp b/services/mediacodec/main_codecservice.cpp
index 6ffbd26..6d47be6 100644
--- a/services/mediacodec/main_codecservice.cpp
+++ b/services/mediacodec/main_codecservice.cpp
@@ -25,6 +25,7 @@
#include <media/stagefright/omx/1.0/Omx.h>
#include <media/stagefright/omx/1.0/OmxStore.h>
+#include <media/CodecServiceRegistrant.h>
#include <dlfcn.h>
using namespace android;