Move hybrid interface from libbinder to libhidl/transport.

Also, merge android.hardware.media.omx@1.0-impl into libstagefright_omx.

Test: With CtsMediaTestCases.apk installed,
adb shell am instrument -e size small -w
'android.media.cts/android.support.test.runner.AndroidJUnitRunner'
Test: Manual use of Camera, Photos, Play Movies and YouTube apps.
Test: Manual use of screen mirroring.

Bug: 33854657
Change-Id: Ie927bcafd86dc7e9509bb8b76bb3b51f9a423cc7
diff --git a/media/libmedia/Android.mk b/media/libmedia/Android.mk
index c057cf5..8a1ce22 100644
--- a/media/libmedia/Android.mk
+++ b/media/libmedia/Android.mk
@@ -57,11 +57,9 @@
     StringArray.cpp \
     omx/1.0/WGraphicBufferSource.cpp \
     omx/1.0/WOmx.cpp \
-    omx/1.0/WOmxBufferProducer.cpp \
     omx/1.0/WOmxBufferSource.cpp \
     omx/1.0/WOmxNode.cpp \
     omx/1.0/WOmxObserver.cpp \
-    omx/1.0/WOmxProducerListener.cpp \
 
 LOCAL_SHARED_LIBRARIES := \
         libui liblog libcutils libutils libbinder libsonivox libicuuc libicui18n libexpat \
@@ -75,7 +73,9 @@
         libhidlmemory \
         android.hidl.base@1.0 \
         android.hidl.memory@1.0 \
+        android.hidl.token@1.0-utils \
         android.hardware.graphics.common@1.0 \
+        android.hardware.graphics.bufferqueue@1.0 \
         android.hardware.media@1.0 \
         android.hardware.media.omx@1.0 \
 
@@ -83,6 +83,7 @@
         libbinder \
         libsonivox \
         libmediadrm \
+        android.hidl.token@1.0-utils \
         android.hardware.media.omx@1.0 \
         android.hidl.memory@1.0 \
 
@@ -104,7 +105,7 @@
 
 LOCAL_EXPORT_C_INCLUDE_DIRS := \
     frameworks/av/include/media \
-    frameworks/av/media/libmedia/aidl
+    frameworks/av/media/libmedia/aidl \
 
 LOCAL_CFLAGS += -Werror -Wno-error=deprecated-declarations -Wall
 LOCAL_SANITIZE := unsigned-integer-overflow signed-integer-overflow cfi
diff --git a/media/libmedia/include/IOMX.h b/media/libmedia/include/IOMX.h
index b4fc04c..62067c7 100644
--- a/media/libmedia/include/IOMX.h
+++ b/media/libmedia/include/IOMX.h
@@ -19,13 +19,13 @@
 #define ANDROID_IOMX_H_
 
 #include <binder/IInterface.h>
-#include <binder/HalToken.h>
 #include <utils/List.h>
 #include <utils/String8.h>
 #include <cutils/native_handle.h>
 
 #include <list>
 
+#include <hidl/HybridInterface.h>
 #include <media/hardware/MetadataBufferType.h>
 #include <android/hardware/media/omx/1.0/IOmxNode.h>
 
diff --git a/media/libmedia/omx/1.0/WOmx.cpp b/media/libmedia/omx/1.0/WOmx.cpp
index 8e4e147..ce624fa 100644
--- a/media/libmedia/omx/1.0/WOmx.cpp
+++ b/media/libmedia/omx/1.0/WOmx.cpp
@@ -14,10 +14,10 @@
  * limitations under the License.
  */
 
+#include <gui/bufferqueue/1.0/H2BGraphicBufferProducer.h>
 #include <media/omx/1.0/WOmx.h>
 #include <media/omx/1.0/WOmxNode.h>
 #include <media/omx/1.0/WOmxObserver.h>
-#include <media/omx/1.0/WOmxBufferProducer.h>
 #include <media/omx/1.0/WGraphicBufferSource.h>
 #include <media/omx/1.0/Conversion.h>
 
