diff --git a/media/libmedia/MediaPlayer2Manager.cpp b/media/libmedia/MediaPlayer2Manager.cpp
index 76b4c0b..4c0a7ac 100644
--- a/media/libmedia/MediaPlayer2Manager.cpp
+++ b/media/libmedia/MediaPlayer2Manager.cpp
@@ -82,7 +82,6 @@
 using android::BAD_VALUE;
 using android::NOT_ENOUGH_DATA;
 using android::Parcel;
-using android::media::VolumeShaper;
 
 // Max number of entries in the filter.
 const int kMaxFilterSize = 64;  // I pulled that out of thin air.
@@ -503,7 +502,6 @@
     mStatus = NO_INIT;
     mAudioSessionId = audioSessionId;
     mUid = uid;
-    mRetransmitEndpointValid = false;
     mAudioAttributes = NULL;
 
 #if CALLBACK_ANTAGONIZER
@@ -605,14 +603,6 @@
         return status;
     }
 
-    // Set the re-transmission endpoint if one was chosen.
-    if (mRetransmitEndpointValid) {
-        status = p->setRetransmitEndpoint(&mRetransmitEndpoint);
-        if (status != NO_ERROR) {
-            ALOGE("setRetransmitEndpoint error: %d", status);
-        }
-    }
-
     return status;
 }
 
@@ -927,34 +917,6 @@
     return OK;
 }
 
-VolumeShaper::Status MediaPlayer2Manager::Client::applyVolumeShaper(
-        const sp<VolumeShaper::Configuration>& configuration,
-        const sp<VolumeShaper::Operation>& operation) {
-    // for hardware output, call player instead
-    ALOGV("Client::applyVolumeShaper(%p)", this);
-    sp<MediaPlayer2Interface> p = getPlayer();
-    {
-        Mutex::Autolock l(mLock);
-        if (mAudioOutput.get() != nullptr) {
-            return mAudioOutput->applyVolumeShaper(configuration, operation);
-        }
-    }
-    return VolumeShaper::Status(INVALID_OPERATION);
-}
-
-sp<VolumeShaper::State> MediaPlayer2Manager::Client::getVolumeShaperState(int id) {
-    // for hardware output, call player instead
-    ALOGV("Client::getVolumeShaperState(%p)", this);
-    sp<MediaPlayer2Interface> p = getPlayer();
-    {
-        Mutex::Autolock l(mLock);
-        if (mAudioOutput.get() != nullptr) {
-            return mAudioOutput->getVolumeShaperState(id);
-        }
-    }
-    return nullptr;
-}
-
 status_t MediaPlayer2Manager::Client::seekTo(int msec, MediaPlayer2SeekMode mode)
 {
     ALOGV("[%d] seekTo(%d, %d)", mConnId, msec, mode);
@@ -966,7 +928,6 @@
 status_t MediaPlayer2Manager::Client::reset()
 {
     ALOGV("[%d] reset", mConnId);
-    mRetransmitEndpointValid = false;
     sp<MediaPlayer2Interface> p = getPlayer();
     if (p == 0) return UNKNOWN_ERROR;
     return p->reset();
@@ -1069,53 +1030,6 @@
     return p->getParameter(key, reply);
 }
 
-status_t MediaPlayer2Manager::Client::setRetransmitEndpoint(
-        const struct sockaddr_in* endpoint) {
-
-    if (NULL != endpoint) {
-        uint32_t a = ntohl(endpoint->sin_addr.s_addr);
-        uint16_t p = ntohs(endpoint->sin_port);
-        ALOGV("[%d] setRetransmitEndpoint(%u.%u.%u.%u:%hu)", mConnId,
-                (a >> 24), (a >> 16) & 0xFF, (a >> 8) & 0xFF, (a & 0xFF), p);
-    } else {
-        ALOGV("[%d] setRetransmitEndpoint = <none>", mConnId);
-    }
-
-    // Right now, the only valid time to set a retransmit endpoint is before
-    // setDataSource.
-
-    if (NULL != endpoint) {
-        Mutex::Autolock lock(mLock);
-        mRetransmitEndpoint = *endpoint;
-        mRetransmitEndpointValid = true;
-    } else {
-        Mutex::Autolock lock(mLock);
-        mRetransmitEndpointValid = false;
-    }
-
-    return NO_ERROR;
-}
-
-status_t MediaPlayer2Manager::Client::getRetransmitEndpoint(
-        struct sockaddr_in* endpoint)
-{
-    if (NULL == endpoint)
-        return BAD_VALUE;
-
-    sp<MediaPlayer2Interface> p = getPlayer();
-
-    if (p != NULL)
-        return p->getRetransmitEndpoint(endpoint);
-
-    Mutex::Autolock lock(mLock);
-    if (!mRetransmitEndpointValid)
-        return NO_INIT;
-
-    *endpoint = mRetransmitEndpoint;
-
-    return NO_ERROR;
-}
-
 void MediaPlayer2Manager::Client::notify(
         const wp<MediaPlayer2Engine> &listener, int msg, int ext1, int ext2, const Parcel *obj)
 {
@@ -1319,7 +1233,6 @@
       mSendLevel(0.0),
       mAuxEffectId(0),
       mFlags(AUDIO_OUTPUT_FLAG_NONE),
-      mVolumeHandler(new media::VolumeHandler()),
       mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE),
       mRoutedDeviceId(AUDIO_PORT_HANDLE_NONE),
       mDeviceCallbackEnabled(false),
@@ -1790,24 +1703,6 @@
     ALOGV("setVolume");
     t->setVolume(mLeftVolume, mRightVolume);
 
-    // Restore VolumeShapers for the MediaPlayer2 in case the track was recreated
-    // due to an output sink error (e.g. offload to non-offload switch).
-    mVolumeHandler->forall([&t](const VolumeShaper &shaper) -> VolumeShaper::Status {
-        sp<VolumeShaper::Operation> operationToEnd =
-                new VolumeShaper::Operation(shaper.mOperation);
-        // TODO: Ideally we would restore to the exact xOffset position
-        // as returned by getVolumeShaperState(), but we don't have that
-        // information when restoring at the client unless we periodically poll
-        // the server or create shared memory state.
-        //
-        // For now, we simply advance to the end of the VolumeShaper effect
-        // if it has been started.
-        if (shaper.isStarted()) {
-            operationToEnd->setNormalizedTime(1.f);
-        }
-        return t->applyVolumeShaper(shaper.mConfiguration, operationToEnd);
-    });
-
     mSampleRateHz = sampleRate;
     mFlags = flags;
     mMsecsPerFrame = 1E3f / (mPlaybackRate.mSpeed * sampleRate);
@@ -1852,9 +1747,6 @@
         mTrack->setVolume(mLeftVolume, mRightVolume);
         mTrack->setAuxEffectSendLevel(mSendLevel);
         status_t status = mTrack->start();
-        if (status == NO_ERROR) {
-            mVolumeHandler->setStarted();
-        }
         return status;
     }
     return NO_INIT;
