diff options
-rw-r--r-- | include/media/stagefright/timedtext/TimedTextDriver.h | 5 | ||||
-rw-r--r-- | media/libstagefright/AwesomePlayer.cpp | 2 | ||||
-rw-r--r-- | media/libstagefright/StagefrightMediaScanner.cpp | 15 | ||||
-rw-r--r-- | media/libstagefright/timedtext/TimedTextDriver.cpp | 48 | ||||
-rw-r--r-- | services/audioflinger/AudioFlinger.cpp | 4 |
5 files changed, 50 insertions, 24 deletions
diff --git a/include/media/stagefright/timedtext/TimedTextDriver.h b/include/media/stagefright/timedtext/TimedTextDriver.h index b9752df..e3ca536 100644 --- a/include/media/stagefright/timedtext/TimedTextDriver.h +++ b/include/media/stagefright/timedtext/TimedTextDriver.h @@ -30,6 +30,7 @@ class MediaSource; class Parcel; class TimedTextPlayer; class TimedTextSource; +class DataSource; class TimedTextDriver { public: @@ -48,7 +49,7 @@ public: status_t addOutOfBandTextSource(const char *uri, const char *mimeType); // Caller owns the file desriptor and caller is responsible for closing it. status_t addOutOfBandTextSource( - int fd, off64_t offset, size_t length, const char *mimeType); + int fd, off64_t offset, off64_t length, const char *mimeType); void getTrackInfo(Parcel *parcel); @@ -72,6 +73,8 @@ private: // -- End of variables to be guarded by mLock status_t selectTrack_l(int32_t index); + status_t createOutOfBandTextSource( + const char *mimeType, const sp<DataSource>& dataSource); DISALLOW_EVIL_CONSTRUCTORS(TimedTextDriver); }; diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index f96a4df..120a410 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -2292,7 +2292,7 @@ status_t AwesomePlayer::invoke(const Parcel &request, Parcel *reply) { } int fd = request.readFileDescriptor(); off64_t offset = request.readInt64(); - size_t length = request.readInt64(); + off64_t length = request.readInt64(); String8 mimeType(request.readString16()); return mTextDriver->addOutOfBandTextSource( fd, offset, length, mimeType); diff --git a/media/libstagefright/StagefrightMediaScanner.cpp b/media/libstagefright/StagefrightMediaScanner.cpp index 711a8cd..b7cf96e 100644 --- a/media/libstagefright/StagefrightMediaScanner.cpp +++ b/media/libstagefright/StagefrightMediaScanner.cpp @@ -18,6 +18,10 @@ #define LOG_TAG "StagefrightMediaScanner" #include <utils/Log.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> + #include <media/stagefright/StagefrightMediaScanner.h> #include <media/mediametadataretriever.h> @@ -139,7 +143,16 @@ MediaScanResult StagefrightMediaScanner::processFileInternal( sp<MediaMetadataRetriever> mRetriever(new MediaMetadataRetriever); - status_t status = mRetriever->setDataSource(path); + int fd = open(path, O_RDONLY | O_LARGEFILE); + status_t status; + if (fd < 0) { + // couldn't open it locally, maybe the media server can? + status = mRetriever->setDataSource(path); + } else { + status = mRetriever->setDataSource(fd, 0, 0x7ffffffffffffffL); + close(fd); + } + if (status) { return MEDIA_SCAN_RESULT_ERROR; } diff --git a/media/libstagefright/timedtext/TimedTextDriver.cpp b/media/libstagefright/timedtext/TimedTextDriver.cpp index 8ee15f8..a99d882 100644 --- a/media/libstagefright/timedtext/TimedTextDriver.cpp +++ b/media/libstagefright/timedtext/TimedTextDriver.cpp @@ -23,6 +23,7 @@ #include <media/mediaplayer.h> #include <media/MediaPlayerInterface.h> #include <media/stagefright/DataSource.h> +#include <media/stagefright/FileSource.h> #include <media/stagefright/MediaDefs.h> #include <media/stagefright/MediaErrors.h> #include <media/stagefright/MediaSource.h> @@ -161,15 +162,32 @@ status_t TimedTextDriver::addInBandTextSource( status_t TimedTextDriver::addOutOfBandTextSource( const char *uri, const char *mimeType) { - // TODO: Define "TimedTextSource::CreateFromURI(uri)" - // and move below lines there..? - // To support local subtitle file only for now if (strncasecmp("file://", uri, 7)) { + ALOGE("uri('%s') is not a file", uri); return ERROR_UNSUPPORTED; } + sp<DataSource> dataSource = DataSource::CreateFromURI(uri); + return createOutOfBandTextSource(mimeType, dataSource); +} + +status_t TimedTextDriver::addOutOfBandTextSource( + int fd, off64_t offset, off64_t length, const char *mimeType) { + + if (fd < 0) { + ALOGE("Invalid file descriptor: %d", fd); + return ERROR_UNSUPPORTED; + } + + sp<DataSource> dataSource = new FileSource(dup(fd), offset, length); + return createOutOfBandTextSource(mimeType, dataSource); +} + +status_t TimedTextDriver::createOutOfBandTextSource( + const char *mimeType, const sp<DataSource>& dataSource) { + if (dataSource == NULL) { return ERROR_UNSUPPORTED; } @@ -189,13 +207,6 @@ status_t TimedTextDriver::addOutOfBandTextSource( return OK; } -status_t TimedTextDriver::addOutOfBandTextSource( - int fd, off64_t offset, size_t length, const char *mimeType) { - // Not supported yet. This requires DataSource::sniff to detect various text - // formats such as srt/smi/ttml. - return ERROR_UNSUPPORTED; -} - void TimedTextDriver::getTrackInfo(Parcel *parcel) { Mutex::Autolock autoLock(mLock); Vector<sp<TimedTextSource> >::const_iterator iter; @@ -203,19 +214,18 @@ void TimedTextDriver::getTrackInfo(Parcel *parcel) { for (iter = mTextSourceVector.begin(); iter != mTextSourceVector.end(); ++iter) { sp<MetaData> meta = (*iter)->getFormat(); - if (meta != NULL) { - // There are two fields. - parcel->writeInt32(2); - // track type. - parcel->writeInt32(MEDIA_TRACK_TYPE_TIMEDTEXT); + // There are two fields. + parcel->writeInt32(2); - const char *lang = "und"; + // track type. + parcel->writeInt32(MEDIA_TRACK_TYPE_TIMEDTEXT); + + const char *lang = "und"; + if (meta != NULL) { meta->findCString(kKeyMediaLanguage, &lang); - parcel->writeString16(String16(lang)); - } else { - parcel->writeInt32(0); } + parcel->writeString16(String16(lang)); } } diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp index 9b4fb7a..d0611b0 100644 --- a/services/audioflinger/AudioFlinger.cpp +++ b/services/audioflinger/AudioFlinger.cpp @@ -4045,11 +4045,11 @@ void AudioFlinger::PlaybackThread::TimedTrack::updateFramesPendingAfterTrim_l( uint32_t bufBytes = buf.buffer()->size(); uint32_t consumedAlready = buf.position(); - ALOG_ASSERT(consumedAlready <= bufFrames, + ALOG_ASSERT(consumedAlready <= bufBytes, "Bad bookkeeping while updating frames pending. Timed buffer is" " only %u bytes long, but claims to have consumed %u" " bytes. (update reason: \"%s\")", - bufFrames, consumedAlready, logTag); + bufBytes, consumedAlready, logTag); uint32_t bufFrames = (bufBytes - consumedAlready) / mCblk->frameSize; ALOG_ASSERT(mFramesPendingInQueue >= bufFrames, |