OSDN Git Service

Signal end of stream if no more fragments are going to be available.
authorAndreas Huber <andih@google.com>
Thu, 9 Aug 2012 23:24:54 +0000 (16:24 -0700)
committerAndreas Huber <andih@google.com>
Thu, 9 Aug 2012 23:35:00 +0000 (16:35 -0700)
Change-Id: I16696740d3551aa8a5ba904ec757c64b0ecd1307

media/libmediaplayerservice/nuplayer/mp4/Parser.cpp
media/libmediaplayerservice/nuplayer/mp4/Parser.h

index 7938fa4..6850842 100644 (file)
@@ -144,7 +144,8 @@ struct FileSource : public Parser::Source {
 
 Parser::Parser()
     : mBufferPos(0),
-      mSuspended(false) {
+      mSuspended(false),
+      mFinalResult(OK) {
 }
 
 Parser::~Parser() {
@@ -292,6 +293,13 @@ void Parser::onMessageReceived(const sp<AMessage> &msg) {
 
             if (n < (ssize_t)needed) {
                 ALOGI("%s", "Reached EOF");
+                if (n < 0) {
+                    mFinalResult = n;
+                } else if (n == 0) {
+                    mFinalResult = ERROR_END_OF_STREAM;
+                } else {
+                    mFinalResult = ERROR_IO;
+                }
             } else {
                 mBuffer->setRange(0, mBuffer->size() + n);
                 (new AMessage(kWhatProceed, id()))->post();
@@ -593,6 +601,10 @@ status_t Parser::getSample(
         TrackInfo *info, sp<TrackFragment> *fragment, SampleInfo *sampleInfo) {
     for (;;) {
         if (info->mFragments.empty()) {
+            if (mFinalResult != OK) {
+                return mFinalResult;
+            }
+
             resumeIfNecessary();
             return -EWOULDBLOCK;
         }
index 50c96bb..c8f9ad4 100644 (file)
@@ -157,6 +157,8 @@ private:
 
     uint32_t mCurrentTrackID;
 
+    status_t mFinalResult;
+
     TrackFragmentHeaderInfo mTrackFragmentHeaderInfo;
 
     status_t onProceed();