@@ -2091,67 +1983,6 @@
     return NO_ERROR;
 }
 
-VolumeShaper::Status MediaPlayer2Manager::AudioOutput::applyVolumeShaper(
-                const sp<VolumeShaper::Configuration>& configuration,
-                const sp<VolumeShaper::Operation>& operation)
-{
-    Mutex::Autolock lock(mLock);
-    ALOGV("AudioOutput::applyVolumeShaper");
-
-    mVolumeHandler->setIdIfNecessary(configuration);
-
-    VolumeShaper::Status status;
-    if (mTrack != 0) {
-        status = mTrack->applyVolumeShaper(configuration, operation);
-        if (status >= 0) {
-            (void)mVolumeHandler->applyVolumeShaper(configuration, operation);
-            if (mTrack->isPlaying()) { // match local AudioTrack to properly restore.
-                mVolumeHandler->setStarted();
-            }
-        }
-    } else {
-        // VolumeShapers are not affected when a track moves between players for
-        // gapless playback (setNextMediaPlayer).
-        // We forward VolumeShaper operations that do not change configuration
-        // to the new player so that unducking may occur as expected.
-        // Unducking is an idempotent operation, same if applied back-to-back.
-        if (configuration->getType() == VolumeShaper::Configuration::TYPE_ID
-                && mNextOutput != nullptr) {
-            ALOGV("applyVolumeShaper: Attempting to forward missed operation: %s %s",
-                    configuration->toString().c_str(), operation->toString().c_str());
-            Mutex::Autolock nextLock(mNextOutput->mLock);
-
-            // recycled track should be forwarded from this AudioSink by switchToNextOutput
-            sp<AudioTrack> track = mNextOutput->mRecycledTrack;
-            if (track != nullptr) {
-                ALOGD("Forward VolumeShaper operation to recycled track %p", track.get());
-                (void)track->applyVolumeShaper(configuration, operation);
-            } else {
-                // There is a small chance that the unduck occurs after the next
-                // player has already started, but before it is registered to receive
-                // the unduck command.
-                track = mNextOutput->mTrack;
-                if (track != nullptr) {
-                    ALOGD("Forward VolumeShaper operation to track %p", track.get());
-                    (void)track->applyVolumeShaper(configuration, operation);
-                }
-            }
-        }
-        status = mVolumeHandler->applyVolumeShaper(configuration, operation);
-    }
-    return status;
-}
-
-sp<VolumeShaper::State> MediaPlayer2Manager::AudioOutput::getVolumeShaperState(int id)
-{
-    Mutex::Autolock lock(mLock);
-    if (mTrack != 0) {
-        return mTrack->getVolumeShaperState(id);
-    } else {
-        return mVolumeHandler->getVolumeShaperState(id);
-    }
-}
-
 // static
 void MediaPlayer2Manager::AudioOutput::CallbackWrapper(
         int event, void *cookie, void *info) {
diff --git a/media/libmedia/MediaPlayer2Manager.h b/media/libmedia/MediaPlayer2Manager.h
index cdbbc70..95b875b 100644
--- a/media/libmedia/MediaPlayer2Manager.h
+++ b/media/libmedia/MediaPlayer2Manager.h
@@ -132,11 +132,6 @@
         virtual status_t        setParameters(const String8& keyValuePairs);
         virtual String8         getParameters(const String8& keys);
 
-        virtual media::VolumeShaper::Status applyVolumeShaper(
-                                        const sp<media::VolumeShaper::Configuration>& configuration,
-                                        const sp<media::VolumeShaper::Operation>& operation) override;
-        virtual sp<media::VolumeShaper::State> getVolumeShaperState(int id) override;
-
         // AudioRouting
         virtual status_t        setOutputDevice(audio_port_handle_t deviceId);
         virtual status_t        getRoutedDeviceId(audio_port_handle_t* deviceId);
@@ -170,7 +165,6 @@
         float                   mSendLevel;
         int                     mAuxEffectId;
         audio_output_flags_t    mFlags;
-        sp<media::VolumeHandler>       mVolumeHandler;
         audio_port_handle_t     mSelectedDeviceId;
         audio_port_handle_t     mRoutedDeviceId;
         bool                    mDeviceCallbackEnabled;
@@ -278,15 +272,8 @@
         virtual status_t        attachAuxEffect(int effectId);
         virtual status_t        setParameter(int key, const Parcel &request);
         virtual status_t        getParameter(int key, Parcel *reply);
-        virtual status_t        setRetransmitEndpoint(const struct sockaddr_in* endpoint);
-        virtual status_t        getRetransmitEndpoint(struct sockaddr_in* endpoint);
         virtual status_t        setNextPlayer(const sp<MediaPlayer2Engine>& player);
 
-        virtual media::VolumeShaper::Status applyVolumeShaper(
-                                        const sp<media::VolumeShaper::Configuration>& configuration,
-                                        const sp<media::VolumeShaper::Operation>& operation) override;
-        virtual sp<media::VolumeShaper::State> getVolumeShaperState(int id) override;
-
         virtual status_t        setDataSource(const sp<DataSourceDesc> &dsd);
 
         static  void            notify(const wp<MediaPlayer2Engine> &listener, int msg,
@@ -363,8 +350,6 @@
                     audio_attributes_t *         mAudioAttributes;
                     uid_t                        mUid;
                     sp<ANativeWindowWrapper>     mConnectedWindow;
-                    struct sockaddr_in           mRetransmitEndpoint;
-                    bool                         mRetransmitEndpointValid;
                     sp<Client>                   mNextClient;
 
         // Metadata filters.
diff --git a/media/libmedia/include/media/MediaPlayer2Engine.h b/media/libmedia/include/media/MediaPlayer2Engine.h
index 29df2d6..2d1a24b 100644
--- a/media/libmedia/include/media/MediaPlayer2Engine.h
+++ b/media/libmedia/include/media/MediaPlayer2Engine.h
@@ -23,7 +23,6 @@
 #include <system/audio.h>
 
 #include <media/MediaSource.h>
-#include <media/VolumeShaper.h>
 
 // Fwd decl to make sure everyone agrees that the scope of struct sockaddr_in is
 // global, and not in android::
@@ -77,15 +76,8 @@
     virtual status_t        attachAuxEffect(int effectId) = 0;
     virtual status_t        setParameter(int key, const Parcel& request) = 0;
     virtual status_t        getParameter(int key, Parcel* reply) = 0;
-    virtual status_t        setRetransmitEndpoint(const struct sockaddr_in* endpoint) = 0;
-    virtual status_t        getRetransmitEndpoint(struct sockaddr_in* endpoint) = 0;
     virtual status_t        setNextPlayer(const sp<MediaPlayer2Engine>& next) = 0;
 
-    virtual media::VolumeShaper::Status applyVolumeShaper(
-                                    const sp<media::VolumeShaper::Configuration>& configuration,
-                                    const sp<media::VolumeShaper::Operation>& operation) = 0;
-    virtual sp<media::VolumeShaper::State> getVolumeShaperState(int id) = 0;
-
     // Modular DRM
     virtual status_t        prepareDrm(const uint8_t uuid[16],
                                     const Vector<uint8_t>& drmSessionId) = 0;
diff --git a/media/libmedia/include/media/MediaPlayer2Interface.h b/media/libmedia/include/media/MediaPlayer2Interface.h
index c2cc6e6..be300bb 100644
--- a/media/libmedia/include/media/MediaPlayer2Interface.h
+++ b/media/libmedia/include/media/MediaPlayer2Interface.h
@@ -138,11 +138,6 @@
         virtual status_t    setParameters(const String8& /* keyValuePairs */) { return NO_ERROR; }
         virtual String8     getParameters(const String8& /* keys */) { return String8::empty(); }
 
-        virtual media::VolumeShaper::Status applyVolumeShaper(
-                                    const sp<media::VolumeShaper::Configuration>& configuration,
-                                    const sp<media::VolumeShaper::Operation>& operation);
-        virtual sp<media::VolumeShaper::State> getVolumeShaperState(int id);
-
         // AudioRouting
         virtual status_t    setOutputDevice(audio_port_handle_t deviceId);
         virtual status_t    getRoutedDeviceId(audio_port_handle_t* deviceId);
@@ -218,13 +213,6 @@
     virtual status_t    setParameter(int key, const Parcel &request) = 0;
     virtual status_t    getParameter(int key, Parcel *reply) = 0;
 
-    // default no-op implementation of optional extensions
-    virtual status_t setRetransmitEndpoint(const struct sockaddr_in* /* endpoint */) {
-        return INVALID_OPERATION;
-    }
-    virtual status_t getRetransmitEndpoint(struct sockaddr_in* /* endpoint */) {
-        return INVALID_OPERATION;
-    }
     virtual status_t setNextPlayer(const sp<MediaPlayer2Interface>& /* next */) {
         return OK;
     }
diff --git a/media/libmedia/include/media/mediaplayer2.h b/media/libmedia/include/media/mediaplayer2.h
index f2fc901..c8b124c 100644
--- a/media/libmedia/include/media/mediaplayer2.h
+++ b/media/libmedia/include/media/mediaplayer2.h
@@ -244,13 +244,8 @@
             status_t        attachAuxEffect(int effectId);
             status_t        setParameter(int key, const Parcel& request);
             status_t        getParameter(int key, Parcel* reply);
-            status_t        setRetransmitEndpoint(const char* addrString, uint16_t port);
             status_t        setNextMediaPlayer(const sp<MediaPlayer2>& player);
 
-            media::VolumeShaper::Status applyVolumeShaper(
-                                    const sp<media::VolumeShaper::Configuration>& configuration,
-                                    const sp<media::VolumeShaper::Operation>& operation);
-            sp<media::VolumeShaper::State> getVolumeShaperState(int id);
             // Modular DRM
             status_t        prepareDrm(const uint8_t uuid[16], const Vector<uint8_t>& drmSessionId);
             status_t        releaseDrm();
@@ -266,7 +261,6 @@
             status_t        getDuration_l(int *msec);
             status_t        attachNewPlayer(const sp<MediaPlayer2Engine>& player);
             status_t        reset_l();
-            status_t        doSetRetransmitEndpoint(const sp<MediaPlayer2Engine>& player);
             status_t        checkStateForKeySet_l(int key);
 
     sp<MediaPlayer2Engine>      mPlayer;
@@ -292,8 +286,6 @@
     int                         mVideoHeight;
     audio_session_t             mAudioSessionId;
     float                       mSendLevel;
-    struct sockaddr_in          mRetransmitEndpoint;
-    bool                        mRetransmitEndpointValid;
 };
 
 }; // namespace android
