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; }
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(); }
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; }