diff options
15 files changed, 200 insertions, 284 deletions
diff --git a/api/current.xml b/api/current.xml index f7a59540c6b4..3d91a7e38545 100644 --- a/api/current.xml +++ b/api/current.xml @@ -21704,17 +21704,6 @@ visibility="public" > </field> -<field name="FLAG_HEAVY_WEIGHT" - type="int" - transient="false" - volatile="false" - value="1" - static="true" - final="true" - deprecated="not deprecated" - visibility="public" -> -</field> <field name="IMPORTANCE_BACKGROUND" type="int" transient="false" @@ -21825,16 +21814,6 @@ visibility="public" > </field> -<field name="flags" - type="int" - transient="false" - volatile="false" - static="false" - final="false" - deprecated="not deprecated" - visibility="public" -> -</field> <field name="importance" type="int" transient="false" diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index d5741fc4bc47..4736404d9b0f 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -755,14 +755,17 @@ public class ActivityManager { public String pkgList[]; /** - * Constant for {@link #flags}: this is a heavy-weight process, - * meaning it will not be killed while in the background. + * Constant for {@link #flags}: this is an app that is unable to + * correctly save its state when going to the background, + * so it can not be killed while in the background. + * @hide */ - public static final int FLAG_HEAVY_WEIGHT = 1<<0; + public static final int FLAG_CANT_SAVE_STATE = 1<<0; /** * Flags of information. May be any of - * {@link #FLAG_HEAVY_WEIGHT}. + * {@link #FLAG_CANT_SAVE_STATE}. + * @hide */ public int flags; diff --git a/core/java/android/preference/PreferenceManager.java b/core/java/android/preference/PreferenceManager.java index 2b2094693f78..fa838976fed9 100644 --- a/core/java/android/preference/PreferenceManager.java +++ b/core/java/android/preference/PreferenceManager.java @@ -443,7 +443,7 @@ public class PreferenceManager { pm.setSharedPreferencesMode(sharedPreferencesMode); pm.inflateFromResource(context, resId, null); - defaultValueSp.edit().putBoolean(KEY_HAS_SET_DEFAULT_VALUES, true).commit(); + defaultValueSp.edit().putBoolean(KEY_HAS_SET_DEFAULT_VALUES, true).apply(); } } @@ -481,7 +481,7 @@ public class PreferenceManager { private void setNoCommit(boolean noCommit) { if (!noCommit && mEditor != null) { - mEditor.commit(); + mEditor.apply(); } mNoCommit = noCommit; diff --git a/docs/html/guide/topics/data/data-storage.jd b/docs/html/guide/topics/data/data-storage.jd index 293a0579ef67..e20d1ed22761 100644 --- a/docs/html/guide/topics/data/data-storage.jd +++ b/docs/html/guide/topics/data/data-storage.jd @@ -115,7 +115,7 @@ public class Calc extends Activity { public static final String PREFS_NAME = "MyPrefsFile"; @Override - protected void onCreate(Bundle state){ + protected void onCreate(Bundle state){ super.onCreate(state); . . . @@ -374,7 +374,7 @@ android.database.sqlite.SQLiteOpenHelper#onCreate(SQLiteDatabase) onCreate()} me can execute a SQLite command to create tables in the database. For example:</p> <pre> -public class MyDbOpenHelper extends SQLiteOpenHelper { +public class DictionaryOpenHelper extends SQLiteOpenHelper { private static final int DATABASE_VERSION = 2; private static final String DICTIONARY_TABLE_NAME = "dictionary"; diff --git a/include/media/stagefright/MPEG4Writer.h b/include/media/stagefright/MPEG4Writer.h index 9716e98e875d..70bd8e8fdd95 100644 --- a/include/media/stagefright/MPEG4Writer.h +++ b/include/media/stagefright/MPEG4Writer.h @@ -62,6 +62,7 @@ private: class Track; FILE *mFile; + bool mUse4ByteNalLength; bool mUse32BitOffset; bool mPaused; bool mStarted; @@ -135,6 +136,10 @@ private: void setDriftTimeUs(int64_t driftTimeUs); int64_t getDriftTimeUs(); + // Return whether the nal length is 4 bytes or 2 bytes + // Only makes sense for H.264/AVC + bool useNalLengthFour(); + void lock(); void unlock(); @@ -144,6 +149,7 @@ private: inline size_t write(const void *ptr, size_t size, size_t nmemb, FILE* stream); bool exceedsFileSizeLimit(); + bool use32BitFileOffset() const; bool exceedsFileDurationLimit(); void trackProgressStatus(const Track* track, int64_t timeUs, status_t err = OK); diff --git a/include/media/stagefright/MetaData.h b/include/media/stagefright/MetaData.h index 3b31e6814889..0b6201ce8e02 100644 --- a/include/media/stagefright/MetaData.h +++ b/include/media/stagefright/MetaData.h @@ -79,6 +79,7 @@ enum { // Set this key to enable authoring files in 64-bit offset kKey64BitFileOffset = 'fobt', // int32_t (bool) + kKey2ByteNalLength = '2NAL', // int32_t (bool) // Identify the file output format for authoring // Please see <media/mediarecorder.h> for the supported diff --git a/media/libstagefright/MPEG4Writer.cpp b/media/libstagefright/MPEG4Writer.cpp index af2b4c4b0830..806836d82c6a 100644 --- a/media/libstagefright/MPEG4Writer.cpp +++ b/media/libstagefright/MPEG4Writer.cpp @@ -32,12 +32,12 @@ #include <media/stagefright/MediaSource.h> #include <media/stagefright/Utils.h> #include <media/mediarecorder.h> -#include <cutils/properties.h> #include "include/ESDS.h" namespace android { +static const int64_t kMax32BitFileSize = 0x007fffffffLL; static const uint8_t kNalUnitTypeSeqParamSet = 0x07; static const uint8_t kNalUnitTypePicParamSet = 0x08; @@ -59,7 +59,7 @@ public: bool isAvc() const { return mIsAvc; } bool isAudio() const { return mIsAudio; } bool isMPEG4() const { return mIsMPEG4; } - void addChunkOffset(off_t offset) { mChunkOffsets.push_back(offset); } + void addChunkOffset(off_t offset); status_t dump(int fd, const Vector<String16>& args) const; private: @@ -79,7 +79,7 @@ private: bool mIsRealTimeRecording; int64_t mMaxTimeStampUs; int64_t mEstimatedTrackSizeBytes; - int64_t mMaxWriteTimeUs; + int64_t mMdatSizeBytes; int32_t mTimeScale; pthread_t mThread; @@ -92,8 +92,11 @@ private: bool mSamplesHaveSameSize; List<MediaBuffer *> mChunkSamples; + + size_t mNumStcoTableEntries; List<off_t> mChunkOffsets; + size_t mNumStscTableEntries; struct StscTableEntry { StscTableEntry(uint32_t chunk, uint32_t samples, uint32_t id) @@ -107,9 +110,10 @@ private: }; List<StscTableEntry> mStscTableEntries; + size_t mNumStssTableEntries; List<int32_t> mStssTableEntries; - List<int64_t> mChunkDurations; + size_t mNumSttsTableEntries; struct SttsTableEntry { SttsTableEntry(uint32_t count, uint32_t durationUs) @@ -161,12 +165,6 @@ private: void trackProgressStatus(int64_t timeUs, status_t err = OK); void initTrackingProgressStatus(MetaData *params); - // Utilities for collecting statistical data - void logStatisticalData(bool isAudio); - void findMinAvgMaxSampleDurationMs( - int32_t *min, int32_t *avg, int32_t *max); - void findMinMaxChunkDurations(int64_t *min, int64_t *max); - void getCodecSpecificDataFromInputFormatIfPossible(); // Determine the track time scale @@ -178,14 +176,18 @@ private: // Simple validation on the codec specific data status_t checkCodecSpecificData() const; + void updateTrackSizeEstimate(); + void addOneStscTableEntry(size_t chunkId, size_t sampleId); + void addOneStssTableEntry(size_t sampleId); + void addOneSttsTableEntry(size_t sampleCount, int64_t durationUs); + Track(const Track &); Track &operator=(const Track &); }; -#define USE_NALLEN_FOUR 1 - MPEG4Writer::MPEG4Writer(const char *filename) : mFile(fopen(filename, "wb")), + mUse4ByteNalLength(true), mUse32BitOffset(true), mPaused(false), mStarted(false), @@ -198,6 +200,7 @@ MPEG4Writer::MPEG4Writer(const char *filename) MPEG4Writer::MPEG4Writer(int fd) : mFile(fdopen(fd, "wb")), + mUse4ByteNalLength(true), mUse32BitOffset(true), mPaused(false), mStarted(false), @@ -211,9 +214,11 @@ MPEG4Writer::MPEG4Writer(int fd) MPEG4Writer::~MPEG4Writer() { stop(); - for (List<Track *>::iterator it = mTracks.begin(); - it != mTracks.end(); ++it) { + while (!mTracks.empty()) { + List<Track *>::iterator it = mTracks.begin(); delete *it; + (*it) = NULL; + mTracks.erase(it); } mTracks.clear(); } @@ -332,11 +337,26 @@ status_t MPEG4Writer::start(MetaData *param) { mUse32BitOffset = false; } - // System property can overwrite the file offset bits parameter - char value[PROPERTY_VALUE_MAX]; - if (property_get("media.stagefright.record-64bits", value, NULL) - && (!strcmp(value, "1") || !strcasecmp(value, "true"))) { - mUse32BitOffset = false; + if (mUse32BitOffset) { + // Implicit 32 bit file size limit + if (mMaxFileSizeLimitBytes == 0) { + mMaxFileSizeLimitBytes = kMax32BitFileSize; + } + + // If file size is set to be larger than the 32 bit file + // size limit, treat it as an error. + if (mMaxFileSizeLimitBytes > kMax32BitFileSize) { + LOGE("32-bit file size limit too big: %lld bytes", + mMaxFileSizeLimitBytes); + return UNKNOWN_ERROR; + } + } + + int32_t use2ByteNalLength; + if (param && + param->findInt32(kKey2ByteNalLength, &use2ByteNalLength) && + use2ByteNalLength) { + mUse4ByteNalLength = false; } mStartTimestampUs = -1; @@ -413,6 +433,10 @@ status_t MPEG4Writer::start(MetaData *param) { return OK; } +bool MPEG4Writer::use32BitFileOffset() const { + return mUse32BitOffset; +} + status_t MPEG4Writer::pause() { if (mFile == NULL) { return OK; @@ -607,32 +631,30 @@ off_t MPEG4Writer::addLengthPrefixedSample_l(MediaBuffer *buffer) { size_t length = buffer->range_length(); -#if USE_NALLEN_FOUR - uint8_t x = length >> 24; - fwrite(&x, 1, 1, mFile); - x = (length >> 16) & 0xff; - fwrite(&x, 1, 1, mFile); - x = (length >> 8) & 0xff; - fwrite(&x, 1, 1, mFile); - x = length & 0xff; - fwrite(&x, 1, 1, mFile); -#else - CHECK(length < 65536); - - uint8_t x = length >> 8; - fwrite(&x, 1, 1, mFile); - x = length & 0xff; - fwrite(&x, 1, 1, mFile); -#endif - - fwrite((const uint8_t *)buffer->data() + buffer->range_offset(), - 1, length, mFile); + if (mUse4ByteNalLength) { + uint8_t x = length >> 24; + fwrite(&x, 1, 1, mFile); + x = (length >> 16) & 0xff; + fwrite(&x, 1, 1, mFile); + x = (length >> 8) & 0xff; + fwrite(&x, 1, 1, mFile); + x = length & 0xff; + fwrite(&x, 1, 1, mFile); + + fwrite((const uint8_t *)buffer->data() + buffer->range_offset(), + 1, length, mFile); + mOffset += length + 4; + } else { + CHECK(length < 65536); -#if USE_NALLEN_FOUR - mOffset += length + 4; -#else - mOffset += length + 2; -#endif + uint8_t x = length >> 8; + fwrite(&x, 1, 1, mFile); + x = length & 0xff; + fwrite(&x, 1, 1, mFile); + fwrite((const uint8_t *)buffer->data() + buffer->range_offset(), + 1, length, mFile); + mOffset += length + 2; + } return old_offset; } @@ -739,7 +761,8 @@ bool MPEG4Writer::exceedsFileSizeLimit() { it != mTracks.end(); ++it) { nTotalBytesEstimate += (*it)->getEstimatedTrackSizeBytes(); } - return (nTotalBytesEstimate >= mMaxFileSizeLimitBytes); + + return (nTotalBytesEstimate + 1024 >= mMaxFileSizeLimitBytes); } bool MPEG4Writer::exceedsFileDurationLimit() { @@ -819,6 +842,48 @@ MPEG4Writer::Track::Track( setTimeScale(); } +void MPEG4Writer::Track::updateTrackSizeEstimate() { + + int64_t stcoBoxSizeBytes = mOwner->use32BitFileOffset() + ? mNumStcoTableEntries * 4 + : mNumStcoTableEntries * 8; + + int64_t stszBoxSizeBytes = mSamplesHaveSameSize? 4: (mNumSamples * 4); + + mEstimatedTrackSizeBytes = mMdatSizeBytes + // media data size + mNumStscTableEntries * 12 + // stsc box size + mNumStssTableEntries * 4 + // stss box size + mNumSttsTableEntries * 8 + // stts box size + stcoBoxSizeBytes + // stco box size + stszBoxSizeBytes; // stsz box size +} + +void MPEG4Writer::Track::addOneStscTableEntry( + size_t chunkId, size_t sampleId) { + + StscTableEntry stscEntry(chunkId, sampleId, 1); + mStscTableEntries.push_back(stscEntry); + ++mNumStscTableEntries; +} + +void MPEG4Writer::Track::addOneStssTableEntry(size_t sampleId) { + mStssTableEntries.push_back(sampleId); + ++mNumStssTableEntries; +} + +void MPEG4Writer::Track::addOneSttsTableEntry( + size_t sampleCount, int64_t durationUs) { + + SttsTableEntry sttsEntry(sampleCount, durationUs); + mSttsTableEntries.push_back(sttsEntry); + ++mNumSttsTableEntries; +} + +void MPEG4Writer::Track::addChunkOffset(off_t offset) { + ++mNumStcoTableEntries; + mChunkOffsets.push_back(offset); +} + void MPEG4Writer::Track::setTimeScale() { LOGV("setTimeScale"); // Default time scale @@ -1039,6 +1104,7 @@ status_t MPEG4Writer::startWriterThread() { return OK; } + status_t MPEG4Writer::Track::start(MetaData *params) { if (!mDone && mPaused) { mPaused = false; @@ -1077,6 +1143,11 @@ status_t MPEG4Writer::Track::start(MetaData *params) { mTrackDurationUs = 0; mReachedEOS = false; mEstimatedTrackSizeBytes = 0; + mNumStcoTableEntries = 0; + mNumStssTableEntries = 0; + mNumStscTableEntries = 0; + mNumSttsTableEntries = 0; + mMdatSizeBytes = 0; pthread_create(&mThread, &attr, ThreadWrapper, this); pthread_attr_destroy(&attr); @@ -1123,46 +1194,6 @@ void *MPEG4Writer::Track::ThreadWrapper(void *me) { return (void *) err; } -#include <ctype.h> -static void hexdump(const void *_data, size_t size) { - const uint8_t *data = (const uint8_t *)_data; - size_t offset = 0; - while (offset < size) { - printf("0x%04x ", offset); - - size_t n = size - offset; - if (n > 16) { - n = 16; - } - - for (size_t i = 0; i < 16; ++i) { - if (i == 8) { - printf(" "); - } - - if (offset + i < size) { - printf("%02x ", data[offset + i]); - } else { - printf(" "); - } - } - - printf(" "); - - for (size_t i = 0; i < n; ++i) { - if (isprint(data[offset + i])) { - printf("%c", data[offset + i]); - } else { - printf("."); - } - } - - printf("\n"); - - offset += 16; - } -} - static void getNalUnitType(uint8_t byte, uint8_t* type) { LOGV("getNalUnitType: %d", byte); @@ -1334,7 +1365,6 @@ status_t MPEG4Writer::Track::parseAVCCodecSpecificData( status_t MPEG4Writer::Track::makeAVCCodecSpecificData( const uint8_t *data, size_t size) { - // hexdump(data, size); if (mCodecSpecificData != NULL) { LOGE("Already have codec specific data"); @@ -1365,11 +1395,11 @@ status_t MPEG4Writer::Track::makeAVCCodecSpecificData( header[3] = mLevelIdc; // 6-bit '111111' followed by 2-bit to lengthSizeMinuusOne -#if USE_NALLEN_FOUR - header[4] = 0xfc | 3; // length size == 4 bytes -#else - header[4] = 0xfc | 1; // length size == 2 bytes -#endif + if (mOwner->useNalLengthFour()) { + header[4] = 0xfc | 3; // length size == 4 bytes + } else { + header[4] = 0xfc | 1; // length size == 2 bytes + } // 3-bit '111' followed by 5-bit numSequenceParameterSets int nSequenceParamSets = mSeqParamSets.size(); @@ -1406,15 +1436,6 @@ status_t MPEG4Writer::Track::makeAVCCodecSpecificData( return OK; } -static bool collectStatisticalData() { - char value[PROPERTY_VALUE_MAX]; - if (property_get("media.stagefright.record-stats", value, NULL) - && (!strcmp(value, "1") || !strcasecmp(value, "true"))) { - return true; - } - return false; -} - status_t MPEG4Writer::Track::threadEntry() { int32_t count = 0; const int64_t interleaveDurationUs = mOwner->interleaveDuration(); @@ -1431,10 +1452,8 @@ status_t MPEG4Writer::Track::threadEntry() { int64_t timestampUs; sp<MetaData> meta_data; - bool collectStats = collectStatisticalData(); mNumSamples = 0; - mMaxWriteTimeUs = 0; status_t err = OK; MediaBuffer *buffer; while (!mDone && (err = mSource->read(&buffer)) == OK) { @@ -1495,17 +1514,19 @@ status_t MPEG4Writer::Track::threadEntry() { if (mIsAvc) StripStartcode(copy); - size_t sampleSize; - sampleSize = mIsAvc -#if USE_NALLEN_FOUR - ? copy->range_length() + 4 -#else - ? copy->range_length() + 2 -#endif - : copy->range_length(); + size_t sampleSize = copy->range_length(); + if (mIsAvc) { + if (mOwner->useNalLengthFour()) { + sampleSize += 4; + } else { + sampleSize += 2; + } + } // Max file size or duration handling - mEstimatedTrackSizeBytes += sampleSize; + mMdatSizeBytes += sampleSize; + updateTrackSizeEstimate(); + if (mOwner->exceedsFileSizeLimit()) { mOwner->notify(MEDIA_RECORDER_EVENT_INFO, MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED, 0); break; @@ -1587,8 +1608,7 @@ status_t MPEG4Writer::Track::threadEntry() { (lastTimestampUs * mTimeScale + 500000LL) / 1000000LL); if (currDurationTicks != lastDurationTicks) { - SttsTableEntry sttsEntry(sampleCount, lastDurationUs); - mSttsTableEntries.push_back(sttsEntry); + addOneSttsTableEntry(sampleCount, lastDurationUs); sampleCount = 1; } else { ++sampleCount; @@ -1611,7 +1631,7 @@ status_t MPEG4Writer::Track::threadEntry() { } if (isSync != 0) { - mStssTableEntries.push_back(mNumSamples); + addOneStssTableEntry(mNumSamples); } if (mTrackingProgressStatus) { @@ -1624,7 +1644,7 @@ status_t MPEG4Writer::Track::threadEntry() { off_t offset = mIsAvc? mOwner->addLengthPrefixedSample_l(copy) : mOwner->addSample_l(copy); if (mChunkOffsets.empty()) { - mChunkOffsets.push_back(offset); + addChunkOffset(offset); } copy->release(); copy = NULL; @@ -1633,8 +1653,7 @@ status_t MPEG4Writer::Track::threadEntry() { mChunkSamples.push_back(copy); if (interleaveDurationUs == 0) { - StscTableEntry stscEntry(++nChunks, 1, 1); - mStscTableEntries.push_back(stscEntry); + addOneStscTableEntry(++nChunks, 1); bufferChunk(timestampUs); } else { if (chunkTimestampUs == 0) { @@ -1642,15 +1661,10 @@ status_t MPEG4Writer::Track::threadEntry() { } else { if (timestampUs - chunkTimestampUs > interleaveDurationUs) { ++nChunks; - if (collectStats) { - mChunkDurations.push_back(timestampUs - chunkTimestampUs); - } if (nChunks == 1 || // First chunk (--(mStscTableEntries.end()))->samplesPerChunk != mChunkSamples.size()) { - StscTableEntry stscEntry(nChunks, - mChunkSamples.size(), 1); - mStscTableEntries.push_back(stscEntry); + addOneStscTableEntry(nChunks, mChunkSamples.size()); } bufferChunk(timestampUs); chunkTimestampUs = timestampUs; @@ -1669,12 +1683,9 @@ status_t MPEG4Writer::Track::threadEntry() { // Last chunk if (mOwner->numTracks() == 1) { - StscTableEntry stscEntry(1, mNumSamples, 1); - mStscTableEntries.push_back(stscEntry); + addOneStscTableEntry(1, mNumSamples); } else if (!mChunkSamples.empty()) { - ++nChunks; - StscTableEntry stscEntry(nChunks, mChunkSamples.size(), 1); - mStscTableEntries.push_back(stscEntry); + addOneStscTableEntry(++nChunks, mChunkSamples.size()); bufferChunk(timestampUs); } @@ -1686,14 +1697,12 @@ status_t MPEG4Writer::Track::threadEntry() { } else { ++sampleCount; // Count for the last sample } - SttsTableEntry sttsEntry(sampleCount, lastDurationUs); - mSttsTableEntries.push_back(sttsEntry); + addOneSttsTableEntry(sampleCount, lastDurationUs); mTrackDurationUs += lastDurationUs; mReachedEOS = true; - LOGI("Received total/0-length (%d/%d) buffers and encoded %d frames. Max write time: %lld us - %s", - count, nZeroLengthFrames, mNumSamples, mMaxWriteTimeUs, mIsAudio? "audio": "video"); + LOGI("Received total/0-length (%d/%d) buffers and encoded %d frames. - %s", + count, nZeroLengthFrames, mNumSamples, mIsAudio? "audio": "video"); - logStatisticalData(mIsAudio); if (err == ERROR_END_OF_STREAM) { return OK; } @@ -1718,17 +1727,6 @@ void MPEG4Writer::trackProgressStatus( CHECK(nTracks < 64); // Arbitrary number int32_t trackNum = 0; -#if 0 - // In the worst case, we can put the trackNum - // along with MEDIA_RECORDER_INFO_COMPLETION_STATUS - // to report the progress. - for (List<Track *>::iterator it = mTracks.begin(); - it != mTracks.end(); ++it, ++trackNum) { - if (track == (*it)) { - break; - } - } -#endif CHECK(trackNum < nTracks); trackNum <<= 16; @@ -1755,91 +1753,6 @@ void MPEG4Writer::trackProgressStatus( } } -void MPEG4Writer::Track::findMinAvgMaxSampleDurationMs( - int32_t *min, int32_t *avg, int32_t *max) { - CHECK(!mSampleSizes.empty()); - int32_t avgSampleDurationMs = mTrackDurationUs / 1000 / mNumSamples; - int32_t minSampleDurationMs = 0x7FFFFFFF; - int32_t maxSampleDurationMs = 0; - for (List<SttsTableEntry>::iterator it = mSttsTableEntries.begin(); - it != mSttsTableEntries.end(); ++it) { - int32_t sampleDurationMs = - (static_cast<int32_t>(it->sampleDurationUs) + 500) / 1000; - if (sampleDurationMs > maxSampleDurationMs) { - maxSampleDurationMs = sampleDurationMs; - } else if (sampleDurationMs < minSampleDurationMs) { - minSampleDurationMs = sampleDurationMs; - } - LOGI("sample duration: %d ms", sampleDurationMs); - } - CHECK(minSampleDurationMs != 0); - CHECK(avgSampleDurationMs != 0); - CHECK(maxSampleDurationMs != 0); - *min = minSampleDurationMs; - *avg = avgSampleDurationMs; - *max = maxSampleDurationMs; -} - -// Don't count the last duration -void MPEG4Writer::Track::findMinMaxChunkDurations(int64_t *min, int64_t *max) { - int64_t duration = mOwner->interleaveDuration(); - int64_t minChunkDuration = duration; - int64_t maxChunkDuration = duration; - if (mChunkDurations.size() > 1) { - for (List<int64_t>::iterator it = mChunkDurations.begin(); - it != --mChunkDurations.end(); ++it) { - if (minChunkDuration > (*it)) { - minChunkDuration = (*it); - } else if (maxChunkDuration < (*it)) { - maxChunkDuration = (*it); - } - } - } - *min = minChunkDuration; - *max = maxChunkDuration; -} - -void MPEG4Writer::Track::logStatisticalData(bool isAudio) { - if (mTrackDurationUs <= 0 || mSampleSizes.empty()) { - LOGI("nothing is recorded"); - return; - } - - bool collectStats = collectStatisticalData(); - - if (collectStats) { - LOGI("%s track - duration %lld us, total %d frames", - isAudio? "audio": "video", mTrackDurationUs, - mNumSamples); - int32_t min, avg, max; - findMinAvgMaxSampleDurationMs(&min, &avg, &max); - LOGI("min/avg/max sample duration (ms): %d/%d/%d", min, avg, max); - if (!isAudio) { - float avgFps = 1000.0 / avg; - float minFps = 1000.0 / max; - float maxFps = 1000.0 / min; - LOGI("min/avg/max frame rate (fps): %.2f/%.2f/%.2f", - minFps, avgFps, maxFps); - } - - int64_t totalBytes = 0; - for (List<size_t>::iterator it = mSampleSizes.begin(); - it != mSampleSizes.end(); ++it) { - totalBytes += (*it); - } - float bitRate = (totalBytes * 8000000.0) / mTrackDurationUs; - LOGI("avg bit rate (bps): %.2f", bitRate); - - int64_t duration = mOwner->interleaveDuration(); - if (duration != 0) { // If interleaving is enabled - int64_t minChunk, maxChunk; - findMinMaxChunkDurations(&minChunk, &maxChunk); - LOGI("min/avg/max chunk duration (ms): %lld/%lld/%lld", - minChunk, duration, maxChunk); - } - } -} - void MPEG4Writer::setDriftTimeUs(int64_t driftTimeUs) { LOGV("setDriftTimeUs: %lld us", driftTimeUs); Mutex::Autolock autolock(mLock); @@ -1852,17 +1765,16 @@ int64_t MPEG4Writer::getDriftTimeUs() { return mDriftTimeUs; } +bool MPEG4Writer::useNalLengthFour() { + return mUse4ByteNalLength; +} + void MPEG4Writer::Track::bufferChunk(int64_t timestampUs) { LOGV("bufferChunk"); - int64_t startTimeUs = systemTime() / 1000; Chunk chunk(this, timestampUs, mChunkSamples); mOwner->bufferChunk(chunk); mChunkSamples.clear(); - int64_t endTimeUs = systemTime() / 1000; - if (mMaxWriteTimeUs < endTimeUs - startTimeUs) { - mMaxWriteTimeUs = endTimeUs - startTimeUs; - } } int64_t MPEG4Writer::Track::getDurationUs() const { @@ -2215,7 +2127,7 @@ void MPEG4Writer::Track::writeTrackHeader( mOwner->beginBox("stts"); mOwner->writeInt32(0); // version=0, flags=0 - mOwner->writeInt32(mSttsTableEntries.size()); + mOwner->writeInt32(mNumSttsTableEntries); int64_t prevTimestampUs = 0; for (List<SttsTableEntry>::iterator it = mSttsTableEntries.begin(); it != mSttsTableEntries.end(); ++it) { @@ -2235,7 +2147,7 @@ void MPEG4Writer::Track::writeTrackHeader( if (!mIsAudio) { mOwner->beginBox("stss"); mOwner->writeInt32(0); // version=0, flags=0 - mOwner->writeInt32(mStssTableEntries.size()); // number of sync frames + mOwner->writeInt32(mNumStssTableEntries); // number of sync frames for (List<int32_t>::iterator it = mStssTableEntries.begin(); it != mStssTableEntries.end(); ++it) { mOwner->writeInt32(*it); @@ -2262,7 +2174,7 @@ void MPEG4Writer::Track::writeTrackHeader( mOwner->beginBox("stsc"); mOwner->writeInt32(0); // version=0, flags=0 - mOwner->writeInt32(mStscTableEntries.size()); + mOwner->writeInt32(mNumStscTableEntries); for (List<StscTableEntry>::iterator it = mStscTableEntries.begin(); it != mStscTableEntries.end(); ++it) { mOwner->writeInt32(it->firstChunk); @@ -2272,7 +2184,7 @@ void MPEG4Writer::Track::writeTrackHeader( mOwner->endBox(); // stsc mOwner->beginBox(use32BitOffset? "stco": "co64"); mOwner->writeInt32(0); // version=0, flags=0 - mOwner->writeInt32(mChunkOffsets.size()); + mOwner->writeInt32(mNumStcoTableEntries); for (List<off_t>::iterator it = mChunkOffsets.begin(); it != mChunkOffsets.end(); ++it) { if (use32BitOffset) { diff --git a/services/java/com/android/server/MountService.java b/services/java/com/android/server/MountService.java index 344bfc1421a0..6e8b42e8ca43 100644 --- a/services/java/com/android/server/MountService.java +++ b/services/java/com/android/server/MountService.java @@ -68,6 +68,8 @@ class MountService extends IMountService.Stub private static final String TAG = "MountService"; + private static final String VOLD_TAG = "VoldConnector"; + /* * Internal vold volume state constants */ @@ -993,9 +995,15 @@ class MountService extends IMountService.Stub return; } - mConnector = new NativeDaemonConnector(this, "vold", 10, "VoldConnector"); + /* + * Create the connection to vold with a maximum queue of twice the + * amount of containers we'd ever expect to have. This keeps an + * "asec list" from blocking a thread repeatedly. + */ + mConnector = new NativeDaemonConnector(this, "vold", + PackageManagerService.MAX_CONTAINERS * 2, VOLD_TAG); mReady = false; - Thread thread = new Thread(mConnector, NativeDaemonConnector.class.getName()); + Thread thread = new Thread(mConnector, VOLD_TAG); thread.start(); } diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java index c15615064fcc..4a69f2047e94 100644 --- a/services/java/com/android/server/NetworkManagementService.java +++ b/services/java/com/android/server/NetworkManagementService.java @@ -55,6 +55,8 @@ class NetworkManagementService extends INetworkManagementService.Stub { private static final String TAG = "NetworkManagmentService"; + private static final String NETD_TAG = "NetdConnector"; + class NetdResponseCode { public static final int InterfaceListResult = 110; public static final int TetherInterfaceListResult = 111; @@ -101,8 +103,8 @@ class NetworkManagementService extends INetworkManagementService.Stub { } mConnector = new NativeDaemonConnector( - new NetdCallbackReceiver(), "netd", 10, "NetdConnector"); - Thread thread = new Thread(mConnector, NativeDaemonConnector.class.getName()); + new NetdCallbackReceiver(), "netd", 10, NETD_TAG); + Thread thread = new Thread(mConnector, NETD_TAG); thread.start(); } diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java index 1141fdcea7be..e3480a888771 100644 --- a/services/java/com/android/server/PackageManagerService.java +++ b/services/java/com/android/server/PackageManagerService.java @@ -2022,7 +2022,11 @@ class PackageManagerService extends IPackageManager.Stub { ActivityInfo ai = getActivityInfo(pa.mActivity, flags); if (DEBUG_PREFERRED) { Log.v(TAG, "Got preferred activity:"); - ai.dump(new LogPrinter(Log.INFO, TAG), " "); + if (ai != null) { + ai.dump(new LogPrinter(Log.VERBOSE, TAG), " "); + } else { + Log.v(TAG, " null"); + } } if (ai != null) { for (int j=0; j<N; j++) { @@ -9383,17 +9387,18 @@ class PackageManagerService extends IPackageManager.Stub { // ------- apps on sdcard specific code ------- static final boolean DEBUG_SD_INSTALL = false; - final private String mSdEncryptKey = "AppsOnSD"; - final private String mSdEncryptAlg = "AES"; + private static final String SD_ENCRYPTION_KEYSTORE_NAME = "AppsOnSD"; + private static final String SD_ENCRYPTION_ALGORITHM = "AES"; + static final int MAX_CONTAINERS = 250; private boolean mMediaMounted = false; - private static final int MAX_CONTAINERS = 250; private String getEncryptKey() { try { - String sdEncKey = SystemKeyStore.getInstance().retrieveKeyHexString(mSdEncryptKey); + String sdEncKey = SystemKeyStore.getInstance().retrieveKeyHexString( + SD_ENCRYPTION_KEYSTORE_NAME); if (sdEncKey == null) { - sdEncKey = SystemKeyStore.getInstance(). - generateNewKeyHexString(128, mSdEncryptAlg, mSdEncryptKey); + sdEncKey = SystemKeyStore.getInstance().generateNewKeyHexString(128, + SD_ENCRYPTION_ALGORITHM, SD_ENCRYPTION_KEYSTORE_NAME); if (sdEncKey == null) { Slog.e(TAG, "Failed to create encryption keys"); return null; diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index 30dc5ea84ec3..89a162764b15 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -6801,7 +6801,7 @@ public final class ActivityManagerService extends ActivityManagerNative implemen app.pid, app.getPackageList()); currApp.uid = app.info.uid; if (mHeavyWeightProcess == app) { - currApp.flags |= ActivityManager.RunningAppProcessInfo.FLAG_HEAVY_WEIGHT; + currApp.flags |= ActivityManager.RunningAppProcessInfo.FLAG_CANT_SAVE_STATE; } int adj = app.curAdj; if (adj >= EMPTY_APP_ADJ) { diff --git a/telephony/java/com/android/internal/telephony/PhoneBase.java b/telephony/java/com/android/internal/telephony/PhoneBase.java index 74601e620be4..ff28773df5c2 100644 --- a/telephony/java/com/android/internal/telephony/PhoneBase.java +++ b/telephony/java/com/android/internal/telephony/PhoneBase.java @@ -286,7 +286,7 @@ public abstract class PhoneBase extends Handler implements Phone { SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext()); SharedPreferences.Editor editor = sp.edit(); editor.putBoolean(DNS_SERVER_CHECK_DISABLED_KEY, b); - editor.commit(); + editor.apply(); } /** diff --git a/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java b/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java index c21b6d986523..4508e9a4d741 100755 --- a/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java +++ b/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java @@ -1405,7 +1405,7 @@ public class CDMAPhone extends PhoneBase { SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext()); SharedPreferences.Editor editor = sp.edit(); editor.putString(VM_NUMBER_CDMA, number); - editor.commit(); + editor.apply(); } /** diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java b/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java index 8eaf4a27f462..dceff2a956b6 100644 --- a/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java +++ b/telephony/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java @@ -127,7 +127,7 @@ final class CdmaSMSDispatcher extends SMSDispatcher { mPhone.getContext()); SharedPreferences.Editor editor = sp.edit(); editor.putInt(CDMAPhone.VM_COUNT_CDMA, voicemailCount); - editor.commit(); + editor.apply(); ((CDMAPhone) mPhone).updateMessageWaitingIndicator(voicemailCount); handled = true; } else if (((SmsEnvelope.TELESERVICE_WMT == teleService) || diff --git a/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java b/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java index c7b1e5cd3c52..e5ca51932641 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java +++ b/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java @@ -807,7 +807,7 @@ public class GSMPhone extends PhoneBase { SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext()); SharedPreferences.Editor editor = sp.edit(); editor.putString(VM_NUMBER, number); - editor.commit(); + editor.apply(); setVmSimImsi(getSubscriberId()); } @@ -830,7 +830,7 @@ public class GSMPhone extends PhoneBase { SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getContext()); SharedPreferences.Editor editor = sp.edit(); editor.putString(VM_SIM_IMSI, imsi); - editor.commit(); + editor.apply(); } public String getVoiceMailAlphaTag() { |