diff --git a/media/libmedia/mediaplayer2.cpp b/media/libmedia/mediaplayer2.cpp
index ba24da7..1eb3795 100644
--- a/media/libmedia/mediaplayer2.cpp
+++ b/media/libmedia/mediaplayer2.cpp
@@ -50,8 +50,6 @@
 
 namespace android {
 
-using media::VolumeShaper;
-
 MediaPlayer2::MediaPlayer2()
 {
     ALOGV("constructor");
@@ -73,7 +71,6 @@
     mAudioSessionId = (audio_session_t) AudioSystem::newAudioUniqueId(AUDIO_UNIQUE_ID_USE_SESSION);
     AudioSystem::acquireAudioSessionId(mAudioSessionId, -1);
     mSendLevel = 0;
-    mRetransmitEndpointValid = false;
 }
 
 MediaPlayer2::~MediaPlayer2()
@@ -111,7 +108,6 @@
     mSeekPosition = -1;
     mSeekMode = MediaPlayer2SeekMode::SEEK_PREVIOUS_SYNC;
     mVideoWidth = mVideoHeight = 0;
-    mRetransmitEndpointValid = false;
 }
 
 status_t MediaPlayer2::setListener(const sp<MediaPlayer2Listener>& listener)
@@ -162,8 +158,7 @@
     ALOGV("setDataSource type(%d)", dsd->mType);
     status_t err = UNKNOWN_ERROR;
     sp<MediaPlayer2Engine> player(MediaPlayer2Manager::get().create(this, mAudioSessionId));
