Loading camera/CameraMetadata.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -528,6 +528,8 @@ status_t CameraMetadata::resizeIfNeeded(size_t extraEntries, size_t extraData) { mBuffer = allocate_camera_metadata(newEntryCount, newDataCount); if (mBuffer == NULL) { // Maintain old buffer to avoid potential memory leak. mBuffer = oldBuffer; ALOGE("%s: Can't allocate larger metadata buffer", __FUNCTION__); return NO_MEMORY; } Loading media/codec2/sfplugin/CCodecBufferChannel.cpp +41 −37 Original line number Diff line number Diff line Loading @@ -1647,7 +1647,8 @@ bool CCodecBufferChannel::handleWork( } } std::optional<uint32_t> newInputDelay, newPipelineDelay; std::optional<uint32_t> newInputDelay, newPipelineDelay, newOutputDelay, newReorderDepth; std::optional<C2Config::ordinal_key_t> newReorderKey; bool needMaxDequeueBufferCountUpdate = false; while (!worklet->output.configUpdate.empty()) { std::unique_ptr<C2Param> param; Loading @@ -1659,7 +1660,7 @@ bool CCodecBufferChannel::handleWork( if (reorderDepth.updateFrom(*param)) { ALOGV("[%s] onWorkDone: updated reorder depth to %u", mName, reorderDepth.value); mOutput.lock()->buffers->setReorderDepth(reorderDepth.value); newReorderDepth = reorderDepth.value; needMaxDequeueBufferCountUpdate = true; } else { ALOGD("[%s] onWorkDone: failed to read reorder depth", Loading @@ -1670,7 +1671,7 @@ bool CCodecBufferChannel::handleWork( case C2PortReorderKeySetting::CORE_INDEX: { C2PortReorderKeySetting::output reorderKey; if (reorderKey.updateFrom(*param)) { mOutput.lock()->buffers->setReorderKey(reorderKey.value); newReorderKey = reorderKey.value; ALOGV("[%s] onWorkDone: updated reorder key to %u", mName, reorderKey.value); } else { Loading Loading @@ -1705,35 +1706,9 @@ bool CCodecBufferChannel::handleWork( ALOGV("[%s] onWorkDone: updating output delay %u", mName, outputDelay.value); (void)mPipelineWatcher.lock()->outputDelay(outputDelay.value); newOutputDelay = outputDelay.value; needMaxDequeueBufferCountUpdate = true; bool outputBuffersChanged = false; size_t numOutputSlots = 0; { Mutexed<Output>::Locked output(mOutput); if (!output->buffers) { return false; } output->outputDelay = outputDelay.value; numOutputSlots = outputDelay.value + kSmoothnessFactor; if (output->numSlots < numOutputSlots) { output->numSlots = numOutputSlots; if (output->buffers->isArrayMode()) { OutputBuffersArray *array = (OutputBuffersArray *)output->buffers.get(); ALOGV("[%s] onWorkDone: growing output buffer array to %zu", mName, numOutputSlots); array->grow(numOutputSlots); outputBuffersChanged = true; } } numOutputSlots = output->numSlots; } if (outputBuffersChanged) { mCCodecCallback->onOutputBuffersChanged(); } } } break; Loading Loading @@ -1773,15 +1748,44 @@ bool CCodecBufferChannel::handleWork( input->numSlots = newNumSlots; } } if (needMaxDequeueBufferCountUpdate) { size_t numOutputSlots = 0; uint32_t reorderDepth = 0; int maxDequeueCount = 0; { bool outputBuffersChanged = false; if (newReorderKey || newReorderDepth || needMaxDequeueBufferCountUpdate) { Mutexed<Output>::Locked output(mOutput); if (!output->buffers) { return false; } numOutputSlots = output->numSlots; if (newReorderKey) { output->buffers->setReorderKey(newReorderKey.value()); } if (newReorderDepth) { output->buffers->setReorderDepth(newReorderDepth.value()); } reorderDepth = output->buffers->getReorderDepth(); if (newOutputDelay) { output->outputDelay = newOutputDelay.value(); numOutputSlots = newOutputDelay.value() + kSmoothnessFactor; if (output->numSlots < numOutputSlots) { output->numSlots = numOutputSlots; if (output->buffers->isArrayMode()) { OutputBuffersArray *array = (OutputBuffersArray *)output->buffers.get(); ALOGV("[%s] onWorkDone: growing output buffer array to %zu", mName, numOutputSlots); array->grow(numOutputSlots); outputBuffersChanged = true; } } } numOutputSlots = output->numSlots; reorderDepth = output->buffers ? output->buffers->getReorderDepth() : 0; } if (outputBuffersChanged) { mCCodecCallback->onOutputBuffersChanged(); } if (needMaxDequeueBufferCountUpdate) { int maxDequeueCount = 0; { Mutexed<OutputSurface>::Locked output(mOutputSurface); maxDequeueCount = output->maxDequeueBuffers = Loading media/libaaudio/src/client/AudioStreamInternalCapture.cpp +5 −21 Original line number Diff line number Diff line Loading @@ -18,7 +18,7 @@ #include <utils/Log.h> #include <algorithm> #include <audio_utils/primitives.h> #include <audio_utils/format.h> #include <aaudio/AAudio.h> #include <media/MediaMetricsItem.h> Loading Loading @@ -190,26 +190,10 @@ aaudio_result_t AudioStreamInternalCapture::readNowWithConversion(void *buffer, const audio_format_t sourceFormat = getDeviceFormat(); const audio_format_t destinationFormat = getFormat(); // TODO factor this out into a utility function if (sourceFormat == destinationFormat) { memcpy(destination, wrappingBuffer.data[partIndex], numBytes); } else if (sourceFormat == AUDIO_FORMAT_PCM_16_BIT && destinationFormat == AUDIO_FORMAT_PCM_FLOAT) { memcpy_to_float_from_i16( (float *) destination, (const int16_t *) wrappingBuffer.data[partIndex], numSamples); } else if (sourceFormat == AUDIO_FORMAT_PCM_FLOAT && destinationFormat == AUDIO_FORMAT_PCM_16_BIT) { memcpy_to_i16_from_float( (int16_t *) destination, (const float *) wrappingBuffer.data[partIndex], numSamples); } else { ALOGE("%s() - Format conversion not supported! audio_format_t source = %u, dest = %u", __func__, sourceFormat, destinationFormat); return AAUDIO_ERROR_INVALID_FORMAT; } memcpy_by_audio_format(destination, destinationFormat, wrappingBuffer.data[partIndex], sourceFormat, numSamples); destination += numBytes; framesLeft -= framesToProcess; } Loading media/libmedia/MediaProfiles.cpp +73 −40 Original line number Diff line number Diff line Loading @@ -169,6 +169,7 @@ MediaProfiles::logVideoCodec(const MediaProfiles::VideoCodec& codec UNUSED) ALOGV("frame width: %d", codec.mFrameWidth); ALOGV("frame height: %d", codec.mFrameHeight); ALOGV("frame rate: %d", codec.mFrameRate); ALOGV("profile: %d", codec.mProfile); } /*static*/ void Loading @@ -179,6 +180,7 @@ MediaProfiles::logAudioCodec(const MediaProfiles::AudioCodec& codec UNUSED) ALOGV("bit rate: %d", codec.mBitRate); ALOGV("sample rate: %d", codec.mSampleRate); ALOGV("number of channels: %d", codec.mChannels); ALOGV("profile: %d", codec.mProfile); } /*static*/ void Loading Loading @@ -231,9 +233,10 @@ MediaProfiles::findTagForName(const MediaProfiles::NameToTagMap *map, size_t nMa } /*static*/ void MediaProfiles::createVideoCodec(const char **atts, MediaProfiles *profiles) MediaProfiles::createVideoCodec(const char **atts, size_t natts, MediaProfiles *profiles) { CHECK(!strcmp("codec", atts[0]) && CHECK(natts >= 10 && !strcmp("codec", atts[0]) && !strcmp("bitRate", atts[2]) && !strcmp("width", atts[4]) && !strcmp("height", atts[6]) && Loading @@ -246,9 +249,14 @@ MediaProfiles::createVideoCodec(const char **atts, MediaProfiles *profiles) return; } int profile = -1; if (natts >= 12 && !strcmp("profile", atts[10])) { profile = atoi(atts[11]); } VideoCodec videoCodec { static_cast<video_encoder>(codec), atoi(atts[3]), atoi(atts[5]), atoi(atts[7]), atoi(atts[9]) }; atoi(atts[3]), atoi(atts[5]), atoi(atts[7]), atoi(atts[9]), profile }; logVideoCodec(videoCodec); size_t nCamcorderProfiles; Loading @@ -257,9 +265,10 @@ MediaProfiles::createVideoCodec(const char **atts, MediaProfiles *profiles) } /*static*/ void MediaProfiles::createAudioCodec(const char **atts, MediaProfiles *profiles) MediaProfiles::createAudioCodec(const char **atts, size_t natts, MediaProfiles *profiles) { CHECK(!strcmp("codec", atts[0]) && CHECK(natts >= 8 && !strcmp("codec", atts[0]) && !strcmp("bitRate", atts[2]) && !strcmp("sampleRate", atts[4]) && !strcmp("channels", atts[6])); Loading @@ -270,9 +279,14 @@ MediaProfiles::createAudioCodec(const char **atts, MediaProfiles *profiles) return; } int profile = -1; if (natts >= 10 && !strcmp("profile", atts[8])) { profile = atoi(atts[9]); } AudioCodec audioCodec{ static_cast<audio_encoder>(codec), atoi(atts[3]), atoi(atts[5]), atoi(atts[7]) }; atoi(atts[3]), atoi(atts[5]), atoi(atts[7]), profile }; logAudioCodec(audioCodec); size_t nCamcorderProfiles; Loading @@ -281,9 +295,10 @@ MediaProfiles::createAudioCodec(const char **atts, MediaProfiles *profiles) } /*static*/ MediaProfiles::AudioDecoderCap* MediaProfiles::createAudioDecoderCap(const char **atts) MediaProfiles::createAudioDecoderCap(const char **atts, size_t natts) { CHECK(!strcmp("name", atts[0]) && CHECK(natts >= 4 && !strcmp("name", atts[0]) && !strcmp("enabled", atts[2])); const size_t nMappings = sizeof(sAudioDecoderNameMap)/sizeof(sAudioDecoderNameMap[0]); Loading @@ -300,9 +315,10 @@ MediaProfiles::createAudioDecoderCap(const char **atts) } /*static*/ MediaProfiles::VideoDecoderCap* MediaProfiles::createVideoDecoderCap(const char **atts) MediaProfiles::createVideoDecoderCap(const char **atts, size_t natts) { CHECK(!strcmp("name", atts[0]) && CHECK(natts >= 4 && !strcmp("name", atts[0]) && !strcmp("enabled", atts[2])); const size_t nMappings = sizeof(sVideoDecoderNameMap)/sizeof(sVideoDecoderNameMap[0]); Loading @@ -319,9 +335,10 @@ MediaProfiles::createVideoDecoderCap(const char **atts) } /*static*/ MediaProfiles::VideoEncoderCap* MediaProfiles::createVideoEncoderCap(const char **atts) MediaProfiles::createVideoEncoderCap(const char **atts, size_t natts) { CHECK(!strcmp("name", atts[0]) && CHECK(natts >= 20 && !strcmp("name", atts[0]) && !strcmp("enabled", atts[2]) && !strcmp("minBitRate", atts[4]) && !strcmp("maxBitRate", atts[6]) && Loading @@ -348,9 +365,10 @@ MediaProfiles::createVideoEncoderCap(const char **atts) } /*static*/ MediaProfiles::AudioEncoderCap* MediaProfiles::createAudioEncoderCap(const char **atts) MediaProfiles::createAudioEncoderCap(const char **atts, size_t natts) { CHECK(!strcmp("name", atts[0]) && CHECK(natts >= 16 && !strcmp("name", atts[0]) && !strcmp("enabled", atts[2]) && !strcmp("minBitRate", atts[4]) && !strcmp("maxBitRate", atts[6]) && Loading @@ -374,9 +392,10 @@ MediaProfiles::createAudioEncoderCap(const char **atts) } /*static*/ output_format MediaProfiles::createEncoderOutputFileFormat(const char **atts) MediaProfiles::createEncoderOutputFileFormat(const char **atts, size_t natts) { CHECK(!strcmp("name", atts[0])); CHECK(natts >= 2 && !strcmp("name", atts[0])); const size_t nMappings =sizeof(sFileFormatMap)/sizeof(sFileFormatMap[0]); const int format = findTagForName(sFileFormatMap, nMappings, atts[1]); Loading @@ -395,9 +414,11 @@ static bool isCameraIdFound(int cameraId, const Vector<int>& cameraIds) { } /*static*/ MediaProfiles::CamcorderProfile* MediaProfiles::createCamcorderProfile(int cameraId, const char **atts, Vector<int>& cameraIds) MediaProfiles::createCamcorderProfile( int cameraId, const char **atts, size_t natts, Vector<int>& cameraIds) { CHECK(!strcmp("quality", atts[0]) && CHECK(natts >= 6 && !strcmp("quality", atts[0]) && !strcmp("fileFormat", atts[2]) && !strcmp("duration", atts[4])); Loading Loading @@ -440,9 +461,10 @@ MediaProfiles::findImageEncodingQualityLevels(int cameraId) const return NULL; } void MediaProfiles::addImageEncodingQualityLevel(int cameraId, const char** atts) void MediaProfiles::addImageEncodingQualityLevel(int cameraId, const char** atts, size_t natts) { CHECK(!strcmp("quality", atts[0])); CHECK(natts >= 2 && !strcmp("quality", atts[0])); int quality = atoi(atts[1]); ALOGV("%s: cameraId=%d, quality=%d", __func__, cameraId, quality); ImageEncodingQualityLevels *levels = findImageEncodingQualityLevels(cameraId); Loading @@ -457,18 +479,19 @@ void MediaProfiles::addImageEncodingQualityLevel(int cameraId, const char** atts } /*static*/ int MediaProfiles::getCameraId(const char** atts) MediaProfiles::getCameraId(const char** atts, size_t natts) { if (!atts[0]) return 0; // default cameraId = 0 CHECK(!strcmp("cameraId", atts[0])); CHECK(natts >= 2 && !strcmp("cameraId", atts[0])); return atoi(atts[1]); } void MediaProfiles::addStartTimeOffset(int cameraId, const char** atts) void MediaProfiles::addStartTimeOffset(int cameraId, const char** atts, size_t natts) { int offsetTimeMs = 1000; if (atts[2]) { CHECK(!strcmp("startOffsetMs", atts[2])); if (natts >= 3 && atts[2]) { CHECK(natts >= 4 && !strcmp("startOffsetMs", atts[2])); offsetTimeMs = atoi(atts[3]); } Loading @@ -479,48 +502,58 @@ void MediaProfiles::addStartTimeOffset(int cameraId, const char** atts) /*static*/ void MediaProfiles::startElementHandler(void *userData, const char *name, const char **atts) { // determine number of attributes size_t natts = 0; while (atts[natts]) { ++natts; } MediaProfiles *profiles = (MediaProfiles *)userData; if (strcmp("Video", name) == 0) { createVideoCodec(atts, profiles); createVideoCodec(atts, natts, profiles); } else if (strcmp("Audio", name) == 0) { createAudioCodec(atts, profiles); createAudioCodec(atts, natts, profiles); } else if (strcmp("VideoEncoderCap", name) == 0 && natts >= 4 && strcmp("true", atts[3]) == 0) { MediaProfiles::VideoEncoderCap* cap = createVideoEncoderCap(atts); MediaProfiles::VideoEncoderCap* cap = createVideoEncoderCap(atts, natts); if (cap != nullptr) { profiles->mVideoEncoders.add(cap); } } else if (strcmp("AudioEncoderCap", name) == 0 && natts >= 4 && strcmp("true", atts[3]) == 0) { MediaProfiles::AudioEncoderCap* cap = createAudioEncoderCap(atts); MediaProfiles::AudioEncoderCap* cap = createAudioEncoderCap(atts, natts); if (cap != nullptr) { profiles->mAudioEncoders.add(cap); } } else if (strcmp("VideoDecoderCap", name) == 0 && natts >= 4 && strcmp("true", atts[3]) == 0) { MediaProfiles::VideoDecoderCap* cap = createVideoDecoderCap(atts); MediaProfiles::VideoDecoderCap* cap = createVideoDecoderCap(atts, natts); if (cap != nullptr) { profiles->mVideoDecoders.add(cap); } } else if (strcmp("AudioDecoderCap", name) == 0 && natts >= 4 && strcmp("true", atts[3]) == 0) { MediaProfiles::AudioDecoderCap* cap = createAudioDecoderCap(atts); MediaProfiles::AudioDecoderCap* cap = createAudioDecoderCap(atts, natts); if (cap != nullptr) { profiles->mAudioDecoders.add(cap); } } else if (strcmp("EncoderOutputFileFormat", name) == 0) { profiles->mEncoderOutputFileFormats.add(createEncoderOutputFileFormat(atts)); profiles->mEncoderOutputFileFormats.add(createEncoderOutputFileFormat(atts, natts)); } else if (strcmp("CamcorderProfiles", name) == 0) { profiles->mCurrentCameraId = getCameraId(atts); profiles->addStartTimeOffset(profiles->mCurrentCameraId, atts); profiles->mCurrentCameraId = getCameraId(atts, natts); profiles->addStartTimeOffset(profiles->mCurrentCameraId, atts, natts); } else if (strcmp("EncoderProfile", name) == 0) { MediaProfiles::CamcorderProfile* profile = createCamcorderProfile( profiles->mCurrentCameraId, atts, profiles->mCameraIds); profiles->mCurrentCameraId, atts, natts, profiles->mCameraIds); if (profile != nullptr) { profiles->mCamcorderProfiles.add(profile); } } else if (strcmp("ImageEncoding", name) == 0) { profiles->addImageEncodingQualityLevel(profiles->mCurrentCameraId, atts); profiles->addImageEncodingQualityLevel(profiles->mCurrentCameraId, atts, natts); } } Loading Loading @@ -575,12 +608,12 @@ void MediaProfiles::checkAndAddRequiredProfilesIfNecessary() { for (size_t i = 0, n = mCamcorderProfiles.size(); i < n; ++i) { // ensure at least one video and audio profile is added if (mCamcorderProfiles[i]->mVideoCodecs.size() == 0) { if (mCamcorderProfiles[i]->mVideoCodecs.empty()) { mCamcorderProfiles[i]->mVideoCodecs.emplace_back( VIDEO_ENCODER_H263, 192000 /* bitrate */, 176 /* width */, 144 /* height */, 20 /* frameRate */); } if (mCamcorderProfiles[i]->mAudioCodecs.size() == 0) { if (mCamcorderProfiles[i]->mAudioCodecs.empty()) { mCamcorderProfiles[i]->mAudioCodecs.emplace_back( AUDIO_ENCODER_AMR_NB, 12200 /* bitrate */, 8000 /* sampleRate */, 1 /* channels */); Loading media/libmedia/include/media/MediaProfiles.h +32 −15 Original line number Diff line number Diff line Loading @@ -114,13 +114,16 @@ public: * @param frameWidth frame width in pixels * @param frameHeight frame height in pixels * @param frameRate frame rate in fps * @param profile codec profile (for MediaCodec) or -1 for none */ VideoCodec(video_encoder codec, int bitrate, int frameWidth, int frameHeight, int frameRate) VideoCodec(video_encoder codec, int bitrate, int frameWidth, int frameHeight, int frameRate, int profile = -1) : mCodec(codec), mBitRate(bitrate), mFrameWidth(frameWidth), mFrameHeight(frameHeight), mFrameRate(frameRate) { mFrameRate(frameRate), mProfile(profile) { } VideoCodec(const VideoCodec&) = default; Loading Loading @@ -152,12 +155,18 @@ public: return mFrameRate; } /** Returns the codec profile (or -1 for no profile). */ int getProfile() const { return mProfile; } private: video_encoder mCodec; int mBitRate; int mFrameWidth; int mFrameHeight; int mFrameRate; int mProfile; friend class MediaProfiles; }; Loading @@ -173,12 +182,14 @@ public: * @param bitrate bitrate in bps * @param sampleRate sample rate in Hz * @param channels number of channels * @param profile codec profile (for MediaCodec) or -1 for none */ AudioCodec(audio_encoder codec, int bitrate, int sampleRate, int channels) AudioCodec(audio_encoder codec, int bitrate, int sampleRate, int channels, int profile = -1) : mCodec(codec), mBitRate(bitrate), mSampleRate(sampleRate), mChannels(channels) { mChannels(channels), mProfile(profile) { } AudioCodec(const AudioCodec&) = default; Loading @@ -205,11 +216,17 @@ public: return mChannels; } /** Returns the codec profile (or -1 for no profile). */ int getProfile() const { return mProfile; } private: audio_encoder mCodec; int mBitRate; int mSampleRate; int mChannels; int mProfile; friend class MediaProfiles; }; Loading Loading @@ -458,23 +475,23 @@ private: // If the xml configuration file does exist, use the settings // from the xml static MediaProfiles* createInstanceFromXmlFile(const char *xml); static output_format createEncoderOutputFileFormat(const char **atts); static void createVideoCodec(const char **atts, MediaProfiles *profiles); static void createAudioCodec(const char **atts, MediaProfiles *profiles); static AudioDecoderCap* createAudioDecoderCap(const char **atts); static VideoDecoderCap* createVideoDecoderCap(const char **atts); static VideoEncoderCap* createVideoEncoderCap(const char **atts); static AudioEncoderCap* createAudioEncoderCap(const char **atts); static output_format createEncoderOutputFileFormat(const char **atts, size_t natts); static void createVideoCodec(const char **atts, size_t natts, MediaProfiles *profiles); static void createAudioCodec(const char **atts, size_t natts, MediaProfiles *profiles); static AudioDecoderCap* createAudioDecoderCap(const char **atts, size_t natts); static VideoDecoderCap* createVideoDecoderCap(const char **atts, size_t natts); static VideoEncoderCap* createVideoEncoderCap(const char **atts, size_t natts); static AudioEncoderCap* createAudioEncoderCap(const char **atts, size_t natts); static CamcorderProfile* createCamcorderProfile( int cameraId, const char **atts, Vector<int>& cameraIds); int cameraId, const char **atts, size_t natts, Vector<int>& cameraIds); static int getCameraId(const char **atts); static int getCameraId(const char **atts, size_t natts); void addStartTimeOffset(int cameraId, const char **atts); void addStartTimeOffset(int cameraId, const char **atts, size_t natts); ImageEncodingQualityLevels* findImageEncodingQualityLevels(int cameraId) const; void addImageEncodingQualityLevel(int cameraId, const char** atts); void addImageEncodingQualityLevel(int cameraId, const char** atts, size_t natts); // Customized element tag handler for parsing the xml configuration file. static void startElementHandler(void *userData, const char *name, const char **atts); Loading Loading
camera/CameraMetadata.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -528,6 +528,8 @@ status_t CameraMetadata::resizeIfNeeded(size_t extraEntries, size_t extraData) { mBuffer = allocate_camera_metadata(newEntryCount, newDataCount); if (mBuffer == NULL) { // Maintain old buffer to avoid potential memory leak. mBuffer = oldBuffer; ALOGE("%s: Can't allocate larger metadata buffer", __FUNCTION__); return NO_MEMORY; } Loading
media/codec2/sfplugin/CCodecBufferChannel.cpp +41 −37 Original line number Diff line number Diff line Loading @@ -1647,7 +1647,8 @@ bool CCodecBufferChannel::handleWork( } } std::optional<uint32_t> newInputDelay, newPipelineDelay; std::optional<uint32_t> newInputDelay, newPipelineDelay, newOutputDelay, newReorderDepth; std::optional<C2Config::ordinal_key_t> newReorderKey; bool needMaxDequeueBufferCountUpdate = false; while (!worklet->output.configUpdate.empty()) { std::unique_ptr<C2Param> param; Loading @@ -1659,7 +1660,7 @@ bool CCodecBufferChannel::handleWork( if (reorderDepth.updateFrom(*param)) { ALOGV("[%s] onWorkDone: updated reorder depth to %u", mName, reorderDepth.value); mOutput.lock()->buffers->setReorderDepth(reorderDepth.value); newReorderDepth = reorderDepth.value; needMaxDequeueBufferCountUpdate = true; } else { ALOGD("[%s] onWorkDone: failed to read reorder depth", Loading @@ -1670,7 +1671,7 @@ bool CCodecBufferChannel::handleWork( case C2PortReorderKeySetting::CORE_INDEX: { C2PortReorderKeySetting::output reorderKey; if (reorderKey.updateFrom(*param)) { mOutput.lock()->buffers->setReorderKey(reorderKey.value); newReorderKey = reorderKey.value; ALOGV("[%s] onWorkDone: updated reorder key to %u", mName, reorderKey.value); } else { Loading Loading @@ -1705,35 +1706,9 @@ bool CCodecBufferChannel::handleWork( ALOGV("[%s] onWorkDone: updating output delay %u", mName, outputDelay.value); (void)mPipelineWatcher.lock()->outputDelay(outputDelay.value); newOutputDelay = outputDelay.value; needMaxDequeueBufferCountUpdate = true; bool outputBuffersChanged = false; size_t numOutputSlots = 0; { Mutexed<Output>::Locked output(mOutput); if (!output->buffers) { return false; } output->outputDelay = outputDelay.value; numOutputSlots = outputDelay.value + kSmoothnessFactor; if (output->numSlots < numOutputSlots) { output->numSlots = numOutputSlots; if (output->buffers->isArrayMode()) { OutputBuffersArray *array = (OutputBuffersArray *)output->buffers.get(); ALOGV("[%s] onWorkDone: growing output buffer array to %zu", mName, numOutputSlots); array->grow(numOutputSlots); outputBuffersChanged = true; } } numOutputSlots = output->numSlots; } if (outputBuffersChanged) { mCCodecCallback->onOutputBuffersChanged(); } } } break; Loading Loading @@ -1773,15 +1748,44 @@ bool CCodecBufferChannel::handleWork( input->numSlots = newNumSlots; } } if (needMaxDequeueBufferCountUpdate) { size_t numOutputSlots = 0; uint32_t reorderDepth = 0; int maxDequeueCount = 0; { bool outputBuffersChanged = false; if (newReorderKey || newReorderDepth || needMaxDequeueBufferCountUpdate) { Mutexed<Output>::Locked output(mOutput); if (!output->buffers) { return false; } numOutputSlots = output->numSlots; if (newReorderKey) { output->buffers->setReorderKey(newReorderKey.value()); } if (newReorderDepth) { output->buffers->setReorderDepth(newReorderDepth.value()); } reorderDepth = output->buffers->getReorderDepth(); if (newOutputDelay) { output->outputDelay = newOutputDelay.value(); numOutputSlots = newOutputDelay.value() + kSmoothnessFactor; if (output->numSlots < numOutputSlots) { output->numSlots = numOutputSlots; if (output->buffers->isArrayMode()) { OutputBuffersArray *array = (OutputBuffersArray *)output->buffers.get(); ALOGV("[%s] onWorkDone: growing output buffer array to %zu", mName, numOutputSlots); array->grow(numOutputSlots); outputBuffersChanged = true; } } } numOutputSlots = output->numSlots; reorderDepth = output->buffers ? output->buffers->getReorderDepth() : 0; } if (outputBuffersChanged) { mCCodecCallback->onOutputBuffersChanged(); } if (needMaxDequeueBufferCountUpdate) { int maxDequeueCount = 0; { Mutexed<OutputSurface>::Locked output(mOutputSurface); maxDequeueCount = output->maxDequeueBuffers = Loading
media/libaaudio/src/client/AudioStreamInternalCapture.cpp +5 −21 Original line number Diff line number Diff line Loading @@ -18,7 +18,7 @@ #include <utils/Log.h> #include <algorithm> #include <audio_utils/primitives.h> #include <audio_utils/format.h> #include <aaudio/AAudio.h> #include <media/MediaMetricsItem.h> Loading Loading @@ -190,26 +190,10 @@ aaudio_result_t AudioStreamInternalCapture::readNowWithConversion(void *buffer, const audio_format_t sourceFormat = getDeviceFormat(); const audio_format_t destinationFormat = getFormat(); // TODO factor this out into a utility function if (sourceFormat == destinationFormat) { memcpy(destination, wrappingBuffer.data[partIndex], numBytes); } else if (sourceFormat == AUDIO_FORMAT_PCM_16_BIT && destinationFormat == AUDIO_FORMAT_PCM_FLOAT) { memcpy_to_float_from_i16( (float *) destination, (const int16_t *) wrappingBuffer.data[partIndex], numSamples); } else if (sourceFormat == AUDIO_FORMAT_PCM_FLOAT && destinationFormat == AUDIO_FORMAT_PCM_16_BIT) { memcpy_to_i16_from_float( (int16_t *) destination, (const float *) wrappingBuffer.data[partIndex], numSamples); } else { ALOGE("%s() - Format conversion not supported! audio_format_t source = %u, dest = %u", __func__, sourceFormat, destinationFormat); return AAUDIO_ERROR_INVALID_FORMAT; } memcpy_by_audio_format(destination, destinationFormat, wrappingBuffer.data[partIndex], sourceFormat, numSamples); destination += numBytes; framesLeft -= framesToProcess; } Loading
media/libmedia/MediaProfiles.cpp +73 −40 Original line number Diff line number Diff line Loading @@ -169,6 +169,7 @@ MediaProfiles::logVideoCodec(const MediaProfiles::VideoCodec& codec UNUSED) ALOGV("frame width: %d", codec.mFrameWidth); ALOGV("frame height: %d", codec.mFrameHeight); ALOGV("frame rate: %d", codec.mFrameRate); ALOGV("profile: %d", codec.mProfile); } /*static*/ void Loading @@ -179,6 +180,7 @@ MediaProfiles::logAudioCodec(const MediaProfiles::AudioCodec& codec UNUSED) ALOGV("bit rate: %d", codec.mBitRate); ALOGV("sample rate: %d", codec.mSampleRate); ALOGV("number of channels: %d", codec.mChannels); ALOGV("profile: %d", codec.mProfile); } /*static*/ void Loading Loading @@ -231,9 +233,10 @@ MediaProfiles::findTagForName(const MediaProfiles::NameToTagMap *map, size_t nMa } /*static*/ void MediaProfiles::createVideoCodec(const char **atts, MediaProfiles *profiles) MediaProfiles::createVideoCodec(const char **atts, size_t natts, MediaProfiles *profiles) { CHECK(!strcmp("codec", atts[0]) && CHECK(natts >= 10 && !strcmp("codec", atts[0]) && !strcmp("bitRate", atts[2]) && !strcmp("width", atts[4]) && !strcmp("height", atts[6]) && Loading @@ -246,9 +249,14 @@ MediaProfiles::createVideoCodec(const char **atts, MediaProfiles *profiles) return; } int profile = -1; if (natts >= 12 && !strcmp("profile", atts[10])) { profile = atoi(atts[11]); } VideoCodec videoCodec { static_cast<video_encoder>(codec), atoi(atts[3]), atoi(atts[5]), atoi(atts[7]), atoi(atts[9]) }; atoi(atts[3]), atoi(atts[5]), atoi(atts[7]), atoi(atts[9]), profile }; logVideoCodec(videoCodec); size_t nCamcorderProfiles; Loading @@ -257,9 +265,10 @@ MediaProfiles::createVideoCodec(const char **atts, MediaProfiles *profiles) } /*static*/ void MediaProfiles::createAudioCodec(const char **atts, MediaProfiles *profiles) MediaProfiles::createAudioCodec(const char **atts, size_t natts, MediaProfiles *profiles) { CHECK(!strcmp("codec", atts[0]) && CHECK(natts >= 8 && !strcmp("codec", atts[0]) && !strcmp("bitRate", atts[2]) && !strcmp("sampleRate", atts[4]) && !strcmp("channels", atts[6])); Loading @@ -270,9 +279,14 @@ MediaProfiles::createAudioCodec(const char **atts, MediaProfiles *profiles) return; } int profile = -1; if (natts >= 10 && !strcmp("profile", atts[8])) { profile = atoi(atts[9]); } AudioCodec audioCodec{ static_cast<audio_encoder>(codec), atoi(atts[3]), atoi(atts[5]), atoi(atts[7]) }; atoi(atts[3]), atoi(atts[5]), atoi(atts[7]), profile }; logAudioCodec(audioCodec); size_t nCamcorderProfiles; Loading @@ -281,9 +295,10 @@ MediaProfiles::createAudioCodec(const char **atts, MediaProfiles *profiles) } /*static*/ MediaProfiles::AudioDecoderCap* MediaProfiles::createAudioDecoderCap(const char **atts) MediaProfiles::createAudioDecoderCap(const char **atts, size_t natts) { CHECK(!strcmp("name", atts[0]) && CHECK(natts >= 4 && !strcmp("name", atts[0]) && !strcmp("enabled", atts[2])); const size_t nMappings = sizeof(sAudioDecoderNameMap)/sizeof(sAudioDecoderNameMap[0]); Loading @@ -300,9 +315,10 @@ MediaProfiles::createAudioDecoderCap(const char **atts) } /*static*/ MediaProfiles::VideoDecoderCap* MediaProfiles::createVideoDecoderCap(const char **atts) MediaProfiles::createVideoDecoderCap(const char **atts, size_t natts) { CHECK(!strcmp("name", atts[0]) && CHECK(natts >= 4 && !strcmp("name", atts[0]) && !strcmp("enabled", atts[2])); const size_t nMappings = sizeof(sVideoDecoderNameMap)/sizeof(sVideoDecoderNameMap[0]); Loading @@ -319,9 +335,10 @@ MediaProfiles::createVideoDecoderCap(const char **atts) } /*static*/ MediaProfiles::VideoEncoderCap* MediaProfiles::createVideoEncoderCap(const char **atts) MediaProfiles::createVideoEncoderCap(const char **atts, size_t natts) { CHECK(!strcmp("name", atts[0]) && CHECK(natts >= 20 && !strcmp("name", atts[0]) && !strcmp("enabled", atts[2]) && !strcmp("minBitRate", atts[4]) && !strcmp("maxBitRate", atts[6]) && Loading @@ -348,9 +365,10 @@ MediaProfiles::createVideoEncoderCap(const char **atts) } /*static*/ MediaProfiles::AudioEncoderCap* MediaProfiles::createAudioEncoderCap(const char **atts) MediaProfiles::createAudioEncoderCap(const char **atts, size_t natts) { CHECK(!strcmp("name", atts[0]) && CHECK(natts >= 16 && !strcmp("name", atts[0]) && !strcmp("enabled", atts[2]) && !strcmp("minBitRate", atts[4]) && !strcmp("maxBitRate", atts[6]) && Loading @@ -374,9 +392,10 @@ MediaProfiles::createAudioEncoderCap(const char **atts) } /*static*/ output_format MediaProfiles::createEncoderOutputFileFormat(const char **atts) MediaProfiles::createEncoderOutputFileFormat(const char **atts, size_t natts) { CHECK(!strcmp("name", atts[0])); CHECK(natts >= 2 && !strcmp("name", atts[0])); const size_t nMappings =sizeof(sFileFormatMap)/sizeof(sFileFormatMap[0]); const int format = findTagForName(sFileFormatMap, nMappings, atts[1]); Loading @@ -395,9 +414,11 @@ static bool isCameraIdFound(int cameraId, const Vector<int>& cameraIds) { } /*static*/ MediaProfiles::CamcorderProfile* MediaProfiles::createCamcorderProfile(int cameraId, const char **atts, Vector<int>& cameraIds) MediaProfiles::createCamcorderProfile( int cameraId, const char **atts, size_t natts, Vector<int>& cameraIds) { CHECK(!strcmp("quality", atts[0]) && CHECK(natts >= 6 && !strcmp("quality", atts[0]) && !strcmp("fileFormat", atts[2]) && !strcmp("duration", atts[4])); Loading Loading @@ -440,9 +461,10 @@ MediaProfiles::findImageEncodingQualityLevels(int cameraId) const return NULL; } void MediaProfiles::addImageEncodingQualityLevel(int cameraId, const char** atts) void MediaProfiles::addImageEncodingQualityLevel(int cameraId, const char** atts, size_t natts) { CHECK(!strcmp("quality", atts[0])); CHECK(natts >= 2 && !strcmp("quality", atts[0])); int quality = atoi(atts[1]); ALOGV("%s: cameraId=%d, quality=%d", __func__, cameraId, quality); ImageEncodingQualityLevels *levels = findImageEncodingQualityLevels(cameraId); Loading @@ -457,18 +479,19 @@ void MediaProfiles::addImageEncodingQualityLevel(int cameraId, const char** atts } /*static*/ int MediaProfiles::getCameraId(const char** atts) MediaProfiles::getCameraId(const char** atts, size_t natts) { if (!atts[0]) return 0; // default cameraId = 0 CHECK(!strcmp("cameraId", atts[0])); CHECK(natts >= 2 && !strcmp("cameraId", atts[0])); return atoi(atts[1]); } void MediaProfiles::addStartTimeOffset(int cameraId, const char** atts) void MediaProfiles::addStartTimeOffset(int cameraId, const char** atts, size_t natts) { int offsetTimeMs = 1000; if (atts[2]) { CHECK(!strcmp("startOffsetMs", atts[2])); if (natts >= 3 && atts[2]) { CHECK(natts >= 4 && !strcmp("startOffsetMs", atts[2])); offsetTimeMs = atoi(atts[3]); } Loading @@ -479,48 +502,58 @@ void MediaProfiles::addStartTimeOffset(int cameraId, const char** atts) /*static*/ void MediaProfiles::startElementHandler(void *userData, const char *name, const char **atts) { // determine number of attributes size_t natts = 0; while (atts[natts]) { ++natts; } MediaProfiles *profiles = (MediaProfiles *)userData; if (strcmp("Video", name) == 0) { createVideoCodec(atts, profiles); createVideoCodec(atts, natts, profiles); } else if (strcmp("Audio", name) == 0) { createAudioCodec(atts, profiles); createAudioCodec(atts, natts, profiles); } else if (strcmp("VideoEncoderCap", name) == 0 && natts >= 4 && strcmp("true", atts[3]) == 0) { MediaProfiles::VideoEncoderCap* cap = createVideoEncoderCap(atts); MediaProfiles::VideoEncoderCap* cap = createVideoEncoderCap(atts, natts); if (cap != nullptr) { profiles->mVideoEncoders.add(cap); } } else if (strcmp("AudioEncoderCap", name) == 0 && natts >= 4 && strcmp("true", atts[3]) == 0) { MediaProfiles::AudioEncoderCap* cap = createAudioEncoderCap(atts); MediaProfiles::AudioEncoderCap* cap = createAudioEncoderCap(atts, natts); if (cap != nullptr) { profiles->mAudioEncoders.add(cap); } } else if (strcmp("VideoDecoderCap", name) == 0 && natts >= 4 && strcmp("true", atts[3]) == 0) { MediaProfiles::VideoDecoderCap* cap = createVideoDecoderCap(atts); MediaProfiles::VideoDecoderCap* cap = createVideoDecoderCap(atts, natts); if (cap != nullptr) { profiles->mVideoDecoders.add(cap); } } else if (strcmp("AudioDecoderCap", name) == 0 && natts >= 4 && strcmp("true", atts[3]) == 0) { MediaProfiles::AudioDecoderCap* cap = createAudioDecoderCap(atts); MediaProfiles::AudioDecoderCap* cap = createAudioDecoderCap(atts, natts); if (cap != nullptr) { profiles->mAudioDecoders.add(cap); } } else if (strcmp("EncoderOutputFileFormat", name) == 0) { profiles->mEncoderOutputFileFormats.add(createEncoderOutputFileFormat(atts)); profiles->mEncoderOutputFileFormats.add(createEncoderOutputFileFormat(atts, natts)); } else if (strcmp("CamcorderProfiles", name) == 0) { profiles->mCurrentCameraId = getCameraId(atts); profiles->addStartTimeOffset(profiles->mCurrentCameraId, atts); profiles->mCurrentCameraId = getCameraId(atts, natts); profiles->addStartTimeOffset(profiles->mCurrentCameraId, atts, natts); } else if (strcmp("EncoderProfile", name) == 0) { MediaProfiles::CamcorderProfile* profile = createCamcorderProfile( profiles->mCurrentCameraId, atts, profiles->mCameraIds); profiles->mCurrentCameraId, atts, natts, profiles->mCameraIds); if (profile != nullptr) { profiles->mCamcorderProfiles.add(profile); } } else if (strcmp("ImageEncoding", name) == 0) { profiles->addImageEncodingQualityLevel(profiles->mCurrentCameraId, atts); profiles->addImageEncodingQualityLevel(profiles->mCurrentCameraId, atts, natts); } } Loading Loading @@ -575,12 +608,12 @@ void MediaProfiles::checkAndAddRequiredProfilesIfNecessary() { for (size_t i = 0, n = mCamcorderProfiles.size(); i < n; ++i) { // ensure at least one video and audio profile is added if (mCamcorderProfiles[i]->mVideoCodecs.size() == 0) { if (mCamcorderProfiles[i]->mVideoCodecs.empty()) { mCamcorderProfiles[i]->mVideoCodecs.emplace_back( VIDEO_ENCODER_H263, 192000 /* bitrate */, 176 /* width */, 144 /* height */, 20 /* frameRate */); } if (mCamcorderProfiles[i]->mAudioCodecs.size() == 0) { if (mCamcorderProfiles[i]->mAudioCodecs.empty()) { mCamcorderProfiles[i]->mAudioCodecs.emplace_back( AUDIO_ENCODER_AMR_NB, 12200 /* bitrate */, 8000 /* sampleRate */, 1 /* channels */); Loading
media/libmedia/include/media/MediaProfiles.h +32 −15 Original line number Diff line number Diff line Loading @@ -114,13 +114,16 @@ public: * @param frameWidth frame width in pixels * @param frameHeight frame height in pixels * @param frameRate frame rate in fps * @param profile codec profile (for MediaCodec) or -1 for none */ VideoCodec(video_encoder codec, int bitrate, int frameWidth, int frameHeight, int frameRate) VideoCodec(video_encoder codec, int bitrate, int frameWidth, int frameHeight, int frameRate, int profile = -1) : mCodec(codec), mBitRate(bitrate), mFrameWidth(frameWidth), mFrameHeight(frameHeight), mFrameRate(frameRate) { mFrameRate(frameRate), mProfile(profile) { } VideoCodec(const VideoCodec&) = default; Loading Loading @@ -152,12 +155,18 @@ public: return mFrameRate; } /** Returns the codec profile (or -1 for no profile). */ int getProfile() const { return mProfile; } private: video_encoder mCodec; int mBitRate; int mFrameWidth; int mFrameHeight; int mFrameRate; int mProfile; friend class MediaProfiles; }; Loading @@ -173,12 +182,14 @@ public: * @param bitrate bitrate in bps * @param sampleRate sample rate in Hz * @param channels number of channels * @param profile codec profile (for MediaCodec) or -1 for none */ AudioCodec(audio_encoder codec, int bitrate, int sampleRate, int channels) AudioCodec(audio_encoder codec, int bitrate, int sampleRate, int channels, int profile = -1) : mCodec(codec), mBitRate(bitrate), mSampleRate(sampleRate), mChannels(channels) { mChannels(channels), mProfile(profile) { } AudioCodec(const AudioCodec&) = default; Loading @@ -205,11 +216,17 @@ public: return mChannels; } /** Returns the codec profile (or -1 for no profile). */ int getProfile() const { return mProfile; } private: audio_encoder mCodec; int mBitRate; int mSampleRate; int mChannels; int mProfile; friend class MediaProfiles; }; Loading Loading @@ -458,23 +475,23 @@ private: // If the xml configuration file does exist, use the settings // from the xml static MediaProfiles* createInstanceFromXmlFile(const char *xml); static output_format createEncoderOutputFileFormat(const char **atts); static void createVideoCodec(const char **atts, MediaProfiles *profiles); static void createAudioCodec(const char **atts, MediaProfiles *profiles); static AudioDecoderCap* createAudioDecoderCap(const char **atts); static VideoDecoderCap* createVideoDecoderCap(const char **atts); static VideoEncoderCap* createVideoEncoderCap(const char **atts); static AudioEncoderCap* createAudioEncoderCap(const char **atts); static output_format createEncoderOutputFileFormat(const char **atts, size_t natts); static void createVideoCodec(const char **atts, size_t natts, MediaProfiles *profiles); static void createAudioCodec(const char **atts, size_t natts, MediaProfiles *profiles); static AudioDecoderCap* createAudioDecoderCap(const char **atts, size_t natts); static VideoDecoderCap* createVideoDecoderCap(const char **atts, size_t natts); static VideoEncoderCap* createVideoEncoderCap(const char **atts, size_t natts); static AudioEncoderCap* createAudioEncoderCap(const char **atts, size_t natts); static CamcorderProfile* createCamcorderProfile( int cameraId, const char **atts, Vector<int>& cameraIds); int cameraId, const char **atts, size_t natts, Vector<int>& cameraIds); static int getCameraId(const char **atts); static int getCameraId(const char **atts, size_t natts); void addStartTimeOffset(int cameraId, const char **atts); void addStartTimeOffset(int cameraId, const char **atts, size_t natts); ImageEncodingQualityLevels* findImageEncodingQualityLevels(int cameraId) const; void addImageEncodingQualityLevel(int cameraId, const char** atts); void addImageEncodingQualityLevel(int cameraId, const char** atts, size_t natts); // Customized element tag handler for parsing the xml configuration file. static void startElementHandler(void *userData, const char *name, const char **atts); Loading