@@ -28,6 +28,11 @@
 namespace V1_0 {
 namespace utils {
 
+using ::android::hardware::graphics::bufferqueue::V1_0::utils::
+        H2BGraphicBufferProducer;
+typedef ::android::hardware::graphics::bufferqueue::V1_0::IGraphicBufferProducer
+        HGraphicBufferProducer;
+
 // LWOmx
 LWOmx::LWOmx(sp<IOmx> const& base) : mBase(base) {
 }
@@ -70,10 +75,10 @@
     status_t transStatus = toStatusT(mBase->createInputSurface(
             [&fnStatus, bufferProducer, bufferSource] (
                     Status status,
-                    sp<IOmxBufferProducer> const& tProducer,
+                    sp<HGraphicBufferProducer> const& tProducer,
                     sp<IGraphicBufferSource> const& tSource) {
                 fnStatus = toStatusT(status);
-                *bufferProducer = new LWOmxBufferProducer(tProducer);
+                *bufferProducer = new H2BGraphicBufferProducer(tProducer);
                 *bufferSource = new LWGraphicBufferSource(tSource);
             }));
     return transStatus == NO_ERROR ? fnStatus : transStatus;
diff --git a/media/libmedia/omx/1.0/WOmxBufferProducer.cpp b/media/libmedia/omx/1.0/WOmxBufferProducer.cpp
deleted file mode 100644
index 03499f2..0000000
--- a/media/libmedia/omx/1.0/WOmxBufferProducer.cpp
+++ /dev/null
@@ -1,610 +0,0 @@
-/*
- * Copyright 2016, 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_TAG "WOmxBufferProducer-utils"
-
-#include <utils/Log.h>
-
-#include <media/omx/1.0/WOmxBufferProducer.h>
-#include <media/omx/1.0/WOmxProducerListener.h>
-#include <media/omx/1.0/Conversion.h>
-
-namespace android {
-namespace hardware {
-namespace media {
-namespace omx {
-namespace V1_0 {
-namespace utils {
-
-// TWOmxBufferProducer
-TWOmxBufferProducer::TWOmxBufferProducer(
-        sp<IGraphicBufferProducer> const& base):
-    mBase(base) {
-}
-
-Return<void> TWOmxBufferProducer::requestBuffer(
-        int32_t slot, requestBuffer_cb _hidl_cb) {
-    sp<GraphicBuffer> buf;
-    status_t status = mBase->requestBuffer(slot, &buf);
-    AnwBuffer anwBuffer;
-    wrapAs(&anwBuffer, *buf);
-    _hidl_cb(toStatus(status), anwBuffer);
-    return Void();
-}
-
-Return<Status> TWOmxBufferProducer::setMaxDequeuedBufferCount(
-        int32_t maxDequeuedBuffers) {
-    return toStatus(mBase->setMaxDequeuedBufferCount(
-            static_cast<int>(maxDequeuedBuffers)));
-}
-
-Return<Status> TWOmxBufferProducer::setAsyncMode(bool async) {
-    return toStatus(mBase->setAsyncMode(async));
-}
-
-Return<void> TWOmxBufferProducer::dequeueBuffer(
-        uint32_t width, uint32_t height,
-        PixelFormat format, uint32_t usage,
-        bool getFrameTimestamps, dequeueBuffer_cb _hidl_cb) {
-    int slot;
-    sp<Fence> fence;
-    ::android::FrameEventHistoryDelta outTimestamps;
-    status_t status = mBase->dequeueBuffer(
-            &slot, &fence,
-            width, height,
-            static_cast<::android::PixelFormat>(format), usage,
-            getFrameTimestamps ? &outTimestamps : nullptr);
-    hidl_handle tFence;
-    FrameEventHistoryDelta tOutTimestamps;
-
-    native_handle_t* nh = nullptr;
-    if ((fence == nullptr) || !wrapAs(&tFence, &nh, *fence)) {
-        ALOGE("TWOmxBufferProducer::dequeueBuffer - Invalid output fence");
-        _hidl_cb(toStatus(status),
-                 static_cast<int32_t>(slot),
-                 tFence,
-                 tOutTimestamps);
-        return Void();
-    }
-    std::vector<std::vector<native_handle_t*> > nhAA;
-    if (getFrameTimestamps && !wrapAs(&tOutTimestamps, &nhAA, outTimestamps)) {
-        ALOGE("TWOmxBufferProducer::dequeueBuffer - Invalid output timestamps");
-        _hidl_cb(toStatus(status),
-                 static_cast<int32_t>(slot),
-                 tFence,
-                 tOutTimestamps);
-        native_handle_delete(nh);
-        return Void();
-    }
-
-    _hidl_cb(toStatus(status),
-            static_cast<int32_t>(slot),
-            tFence,
-            tOutTimestamps);
-    native_handle_delete(nh);
-    if (getFrameTimestamps) {
-        for (auto& nhA : nhAA) {
-            for (auto& handle : nhA) {
-                native_handle_delete(handle);
-            }
-        }
-    }
-    return Void();
-}
-
-Return<Status> TWOmxBufferProducer::detachBuffer(int32_t slot) {
-    return toStatus(mBase->detachBuffer(slot));
-}
-
-Return<void> TWOmxBufferProducer::detachNextBuffer(
-        detachNextBuffer_cb _hidl_cb) {
-    sp<GraphicBuffer> outBuffer;
-    sp<Fence> outFence;
-    status_t status = mBase->detachNextBuffer(&outBuffer, &outFence);
-    AnwBuffer tBuffer;
-    hidl_handle tFence;
-
-    if (outBuffer == nullptr) {
-        ALOGE("TWOmxBufferProducer::detachNextBuffer - Invalid output buffer");
-        _hidl_cb(toStatus(status), tBuffer, tFence);
-        return Void();
-    }
-    wrapAs(&tBuffer, *outBuffer);
-    native_handle_t* nh = nullptr;
-    if ((outFence != nullptr) && !wrapAs(&tFence, &nh, *outFence)) {
-        ALOGE("TWOmxBufferProducer::detachNextBuffer - Invalid output fence");
-        _hidl_cb(toStatus(status), tBuffer, tFence);
-        return Void();
-    }
-
-    _hidl_cb(toStatus(status), tBuffer, tFence);
-    native_handle_delete(nh);
-    return Void();
-}
-
-Return<void> TWOmxBufferProducer::attachBuffer(
-        const AnwBuffer& buffer,
-        attachBuffer_cb _hidl_cb) {
-    int outSlot;
-    sp<GraphicBuffer> lBuffer = new GraphicBuffer();
-    if (!convertTo(lBuffer.get(), buffer)) {
-        ALOGE("TWOmxBufferProducer::attachBuffer - "
-                "Invalid input native window buffer");
-        _hidl_cb(toStatus(BAD_VALUE), -1);
-        return Void();
-    }
-    status_t status = mBase->attachBuffer(&outSlot, lBuffer);
-
-    _hidl_cb(toStatus(status), static_cast<int32_t>(outSlot));
-    return Void();
-}
-
-Return<void> TWOmxBufferProducer::queueBuffer(
-        int32_t slot, const QueueBufferInput& input,
-        queueBuffer_cb _hidl_cb) {
-    QueueBufferOutput tOutput;
-    IGraphicBufferProducer::QueueBufferInput lInput(
-            0, false, HAL_DATASPACE_UNKNOWN,
-            ::android::Rect(0, 0, 1, 1),
-            NATIVE_WINDOW_SCALING_MODE_FREEZE,
-            0, ::android::Fence::NO_FENCE);
-    if (!convertTo(&lInput, input)) {
-        ALOGE("TWOmxBufferProducer::queueBuffer - Invalid input");
-        _hidl_cb(toStatus(BAD_VALUE), tOutput);
-        return Void();
-    }
-    IGraphicBufferProducer::QueueBufferOutput lOutput;
-    status_t status = mBase->queueBuffer(
-            static_cast<int>(slot), lInput, &lOutput);
-
-    std::vector<std::vector<native_handle_t*> > nhAA;
-    if (!wrapAs(&tOutput, &nhAA, lOutput)) {
-        ALOGE("TWOmxBufferProducer::queueBuffer - Invalid output");
-        _hidl_cb(toStatus(BAD_VALUE), tOutput);
-        return Void();
-    }
-
-    _hidl_cb(toStatus(status), tOutput);
-    for (auto& nhA : nhAA) {
-        for (auto& nh : nhA) {
-            native_handle_delete(nh);
-        }
-    }
-    return Void();
-}
-
-Return<Status> TWOmxBufferProducer::cancelBuffer(
-        int32_t slot, const hidl_handle& fence) {
-    sp<Fence> lFence = new Fence();
-    if (!convertTo(lFence.get(), fence)) {
-        ALOGE("TWOmxBufferProducer::cancelBuffer - Invalid input fence");
-        return toStatus(BAD_VALUE);
-    }
-    return toStatus(mBase->cancelBuffer(static_cast<int>(slot), lFence));
-}
-
-Return<void> TWOmxBufferProducer::query(int32_t what, query_cb _hidl_cb) {
-    int lValue;
-    int lReturn = mBase->query(static_cast<int>(what), &lValue);
-    _hidl_cb(static_cast<int32_t>(lReturn), static_cast<int32_t>(lValue));
-    return Void();
-}
-
-Return<void> TWOmxBufferProducer::connect(
-        const sp<IOmxProducerListener>& listener,
-        int32_t api, bool producerControlledByApp, connect_cb _hidl_cb) {
-    sp<IProducerListener> lListener = listener == nullptr ?
-            nullptr : new LWOmxProducerListener(listener);
-    IGraphicBufferProducer::QueueBufferOutput lOutput;
-    status_t status = mBase->connect(lListener,
-            static_cast<int>(api),
-            producerControlledByApp,
-            &lOutput);
-
-    QueueBufferOutput tOutput;
-    std::vector<std::vector<native_handle_t*> > nhAA;
-    if (!wrapAs(&tOutput, &nhAA, lOutput)) {
-        ALOGE("TWOmxBufferProducer::connect - Invalid output");
-        _hidl_cb(toStatus(status), tOutput);
-        return Void();
-    }
-
-    _hidl_cb(toStatus(status), tOutput);
-    for (auto& nhA : nhAA) {
-        for (auto& nh : nhA) {
-            native_handle_delete(nh);
-        }
-    }
-    return Void();
-}
-
-Return<Status> TWOmxBufferProducer::disconnect(
-        int32_t api, DisconnectMode mode) {
-    return toStatus(mBase->disconnect(
-            static_cast<int>(api),
-            toGuiDisconnectMode(mode)));
-}
-
-Return<Status> TWOmxBufferProducer::setSidebandStream(const hidl_handle& stream) {
-    return toStatus(mBase->setSidebandStream(NativeHandle::create(
-            native_handle_clone(stream), true)));
-}
-
-Return<void> TWOmxBufferProducer::allocateBuffers(
-        uint32_t width, uint32_t height, PixelFormat format, uint32_t usage) {
-    mBase->allocateBuffers(
-            width, height,
-            static_cast<::android::PixelFormat>(format),
-            usage);
-    return Void();
-}
-
-Return<Status> TWOmxBufferProducer::allowAllocation(bool allow) {
-    return toStatus(mBase->allowAllocation(allow));
-}
-
-Return<Status> TWOmxBufferProducer::setGenerationNumber(uint32_t generationNumber) {
-    return toStatus(mBase->setGenerationNumber(generationNumber));
-}
-
-Return<void> TWOmxBufferProducer::getConsumerName(getConsumerName_cb _hidl_cb) {
-    _hidl_cb(mBase->getConsumerName().string());
-    return Void();
-}
-
-Return<Status> TWOmxBufferProducer::setSharedBufferMode(bool sharedBufferMode) {
-    return toStatus(mBase->setSharedBufferMode(sharedBufferMode));
-}
-
-Return<Status> TWOmxBufferProducer::setAutoRefresh(bool autoRefresh) {
-    return toStatus(mBase->setAutoRefresh(autoRefresh));
-}
-
-Return<Status> TWOmxBufferProducer::setDequeueTimeout(int64_t timeoutNs) {
-    return toStatus(mBase->setDequeueTimeout(timeoutNs));
-}
-
-Return<void> TWOmxBufferProducer::getLastQueuedBuffer(
-        getLastQueuedBuffer_cb _hidl_cb) {
-    sp<GraphicBuffer> lOutBuffer = new GraphicBuffer();
-    sp<Fence> lOutFence = new Fence();
-    float lOutTransformMatrix[16];
-    status_t status = mBase->getLastQueuedBuffer(
-            &lOutBuffer, &lOutFence, lOutTransformMatrix);
-
-    AnwBuffer tOutBuffer;
-    if (lOutBuffer != nullptr) {
-        wrapAs(&tOutBuffer, *lOutBuffer);
-    }
-    hidl_handle tOutFence;
-    native_handle_t* nh = nullptr;
-    if ((lOutFence == nullptr) || !wrapAs(&tOutFence, &nh, *lOutFence)) {
-        ALOGE("TWOmxBufferProducer::getLastQueuedBuffer - "
-                "Invalid output fence");
-        _hidl_cb(toStatus(status),
-                tOutBuffer,
-                tOutFence,
-                hidl_array<float, 16>());
-        return Void();
-    }
-    hidl_array<float, 16> tOutTransformMatrix(lOutTransformMatrix);
-
-    _hidl_cb(toStatus(status), tOutBuffer, tOutFence, tOutTransformMatrix);
-    native_handle_delete(nh);
-    return Void();
-}
-
-Return<void> TWOmxBufferProducer::getFrameTimestamps(
-        getFrameTimestamps_cb _hidl_cb) {
-    ::android::FrameEventHistoryDelta lDelta;
-    mBase->getFrameTimestamps(&lDelta);
-
-    FrameEventHistoryDelta tDelta;
-    std::vector<std::vector<native_handle_t*> > nhAA;
-    if (!wrapAs(&tDelta, &nhAA, lDelta)) {
-        ALOGE("TWOmxBufferProducer::getFrameTimestamps - "
-                "Invalid output frame timestamps");
-        _hidl_cb(tDelta);
-        return Void();
-    }
-
-    _hidl_cb(tDelta);
-    for (auto& nhA : nhAA) {
-        for (auto& nh : nhA) {
-            native_handle_delete(nh);
-        }
-    }
-    return Void();
-}
-
-Return<void> TWOmxBufferProducer::getUniqueId(getUniqueId_cb _hidl_cb) {
-    uint64_t outId;
-    status_t status = mBase->getUniqueId(&outId);
-    _hidl_cb(toStatus(status), outId);
-    return Void();
-}
-
-// LWOmxBufferProducer
-
-LWOmxBufferProducer::LWOmxBufferProducer(sp<IOmxBufferProducer> const& base) :
-    mBase(base) {
-}
-
-status_t LWOmxBufferProducer::requestBuffer(int slot, sp<GraphicBuffer>* buf) {
-    *buf = new GraphicBuffer();
-    status_t fnStatus;
-    status_t transStatus = toStatusT(mBase->requestBuffer(
-            static_cast<int32_t>(slot),
-            [&fnStatus, &buf] (Status status, AnwBuffer const& buffer) {
-                fnStatus = toStatusT(status);
-                if (!convertTo(buf->get(), buffer)) {
-                    fnStatus = fnStatus == NO_ERROR ? BAD_VALUE : fnStatus;
-                }
-            }));
-    return transStatus == NO_ERROR ? fnStatus : transStatus;
-}
-
-status_t LWOmxBufferProducer::setMaxDequeuedBufferCount(
-        int maxDequeuedBuffers) {
-    return toStatusT(mBase->setMaxDequeuedBufferCount(
-            static_cast<int32_t>(maxDequeuedBuffers)));
-}
-
-status_t LWOmxBufferProducer::setAsyncMode(bool async) {
-    return toStatusT(mBase->setAsyncMode(async));
-}
-
-status_t LWOmxBufferProducer::dequeueBuffer(
-        int* slot, sp<Fence>* fence,
-        uint32_t w, uint32_t h, ::android::PixelFormat format,
-        uint32_t usage, FrameEventHistoryDelta* outTimestamps) {
-    *fence = new Fence();
-    status_t fnStatus;
-    status_t transStatus = toStatusT(mBase->dequeueBuffer(
-            w, h, static_cast<PixelFormat>(format), usage,
-            outTimestamps != nullptr,
-            [&fnStatus, slot, fence, outTimestamps] (
-                    Status status,
-                    int32_t tSlot,
-                    hidl_handle const& tFence,
-                    IOmxBufferProducer::FrameEventHistoryDelta const& tTs) {
-                fnStatus = toStatusT(status);
-                *slot = tSlot;
-                if (!convertTo(fence->get(), tFence)) {
-                    ALOGE("LWOmxBufferProducer::dequeueBuffer - "
-                            "Invalid output fence");
-                    fnStatus = fnStatus == NO_ERROR ? BAD_VALUE : fnStatus;
-                }
-                if (outTimestamps && !convertTo(outTimestamps, tTs)) {
-                    ALOGE("LWOmxBufferProducer::dequeueBuffer - "
-                            "Invalid output timestamps");
-                    fnStatus = fnStatus == NO_ERROR ? BAD_VALUE : fnStatus;
-                }
-            }));
-    return transStatus == NO_ERROR ? fnStatus : transStatus;
-}
-
-status_t LWOmxBufferProducer::detachBuffer(int slot) {
-    return toStatusT(mBase->detachBuffer(static_cast<int>(slot)));
-}
-
-status_t LWOmxBufferProducer::detachNextBuffer(
-        sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) {
-    *outBuffer = new GraphicBuffer();
-    *outFence = new Fence();
-    status_t fnStatus;
-    status_t transStatus = toStatusT(mBase->detachNextBuffer(
-            [&fnStatus, outBuffer, outFence] (
-                    Status status,
-                    AnwBuffer const& tBuffer,
-                    hidl_handle const& tFence) {
-                fnStatus = toStatusT(status);
-                if (!convertTo(outFence->get(), tFence)) {
-                    ALOGE("LWOmxBufferProducer::detachNextBuffer - "
-                            "Invalid output fence");
-                    fnStatus = fnStatus == NO_ERROR ? BAD_VALUE : fnStatus;
-                }
-                if (!convertTo(outBuffer->get(), tBuffer)) {
-                    ALOGE("LWOmxBufferProducer::detachNextBuffer - "
-                            "Invalid output buffer");
-                    fnStatus = fnStatus == NO_ERROR ? BAD_VALUE : fnStatus;
-                }
-            }));
-    return transStatus == NO_ERROR ? fnStatus : transStatus;
-}
-
-status_t LWOmxBufferProducer::attachBuffer(
-        int* outSlot, const sp<GraphicBuffer>& buffer) {
-    AnwBuffer tBuffer;
-    wrapAs(&tBuffer, *buffer);
-    status_t fnStatus;
-    status_t transStatus = toStatusT(mBase->attachBuffer(tBuffer,
-            [&fnStatus, outSlot] (Status status, int32_t slot) {
-                fnStatus = toStatusT(status);
-                *outSlot = slot;
-            }));
-    return transStatus == NO_ERROR ? fnStatus : transStatus;
-}
-
-status_t LWOmxBufferProducer::queueBuffer(
-        int slot,
-        const QueueBufferInput& input,
-        QueueBufferOutput* output) {
-    IOmxBufferProducer::QueueBufferInput tInput;
-    native_handle_t* nh;
-    if (!wrapAs(&tInput, &nh, input)) {
-        ALOGE("LWOmxBufferProducer::queueBuffer - Invalid input");
-        return BAD_VALUE;
-    }
-    status_t fnStatus;
-    status_t transStatus = toStatusT(mBase->queueBuffer(slot, tInput,
-            [&fnStatus, output] (
-                    Status status,
-                    IOmxBufferProducer::QueueBufferOutput const& tOutput) {
-                fnStatus = toStatusT(status);
-                if (!convertTo(output, tOutput)) {
-                    ALOGE("LWOmxBufferProducer::queueBuffer - "
-                            "Invalid output");
-                    fnStatus = fnStatus == NO_ERROR ? BAD_VALUE : fnStatus;
-                }
-            }));
-    native_handle_delete(nh);
-    return transStatus == NO_ERROR ? fnStatus : transStatus;
-}
-
-status_t LWOmxBufferProducer::cancelBuffer(int slot, const sp<Fence>& fence) {
-    hidl_handle tFence;
-    native_handle_t* nh = nullptr;
-    if ((fence == nullptr) || !wrapAs(&tFence, &nh, *fence)) {
-        ALOGE("LWOmxBufferProducer::cancelBuffer - Invalid input fence");
-        return BAD_VALUE;
-    }
-
-    status_t status = toStatusT(mBase->cancelBuffer(
-            static_cast<int32_t>(slot), tFence));
-    native_handle_delete(nh);
-    return status;
-}
-
-int LWOmxBufferProducer::query(int what, int* value) {
-    int result;
-    status_t transStatus = toStatusT(mBase->query(
-            static_cast<int32_t>(what),
-            [&result, value] (int32_t tResult, int32_t tValue) {
-                result = static_cast<int>(tResult);
-                *value = static_cast<int>(tValue);
-            }));
-    return transStatus == NO_ERROR ? result : static_cast<int>(transStatus);
-}
-
-status_t LWOmxBufferProducer::connect(
-        const sp<IProducerListener>& listener, int api,
-        bool producerControlledByApp, QueueBufferOutput* output) {
-    sp<IOmxProducerListener> tListener = listener == nullptr ?
-            nullptr : new TWOmxProducerListener(listener);
-    status_t fnStatus;
-    status_t transStatus = toStatusT(mBase->connect(
-            tListener, static_cast<int32_t>(api), producerControlledByApp,
-            [&fnStatus, output] (
-                    Status status,
-                    IOmxBufferProducer::QueueBufferOutput const& tOutput) {
-                fnStatus = toStatusT(status);
-                if (!convertTo(output, tOutput)) {
-                    ALOGE("LWOmxBufferProducer::connect - Invalid output");
-                    fnStatus = fnStatus == NO_ERROR ? BAD_VALUE : fnStatus;
-                }
-            }));
-    return transStatus == NO_ERROR ? fnStatus : transStatus;
-}
-
-status_t LWOmxBufferProducer::disconnect(int api, DisconnectMode mode) {
-    return toStatusT(mBase->disconnect(
-            static_cast<int32_t>(api), toOmxDisconnectMode(mode)));
-}
-
-status_t LWOmxBufferProducer::setSidebandStream(
-        const sp<NativeHandle>& stream) {
-    return toStatusT(mBase->setSidebandStream(stream->handle()));
-}
-
-void LWOmxBufferProducer::allocateBuffers(uint32_t width, uint32_t height,
-        ::android::PixelFormat format, uint32_t usage) {
-    mBase->allocateBuffers(
-            width, height, static_cast<PixelFormat>(format), usage);
-}
-
-status_t LWOmxBufferProducer::allowAllocation(bool allow) {
-    return toStatusT(mBase->allowAllocation(allow));
-}
-
-status_t LWOmxBufferProducer::setGenerationNumber(uint32_t generationNumber) {
-    return toStatusT(mBase->setGenerationNumber(generationNumber));
-}
-
-String8 LWOmxBufferProducer::getConsumerName() const {
-    String8 lName;
-    mBase->getConsumerName([&lName] (hidl_string const& name) {
-                lName = name.c_str();
-            });
-    return lName;
-}
-
-status_t LWOmxBufferProducer::setSharedBufferMode(bool sharedBufferMode) {
-    return toStatusT(mBase->setSharedBufferMode(sharedBufferMode));
-}
-
-status_t LWOmxBufferProducer::setAutoRefresh(bool autoRefresh) {
-    return toStatusT(mBase->setAutoRefresh(autoRefresh));
-}
-
-status_t LWOmxBufferProducer::setDequeueTimeout(nsecs_t timeout) {
-    return toStatusT(mBase->setDequeueTimeout(static_cast<int64_t>(timeout)));
-}
-
-status_t LWOmxBufferProducer::getLastQueuedBuffer(
-        sp<GraphicBuffer>* outBuffer,
-        sp<Fence>* outFence,
-        float outTransformMatrix[16]) {
-    status_t fnStatus;
-    status_t transStatus = toStatusT(mBase->getLastQueuedBuffer(
-            [&fnStatus, outBuffer, outFence, &outTransformMatrix] (
-                    Status status,
-                    AnwBuffer const& buffer,
-                    hidl_handle const& fence,
-                    hidl_array<float, 16> const& transformMatrix) {
-                fnStatus = toStatusT(status);
-                *outBuffer = new GraphicBuffer();
-                if (!convertTo(outBuffer->get(), buffer)) {
-                    ALOGE("LWOmxBufferProducer::getLastQueuedBuffer - "
-                            "Invalid output buffer");
-                    fnStatus = fnStatus == NO_ERROR ? BAD_VALUE : fnStatus;
-                }
-                *outFence = new Fence();
-                if (!convertTo(outFence->get(), fence)) {
-                    ALOGE("LWOmxBufferProducer::getLastQueuedBuffer - "
-                            "Invalid output fence");
-                    fnStatus = fnStatus == NO_ERROR ? BAD_VALUE : fnStatus;
-                }
-                std::copy(transformMatrix.data(),
-                        transformMatrix.data() + 16,
-                        outTransformMatrix);
-            }));
-    return transStatus == NO_ERROR ? fnStatus : transStatus;
-}
-
-void LWOmxBufferProducer::getFrameTimestamps(FrameEventHistoryDelta* outDelta) {
-    mBase->getFrameTimestamps([outDelta] (
-            IOmxBufferProducer::FrameEventHistoryDelta const& tDelta) {
-                convertTo(outDelta, tDelta);
-            });
-}
-
-status_t LWOmxBufferProducer::getUniqueId(uint64_t* outId) const {
-    status_t fnStatus;
-    status_t transStatus = toStatusT(mBase->getUniqueId(
-            [&fnStatus, outId] (Status status, uint64_t id) {
-                fnStatus = toStatusT(status);
-                *outId = id;
-            }));
-    return transStatus == NO_ERROR ? fnStatus : transStatus;
-}
-
-}  // namespace utils
-}  // namespace V1_0
-}  // namespace omx
-}  // namespace media
-}  // namespace hardware
-}  // namespace android
diff --git a/media/libmedia/omx/1.0/WOmxProducerListener.cpp b/media/libmedia/omx/1.0/WOmxProducerListener.cpp
deleted file mode 100644
index 3ee381f..0000000
--- a/media/libmedia/omx/1.0/WOmxProducerListener.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright 2016, 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.
- */
-
-#include <media/omx/1.0/WOmxProducerListener.h>
-
-namespace android {
-namespace hardware {
-namespace media {
-namespace omx {
-namespace V1_0 {
-namespace utils {
-
-// TWOmxProducerListener
-TWOmxProducerListener::TWOmxProducerListener(
-        sp<IProducerListener> const& base):
-    mBase(base) {
-}
-
-Return<void> TWOmxProducerListener::onBufferReleased() {
-    mBase->onBufferReleased();
-    return Void();
-}
-
-Return<bool> TWOmxProducerListener::needsReleaseNotify() {
-    return mBase->needsReleaseNotify();
-}
-
-// LWOmxProducerListener
-LWOmxProducerListener::LWOmxProducerListener(
-        sp<IOmxProducerListener> const& base):
-    mBase(base) {
-}
-
-void LWOmxProducerListener::onBufferReleased() {
-    mBase->onBufferReleased();
-}
-
-bool LWOmxProducerListener::needsReleaseNotify() {
-    return static_cast<bool>(mBase->needsReleaseNotify());
-}
-
-}  // namespace utils
-}  // namespace V1_0
-}  // namespace omx
-}  // namespace media
-}  // namespace hardware
-}  // namespace android
diff --git a/media/libmediaplayerservice/nuplayer/Android.mk b/media/libmediaplayerservice/nuplayer/Android.mk
index 56c558d..08c3cf8 100644
--- a/media/libmediaplayerservice/nuplayer/Android.mk
+++ b/media/libmediaplayerservice/nuplayer/Android.mk
@@ -36,6 +36,7 @@
 LOCAL_SHARED_LIBRARIES :=       \
     libbinder                   \
     libui                       \
+    libgui                      \
     libmedia                    \
     libmediadrm                 \
 
diff --git a/media/libstagefright/omx/hal/1.0/impl/Conversion.h b/media/libstagefright/omx/1.0/Conversion.h
similarity index 90%
rename from media/libstagefright/omx/hal/1.0/impl/Conversion.h
rename to media/libstagefright/omx/1.0/Conversion.h
index a6fed2e..fd91574 100644
--- a/media/libstagefright/omx/hal/1.0/impl/Conversion.h
+++ b/media/libstagefright/omx/1.0/Conversion.h
@@ -37,14 +37,13 @@
 #include <VideoAPI.h>
 
 #include <android/hidl/memory/1.0/IMemory.h>
+#include <android/hardware/graphics/bufferqueue/1.0/IProducerListener.h>
 #include <android/hardware/media/omx/1.0/types.h>
 #include <android/hardware/media/omx/1.0/IOmx.h>
 #include <android/hardware/media/omx/1.0/IOmxNode.h>
-#include <android/hardware/media/omx/1.0/IOmxBufferProducer.h>
 #include <android/hardware/media/omx/1.0/IOmxBufferSource.h>
-#include <android/hardware/media/omx/1.0/IOmxObserver.h>
-#include <android/hardware/media/omx/1.0/IOmxProducerListener.h>
 #include <android/hardware/media/omx/1.0/IGraphicBufferSource.h>
+#include <android/hardware/media/omx/1.0/IOmxObserver.h>
 
 #include <android/IGraphicBufferSource.h>
 #include <android/IOMXBufferSource.h>
@@ -95,8 +94,10 @@
 using ::android::hardware::media::omx::V1_0::IOmxBufferSource;
 using ::android::IOMXBufferSource;
 
-using ::android::hardware::media::omx::V1_0::IOmxBufferProducer;
-using ::android::IGraphicBufferProducer;
+typedef ::android::hardware::graphics::bufferqueue::V1_0::IGraphicBufferProducer
+        HGraphicBufferProducer;
+typedef ::android::IGraphicBufferProducer
+        BGraphicBufferProducer;
 
 // native_handle_t helper functions.
 
@@ -1191,14 +1192,14 @@
  * \return The required size of the flat buffer.
  */
 inline size_t getFlattenedSize(
-        IOmxBufferProducer::FenceTimeSnapshot const& t) {
+        HGraphicBufferProducer::FenceTimeSnapshot const& t) {
     constexpr size_t min = sizeof(t.state);
     switch (t.state) {
-        case IOmxBufferProducer::FenceTimeSnapshot::State::EMPTY:
+        case HGraphicBufferProducer::FenceTimeSnapshot::State::EMPTY:
             return min;
-        case IOmxBufferProducer::FenceTimeSnapshot::State::FENCE:
+        case HGraphicBufferProducer::FenceTimeSnapshot::State::FENCE:
             return min + getFenceFlattenedSize(t.fence);
-        case IOmxBufferProducer::FenceTimeSnapshot::State::SIGNAL_TIME:
+        case HGraphicBufferProducer::FenceTimeSnapshot::State::SIGNAL_TIME:
             return min + sizeof(
                     ::android::FenceTime::Snapshot::signalTime);
     }
@@ -1213,9 +1214,9 @@
  * \return The number of file descriptors contained in \p snapshot.
  */
 inline size_t getFdCount(
-        IOmxBufferProducer::FenceTimeSnapshot const& t) {
+        HGraphicBufferProducer::FenceTimeSnapshot const& t) {
     return t.state ==
-            IOmxBufferProducer::FenceTimeSnapshot::State::FENCE ?
+            HGraphicBufferProducer::FenceTimeSnapshot::State::FENCE ?
             getFenceFdCount(t.fence) : 0;
 }
 
@@ -1232,22 +1233,22 @@
  * This function will duplicate the file descriptor in `t.fence` if `t.state ==
  * FENCE`.
  */
-inline status_t flatten(IOmxBufferProducer::FenceTimeSnapshot const& t,
+inline status_t flatten(HGraphicBufferProducer::FenceTimeSnapshot const& t,
         void*& buffer, size_t& size, int*& fds, size_t& numFds) {
     if (size < getFlattenedSize(t)) {
         return NO_MEMORY;
     }
 
     switch (t.state) {
-        case IOmxBufferProducer::FenceTimeSnapshot::State::EMPTY:
+        case HGraphicBufferProducer::FenceTimeSnapshot::State::EMPTY:
             FlattenableUtils::write(buffer, size,
                     ::android::FenceTime::Snapshot::State::EMPTY);
             return NO_ERROR;
-        case IOmxBufferProducer::FenceTimeSnapshot::State::FENCE:
+        case HGraphicBufferProducer::FenceTimeSnapshot::State::FENCE:
             FlattenableUtils::write(buffer, size,
                     ::android::FenceTime::Snapshot::State::FENCE);
             return flattenFence(t.fence, buffer, size, fds, numFds);
-        case IOmxBufferProducer::FenceTimeSnapshot::State::SIGNAL_TIME:
+        case HGraphicBufferProducer::FenceTimeSnapshot::State::SIGNAL_TIME:
             FlattenableUtils::write(buffer, size,
                     ::android::FenceTime::Snapshot::State::SIGNAL_TIME);
             FlattenableUtils::write(buffer, size, t.signalTimeNs);
@@ -1272,7 +1273,7 @@
  * case, \p nh needs to be deleted with `native_handle_delete()` afterwards.
  */
 inline status_t unflatten(
-        IOmxBufferProducer::FenceTimeSnapshot* t, native_handle_t** nh,
+        HGraphicBufferProducer::FenceTimeSnapshot* t, native_handle_t** nh,
         void const*& buffer, size_t& size, int const*& fds, size_t& numFds) {
     if (size < sizeof(t->state)) {
         return NO_MEMORY;
@@ -1283,13 +1284,13 @@
     FlattenableUtils::read(buffer, size, state);
     switch (state) {
         case ::android::FenceTime::Snapshot::State::EMPTY:
-            t->state = IOmxBufferProducer::FenceTimeSnapshot::State::EMPTY;
+            t->state = HGraphicBufferProducer::FenceTimeSnapshot::State::EMPTY;
             return NO_ERROR;
         case ::android::FenceTime::Snapshot::State::FENCE:
-            t->state = IOmxBufferProducer::FenceTimeSnapshot::State::FENCE;
+            t->state = HGraphicBufferProducer::FenceTimeSnapshot::State::FENCE;
             return unflattenFence(&t->fence, nh, buffer, size, fds, numFds);
         case ::android::FenceTime::Snapshot::State::SIGNAL_TIME:
-            t->state = IOmxBufferProducer::FenceTimeSnapshot::State::SIGNAL_TIME;
+            t->state = HGraphicBufferProducer::FenceTimeSnapshot::State::SIGNAL_TIME;
             if (size < sizeof(t->signalTimeNs)) {
                 return NO_MEMORY;
             }
@@ -1309,7 +1310,7 @@
  * \return A lower bound on the size of the flat buffer.
  */
 constexpr size_t minFlattenedSize(
-        IOmxBufferProducer::FrameEventsDelta const& /* t */) {
+        HGraphicBufferProducer::FrameEventsDelta const& /* t */) {
     return sizeof(uint64_t) + // mFrameNumber
             sizeof(uint8_t) + // mIndex
             sizeof(uint8_t) + // mAddPostCompositeCalled
@@ -1330,7 +1331,7 @@
  * \return The required size of the flat buffer.
  */
 inline size_t getFlattenedSize(
-        IOmxBufferProducer::FrameEventsDelta const& t) {
+        HGraphicBufferProducer::FrameEventsDelta const& t) {
     return minFlattenedSize(t) +
             getFlattenedSize(t.gpuCompositionDoneFence) +
             getFlattenedSize(t.displayPresentFence) +
@@ -1346,7 +1347,7 @@
  * \return The number of file descriptors contained in \p t.
  */
 inline size_t getFdCount(
-        IOmxBufferProducer::FrameEventsDelta const& t) {
+        HGraphicBufferProducer::FrameEventsDelta const& t) {
     return getFdCount(t.gpuCompositionDoneFence) +
             getFdCount(t.displayPresentFence) +
             getFdCount(t.displayRetireFence) +
@@ -1368,7 +1369,7 @@
  * populated with `nullptr` or newly created handles. Each non-null slot in \p
  * nh will need to be deleted manually with `native_handle_delete()`.
  */
-inline status_t unflatten(IOmxBufferProducer::FrameEventsDelta* t,
+inline status_t unflatten(HGraphicBufferProducer::FrameEventsDelta* t,
         std::vector<native_handle_t*>* nh,
         void const*& buffer, size_t& size, int const*& fds, size_t& numFds) {
     if (size < minFlattenedSize(*t)) {
@@ -1400,7 +1401,7 @@
     FlattenableUtils::read(buffer, size, t->dequeueReadyTime);
 
     // Fences
-    IOmxBufferProducer::FenceTimeSnapshot* tSnapshot[4];
+    HGraphicBufferProducer::FenceTimeSnapshot* tSnapshot[4];
     tSnapshot[0] = &t->gpuCompositionDoneFence;
     tSnapshot[1] = &t->displayPresentFence;
     tSnapshot[2] = &t->displayRetireFence;
@@ -1437,7 +1438,7 @@
  */
 // Ref: frameworks/native/libs/gui/FrameTimestamp.cpp:
 //      FrameEventsDelta::flatten
-inline status_t flatten(IOmxBufferProducer::FrameEventsDelta const& t,
+inline status_t flatten(HGraphicBufferProducer::FrameEventsDelta const& t,
         void*& buffer, size_t& size, int*& fds, size_t numFds) {
     // Check that t.index is within a valid range.
     if (t.index >= static_cast<uint32_t>(FrameEventHistory::MAX_FRAME_HISTORY)
@@ -1464,7 +1465,7 @@
     FlattenableUtils::write(buffer, size, t.dequeueReadyTime);
 
     // Fences
-    IOmxBufferProducer::FenceTimeSnapshot const* tSnapshot[4];
+    HGraphicBufferProducer::FenceTimeSnapshot const* tSnapshot[4];
     tSnapshot[0] = &t.gpuCompositionDoneFence;
     tSnapshot[1] = &t.displayPresentFence;
     tSnapshot[2] = &t.displayRetireFence;
@@ -1483,13 +1484,13 @@
 
 /**
  * \brief Return the size of the non-fd buffer required to flatten
- * `IOmxBufferProducer::FrameEventHistoryDelta`.
+ * `HGraphicBufferProducer::FrameEventHistoryDelta`.
  *
- * \param[in] t The input `IOmxBufferProducer::FrameEventHistoryDelta`.
+ * \param[in] t The input `HGraphicBufferProducer::FrameEventHistoryDelta`.
  * \return The required size of the flat buffer.
  */
 inline size_t getFlattenedSize(
-        IOmxBufferProducer::FrameEventHistoryDelta const& t) {
+        HGraphicBufferProducer::FrameEventHistoryDelta const& t) {
     size_t size = 4 + // mDeltas.size()
             sizeof(t.compositorTiming);
     for (size_t i = 0; i < t.deltas.size(); ++i) {
@@ -1500,13 +1501,13 @@
 
 /**
  * \brief Return the number of file descriptors contained in
- * `IOmxBufferProducer::FrameEventHistoryDelta`.
+ * `HGraphicBufferProducer::FrameEventHistoryDelta`.
  *
- * \param[in] t The input `IOmxBufferProducer::FrameEventHistoryDelta`.
+ * \param[in] t The input `HGraphicBufferProducer::FrameEventHistoryDelta`.
  * \return The number of file descriptors contained in \p t.
  */
 inline size_t getFdCount(
-        IOmxBufferProducer::FrameEventHistoryDelta const& t) {
+        HGraphicBufferProducer::FrameEventHistoryDelta const& t) {
     size_t numFds = 0;
     for (size_t i = 0; i < t.deltas.size(); ++i) {
         numFds += getFdCount(t.deltas[i]);
@@ -1530,7 +1531,7 @@
  * slot in \p nh will need to be deleted manually with `native_handle_delete()`.
  */
 inline status_t unflatten(
-        IOmxBufferProducer::FrameEventHistoryDelta* t,
+        HGraphicBufferProducer::FrameEventHistoryDelta* t,
         std::vector<std::vector<native_handle_t*> >* nh,
         void const*& buffer, size_t& size, int const*& fds, size_t& numFds) {
     if (size < 4) {
@@ -1571,7 +1572,7 @@
  * This function will duplicate file descriptors contained in \p t.
  */
 inline status_t flatten(
-        IOmxBufferProducer::FrameEventHistoryDelta const& t,
+        HGraphicBufferProducer::FrameEventHistoryDelta const& t,
         void*& buffer, size_t& size, int*& fds, size_t& numFds) {
     if (t.deltas.size() > ::android::FrameEventHistory::MAX_FRAME_HISTORY) {
         return BAD_VALUE;
@@ -1594,10 +1595,10 @@
 
 /**
  * \brief Wrap `::android::FrameEventHistoryData` in
- * `IOmxBufferProducer::FrameEventHistoryDelta`.
+ * `HGraphicBufferProducer::FrameEventHistoryDelta`.
  *
  * \param[out] t The wrapper of type
- * `IOmxBufferProducer::FrameEventHistoryDelta`.
+ * `HGraphicBufferProducer::FrameEventHistoryDelta`.
  * \param[out] nh The array of array of native handles that are referred to by
  * members of \p t.
  * \param[in] l The source `::android::FrameEventHistoryDelta`.
@@ -1606,7 +1607,7 @@
  * native handle. All the non-`nullptr` elements must be deleted individually
  * with `native_handle_delete()`.
  */
-inline bool wrapAs(IOmxBufferProducer::FrameEventHistoryDelta* t,
+inline bool wrapAs(HGraphicBufferProducer::FrameEventHistoryDelta* t,
         std::vector<std::vector<native_handle_t*> >* nh,
         ::android::FrameEventHistoryDelta const& l) {
 
@@ -1644,17 +1645,17 @@
 }
 
 /**
- * \brief Convert `IOmxBufferProducer::FrameEventHistoryDelta` to
+ * \brief Convert `HGraphicBufferProducer::FrameEventHistoryDelta` to
  * `::android::FrameEventHistoryDelta`.
  *
  * \param[out] l The destination `::android::FrameEventHistoryDelta`.
- * \param[in] t The source `IOmxBufferProducer::FrameEventHistoryDelta`.
+ * \param[in] t The source `HGraphicBufferProducer::FrameEventHistoryDelta`.
  *
  * This function will duplicate all file descriptors contained in \p t.
  */
 inline bool convertTo(
         ::android::FrameEventHistoryDelta* l,
-        IOmxBufferProducer::FrameEventHistoryDelta const& t) {
+        HGraphicBufferProducer::FrameEventHistoryDelta const& t) {
 
     size_t const baseSize = getFlattenedSize(t);
     std::unique_ptr<uint8_t[]> baseBuffer(
@@ -1829,18 +1830,18 @@
     return true;
 }
 
-// Ref: frameworks/native/libs/gui/IGraphicBufferProducer.cpp:
-//      IGraphicBufferProducer::QueueBufferInput
+// Ref: frameworks/native/libs/gui/BGraphicBufferProducer.cpp:
+//      BGraphicBufferProducer::QueueBufferInput
 
 /**
  * \brief Return a lower bound on the size of the buffer required to flatten
- * `IOmxBufferProducer::QueueBufferInput`.
+ * `HGraphicBufferProducer::QueueBufferInput`.
  *
- * \param[in] t The input `IOmxBufferProducer::QueueBufferInput`.
+ * \param[in] t The input `HGraphicBufferProducer::QueueBufferInput`.
  * \return A lower bound on the size of the flat buffer.
  */
 constexpr size_t minFlattenedSize(
-        IOmxBufferProducer::QueueBufferInput const& /* t */) {
+        HGraphicBufferProducer::QueueBufferInput const& /* t */) {
     return sizeof(int64_t) + // timestamp
             sizeof(int) + // isAutoTimestamp
             sizeof(android_dataspace) + // dataSpace
@@ -1853,12 +1854,12 @@
 
 /**
  * \brief Return the size of the buffer required to flatten
- * `IOmxBufferProducer::QueueBufferInput`.
+ * `HGraphicBufferProducer::QueueBufferInput`.
  *
- * \param[in] t The input `IOmxBufferProducer::QueueBufferInput`.
+ * \param[in] t The input `HGraphicBufferProducer::QueueBufferInput`.
  * \return The required size of the flat buffer.
  */
-inline size_t getFlattenedSize(IOmxBufferProducer::QueueBufferInput const& t) {
+inline size_t getFlattenedSize(HGraphicBufferProducer::QueueBufferInput const& t) {
     return minFlattenedSize(t) +
             getFenceFlattenedSize(t.fence) +
             getFlattenedSize(t.surfaceDamage);
@@ -1866,20 +1867,20 @@
 
 /**
  * \brief Return the number of file descriptors contained in
- * `IOmxBufferProducer::QueueBufferInput`.
+ * `HGraphicBufferProducer::QueueBufferInput`.
  *
- * \param[in] t The input `IOmxBufferProducer::QueueBufferInput`.
+ * \param[in] t The input `HGraphicBufferProducer::QueueBufferInput`.
  * \return The number of file descriptors contained in \p t.
  */
 inline size_t getFdCount(
-        IOmxBufferProducer::QueueBufferInput const& t) {
+        HGraphicBufferProducer::QueueBufferInput const& t) {
     return getFenceFdCount(t.fence);
 }
 
 /**
- * \brief Flatten `IOmxBufferProducer::QueueBufferInput`.
+ * \brief Flatten `HGraphicBufferProducer::QueueBufferInput`.
  *
- * \param[in] t The source `IOmxBufferProducer::QueueBufferInput`.
+ * \param[in] t The source `HGraphicBufferProducer::QueueBufferInput`.
  * \param[out] nh The native handle cloned from `t.fence`.
  * \param[in,out] buffer The pointer to the flat non-fd buffer.
  * \param[in,out] size The size of the flat non-fd buffer.
@@ -1888,7 +1889,7 @@
  * \return `NO_ERROR` on success; other value on failure.
  *
  * This function will duplicate the file descriptor in `t.fence`. */
-inline status_t flatten(IOmxBufferProducer::QueueBufferInput const& t,
+inline status_t flatten(HGraphicBufferProducer::QueueBufferInput const& t,
         native_handle_t** nh,
         void*& buffer, size_t& size, int*& fds, size_t& numFds) {
     if (size < getFlattenedSize(t)) {
@@ -1919,9 +1920,9 @@
 }
 
 /**
- * \brief Unflatten `IOmxBufferProducer::QueueBufferInput`.
+ * \brief Unflatten `HGraphicBufferProducer::QueueBufferInput`.
  *
- * \param[out] t The destination `IOmxBufferProducer::QueueBufferInput`.
+ * \param[out] t The destination `HGraphicBufferProducer::QueueBufferInput`.
  * \param[out] nh The underlying native handle for `t->fence`.
  * \param[in,out] buffer The pointer to the flat non-fd buffer.
  * \param[in,out] size The size of the flat non-fd buffer.
@@ -1935,7 +1936,7 @@
  * afterwards.
  */
 inline status_t unflatten(
-        IOmxBufferProducer::QueueBufferInput* t, native_handle_t** nh,
+        HGraphicBufferProducer::QueueBufferInput* t, native_handle_t** nh,
         void const*& buffer, size_t& size, int const*& fds, size_t& numFds) {
     if (size < minFlattenedSize(*t)) {
         return NO_MEMORY;
@@ -1971,13 +1972,13 @@
 }
 
 /**
- * \brief Wrap `IGraphicBufferProducer::QueueBufferInput` in
- * `IOmxBufferProducer::QueueBufferInput`.
+ * \brief Wrap `BGraphicBufferProducer::QueueBufferInput` in
+ * `HGraphicBufferProducer::QueueBufferInput`.
  *
  * \param[out] t The wrapper of type
- * `IOmxBufferProducer::QueueBufferInput`.
+ * `HGraphicBufferProducer::QueueBufferInput`.
  * \param[out] nh The underlying native handle for `t->fence`.
- * \param[in] l The source `IGraphicBufferProducer::QueueBufferInput`.
+ * \param[in] l The source `BGraphicBufferProducer::QueueBufferInput`.
  *
  * If the return value is `true` and `t->fence` contains a valid file
  * descriptor, \p nh will be a newly created native handle holding that file
@@ -1985,9 +1986,9 @@
  * afterwards.
  */
 inline bool wrapAs(
-        IOmxBufferProducer::QueueBufferInput* t,
+        HGraphicBufferProducer::QueueBufferInput* t,
         native_handle_t** nh,
-        IGraphicBufferProducer::QueueBufferInput const& l) {
+        BGraphicBufferProducer::QueueBufferInput const& l) {
 
     size_t const baseSize = l.getFlattenedSize();
     std::unique_ptr<uint8_t[]> baseBuffer(
@@ -2023,17 +2024,17 @@
 }
 
 /**
- * \brief Convert `IOmxBufferProducer::QueueBufferInput` to
- * `IGraphicBufferProducer::QueueBufferInput`.
+ * \brief Convert `HGraphicBufferProducer::QueueBufferInput` to
+ * `BGraphicBufferProducer::QueueBufferInput`.
  *
- * \param[out] l The destination `IGraphicBufferProducer::QueueBufferInput`.
- * \param[in] t The source `IOmxBufferProducer::QueueBufferInput`.
+ * \param[out] l The destination `BGraphicBufferProducer::QueueBufferInput`.
+ * \param[in] t The source `HGraphicBufferProducer::QueueBufferInput`.
  *
  * If `t.fence` has a valid file descriptor, it will be duplicated.
  */
 inline bool convertTo(
-        IGraphicBufferProducer::QueueBufferInput* l,
-        IOmxBufferProducer::QueueBufferInput const& t) {
+        BGraphicBufferProducer::QueueBufferInput* l,
+        HGraphicBufferProducer::QueueBufferInput const& t) {
 
     size_t const baseSize = getFlattenedSize(t);
     std::unique_ptr<uint8_t[]> baseBuffer(
@@ -2072,28 +2073,28 @@
     return true;
 }
 
-// Ref: frameworks/native/libs/gui/IGraphicBufferProducer.cpp:
-//      IGraphicBufferProducer::QueueBufferOutput
+// Ref: frameworks/native/libs/gui/BGraphicBufferProducer.cpp:
+//      BGraphicBufferProducer::QueueBufferOutput
 
 /**
- * \brief Wrap `IGraphicBufferProducer::QueueBufferOutput` in
- * `IOmxBufferProducer::QueueBufferOutput`.
+ * \brief Wrap `BGraphicBufferProducer::QueueBufferOutput` in
+ * `HGraphicBufferProducer::QueueBufferOutput`.
  *
  * \param[out] t The wrapper of type
- * `IOmxBufferProducer::QueueBufferOutput`.
+ * `HGraphicBufferProducer::QueueBufferOutput`.
  * \param[out] nh The array of array of native handles that are referred to by
  * members of \p t.
- * \param[in] l The source `IGraphicBufferProducer::QueueBufferOutput`.
+ * \param[in] l The source `BGraphicBufferProducer::QueueBufferOutput`.
  *
  * On success, each member of \p nh will be either `nullptr` or a newly created
  * native handle. All the non-`nullptr` elements must be deleted individually
  * with `native_handle_delete()`.
  */
-// wrap: IGraphicBufferProducer::QueueBufferOutput ->
-// IOmxBufferProducer::QueueBufferOutput
-inline bool wrapAs(IOmxBufferProducer::QueueBufferOutput* t,
+// wrap: BGraphicBufferProducer::QueueBufferOutput ->
+// HGraphicBufferProducer::QueueBufferOutput
+inline bool wrapAs(HGraphicBufferProducer::QueueBufferOutput* t,
         std::vector<std::vector<native_handle_t*> >* nh,
-        IGraphicBufferProducer::QueueBufferOutput const& l) {
+        BGraphicBufferProducer::QueueBufferOutput const& l) {
     if (!wrapAs(&(t->frameTimestamps), nh, l.frameTimestamps)) {
         return false;
     }
@@ -2107,19 +2108,19 @@
 }
 
 /**
- * \brief Convert `IOmxBufferProducer::QueueBufferOutput` to
- * `IGraphicBufferProducer::QueueBufferOutput`.
+ * \brief Convert `HGraphicBufferProducer::QueueBufferOutput` to
+ * `BGraphicBufferProducer::QueueBufferOutput`.
  *
- * \param[out] l The destination `IGraphicBufferProducer::QueueBufferOutput`.
- * \param[in] t The source `IOmxBufferProducer::QueueBufferOutput`.
+ * \param[out] l The destination `BGraphicBufferProducer::QueueBufferOutput`.
+ * \param[in] t The source `HGraphicBufferProducer::QueueBufferOutput`.
  *
  * This function will duplicate all file descriptors contained in \p t.
  */
-// convert: IOmxBufferProducer::QueueBufferOutput ->
-// IGraphicBufferProducer::QueueBufferOutput
+// convert: HGraphicBufferProducer::QueueBufferOutput ->
+// BGraphicBufferProducer::QueueBufferOutput
 inline bool convertTo(
-        IGraphicBufferProducer::QueueBufferOutput* l,
-        IOmxBufferProducer::QueueBufferOutput const& t) {
+        BGraphicBufferProducer::QueueBufferOutput* l,
+        HGraphicBufferProducer::QueueBufferOutput const& t) {
     if (!convertTo(&(l->frameTimestamps), t.frameTimestamps)) {
         return false;
     }
@@ -2133,39 +2134,39 @@
 }
 
 /**
- * \brief Convert `IGraphicBufferProducer::DisconnectMode` to
- * `IOmxBufferProducer::DisconnectMode`.
+ * \brief Convert `BGraphicBufferProducer::DisconnectMode` to
+ * `HGraphicBufferProducer::DisconnectMode`.
  *
- * \param[in] l The source `IGraphicBufferProducer::DisconnectMode`.
- * \return The corresponding `IOmxBufferProducer::DisconnectMode`.
+ * \param[in] l The source `BGraphicBufferProducer::DisconnectMode`.
+ * \return The corresponding `HGraphicBufferProducer::DisconnectMode`.
  */
-inline IOmxBufferProducer::DisconnectMode toOmxDisconnectMode(
-        IGraphicBufferProducer::DisconnectMode l) {
+inline HGraphicBufferProducer::DisconnectMode toOmxDisconnectMode(
+        BGraphicBufferProducer::DisconnectMode l) {
     switch (l) {
-        case IGraphicBufferProducer::DisconnectMode::Api:
-            return IOmxBufferProducer::DisconnectMode::API;
-        case IGraphicBufferProducer::DisconnectMode::AllLocal:
-            return IOmxBufferProducer::DisconnectMode::ALL_LOCAL;
+        case BGraphicBufferProducer::DisconnectMode::Api:
+            return HGraphicBufferProducer::DisconnectMode::API;
+        case BGraphicBufferProducer::DisconnectMode::AllLocal:
+            return HGraphicBufferProducer::DisconnectMode::ALL_LOCAL;
     }
-    return IOmxBufferProducer::DisconnectMode::API;
+    return HGraphicBufferProducer::DisconnectMode::API;
 }
 
 /**
- * \brief Convert `IOmxBufferProducer::DisconnectMode` to
- * `IGraphicBufferProducer::DisconnectMode`.
+ * \brief Convert `HGraphicBufferProducer::DisconnectMode` to
+ * `BGraphicBufferProducer::DisconnectMode`.
  *
- * \param[in] l The source `IOmxBufferProducer::DisconnectMode`.
- * \return The corresponding `IGraphicBufferProducer::DisconnectMode`.
+ * \param[in] l The source `HGraphicBufferProducer::DisconnectMode`.
+ * \return The corresponding `BGraphicBufferProducer::DisconnectMode`.
  */
-inline IGraphicBufferProducer::DisconnectMode toGuiDisconnectMode(
-        IOmxBufferProducer::DisconnectMode t) {
+inline BGraphicBufferProducer::DisconnectMode toGuiDisconnectMode(
+        HGraphicBufferProducer::DisconnectMode t) {
     switch (t) {
-        case IOmxBufferProducer::DisconnectMode::API:
-            return IGraphicBufferProducer::DisconnectMode::Api;
-        case IOmxBufferProducer::DisconnectMode::ALL_LOCAL:
-            return IGraphicBufferProducer::DisconnectMode::AllLocal;
+        case HGraphicBufferProducer::DisconnectMode::API:
+            return BGraphicBufferProducer::DisconnectMode::Api;
+        case HGraphicBufferProducer::DisconnectMode::ALL_LOCAL:
+            return BGraphicBufferProducer::DisconnectMode::AllLocal;
     }
-    return IGraphicBufferProducer::DisconnectMode::Api;
+    return BGraphicBufferProducer::DisconnectMode::Api;
 }
 
 }  // namespace implementation
diff --git a/media/libstagefright/omx/hal/1.0/impl/Omx.cpp b/media/libstagefright/omx/1.0/Omx.cpp
similarity index 96%
rename from media/libstagefright/omx/hal/1.0/impl/Omx.cpp
rename to media/libstagefright/omx/1.0/Omx.cpp
index 0ef7c8c..134c661 100644
--- a/media/libstagefright/omx/hal/1.0/impl/Omx.cpp
+++ b/media/libstagefright/omx/1.0/Omx.cpp
@@ -22,13 +22,13 @@
 #include <OMX_Core.h>
 #include <OMX_AsString.h>
 
-#include "../../../OMXUtils.h"
-#include "../../../OMXMaster.h"
-#include "../../../GraphicBufferSource.h"
+#include "../OMXUtils.h"
+#include "../OMXMaster.h"
+#include "../GraphicBufferSource.h"
 
 #include "WOmxNode.h"
 #include "WOmxObserver.h"
-#include "WOmxBufferProducer.h"
+#include "WGraphicBufferProducer.h"
 #include "WGraphicBufferSource.h"
 #include "Conversion.h"
 
@@ -52,7 +52,6 @@
 
 Return<void> Omx::listNodes(listNodes_cb _hidl_cb) {
     std::list<::android::IOMX::ComponentInfo> list;
-    OMX_U32 index = 0;
     char componentName[256];
     for (OMX_U32 index = 0;
             mMaster->enumerateComponents(
@@ -136,7 +135,7 @@
     bufferProducer = graphicBufferSource->getIGraphicBufferProducer();
 
     _hidl_cb(toStatus(OK),
-            new TWOmxBufferProducer(bufferProducer),
+            new TWGraphicBufferProducer(bufferProducer),
             new TWGraphicBufferSource(graphicBufferSource));
     return Void();
 }
diff --git a/media/libstagefright/omx/hal/1.0/impl/Omx.h b/media/libstagefright/omx/1.0/Omx.h
similarity index 97%
rename from media/libstagefright/omx/hal/1.0/impl/Omx.h
rename to media/libstagefright/omx/1.0/Omx.h
index 3e9ea73..001e8cb 100644
--- a/media/libstagefright/omx/hal/1.0/impl/Omx.h
+++ b/media/libstagefright/omx/1.0/Omx.h
@@ -20,7 +20,7 @@
 #include <hidl/MQDescriptor.h>
 #include <hidl/Status.h>
 
-#include "../../../../include/OMXNodeInstance.h"
+#include "../../include/OMXNodeInstance.h"
 
 #include <android/hardware/media/omx/1.0/IOmx.h>
 
diff --git a/media/libstagefright/omx/1.0/WGraphicBufferProducer.cpp b/media/libstagefright/omx/1.0/WGraphicBufferProducer.cpp
new file mode 100644
index 0000000..36bd624
--- /dev/null
+++ b/media/libstagefright/omx/1.0/WGraphicBufferProducer.cpp
@@ -0,0 +1,353 @@
+/*
+ * Copyright 2016, 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_TAG "WGraphicBufferProducer-impl"
+
+#include <android-base/logging.h>
+
+#include "WGraphicBufferProducer.h"
+#include "WProducerListener.h"
+#include "Conversion.h"
+
+namespace android {
+namespace hardware {
+namespace media {
+namespace omx {
+namespace V1_0 {
+namespace implementation {
+
+// TWGraphicBufferProducer
+TWGraphicBufferProducer::TWGraphicBufferProducer(
+        sp<BGraphicBufferProducer> const& base):
+    mBase(base) {
+}
+
+Return<void> TWGraphicBufferProducer::requestBuffer(
+        int32_t slot, requestBuffer_cb _hidl_cb) {
+    sp<GraphicBuffer> buf;
+    status_t status = mBase->requestBuffer(slot, &buf);
+    AnwBuffer anwBuffer;
+    wrapAs(&anwBuffer, *buf);
+    _hidl_cb(static_cast<int32_t>(status), anwBuffer);
+    return Void();
+}
+
+Return<int32_t> TWGraphicBufferProducer::setMaxDequeuedBufferCount(
+        int32_t maxDequeuedBuffers) {
+    return static_cast<int32_t>(mBase->setMaxDequeuedBufferCount(
+            static_cast<int>(maxDequeuedBuffers)));
+}
+
+Return<int32_t> TWGraphicBufferProducer::setAsyncMode(bool async) {
+    return static_cast<int32_t>(mBase->setAsyncMode(async));
+}
+
+Return<void> TWGraphicBufferProducer::dequeueBuffer(
+        uint32_t width, uint32_t height,
+        PixelFormat format, uint32_t usage,
+        bool getFrameTimestamps, dequeueBuffer_cb _hidl_cb) {
+    int slot;
+    sp<Fence> fence;
+    ::android::FrameEventHistoryDelta outTimestamps;
+    status_t status = mBase->dequeueBuffer(
+            &slot, &fence,
+            width, height,
+            static_cast<::android::PixelFormat>(format), usage,
+            getFrameTimestamps ? &outTimestamps : nullptr);
+    hidl_handle tFence;
+    FrameEventHistoryDelta tOutTimestamps;
+
+    native_handle_t* nh = nullptr;
+    if ((fence == nullptr) || !wrapAs(&tFence, &nh, *fence)) {
+        LOG(ERROR) << "TWGraphicBufferProducer::dequeueBuffer - "
+                "Invalid output fence";
+        _hidl_cb(static_cast<int32_t>(status),
+                 static_cast<int32_t>(slot),
+                 tFence,
+                 tOutTimestamps);
+        return Void();
+    }
+    std::vector<std::vector<native_handle_t*> > nhAA;
+    if (getFrameTimestamps && !wrapAs(&tOutTimestamps, &nhAA, outTimestamps)) {
+        LOG(ERROR) << "TWGraphicBufferProducer::dequeueBuffer - "
+                "Invalid output timestamps";
+        _hidl_cb(static_cast<int32_t>(status),
+                 static_cast<int32_t>(slot),
+                 tFence,
+                 tOutTimestamps);
+        native_handle_delete(nh);
+        return Void();
+    }
+
+    _hidl_cb(static_cast<int32_t>(status),
+            static_cast<int32_t>(slot),
+            tFence,
+            tOutTimestamps);
+    native_handle_delete(nh);
+    if (getFrameTimestamps) {
+        for (auto& nhA : nhAA) {
+            for (auto& handle : nhA) {
+                native_handle_delete(handle);
+            }
+        }
+    }
+    return Void();
+}
+
+Return<int32_t> TWGraphicBufferProducer::detachBuffer(int32_t slot) {
+    return static_cast<int32_t>(mBase->detachBuffer(slot));
+}
+
+Return<void> TWGraphicBufferProducer::detachNextBuffer(
+        detachNextBuffer_cb _hidl_cb) {
+    sp<GraphicBuffer> outBuffer;
+    sp<Fence> outFence;
+    status_t status = mBase->detachNextBuffer(&outBuffer, &outFence);
+    AnwBuffer tBuffer;
+    hidl_handle tFence;
+
+    if (outBuffer == nullptr) {
+        LOG(ERROR) << "TWGraphicBufferProducer::detachNextBuffer - "
+                "Invalid output buffer";
+        _hidl_cb(static_cast<int32_t>(status), tBuffer, tFence);
+        return Void();
+    }
+    wrapAs(&tBuffer, *outBuffer);
+    native_handle_t* nh = nullptr;
+    if ((outFence != nullptr) && !wrapAs(&tFence, &nh, *outFence)) {
+        LOG(ERROR) << "TWGraphicBufferProducer::detachNextBuffer - "
+                "Invalid output fence";
+        _hidl_cb(static_cast<int32_t>(status), tBuffer, tFence);
+        return Void();
+    }
+
+    _hidl_cb(static_cast<int32_t>(status), tBuffer, tFence);
+    native_handle_delete(nh);
+    return Void();
+}
+
+Return<void> TWGraphicBufferProducer::attachBuffer(
+        const AnwBuffer& buffer,
+        attachBuffer_cb _hidl_cb) {
+    int outSlot;
+    sp<GraphicBuffer> lBuffer = new GraphicBuffer();
+    if (!convertTo(lBuffer.get(), buffer)) {
+        LOG(ERROR) << "TWGraphicBufferProducer::attachBuffer - "
+                "Invalid input native window buffer";
+        _hidl_cb(static_cast<int32_t>(BAD_VALUE), -1);
+        return Void();
+    }
+    status_t status = mBase->attachBuffer(&outSlot, lBuffer);
+
+    _hidl_cb(static_cast<int32_t>(status), static_cast<int32_t>(outSlot));
+    return Void();
+}
+
+Return<void> TWGraphicBufferProducer::queueBuffer(
+        int32_t slot, const QueueBufferInput& input,
+        queueBuffer_cb _hidl_cb) {
+    QueueBufferOutput tOutput;
+    BGraphicBufferProducer::QueueBufferInput lInput(
+            0, false, HAL_DATASPACE_UNKNOWN,
+            ::android::Rect(0, 0, 1, 1),
+            NATIVE_WINDOW_SCALING_MODE_FREEZE,
+            0, ::android::Fence::NO_FENCE);
+    if (!convertTo(&lInput, input)) {
+        LOG(ERROR) << "TWGraphicBufferProducer::queueBuffer - "
+                "Invalid input";
+        _hidl_cb(static_cast<int32_t>(BAD_VALUE), tOutput);
+        return Void();
+    }
+    BGraphicBufferProducer::QueueBufferOutput lOutput;
+    status_t status = mBase->queueBuffer(
+            static_cast<int>(slot), lInput, &lOutput);
+
+    std::vector<std::vector<native_handle_t*> > nhAA;
+    if (!wrapAs(&tOutput, &nhAA, lOutput)) {
+        LOG(ERROR) << "TWGraphicBufferProducer::queueBuffer - "
+                "Invalid output";
+        _hidl_cb(static_cast<int32_t>(BAD_VALUE), tOutput);
+        return Void();
+    }
+
+    _hidl_cb(static_cast<int32_t>(status), tOutput);
+    for (auto& nhA : nhAA) {
+        for (auto& nh : nhA) {
+            native_handle_delete(nh);
+        }
+    }
+    return Void();
+}
+
+Return<int32_t> TWGraphicBufferProducer::cancelBuffer(
+        int32_t slot, const hidl_handle& fence) {
+    sp<Fence> lFence = new Fence();
+    if (!convertTo(lFence.get(), fence)) {
+        LOG(ERROR) << "TWGraphicBufferProducer::cancelBuffer - "
+                "Invalid input fence";
+        return static_cast<int32_t>(BAD_VALUE);
+    }
+    return static_cast<int32_t>(mBase->cancelBuffer(static_cast<int>(slot), lFence));
+}
+
+Return<void> TWGraphicBufferProducer::query(int32_t what, query_cb _hidl_cb) {
+    int lValue;
+    int lReturn = mBase->query(static_cast<int>(what), &lValue);
+    _hidl_cb(static_cast<int32_t>(lReturn), static_cast<int32_t>(lValue));
+    return Void();
+}
+
+Return<void> TWGraphicBufferProducer::connect(
+        const sp<HProducerListener>& listener,
+        int32_t api, bool producerControlledByApp, connect_cb _hidl_cb) {
+    sp<BProducerListener> lListener = listener == nullptr ?
+            nullptr : new LWProducerListener(listener);
+    BGraphicBufferProducer::QueueBufferOutput lOutput;
+    status_t status = mBase->connect(lListener,
+            static_cast<int>(api),
+            producerControlledByApp,
+            &lOutput);
+
+    QueueBufferOutput tOutput;
+    std::vector<std::vector<native_handle_t*> > nhAA;
+    if (!wrapAs(&tOutput, &nhAA, lOutput)) {
+        LOG(ERROR) << "TWGraphicBufferProducer::connect - "
+                "Invalid output";
+        _hidl_cb(static_cast<int32_t>(status), tOutput);
+        return Void();
+    }
+
+    _hidl_cb(static_cast<int32_t>(status), tOutput);
+    for (auto& nhA : nhAA) {
+        for (auto& nh : nhA) {
+            native_handle_delete(nh);
+        }
+    }
+    return Void();
+}
+
+Return<int32_t> TWGraphicBufferProducer::disconnect(
+        int32_t api, DisconnectMode mode) {
+    return static_cast<int32_t>(mBase->disconnect(
+            static_cast<int>(api),
+            toGuiDisconnectMode(mode)));
+}
+
+Return<int32_t> TWGraphicBufferProducer::setSidebandStream(const hidl_handle& stream) {
+    return static_cast<int32_t>(mBase->setSidebandStream(NativeHandle::create(
+            native_handle_clone(stream), true)));
+}
+
+Return<void> TWGraphicBufferProducer::allocateBuffers(
+        uint32_t width, uint32_t height, PixelFormat format, uint32_t usage) {
+    mBase->allocateBuffers(
+            width, height,
+            static_cast<::android::PixelFormat>(format),
+            usage);
+    return Void();
+}
+
+Return<int32_t> TWGraphicBufferProducer::allowAllocation(bool allow) {
+    return static_cast<int32_t>(mBase->allowAllocation(allow));
+}
+
+Return<int32_t> TWGraphicBufferProducer::setGenerationNumber(uint32_t generationNumber) {
+    return static_cast<int32_t>(mBase->setGenerationNumber(generationNumber));
+}
+
+Return<void> TWGraphicBufferProducer::getConsumerName(getConsumerName_cb _hidl_cb) {
+    _hidl_cb(mBase->getConsumerName().string());
+    return Void();
+}
+
+Return<int32_t> TWGraphicBufferProducer::setSharedBufferMode(bool sharedBufferMode) {
+    return static_cast<int32_t>(mBase->setSharedBufferMode(sharedBufferMode));
+}
+
+Return<int32_t> TWGraphicBufferProducer::setAutoRefresh(bool autoRefresh) {
+    return static_cast<int32_t>(mBase->setAutoRefresh(autoRefresh));
+}
+
+Return<int32_t> TWGraphicBufferProducer::setDequeueTimeout(int64_t timeoutNs) {
+    return static_cast<int32_t>(mBase->setDequeueTimeout(timeoutNs));
+}
+
+Return<void> TWGraphicBufferProducer::getLastQueuedBuffer(
+        getLastQueuedBuffer_cb _hidl_cb) {
+    sp<GraphicBuffer> lOutBuffer = new GraphicBuffer();
+    sp<Fence> lOutFence = new Fence();
+    float lOutTransformMatrix[16];
+    status_t status = mBase->getLastQueuedBuffer(
+            &lOutBuffer, &lOutFence, lOutTransformMatrix);
+
+    AnwBuffer tOutBuffer;
+    if (lOutBuffer != nullptr) {
+        wrapAs(&tOutBuffer, *lOutBuffer);
+    }
+    hidl_handle tOutFence;
+    native_handle_t* nh = nullptr;
+    if ((lOutFence == nullptr) || !wrapAs(&tOutFence, &nh, *lOutFence)) {
+        LOG(ERROR) << "TWGraphicBufferProducer::getLastQueuedBuffer - "
+                "Invalid output fence";
+        _hidl_cb(static_cast<int32_t>(status),
+                tOutBuffer,
+                tOutFence,
+                hidl_array<float, 16>());
+        return Void();
+    }
+    hidl_array<float, 16> tOutTransformMatrix(lOutTransformMatrix);
+
+    _hidl_cb(static_cast<int32_t>(status), tOutBuffer, tOutFence, tOutTransformMatrix);
+    native_handle_delete(nh);
+    return Void();
+}
+
+Return<void> TWGraphicBufferProducer::getFrameTimestamps(
+        getFrameTimestamps_cb _hidl_cb) {
+    ::android::FrameEventHistoryDelta lDelta;
+    mBase->getFrameTimestamps(&lDelta);
+
+    FrameEventHistoryDelta tDelta;
+    std::vector<std::vector<native_handle_t*> > nhAA;
+    if (!wrapAs(&tDelta, &nhAA, lDelta)) {
+        LOG(ERROR) << "TWGraphicBufferProducer::getFrameTimestamps - "
+                "Invalid output frame timestamps";
+        _hidl_cb(tDelta);
+        return Void();
+    }
+
+    _hidl_cb(tDelta);
+    for (auto& nhA : nhAA) {
+        for (auto& nh : nhA) {
+            native_handle_delete(nh);
+        }
+    }
+    return Void();
+}
+
+Return<void> TWGraphicBufferProducer::getUniqueId(getUniqueId_cb _hidl_cb) {
+    uint64_t outId;
+    status_t status = mBase->getUniqueId(&outId);
+    _hidl_cb(static_cast<int32_t>(status), outId);
+    return Void();
+}
+
+}  // namespace implementation
+}  // namespace V1_0
+}  // namespace omx
+}  // namespace media
+}  // namespace hardware
+}  // namespace android
diff --git a/media/libstagefright/omx/1.0/WGraphicBufferProducer.h b/media/libstagefright/omx/1.0/WGraphicBufferProducer.h
new file mode 100644
index 0000000..4a3fe0c
--- /dev/null
+++ b/media/libstagefright/omx/1.0/WGraphicBufferProducer.h
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2016, 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 ANDROID_HARDWARE_MEDIA_OMX_V1_0_WGRAPHICBUFFERPRODUCER_H
+#define ANDROID_HARDWARE_MEDIA_OMX_V1_0_WGRAPHICBUFFERPRODUCER_H
+
+#include <hidl/MQDescriptor.h>
+#include <hidl/Status.h>
+
+#include <binder/Binder.h>
+#include <gui/IGraphicBufferProducer.h>
+#include <gui/IProducerListener.h>
+
+#include <android/hardware/graphics/bufferqueue/1.0/IGraphicBufferProducer.h>
+
+namespace android {
+namespace hardware {
+namespace media {
+namespace omx {
+namespace V1_0 {
+namespace implementation {
+
+using ::android::hardware::graphics::common::V1_0::PixelFormat;
+using ::android::hardware::media::V1_0::AnwBuffer;
+using ::android::hidl::base::V1_0::IBase;
+using ::android::hardware::hidl_array;
+using ::android::hardware::hidl_memory;
+using ::android::hardware::hidl_string;
+using ::android::hardware::hidl_vec;
+using ::android::hardware::Return;
+using ::android::hardware::Void;
+using ::android::sp;
+
+typedef ::android::hardware::graphics::bufferqueue::V1_0::
+        IGraphicBufferProducer HGraphicBufferProducer;
+typedef ::android::hardware::graphics::bufferqueue::V1_0::
+        IProducerListener HProducerListener;
+
+typedef ::android::IGraphicBufferProducer BGraphicBufferProducer;
+typedef ::android::IProducerListener BProducerListener;
+using ::android::BnGraphicBufferProducer;
+
+struct TWGraphicBufferProducer : public HGraphicBufferProducer {
+    sp<BGraphicBufferProducer> mBase;
+    TWGraphicBufferProducer(sp<BGraphicBufferProducer> const& base);
+    Return<void> requestBuffer(int32_t slot, requestBuffer_cb _hidl_cb)
+            override;
+    Return<int32_t> setMaxDequeuedBufferCount(int32_t maxDequeuedBuffers)
+            override;
+    Return<int32_t> setAsyncMode(bool async) override;
+    Return<void> dequeueBuffer(
+            uint32_t width, uint32_t height, PixelFormat format, uint32_t usage,
+            bool getFrameTimestamps, dequeueBuffer_cb _hidl_cb) override;
+    Return<int32_t> detachBuffer(int32_t slot) override;
+    Return<void> detachNextBuffer(detachNextBuffer_cb _hidl_cb) override;
+    Return<void> attachBuffer(const AnwBuffer& buffer, attachBuffer_cb _hidl_cb)
+            override;
+    Return<void> queueBuffer(
+            int32_t slot, const HGraphicBufferProducer::QueueBufferInput& input,
+            queueBuffer_cb _hidl_cb) override;
+    Return<int32_t> cancelBuffer(int32_t slot, const hidl_handle& fence)
+            override;
+    Return<void> query(int32_t what, query_cb _hidl_cb) override;
+    Return<void> connect(const sp<HProducerListener>& listener,
+            int32_t api, bool producerControlledByApp,
+            connect_cb _hidl_cb) override;
+    Return<int32_t> disconnect(
+            int32_t api,
+            HGraphicBufferProducer::DisconnectMode mode) override;
+    Return<int32_t> setSidebandStream(const hidl_handle& stream) override;
+    Return<void> allocateBuffers(
+            uint32_t width, uint32_t height,
+            PixelFormat format, uint32_t usage) override;
+    Return<int32_t> allowAllocation(bool allow) override;
+    Return<int32_t> setGenerationNumber(uint32_t generationNumber) override;
+    Return<void> getConsumerName(getConsumerName_cb _hidl_cb) override;
+    Return<int32_t> setSharedBufferMode(bool sharedBufferMode) override;
+    Return<int32_t> setAutoRefresh(bool autoRefresh) override;
+    Return<int32_t> setDequeueTimeout(int64_t timeoutNs) override;
+    Return<void> getLastQueuedBuffer(getLastQueuedBuffer_cb _hidl_cb) override;
+    Return<void> getFrameTimestamps(getFrameTimestamps_cb _hidl_cb) override;
+    Return<void> getUniqueId(getUniqueId_cb _hidl_cb) override;
+};
+
+}  // namespace implementation
+}  // namespace V1_0
+}  // namespace omx
+}  // namespace media
+}  // namespace hardware
+}  // namespace android
+
+#endif  // ANDROID_HARDWARE_MEDIA_OMX_V1_0_WOMXBUFFERPRODUCER_H
diff --git a/media/libstagefright/omx/hal/1.0/impl/WGraphicBufferSource.cpp b/media/libstagefright/omx/1.0/WGraphicBufferSource.cpp
similarity index 100%
rename from media/libstagefright/omx/hal/1.0/impl/WGraphicBufferSource.cpp
rename to media/libstagefright/omx/1.0/WGraphicBufferSource.cpp
diff --git a/media/libstagefright/omx/hal/1.0/impl/WGraphicBufferSource.h b/media/libstagefright/omx/1.0/WGraphicBufferSource.h
similarity index 98%
rename from media/libstagefright/omx/hal/1.0/impl/WGraphicBufferSource.h
rename to media/libstagefright/omx/1.0/WGraphicBufferSource.h
index 8cf11ca..73b86b8 100644
--- a/media/libstagefright/omx/hal/1.0/impl/WGraphicBufferSource.h
+++ b/media/libstagefright/omx/1.0/WGraphicBufferSource.h
@@ -28,7 +28,7 @@
 
 #include <android/BnGraphicBufferSource.h>
 
-#include "../../../GraphicBufferSource.h"
+#include "../GraphicBufferSource.h"
 
 namespace android {
 namespace hardware {
diff --git a/media/libstagefright/omx/hal/1.0/impl/WOmxBufferSource.cpp b/media/libstagefright/omx/1.0/WOmxBufferSource.cpp
similarity index 100%
rename from media/libstagefright/omx/hal/1.0/impl/WOmxBufferSource.cpp
rename to media/libstagefright/omx/1.0/WOmxBufferSource.cpp
diff --git a/media/libstagefright/omx/hal/1.0/impl/WOmxBufferSource.h b/media/libstagefright/omx/1.0/WOmxBufferSource.h
similarity index 100%
rename from media/libstagefright/omx/hal/1.0/impl/WOmxBufferSource.h
rename to media/libstagefright/omx/1.0/WOmxBufferSource.h
diff --git a/media/libstagefright/omx/hal/1.0/impl/WOmxNode.cpp b/media/libstagefright/omx/1.0/WOmxNode.cpp
similarity index 100%
rename from media/libstagefright/omx/hal/1.0/impl/WOmxNode.cpp
rename to media/libstagefright/omx/1.0/WOmxNode.cpp
diff --git a/media/libstagefright/omx/hal/1.0/impl/WOmxNode.h b/media/libstagefright/omx/1.0/WOmxNode.h
similarity index 98%
rename from media/libstagefright/omx/hal/1.0/impl/WOmxNode.h
rename to media/libstagefright/omx/1.0/WOmxNode.h
index 75816ba..8ca3e67 100644
--- a/media/libstagefright/omx/hal/1.0/impl/WOmxNode.h
+++ b/media/libstagefright/omx/1.0/WOmxNode.h
@@ -22,7 +22,7 @@
 
 #include <utils/Errors.h>
 
-#include "../../../../include/OMXNodeInstance.h"
+#include "../../include/OMXNodeInstance.h"
 
 #include <android/hardware/media/omx/1.0/IOmxNode.h>
 #include <android/hardware/media/omx/1.0/IOmxObserver.h>
diff --git a/media/libstagefright/omx/hal/1.0/impl/WOmxObserver.cpp b/media/libstagefright/omx/1.0/WOmxObserver.cpp
similarity index 100%
rename from media/libstagefright/omx/hal/1.0/impl/WOmxObserver.cpp
rename to media/libstagefright/omx/1.0/WOmxObserver.cpp
diff --git a/media/libstagefright/omx/hal/1.0/impl/WOmxObserver.h b/media/libstagefright/omx/1.0/WOmxObserver.h
similarity index 100%
rename from media/libstagefright/omx/hal/1.0/impl/WOmxObserver.h
rename to media/libstagefright/omx/1.0/WOmxObserver.h
diff --git a/media/libstagefright/omx/hal/1.0/impl/WOmxProducerListener.cpp b/media/libstagefright/omx/1.0/WProducerListener.cpp
similarity index 69%
rename from media/libstagefright/omx/hal/1.0/impl/WOmxProducerListener.cpp
rename to media/libstagefright/omx/1.0/WProducerListener.cpp
index a5eed35..be0d4d5 100644
--- a/media/libstagefright/omx/hal/1.0/impl/WOmxProducerListener.cpp
+++ b/media/libstagefright/omx/1.0/WProducerListener.cpp
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include "WOmxProducerListener.h"
+#include "WProducerListener.h"
 
 namespace android {
 namespace hardware {
@@ -23,32 +23,32 @@
 namespace V1_0 {
 namespace implementation {
 
-// TWOmxProducerListener
-TWOmxProducerListener::TWOmxProducerListener(
-        sp<IProducerListener> const& base):
+// TWProducerListener
+TWProducerListener::TWProducerListener(
+        sp<BProducerListener> const& base):
     mBase(base) {
 }
 
-Return<void> TWOmxProducerListener::onBufferReleased() {
+Return<void> TWProducerListener::onBufferReleased() {
     mBase->onBufferReleased();
     return Void();
 }
 
-Return<bool> TWOmxProducerListener::needsReleaseNotify() {
+Return<bool> TWProducerListener::needsReleaseNotify() {
     return mBase->needsReleaseNotify();
 }
 
-// LWOmxProducerListener
-LWOmxProducerListener::LWOmxProducerListener(
-        sp<IOmxProducerListener> const& base):
+// LWProducerListener
+LWProducerListener::LWProducerListener(
+        sp<HProducerListener> const& base):
     mBase(base) {
 }
 
-void LWOmxProducerListener::onBufferReleased() {
+void LWProducerListener::onBufferReleased() {
     mBase->onBufferReleased();
 }
 
-bool LWOmxProducerListener::needsReleaseNotify() {
+bool LWProducerListener::needsReleaseNotify() {
     return static_cast<bool>(mBase->needsReleaseNotify());
 }
 
diff --git a/media/libstagefright/omx/hal/1.0/impl/WOmxProducerListener.h b/media/libstagefright/omx/1.0/WProducerListener.h
similarity index 76%
rename from media/libstagefright/omx/hal/1.0/impl/WOmxProducerListener.h
rename to media/libstagefright/omx/1.0/WProducerListener.h
index e60032e..a75e48a 100644
--- a/media/libstagefright/omx/hal/1.0/impl/WOmxProducerListener.h
+++ b/media/libstagefright/omx/1.0/WProducerListener.h
@@ -23,7 +23,7 @@
 #include <binder/IBinder.h>
 #include <gui/IProducerListener.h>
 
-#include <android/hardware/media/omx/1.0/IOmxProducerListener.h>
+#include <android/hardware/graphics/bufferqueue/1.0/IProducerListener.h>
 
 namespace android {
 namespace hardware {
@@ -32,7 +32,6 @@
 namespace V1_0 {
 namespace implementation {
 
-using ::android::hardware::media::omx::V1_0::IOmxProducerListener;
 using ::android::hidl::base::V1_0::IBase;
 using ::android::hardware::hidl_array;
 using ::android::hardware::hidl_memory;
@@ -42,20 +41,23 @@
 using ::android::hardware::Void;
 using ::android::sp;
 
-using ::android::IProducerListener;
+typedef ::android::hardware::graphics::bufferqueue::V1_0::IProducerListener
+        HProducerListener;
+typedef ::android::IProducerListener
+        BProducerListener;
 using ::android::BnProducerListener;
 
-struct TWOmxProducerListener : public IOmxProducerListener {
-    sp<IProducerListener> mBase;
-    TWOmxProducerListener(sp<IProducerListener> const& base);
+struct TWProducerListener : public HProducerListener {
+    sp<BProducerListener> mBase;
+    TWProducerListener(sp<BProducerListener> const& base);
     Return<void> onBufferReleased() override;
     Return<bool> needsReleaseNotify() override;
 };
 
-class LWOmxProducerListener : public BnProducerListener {
+class LWProducerListener : public BnProducerListener {
 public:
-    sp<IOmxProducerListener> mBase;
-    LWOmxProducerListener(sp<IOmxProducerListener> const& base);
+    sp<HProducerListener> mBase;
+    LWProducerListener(sp<HProducerListener> const& base);
     void onBufferReleased() override;
     bool needsReleaseNotify() override;
 };
diff --git a/media/libstagefright/omx/Android.mk b/media/libstagefright/omx/Android.mk
index 9cba3d0..b1508dc 100644
--- a/media/libstagefright/omx/Android.mk
+++ b/media/libstagefright/omx/Android.mk
@@ -1,19 +1,26 @@
 LOCAL_PATH:= $(call my-dir)
 include $(CLEAR_VARS)
 
-LOCAL_SRC_FILES:=                     \
-        FrameDropper.cpp              \
-        GraphicBufferSource.cpp       \
-        BWGraphicBufferSource.cpp      \
-        OMX.cpp                       \
-        OMXMaster.cpp                 \
-        OMXNodeInstance.cpp           \
-        OMXUtils.cpp                  \
-        SimpleSoftOMXComponent.cpp    \
-        SoftOMXComponent.cpp          \
-        SoftOMXPlugin.cpp             \
-        SoftVideoDecoderOMXComponent.cpp \
-        SoftVideoEncoderOMXComponent.cpp \
+LOCAL_SRC_FILES:=                          \
+        FrameDropper.cpp                   \
+        GraphicBufferSource.cpp            \
+        BWGraphicBufferSource.cpp          \
+        OMX.cpp                            \
+        OMXMaster.cpp                      \
+        OMXNodeInstance.cpp                \
+        OMXUtils.cpp                       \
+        SimpleSoftOMXComponent.cpp         \
+        SoftOMXComponent.cpp               \
+        SoftOMXPlugin.cpp                  \
+        SoftVideoDecoderOMXComponent.cpp   \
+        SoftVideoEncoderOMXComponent.cpp   \
+        1.0/Omx.cpp                        \
+        1.0/WGraphicBufferProducer.cpp     \
+        1.0/WProducerListener.cpp          \
+        1.0/WGraphicBufferSource.cpp       \
+        1.0/WOmxNode.cpp                   \
+        1.0/WOmxObserver.cpp               \
+        1.0/WOmxBufferSource.cpp           \
 
 LOCAL_C_INCLUDES += \
         $(TOP)/frameworks/av/media/libstagefright \
@@ -21,25 +28,34 @@
         $(TOP)/frameworks/native/include/media/openmax \
         $(TOP)/system/libhidl/base/include \
 
-LOCAL_SHARED_LIBRARIES :=               \
-        libbinder                       \
-        libmedia                        \
-        libutils                        \
-        liblog                          \
-        libui                           \
-        libgui                          \
-        libcutils                       \
-        libstagefright_foundation       \
-        libdl                           \
-        libhidlbase                     \
-        libhidlmemory                   \
-        android.hidl.memory@1.0         \
+LOCAL_SHARED_LIBRARIES :=                         \
+        libbase                                   \
+        libbinder                                 \
+        libmedia                                  \
+        libutils                                  \
+        liblog                                    \
+        libui                                     \
+        libgui                                    \
+        libcutils                                 \
+        libstagefright_foundation                 \
+        libdl                                     \
+        libhidlbase                               \
+        libhidlmemory                             \
+        android.hidl.base@1.0                     \
+        android.hidl.memory@1.0                   \
+        android.hardware.media@1.0                \
+        android.hardware.media.omx@1.0            \
+        android.hardware.graphics.common@1.0      \
+        android.hardware.graphics.bufferqueue@1.0 \
+
+LOCAL_EXPORT_C_INCLUDES := \
+        $(TOP)/frameworks/av/include
 
 LOCAL_EXPORT_SHARED_LIBRARY_HEADERS := \
         android.hidl.memory@1.0
 
 LOCAL_MODULE:= libstagefright_omx
-LOCAL_CFLAGS += -Werror -Wall
+LOCAL_CFLAGS += -Werror -Wall -Wno-unused-parameter -Wno-documentation
 LOCAL_SANITIZE := unsigned-integer-overflow signed-integer-overflow cfi
 LOCAL_SANITIZE_DIAG := cfi
 
diff --git a/media/libstagefright/omx/hal/1.0/Android.mk b/media/libstagefright/omx/hal/1.0/Android.mk
deleted file mode 100644
index c14e909..0000000
--- a/media/libstagefright/omx/hal/1.0/Android.mk
+++ /dev/null
@@ -1,3 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-include $(call all-makefiles-under,$(LOCAL_PATH))
-
diff --git a/media/libstagefright/omx/hal/1.0/impl/WOmxBufferProducer.cpp b/media/libstagefright/omx/hal/1.0/impl/WOmxBufferProducer.cpp
deleted file mode 100644
index b6b9a3b..0000000
--- a/media/libstagefright/omx/hal/1.0/impl/WOmxBufferProducer.cpp
+++ /dev/null
@@ -1,621 +0,0 @@
-/*
- * Copyright 2016, 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_TAG "WOmxBufferProducer-impl"
-
-#include <android-base/logging.h>
-
-#include "WOmxBufferProducer.h"
-#include "WOmxProducerListener.h"
-#include "Conversion.h"
-
-namespace android {
-namespace hardware {
-namespace media {
-namespace omx {
-namespace V1_0 {
-namespace implementation {
-
-// TWOmxBufferProducer
-TWOmxBufferProducer::TWOmxBufferProducer(
-        sp<IGraphicBufferProducer> const& base):
-    mBase(base) {
-}
-
-Return<void> TWOmxBufferProducer::requestBuffer(
-        int32_t slot, requestBuffer_cb _hidl_cb) {
-    sp<GraphicBuffer> buf;
-    status_t status = mBase->requestBuffer(slot, &buf);
-    AnwBuffer anwBuffer;
-    wrapAs(&anwBuffer, *buf);
-    _hidl_cb(toStatus(status), anwBuffer);
-    return Void();
-}
-
-Return<Status> TWOmxBufferProducer::setMaxDequeuedBufferCount(
-        int32_t maxDequeuedBuffers) {
-    return toStatus(mBase->setMaxDequeuedBufferCount(
-            static_cast<int>(maxDequeuedBuffers)));
-}
-
-Return<Status> TWOmxBufferProducer::setAsyncMode(bool async) {
-    return toStatus(mBase->setAsyncMode(async));
-}
-
-Return<void> TWOmxBufferProducer::dequeueBuffer(
-        uint32_t width, uint32_t height,
-        PixelFormat format, uint32_t usage,
-        bool getFrameTimestamps, dequeueBuffer_cb _hidl_cb) {
-    int slot;
-    sp<Fence> fence;
-    ::android::FrameEventHistoryDelta outTimestamps;
-    status_t status = mBase->dequeueBuffer(
-            &slot, &fence,
-            width, height,
-            static_cast<::android::PixelFormat>(format), usage,
-            getFrameTimestamps ? &outTimestamps : nullptr);
-    hidl_handle tFence;
-    FrameEventHistoryDelta tOutTimestamps;
-
-    native_handle_t* nh = nullptr;
-    if ((fence == nullptr) || !wrapAs(&tFence, &nh, *fence)) {
-        LOG(ERROR) << "TWOmxBufferProducer::dequeueBuffer - "
-                "Invalid output fence";
-        _hidl_cb(toStatus(status),
-                 static_cast<int32_t>(slot),
-                 tFence,
-                 tOutTimestamps);
-        return Void();
-    }
-    std::vector<std::vector<native_handle_t*> > nhAA;
-    if (getFrameTimestamps && !wrapAs(&tOutTimestamps, &nhAA, outTimestamps)) {
-        LOG(ERROR) << "TWOmxBufferProducer::dequeueBuffer - "
-                "Invalid output timestamps";
-        _hidl_cb(toStatus(status),
-                 static_cast<int32_t>(slot),
-                 tFence,
-                 tOutTimestamps);
-        native_handle_delete(nh);
-        return Void();
-    }
-
-    _hidl_cb(toStatus(status),
-            static_cast<int32_t>(slot),
-            tFence,
-            tOutTimestamps);
-    native_handle_delete(nh);
-    if (getFrameTimestamps) {
-        for (auto& nhA : nhAA) {
-            for (auto& handle : nhA) {
-                native_handle_delete(handle);
-            }
-        }
-    }
-    return Void();
-}
-
-Return<Status> TWOmxBufferProducer::detachBuffer(int32_t slot) {
-    return toStatus(mBase->detachBuffer(slot));
-}
-
-Return<void> TWOmxBufferProducer::detachNextBuffer(
-        detachNextBuffer_cb _hidl_cb) {
-    sp<GraphicBuffer> outBuffer;
-    sp<Fence> outFence;
-    status_t status = mBase->detachNextBuffer(&outBuffer, &outFence);
-    AnwBuffer tBuffer;
-    hidl_handle tFence;
-
-    if (outBuffer == nullptr) {
-        LOG(ERROR) << "TWOmxBufferProducer::detachNextBuffer - "
-                "Invalid output buffer";
-        _hidl_cb(toStatus(status), tBuffer, tFence);
-        return Void();
-    }
-    wrapAs(&tBuffer, *outBuffer);
-    native_handle_t* nh = nullptr;
-    if ((outFence != nullptr) && !wrapAs(&tFence, &nh, *outFence)) {
-        LOG(ERROR) << "TWOmxBufferProducer::detachNextBuffer - "
-                "Invalid output fence";
-        _hidl_cb(toStatus(status), tBuffer, tFence);
-        return Void();
-    }
-
-    _hidl_cb(toStatus(status), tBuffer, tFence);
-    native_handle_delete(nh);
-    return Void();
-}
-
-Return<void> TWOmxBufferProducer::attachBuffer(
-        const AnwBuffer& buffer,
-        attachBuffer_cb _hidl_cb) {
-    int outSlot;
-    sp<GraphicBuffer> lBuffer = new GraphicBuffer();
-    if (!convertTo(lBuffer.get(), buffer)) {
-        LOG(ERROR) << "TWOmxBufferProducer::attachBuffer - "
-                "Invalid input native window buffer";
-        _hidl_cb(toStatus(BAD_VALUE), -1);
-        return Void();
-    }
-    status_t status = mBase->attachBuffer(&outSlot, lBuffer);
-
-    _hidl_cb(toStatus(status), static_cast<int32_t>(outSlot));
-    return Void();
-}
-
-Return<void> TWOmxBufferProducer::queueBuffer(
-        int32_t slot, const QueueBufferInput& input,
-        queueBuffer_cb _hidl_cb) {
-    QueueBufferOutput tOutput;
-    IGraphicBufferProducer::QueueBufferInput lInput(
-            0, false, HAL_DATASPACE_UNKNOWN,
-            ::android::Rect(0, 0, 1, 1),
-            NATIVE_WINDOW_SCALING_MODE_FREEZE,
-            0, ::android::Fence::NO_FENCE);
-    if (!convertTo(&lInput, input)) {
-        LOG(ERROR) << "TWOmxBufferProducer::queueBuffer - "
-                "Invalid input";
-        _hidl_cb(toStatus(BAD_VALUE), tOutput);
-        return Void();
-    }
-    IGraphicBufferProducer::QueueBufferOutput lOutput;
-    status_t status = mBase->queueBuffer(
-            static_cast<int>(slot), lInput, &lOutput);
-
-    std::vector<std::vector<native_handle_t*> > nhAA;
-    if (!wrapAs(&tOutput, &nhAA, lOutput)) {
-        LOG(ERROR) << "TWOmxBufferProducer::queueBuffer - "
-                "Invalid output";
-        _hidl_cb(toStatus(BAD_VALUE), tOutput);
-        return Void();
-    }
-
-    _hidl_cb(toStatus(status), tOutput);
-    for (auto& nhA : nhAA) {
-        for (auto& nh : nhA) {
-            native_handle_delete(nh);
-        }
-    }
-    return Void();
-}
-
-Return<Status> TWOmxBufferProducer::cancelBuffer(
-        int32_t slot, const hidl_handle& fence) {
-    sp<Fence> lFence = new Fence();
-    if (!convertTo(lFence.get(), fence)) {
-        LOG(ERROR) << "TWOmxBufferProducer::cancelBuffer - "
-                "Invalid input fence";
-        return toStatus(BAD_VALUE);
-    }
-    return toStatus(mBase->cancelBuffer(static_cast<int>(slot), lFence));
-}
-
-Return<void> TWOmxBufferProducer::query(int32_t what, query_cb _hidl_cb) {
-    int lValue;
-    int lReturn = mBase->query(static_cast<int>(what), &lValue);
-    _hidl_cb(static_cast<int32_t>(lReturn), static_cast<int32_t>(lValue));
-    return Void();
-}
-
-Return<void> TWOmxBufferProducer::connect(
-        const sp<IOmxProducerListener>& listener,
-        int32_t api, bool producerControlledByApp, connect_cb _hidl_cb) {
-    sp<IProducerListener> lListener = listener == nullptr ?
-            nullptr : new LWOmxProducerListener(listener);
-    IGraphicBufferProducer::QueueBufferOutput lOutput;
-    status_t status = mBase->connect(lListener,
-            static_cast<int>(api),
-            producerControlledByApp,
-            &lOutput);
-
-    QueueBufferOutput tOutput;
-    std::vector<std::vector<native_handle_t*> > nhAA;
-    if (!wrapAs(&tOutput, &nhAA, lOutput)) {
-        LOG(ERROR) << "TWOmxBufferProducer::connect - "
-                "Invalid output";
-        _hidl_cb(toStatus(status), tOutput);
-        return Void();
-    }
-
-    _hidl_cb(toStatus(status), tOutput);
-    for (auto& nhA : nhAA) {
-        for (auto& nh : nhA) {
-            native_handle_delete(nh);
-        }
-    }
-    return Void();
-}
-
-Return<Status> TWOmxBufferProducer::disconnect(
-        int32_t api, DisconnectMode mode) {
-    return toStatus(mBase->disconnect(
-            static_cast<int>(api),
-            toGuiDisconnectMode(mode)));
-}
-
-Return<Status> TWOmxBufferProducer::setSidebandStream(const hidl_handle& stream) {
-    return toStatus(mBase->setSidebandStream(NativeHandle::create(
-            native_handle_clone(stream), true)));
-}
-
-Return<void> TWOmxBufferProducer::allocateBuffers(
-        uint32_t width, uint32_t height, PixelFormat format, uint32_t usage) {
-    mBase->allocateBuffers(
-            width, height,
-            static_cast<::android::PixelFormat>(format),
-            usage);
-    return Void();
-}
-
-Return<Status> TWOmxBufferProducer::allowAllocation(bool allow) {
-    return toStatus(mBase->allowAllocation(allow));
-}
-
-Return<Status> TWOmxBufferProducer::setGenerationNumber(uint32_t generationNumber) {
-    return toStatus(mBase->setGenerationNumber(generationNumber));
-}
-
-Return<void> TWOmxBufferProducer::getConsumerName(getConsumerName_cb _hidl_cb) {
-    _hidl_cb(mBase->getConsumerName().string());
-    return Void();
-}
-
-Return<Status> TWOmxBufferProducer::setSharedBufferMode(bool sharedBufferMode) {
-    return toStatus(mBase->setSharedBufferMode(sharedBufferMode));
-}
-
-Return<Status> TWOmxBufferProducer::setAutoRefresh(bool autoRefresh) {
-    return toStatus(mBase->setAutoRefresh(autoRefresh));
-}
-
-Return<Status> TWOmxBufferProducer::setDequeueTimeout(int64_t timeoutNs) {
-    return toStatus(mBase->setDequeueTimeout(timeoutNs));
-}
-
-Return<void> TWOmxBufferProducer::getLastQueuedBuffer(
-        getLastQueuedBuffer_cb _hidl_cb) {
-    sp<GraphicBuffer> lOutBuffer = new GraphicBuffer();
-    sp<Fence> lOutFence = new Fence();
-    float lOutTransformMatrix[16];
-    status_t status = mBase->getLastQueuedBuffer(
-            &lOutBuffer, &lOutFence, lOutTransformMatrix);
-
-    AnwBuffer tOutBuffer;
-    if (lOutBuffer != nullptr) {
-        wrapAs(&tOutBuffer, *lOutBuffer);
-    }
-    hidl_handle tOutFence;
-    native_handle_t* nh = nullptr;
-    if ((lOutFence == nullptr) || !wrapAs(&tOutFence, &nh, *lOutFence)) {
-        LOG(ERROR) << "TWOmxBufferProducer::getLastQueuedBuffer - "
-                "Invalid output fence";
-        _hidl_cb(toStatus(status),
-                tOutBuffer,
-                tOutFence,
-                hidl_array<float, 16>());
-        return Void();
-    }
-    hidl_array<float, 16> tOutTransformMatrix(lOutTransformMatrix);
-
-    _hidl_cb(toStatus(status), tOutBuffer, tOutFence, tOutTransformMatrix);
-    native_handle_delete(nh);
-    return Void();
-}
-
-Return<void> TWOmxBufferProducer::getFrameTimestamps(
-        getFrameTimestamps_cb _hidl_cb) {
-    ::android::FrameEventHistoryDelta lDelta;
-    mBase->getFrameTimestamps(&lDelta);
-
-    FrameEventHistoryDelta tDelta;
-    std::vector<std::vector<native_handle_t*> > nhAA;
-    if (!wrapAs(&tDelta, &nhAA, lDelta)) {
-        LOG(ERROR) << "TWOmxBufferProducer::getFrameTimestamps - "
-                "Invalid output frame timestamps";
-        _hidl_cb(tDelta);
-        return Void();
-    }
-
-    _hidl_cb(tDelta);
-    for (auto& nhA : nhAA) {
-        for (auto& nh : nhA) {
-            native_handle_delete(nh);
-        }
-    }
-    return Void();
-}
-
-Return<void> TWOmxBufferProducer::getUniqueId(getUniqueId_cb _hidl_cb) {
-    uint64_t outId;
-    status_t status = mBase->getUniqueId(&outId);
-    _hidl_cb(toStatus(status), outId);
-    return Void();
-}
-
-// LWOmxBufferProducer
-
-LWOmxBufferProducer::LWOmxBufferProducer(sp<IOmxBufferProducer> const& base) :
-    mBase(base) {
-}
-
-status_t LWOmxBufferProducer::requestBuffer(int slot, sp<GraphicBuffer>* buf) {
-    *buf = new GraphicBuffer();
-    status_t fnStatus;
-    status_t transStatus = toStatusT(mBase->requestBuffer(
-            static_cast<int32_t>(slot),
-            [&fnStatus, &buf] (Status status, AnwBuffer const& buffer) {
-                fnStatus = toStatusT(status);
-                if (!convertTo(buf->get(), buffer)) {
-                    fnStatus = fnStatus == NO_ERROR ? BAD_VALUE : fnStatus;
-                }
-            }));
-    return transStatus == NO_ERROR ? fnStatus : transStatus;
-}
-
-status_t LWOmxBufferProducer::setMaxDequeuedBufferCount(
-        int maxDequeuedBuffers) {
-    return toStatusT(mBase->setMaxDequeuedBufferCount(
-            static_cast<int32_t>(maxDequeuedBuffers)));
-}
-
-status_t LWOmxBufferProducer::setAsyncMode(bool async) {
-    return toStatusT(mBase->setAsyncMode(async));
-}
-
-status_t LWOmxBufferProducer::dequeueBuffer(
-        int* slot, sp<Fence>* fence,
-        uint32_t w, uint32_t h, ::android::PixelFormat format,
-        uint32_t usage, FrameEventHistoryDelta* outTimestamps) {
-    *fence = new Fence();
-    status_t fnStatus;
-    status_t transStatus = toStatusT(mBase->dequeueBuffer(
-            w, h, static_cast<PixelFormat>(format), usage,
-            outTimestamps != nullptr,
-            [&fnStatus, slot, fence, outTimestamps] (
-                    Status status,
-                    int32_t tSlot,
-                    hidl_handle const& tFence,
-                    IOmxBufferProducer::FrameEventHistoryDelta const& tTs) {
-                fnStatus = toStatusT(status);
-                *slot = tSlot;
-                if (!convertTo(fence->get(), tFence)) {
-                    LOG(ERROR) << "LWOmxBufferProducer::dequeueBuffer - "
-                            "Invalid output fence";
-                    fnStatus = fnStatus == NO_ERROR ? BAD_VALUE : fnStatus;
-                }
-                if (outTimestamps && !convertTo(outTimestamps, tTs)) {
-                    LOG(ERROR) << "LWOmxBufferProducer::dequeueBuffer - "
-                            "Invalid output timestamps";
-                    fnStatus = fnStatus == NO_ERROR ? BAD_VALUE : fnStatus;
-                }
-            }));
-    return transStatus == NO_ERROR ? fnStatus : transStatus;
-}
-
-status_t LWOmxBufferProducer::detachBuffer(int slot) {
-    return toStatusT(mBase->detachBuffer(static_cast<int>(slot)));
-}
-
-status_t LWOmxBufferProducer::detachNextBuffer(
-        sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence) {
-    *outBuffer = new GraphicBuffer();
-    *outFence = new Fence();
-    status_t fnStatus;
-    status_t transStatus = toStatusT(mBase->detachNextBuffer(
-            [&fnStatus, outBuffer, outFence] (
-                    Status status,
-                    AnwBuffer const& tBuffer,
-                    hidl_handle const& tFence) {
-                fnStatus = toStatusT(status);
-                if (!convertTo(outFence->get(), tFence)) {
-                    LOG(ERROR) << "LWOmxBufferProducer::detachNextBuffer - "
-                            "Invalid output fence";
-                    fnStatus = fnStatus == NO_ERROR ? BAD_VALUE : fnStatus;
-                }
-                if (!convertTo(outBuffer->get(), tBuffer)) {
-                    LOG(ERROR) << "LWOmxBufferProducer::detachNextBuffer - "
-                            "Invalid output buffer";
-                    fnStatus = fnStatus == NO_ERROR ? BAD_VALUE : fnStatus;
-                }
-            }));
-    return transStatus == NO_ERROR ? fnStatus : transStatus;
-}
-
-status_t LWOmxBufferProducer::attachBuffer(
-        int* outSlot, const sp<GraphicBuffer>& buffer) {
-    AnwBuffer tBuffer;
-    wrapAs(&tBuffer, *buffer);
-    status_t fnStatus;
-    status_t transStatus = toStatusT(mBase->attachBuffer(tBuffer,
-            [&fnStatus, outSlot] (Status status, int32_t slot) {
-                fnStatus = toStatusT(status);
-                *outSlot = slot;
-            }));
-    return transStatus == NO_ERROR ? fnStatus : transStatus;
-}
-
-status_t LWOmxBufferProducer::queueBuffer(
-        int slot,
-        const QueueBufferInput& input,
-        QueueBufferOutput* output) {
-    IOmxBufferProducer::QueueBufferInput tInput;
-    native_handle_t* nh;
-    if (!wrapAs(&tInput, &nh, input)) {
-        LOG(ERROR) << "LWOmxBufferProducer::queueBuffer - "
-                "Invalid input";
-        return BAD_VALUE;
-    }
-    status_t fnStatus;
-    status_t transStatus = toStatusT(mBase->queueBuffer(slot, tInput,
-            [&fnStatus, output] (
-                    Status status,
-                    IOmxBufferProducer::QueueBufferOutput const& tOutput) {
-                fnStatus = toStatusT(status);
-                if (!convertTo(output, tOutput)) {
-                    LOG(ERROR) << "LWOmxBufferProducer::queueBuffer - "
-                            "Invalid output";
-                    fnStatus = fnStatus == NO_ERROR ? BAD_VALUE : fnStatus;
-                }
-            }));
-    native_handle_delete(nh);
-    return transStatus == NO_ERROR ? fnStatus : transStatus;
-}
-
-status_t LWOmxBufferProducer::cancelBuffer(int slot, const sp<Fence>& fence) {
-    hidl_handle tFence;
-    native_handle_t* nh = nullptr;
-    if ((fence == nullptr) || !wrapAs(&tFence, &nh, *fence)) {
-        LOG(ERROR) << "LWOmxBufferProducer::cancelBuffer - "
-                "Invalid input fence";
-        return BAD_VALUE;
-    }
-
-    status_t status = toStatusT(mBase->cancelBuffer(
-            static_cast<int32_t>(slot), tFence));
-    native_handle_delete(nh);
-    return status;
-}
-
-int LWOmxBufferProducer::query(int what, int* value) {
-    int result;
-    status_t transStatus = toStatusT(mBase->query(
-            static_cast<int32_t>(what),
-            [&result, value] (int32_t tResult, int32_t tValue) {
-                result = static_cast<int>(tResult);
-                *value = static_cast<int>(tValue);
-            }));
-    return transStatus == NO_ERROR ? result : static_cast<int>(transStatus);
-}
-
-status_t LWOmxBufferProducer::connect(
-        const sp<IProducerListener>& listener, int api,
-        bool producerControlledByApp, QueueBufferOutput* output) {
-    sp<IOmxProducerListener> tListener = listener == nullptr ?
-            nullptr : new TWOmxProducerListener(listener);
-    status_t fnStatus;
-    status_t transStatus = toStatusT(mBase->connect(
-            tListener, static_cast<int32_t>(api), producerControlledByApp,
-            [&fnStatus, output] (
-                    Status status,
-                    IOmxBufferProducer::QueueBufferOutput const& tOutput) {
-                fnStatus = toStatusT(status);
-                if (!convertTo(output, tOutput)) {
-                    LOG(ERROR) << "LWOmxBufferProducer::connect - "
-                            "Invalid output";
-                    fnStatus = fnStatus == NO_ERROR ? BAD_VALUE : fnStatus;
-                }
-            }));
-    return transStatus == NO_ERROR ? fnStatus : transStatus;
-}
-
-status_t LWOmxBufferProducer::disconnect(int api, DisconnectMode mode) {
-    return toStatusT(mBase->disconnect(
-            static_cast<int32_t>(api), toOmxDisconnectMode(mode)));
-}
-
-status_t LWOmxBufferProducer::setSidebandStream(
-        const sp<NativeHandle>& stream) {
-    return toStatusT(mBase->setSidebandStream(stream->handle()));
-}
-
-void LWOmxBufferProducer::allocateBuffers(uint32_t width, uint32_t height,
-        ::android::PixelFormat format, uint32_t usage) {
-    mBase->allocateBuffers(
-            width, height, static_cast<PixelFormat>(format), usage);
-}
-
-status_t LWOmxBufferProducer::allowAllocation(bool allow) {
-    return toStatusT(mBase->allowAllocation(allow));
-}
-
-status_t LWOmxBufferProducer::setGenerationNumber(uint32_t generationNumber) {
-    return toStatusT(mBase->setGenerationNumber(generationNumber));
-}
-
-String8 LWOmxBufferProducer::getConsumerName() const {
-    String8 lName;
-    mBase->getConsumerName([&lName] (hidl_string const& name) {
-                lName = name.c_str();
-            });
-    return lName;
-}
-
-status_t LWOmxBufferProducer::setSharedBufferMode(bool sharedBufferMode) {
-    return toStatusT(mBase->setSharedBufferMode(sharedBufferMode));
-}
-
-status_t LWOmxBufferProducer::setAutoRefresh(bool autoRefresh) {
-    return toStatusT(mBase->setAutoRefresh(autoRefresh));
-}
-
-status_t LWOmxBufferProducer::setDequeueTimeout(nsecs_t timeout) {
-    return toStatusT(mBase->setDequeueTimeout(static_cast<int64_t>(timeout)));
-}
-
-status_t LWOmxBufferProducer::getLastQueuedBuffer(
-        sp<GraphicBuffer>* outBuffer,
-        sp<Fence>* outFence,
-        float outTransformMatrix[16]) {
-    status_t fnStatus;
-    status_t transStatus = toStatusT(mBase->getLastQueuedBuffer(
-            [&fnStatus, outBuffer, outFence, &outTransformMatrix] (
-                    Status status,
-                    AnwBuffer const& buffer,
-                    hidl_handle const& fence,
-                    hidl_array<float, 16> const& transformMatrix) {
-                fnStatus = toStatusT(status);
-                *outBuffer = new GraphicBuffer();
-                if (!convertTo(outBuffer->get(), buffer)) {
-                    LOG(ERROR) << "LWOmxBufferProducer::getLastQueuedBuffer - "
-                            "Invalid output buffer";
-                    fnStatus = fnStatus == NO_ERROR ? BAD_VALUE : fnStatus;
-                }
-                *outFence = new Fence();
-                if (!convertTo(outFence->get(), fence)) {
-                    LOG(ERROR) << "LWOmxBufferProducer::getLastQueuedBuffer - "
-                            "Invalid output fence";
-                    fnStatus = fnStatus == NO_ERROR ? BAD_VALUE : fnStatus;
-                }
-                std::copy(transformMatrix.data(),
-                        transformMatrix.data() + 16,
-                        outTransformMatrix);
-            }));
-    return transStatus == NO_ERROR ? fnStatus : transStatus;
-}
-
-void LWOmxBufferProducer::getFrameTimestamps(FrameEventHistoryDelta* outDelta) {
-    mBase->getFrameTimestamps([outDelta] (
-            IOmxBufferProducer::FrameEventHistoryDelta const& tDelta) {
-                convertTo(outDelta, tDelta);
-            });
-}
-
-status_t LWOmxBufferProducer::getUniqueId(uint64_t* outId) const {
-    status_t fnStatus;
-    status_t transStatus = toStatusT(mBase->getUniqueId(
-            [&fnStatus, outId] (Status status, uint64_t id) {
-                fnStatus = toStatusT(status);
-                *outId = id;
-            }));
-    return transStatus == NO_ERROR ? fnStatus : transStatus;
-}
-
-}  // namespace implementation
-}  // namespace V1_0
-}  // namespace omx
-}  // namespace media
-}  // namespace hardware
-}  // namespace android
diff --git a/media/libstagefright/omx/hal/1.0/impl/WOmxBufferProducer.h b/media/libstagefright/omx/hal/1.0/impl/WOmxBufferProducer.h
deleted file mode 100644
index 8520160..0000000
--- a/media/libstagefright/omx/hal/1.0/impl/WOmxBufferProducer.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright 2016, 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 ANDROID_HARDWARE_MEDIA_OMX_V1_0_WOMXBUFFERPRODUCER_H
-#define ANDROID_HARDWARE_MEDIA_OMX_V1_0_WOMXBUFFERPRODUCER_H
-
-#include <hidl/MQDescriptor.h>
-#include <hidl/Status.h>
-
-#include <binder/Binder.h>
-#include <gui/IGraphicBufferProducer.h>
-#include <gui/IProducerListener.h>
-
-#include <android/hardware/media/omx/1.0/IOmxBufferProducer.h>
-
-namespace android {
-namespace hardware {
-namespace media {
-namespace omx {
-namespace V1_0 {
-namespace implementation {
-
-using ::android::hardware::graphics::common::V1_0::PixelFormat;
-using ::android::hardware::media::omx::V1_0::IOmxBufferProducer;
-using ::android::hardware::media::omx::V1_0::IOmxProducerListener;
-using ::android::hardware::media::omx::V1_0::Status;
-using ::android::hardware::media::V1_0::AnwBuffer;
-using ::android::hidl::base::V1_0::IBase;
-using ::android::hardware::hidl_array;
-using ::android::hardware::hidl_memory;
-using ::android::hardware::hidl_string;
-using ::android::hardware::hidl_vec;
-using ::android::hardware::Return;
-using ::android::hardware::Void;
-using ::android::sp;
-
-using ::android::IGraphicBufferProducer;
-using ::android::BnGraphicBufferProducer;
-using ::android::IProducerListener;
-
-struct TWOmxBufferProducer : public IOmxBufferProducer {
-    sp<IGraphicBufferProducer> mBase;
-    TWOmxBufferProducer(sp<IGraphicBufferProducer> const& base);
-    Return<void> requestBuffer(int32_t slot, requestBuffer_cb _hidl_cb)
-            override;
-    Return<Status> setMaxDequeuedBufferCount(int32_t maxDequeuedBuffers)
-            override;
-    Return<Status> setAsyncMode(bool async) override;
-    Return<void> dequeueBuffer(
-            uint32_t width, uint32_t height, PixelFormat format, uint32_t usage,
-            bool getFrameTimestamps, dequeueBuffer_cb _hidl_cb) override;
-    Return<Status> detachBuffer(int32_t slot) override;
-    Return<void> detachNextBuffer(detachNextBuffer_cb _hidl_cb) override;
-    Return<void> attachBuffer(const AnwBuffer& buffer, attachBuffer_cb _hidl_cb)
-            override;
-    Return<void> queueBuffer(
-            int32_t slot, const IOmxBufferProducer::QueueBufferInput& input,
-            queueBuffer_cb _hidl_cb) override;
-    Return<Status> cancelBuffer(int32_t slot, const hidl_handle& fence)
-            override;
-    Return<void> query(int32_t what, query_cb _hidl_cb) override;
-    Return<void> connect(const sp<IOmxProducerListener>& listener,
-            int32_t api, bool producerControlledByApp,
-            connect_cb _hidl_cb) override;
-    Return<Status> disconnect(
-            int32_t api,
-            IOmxBufferProducer::DisconnectMode mode) override;
-    Return<Status> setSidebandStream(const hidl_handle& stream) override;
-    Return<void> allocateBuffers(
-            uint32_t width, uint32_t height,
-            PixelFormat format, uint32_t usage) override;
-    Return<Status> allowAllocation(bool allow) override;
-    Return<Status> setGenerationNumber(uint32_t generationNumber) override;
-    Return<void> getConsumerName(getConsumerName_cb _hidl_cb) override;
-    Return<Status> setSharedBufferMode(bool sharedBufferMode) override;
-    Return<Status> setAutoRefresh(bool autoRefresh) override;
-    Return<Status> setDequeueTimeout(int64_t timeoutNs) override;
-    Return<void> getLastQueuedBuffer(getLastQueuedBuffer_cb _hidl_cb) override;
-    Return<void> getFrameTimestamps(getFrameTimestamps_cb _hidl_cb) override;
-    Return<void> getUniqueId(getUniqueId_cb _hidl_cb) override;
-};
-
-struct LWOmxBufferProducer : public BnGraphicBufferProducer {
-    sp<IOmxBufferProducer> mBase;
-    LWOmxBufferProducer(sp<IOmxBufferProducer> const& base);
-
-    status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) override;
-    status_t setMaxDequeuedBufferCount(int maxDequeuedBuffers) override;
-    status_t setAsyncMode(bool async) override;
-    status_t dequeueBuffer(int* slot, sp<Fence>* fence, uint32_t w,
-            uint32_t h, ::android::PixelFormat format, uint32_t usage,
-            FrameEventHistoryDelta* outTimestamps) override;
-    status_t detachBuffer(int slot) override;
-    status_t detachNextBuffer(sp<GraphicBuffer>* outBuffer, sp<Fence>* outFence)
-            override;
-    status_t attachBuffer(int* outSlot, const sp<GraphicBuffer>& buffer)
-            override;
-    status_t queueBuffer(int slot,
-            const QueueBufferInput& input,
-            QueueBufferOutput* output) override;
-    status_t cancelBuffer(int slot, const sp<Fence>& fence) override;
-    int query(int what, int* value) override;
-    status_t connect(const sp<IProducerListener>& listener, int api,
-            bool producerControlledByApp, QueueBufferOutput* output) override;
-    status_t disconnect(int api, DisconnectMode mode = DisconnectMode::Api)
-            override;
-    status_t setSidebandStream(const sp<NativeHandle>& stream) override;
-    void allocateBuffers(uint32_t width, uint32_t height,
-            ::android::PixelFormat format, uint32_t usage) override;
-    status_t allowAllocation(bool allow) override;
-    status_t setGenerationNumber(uint32_t generationNumber) override;
-    String8 getConsumerName() const override;
-    status_t setSharedBufferMode(bool sharedBufferMode) override;
-    status_t setAutoRefresh(bool autoRefresh) override;
-    status_t setDequeueTimeout(nsecs_t timeout) override;
-    status_t getLastQueuedBuffer(sp<GraphicBuffer>* outBuffer,
-          sp<Fence>* outFence, float outTransformMatrix[16]) override;
-    void getFrameTimestamps(FrameEventHistoryDelta* outDelta) override;
-    status_t getUniqueId(uint64_t* outId) const override;
-};
-
-}  // namespace implementation
-}  // namespace V1_0
-}  // namespace omx
-}  // namespace media
-}  // namespace hardware
-}  // namespace android
-
-#endif  // ANDROID_HARDWARE_MEDIA_OMX_V1_0_WOMXBUFFERPRODUCER_H
diff --git a/media/libstagefright/omx/tests/OMXHarness.cpp b/media/libstagefright/omx/tests/OMXHarness.cpp
index 8817cf9..cbca461 100644
--- a/media/libstagefright/omx/tests/OMXHarness.cpp
+++ b/media/libstagefright/omx/tests/OMXHarness.cpp
@@ -40,7 +40,7 @@
 #include <media/stagefright/SimpleDecodingSource.h>
 #include <media/OMXBuffer.h>
 #include <android/hardware/media/omx/1.0/IOmx.h>
-#include <omx/hal/1.0/utils/WOmx.h>
+#include <media/omx/1.0/WOmx.h>
 
 #define DEFAULT_TIMEOUT         500000