-    if ((NO_ERROR != doSetRetransmitEndpoint(player)) ||
-        (NO_ERROR != player->setDataSource(dsd))) {
+    if (NO_ERROR != player->setDataSource(dsd)) {
         player.clear();
     }
     err = attachNewPlayer(player);
@@ -589,20 +584,6 @@
     return NO_ERROR;
 }
 
-status_t MediaPlayer2::doSetRetransmitEndpoint(const sp<MediaPlayer2Engine>& player) {
-    Mutex::Autolock _l(mLock);
-
-    if (player == NULL) {
-        return UNKNOWN_ERROR;
-    }
-
-    if (mRetransmitEndpointValid) {
-        return player->setRetransmitEndpoint(&mRetransmitEndpoint);
-    }
-
-    return OK;
-}
-
 status_t MediaPlayer2::reset()
 {
     ALOGV("reset");
@@ -782,34 +763,6 @@
     return INVALID_OPERATION;
 }
 
-status_t MediaPlayer2::setRetransmitEndpoint(const char* addrString,
-                                            uint16_t port) {
-    ALOGV("MediaPlayer2::setRetransmitEndpoint(%s:%hu)",
-            addrString ? addrString : "(null)", port);
-
-    Mutex::Autolock _l(mLock);
-    if ((mPlayer != NULL) || (mCurrentState != MEDIA_PLAYER2_IDLE))
-        return INVALID_OPERATION;
-
-    if (NULL == addrString) {
-        mRetransmitEndpointValid = false;
-        return OK;
-    }
-
-    struct in_addr saddr;
-    if(!inet_aton(addrString, &saddr)) {
-        return BAD_VALUE;
-    }
-
-    memset(&mRetransmitEndpoint, 0, sizeof(mRetransmitEndpoint));
-    mRetransmitEndpoint.sin_family = AF_INET;
-    mRetransmitEndpoint.sin_addr   = saddr;
-    mRetransmitEndpoint.sin_port   = htons(port);
-    mRetransmitEndpointValid       = true;
-
-    return OK;
-}
-
 void MediaPlayer2::notify(int msg, int ext1, int ext2, const Parcel *obj)
 {
     ALOGV("message received msg=%d, ext1=%d, ext2=%d", msg, ext1, ext2);
@@ -949,27 +902,6 @@
     return mPlayer->setNextPlayer(next == NULL ? NULL : next->mPlayer);
 }
 
