Merge changes I1c8b2990,Iba947381
* changes:
C-ify DataSource
C API for extractor plugins
diff --git a/media/libaudioclient/AudioEffect.cpp b/media/libaudioclient/AudioEffect.cpp
index da7d85e..cf11936 100644
--- a/media/libaudioclient/AudioEffect.cpp
+++ b/media/libaudioclient/AudioEffect.cpp
@@ -458,6 +458,38 @@
return NO_ERROR;
}
+status_t AudioEffect::addSourceDefaultEffect(const char *typeStr,
+ const String16& opPackageName,
+ const char *uuidStr,
+ int32_t priority,
+ audio_source_t source,
+ audio_unique_id_t *id)
+{
+ const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
+ if (aps == 0) return PERMISSION_DENIED;
+
+ if (typeStr == NULL && uuidStr == NULL) return BAD_VALUE;
+
+ // Convert type & uuid from string to effect_uuid_t.
+ effect_uuid_t type;
+ if (typeStr != NULL) {
+ status_t res = stringToGuid(typeStr, &type);
+ if (res != OK) return res;
+ } else {
+ type = *EFFECT_UUID_NULL;
+ }
+
+ effect_uuid_t uuid;
+ if (uuidStr != NULL) {
+ status_t res = stringToGuid(uuidStr, &uuid);
+ if (res != OK) return res;
+ } else {
+ uuid = *EFFECT_UUID_NULL;
+ }
+
+ return aps->addSourceDefaultEffect(&type, opPackageName, &uuid, priority, source, id);
+}
+
status_t AudioEffect::addStreamDefaultEffect(const char *typeStr,
const String16& opPackageName,
const char *uuidStr,
@@ -490,6 +522,14 @@
return aps->addStreamDefaultEffect(&type, opPackageName, &uuid, priority, usage, id);
}
+status_t AudioEffect::removeSourceDefaultEffect(audio_unique_id_t id)
+{
+ const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
+ if (aps == 0) return PERMISSION_DENIED;
+
+ return aps->removeSourceDefaultEffect(id);
+}
+
status_t AudioEffect::removeStreamDefaultEffect(audio_unique_id_t id)
{
const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
diff --git a/media/libaudioclient/AudioRecord.cpp b/media/libaudioclient/AudioRecord.cpp
index f9df5b1..e2de8e7 100644
--- a/media/libaudioclient/AudioRecord.cpp
+++ b/media/libaudioclient/AudioRecord.cpp
@@ -865,9 +865,9 @@
} else if (waitCount == 0) {
requested = &ClientProxy::kNonBlocking;
} else if (waitCount > 0) {
- long long ms = WAIT_PERIOD_MS * (long long) waitCount;
+ time_t ms = WAIT_PERIOD_MS * (time_t) waitCount;
timeout.tv_sec = ms / 1000;
- timeout.tv_nsec = (int) (ms % 1000) * 1000000;
+ timeout.tv_nsec = (long) (ms % 1000) * 1000000;
requested = &timeout;
} else {
ALOGE("%s invalid waitCount %d", __func__, waitCount);
diff --git a/media/libaudioclient/AudioTrack.cpp b/media/libaudioclient/AudioTrack.cpp
index ab9efe8..76c9bfb 100644
--- a/media/libaudioclient/AudioTrack.cpp
+++ b/media/libaudioclient/AudioTrack.cpp
@@ -706,6 +706,13 @@
// force refresh of remaining frames by processAudioBuffer() as last
// write before stop could be partial.
mRefreshRemaining = true;
+
+ // for static track, clear the old flags when starting from stopped state
+ if (mSharedBuffer != 0) {
+ android_atomic_and(
+ ~(CBLK_LOOP_CYCLE | CBLK_LOOP_FINAL | CBLK_BUFFER_END),
+ &mCblk->mFlags);
+ }
}
mNewPosition = mPosition + mUpdatePeriod;
int32_t flags = android_atomic_and(~(CBLK_STREAM_END_DONE | CBLK_DISABLED), &mCblk->mFlags);
@@ -1634,9 +1641,9 @@
} else if (waitCount == 0) {
requested = &ClientProxy::kNonBlocking;
} else if (waitCount > 0) {
- long long ms = WAIT_PERIOD_MS * (long long) waitCount;
+ time_t ms = WAIT_PERIOD_MS * (time_t) waitCount;
timeout.tv_sec = ms / 1000;
- timeout.tv_nsec = (int) (ms % 1000) * 1000000;
+ timeout.tv_nsec = (long) (ms % 1000) * 1000000;
requested = &timeout;
} else {
ALOGE("%s invalid waitCount %d", __func__, waitCount);
diff --git a/media/libaudioclient/AudioTrackShared.cpp b/media/libaudioclient/AudioTrackShared.cpp
index a018b22..b8156c6 100644
--- a/media/libaudioclient/AudioTrackShared.cpp
+++ b/media/libaudioclient/AudioTrackShared.cpp
@@ -286,7 +286,8 @@
struct timespec after;
clock_gettime(CLOCK_MONOTONIC, &after);
total.tv_sec += after.tv_sec - before.tv_sec;
- long deltaNs = after.tv_nsec - before.tv_nsec;
+ // Use auto instead of long to avoid the google-runtime-int warning.
+ auto deltaNs = after.tv_nsec - before.tv_nsec;
if (deltaNs < 0) {
deltaNs += 1000000000;
total.tv_sec--;
diff --git a/media/libaudioclient/IAudioPolicyService.cpp b/media/libaudioclient/IAudioPolicyService.cpp
index abf74f8..32a71f3 100644
--- a/media/libaudioclient/IAudioPolicyService.cpp
+++ b/media/libaudioclient/IAudioPolicyService.cpp
@@ -83,7 +83,9 @@
GET_SURROUND_FORMATS,
SET_SURROUND_FORMAT_ENABLED,
ADD_STREAM_DEFAULT_EFFECT,
- REMOVE_STREAM_DEFAULT_EFFECT
+ REMOVE_STREAM_DEFAULT_EFFECT,
+ ADD_SOURCE_DEFAULT_EFFECT,
+ REMOVE_SOURCE_DEFAULT_EFFECT
};
#define MAX_ITEMS_PER_LIST 1024
@@ -904,6 +906,41 @@
return static_cast <status_t> (reply.readInt32());
}
+ virtual status_t addSourceDefaultEffect(const effect_uuid_t *type,
+ const String16& opPackageName,
+ const effect_uuid_t *uuid,
+ int32_t priority,
+ audio_source_t source,
+ audio_unique_id_t* id)
+ {
+ Parcel data, reply;
+ data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
+ data.write(type, sizeof(effect_uuid_t));
+ data.writeString16(opPackageName);
+ data.write(uuid, sizeof(effect_uuid_t));
+ data.writeInt32(priority);
+ data.writeInt32((int32_t) source);
+ status_t status = remote()->transact(ADD_SOURCE_DEFAULT_EFFECT, data, &reply);
+ if (status != NO_ERROR) {
+ return status;
+ }
+ status = static_cast <status_t> (reply.readInt32());
+ *id = reply.readInt32();
+ return status;
+ }
+
+ virtual status_t removeSourceDefaultEffect(audio_unique_id_t id)
+ {
+ Parcel data, reply;
+ data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
+ data.writeInt32(id);
+ status_t status = remote()->transact(REMOVE_SOURCE_DEFAULT_EFFECT, data, &reply);
+ if (status != NO_ERROR) {
+ return status;
+ }
+ return static_cast <status_t> (reply.readInt32());
+ }
+
};
IMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService");
@@ -1636,6 +1673,43 @@
return NO_ERROR;
}
+ case ADD_SOURCE_DEFAULT_EFFECT: {
+ CHECK_INTERFACE(IAudioPolicyService, data, reply);
+ effect_uuid_t type;
+ status_t status = data.read(&type, sizeof(effect_uuid_t));
+ if (status != NO_ERROR) {
+ return status;
+ }
+ String16 opPackageName;
+ status = data.readString16(&opPackageName);
+ if (status != NO_ERROR) {
+ return status;
+ }
+ effect_uuid_t uuid;
+ status = data.read(&uuid, sizeof(effect_uuid_t));
+ if (status != NO_ERROR) {
+ return status;
+ }
+ int32_t priority = data.readInt32();
+ audio_source_t source = (audio_source_t) data.readInt32();
+ audio_unique_id_t id = 0;
+ reply->writeInt32(static_cast <int32_t>(addSourceDefaultEffect(&type,
+ opPackageName,
+ &uuid,
+ priority,
+ source,
+ &id)));
+ reply->writeInt32(id);
+ return NO_ERROR;
+ }
+
+ case REMOVE_SOURCE_DEFAULT_EFFECT: {
+ CHECK_INTERFACE(IAudioPolicyService, data, reply);
+ audio_unique_id_t id = static_cast<audio_unique_id_t>(data.readInt32());
+ reply->writeInt32(static_cast <int32_t>(removeSourceDefaultEffect(id)));
+ return NO_ERROR;
+ }
+
default:
return BBinder::onTransact(code, data, reply, flags);
}
diff --git a/media/libaudioclient/ToneGenerator.cpp b/media/libaudioclient/ToneGenerator.cpp
index 5716727..5e979e0 100644
--- a/media/libaudioclient/ToneGenerator.cpp
+++ b/media/libaudioclient/ToneGenerator.cpp
@@ -1136,13 +1136,13 @@
// This is needed in case of cold start of the output stream.
if ((mStartTime.tv_sec != 0) && (clock_gettime(CLOCK_MONOTONIC, &stopTime) == 0)) {
time_t sec = stopTime.tv_sec - mStartTime.tv_sec;
- long nsec = stopTime.tv_nsec - mStartTime.tv_nsec;
+ auto nsec = stopTime.tv_nsec - mStartTime.tv_nsec;
if (nsec < 0) {
--sec;
nsec += 1000000000;
}
- if ((sec + 1) > ((long)(INT_MAX / mSamplingRate))) {
+ if ((sec + 1) > ((time_t)(INT_MAX / mSamplingRate))) {
mMaxSmp = sec * mSamplingRate;
} else {
// mSamplingRate is always > 1000
@@ -1257,8 +1257,8 @@
AudioTrack::Buffer *buffer = static_cast<AudioTrack::Buffer *>(info);
ToneGenerator *lpToneGen = static_cast<ToneGenerator *>(user);
- short *lpOut = buffer->i16;
- unsigned int lNumSmp = buffer->size/sizeof(short);
+ int16_t *lpOut = buffer->i16;
+ unsigned int lNumSmp = buffer->size/sizeof(int16_t);
const ToneDescriptor *lpToneDesc = lpToneGen->mpToneDesc;
if (buffer->size == 0) return;
@@ -1329,7 +1329,7 @@
if (lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[0] != 0) {
lWaveCmd = WaveGenerator::WAVEGEN_STOP;
unsigned int lFreqIdx = 0;
- unsigned short lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[lFreqIdx];
+ uint16_t lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[lFreqIdx];
while (lFrequency != 0) {
WaveGenerator *lpWaveGen = lpToneGen->mWaveGens.valueFor(lFrequency);
@@ -1415,7 +1415,7 @@
if (lGenSmp) {
// If samples must be generated, call all active wave generators and acumulate waves in lpOut
unsigned int lFreqIdx = 0;
- unsigned short lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[lFreqIdx];
+ uint16_t lFrequency = lpToneDesc->segments[lpToneGen->mCurSegment].waveFreq[lFreqIdx];
while (lFrequency != 0) {
WaveGenerator *lpWaveGen = lpToneGen->mWaveGens.valueFor(lFrequency);
@@ -1654,17 +1654,17 @@
//
////////////////////////////////////////////////////////////////////////////////
ToneGenerator::WaveGenerator::WaveGenerator(uint32_t samplingRate,
- unsigned short frequency, float volume) {
+ uint16_t frequency, float volume) {
double d0;
double F_div_Fs; // frequency / samplingRate
F_div_Fs = frequency / (double)samplingRate;
d0 = - (float)GEN_AMP * sin(2 * M_PI * F_div_Fs);
- mS2_0 = (short)d0;
+ mS2_0 = (int16_t)d0;
mS1 = 0;
mS2 = mS2_0;
- mAmplitude_Q15 = (short)(32767. * 32767. * volume / GEN_AMP);
+ mAmplitude_Q15 = (int16_t)(32767. * 32767. * volume / GEN_AMP);
// take some margin for amplitude fluctuation
if (mAmplitude_Q15 > 32500)
mAmplitude_Q15 = 32500;
@@ -1672,7 +1672,7 @@
d0 = 32768.0 * cos(2 * M_PI * F_div_Fs); // Q14*2*cos()
if (d0 > 32767)
d0 = 32767;
- mA1_Q14 = (short) d0;
+ mA1_Q14 = (int16_t) d0;
ALOGV("WaveGenerator init, mA1_Q14: %d, mS2_0: %d, mAmplitude_Q15: %d",
mA1_Q14, mS2_0, mAmplitude_Q15);
@@ -1710,7 +1710,7 @@
// none
//
////////////////////////////////////////////////////////////////////////////////
-void ToneGenerator::WaveGenerator::getSamples(short *outBuffer,
+void ToneGenerator::WaveGenerator::getSamples(int16_t *outBuffer,
unsigned int count, unsigned int command) {
long lS1, lS2;
long lA1, lAmplitude;
@@ -1741,7 +1741,7 @@
lS2 = lS1;
lS1 = Sample;
Sample = ((lAmplitude>>16) * Sample) >> S_Q15;
- *(outBuffer++) += (short)Sample; // put result in buffer
+ *(outBuffer++) += (int16_t)Sample; // put result in buffer
lAmplitude -= dec;
}
} else {
@@ -1753,7 +1753,7 @@
lS2 = lS1;
lS1 = Sample;
Sample = (lAmplitude * Sample) >> S_Q15;
- *(outBuffer++) += (short)Sample; // put result in buffer
+ *(outBuffer++) += (int16_t)Sample; // put result in buffer
}
}
diff --git a/media/libaudioclient/include/media/AudioEffect.h b/media/libaudioclient/include/media/AudioEffect.h
index 58a9baa..6bd4137 100644
--- a/media/libaudioclient/include/media/AudioEffect.h
+++ b/media/libaudioclient/include/media/AudioEffect.h
@@ -170,6 +170,44 @@
*/
/*
+ * Adds an effect to the list of default output effects for a given source type.
+ *
+ * If the effect is no longer available when a source of the given type
+ * is created, the system will continue without adding it.
+ *
+ * Parameters:
+ * typeStr: Type uuid of effect to be a default: can be null if uuidStr is specified.
+ * This may correspond to the OpenSL ES interface implemented by this effect,
+ * or could be some vendor-defined type.
+ * opPackageName: The package name used for app op checks.
+ * uuidStr: Uuid of effect to be a default: can be null if type is specified.
+ * This uuid corresponds to a particular implementation of an effect type.
+ * Note if both uuidStr and typeStr are specified, typeStr is ignored.
+ * priority: Requested priority for effect control: the priority level corresponds to the
+ * value of priority parameter: negative values indicate lower priorities, positive
+ * values higher priorities, 0 being the normal priority.
+ * source: The source this effect should be a default for.
+ * id: Address where the system-wide unique id of the default effect should be returned.
+ *
+ * Returned status (from utils/Errors.h) can be:
+ * NO_ERROR successful operation.
+ * PERMISSION_DENIED could not get AudioFlinger interface
+ * or caller lacks required permissions.
+ * NO_INIT effect library failed to initialize.
+ * BAD_VALUE invalid source, type uuid or implementation uuid.
+ * NAME_NOT_FOUND no effect with this uuid or type found.
+ *
+ * Returned value
+ * *id: The system-wide unique id of the added default effect.
+ */
+ static status_t addSourceDefaultEffect(const char* typeStr,
+ const String16& opPackageName,
+ const char* uuidStr,
+ int32_t priority,
+ audio_source_t source,
+ audio_unique_id_t* id);
+
+ /*
* Adds an effect to the list of default output effects for a given stream type.
*
* If the effect is no longer available when a stream of the given type
@@ -209,6 +247,21 @@
audio_unique_id_t* id);
/*
+ * Removes an effect from the list of default output effects for a given source type.
+ *
+ * Parameters:
+ * id: The system-wide unique id of the effect that should no longer be a default.
+ *
+ * Returned status (from utils/Errors.h) can be:
+ * NO_ERROR successful operation.
+ * PERMISSION_DENIED could not get AudioFlinger interface
+ * or caller lacks required permissions.
+ * NO_INIT effect library failed to initialize.
+ * BAD_VALUE invalid id.
+ */
+ static status_t removeSourceDefaultEffect(audio_unique_id_t id);
+
+ /*
* Removes an effect from the list of default output effects for a given stream type.
*
* Parameters:
diff --git a/media/libaudioclient/include/media/AudioRecord.h b/media/libaudioclient/include/media/AudioRecord.h
index cf446a5..806280a 100644
--- a/media/libaudioclient/include/media/AudioRecord.h
+++ b/media/libaudioclient/include/media/AudioRecord.h
@@ -85,7 +85,7 @@
union {
void* raw;
- short* i16; // signed 16-bit
+ int16_t* i16; // signed 16-bit
int8_t* i8; // unsigned 8-bit, offset by 0x80
// input to obtainBuffer(): unused, output: pointer to buffer
};
diff --git a/media/libaudioclient/include/media/AudioTrack.h b/media/libaudioclient/include/media/AudioTrack.h
index 3eb627d..59c6f4c 100644
--- a/media/libaudioclient/include/media/AudioTrack.h
+++ b/media/libaudioclient/include/media/AudioTrack.h
@@ -102,7 +102,7 @@
union {
void* raw;
- short* i16; // signed 16-bit
+ int16_t* i16; // signed 16-bit
int8_t* i8; // unsigned 8-bit, offset by 0x80
}; // input to obtainBuffer(): unused, output: pointer to buffer
};
diff --git a/media/libaudioclient/include/media/IAudioPolicyService.h b/media/libaudioclient/include/media/IAudioPolicyService.h
index c2899f8..fdd8d57 100644
--- a/media/libaudioclient/include/media/IAudioPolicyService.h
+++ b/media/libaudioclient/include/media/IAudioPolicyService.h
@@ -109,12 +109,19 @@
virtual status_t queryDefaultPreProcessing(audio_session_t audioSession,
effect_descriptor_t *descriptors,
uint32_t *count) = 0;
+ virtual status_t addSourceDefaultEffect(const effect_uuid_t *type,
+ const String16& opPackageName,
+ const effect_uuid_t *uuid,
+ int32_t priority,
+ audio_source_t source,
+ audio_unique_id_t* id) = 0;
virtual status_t addStreamDefaultEffect(const effect_uuid_t *type,
const String16& opPackageName,
const effect_uuid_t *uuid,
int32_t priority,
audio_usage_t usage,
audio_unique_id_t* id) = 0;
+ virtual status_t removeSourceDefaultEffect(audio_unique_id_t id) = 0;
virtual status_t removeStreamDefaultEffect(audio_unique_id_t id) = 0;
// Check if offload is possible for given format, stream type, sample rate,
// bit rate, duration, video and streaming or offload property is enabled
diff --git a/media/libaudioclient/include/media/ToneGenerator.h b/media/libaudioclient/include/media/ToneGenerator.h
index 247703f..e0e3bb1 100644
--- a/media/libaudioclient/include/media/ToneGenerator.h
+++ b/media/libaudioclient/include/media/ToneGenerator.h
@@ -256,9 +256,9 @@
class ToneSegment {
public:
unsigned int duration;
- unsigned short waveFreq[TONEGEN_MAX_WAVES+1];
- unsigned short loopCnt;
- unsigned short loopIndx;
+ uint16_t waveFreq[TONEGEN_MAX_WAVES+1];
+ uint16_t loopCnt;
+ uint16_t loopIndx;
};
class ToneDescriptor {
@@ -279,14 +279,14 @@
unsigned int mMaxSmp; // Maximum number of audio samples played (maximun tone duration)
int mDurationMs; // Maximum tone duration in ms
- unsigned short mCurSegment; // Current segment index in ToneDescriptor segments[]
- unsigned short mCurCount; // Current sequence repeat count
- volatile unsigned short mState; // ToneGenerator state (tone_state)
- unsigned short mRegion;
+ uint16_t mCurSegment; // Current segment index in ToneDescriptor segments[]
+ uint16_t mCurCount; // Current sequence repeat count
+ volatile uint16_t mState; // ToneGenerator state (tone_state)
+ uint16_t mRegion;
const ToneDescriptor *mpToneDesc; // pointer to active tone descriptor
const ToneDescriptor *mpNewToneDesc; // pointer to next active tone descriptor
- unsigned short mLoopCounter; // Current tone loopback count
+ uint16_t mLoopCounter; // Current tone loopback count
uint32_t mSamplingRate; // AudioFlinger Sampling rate
sp<AudioTrack> mpAudioTrack; // Pointer to audio track used for playback
@@ -314,26 +314,26 @@
WAVEGEN_STOP // Stop wave on zero crossing
};
- WaveGenerator(uint32_t samplingRate, unsigned short frequency,
+ WaveGenerator(uint32_t samplingRate, uint16_t frequency,
float volume);
~WaveGenerator();
- void getSamples(short *outBuffer, unsigned int count,
+ void getSamples(int16_t *outBuffer, unsigned int count,
unsigned int command);
private:
- static const short GEN_AMP = 32000; // amplitude of generator
- static const short S_Q14 = 14; // shift for Q14
- static const short S_Q15 = 15; // shift for Q15
+ static const int16_t GEN_AMP = 32000; // amplitude of generator
+ static const int16_t S_Q14 = 14; // shift for Q14
+ static const int16_t S_Q15 = 15; // shift for Q15
- short mA1_Q14; // Q14 coefficient
+ int16_t mA1_Q14; // Q14 coefficient
// delay line of full amplitude generator
long mS1, mS2; // delay line S2 oldest
- short mS2_0; // saved value for reinitialisation
- short mAmplitude_Q15; // Q15 amplitude
+ int16_t mS2_0; // saved value for reinitialisation
+ int16_t mAmplitude_Q15; // Q15 amplitude
};
- KeyedVector<unsigned short, WaveGenerator *> mWaveGens; // list of active wave generators.
+ KeyedVector<uint16_t, WaveGenerator *> mWaveGens; // list of active wave generators.
};
}
diff --git a/media/libstagefright/FrameDecoder.cpp b/media/libstagefright/FrameDecoder.cpp
index 3370df1..c0e65e8 100644
--- a/media/libstagefright/FrameDecoder.cpp
+++ b/media/libstagefright/FrameDecoder.cpp
@@ -528,6 +528,18 @@
ColorConverter converter((OMX_COLOR_FORMATTYPE)srcFormat, dstFormat());
+ uint32_t standard, range, transfer;
+ if (!outputFormat->findInt32("color-standard", (int32_t*)&standard)) {
+ standard = 0;
+ }
+ if (!outputFormat->findInt32("color-range", (int32_t*)&range)) {
+ range = 0;
+ }
+ if (!outputFormat->findInt32("color-transfer", (int32_t*)&transfer)) {
+ transfer = 0;
+ }
+ converter.setSrcColorSpace(standard, range, transfer);
+
if (converter.isValid()) {
converter.convert(
(const uint8_t *)videoFrameBuffer->data(),
@@ -699,6 +711,18 @@
ColorConverter converter((OMX_COLOR_FORMATTYPE)srcFormat, dstFormat());
+ uint32_t standard, range, transfer;
+ if (!outputFormat->findInt32("color-standard", (int32_t*)&standard)) {
+ standard = 0;
+ }
+ if (!outputFormat->findInt32("color-range", (int32_t*)&range)) {
+ range = 0;
+ }
+ if (!outputFormat->findInt32("color-transfer", (int32_t*)&transfer)) {
+ transfer = 0;
+ }
+ converter.setSrcColorSpace(standard, range, transfer);
+
int32_t dstLeft, dstTop, dstRight, dstBottom;
dstLeft = mTilesDecoded % mGridCols * width;
dstTop = mTilesDecoded / mGridCols * height;
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_framedecoder.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_framedecoder.cpp
index 26bc25c..df6cd03 100644
--- a/media/libstagefright/codecs/mp3dec/src/pvmp3_framedecoder.cpp
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_framedecoder.cpp
@@ -299,7 +299,11 @@
}
- bytes_to_discard = pVars->frame_start - pVars->sideInfo.main_data_begin - main_data_end;
+ // force signed computation; buffer sizes and offsets are all going to be
+ // well within the constraints of 32-bit signed math.
+ bytes_to_discard = pVars->frame_start
+ - ((int32)pVars->sideInfo.main_data_begin)
+ - ((int32)main_data_end);
if (main_data_end > BUFSIZE) /* check overflow on the buffer */
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_get_side_info.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_get_side_info.cpp
index 7eaa860..e55c2e7 100644
--- a/media/libstagefright/codecs/mp3dec/src/pvmp3_get_side_info.cpp
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_get_side_info.cpp
@@ -154,7 +154,7 @@
tmp = getbits_crc(inputStream, 22, crc, info->error_protection);
si->ch[ch].gran[gr].big_values = (tmp << 10) >> 23; /* 9 */
- si->ch[ch].gran[gr].global_gain = ((tmp << 19) >> 24) - 210; /* 8 */
+ si->ch[ch].gran[gr].global_gain = (int32)((tmp << 19) >> 24) - 210; /* 8 */
si->ch[ch].gran[gr].scalefac_compress = (tmp << 27) >> 28; /* 4 */
si->ch[ch].gran[gr].window_switching_flag = tmp & 1; /* 1 */
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_stereo_proc.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_stereo_proc.cpp
index 10edfc3..4338c43 100644
--- a/media/libstagefright/codecs/mp3dec/src/pvmp3_stereo_proc.cpp
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_stereo_proc.cpp
@@ -178,6 +178,10 @@
; FUNCTION CODE
----------------------------------------------------------------------------*/
+#if __has_attribute(no_sanitize)
+// deliberately playing near overflow points of int32
+__attribute__((no_sanitize("integer")))
+#endif
void pvmp3_st_mid_side(int32 xr[SUBBANDS_NUMBER*FILTERBANK_BANDS],
int32 xl[SUBBANDS_NUMBER*FILTERBANK_BANDS],
int32 Start,
diff --git a/media/libstagefright/colorconversion/ColorConverter.cpp b/media/libstagefright/colorconversion/ColorConverter.cpp
index c46a40f..862cc63 100644
--- a/media/libstagefright/colorconversion/ColorConverter.cpp
+++ b/media/libstagefright/colorconversion/ColorConverter.cpp
@@ -20,10 +20,12 @@
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/ALooper.h>
+#include <media/stagefright/foundation/ColorUtils.h>
#include <media/stagefright/ColorConverter.h>
#include <media/stagefright/MediaErrors.h>
#include "libyuv/convert_from.h"
+#include "libyuv/convert_argb.h"
#include "libyuv/video_common.h"
#include <functional>
#include <sys/time.h>
@@ -44,10 +46,28 @@
namespace android {
+static bool isRGB(OMX_COLOR_FORMATTYPE colorFormat) {
+ return colorFormat == OMX_COLOR_Format16bitRGB565
+ || colorFormat == OMX_COLOR_Format32BitRGBA8888
+ || colorFormat == OMX_COLOR_Format32bitBGRA8888;
+}
+
+bool ColorConverter::ColorSpace::isBt709() {
+ return (mStandard == ColorUtils::kColorStandardBT709);
+}
+
+
+bool ColorConverter::ColorSpace::isJpeg() {
+ return ((mStandard == ColorUtils::kColorStandardBT601_625)
+ || (mStandard == ColorUtils::kColorStandardBT601_525))
+ && (mRange == ColorUtils::kColorRangeFull);
+}
+
ColorConverter::ColorConverter(
OMX_COLOR_FORMATTYPE from, OMX_COLOR_FORMATTYPE to)
: mSrcFormat(from),
mDstFormat(to),
+ mSrcColorSpace({0, 0, 0}),
mClip(NULL) {
}
@@ -80,9 +100,18 @@
}
bool ColorConverter::isDstRGB() const {
- return mDstFormat == OMX_COLOR_Format16bitRGB565
- || mDstFormat == OMX_COLOR_Format32BitRGBA8888
- || mDstFormat == OMX_COLOR_Format32bitBGRA8888;
+ return isRGB(mDstFormat);
+}
+
+void ColorConverter::setSrcColorSpace(
+ uint32_t standard, uint32_t range, uint32_t transfer) {
+ if (isRGB(mSrcFormat)) {
+ ALOGW("Can't set color space on RGB source");
+ return;
+ }
+ mSrcColorSpace.mStandard = standard;
+ mSrcColorSpace.mRange = range;
+ mSrcColorSpace.mTransfer = transfer;
}
/*
@@ -281,6 +310,13 @@
return OK;
}
+#define DECLARE_YUV2RGBFUNC(func, rgb) int (*func)( \
+ const uint8*, int, const uint8*, int, \
+ const uint8*, int, uint8*, int, int, int) \
+ = mSrcColorSpace.isBt709() ? libyuv::H420To##rgb \
+ : mSrcColorSpace.isJpeg() ? libyuv::J420To##rgb \
+ : libyuv::I420To##rgb
+
status_t ColorConverter::convertYUV420PlanarUseLibYUV(
const BitmapParams &src, const BitmapParams &dst) {
uint8_t *dst_ptr = (uint8_t *)dst.mBits
@@ -298,19 +334,28 @@
switch (mDstFormat) {
case OMX_COLOR_Format16bitRGB565:
- libyuv::I420ToRGB565(src_y, src.mStride, src_u, src.mStride / 2, src_v, src.mStride / 2,
+ {
+ DECLARE_YUV2RGBFUNC(func, RGB565);
+ (*func)(src_y, src.mStride, src_u, src.mStride / 2, src_v, src.mStride / 2,
(uint8 *)dst_ptr, dst.mStride, src.cropWidth(), src.cropHeight());
break;
+ }
case OMX_COLOR_Format32BitRGBA8888:
- libyuv::ConvertFromI420(src_y, src.mStride, src_u, src.mStride / 2, src_v, src.mStride / 2,
- (uint8 *)dst_ptr, dst.mStride, src.cropWidth(), src.cropHeight(), libyuv::FOURCC_ABGR);
+ {
+ DECLARE_YUV2RGBFUNC(func, ABGR);
+ (*func)(src_y, src.mStride, src_u, src.mStride / 2, src_v, src.mStride / 2,
+ (uint8 *)dst_ptr, dst.mStride, src.cropWidth(), src.cropHeight());
break;
+ }
case OMX_COLOR_Format32bitBGRA8888:
- libyuv::ConvertFromI420(src_y, src.mStride, src_u, src.mStride / 2, src_v, src.mStride / 2,
- (uint8 *)dst_ptr, dst.mStride, src.cropWidth(), src.cropHeight(), libyuv::FOURCC_ARGB);
+ {
+ DECLARE_YUV2RGBFUNC(func, ARGB);
+ (*func)(src_y, src.mStride, src_u, src.mStride / 2, src_v, src.mStride / 2,
+ (uint8 *)dst_ptr, dst.mStride, src.cropWidth(), src.cropHeight());
break;
+ }
default:
return ERROR_UNSUPPORTED;
diff --git a/media/libstagefright/include/media/stagefright/ColorConverter.h b/media/libstagefright/include/media/stagefright/ColorConverter.h
index 2b8c7c8..6d4c1bf 100644
--- a/media/libstagefright/include/media/stagefright/ColorConverter.h
+++ b/media/libstagefright/include/media/stagefright/ColorConverter.h
@@ -35,6 +35,8 @@
bool isDstRGB() const;
+ void setSrcColorSpace(uint32_t standard, uint32_t range, uint32_t transfer);
+
status_t convert(
const void *srcBits,
size_t srcWidth, size_t srcHeight, size_t srcStride,
@@ -46,6 +48,15 @@
size_t dstCropRight, size_t dstCropBottom);
private:
+ struct ColorSpace {
+ uint32_t mStandard;
+ uint32_t mRange;
+ uint32_t mTransfer;
+
+ bool isBt709();
+ bool isJpeg();
+ };
+
struct BitmapParams {
BitmapParams(
void *bits,
@@ -65,6 +76,7 @@
};
OMX_COLOR_FORMATTYPE mSrcFormat, mDstFormat;
+ ColorSpace mSrcColorSpace;
uint8_t *mClip;
uint8_t *initClip();
diff --git a/services/audiopolicy/service/AudioPolicyEffects.cpp b/services/audiopolicy/service/AudioPolicyEffects.cpp
index 2858aad..b3d564a 100644
--- a/services/audiopolicy/service/AudioPolicyEffects.cpp
+++ b/services/audiopolicy/service/AudioPolicyEffects.cpp
@@ -318,6 +318,74 @@
return status;
}
+status_t AudioPolicyEffects::addSourceDefaultEffect(const effect_uuid_t *type,
+ const String16& opPackageName,
+ const effect_uuid_t *uuid,
+ int32_t priority,
+ audio_source_t source,
+ audio_unique_id_t* id)
+{
+ if (uuid == NULL || type == NULL) {
+ ALOGE("addSourceDefaultEffect(): Null uuid or type uuid pointer");
+ return BAD_VALUE;
+ }
+
+ // HOTWORD and FM_TUNER are two special case sources > MAX.
+ if (source < AUDIO_SOURCE_DEFAULT ||
+ (source > AUDIO_SOURCE_MAX &&
+ source != AUDIO_SOURCE_HOTWORD &&
+ source != AUDIO_SOURCE_FM_TUNER)) {
+ ALOGE("addSourceDefaultEffect(): Unsupported source type %d", source);
+ return BAD_VALUE;
+ }
+
+ // Check that |uuid| or |type| corresponds to an effect on the system.
+ effect_descriptor_t descriptor = {};
+ status_t res = AudioEffect::getEffectDescriptor(
+ uuid, type, EFFECT_FLAG_TYPE_PRE_PROC, &descriptor);
+ if (res != OK) {
+ ALOGE("addSourceDefaultEffect(): Failed to find effect descriptor matching uuid/type.");
+ return res;
+ }
+
+ // Only pre-processing effects can be added dynamically as source defaults.
+ if ((descriptor.flags & EFFECT_FLAG_TYPE_MASK) != EFFECT_FLAG_TYPE_PRE_PROC) {
+ ALOGE("addSourceDefaultEffect(): Desired effect cannot be attached "
+ "as a source default effect.");
+ return BAD_VALUE;
+ }
+
+ Mutex::Autolock _l(mLock);
+
+ // Find the EffectDescVector for the given source type, or create a new one if necessary.
+ ssize_t index = mInputSources.indexOfKey(source);
+ EffectDescVector *desc = NULL;
+ if (index < 0) {
+ // No effects for this source type yet.
+ desc = new EffectDescVector();
+ mInputSources.add(source, desc);
+ } else {
+ desc = mInputSources.valueAt(index);
+ }
+
+ // Create a new effect and add it to the vector.
+ res = AudioEffect::newEffectUniqueId(id);
+ if (res != OK) {
+ ALOGE("addSourceDefaultEffect(): failed to get new unique id.");
+ return res;
+ }
+ EffectDesc *effect = new EffectDesc(
+ descriptor.name, *type, opPackageName, *uuid, priority, *id);
+ desc->mEffects.add(effect);
+ // TODO(b/71813697): Support setting params as well.
+
+ // TODO(b/71814300): Retroactively attach to any existing sources of the given type.
+ // This requires tracking the source type of each session id in addition to what is
+ // already being tracked.
+
+ return NO_ERROR;
+}
+
status_t AudioPolicyEffects::addStreamDefaultEffect(const effect_uuid_t *type,
const String16& opPackageName,
const effect_uuid_t *uuid,
@@ -384,6 +452,37 @@
return NO_ERROR;
}
+status_t AudioPolicyEffects::removeSourceDefaultEffect(audio_unique_id_t id)
+{
+ if (id == AUDIO_UNIQUE_ID_ALLOCATE) {
+ // ALLOCATE is not a unique identifier, but rather a reserved value indicating
+ // a real id has not been assigned. For default effects, this value is only used
+ // by system-owned defaults from the loaded config, which cannot be removed.
+ return BAD_VALUE;
+ }
+
+ Mutex::Autolock _l(mLock);
+
+ // Check each source type.
+ size_t numSources = mInputSources.size();
+ for (size_t i = 0; i < numSources; ++i) {
+ // Check each effect for each source.
+ EffectDescVector* descVector = mInputSources[i];
+ for (auto desc = descVector->mEffects.begin(); desc != descVector->mEffects.end(); ++desc) {
+ if ((*desc)->mId == id) {
+ // Found it!
+ // TODO(b/71814300): Remove from any sources the effect was attached to.
+ descVector->mEffects.erase(desc);
+ // Handles are unique; there can only be one match, so return early.
+ return NO_ERROR;
+ }
+ }
+ }
+
+ // Effect wasn't found, so it's been trivially removed successfully.
+ return NO_ERROR;
+}
+
status_t AudioPolicyEffects::removeStreamDefaultEffect(audio_unique_id_t id)
{
if (id == AUDIO_UNIQUE_ID_ALLOCATE) {
diff --git a/services/audiopolicy/service/AudioPolicyEffects.h b/services/audiopolicy/service/AudioPolicyEffects.h
index 69367b1..6ad01f7 100644
--- a/services/audiopolicy/service/AudioPolicyEffects.h
+++ b/services/audiopolicy/service/AudioPolicyEffects.h
@@ -81,7 +81,15 @@
audio_stream_type_t stream,
audio_session_t audioSession);
- // Add the effect to the list of default effects for streams of type |stream|.
+ // Add the effect to the list of default effects for sources of type |source|.
+ status_t addSourceDefaultEffect(const effect_uuid_t *type,
+ const String16& opPackageName,
+ const effect_uuid_t *uuid,
+ int32_t priority,
+ audio_source_t source,
+ audio_unique_id_t* id);
+
+ // Add the effect to the list of default effects for streams of a given usage.
status_t addStreamDefaultEffect(const effect_uuid_t *type,
const String16& opPackageName,
const effect_uuid_t *uuid,
@@ -89,6 +97,9 @@
audio_usage_t usage,
audio_unique_id_t* id);
+ // Remove the default source effect from wherever it's attached.
+ status_t removeSourceDefaultEffect(audio_unique_id_t id);
+
// Remove the default stream effect from wherever it's attached.
status_t removeStreamDefaultEffect(audio_unique_id_t id);
diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
index 3439c9b..02ab07f 100644
--- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
+++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
@@ -829,27 +829,55 @@
return mAudioPolicyManager->isSourceActive(source);
}
-status_t AudioPolicyService::queryDefaultPreProcessing(audio_session_t audioSession,
- effect_descriptor_t *descriptors,
- uint32_t *count)
+status_t AudioPolicyService::getAudioPolicyEffects(sp<AudioPolicyEffects>& audioPolicyEffects)
{
if (mAudioPolicyManager == NULL) {
- *count = 0;
return NO_INIT;
}
- sp<AudioPolicyEffects>audioPolicyEffects;
{
Mutex::Autolock _l(mLock);
audioPolicyEffects = mAudioPolicyEffects;
}
if (audioPolicyEffects == 0) {
- *count = 0;
return NO_INIT;
}
+
+ return OK;
+}
+
+status_t AudioPolicyService::queryDefaultPreProcessing(audio_session_t audioSession,
+ effect_descriptor_t *descriptors,
+ uint32_t *count)
+{
+ sp<AudioPolicyEffects>audioPolicyEffects;
+ status_t status = getAudioPolicyEffects(audioPolicyEffects);
+ if (status != OK) {
+ *count = 0;
+ return status;
+ }
return audioPolicyEffects->queryDefaultInputEffects(
(audio_session_t)audioSession, descriptors, count);
}
+status_t AudioPolicyService::addSourceDefaultEffect(const effect_uuid_t *type,
+ const String16& opPackageName,
+ const effect_uuid_t *uuid,
+ int32_t priority,
+ audio_source_t source,
+ audio_unique_id_t* id)
+{
+ sp<AudioPolicyEffects>audioPolicyEffects;
+ status_t status = getAudioPolicyEffects(audioPolicyEffects);
+ if (status != OK) {
+ return status;
+ }
+ if (!modifyDefaultAudioEffectsAllowed()) {
+ return PERMISSION_DENIED;
+ }
+ return audioPolicyEffects->addSourceDefaultEffect(
+ type, opPackageName, uuid, priority, source, id);
+}
+
status_t AudioPolicyService::addStreamDefaultEffect(const effect_uuid_t *type,
const String16& opPackageName,
const effect_uuid_t *uuid,
@@ -857,39 +885,40 @@
audio_usage_t usage,
audio_unique_id_t* id)
{
- if (mAudioPolicyManager == NULL) {
- return NO_INIT;
+ sp<AudioPolicyEffects>audioPolicyEffects;
+ status_t status = getAudioPolicyEffects(audioPolicyEffects);
+ if (status != OK) {
+ return status;
}
if (!modifyDefaultAudioEffectsAllowed()) {
return PERMISSION_DENIED;
}
- sp<AudioPolicyEffects>audioPolicyEffects;
- {
- Mutex::Autolock _l(mLock);
- audioPolicyEffects = mAudioPolicyEffects;
- }
- if (audioPolicyEffects == 0) {
- return NO_INIT;
- }
return audioPolicyEffects->addStreamDefaultEffect(
type, opPackageName, uuid, priority, usage, id);
}
-status_t AudioPolicyService::removeStreamDefaultEffect(audio_unique_id_t id)
+status_t AudioPolicyService::removeSourceDefaultEffect(audio_unique_id_t id)
{
- if (mAudioPolicyManager == NULL) {
- return NO_INIT;
+ sp<AudioPolicyEffects>audioPolicyEffects;
+ status_t status = getAudioPolicyEffects(audioPolicyEffects);
+ if (status != OK) {
+ return status;
}
if (!modifyDefaultAudioEffectsAllowed()) {
return PERMISSION_DENIED;
}
+ return audioPolicyEffects->removeSourceDefaultEffect(id);
+}
+
+status_t AudioPolicyService::removeStreamDefaultEffect(audio_unique_id_t id)
+{
sp<AudioPolicyEffects>audioPolicyEffects;
- {
- Mutex::Autolock _l(mLock);
- audioPolicyEffects = mAudioPolicyEffects;
+ status_t status = getAudioPolicyEffects(audioPolicyEffects);
+ if (status != OK) {
+ return status;
}
- if (audioPolicyEffects == 0) {
- return NO_INIT;
+ if (!modifyDefaultAudioEffectsAllowed()) {
+ return PERMISSION_DENIED;
}
return audioPolicyEffects->removeStreamDefaultEffect(id);
}
diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h
index 44c0347..6c55647 100644
--- a/services/audiopolicy/service/AudioPolicyService.h
+++ b/services/audiopolicy/service/AudioPolicyService.h
@@ -126,12 +126,19 @@
virtual status_t queryDefaultPreProcessing(audio_session_t audioSession,
effect_descriptor_t *descriptors,
uint32_t *count);
+ virtual status_t addSourceDefaultEffect(const effect_uuid_t *type,
+ const String16& opPackageName,
+ const effect_uuid_t *uuid,
+ int32_t priority,
+ audio_source_t source,
+ audio_unique_id_t* id);
virtual status_t addStreamDefaultEffect(const effect_uuid_t *type,
const String16& opPackageName,
const effect_uuid_t *uuid,
int32_t priority,
audio_usage_t usage,
audio_unique_id_t* id);
+ virtual status_t removeSourceDefaultEffect(audio_unique_id_t id);
virtual status_t removeStreamDefaultEffect(audio_unique_id_t id);
virtual status_t onTransact(
@@ -259,6 +266,8 @@
std::string getDeviceTypeStrForPortId(audio_port_handle_t portId);
+ status_t getAudioPolicyEffects(sp<AudioPolicyEffects>& audioPolicyEffects);
+
// If recording we need to make sure the UID is allowed to do that. If the UID is idle
// then it cannot record and gets buffers with zeros - silence. As soon as the UID
// transitions to an active state we will start reporting buffers with data. This approach
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
index b85dd51..f9240db 100644
--- a/services/camera/libcameraservice/CameraService.cpp
+++ b/services/camera/libcameraservice/CameraService.cpp
@@ -2429,7 +2429,8 @@
return isUidActiveLocked(uid, callingPackage);
}
-static const int kPollUidActiveTimeoutMillis = 50;
+static const int64_t kPollUidActiveTimeoutTotalMillis = 300;
+static const int64_t kPollUidActiveTimeoutMillis = 50;
bool CameraService::UidPolicy::isUidActiveLocked(uid_t uid, String16 callingPackage) {
// Non-app UIDs are considered always active
@@ -2457,7 +2458,8 @@
// activity being resumed. The proper fix is very risky, so we temporary add
// some polling which should happen pretty rarely anyway as the race is hard
// to hit.
- active = am.isUidActive(uid, callingPackage);
+ active = mActiveUids.find(uid) != mActiveUids.end();
+ if (!active) active = am.isUidActive(uid, callingPackage);
if (active) {
break;
}
@@ -2465,11 +2467,15 @@
startTimeMillis = uptimeMillis();
}
int64_t ellapsedTimeMillis = uptimeMillis() - startTimeMillis;
- int64_t remainingTimeMillis = kPollUidActiveTimeoutMillis - ellapsedTimeMillis;
+ int64_t remainingTimeMillis = kPollUidActiveTimeoutTotalMillis - ellapsedTimeMillis;
if (remainingTimeMillis <= 0) {
break;
}
+ remainingTimeMillis = std::min(kPollUidActiveTimeoutMillis, remainingTimeMillis);
+
+ mUidLock.unlock();
usleep(remainingTimeMillis * 1000);
+ mUidLock.lock();
} while (true);
if (active) {