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

Commit f107f2cf authored by Dhananjay Kumar's avatar Dhananjay Kumar Committed by Linux Build Service Account
Browse files

IMediaSource: add check before calling readMultiple

IMediaSource::readMultiple() fails when called for large
buffers which cannot be handled inline over binder's
reply data.
Add canReadMultiple() call to get value from native
implementation where Source can check buffer size and
decide if readMultiple is required to improve read latency.

CRs-Fixed: 1029437
Change-Id: If1f77898809c7ecc1ff07b37da1faa74b1c51c64
parent 68130d84
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -114,6 +114,9 @@ public:
    virtual status_t readMultiple(
            Vector<MediaBuffer *> *buffers, uint32_t maxNumBuffers = 1) = 0;

    // Returns true if readMultiple is supported, otherwise false.
    virtual bool canReadMultiple() = 0;

    // Causes this source to suspend pulling data from its upstream source
    // until a subsequent read-with-seek. Currently only supported by
    // OMXCodec.
@@ -148,6 +151,10 @@ public:
            Vector<MediaBuffer *> * /* buffers */, uint32_t /* maxNumBuffers = 1 */) {
        return ERROR_UNSUPPORTED;
    }

    virtual bool canReadMultiple() {
        return true;
    }
protected:
    virtual ~BnMediaSource();

+17 −0
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ enum {
    GETFORMAT,
    READ,
    READMULTIPLE,
    CANREADMULTIPLE,
    RELEASE_BUFFER
};

@@ -221,6 +222,16 @@ public:
        return ret;
    }

    bool canReadMultiple() {
        ALOGV("canReadMultiple");
        Parcel data, reply;
        data.writeInterfaceToken(BpMediaSource::getInterfaceDescriptor());
        if (remote()->transact(CANREADMULTIPLE, data, &reply) == NO_ERROR) {
            return reply.readBool();
        }
        return true;
    }

    virtual status_t pause() {
        ALOGV("pause");
        Parcel data, reply;
@@ -403,6 +414,12 @@ status_t BnMediaSource::onTransact(
            reply->writeInt32(ret);
            return NO_ERROR;
        }
        case CANREADMULTIPLE: {
            ALOGV("canReadmultiple");
            CHECK_INTERFACE(IMediaSource, data, reply);
            reply->writeBool(canReadMultiple());
            return NO_ERROR;
        }
        default:
            return BBinder::onTransact(code, data, reply, flags);
    }
+5 −1
Original line number Diff line number Diff line
@@ -245,6 +245,7 @@ status_t NuPlayer::GenericSource::initFromDataSource() {
                } else {
                    mAudioIsVorbis = false;
                }
                mAudioTrack.mReadMultiple = track->canReadMultiple();
            }
        } else if (!strncasecmp(mime, "video/", 6)) {
            if (mVideoTrack.mSource == NULL) {
@@ -662,6 +663,7 @@ void NuPlayer::GenericSource::onMessageReceived(const sp<AMessage> &msg) {
          const bool formatChange = true;
          if (trackType == MEDIA_TRACK_TYPE_AUDIO) {
              timeUs = mAudioLastDequeueTimeUs;
              track->mReadMultiple = source->canReadMultiple();
          } else {
              timeUs = mVideoLastDequeueTimeUs;
          }
@@ -1420,7 +1422,9 @@ void NuPlayer::GenericSource::readBuffer(
        options.setNonBlocking();
    }

    bool couldReadMultiple = (!mIsWidevine && trackType == MEDIA_TRACK_TYPE_AUDIO);
    bool couldReadMultiple =
        (!mIsWidevine && trackType == MEDIA_TRACK_TYPE_AUDIO
                && track->mReadMultiple);
    for (size_t numBuffers = 0; numBuffers < maxBuffers; ) {
        Vector<MediaBuffer *> mediaBuffers;
        status_t err = NO_ERROR;
+1 −0
Original line number Diff line number Diff line
@@ -111,6 +111,7 @@ private:
        size_t mIndex;
        sp<IMediaSource> mSource;
        sp<AnotherPacketSource> mPackets;
        bool mReadMultiple;
    };

    // Helper to monitor buffering status. The polling happens every second.