diff options
| -rw-r--r-- | cmds/stagefright/stream.cpp | 37 | ||||
| -rw-r--r-- | media/libstagefright/mpeg2ts/AnotherPacketSource.cpp | 32 | 
2 files changed, 45 insertions, 24 deletions
diff --git a/cmds/stagefright/stream.cpp b/cmds/stagefright/stream.cpp index ee91c29..aa3bc03 100644 --- a/cmds/stagefright/stream.cpp +++ b/cmds/stagefright/stream.cpp @@ -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> @@ -50,7 +54,7 @@ protected:  private:      int mFd;      off64_t mFileSize; -    int64_t mNextSeekTimeUs; +    uint64_t mNumPacketsSent;      sp<IStreamListener> mListener;      Vector<sp<IMemory> > mBuffers; @@ -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); @@ -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); @@ -104,6 +114,8 @@ void MyStreamSource::onBufferAvailable(size_t index) {          mListener->issueCommand(IStreamListener::EOS, false /* synchronous */);      } else {          mListener->queueBuffer(index, n); + +        mNumPacketsSent += n / 188;      }  }  //////////////////////////////////////////////////////////////////////////////// @@ -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); diff --git a/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp b/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp index 2e66a2c..ce07e32 100644 --- a/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp +++ b/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp @@ -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; + +        int32_t oldDiscontinuityType; +        if (!oldBuffer->meta()->findInt32( +                    "discontinuity", &oldDiscontinuityType)) { +            it = mBuffers.erase(it); +            continue; +        } -        mBuffers.clear(); -        mEOSResult = OK; +        ++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();  | 
