diff options
Diffstat (limited to 'media')
41 files changed, 349 insertions, 453 deletions
diff --git a/media/java/android/mtp/MtpDatabase.java b/media/java/android/mtp/MtpDatabase.java index c9e0f6f..4e271c7 100644 --- a/media/java/android/mtp/MtpDatabase.java +++ b/media/java/android/mtp/MtpDatabase.java @@ -92,13 +92,18 @@ public class MtpDatabase { }; private static final String ID_WHERE = Files.FileColumns._ID + "=?"; private static final String PATH_WHERE = Files.FileColumns.DATA + "=?"; - private static final String PARENT_WHERE = Files.FileColumns.PARENT + "=?"; - private static final String PARENT_FORMAT_WHERE = PARENT_WHERE + " AND " - + Files.FileColumns.FORMAT + "=?"; - private static final String PARENT_STORAGE_WHERE = PARENT_WHERE + " AND " - + Files.FileColumns.STORAGE_ID + "=?"; - private static final String PARENT_STORAGE_FORMAT_WHERE = PARENT_STORAGE_WHERE + " AND " + + private static final String STORAGE_WHERE = Files.FileColumns.STORAGE_ID + "=?"; + private static final String FORMAT_WHERE = Files.FileColumns.PARENT + "=?"; + private static final String PARENT_WHERE = Files.FileColumns.FORMAT + "=?"; + private static final String STORAGE_FORMAT_WHERE = STORAGE_WHERE + " AND " + Files.FileColumns.FORMAT + "=?"; + private static final String STORAGE_PARENT_WHERE = STORAGE_WHERE + " AND " + + Files.FileColumns.PARENT + "=?"; + private static final String FORMAT_PARENT_WHERE = FORMAT_WHERE + " AND " + + Files.FileColumns.PARENT + "=?"; + private static final String STORAGE_FORMAT_PARENT_WHERE = STORAGE_FORMAT_WHERE + " AND " + + Files.FileColumns.PARENT + "=?"; private final MediaScanner mMediaScanner; @@ -249,26 +254,67 @@ public class MtpDatabase { } private Cursor createObjectQuery(int storageID, int format, int parent) throws RemoteException { - if (storageID != 0) { - if (format != 0) { - return mMediaProvider.query(mObjectsUri, ID_PROJECTION, - PARENT_STORAGE_FORMAT_WHERE, - new String[] { Integer.toString(parent), Integer.toString(storageID), - Integer.toString(format) }, null); + if (storageID == 0xFFFFFFFF) { + // query all stores + if (format == 0) { + // query all formats + if (parent == 0) { + // query all objects + return mMediaProvider.query(mObjectsUri, ID_PROJECTION, null, null, null); + } + if (parent == 0xFFFFFFFF) { + // all objects in root of store + parent = 0; + } + return mMediaProvider.query(mObjectsUri, ID_PROJECTION, PARENT_WHERE, + new String[] { Integer.toString(parent) }, null); } else { - return mMediaProvider.query(mObjectsUri, ID_PROJECTION, - PARENT_STORAGE_WHERE, new String[] - { Integer.toString(parent), Integer.toString(storageID) }, null); + // query specific format + if (parent == 0) { + // query all objects + return mMediaProvider.query(mObjectsUri, ID_PROJECTION, FORMAT_WHERE, + new String[] { Integer.toString(format) }, null); + } + if (parent == 0xFFFFFFFF) { + // all objects in root of store + parent = 0; + } + return mMediaProvider.query(mObjectsUri, ID_PROJECTION, FORMAT_PARENT_WHERE, + new String[] { Integer.toString(format), Integer.toString(parent) }, null); } } else { - if (format != 0) { - return mMediaProvider.query(mObjectsUri, ID_PROJECTION, - PARENT_FORMAT_WHERE, - new String[] { Integer.toString(parent), Integer.toString(format) }, - null); + // query specific store + if (format == 0) { + // query all formats + if (parent == 0) { + // query all objects + return mMediaProvider.query(mObjectsUri, ID_PROJECTION, STORAGE_WHERE, + new String[] { Integer.toString(storageID) }, null); + } + if (parent == 0xFFFFFFFF) { + // all objects in root of store + parent = 0; + } + return mMediaProvider.query(mObjectsUri, ID_PROJECTION, STORAGE_PARENT_WHERE, + new String[] { Integer.toString(storageID), Integer.toString(parent) }, + null); } else { - return mMediaProvider.query(mObjectsUri, ID_PROJECTION, - PARENT_WHERE, new String[] { Integer.toString(parent) }, null); + // query specific format + if (parent == 0) { + // query all objects + return mMediaProvider.query(mObjectsUri, ID_PROJECTION, STORAGE_FORMAT_WHERE, + new String[] { Integer.toString(storageID), Integer.toString(format) }, + null); + } + if (parent == 0xFFFFFFFF) { + // all objects in root of store + parent = 0; + } + return mMediaProvider.query(mObjectsUri, ID_PROJECTION, STORAGE_FORMAT_PARENT_WHERE, + new String[] { Integer.toString(storageID), + Integer.toString(format), + Integer.toString(parent) }, + null); } } } diff --git a/media/java/android/mtp/MtpServer.java b/media/java/android/mtp/MtpServer.java index 687cc44..0133cf6 100644 --- a/media/java/android/mtp/MtpServer.java +++ b/media/java/android/mtp/MtpServer.java @@ -33,8 +33,8 @@ public class MtpServer { System.loadLibrary("media_jni"); } - public MtpServer(MtpDatabase database) { - native_setup(database); + public MtpServer(MtpDatabase database, boolean usePtp) { + native_setup(database, usePtp); } public void start() { @@ -69,7 +69,7 @@ public class MtpServer { native_remove_storage(storage.getStorageId()); } - private native final void native_setup(MtpDatabase database); + private native final void native_setup(MtpDatabase database, boolean usePtp); private native final void native_start(); private native final void native_stop(); private native final void native_send_object_added(int handle); diff --git a/media/jni/android_mtp_MtpServer.cpp b/media/jni/android_mtp_MtpServer.cpp index e36e6db..aaf85c3 100644 --- a/media/jni/android_mtp_MtpServer.cpp +++ b/media/jni/android_mtp_MtpServer.cpp @@ -68,13 +68,15 @@ static bool ExceptionCheck(void* env) class MtpThread : public Thread { private: MtpDatabase* mDatabase; + bool mPtp; MtpServer* mServer; MtpStorageList mStorageList; int mFd; public: - MtpThread(MtpDatabase* database) + MtpThread(MtpDatabase* database, bool usePtp) : mDatabase(database), + mPtp(usePtp), mServer(NULL), mFd(-1) { @@ -113,7 +115,7 @@ public: mFd = open("/dev/mtp_usb", O_RDWR); if (mFd >= 0) { - mServer = new MtpServer(mFd, mDatabase, AID_MEDIA_RW, 0664, 0775); + mServer = new MtpServer(mFd, mDatabase, mPtp, AID_MEDIA_RW, 0664, 0775); for (size_t i = 0; i < mStorageList.size(); i++) { mServer->addStorage(mStorageList[i]); } @@ -156,11 +158,11 @@ static sp<MtpThread> sThread; #endif // HAVE_ANDROID_OS static void -android_mtp_MtpServer_setup(JNIEnv *env, jobject thiz, jobject javaDatabase) +android_mtp_MtpServer_setup(JNIEnv *env, jobject thiz, jobject javaDatabase, jboolean usePtp) { #ifdef HAVE_ANDROID_OS // create the thread and assign it to the smart pointer - sThread = new MtpThread(getMtpDatabase(env, javaDatabase)); + sThread = new MtpThread(getMtpDatabase(env, javaDatabase), usePtp); #endif } @@ -263,7 +265,7 @@ android_mtp_MtpServer_remove_storage(JNIEnv *env, jobject thiz, jint storageId) // ---------------------------------------------------------------------------- static JNINativeMethod gMethods[] = { - {"native_setup", "(Landroid/mtp/MtpDatabase;)V", + {"native_setup", "(Landroid/mtp/MtpDatabase;Z)V", (void *)android_mtp_MtpServer_setup}, {"native_start", "()V", (void *)android_mtp_MtpServer_start}, {"native_stop", "()V", (void *)android_mtp_MtpServer_stop}, diff --git a/media/jni/soundpool/SoundPool.cpp b/media/jni/soundpool/SoundPool.cpp index 3ea13a6..4ffb2c0 100644 --- a/media/jni/soundpool/SoundPool.cpp +++ b/media/jni/soundpool/SoundPool.cpp @@ -23,7 +23,6 @@ // XXX needed for timing latency #include <utils/Timers.h> -#include <sys/resource.h> #include <media/AudioTrack.h> #include <media/mediaplayer.h> diff --git a/media/libeffects/factory/EffectsFactory.c b/media/libeffects/factory/EffectsFactory.c index b0e8585..a3e76d9 100644 --- a/media/libeffects/factory/EffectsFactory.c +++ b/media/libeffects/factory/EffectsFactory.c @@ -257,7 +257,7 @@ int EffectCreate(effect_uuid_t *uuid, int32_t sessionId, int32_t ioId, effect_ha } // create effect in library - l->desc->create_effect(uuid, sessionId, ioId, &itfe); + ret = l->desc->create_effect(uuid, sessionId, ioId, &itfe); if (ret != 0) { LOGW("EffectCreate() library %s: could not create fx %s, error %d", l->name, d->name, ret); goto exit; diff --git a/media/libmedia/ToneGenerator.cpp b/media/libmedia/ToneGenerator.cpp index 9f1b3d6..7c2200e 100644 --- a/media/libmedia/ToneGenerator.cpp +++ b/media/libmedia/ToneGenerator.cpp @@ -21,7 +21,6 @@ #include <stdio.h> #include <math.h> #include <utils/Log.h> -#include <sys/resource.h> #include <utils/RefBase.h> #include <utils/Timers.h> #include <cutils/properties.h> diff --git a/media/libmediaplayerservice/MetadataRetrieverClient.cpp b/media/libmediaplayerservice/MetadataRetrieverClient.cpp index 06fb103..d574ea3 100644 --- a/media/libmediaplayerservice/MetadataRetrieverClient.cpp +++ b/media/libmediaplayerservice/MetadataRetrieverClient.cpp @@ -21,7 +21,6 @@ #include <sys/types.h> #include <sys/stat.h> -#include <sys/resource.h> #include <dirent.h> #include <unistd.h> diff --git a/media/libstagefright/AACWriter.cpp b/media/libstagefright/AACWriter.cpp index 8413208..d133e91 100644 --- a/media/libstagefright/AACWriter.cpp +++ b/media/libstagefright/AACWriter.cpp @@ -27,7 +27,6 @@ #include <media/stagefright/MetaData.h> #include <media/mediarecorder.h> #include <sys/prctl.h> -#include <sys/resource.h> #include <fcntl.h> namespace android { diff --git a/media/libstagefright/AMRWriter.cpp b/media/libstagefright/AMRWriter.cpp index b10d52c..6436071 100644 --- a/media/libstagefright/AMRWriter.cpp +++ b/media/libstagefright/AMRWriter.cpp @@ -23,7 +23,6 @@ #include <media/stagefright/MetaData.h> #include <media/mediarecorder.h> #include <sys/prctl.h> -#include <sys/resource.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> diff --git a/media/libstagefright/MPEG4Writer.cpp b/media/libstagefright/MPEG4Writer.cpp index 28add18..58f6699 100644 --- a/media/libstagefright/MPEG4Writer.cpp +++ b/media/libstagefright/MPEG4Writer.cpp @@ -22,7 +22,6 @@ #include <pthread.h> #include <sys/prctl.h> -#include <sys/resource.h> #include <media/stagefright/MPEG4Writer.h> #include <media/stagefright/MediaBuffer.h> @@ -1975,7 +1974,17 @@ status_t MPEG4Writer::Track::threadEntry() { int64_t previousPausedDurationUs = 0; int64_t timestampUs = 0; int64_t cttsDeltaTimeUs = 0; + bool hasBFrames = false; +#if 1 + // XXX: Samsung's video encoder's output buffer timestamp + // is not correct. see bug 4724339 + char value[PROPERTY_VALUE_MAX]; + if (property_get("rw.media.record.hasb", value, NULL) && + (!strcasecmp(value, "true") || !strcasecmp(value, "1"))) { + hasBFrames = true; + } +#endif if (mIsAudio) { prctl(PR_SET_NAME, (unsigned long)"AudioTrackEncoding", 0, 0, 0); } else { @@ -2118,7 +2127,7 @@ status_t MPEG4Writer::Track::threadEntry() { timestampUs -= previousPausedDurationUs; CHECK(timestampUs >= 0); - if (!mIsAudio) { + if (!mIsAudio && hasBFrames) { /* * Composition time: timestampUs * Decoding time: decodingTimeUs diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index c4fcc79..bb8a8be 100644 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -1983,7 +1983,14 @@ OMXCodec::BufferInfo* OMXCodec::dequeueBufferFromNativeWindow() { int64_t OMXCodec::retrieveDecodingTimeUs(bool isCodecSpecific) { CHECK(mIsEncoder); - CHECK(!mDecodingTimeList.empty()); + + if (mDecodingTimeList.empty()) { + CHECK(mNoMoreOutputData); + // No corresponding input frame available. + // This could happen when EOS is reached. + return 0; + } + List<int64_t>::iterator it = mDecodingTimeList.begin(); int64_t timeUs = *it; @@ -2152,11 +2159,6 @@ void OMXCodec::on_message(const omx_message &msg) { buffer->meta_data()->setInt32(kKeyIsUnreadable, true); } - if (mIsEncoder) { - int64_t decodingTimeUs = retrieveDecodingTimeUs(isCodecSpecific); - buffer->meta_data()->setInt64(kKeyDecodingTime, decodingTimeUs); - } - buffer->meta_data()->setPointer( kKeyPlatformPrivate, msg.u.extended_buffer_data.platform_private); @@ -2170,6 +2172,11 @@ void OMXCodec::on_message(const omx_message &msg) { mNoMoreOutputData = true; } + if (mIsEncoder) { + int64_t decodingTimeUs = retrieveDecodingTimeUs(isCodecSpecific); + buffer->meta_data()->setInt64(kKeyDecodingTime, decodingTimeUs); + } + if (mTargetTimeUs >= 0) { CHECK(msg.u.extended_buffer_data.timestamp <= mTargetTimeUs); diff --git a/media/libstagefright/OggExtractor.cpp b/media/libstagefright/OggExtractor.cpp index 1560b8e..29e6907 100644 --- a/media/libstagefright/OggExtractor.cpp +++ b/media/libstagefright/OggExtractor.cpp @@ -730,8 +730,9 @@ status_t MyVorbisExtractor::verifyHeader( off64_t size; if (mSource->getSize(&size) == OK) { uint64_t bps = approxBitrate(); - - mMeta->setInt64(kKeyDuration, size * 8000000ll / bps); + if (bps != 0) { + mMeta->setInt64(kKeyDuration, size * 8000000ll / bps); + } } break; } diff --git a/media/libstagefright/SampleTable.cpp b/media/libstagefright/SampleTable.cpp index eb135ab..a8a094e 100644 --- a/media/libstagefright/SampleTable.cpp +++ b/media/libstagefright/SampleTable.cpp @@ -416,12 +416,16 @@ void SampleTable::buildSampleEntriesTable() { uint32_t delta = mTimeToSample[2 * i + 1]; for (uint32_t j = 0; j < n; ++j) { - CHECK(sampleIndex < mNumSampleSizes); + if (sampleIndex < mNumSampleSizes) { + // Technically this should always be the case if the file + // is well-formed, but you know... there's (gasp) malformed + // content out there. - mSampleTimeEntries[sampleIndex].mSampleIndex = sampleIndex; + mSampleTimeEntries[sampleIndex].mSampleIndex = sampleIndex; - mSampleTimeEntries[sampleIndex].mCompositionTime = - sampleTime + getCompositionTimeOffset(sampleIndex); + mSampleTimeEntries[sampleIndex].mCompositionTime = + sampleTime + getCompositionTimeOffset(sampleIndex); + } ++sampleIndex; sampleTime += delta; diff --git a/media/libstagefright/TimedEventQueue.cpp b/media/libstagefright/TimedEventQueue.cpp index a08eb7b..100d8a3 100644 --- a/media/libstagefright/TimedEventQueue.cpp +++ b/media/libstagefright/TimedEventQueue.cpp @@ -30,7 +30,6 @@ #include <sys/prctl.h> #include <sys/time.h> -#include <sys/resource.h> #include <media/stagefright/MediaDebug.h> diff --git a/media/libstagefright/codecs/aacdec/SoftAAC.cpp b/media/libstagefright/codecs/aacdec/SoftAAC.cpp index 7ce6128..bbd6dbb 100644 --- a/media/libstagefright/codecs/aacdec/SoftAAC.cpp +++ b/media/libstagefright/codecs/aacdec/SoftAAC.cpp @@ -367,7 +367,15 @@ void SoftAAC::onQueueFilled(OMX_U32 portIndex) { inHeader->nFilledLen -= mConfig->inputBufferUsedLength; inHeader->nOffset += mConfig->inputBufferUsedLength; } else { + LOGW("AAC decoder returned error %d, substituting silence", + decoderErr); + memset(outHeader->pBuffer + outHeader->nOffset, 0, numOutBytes); + + // Discard input buffer. + inHeader->nFilledLen = 0; + + // fall through } if (mUpsamplingFactor == 2) { diff --git a/media/libstagefright/codecs/on2/dec/SoftVPX.cpp b/media/libstagefright/codecs/on2/dec/SoftVPX.cpp index e9ce719..7e83163 100644 --- a/media/libstagefright/codecs/on2/dec/SoftVPX.cpp +++ b/media/libstagefright/codecs/on2/dec/SoftVPX.cpp @@ -117,11 +117,27 @@ void SoftVPX::initPorts() { addPort(def); } +static int GetCPUCoreCount() { + int cpuCoreCount = 1; +#if defined(_SC_NPROCESSORS_ONLN) + cpuCoreCount = sysconf(_SC_NPROCESSORS_ONLN); +#else + // _SC_NPROC_ONLN must be defined... + cpuCoreCount = sysconf(_SC_NPROC_ONLN); +#endif + CHECK(cpuCoreCount >= 1); + LOGV("Number of CPU cores: %d", cpuCoreCount); + return cpuCoreCount; +} + status_t SoftVPX::initDecoder() { mCtx = new vpx_codec_ctx_t; vpx_codec_err_t vpx_err; + vpx_codec_dec_cfg_t cfg; + memset(&cfg, 0, sizeof(vpx_codec_dec_cfg_t)); + cfg.threads = GetCPUCoreCount(); if ((vpx_err = vpx_codec_dec_init( - (vpx_codec_ctx_t *)mCtx, &vpx_codec_vp8_dx_algo, NULL, 0))) { + (vpx_codec_ctx_t *)mCtx, &vpx_codec_vp8_dx_algo, &cfg, 0))) { LOGE("on2 decoder failed to initialize. (%d)", vpx_err); return UNKNOWN_ERROR; } diff --git a/media/libstagefright/httplive/LiveSession.cpp b/media/libstagefright/httplive/LiveSession.cpp index 012d9ad..165683e 100644 --- a/media/libstagefright/httplive/LiveSession.cpp +++ b/media/libstagefright/httplive/LiveSession.cpp @@ -296,6 +296,8 @@ sp<M3UParser> LiveSession::fetchPlaylist(const char *url) { new M3UParser(url, buffer->data(), buffer->size()); if (playlist->initCheck() != OK) { + LOGE("failed to parse .m3u8 playlist"); + return NULL; } diff --git a/media/libstagefright/httplive/M3UParser.cpp b/media/libstagefright/httplive/M3UParser.cpp index 2eb180a..765f795 100644 --- a/media/libstagefright/httplive/M3UParser.cpp +++ b/media/libstagefright/httplive/M3UParser.cpp @@ -179,7 +179,7 @@ status_t M3UParser::parse(const void *_data, size_t size) { if (mIsVariantPlaylist) { return ERROR_MALFORMED; } - err = parseMetaData(line, &itemMeta, "duration"); + err = parseMetaDataDuration(line, &itemMeta, "durationUs"); } else if (line.startsWith("#EXT-X-DISCONTINUITY")) { if (mIsVariantPlaylist) { return ERROR_MALFORMED; @@ -203,9 +203,9 @@ status_t M3UParser::parse(const void *_data, size_t size) { if (!line.startsWith("#")) { if (!mIsVariantPlaylist) { - int32_t durationSecs; + int64_t durationUs; if (itemMeta == NULL - || !itemMeta->findInt32("duration", &durationSecs)) { + || !itemMeta->findInt64("durationUs", &durationUs)) { return ERROR_MALFORMED; } } @@ -252,6 +252,30 @@ status_t M3UParser::parseMetaData( } // static +status_t M3UParser::parseMetaDataDuration( + const AString &line, sp<AMessage> *meta, const char *key) { + ssize_t colonPos = line.find(":"); + + if (colonPos < 0) { + return ERROR_MALFORMED; + } + + double x; + status_t err = ParseDouble(line.c_str() + colonPos + 1, &x); + + if (err != OK) { + return err; + } + + if (meta->get() == NULL) { + *meta = new AMessage; + } + (*meta)->setInt64(key, (int64_t)x * 1E6); + + return OK; +} + +// static status_t M3UParser::parseStreamInf( const AString &line, sp<AMessage> *meta) { ssize_t colonPos = line.find(":"); @@ -412,4 +436,18 @@ status_t M3UParser::ParseInt32(const char *s, int32_t *x) { return OK; } +// static +status_t M3UParser::ParseDouble(const char *s, double *x) { + char *end; + double dval = strtod(s, &end); + + if (end == s || (*end != '\0' && *end != ',')) { + return ERROR_MALFORMED; + } + + *x = dval; + + return OK; +} + } // namespace android diff --git a/media/libstagefright/include/M3UParser.h b/media/libstagefright/include/M3UParser.h index 63895b4..478582d 100644 --- a/media/libstagefright/include/M3UParser.h +++ b/media/libstagefright/include/M3UParser.h @@ -63,6 +63,9 @@ private: static status_t parseMetaData( const AString &line, sp<AMessage> *meta, const char *key); + static status_t parseMetaDataDuration( + const AString &line, sp<AMessage> *meta, const char *key); + static status_t parseStreamInf( const AString &line, sp<AMessage> *meta); @@ -70,6 +73,7 @@ private: const AString &line, sp<AMessage> *meta, const AString &baseURI); static status_t ParseInt32(const char *s, int32_t *x); + static status_t ParseDouble(const char *s, double *x); DISALLOW_EVIL_CONSTRUCTORS(M3UParser); }; diff --git a/media/libstagefright/omx/OMX.cpp b/media/libstagefright/omx/OMX.cpp index 14968e8..d23aa3a 100644 --- a/media/libstagefright/omx/OMX.cpp +++ b/media/libstagefright/omx/OMX.cpp @@ -21,7 +21,6 @@ #include <dlfcn.h> #include <sys/prctl.h> -#include <sys/resource.h> #include "../include/OMX.h" diff --git a/media/mtp/MtpServer.cpp b/media/mtp/MtpServer.cpp index 4a8fd3e..bc04e8c 100644 --- a/media/mtp/MtpServer.cpp +++ b/media/mtp/MtpServer.cpp @@ -95,10 +95,11 @@ static const MtpEventCode kSupportedEventCodes[] = { MTP_EVENT_STORE_REMOVED, }; -MtpServer::MtpServer(int fd, MtpDatabase* database, +MtpServer::MtpServer(int fd, MtpDatabase* database, bool ptp, int fileGroup, int filePerm, int directoryPerm) : mFD(fd), mDatabase(database), + mPtp(ptp), mFileGroup(fileGroup), mFilePermission(filePerm), mDirectoryPermission(directoryPerm), @@ -426,9 +427,20 @@ MtpResponseCode MtpServer::doGetDeviceInfo() { // fill in device info mData.putUInt16(MTP_STANDARD_VERSION); - mData.putUInt32(6); // MTP Vendor Extension ID + if (mPtp) { + mData.putUInt32(0); + } else { + // MTP Vendor Extension ID + mData.putUInt32(6); + } mData.putUInt16(MTP_STANDARD_VERSION); - string.set("microsoft.com: 1.0; android.com: 1.0;"); + if (mPtp) { + // no extensions + string.set(""); + } else { + // MTP extensions + string.set("microsoft.com: 1.0; android.com: 1.0;"); + } mData.putString(string); // MTP Extensions mData.putUInt16(0); //Functional Mode mData.putAUInt16(kSupportedOperationCodes, @@ -533,12 +545,10 @@ MtpResponseCode MtpServer::doGetObjectHandles() { MtpStorageID storageID = mRequest.getParameter(1); // 0xFFFFFFFF for all storage MtpObjectFormat format = mRequest.getParameter(2); // 0 for all formats MtpObjectHandle parent = mRequest.getParameter(3); // 0xFFFFFFFF for objects with no parent - // 0x00000000 for all objects? + // 0x00000000 for all objects if (!hasStorage(storageID)) return MTP_RESPONSE_INVALID_STORAGE_ID; - if (parent == 0xFFFFFFFF) - parent = 0; MtpObjectHandleList* handles = mDatabase->getObjectList(storageID, format, parent); mData.putAUInt32(handles); @@ -552,11 +562,9 @@ MtpResponseCode MtpServer::doGetNumObjects() { MtpStorageID storageID = mRequest.getParameter(1); // 0xFFFFFFFF for all storage MtpObjectFormat format = mRequest.getParameter(2); // 0 for all formats MtpObjectHandle parent = mRequest.getParameter(3); // 0xFFFFFFFF for objects with no parent - // 0x00000000 for all objects? + // 0x00000000 for all objects if (!hasStorage(storageID)) return MTP_RESPONSE_INVALID_STORAGE_ID; - if (parent == 0xFFFFFFFF) - parent = 0; int count = mDatabase->getNumObjects(storageID, format, parent); if (count >= 0) { diff --git a/media/mtp/MtpServer.h b/media/mtp/MtpServer.h index 859a18e..dfa8258 100644 --- a/media/mtp/MtpServer.h +++ b/media/mtp/MtpServer.h @@ -39,6 +39,9 @@ private: MtpDatabase* mDatabase; + // appear as a PTP device + bool mPtp; + // group to own new files and folders int mFileGroup; // permissions for new files and directories @@ -87,7 +90,7 @@ private: Vector<ObjectEdit*> mObjectEditList; public: - MtpServer(int fd, MtpDatabase* database, + MtpServer(int fd, MtpDatabase* database, bool ptp, int fileGroup, int filePerm, int directoryPerm); virtual ~MtpServer(); diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaNames.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaNames.java index d6e1346..f3a91c5 100755 --- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaNames.java +++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/MediaNames.java @@ -1,57 +1,54 @@ /* * Copyright (C) 2008 The Android Open Source Project * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. */ package com.android.mediaframeworktest; /** - * - * This class has the names of the all the activity name and variables - * in the instrumentation test. + * + * This class has the names of the all the activity name and variables in the + * instrumentation test. * */ public class MediaNames { - //A directory to hold all kinds of media files + // A directory to hold all kinds of media files public static final String MEDIA_SAMPLE_POOL = "/sdcard/media_api/samples/"; - //Audio files - public static final String MP3CBR = "/sdcard/media_api/music/MP3_256kbps_2ch.mp3"; - public static final String MP3VBR = "/sdcard/media_api/music/MP3_256kbps_2ch_VBR.mp3"; + // Audio files + public static final String MP3CBR = "/sdcard/media_api/music/MP3_48KHz_128kbps_s_1_17_CBR.mp3"; + public static final String MP3VBR = "/sdcard/media_api/music/MP3_48KHz_128kbps_s_1_17_VBR.mp3"; + public static final String MP3ABR = "/sdcard/media_api/music/MP3_48KHz_128kbps_s_1_17_ABR.mp3"; public static final String SHORTMP3 = "/sdcard/media_api/music/SHORTMP3.mp3"; public static final String MIDI = "/sdcard/media_api/music/ants.mid"; - public static final String WMA9 = "/sdcard/media_api/music/WMA9.wma"; - public static final String WMA10 = "/sdcard/media_api/music/WMA10.wma"; public static final String WAV = "/sdcard/media_api/music/rings_2ch.wav"; public static final String AMR = "/sdcard/media_api/music/test_amr_ietf.amr"; - public static final String OGG = "/sdcard/media_api/music/Revelation.ogg"; public static final String SINE_200_1000 = "/sdcard/media_api/music/sine_200+1000Hz_44K_mo.wav"; - + // public static final String OGG = + // "/sdcard/media_api/music/Revelation.ogg"; + public static final int MP3CBR_LENGTH = 71000; public static final int MP3VBR_LENGTH = 71000; public static final int SHORTMP3_LENGTH = 286; public static final int MIDI_LENGTH = 17000; - public static final int WMA9_LENGTH = 126559; - public static final int WMA10_LENGTH = 126559; public static final int AMR_LENGTH = 37000; - public static final int OGG_LENGTH = 4000; public static final int SEEK_TIME = 10000; - + public static final long PAUSE_WAIT_TIME = 3000; public static final long WAIT_TIME = 2000; public static final long WAIT_SNAPSHOT_TIME = 5000; - //local video + // local video public static final String VIDEO_MP4 = "/sdcard/media_api/video/MPEG4_320_AAC_64.mp4"; public static final String VIDEO_SHORT_3GP = "/sdcard/media_api/video/short.3gp"; public static final String VIDEO_LARGE_SIZE_3GP = "/sdcard/media_api/video/border_large.3gp"; @@ -59,185 +56,105 @@ public class MediaNames { public static final String VIDEO_H263_AMR = "/sdcard/media_api/video/H263_56_AMRNB_6.3gp"; public static final String VIDEO_H264_AAC = "/sdcard/media_api/video/H264_320_AAC_64.3gp"; public static final String VIDEO_H264_AMR = "/sdcard/media_api/video/H264_320_AMRNB_6.3gp"; - public static final String VIDEO_WMV = "/sdcard/media_api/video/bugs.wmv"; public static final String VIDEO_HIGHRES_H263 = "/sdcard/media_api/video/H263_500_AMRNB_12.3gp"; public static final String VIDEO_HIGHRES_MP4 = "/sdcard/media_api/video/H264_500_AAC_128.3gp"; - - //Media Recorder + public static final String VIDEO_WEBM = "/sdcard/media_api/video/big-buck-bunny_trailer.webm"; + + // Media Recorder public static final String RECORDER_OUTPUT = "/sdcard/media_api/recorderOutput.amr"; - //video thumbnail + // video thumbnail public static final String THUMBNAIL_OUTPUT = "/sdcard/media_api/videoThumbnail.png"; public static final String GOLDEN_THUMBNAIL_OUTPUT = "/sdcard/media_api/goldenThumbnail.png"; - public static final String GOLDEN_THUMBNAIL_OUTPUT_2 = "/sdcard/media_api/goldenThumbnail2.png"; - - //Metadata Utility - public static final String[] THUMBNAIL_CAPTURE_TEST_FILES = { - "/sdcard/media_api/metadata/test.mp4", - "/sdcard/media_api/metadata/test1.3gp", - "/sdcard/media_api/metadata/test2.3gp", - "/sdcard/media_api/metadata/test3.3gp", - "/sdcard/media_api/metadata/test4.3gp", - "/sdcard/media_api/metadata/test5.3gp", - "/sdcard/media_api/metadata/test6.3gp", - "/sdcard/media_api/metadata/test7.3gp", - "/sdcard/media_api/metadata/test8.3gp", - "/sdcard/media_api/metadata/test9.3gp", - "/sdcard/media_api/metadata/test10.3gp", - "/sdcard/media_api/metadata/test11.3gp", - "/sdcard/media_api/metadata/test12.3gp", - "/sdcard/media_api/metadata/test13.3gp", - "/sdcard/media_api/metadata/test14.3gp", - "/sdcard/media_api/metadata/test15.3gp", - "/sdcard/media_api/metadata/test16.3gp", - "/sdcard/media_api/metadata/test17.3gp", - "/sdcard/media_api/metadata/test18.3gp", - "/sdcard/media_api/metadata/test19.3gp", - "/sdcard/media_api/metadata/test20.3gp", - "/sdcard/media_api/metadata/test21.3gp", - "/sdcard/media_api/metadata/test22.3gp", - "/sdcard/media_api/metadata/test23.3gp", - "/sdcard/media_api/metadata/test24.3gp", - "/sdcard/media_api/metadata/test25.3gp", - "/sdcard/media_api/metadata/test26.3gp", - "/sdcard/media_api/metadata/test27.3gp", - "/sdcard/media_api/metadata/test28.3gp", - "/sdcard/media_api/metadata/test29.3gp", - "/sdcard/media_api/metadata/test30.3gp", - "/sdcard/media_api/metadata/test31.3gp", - "/sdcard/media_api/metadata/test32.3gp", - "/sdcard/media_api/metadata/test33.3gp", - "/sdcard/media_api/metadata/test35.mp4", - "/sdcard/media_api/metadata/test36.m4v", - "/sdcard/media_api/metadata/test34.wmv", - "/sdcard/media_api/metadata/test_metadata.mp4", - }; - - public static final String[] METADATA_RETRIEVAL_TEST_FILES = { - // Raw AAC is not supported - // "/sdcard/media_api/test_raw.aac", - // "/sdcard/media_api/test_adts.aac", - // "/sdcard/media_api/test_adif.aac", - "/sdcard/media_api/metadata/test_metadata.mp4", - "/sdcard/media_api/metadata/WMA10.wma", - "/sdcard/media_api/metadata/Leadsol_out.wav", - "/sdcard/media_api/metadata/test_aac.mp4", - "/sdcard/media_api/metadata/test_amr.mp4", - "/sdcard/media_api/metadata/test_avc_amr.mp4", - "/sdcard/media_api/metadata/test_metadata.mp4", - "/sdcard/media_api/metadata/test_vbr.mp3", - "/sdcard/media_api/metadata/test_cbr.mp3", - "/sdcard/media_api/metadata/metadata_test1.mp3", - "/sdcard/media_api/metadata/test33.3gp", - "/sdcard/media_api/metadata/test35.mp4", - "/sdcard/media_api/metadata/test36.m4v", - "/sdcard/media_api/metadata/test_m4v_amr.mp4", - "/sdcard/media_api/metadata/test_h263_amr.mp4", - "/sdcard/media_api/metadata/test34.wmv", - }; - - public static final String[] ALBUMART_TEST_FILES = { - "/sdcard/media_api/album_photo/test_22_16_mp3.mp3", - "/sdcard/media_api/album_photo/PD_256kbps_48khz_mono_CBR_MCA.mp3", - "/sdcard/media_api/album_photo/PD_256kbps_44.1khz_mono_CBR_DPA.mp3", - "/sdcard/media_api/album_photo/PD_192kbps_32khz_mono_CBR_DPA.mp3", - "/sdcard/media_api/album_photo/NIN_256kbps_48khz_mono_CBR_MCA.mp3", - "/sdcard/media_api/album_photo/NIN_256kbps_44.1khz_mono_CBR_MCA.mp3", - "/sdcard/media_api/album_photo/NIN_112kbps(96kbps)_48khz_stereo_VBR_MCA.mp3", - "/sdcard/media_api/album_photo/NIN_112kbps(96kbps)_44.1khz_stereo_VBR_MCA.mp3", - "/sdcard/media_api/album_photo/lightGreen1.mp3", - "/sdcard/media_api/album_photo/babyBlue2 1.mp3", - "/sdcard/media_api/album_photo/2-01 01 NIN_56kbps(64kbps)_32khz_stereo_VBR_MCA.mp3", - "/sdcard/media_api/album_photo/02_NIN_112kbps(80kbps)_32khz_stereo_VBR_MCA.mp3", - "/sdcard/media_api/album_photo/No_Woman_No_Cry_128K.wma", - "/sdcard/media_api/album_photo/Beethoven_2.wma", - }; - - //TEST_PATH_1: is a video and contains metadata for key "num-tracks" - // TEST_PATH_2: any valid media file. - // TEST_PATH_3: invalid media file - public static final String TEST_PATH_1 = "/sdcard/media_api/metadata/test.mp4"; - public static final String TEST_PATH_3 = "/sdcard/media_api/data.txt"; - public static final String TEST_PATH_4 = "somenonexistingpathname"; - public static final String TEST_PATH_5 = "mem://012345"; - - //Meta data expected result - //The expected tag result in the following order - //cd_track_number, album, artist, author, composer, date, genre - //title, years, duration - public static final String META_DATA_MP3 [][] = { - {"/sdcard/media_api/metaDataTestMedias/MP3/ID3V1_ID3V2.mp3", "1/10", "ID3V2.3 Album", "ID3V2.3 Artist", - "ID3V2.3 Lyricist", "ID3V2.3 Composer", null, "Blues", - "ID3V2.3 Title", "1234", "295", "1", null}, - {"/sdcard/media_api/metaDataTestMedias/MP3/ID3V2.mp3", "1/10", "ID3V2.3 Album", "ID3V2.3 Artist", - "ID3V2.3 Lyricist", "ID3V2.3 Composer", null, "Blues", - "ID3V2.3 Title", "1234", "287", "1", null}, - {"/sdcard/media_api/metaDataTestMedias/MP3/ID3V1.mp3", "1", "test ID3V1 Album", "test ID3V1 Artist", - null, null, null, "255", "test ID3V1 Title", "1234", "231332", "1", null}, - {"/sdcard/media_api/metaDataTestMedias/MP3/Corrupted_ID3V1.mp3" , null, null, null, - null, null, null, null, null, null, "231330", "1", null}, - //The corrupted TALB field in id3v2 would not switch to id3v1 tag automatically - {"/sdcard/media_api/metaDataTestMedias/MP3/Corrupted_ID3V2_TALB.mp3", "01", null, "ID3V2.3 Artist", - "ID3V2.3 Lyricist", "ID3V2.3 Composer", null, - "Blues", "ID3V2.3 Title", "1234", "295", "1", null}, - {"/sdcard/media_api/metaDataTestMedias/MP3/Corrupted_ID3V2_TCOM.mp3", "01", "ID3V2.3 Album", - "ID3V2.3 Artist", "ID3V2.3 Lyricist", null, null, - "Blues", "ID3V2.3 Title", "1234", "295", "1", null}, - {"/sdcard/media_api/metaDataTestMedias/MP3/Corrupted_ID3V2_TCOM_2.mp3", "01", "ID3V2.3 Album", - "ID3V2.3 Artist", null, null, null, "Blues", "ID3V2.3 Title", "1234", "295", "1", null}, - {"/sdcard/media_api/metaDataTestMedias/MP3/Corrupted_ID3V2_TRCK.mp3", "dd", "ID3V2.3 Album", - "ID3V2.3 Artist", "ID3V2.3 Lyricist", "ID3V2.3 Composer", null, - "Blues", "ID3V2.3 Title", "1234", "295", "1", null}, - {"/sdcard/media_api/metaDataTestMedias/MP3/Corrupted_ID3V2_TRCK_2.mp3", "01", "ID3V2.3 Album", - "ID3V2.3 Artist", null, null, null, null, "ID3V2.3 Title", null, "295", "1", null}, - {"/sdcard/media_api/metaDataTestMedias/MP3/Corrupted_ID3V2_TYER.mp3", "01", "ID3V2.3 Album", - "ID3V2.3 Artist", null, null, null, null, "ID3V2.3 Title", "9999", "295", "1", null}, - {"/sdcard/media_api/metaDataTestMedias/MP3/Corrupted_ID3V2_TYER_2.mp3", "01", "ID3V2.3 Album", - "ID3V2.3 Artist", "ID3V2.3 Lyricist", "ID3V2.3 Composer", null, - "Blues", "ID3V2.3 Title", null, "295", "1", null}, - {"/sdcard/media_api/metaDataTestMedias/MP3/Corrupted_ID3V2_TIT.mp3", null, null, null, - null, null, null, null, null, null, "295", "1", null} - }; - - //output recorded video - - public static final String RECORDED_HVGA_H263 = "/sdcard/HVGA_H263.3gp"; - public static final String RECORDED_QVGA_H263 = "/sdcard/QVGA_H263.3gp"; - public static final String RECORDED_SQVGA_H263 = "/sdcard/SQVGA_H263.3gp"; - public static final String RECORDED_CIF_H263 = "/sdcard/CIF_H263.3gp"; - public static final String RECORDED_QCIF_H263 = "/sdcard/QCIF_H263.3gp"; - public static final String RECORDED_PORTRAIT_H263 = "/sdcard/QCIF_mp4.3gp"; - - public static final String RECORDED_HVGA_MP4 = "/sdcard/HVGA_mp4.mp4"; - public static final String RECORDED_QVGA_MP4 = "/sdcard/QVGA_mp4.mp4"; - public static final String RECORDED_SQVGA_MP4 = "/sdcard/SQVGA_mp4.mp4"; - public static final String RECORDED_CIF_MP4 = "/sdcard/CIF_mp4.mp4"; - public static final String RECORDED_QCIF_MP4 = "/sdcard/QCIF_mp4.mp4"; - - public static final String RECORDED_VIDEO_3GP = "/sdcard/temp.3gp"; - - public static final String INVALD_VIDEO_PATH = "/sdcard/media_api/filepathdoesnotexist" + - "/filepathdoesnotexist/temp.3gp"; - - - public static final long RECORDED_TIME = 5000; - public static final long VALID_VIDEO_DURATION = 2000; - - //Streaming test files - public static final byte [] STREAM_SERVER = new byte[] {(byte)75,(byte)17,(byte)48,(byte)204}; - public static final String STREAM_H264_480_360_1411k = - "http://75.17.48.204:10088/yslau/stress_media/h264_regular.mp4"; - public static final String STREAM_WMV = - "http://75.17.48.204:10088/yslau/stress_media/bugs.wmv"; - public static final String STREAM_H263_176x144_325k = - "http://75.17.48.204:10088/yslau/stress_media/h263_regular.3gp"; - public static final String STREAM_H264_352x288_1536k = - "http://75.17.48.204:10088/yslau/stress_media/h264_highBitRate.mp4"; - public static final String STREAM_MP3= - "http://75.17.48.204:10088/yslau/stress_media/mp3_regular.mp3"; - public static final String STREAM_MPEG4_QVGA_128k = - "http://75.17.48.204:10088/yslau/stress_media/mpeg4_qvga_24fps.3gp"; - public static final int STREAM_H264_480_360_1411k_DURATION = 46000; - public static final int VIDEO_H263_AAC_DURATION = 501000; - public static final int VIDEO_H263_AMR_DURATION = 502000; + + /* + * Metadata Utility Test media files which contain meta data. + */ + public static final String[] THUMBNAIL_METADATA_TEST_FILES = { + "/sdcard/media_api/video/H263_500_AMRNB_12.3gp", + "/sdcard/media_api/video/H263_56_AAC_24.3gp", + "/sdcard/media_api/video/H263_56_AMRNB_6.3gp", + "/sdcard/media_api/video/H264_320_AAC_64.3gp", + "/sdcard/media_api/video/H264_320_AMRNB_6.3gp", + "/sdcard/media_api/video/H264_500_AAC_128.3gp", + "/sdcard/media_api/video/H264_HVGA_500_NO_AUDIO.3gp", + "/sdcard/media_api/video/H264_QVGA_500_NO_AUDIO.3gp", + "/sdcard/media_api/video/MPEG4_320_AAC_64.mp4", + "/sdcard/media_api/video/border_large.3gp", + "/sdcard/media_api/videoeditor/H264_BP_800x480_15fps_512kbps_AACLC_24KHz_38Kbps_s_1_17.mp4", + "/sdcard/media_api/videoeditor/H264_MP_960x720_25fps_800kbps_AACLC_48Khz_192Kbps_s_1_17.mp4", + "/sdcard/media_api/videoeditor/MPEG4_SP_640x480_15fps_512kbps_AACLC_48khz_132kbps_s_0_26.mp4", + "/sdcard/media_api/videoeditor/MPEG4_SP_176x144_12fps_92kbps_AMRNB_8KHz_12.2kbps_m_0_27.3gp", + "/sdcard/media_api/videoeditor/MPEG4_SP_720x480_30fps_280kbps_AACLC_48kHz_161kbps_s_0_26.mp4" + }; + + public static final String[] ALBUMART_TEST_FILES = { + "/sdcard/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V1_ID3V2.mp3", + "/sdcard/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V2.mp3", + "/sdcard/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V1.mp3", + }; + + // TEST_PATH_1: is a video and contains metadata for key "num-tracks" + // TEST_PATH_2: any valid media file. + // TEST_PATH_3: invalid media file + public static final String TEST_PATH_1 = "/sdcard/media_api/video/MPEG4_320_AAC_64.mp4"; + public static final String TEST_PATH_3 = "/sdcard/media_api/data.txt"; + public static final String TEST_PATH_4 = "somenonexistingpathname"; + public static final String TEST_PATH_5 = "mem://012345"; + + // Meta data expected result + // The expected tag result in the following order + // cd_track_number, album, artist, author, composer, date, genre + // title, years, duration + public static final String META_DATA_MP3[][] = { + {"/sdcard/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V1_ID3V2.mp3", "2/34", + "Test ID3V2 Album", "Test ID3V2 Artist", null, "Test ID3V2 Composer", + null, "(1)Classic Rock", "Test ID3V2 Title ", null, "77640", "1", null}, + {"/sdcard/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V2.mp3", "1/10", + "Test ID3V2 Album", "Test ID3V2 Artist", null, "Test ID3V2 Composer", + null, "(74)Acid Jazz", "Test ID3V2 Tag", null, "77640", "1", null}, + {"/sdcard/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V1.mp3", "2", + "Test ID3V1 Album", "Test ID3V1 Artist", null, null, null, "(15)", + "Test ID3V1 Title", "2011", "77640", "1", null} + }; + + // output recorded video + public static final String RECORDED_HVGA_H263 = "/sdcard/HVGA_H263.3gp"; + public static final String RECORDED_QVGA_H263 = "/sdcard/QVGA_H263.3gp"; + public static final String RECORDED_SQVGA_H263 = "/sdcard/SQVGA_H263.3gp"; + public static final String RECORDED_CIF_H263 = "/sdcard/CIF_H263.3gp"; + public static final String RECORDED_QCIF_H263 = "/sdcard/QCIF_H263.3gp"; + public static final String RECORDED_PORTRAIT_H263 = "/sdcard/QCIF_mp4.3gp"; + + public static final String RECORDED_HVGA_MP4 = "/sdcard/HVGA_mp4.mp4"; + public static final String RECORDED_QVGA_MP4 = "/sdcard/QVGA_mp4.mp4"; + public static final String RECORDED_SQVGA_MP4 = "/sdcard/SQVGA_mp4.mp4"; + public static final String RECORDED_CIF_MP4 = "/sdcard/CIF_mp4.mp4"; + public static final String RECORDED_QCIF_MP4 = "/sdcard/QCIF_mp4.mp4"; + + public static final String RECORDED_VIDEO_3GP = "/sdcard/temp.3gp"; + + public static final String INVALD_VIDEO_PATH = + "/sdcard/media_api/filepathdoesnotexist" + "/filepathdoesnotexist/temp.3gp"; + + public static final long RECORDED_TIME = 5000; + public static final long VALID_VIDEO_DURATION = 2000; + + // Streaming test files + public static final byte[] STREAM_SERVER = + new byte[] {(byte) 75, (byte) 17, (byte) 48, (byte) 204}; + public static final String STREAM_H264_480_360_1411k = + "http://75.17.48.204:10088/yslau/stress_media/h264_regular.mp4"; + public static final String STREAM_WMV = "http://75.17.48.204:10088/yslau/stress_media/bugs.wmv"; + public static final String STREAM_H263_176x144_325k = + "http://75.17.48.204:10088/yslau/stress_media/h263_regular.3gp"; + public static final String STREAM_H264_352x288_1536k = + "http://75.17.48.204:10088/yslau/stress_media/h264_highBitRate.mp4"; + public static final String STREAM_MP3 = + "http://75.17.48.204:10088/yslau/stress_media/mp3_regular.mp3"; + public static final String STREAM_MPEG4_QVGA_128k = + "http://75.17.48.204:10088/yslau/stress_media/mpeg4_qvga_24fps.3gp"; + public static final int STREAM_H264_480_360_1411k_DURATION = 46000; + public static final int VIDEO_H263_AAC_DURATION = 501000; + public static final int VIDEO_H263_AMR_DURATION = 502000; } diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaMetadataTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaMetadataTest.java index 00e0a52..380de9c 100644 --- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaMetadataTest.java +++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaMetadataTest.java @@ -41,10 +41,7 @@ public class MediaMetadataTest extends AndroidTestCase { } public static enum MP3_TEST_FILE{ - ID3V1V2, ID3V2, ID3V1, - CORRUPTED_ID3V1, CORRUPTED_ID3V2_TALB, CORRUPTED_ID3V2_TCOM, - CORRUPTED_ID3V2_TCOM_2, CORRUPTED_ID3V2_TRCK, CORRUPTED_D3V2_TRCK_2, - CORRUPTED_ID3V2_TYER, CORRUPTED_ID3V2_TYER_2, CORRUPTED_ID3V2_TIT + ID3V1V2, ID3V2, ID3V1 } public static METADATA_EXPECTEDRESULT meta; @@ -64,53 +61,7 @@ public class MediaMetadataTest extends AndroidTestCase { public static void testID3V1Metadata() throws Exception { validateMetatData(mp3_test_file.ID3V1.ordinal(), MediaNames.META_DATA_MP3); } - - @MediumTest - public static void testCorruptedID3V1Metadata() throws Exception { - validateMetatData(mp3_test_file.CORRUPTED_ID3V1.ordinal(), MediaNames.META_DATA_MP3); - } - @MediumTest - public static void testCorrupted_ID3V2_TALBMetadata() throws Exception { - validateMetatData(mp3_test_file.CORRUPTED_ID3V2_TALB.ordinal(), MediaNames.META_DATA_MP3); - } - - @MediumTest - public static void testCorrupted_ID3V2_TCOMMetadata() throws Exception { - validateMetatData(mp3_test_file.CORRUPTED_ID3V2_TCOM.ordinal(), MediaNames.META_DATA_MP3); - } - - @MediumTest - public static void testCorrupted_ID3V2_TCOMM2etadata() throws Exception { - validateMetatData(mp3_test_file.CORRUPTED_ID3V2_TCOM_2.ordinal(), MediaNames.META_DATA_MP3); - } - - @MediumTest - public static void testCorrupted_ID3V2_TRCKMetadata() throws Exception { - validateMetatData(mp3_test_file.CORRUPTED_ID3V2_TRCK.ordinal(), MediaNames.META_DATA_MP3); - } - - @MediumTest - public static void testCorrupted_ID3V2_TRCK2Metadata() throws Exception { - validateMetatData(mp3_test_file.CORRUPTED_D3V2_TRCK_2.ordinal(), MediaNames.META_DATA_MP3); - } - - @MediumTest - public static void testCorrupted_ID3V2_TYERMetadata() throws Exception { - validateMetatData(mp3_test_file.CORRUPTED_ID3V2_TYER.ordinal(), MediaNames.META_DATA_MP3); - } - - @MediumTest - public static void testCorrupted_ID3V2_TYER2Metadata() throws Exception { - validateMetatData(mp3_test_file.CORRUPTED_ID3V2_TYER_2.ordinal(), MediaNames.META_DATA_MP3); - } - - @MediumTest - public static void testCorrupted_ID3V2_TITMetadata() throws Exception { - validateMetatData(mp3_test_file.CORRUPTED_ID3V2_TIT.ordinal(), MediaNames.META_DATA_MP3); - } - - private static void validateMetatData(int fileIndex, String meta_data_file[][]) { Log.v(TAG, "filePath = "+ meta_data_file[fileIndex][0]); if ((meta_data_file[fileIndex][0].endsWith("wma") && !MediaProfileReader.getWMAEnable()) || diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaPlayerApiTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaPlayerApiTest.java index 3a9564d..57d5368 100644 --- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaPlayerApiTest.java +++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/MediaPlayerApiTest.java @@ -84,15 +84,6 @@ public class MediaPlayerApiTest extends ActivityInstrumentationTestCase<MediaFra duratoinWithinTolerence = verifyDuration(duration, MediaNames.MIDI_LENGTH); assertTrue("MIDI getDuration", duratoinWithinTolerence); } - - @MediumTest - public void testWMA9GetDuration() throws Exception { - if (isWMAEnable) { - int duration = CodecTest.getDuration(MediaNames.WMA9); - duratoinWithinTolerence = verifyDuration(duration, MediaNames.WMA9_LENGTH); - assertTrue("WMA9 getDuration", duratoinWithinTolerence); - } - } @MediumTest public void testAMRGetDuration() throws Exception { @@ -127,15 +118,7 @@ public class MediaPlayerApiTest extends ActivityInstrumentationTestCase<MediaFra boolean currentPosition = CodecTest.getCurrentPosition(MediaNames.MIDI); assertTrue("MIDI GetCurrentPosition", currentPosition); } - - @LargeTest - public void testWMA9GetCurrentPosition() throws Exception { - if (isWMAEnable) { - boolean currentPosition = CodecTest.getCurrentPosition(MediaNames.WMA9); - assertTrue("WMA9 GetCurrentPosition", currentPosition); - } - } - + @LargeTest public void testAMRGetCurrentPosition() throws Exception { boolean currentPosition = CodecTest.getCurrentPosition(MediaNames.AMR); @@ -166,15 +149,7 @@ public class MediaPlayerApiTest extends ActivityInstrumentationTestCase<MediaFra boolean isPaused = CodecTest.pause(MediaNames.MIDI); assertTrue("MIDI Pause", isPaused); } - - @LargeTest - public void testWMA9Pause() throws Exception { - if (isWMAEnable) { - boolean isPaused = CodecTest.pause(MediaNames.WMA9); - assertTrue("WMA9 Pause", isPaused); - } - } - + @LargeTest public void testAMRPause() throws Exception { boolean isPaused = CodecTest.pause(MediaNames.AMR); @@ -239,15 +214,7 @@ public class MediaPlayerApiTest extends ActivityInstrumentationTestCase<MediaFra boolean isLoop = CodecTest.setLooping(MediaNames.MIDI); assertTrue("MIDI setLooping", isLoop); } - - @LargeTest - public void testWMA9SetLooping() throws Exception { - if (isWMAEnable) { - boolean isLoop = CodecTest.setLooping(MediaNames.WMA9); - assertTrue("WMA9 setLooping", isLoop); - } - } - + @LargeTest public void testAMRSetLooping() throws Exception { boolean isLoop = CodecTest.setLooping(MediaNames.AMR); @@ -279,15 +246,7 @@ public class MediaPlayerApiTest extends ActivityInstrumentationTestCase<MediaFra boolean isLoop = CodecTest.seekTo(MediaNames.MIDI); assertTrue("MIDI seekTo", isLoop); } - - @LargeTest - public void testWMA9SeekTo() throws Exception { - if (isWMAEnable) { - boolean isLoop = CodecTest.seekTo(MediaNames.WMA9); - assertTrue("WMA9 seekTo", isLoop); - } - } - + @LargeTest public void testAMRSeekTo() throws Exception { boolean isLoop = CodecTest.seekTo(MediaNames.AMR); @@ -320,15 +279,6 @@ public class MediaPlayerApiTest extends ActivityInstrumentationTestCase<MediaFra boolean isEnd = CodecTest.seekToEnd(MediaNames.MIDI); assertTrue("MIDI seekToEnd", isEnd); } - - @Suppress - @LargeTest - public void testWMA9SeekToEnd() throws Exception { - if (isWMAEnable) { - boolean isEnd = CodecTest.seekToEnd(MediaNames.WMA9); - assertTrue("WMA9 seekToEnd", isEnd); - } - } @LargeTest public void testAMRSeekToEnd() throws Exception { @@ -393,17 +343,13 @@ public class MediaPlayerApiTest extends ActivityInstrumentationTestCase<MediaFra boolean isSeek = CodecTest.videoSeekTo(MediaNames.VIDEO_H264_AMR); assertTrue("H264AMR SeekTo", isSeek); } - + @LargeTest - public void testVideoWMVSeekTo() throws Exception { - Log.v(TAG, "wmv not enable"); - if (isWMVEnable) { - Log.v(TAG, "wmv enable"); - boolean isSeek = CodecTest.videoSeekTo(MediaNames.VIDEO_WMV); - assertTrue("WMV SeekTo", isSeek); - } + public void testVideoWebmSeekTo() throws Exception { + boolean isSeek = CodecTest.videoSeekTo(MediaNames.VIDEO_WEBM); + assertTrue("WEBM SeekTo", isSeek); } - + @LargeTest public void testSoundRecord() throws Exception { boolean isRecordered = CodecTest.mediaRecorderRecord(MediaNames.RECORDER_OUTPUT); @@ -412,7 +358,7 @@ public class MediaPlayerApiTest extends ActivityInstrumentationTestCase<MediaFra @LargeTest public void testGetThumbnail() throws Exception { - boolean getThumbnail = CodecTest.getThumbnail(MediaNames.VIDEO_H264_AAC, MediaNames.GOLDEN_THUMBNAIL_OUTPUT_2); + boolean getThumbnail = CodecTest.getThumbnail(MediaNames.VIDEO_H264_AAC, MediaNames.GOLDEN_THUMBNAIL_OUTPUT); assertTrue("Get Thumbnail", getThumbnail); } diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java index 3b5b9a3..b396223 100644 --- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java +++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java @@ -356,26 +356,6 @@ public class MediaPlayerPerformance extends ActivityInstrumentationTestCase2<Med assertTrue("H264 playback memory test", memoryResult); } - // Test case 3: Capture the memory usage after each 20 WMV playback - @LargeTest - public void testWMVVideoPlaybackMemoryUsage() throws Exception { - boolean memoryResult = false; - if (MediaProfileReader.getWMVEnable()){ - mStartPid = getMediaserverPid(); - File wmvMemoryOut = new File(MEDIA_MEMORY_OUTPUT); - Writer output = new BufferedWriter(new FileWriter(wmvMemoryOut, true)); - output.write("WMV video playback only\n"); - for (int i = 0; i < NUM_STRESS_LOOP; i++) { - mediaStressPlayback(MediaNames.VIDEO_WMV); - getMemoryWriteToLog(output, i); - } - output.write("\n"); - memoryResult = validateMemoryResult(mStartPid, mStartMemory, output, DECODER_LIMIT); - output.close(); - assertTrue("wmv playback memory test", memoryResult); - } - } - // Test case 4: Capture the memory usage after every 20 video only recorded @LargeTest public void testH263RecordVideoOnlyMemoryUsage() throws Exception { diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaMetadataRetrieverTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaMetadataRetrieverTest.java index a66db05..8eb75f3 100644 --- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaMetadataRetrieverTest.java +++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/MediaMetadataRetrieverTest.java @@ -76,29 +76,29 @@ public class MediaMetadataRetrieverTest extends AndroidTestCase { boolean hasFailed = false; Log.v(TAG, "Thumbnail processing starts"); long startedAt = System.currentTimeMillis(); - for(int i = 0, n = MediaNames.THUMBNAIL_CAPTURE_TEST_FILES.length; i < n; ++i) { + for(int i = 0, n = MediaNames.THUMBNAIL_METADATA_TEST_FILES.length; i < n; ++i) { try { - Log.v(TAG, "File " + i + ": " + MediaNames.THUMBNAIL_CAPTURE_TEST_FILES[i]); - if ((MediaNames.THUMBNAIL_CAPTURE_TEST_FILES[i].endsWith(".wma") && !supportWMA) || - (MediaNames.THUMBNAIL_CAPTURE_TEST_FILES[i].endsWith(".wmv") && !supportWMV) + Log.v(TAG, "File " + i + ": " + MediaNames.THUMBNAIL_METADATA_TEST_FILES[i]); + if ((MediaNames.THUMBNAIL_METADATA_TEST_FILES[i].endsWith(".wma") && !supportWMA) || + (MediaNames.THUMBNAIL_METADATA_TEST_FILES[i].endsWith(".wmv") && !supportWMV) ) { Log.v(TAG, "windows media is not supported and thus we will skip the test for this file"); continue; } - retriever.setDataSource(MediaNames.THUMBNAIL_CAPTURE_TEST_FILES[i]); + retriever.setDataSource(MediaNames.THUMBNAIL_METADATA_TEST_FILES[i]); Bitmap bitmap = retriever.getFrameAtTime(-1); assertTrue(bitmap != null); try { - java.io.OutputStream stream = new FileOutputStream(MediaNames.THUMBNAIL_CAPTURE_TEST_FILES[i] + ".jpg"); + java.io.OutputStream stream = new FileOutputStream(MediaNames.THUMBNAIL_METADATA_TEST_FILES[i] + ".jpg"); bitmap.compress(Bitmap.CompressFormat.JPEG, 75, stream); stream.close(); } catch (Exception e) { - Log.e(TAG, "Fails to convert the bitmap to a JPEG file for " + MediaNames.THUMBNAIL_CAPTURE_TEST_FILES[i]); + Log.e(TAG, "Fails to convert the bitmap to a JPEG file for " + MediaNames.THUMBNAIL_METADATA_TEST_FILES[i]); hasFailed = true; Log.e(TAG, e.toString()); } } catch(Exception e) { - Log.e(TAG, "Fails to setDataSource for file " + MediaNames.THUMBNAIL_CAPTURE_TEST_FILES[i]); + Log.e(TAG, "Fails to setDataSource for file " + MediaNames.THUMBNAIL_METADATA_TEST_FILES[i]); hasFailed = true; } Thread.yield(); // Don't be evil @@ -106,7 +106,7 @@ public class MediaMetadataRetrieverTest extends AndroidTestCase { long endedAt = System.currentTimeMillis(); retriever.release(); assertTrue(!hasFailed); - Log.v(TAG, "Average processing time per thumbnail: " + (endedAt - startedAt)/MediaNames.THUMBNAIL_CAPTURE_TEST_FILES.length + " ms"); + Log.v(TAG, "Average processing time per thumbnail: " + (endedAt - startedAt)/MediaNames.THUMBNAIL_METADATA_TEST_FILES.length + " ms"); } @LargeTest @@ -115,19 +115,19 @@ public class MediaMetadataRetrieverTest extends AndroidTestCase { boolean supportWMV = MediaProfileReader.getWMVEnable(); boolean hasFailed = false; MediaMetadataRetriever retriever = new MediaMetadataRetriever(); - for(int i = 0, n = MediaNames.METADATA_RETRIEVAL_TEST_FILES.length; i < n; ++i) { + for(int i = 0, n = MediaNames.THUMBNAIL_METADATA_TEST_FILES.length; i < n; ++i) { try { - Log.v(TAG, "File " + i + ": " + MediaNames.METADATA_RETRIEVAL_TEST_FILES[i]); - if ((MediaNames.METADATA_RETRIEVAL_TEST_FILES[i].endsWith(".wma") && !supportWMA) || - (MediaNames.METADATA_RETRIEVAL_TEST_FILES[i].endsWith(".wmv") && !supportWMV) + Log.v(TAG, "File " + i + ": " + MediaNames.THUMBNAIL_METADATA_TEST_FILES[i]); + if ((MediaNames.THUMBNAIL_METADATA_TEST_FILES[i].endsWith(".wma") && !supportWMA) || + (MediaNames.THUMBNAIL_METADATA_TEST_FILES[i].endsWith(".wmv") && !supportWMV) ) { Log.v(TAG, "windows media is not supported and thus we will skip the test for this file"); continue; } - retriever.setDataSource(MediaNames.METADATA_RETRIEVAL_TEST_FILES[i]); + retriever.setDataSource(MediaNames.THUMBNAIL_METADATA_TEST_FILES[i]); extractAllSupportedMetadataValues(retriever); } catch(Exception e) { - Log.e(TAG, "Fails to setDataSource for file " + MediaNames.METADATA_RETRIEVAL_TEST_FILES[i]); + Log.e(TAG, "Fails to setDataSource for file " + MediaNames.THUMBNAIL_METADATA_TEST_FILES[i]); hasFailed = true; } Thread.yield(); // Don't be evil @@ -239,45 +239,6 @@ public class MediaMetadataRetrieverTest extends AndroidTestCase { assertTrue(!hasFailed); } - @MediumTest - public static void testIntendedUsage() { - // By default, capture frame and retrieve metadata - MediaMetadataRetriever retriever = new MediaMetadataRetriever(); - boolean hasFailed = false; - retriever.setDataSource(MediaNames.TEST_PATH_1); - assertTrue(retriever.getFrameAtTime(-1) != null); - assertTrue(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS) != null); - - // Do not capture frame or retrieve metadata - retriever.setDataSource(MediaNames.TEST_PATH_1); - if (retriever.getFrameAtTime(-1) != null) { - Log.e(TAG, "No frame expected, but is available"); - hasFailed = true; - } - if (retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS) != null) { - Log.e(TAG, "No num track metadata expected, but is available"); - hasFailed = true; - } - - // Capture frame only - retriever.setDataSource(MediaNames.TEST_PATH_1); - assertTrue(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS) == null); - - // Retriever metadata only - retriever.setDataSource(MediaNames.TEST_PATH_1); - if (retriever.getFrameAtTime(-1) != null) { - Log.e(TAG, "No frame expected, but is available"); - hasFailed = true; - } - - // Capture frame and retrieve metadata - retriever.setDataSource(MediaNames.TEST_PATH_1); - assertTrue(retriever.getFrameAtTime(-1) != null); - assertTrue(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS) != null); - retriever.release(); - assertTrue(!hasFailed); - } - // TODO: // Encode and test for the correct mix of metadata elements on a per-file basis? // We should be able to compare the actual returned metadata with the expected metadata diff --git a/media/tests/contents/media_api/goldenThumbnail.png b/media/tests/contents/media_api/goldenThumbnail.png Binary files differnew file mode 100755 index 0000000..3bb6ed2 --- /dev/null +++ b/media/tests/contents/media_api/goldenThumbnail.png diff --git a/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17.mp3 b/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17.mp3 Binary files differnew file mode 100755 index 0000000..e0d6a17 --- /dev/null +++ b/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17.mp3 diff --git a/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_ABR.mp3 b/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_ABR.mp3 Binary files differnew file mode 100644 index 0000000..12f7193 --- /dev/null +++ b/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_ABR.mp3 diff --git a/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_CBR.mp3 b/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_CBR.mp3 Binary files differnew file mode 100644 index 0000000..12f7193 --- /dev/null +++ b/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_CBR.mp3 diff --git a/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V1.mp3 b/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V1.mp3 Binary files differnew file mode 100644 index 0000000..29d332b --- /dev/null +++ b/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V1.mp3 diff --git a/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V1_ID3V2.mp3 b/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V1_ID3V2.mp3 Binary files differnew file mode 100644 index 0000000..ea52638 --- /dev/null +++ b/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V1_ID3V2.mp3 diff --git a/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V2.mp3 b/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V2.mp3 Binary files differnew file mode 100644 index 0000000..024039c --- /dev/null +++ b/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_ID3V2.mp3 diff --git a/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_VBR.mp3 b/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_VBR.mp3 Binary files differnew file mode 100644 index 0000000..12f7193 --- /dev/null +++ b/media/tests/contents/media_api/music/MP3_48KHz_128kbps_s_1_17_VBR.mp3 diff --git a/media/tests/contents/media_api/music/SHORTMP3.mp3 b/media/tests/contents/media_api/music/SHORTMP3.mp3 Binary files differnew file mode 100755 index 0000000..8b51b5d --- /dev/null +++ b/media/tests/contents/media_api/music/SHORTMP3.mp3 diff --git a/media/tests/contents/media_api/music/ants.mid b/media/tests/contents/media_api/music/ants.mid Binary files differnew file mode 100755 index 0000000..d4ead53 --- /dev/null +++ b/media/tests/contents/media_api/music/ants.mid diff --git a/media/tests/contents/media_api/music/bzk_chic.wav b/media/tests/contents/media_api/music/bzk_chic.wav Binary files differnew file mode 100755 index 0000000..bab1a6b --- /dev/null +++ b/media/tests/contents/media_api/music/bzk_chic.wav diff --git a/media/tests/contents/media_api/music/sine_200+1000Hz_44K_mo.wav b/media/tests/contents/media_api/music/sine_200+1000Hz_44K_mo.wav Binary files differnew file mode 100755 index 0000000..312b6fb --- /dev/null +++ b/media/tests/contents/media_api/music/sine_200+1000Hz_44K_mo.wav diff --git a/media/tests/contents/media_api/music/test_amr_ietf.amr b/media/tests/contents/media_api/music/test_amr_ietf.amr Binary files differnew file mode 100755 index 0000000..540794c --- /dev/null +++ b/media/tests/contents/media_api/music/test_amr_ietf.amr diff --git a/media/tests/contents/media_api/video/big-buck-bunny_trailer.webm b/media/tests/contents/media_api/video/big-buck-bunny_trailer.webm Binary files differnew file mode 100755 index 0000000..6a17395 --- /dev/null +++ b/media/tests/contents/media_api/video/big-buck-bunny_trailer.webm |