-VolumeShaper::Status MediaPlayer2::applyVolumeShaper(
-        const sp<VolumeShaper::Configuration>& configuration,
-        const sp<VolumeShaper::Operation>& operation)
-{
-    Mutex::Autolock _l(mLock);
-    if (mPlayer == nullptr) {
-        return VolumeShaper::Status(NO_INIT);
-    }
-    VolumeShaper::Status status = mPlayer->applyVolumeShaper(configuration, operation);
-    return status;
-}
-
-sp<VolumeShaper::State> MediaPlayer2::getVolumeShaperState(int id)
-{
-    Mutex::Autolock _l(mLock);
-    if (mPlayer == nullptr) {
-        return nullptr;
-    }
-    return mPlayer->getVolumeShaperState(id);
-}
-
 // Modular DRM
 status_t MediaPlayer2::prepareDrm(const uint8_t uuid[16], const Vector<uint8_t>& drmSessionId)
 {
diff --git a/media/libmedia/nuplayer2/Android.bp b/media/libmedia/nuplayer2/Android.bp
index 4d29026..1f4455f 100644
--- a/media/libmedia/nuplayer2/Android.bp
+++ b/media/libmedia/nuplayer2/Android.bp
@@ -12,7 +12,6 @@
         "NuPlayer2Driver.cpp",
         "NuPlayer2Drm.cpp",
         "NuPlayer2Renderer.cpp",
-        "NuPlayer2StreamListener.cpp",
         "RTSPSource2.cpp",
     ],
 
