Loading cmds/stagefright/stream.cpp +27 −10 Original line number Diff line number Diff line Loading @@ -14,6 +14,10 @@ * limitations under the License. */ //#define LOG_NDEBUG 0 #define LOG_TAG "stream" #include "utils/Log.h" #include <binder/ProcessState.h> #include <media/IStreamSource.h> Loading Loading @@ -50,7 +54,7 @@ protected: private: int mFd; off64_t mFileSize; int64_t mNextSeekTimeUs; uint64_t mNumPacketsSent; sp<IStreamListener> mListener; Vector<sp<IMemory> > mBuffers; Loading @@ -61,7 +65,7 @@ private: MyStreamSource::MyStreamSource(int fd) : mFd(fd), mFileSize(0), mNextSeekTimeUs(-1) { // ALooper::GetNowUs() + 5000000ll) { mNumPacketsSent(0) { CHECK_GE(fd, 0); mFileSize = lseek64(fd, 0, SEEK_END); Loading @@ -84,18 +88,24 @@ void MyStreamSource::setBuffers(const Vector<sp<IMemory> > &buffers) { void MyStreamSource::onBufferAvailable(size_t index) { CHECK_LT(index, mBuffers.size()); if (mNextSeekTimeUs >= 0 && mNextSeekTimeUs <= ALooper::GetNowUs()) { off64_t offset = (off64_t)(((float)rand() / RAND_MAX) * mFileSize * 0.8); offset = (offset / 188) * 188; #if 0 if (mNumPacketsSent >= 20000) { LOGI("signalling discontinuity now"); off64_t offset = 0; CHECK((offset % 188) == 0); lseek(mFd, offset, SEEK_SET); sp<AMessage> extra = new AMessage; extra->setInt32(IStreamListener::kKeyFormatChange, 0); mListener->issueCommand( IStreamListener::DISCONTINUITY, false /* synchronous */); IStreamListener::DISCONTINUITY, false /* synchronous */, extra); mNextSeekTimeUs = -1; mNextSeekTimeUs = ALooper::GetNowUs() + 5000000ll; mNumPacketsSent = 0; } #endif sp<IMemory> mem = mBuffers.itemAt(index); Loading @@ -104,6 +114,8 @@ void MyStreamSource::onBufferAvailable(size_t index) { mListener->issueCommand(IStreamListener::EOS, false /* synchronous */); } else { mListener->queueBuffer(index, n); mNumPacketsSent += n / 188; } } //////////////////////////////////////////////////////////////////////////////// Loading Loading @@ -293,12 +305,17 @@ int main(int argc, char **argv) { sp<SurfaceComposerClient> composerClient = new SurfaceComposerClient; CHECK_EQ(composerClient->initCheck(), (status_t)OK); ssize_t displayWidth = composerClient->getDisplayWidth(0); ssize_t displayHeight = composerClient->getDisplayHeight(0); LOGV("display is %d x %d\n", displayWidth, displayHeight); sp<SurfaceControl> control = composerClient->createSurface( String8("A Surface"), 0, 1280, 800, displayWidth, displayHeight, PIXEL_FORMAT_RGB_565, 0); Loading media/libstagefright/mpeg2ts/AnotherPacketSource.cpp +18 −14 Original line number Diff line number Diff line Loading @@ -136,24 +136,28 @@ void AnotherPacketSource::queueAccessUnit(const sp<ABuffer> &buffer) { void AnotherPacketSource::queueDiscontinuity( ATSParser::DiscontinuityType type, const sp<AMessage> &extra) { sp<ABuffer> buffer = new ABuffer(0); buffer->meta()->setInt32("discontinuity", static_cast<int32_t>(type)); buffer->meta()->setMessage("extra", extra); Mutex::Autolock autoLock(mLock); #if 0 if (type == ATSParser::DISCONTINUITY_SEEK || type == ATSParser::DISCONTINUITY_FORMATCHANGE) { // XXX Fix this: This will also clear any pending discontinuities, // If there's a pending DISCONTINUITY_FORMATCHANGE and the new // discontinuity is "just" a DISCONTINUITY_SEEK, this will effectively // downgrade the type of discontinuity received by the client. // Leave only discontinuities in the queue. List<sp<ABuffer> >::iterator it = mBuffers.begin(); while (it != mBuffers.end()) { sp<ABuffer> oldBuffer = *it; mBuffers.clear(); mEOSResult = OK; int32_t oldDiscontinuityType; if (!oldBuffer->meta()->findInt32( "discontinuity", &oldDiscontinuityType)) { it = mBuffers.erase(it); continue; } ++it; } #endif 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(); Loading Loading
cmds/stagefright/stream.cpp +27 −10 Original line number Diff line number Diff line Loading @@ -14,6 +14,10 @@ * limitations under the License. */ //#define LOG_NDEBUG 0 #define LOG_TAG "stream" #include "utils/Log.h" #include <binder/ProcessState.h> #include <media/IStreamSource.h> Loading Loading @@ -50,7 +54,7 @@ protected: private: int mFd; off64_t mFileSize; int64_t mNextSeekTimeUs; uint64_t mNumPacketsSent; sp<IStreamListener> mListener; Vector<sp<IMemory> > mBuffers; Loading @@ -61,7 +65,7 @@ private: MyStreamSource::MyStreamSource(int fd) : mFd(fd), mFileSize(0), mNextSeekTimeUs(-1) { // ALooper::GetNowUs() + 5000000ll) { mNumPacketsSent(0) { CHECK_GE(fd, 0); mFileSize = lseek64(fd, 0, SEEK_END); Loading @@ -84,18 +88,24 @@ void MyStreamSource::setBuffers(const Vector<sp<IMemory> > &buffers) { void MyStreamSource::onBufferAvailable(size_t index) { CHECK_LT(index, mBuffers.size()); if (mNextSeekTimeUs >= 0 && mNextSeekTimeUs <= ALooper::GetNowUs()) { off64_t offset = (off64_t)(((float)rand() / RAND_MAX) * mFileSize * 0.8); offset = (offset / 188) * 188; #if 0 if (mNumPacketsSent >= 20000) { LOGI("signalling discontinuity now"); off64_t offset = 0; CHECK((offset % 188) == 0); lseek(mFd, offset, SEEK_SET); sp<AMessage> extra = new AMessage; extra->setInt32(IStreamListener::kKeyFormatChange, 0); mListener->issueCommand( IStreamListener::DISCONTINUITY, false /* synchronous */); IStreamListener::DISCONTINUITY, false /* synchronous */, extra); mNextSeekTimeUs = -1; mNextSeekTimeUs = ALooper::GetNowUs() + 5000000ll; mNumPacketsSent = 0; } #endif sp<IMemory> mem = mBuffers.itemAt(index); Loading @@ -104,6 +114,8 @@ void MyStreamSource::onBufferAvailable(size_t index) { mListener->issueCommand(IStreamListener::EOS, false /* synchronous */); } else { mListener->queueBuffer(index, n); mNumPacketsSent += n / 188; } } //////////////////////////////////////////////////////////////////////////////// Loading Loading @@ -293,12 +305,17 @@ int main(int argc, char **argv) { sp<SurfaceComposerClient> composerClient = new SurfaceComposerClient; CHECK_EQ(composerClient->initCheck(), (status_t)OK); ssize_t displayWidth = composerClient->getDisplayWidth(0); ssize_t displayHeight = composerClient->getDisplayHeight(0); LOGV("display is %d x %d\n", displayWidth, displayHeight); sp<SurfaceControl> control = composerClient->createSurface( String8("A Surface"), 0, 1280, 800, displayWidth, displayHeight, PIXEL_FORMAT_RGB_565, 0); Loading
media/libstagefright/mpeg2ts/AnotherPacketSource.cpp +18 −14 Original line number Diff line number Diff line Loading @@ -136,24 +136,28 @@ void AnotherPacketSource::queueAccessUnit(const sp<ABuffer> &buffer) { void AnotherPacketSource::queueDiscontinuity( ATSParser::DiscontinuityType type, const sp<AMessage> &extra) { sp<ABuffer> buffer = new ABuffer(0); buffer->meta()->setInt32("discontinuity", static_cast<int32_t>(type)); buffer->meta()->setMessage("extra", extra); Mutex::Autolock autoLock(mLock); #if 0 if (type == ATSParser::DISCONTINUITY_SEEK || type == ATSParser::DISCONTINUITY_FORMATCHANGE) { // XXX Fix this: This will also clear any pending discontinuities, // If there's a pending DISCONTINUITY_FORMATCHANGE and the new // discontinuity is "just" a DISCONTINUITY_SEEK, this will effectively // downgrade the type of discontinuity received by the client. // Leave only discontinuities in the queue. List<sp<ABuffer> >::iterator it = mBuffers.begin(); while (it != mBuffers.end()) { sp<ABuffer> oldBuffer = *it; mBuffers.clear(); mEOSResult = OK; int32_t oldDiscontinuityType; if (!oldBuffer->meta()->findInt32( "discontinuity", &oldDiscontinuityType)) { it = mBuffers.erase(it); continue; } ++it; } #endif 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(); Loading