diff options
Diffstat (limited to 'media')
-rw-r--r-- | media/java/android/media/MediaScanner.java | 20 | ||||
-rw-r--r-- | media/libmediaplayerservice/MediaPlayerService.cpp | 90 | ||||
-rw-r--r-- | media/libmediaplayerservice/MediaPlayerService.h | 6 | ||||
-rw-r--r-- | media/libstagefright/AudioPlayer.cpp | 18 | ||||
-rw-r--r-- | media/libstagefright/MPEG4Extractor.cpp | 2 | ||||
-rw-r--r-- | media/libstagefright/OMXCodec.cpp | 1 | ||||
-rw-r--r-- | media/tests/SoundPoolTest/src/com/android/SoundPoolTest.java | 3 |
7 files changed, 115 insertions, 25 deletions
diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java index 8c1b0ea..34252ab 100644 --- a/media/java/android/media/MediaScanner.java +++ b/media/java/android/media/MediaScanner.java @@ -16,10 +16,14 @@ package android.media; +import org.xml.sax.Attributes; +import org.xml.sax.ContentHandler; +import org.xml.sax.SAXException; + +import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; import android.content.IContentProvider; -import android.content.ContentUris; import android.database.Cursor; import android.database.SQLException; import android.graphics.BitmapFactory; @@ -42,11 +46,12 @@ import android.util.Config; import android.util.Log; import android.util.Xml; -import org.xml.sax.Attributes; -import org.xml.sax.ContentHandler; -import org.xml.sax.SAXException; - -import java.io.*; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileDescriptor; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -586,6 +591,9 @@ public class MediaScanner } if (genreCode >= 0 && genreCode < ID3_GENRES.length) { value = ID3_GENRES[genreCode]; + } else if (genreCode == 255) { + // 255 is defined to be unknown + value = null; } } mGenre = value; diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp index 8e61011..55b06f4 100644 --- a/media/libmediaplayerservice/MediaPlayerService.cpp +++ b/media/libmediaplayerservice/MediaPlayerService.cpp @@ -1597,9 +1597,12 @@ void MediaPlayerService::AudioOutput::CallbackWrapper( AudioOutput *me = (AudioOutput *)cookie; AudioTrack::Buffer *buffer = (AudioTrack::Buffer *)info; - (*me->mCallback)( + size_t actualSize = (*me->mCallback)( me, buffer->raw, buffer->size, me->mCallbackCookie); - me->snoopWrite(buffer->raw, buffer->size); + + if (actualSize > 0) { + me->snoopWrite(buffer->raw, actualSize); + } } #undef LOG_TAG @@ -1629,14 +1632,75 @@ status_t MediaPlayerService::AudioCache::getPosition(uint32_t *position) return NO_ERROR; } +//////////////////////////////////////////////////////////////////////////////// + +struct CallbackThread : public Thread { + CallbackThread(const wp<MediaPlayerBase::AudioSink> &sink, + MediaPlayerBase::AudioSink::AudioCallback cb, + void *cookie); + +protected: + virtual ~CallbackThread(); + + virtual bool threadLoop(); + +private: + wp<MediaPlayerBase::AudioSink> mSink; + MediaPlayerBase::AudioSink::AudioCallback mCallback; + void *mCookie; + void *mBuffer; + size_t mBufferSize; + + CallbackThread(const CallbackThread &); + CallbackThread &operator=(const CallbackThread &); +}; + +CallbackThread::CallbackThread( + const wp<MediaPlayerBase::AudioSink> &sink, + MediaPlayerBase::AudioSink::AudioCallback cb, + void *cookie) + : mSink(sink), + mCallback(cb), + mCookie(cookie), + mBuffer(NULL), + mBufferSize(0) { +} + +CallbackThread::~CallbackThread() { + if (mBuffer) { + free(mBuffer); + mBuffer = NULL; + } +} + +bool CallbackThread::threadLoop() { + sp<MediaPlayerBase::AudioSink> sink = mSink.promote(); + if (sink == NULL) { + return false; + } + + if (mBuffer == NULL) { + mBufferSize = sink->bufferSize(); + mBuffer = malloc(mBufferSize); + } + + size_t actualSize = + (*mCallback)(sink.get(), mBuffer, mBufferSize, mCookie); + + if (actualSize > 0) { + sink->write(mBuffer, actualSize); + } + + return true; +} + +//////////////////////////////////////////////////////////////////////////////// + status_t MediaPlayerService::AudioCache::open( uint32_t sampleRate, int channelCount, int format, int bufferCount, AudioCallback cb, void *cookie) { LOGV("open(%u, %d, %d, %d)", sampleRate, channelCount, format, bufferCount); - if (cb != NULL) { - return UNKNOWN_ERROR; // TODO: implement this. - } if (mHeap->getHeapID() < 0) { return NO_INIT; } @@ -1645,9 +1709,25 @@ status_t MediaPlayerService::AudioCache::open( mChannelCount = (uint16_t)channelCount; mFormat = (uint16_t)format; mMsecsPerFrame = 1.e3 / (float) sampleRate; + + if (cb != NULL) { + mCallbackThread = new CallbackThread(this, cb, cookie); + } return NO_ERROR; } +void MediaPlayerService::AudioCache::start() { + if (mCallbackThread != NULL) { + mCallbackThread->run("AudioCache callback"); + } +} + +void MediaPlayerService::AudioCache::stop() { + if (mCallbackThread != NULL) { + mCallbackThread->requestExitAndWait(); + } +} + ssize_t MediaPlayerService::AudioCache::write(const void* buffer, size_t size) { LOGV("write(%p, %u)", buffer, size); diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h index ffe1ba0..5c03e47 100644 --- a/media/libmediaplayerservice/MediaPlayerService.h +++ b/media/libmediaplayerservice/MediaPlayerService.h @@ -139,9 +139,9 @@ class MediaPlayerService : public BnMediaPlayerService int bufferCount = 1, AudioCallback cb = NULL, void *cookie = NULL); - virtual void start() {} + virtual void start(); virtual ssize_t write(const void* buffer, size_t size); - virtual void stop() {} + virtual void stop(); virtual void flush() {} virtual void pause() {} virtual void close() {} @@ -171,6 +171,8 @@ class MediaPlayerService : public BnMediaPlayerService uint32_t mSize; int mError; bool mCommandComplete; + + sp<Thread> mCallbackThread; }; public: diff --git a/media/libstagefright/AudioPlayer.cpp b/media/libstagefright/AudioPlayer.cpp index 4926920..12d7ee2 100644 --- a/media/libstagefright/AudioPlayer.cpp +++ b/media/libstagefright/AudioPlayer.cpp @@ -187,12 +187,12 @@ bool AudioPlayer::reachedEOS() { } // static -void AudioPlayer::AudioSinkCallback( +size_t AudioPlayer::AudioSinkCallback( MediaPlayerBase::AudioSink *audioSink, void *buffer, size_t size, void *cookie) { AudioPlayer *me = (AudioPlayer *)cookie; - me->fillBuffer(buffer, size); + return me->fillBuffer(buffer, size); } void AudioPlayer::AudioCallback(int event, void *info) { @@ -201,17 +201,18 @@ void AudioPlayer::AudioCallback(int event, void *info) { } AudioTrack::Buffer *buffer = (AudioTrack::Buffer *)info; - fillBuffer(buffer->raw, buffer->size); + size_t numBytesWritten = fillBuffer(buffer->raw, buffer->size); + + buffer->size = numBytesWritten; } -void AudioPlayer::fillBuffer(void *data, size_t size) { +size_t AudioPlayer::fillBuffer(void *data, size_t size) { if (mNumFramesPlayed == 0) { LOGV("AudioCallback"); } if (mReachedEOS) { - memset(data, 0, size); - return; + return 0; } size_t size_done = 0; @@ -244,7 +245,6 @@ void AudioPlayer::fillBuffer(void *data, size_t size) { if (err != OK) { mReachedEOS = true; - memset((char *)data + size_done, 0, size_remaining); break; } @@ -285,7 +285,9 @@ void AudioPlayer::fillBuffer(void *data, size_t size) { } Mutex::Autolock autoLock(mLock); - mNumFramesPlayed += size / mFrameSize; + mNumFramesPlayed += size_done / mFrameSize; + + return size_done; } int64_t AudioPlayer::getRealTimeUs() { diff --git a/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/MPEG4Extractor.cpp index 4458006..1ff38ee 100644 --- a/media/libstagefright/MPEG4Extractor.cpp +++ b/media/libstagefright/MPEG4Extractor.cpp @@ -1540,7 +1540,7 @@ bool SniffMPEG4( if (!memcmp(header, "ftyp3gp", 7) || !memcmp(header, "ftypmp42", 8) || !memcmp(header, "ftypisom", 8) || !memcmp(header, "ftypM4V ", 8) - || !memcmp(header, "ftypM4A ", 8)) { + || !memcmp(header, "ftypM4A ", 8) || !memcmp(header, "ftypf4v ", 8)) { *mimeType = MEDIA_MIMETYPE_CONTAINER_MPEG4; *confidence = 0.1; diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index c6c6f21..75b7b6f 100644 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -112,7 +112,6 @@ static const CodecInfo kDecoderInfo[] = { { MEDIA_MIMETYPE_VIDEO_MPEG4, "OMX.TI.Video.Decoder" }, { MEDIA_MIMETYPE_VIDEO_MPEG4, "M4vH263Decoder" }, { MEDIA_MIMETYPE_VIDEO_H263, "OMX.qcom.video.decoder.h263" }, - { MEDIA_MIMETYPE_VIDEO_H263, "OMX.TI.Video.Decoder" }, { MEDIA_MIMETYPE_VIDEO_H263, "M4vH263Decoder" }, { MEDIA_MIMETYPE_VIDEO_AVC, "OMX.qcom.video.decoder.avc" }, { MEDIA_MIMETYPE_VIDEO_AVC, "OMX.TI.Video.Decoder" }, diff --git a/media/tests/SoundPoolTest/src/com/android/SoundPoolTest.java b/media/tests/SoundPoolTest/src/com/android/SoundPoolTest.java index 6b3093f..1434d3f 100644 --- a/media/tests/SoundPoolTest/src/com/android/SoundPoolTest.java +++ b/media/tests/SoundPoolTest/src/com/android/SoundPoolTest.java @@ -43,10 +43,9 @@ public class SoundPoolTest extends Activity private TestThread mThread; private static final int[] mTestFiles = new int[] { - // FIXME: Restore when Stagefright bug is fixed R.raw.organ441, R.raw.sine441, - //R.raw.test1, + R.raw.test1, R.raw.test2, R.raw.test3, R.raw.test4, |