diff --git a/media/libmedia/nuplayer2/NuPlayer2StreamListener.cpp b/media/libmedia/nuplayer2/NuPlayer2StreamListener.cpp
deleted file mode 100644
index 0769711..0000000
--- a/media/libmedia/nuplayer2/NuPlayer2StreamListener.cpp
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-//#define LOG_NDEBUG 0
-#define LOG_TAG "NuPlayer2StreamListener"
-#include <utils/Log.h>
-
-#include "NuPlayer2StreamListener.h"
-
-#include <binder/MemoryDealer.h>
-#include <media/stagefright/foundation/ADebug.h>
-#include <media/stagefright/foundation/AMessage.h>
-#include <media/stagefright/MediaErrors.h>
-
-namespace android {
-
-NuPlayer2::StreamListener::StreamListener(
-        const sp<IStreamSource> &source,
-        const sp<AHandler> &targetHandler)
-    : mSource(source),
-      mTargetHandler(targetHandler),
-      mEOS(false),
-      mSendDataNotification(true) {
-    mSource->setListener(this);
-
-    mMemoryDealer = new MemoryDealer(kNumBuffers * kBufferSize);
-    for (size_t i = 0; i < kNumBuffers; ++i) {
-        sp<IMemory> mem = mMemoryDealer->allocate(kBufferSize);
-        CHECK(mem != NULL);
-
-        mBuffers.push(mem);
-    }
-    mSource->setBuffers(mBuffers);
-}
-
-void NuPlayer2::StreamListener::start() {
-    for (size_t i = 0; i < kNumBuffers; ++i) {
-        mSource->onBufferAvailable(i);
-    }
-}
-
-void NuPlayer2::StreamListener::queueBuffer(size_t index, size_t size) {
-    QueueEntry entry;
-    entry.mIsCommand = false;
-    entry.mIndex = index;
-    entry.mSize = size;
-    entry.mOffset = 0;
-
-    Mutex::Autolock autoLock(mLock);
-    mQueue.push_back(entry);
-
-    if (mSendDataNotification) {
-        mSendDataNotification = false;
-
-        if (mTargetHandler != NULL) {
-            (new AMessage(kWhatMoreDataQueued, mTargetHandler))->post();
-        }
-    }
-}
-
-void NuPlayer2::StreamListener::issueCommand(
-        Command cmd, bool synchronous, const sp<AMessage> &extra) {
-    CHECK(!synchronous);
-
-    QueueEntry entry;
-    entry.mIsCommand = true;
-    entry.mCommand = cmd;
-    entry.mExtra = extra;
-
-    Mutex::Autolock autoLock(mLock);
-    mQueue.push_back(entry);
-
-    if (mSendDataNotification) {
-        mSendDataNotification = false;
-
-        if (mTargetHandler != NULL) {
-            (new AMessage(kWhatMoreDataQueued, mTargetHandler))->post();
-        }
-    }
-}
-
-ssize_t NuPlayer2::StreamListener::read(
-        void *data, size_t size, sp<AMessage> *extra) {
-    CHECK_GT(size, 0u);
-
-    extra->clear();
-
-    Mutex::Autolock autoLock(mLock);
-
-    if (mEOS) {
-        return 0;
-    }
-
-    if (mQueue.empty()) {
-        mSendDataNotification = true;
-
-        return -EWOULDBLOCK;
-    }
-
-    QueueEntry *entry = &*mQueue.begin();
-
-    if (entry->mIsCommand) {
-        switch (entry->mCommand) {
-            case EOS:
-            {
-                mQueue.erase(mQueue.begin());
-                entry = NULL;
-
-                mEOS = true;
-                return 0;
-            }
-
-            case DISCONTINUITY:
-            {
-                *extra = entry->mExtra;
-
-                mQueue.erase(mQueue.begin());
-                entry = NULL;
-
-                return INFO_DISCONTINUITY;
-            }
-
-            default:
-                TRESPASS();
-                break;
-        }
-    }
-
-    size_t copy = entry->mSize;
-    if (copy > size) {
-        copy = size;
-    }
-
-    if (entry->mIndex >= mBuffers.size()) {
-        return ERROR_MALFORMED;
-    }
-
-    sp<IMemory> mem = mBuffers.editItemAt(entry->mIndex);
-    if (mem == NULL || mem->size() < copy || mem->size() - copy < entry->mOffset) {
-        return ERROR_MALFORMED;
-    }
-
-    memcpy(data,
-           (const uint8_t *)mem->pointer()
-            + entry->mOffset,
-           copy);
-
-    entry->mOffset += copy;
-    entry->mSize -= copy;
-
-    if (entry->mSize == 0) {
-        mSource->onBufferAvailable(entry->mIndex);
-        mQueue.erase(mQueue.begin());
-        entry = NULL;
-    }
-
-    return copy;
-}
-
-}  // namespace android
diff --git a/media/libmedia/nuplayer2/NuPlayer2StreamListener.h b/media/libmedia/nuplayer2/NuPlayer2StreamListener.h
deleted file mode 100644
index 4327b24..0000000
--- a/media/libmedia/nuplayer2/NuPlayer2StreamListener.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef NUPLAYER2_STREAM_LISTENER_H_
-
-#define NUPLAYER2_STREAM_LISTENER_H_
-
-#include "NuPlayer2.h"
-
-#include <media/IStreamSource.h>
-
-namespace android {
-
-class MemoryDealer;
-
-struct NuPlayer2::StreamListener : public BnStreamListener {
-    StreamListener(
-            const sp<IStreamSource> &source,
-            const sp<AHandler> &targetHandler);
-
-    virtual void queueBuffer(size_t index, size_t size);
-
-    virtual void issueCommand(
-            Command cmd, bool synchronous, const sp<AMessage> &extra);
-
-    void start();
-    ssize_t read(void *data, size_t size, sp<AMessage> *extra);
-
-private:
-    enum {
-        kNumBuffers = 8,
-        kBufferSize = 188 * 10
-    };
-
-    struct QueueEntry {
-        bool mIsCommand;
-
-        size_t mIndex;
-        size_t mSize;
-        size_t mOffset;
-
-        Command mCommand;
-        sp<AMessage> mExtra;
-    };
-
-    Mutex mLock;
-
-    sp<IStreamSource> mSource;
-    sp<AHandler> mTargetHandler;
-    sp<MemoryDealer> mMemoryDealer;
-    Vector<sp<IMemory> > mBuffers;
-    List<QueueEntry> mQueue;
-    bool mEOS;
-    bool mSendDataNotification;
-
-    DISALLOW_EVIL_CONSTRUCTORS(StreamListener);
-};
-
-}  // namespace android
-
-#endif // NUPLAYER2_STREAM_LISTENER_H_
