diff options
author | James Dong <jdong@google.com> | 2009-09-06 14:29:45 -0700 |
---|---|---|
committer | James Dong <jdong@google.com> | 2009-09-08 11:04:53 -0700 |
commit | 148c1a2a96774517407717b61e5bc9cb08be8806 (patch) | |
tree | c6c4a5aff75009eddb3f89dfe7ba5f4ed9f75d40 /media/libmediaplayerservice/MetadataRetrieverClient.cpp | |
parent | e07db23c4935e47ecedfec7537ba95163e5836e5 (diff) | |
download | frameworks_av-148c1a2a96774517407717b61e5bc9cb08be8806.zip frameworks_av-148c1a2a96774517407717b61e5bc9cb08be8806.tar.gz frameworks_av-148c1a2a96774517407717b61e5bc9cb08be8806.tar.bz2 |
Add basic metadata retrieval support for midi, ogg, etc.
Bug 2050320
Diffstat (limited to 'media/libmediaplayerservice/MetadataRetrieverClient.cpp')
-rw-r--r-- | media/libmediaplayerservice/MetadataRetrieverClient.cpp | 66 |
1 files changed, 55 insertions, 11 deletions
diff --git a/media/libmediaplayerservice/MetadataRetrieverClient.cpp b/media/libmediaplayerservice/MetadataRetrieverClient.cpp index ba8d9a8..b34421d 100644 --- a/media/libmediaplayerservice/MetadataRetrieverClient.cpp +++ b/media/libmediaplayerservice/MetadataRetrieverClient.cpp @@ -34,12 +34,15 @@ #include <media/MediaPlayerInterface.h> #include <media/PVMetadataRetriever.h> #include <private/media/VideoFrame.h> - +#include "VorbisMetadataRetriever.h" +#include "MidiMetadataRetriever.h" #include "MetadataRetrieverClient.h" - namespace android { +extern player_type getPlayerType(const char* url); +extern player_type getPlayerType(int fd, int64_t offset, int64_t length); + MetadataRetrieverClient::MetadataRetrieverClient(pid_t pid) { LOGV("MetadataRetrieverClient constructor pid(%d)", pid); @@ -90,6 +93,36 @@ void MetadataRetrieverClient::disconnect() IPCThreadState::self()->flushCommands(); } +static sp<MediaMetadataRetrieverBase> createRetriever(player_type playerType) +{ + sp<MediaMetadataRetrieverBase> p; + switch (playerType) { +#ifndef NO_OPENCORE + case PV_PLAYER: + LOGV("create pv metadata retriever"); + p = new PVMetadataRetriever(); + break; +#endif + case VORBIS_PLAYER: + LOGV("create vorbis metadata retriever"); + p = new VorbisMetadataRetriever(); + break; + case SONIVOX_PLAYER: + LOGV("create midi metadata retriever"); + p = new MidiMetadataRetriever(); + break; + default: + // TODO: + // support for STAGEFRIGHT_PLAYER and TEST_PLAYER + LOGE("player type %d is not supported", playerType); + break; + } + if (p == NULL) { + LOGE("failed to create a retriever object"); + } + return p; +} + status_t MetadataRetrieverClient::setDataSource(const char *url) { LOGV("setDataSource(%s)", url); @@ -97,11 +130,13 @@ status_t MetadataRetrieverClient::setDataSource(const char *url) if (url == NULL) { return UNKNOWN_ERROR; } - if (mRetriever == NULL) { - LOGE("retriever is not initialized"); - return NO_INIT; - } - return mRetriever->setDataSource(url); + player_type playerType = getPlayerType(url); + LOGV("player type = %d", playerType); + sp<MediaMetadataRetrieverBase> p = createRetriever(playerType); + if (p == NULL) return NO_INIT; + status_t ret = p->setDataSource(url); + if (ret == NO_ERROR) mRetriever = p; + return ret; } status_t MetadataRetrieverClient::setDataSource(int fd, int64_t offset, int64_t length) @@ -118,7 +153,7 @@ status_t MetadataRetrieverClient::setDataSource(int fd, int64_t offset, int64_t int ret = fstat(fd, &sb); if (ret != 0) { LOGE("fstat(%d) failed: %d, %s", fd, ret, strerror(errno)); - return UNKNOWN_ERROR; + return BAD_VALUE; } LOGV("st_dev = %llu", sb.st_dev); LOGV("st_mode = %u", sb.st_mode); @@ -129,13 +164,22 @@ status_t MetadataRetrieverClient::setDataSource(int fd, int64_t offset, int64_t if (offset >= sb.st_size) { LOGE("offset (%lld) bigger than file size (%llu)", offset, sb.st_size); ::close(fd); - return UNKNOWN_ERROR; + return BAD_VALUE; } if (offset + length > sb.st_size) { length = sb.st_size - offset; - LOGE("calculated length = %lld", length); + LOGV("calculated length = %lld", length); + } + + player_type playerType = getPlayerType(fd, offset, length); + LOGV("player type = %d", playerType); + sp<MediaMetadataRetrieverBase> p = createRetriever(playerType); + if (p == NULL) { + ::close(fd); + return NO_INIT; } - status_t status = mRetriever->setDataSource(fd, offset, length); + status_t status = p->setDataSource(fd, offset, length); + if (status == NO_ERROR) mRetriever = p; ::close(fd); return status; } |