status_t AnotherPacketSource::dequeueAccessUnit(sp<ABuffer> *buffer) {
    buffer->clear();

    Mutex::Autolock autoLock(mLock);
    while (mEOSResult == OK && mBuffers.empty()) {
        mCondition.wait(mLock);
    }

    if (!mBuffers.empty()) {
        *buffer = *mBuffers.begin();
        mBuffers.erase(mBuffers.begin());

        int32_t discontinuity;
        if ((*buffer)->meta()->findInt32("discontinuity", &discontinuity)) {
            if (wasFormatChange(discontinuity)) {
                mFormat.clear();
            }

            --mQueuedDiscontinuityCount;
            return INFO_DISCONTINUITY;
        }

        mLatestDequeuedMeta = (*buffer)->meta()->dup();

        sp<RefBase> object;
        if ((*buffer)->meta()->findObject("format", &object)) {
            mFormat = static_cast<MetaData*>(object.get());
        }

        return OK;
    }

    return mEOSResult;
}
status_t AnotherPacketSource::dequeueAccessUnit(sp<ABuffer> *buffer) {
    buffer->clear();

    Mutex::Autolock autoLock(mLock);
    while (mEOSResult == OK && mBuffers.empty()) {
        mCondition.wait(mLock);
    }

    if (!mBuffers.empty()) {
        *buffer = *mBuffers.begin();
        mBuffers.erase(mBuffers.begin());

        int32_t discontinuity;
        if ((*buffer)->meta()->findInt32("discontinuity", &discontinuity)) {
            if (wasFormatChange(discontinuity)) {
                mFormat.clear();
            }

            return INFO_DISCONTINUITY;
        }

        return OK;
    }

    return mEOSResult;
}
status_t AnotherPacketSource::read(
    MediaBuffer **out, const ReadOptions *) {
    *out = NULL;

    Mutex::Autolock autoLock(mLock);
    while (mEOSResult == OK && mBuffers.empty()) {
        mCondition.wait(mLock);
    }

    if (!mBuffers.empty()) {
        const sp<ABuffer> buffer = *mBuffers.begin();
        mBuffers.erase(mBuffers.begin());

        int32_t discontinuity;
        if (buffer->meta()->findInt32("discontinuity", &discontinuity)) {
            if (wasFormatChange(discontinuity)) {
                mFormat.clear();
            }

            return INFO_DISCONTINUITY;
        } else {
            int64_t timeUs;
            CHECK(buffer->meta()->findInt64("timeUs", &timeUs));

            MediaBuffer *mediaBuffer = new MediaBuffer(buffer);

            mediaBuffer->meta_data()->setInt64(kKeyTime, timeUs);

            *out = mediaBuffer;
            return OK;
        }
    }

    return mEOSResult;
}
Example #4
0
void AnotherPacketSource::queueDiscontinuity(
    ATSParser::DiscontinuityType type,
    const sp<AMessage> &extra) {
    Mutex::Autolock autoLock(mLock);

#ifndef ANDROID_DEFAULT_CODE
    if (type == ATSParser::DISCONTINUITY_NONE) {
        return;
    }

    if (type == ATSParser::DISCONTINUITY_HTTPLIVE_SEEK) {
        //clear all buffer and pass extra message
        if (!mBuffers.empty()) {
            mBuffers.clear();
        }
        mEOSResult = OK;

        sp<ABuffer> buffer = new ABuffer(0);
        buffer->meta()->setInt32("discontinuity", static_cast<int32_t>(type));
        buffer->meta()->setMessage("extra", extra);

        mBuffers.push_back(buffer);
        mCondition.signal();
        return;
    }

    if (wasFormatChange(type) && mFormat != NULL) {
        int32_t width = 0, height = 0;
        mFormat->findInt32(kKeyWidth, &width);
        mFormat->findInt32(kKeyHeight, &height);
        ALOGD("mFormat clear %d x %d", width , height);
        mFormat.clear();
    }
    if (type & ATSParser::DISCONTINUITY_FLUSH_SOURCE_ONLY) {
        //only flush source, don't queue discontinuity
        if (!mBuffers.empty()) {
            mBuffers.clear();
        }
        mEOSResult = OK;
        mScanForIDR = true;
        ALOGD("found discontinuity flush source only!");
        return;
    }
#endif
#ifdef ANDROID_DEFAULT_CODE
    //do not erase pending buffers while bandwidth changed.
    // Leave only discontinuities in the queue.
    List<sp<ABuffer> >::iterator it = mBuffers.begin();
    while (it != mBuffers.end()) {
        sp<ABuffer> oldBuffer = *it;

        int32_t oldDiscontinuityType;
        if (!oldBuffer->meta()->findInt32(
                    "discontinuity", &oldDiscontinuityType)) {
            it = mBuffers.erase(it);
            continue;
        }

        ++it;
    }
#endif
    mEOSResult = OK;
    mLastQueuedTimeUs = 0;
    mLatestEnqueuedMeta = NULL;

    sp<ABuffer> buffer = new ABuffer(0);
    buffer->meta()->setInt32("discontinuity", static_cast<int32_t>(type));
    buffer->meta()->setMessage("extra", extra);

    mBuffers.push_back(buffer);
    mCondition.signal();
}
Example #5
0
status_t AnotherPacketSource::read(
    MediaBuffer **out, const ReadOptions *options) {
#else
status_t AnotherPacketSource::read(
    MediaBuffer **out, const ReadOptions *) {
#endif
    *out = NULL;

    Mutex::Autolock autoLock(mLock);
    while (mEOSResult == OK && mBuffers.empty()) {
        mCondition.wait(mLock);
    }

    if (!mBuffers.empty()) {
        const sp<ABuffer> buffer = *mBuffers.begin();

#ifndef ANDROID_DEFAULT_CODE
        m_uiNextAduSeqNum = buffer->int32Data();
#endif
        mBuffers.erase(mBuffers.begin());

        int32_t discontinuity;
        if (buffer->meta()->findInt32("discontinuity", &discontinuity)) {
            if (wasFormatChange(discontinuity)) {
                mFormat.clear();
            }

            return INFO_DISCONTINUITY;
        }

        sp<RefBase> object;
        if (buffer->meta()->findObject("format", &object)) {
            mFormat = static_cast<MetaData*>(object.get());
        }

        int64_t timeUs;
        CHECK(buffer->meta()->findInt64("timeUs", &timeUs));

        MediaBuffer *mediaBuffer = new MediaBuffer(buffer);

        mediaBuffer->meta_data()->setInt64(kKeyTime, timeUs);
#ifndef ANDROID_DEFAULT_CODE
        int32_t fgInvalidtimeUs=false;
        if(buffer->meta()->findInt32("invt", &fgInvalidtimeUs))
        {
            mediaBuffer->meta_data()->setInt32(kInvalidKeyTime, fgInvalidtimeUs);
        }

        int64_t seekTimeUs;
        ReadOptions::SeekMode seekMode;
        if (options && options->getSeekTo(&seekTimeUs, &seekMode)) {
            mediaBuffer->meta_data()->setInt64(kKeyTargetTime, seekTimeUs);
        }
#endif

        *out = mediaBuffer;
        return OK;
    }

    return mEOSResult;
}