diff options
384 files changed, 6071 insertions, 4523 deletions
diff --git a/camera/Camera.cpp b/camera/Camera.cpp index 85f44f0..3a9fb4c 100644 --- a/camera/Camera.cpp +++ b/camera/Camera.cpp @@ -55,7 +55,7 @@ sp<Camera> Camera::create(const sp<ICamera>& camera)      if (camera->connect(c) == NO_ERROR) {          c->mStatus = NO_ERROR;          c->mCamera = camera; -        camera->asBinder()->linkToDeath(c); +        IInterface::asBinder(camera)->linkToDeath(c);          return c;      }      return 0; @@ -93,7 +93,7 @@ status_t Camera::connectLegacy(int cameraId, int halVersion,                                          clientUid, /*out*/c->mCamera);      }      if (status == OK && c->mCamera != 0) { -        c->mCamera->asBinder()->linkToDeath(c); +        IInterface::asBinder(c->mCamera)->linkToDeath(c);          c->mStatus = NO_ERROR;          camera = c;      } else { diff --git a/camera/CameraBase.cpp b/camera/CameraBase.cpp index 04694cd..65a1a47 100644 --- a/camera/CameraBase.cpp +++ b/camera/CameraBase.cpp @@ -107,7 +107,7 @@ sp<TCam> CameraBase<TCam, TCamTraits>::connect(int cameraId,                                               /*out*/ c->mCamera);      }      if (status == OK && c->mCamera != 0) { -        c->mCamera->asBinder()->linkToDeath(c); +        IInterface::asBinder(c->mCamera)->linkToDeath(c);          c->mStatus = NO_ERROR;      } else {          ALOGW("An error occurred while connecting to camera: %d", cameraId); @@ -122,7 +122,7 @@ void CameraBase<TCam, TCamTraits>::disconnect()      ALOGV("%s: disconnect", __FUNCTION__);      if (mCamera != 0) {          mCamera->disconnect(); -        mCamera->asBinder()->unlinkToDeath(this); +        IInterface::asBinder(mCamera)->unlinkToDeath(this);          mCamera = 0;      }      ALOGV("%s: disconnect (done)", __FUNCTION__); diff --git a/camera/ICamera.cpp b/camera/ICamera.cpp index 8c6e1f7..9943be6 100644 --- a/camera/ICamera.cpp +++ b/camera/ICamera.cpp @@ -75,7 +75,7 @@ public:          ALOGV("setPreviewTarget");          Parcel data, reply;          data.writeInterfaceToken(ICamera::getInterfaceDescriptor()); -        sp<IBinder> b(bufferProducer->asBinder()); +        sp<IBinder> b(IInterface::asBinder(bufferProducer));          data.writeStrongBinder(b);          remote()->transact(SET_PREVIEW_TARGET, data, &reply);          return reply.readInt32(); @@ -98,7 +98,7 @@ public:          ALOGV("setPreviewCallbackTarget");          Parcel data, reply;          data.writeInterfaceToken(ICamera::getInterfaceDescriptor()); -        sp<IBinder> b(callbackProducer->asBinder()); +        sp<IBinder> b(IInterface::asBinder(callbackProducer));          data.writeStrongBinder(b);          remote()->transact(SET_PREVIEW_CALLBACK_TARGET, data, &reply);          return reply.readInt32(); @@ -147,7 +147,7 @@ public:          ALOGV("releaseRecordingFrame");          Parcel data, reply;          data.writeInterfaceToken(ICamera::getInterfaceDescriptor()); -        data.writeStrongBinder(mem->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(mem));          remote()->transact(RELEASE_RECORDING_FRAME, data, &reply);      } @@ -250,7 +250,7 @@ public:      {          Parcel data, reply;          data.writeInterfaceToken(ICamera::getInterfaceDescriptor()); -        data.writeStrongBinder(cameraClient->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(cameraClient));          remote()->transact(CONNECT, data, &reply);          return reply.readInt32();      } diff --git a/camera/ICameraClient.cpp b/camera/ICameraClient.cpp index 205c8ba..179a341 100644 --- a/camera/ICameraClient.cpp +++ b/camera/ICameraClient.cpp @@ -58,7 +58,7 @@ public:          Parcel data, reply;          data.writeInterfaceToken(ICameraClient::getInterfaceDescriptor());          data.writeInt32(msgType); -        data.writeStrongBinder(imageData->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(imageData));          if (metadata) {              data.writeInt32(metadata->number_of_faces);              data.write(metadata->faces, sizeof(camera_face_t) * metadata->number_of_faces); @@ -74,7 +74,7 @@ public:          data.writeInterfaceToken(ICameraClient::getInterfaceDescriptor());          data.writeInt64(timestamp);          data.writeInt32(msgType); -        data.writeStrongBinder(imageData->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(imageData));          remote()->transact(DATA_CALLBACK_TIMESTAMP, data, &reply, IBinder::FLAG_ONEWAY);      }  }; diff --git a/camera/ICameraRecordingProxy.cpp b/camera/ICameraRecordingProxy.cpp index 7223b6d..3dc0ffb 100644 --- a/camera/ICameraRecordingProxy.cpp +++ b/camera/ICameraRecordingProxy.cpp @@ -45,7 +45,7 @@ public:          ALOGV("startRecording");          Parcel data, reply;          data.writeInterfaceToken(ICameraRecordingProxy::getInterfaceDescriptor()); -        data.writeStrongBinder(listener->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(listener));          remote()->transact(START_RECORDING, data, &reply);          return reply.readInt32();      } @@ -63,7 +63,7 @@ public:          ALOGV("releaseRecordingFrame");          Parcel data, reply;          data.writeInterfaceToken(ICameraRecordingProxy::getInterfaceDescriptor()); -        data.writeStrongBinder(mem->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(mem));          remote()->transact(RELEASE_RECORDING_FRAME, data, &reply);      }  }; diff --git a/camera/ICameraRecordingProxyListener.cpp b/camera/ICameraRecordingProxyListener.cpp index cb17f19..cf848fc 100644 --- a/camera/ICameraRecordingProxyListener.cpp +++ b/camera/ICameraRecordingProxyListener.cpp @@ -42,7 +42,7 @@ public:          data.writeInterfaceToken(ICameraRecordingProxyListener::getInterfaceDescriptor());          data.writeInt64(timestamp);          data.writeInt32(msgType); -        data.writeStrongBinder(imageData->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(imageData));          remote()->transact(DATA_CALLBACK_TIMESTAMP, data, &reply, IBinder::FLAG_ONEWAY);      }  }; diff --git a/camera/ICameraService.cpp b/camera/ICameraService.cpp index 5485205..fc3e437 100644 --- a/camera/ICameraService.cpp +++ b/camera/ICameraService.cpp @@ -172,7 +172,7 @@ public:      {          Parcel data, reply;          data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); -        data.writeStrongBinder(cameraClient->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(cameraClient));          data.writeInt32(cameraId);          data.writeString16(clientPackageName);          data.writeInt32(clientUid); @@ -194,7 +194,7 @@ public:      {          Parcel data, reply;          data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); -        data.writeStrongBinder(cameraClient->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(cameraClient));          data.writeInt32(cameraId);          data.writeInt32(halVersion);          data.writeString16(clientPackageName); @@ -217,7 +217,7 @@ public:      {          Parcel data, reply;          data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); -        data.writeStrongBinder(cameraCb->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(cameraCb));          data.writeInt32(cameraId);          data.writeString16(clientPackageName);          data.writeInt32(clientUid); @@ -242,7 +242,7 @@ public:      {          Parcel data, reply;          data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); -        data.writeStrongBinder(cameraCb->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(cameraCb));          data.writeInt32(cameraId);          data.writeString16(clientPackageName);          data.writeInt32(clientUid); @@ -260,7 +260,7 @@ public:      {          Parcel data, reply;          data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); -        data.writeStrongBinder(listener->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(listener));          remote()->transact(BnCameraService::ADD_LISTENER, data, &reply);          if (readExceptionCode(reply)) return -EPROTO; @@ -271,7 +271,7 @@ public:      {          Parcel data, reply;          data.writeInterfaceToken(ICameraService::getInterfaceDescriptor()); -        data.writeStrongBinder(listener->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(listener));          remote()->transact(BnCameraService::REMOVE_LISTENER, data, &reply);          if (readExceptionCode(reply)) return -EPROTO; @@ -384,7 +384,7 @@ status_t BnCameraService::onTransact(              reply->writeInt32(status);              if (camera != NULL) {                  reply->writeInt32(1); -                reply->writeStrongBinder(camera->asBinder()); +                reply->writeStrongBinder(IInterface::asBinder(camera));              } else {                  reply->writeInt32(0);              } @@ -404,7 +404,7 @@ status_t BnCameraService::onTransact(              reply->writeInt32(status);              if (camera != NULL) {                  reply->writeInt32(1); -                reply->writeStrongBinder(camera->asBinder()); +                reply->writeStrongBinder(IInterface::asBinder(camera));              } else {                  reply->writeInt32(0);              } @@ -424,7 +424,7 @@ status_t BnCameraService::onTransact(              reply->writeInt32(status);              if (camera != NULL) {                  reply->writeInt32(1); -                reply->writeStrongBinder(camera->asBinder()); +                reply->writeStrongBinder(IInterface::asBinder(camera));              } else {                  reply->writeInt32(0);              } @@ -484,7 +484,7 @@ status_t BnCameraService::onTransact(              reply->writeInt32(status);              if (camera != NULL) {                  reply->writeInt32(1); -                reply->writeStrongBinder(camera->asBinder()); +                reply->writeStrongBinder(IInterface::asBinder(camera));              } else {                  reply->writeInt32(0);              } diff --git a/camera/IProCameraUser.cpp b/camera/IProCameraUser.cpp index 8f22124..9bd7597 100644 --- a/camera/IProCameraUser.cpp +++ b/camera/IProCameraUser.cpp @@ -65,7 +65,7 @@ public:      {          Parcel data, reply;          data.writeInterfaceToken(IProCameraUser::getInterfaceDescriptor()); -        data.writeStrongBinder(cameraClient->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(cameraClient));          remote()->transact(CONNECT, data, &reply);          return reply.readInt32();      } @@ -150,7 +150,7 @@ public:          data.writeInt32(height);          data.writeInt32(format); -        sp<IBinder> b(bufferProducer->asBinder()); +        sp<IBinder> b(IInterface::asBinder(bufferProducer));          data.writeStrongBinder(b);          remote()->transact(CREATE_STREAM, data, &reply); diff --git a/camera/camera2/CaptureRequest.cpp b/camera/camera2/CaptureRequest.cpp index fb74c8d..66d6913 100644 --- a/camera/camera2/CaptureRequest.cpp +++ b/camera/camera2/CaptureRequest.cpp @@ -106,7 +106,7 @@ status_t CaptureRequest::writeToParcel(Parcel* parcel) const {          sp<IBinder> binder;          if (surface != 0) { -            binder = surface->getIGraphicBufferProducer()->asBinder(); +            binder = IInterface::asBinder(surface->getIGraphicBufferProducer());          }          // not sure if readParcelableArray does this, hard to tell from source diff --git a/camera/camera2/ICameraDeviceUser.cpp b/camera/camera2/ICameraDeviceUser.cpp index ff4a0c2..277b5db 100644 --- a/camera/camera2/ICameraDeviceUser.cpp +++ b/camera/camera2/ICameraDeviceUser.cpp @@ -107,7 +107,7 @@ public:              }          } -	if ((res != NO_ERROR) || (resFrameNumber != NO_ERROR)) { +	if ((res < NO_ERROR) || (resFrameNumber != NO_ERROR)) {              res = FAILED_TRANSACTION;          }          return res; @@ -147,7 +147,7 @@ public:                  resFrameNumber = reply.readInt64(lastFrameNumber);              }          } -        if ((res != NO_ERROR) || (resFrameNumber != NO_ERROR)) { +        if ((res < NO_ERROR) || (resFrameNumber != NO_ERROR)) {              res = FAILED_TRANSACTION;          }          return res; @@ -167,7 +167,7 @@ public:          status_t resFrameNumber = BAD_VALUE;          if (reply.readInt32() != 0) {              if (lastFrameNumber != NULL) { -                res = reply.readInt64(lastFrameNumber); +                resFrameNumber = reply.readInt64(lastFrameNumber);              }          }          if ((res != NO_ERROR) || (resFrameNumber != NO_ERROR)) { @@ -219,7 +219,7 @@ public:          data.writeInt32(1); // marker that bufferProducer is not null          data.writeString16(String16("unknown_name")); // name of surface -        sp<IBinder> b(bufferProducer->asBinder()); +        sp<IBinder> b(IInterface::asBinder(bufferProducer));          data.writeStrongBinder(b);          remote()->transact(CREATE_STREAM, data, &reply); @@ -296,7 +296,7 @@ public:          status_t resFrameNumber = BAD_VALUE;          if (reply.readInt32() != 0) {              if (lastFrameNumber != NULL) { -                res = reply.readInt64(lastFrameNumber); +                resFrameNumber = reply.readInt64(lastFrameNumber);              }          }          if ((res != NO_ERROR) || (resFrameNumber != NO_ERROR)) { diff --git a/camera/tests/Android.mk b/camera/tests/Android.mk index 61385e5..2db4c14 100644 --- a/camera/tests/Android.mk +++ b/camera/tests/Android.mk @@ -14,16 +14,15 @@  LOCAL_PATH:= $(call my-dir)  include $(CLEAR_VARS) +LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk  LOCAL_SRC_FILES:= \ -	main.cpp \  	ProCameraTests.cpp \  	VendorTagDescriptorTests.cpp  LOCAL_SHARED_LIBRARIES := \  	libutils \  	libcutils \ -	libstlport \  	libcamera_metadata \  	libcamera_client \  	libgui \ @@ -32,14 +31,7 @@ LOCAL_SHARED_LIBRARIES := \  	libdl \  	libbinder -LOCAL_STATIC_LIBRARIES := \ -	libgtest -  LOCAL_C_INCLUDES += \ -	bionic \ -	bionic/libstdc++/include \ -	external/gtest/include \ -	external/stlport/stlport \  	system/media/camera/include \  	system/media/private/camera/include \  	system/media/camera/tests \ diff --git a/camera/tests/main.cpp b/camera/tests/main.cpp deleted file mode 100644 index 8c8c515..0000000 --- a/camera/tests/main.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (C) 2013 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - *      http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <gtest/gtest.h> - - -int main(int argc, char **argv) { - -    ::testing::InitGoogleTest(&argc, argv); - -    int ret = RUN_ALL_TESTS(); - -    return ret; -} diff --git a/cmds/screenrecord/TextRenderer.cpp b/cmds/screenrecord/TextRenderer.cpp index 6a9176b..01f73e0 100644 --- a/cmds/screenrecord/TextRenderer.cpp +++ b/cmds/screenrecord/TextRenderer.cpp @@ -21,6 +21,8 @@  #include "TextRenderer.h"  #include <assert.h> +#include <malloc.h> +#include <string.h>  namespace android {  #include "FontBitmap.h" diff --git a/cmds/stagefright/SimplePlayer.cpp b/cmds/stagefright/SimplePlayer.cpp index 1b2f792..4b2f980 100644 --- a/cmds/stagefright/SimplePlayer.cpp +++ b/cmds/stagefright/SimplePlayer.cpp @@ -332,7 +332,7 @@ status_t SimplePlayer::onPrepare() {          size_t j = 0;          sp<ABuffer> buffer; -        while (format->findBuffer(StringPrintf("csd-%d", j).c_str(), &buffer)) { +        while (format->findBuffer(AStringPrintf("csd-%d", j).c_str(), &buffer)) {              state->mCSD.push_back(buffer);              ++j; diff --git a/cmds/stagefright/SineSource.h b/cmds/stagefright/SineSource.h index 76ab669..be05661 100644 --- a/cmds/stagefright/SineSource.h +++ b/cmds/stagefright/SineSource.h @@ -3,10 +3,11 @@  #define SINE_SOURCE_H_  #include <media/stagefright/MediaSource.h> +#include <utils/Compat.h>  namespace android { -struct MediaBufferGroup; +class MediaBufferGroup;  struct SineSource : public MediaSource {      SineSource(int32_t sampleRate, int32_t numChannels); @@ -24,7 +25,7 @@ protected:  private:      enum { kBufferSize = 8192 }; -    static const double kFrequency = 500.0; +    static const CONSTEXPR double kFrequency = 500.0;      bool mStarted;      int32_t mSampleRate; diff --git a/drm/common/IDrmManagerService.cpp b/drm/common/IDrmManagerService.cpp index db41e0b..3f62ed7 100644 --- a/drm/common/IDrmManagerService.cpp +++ b/drm/common/IDrmManagerService.cpp @@ -148,7 +148,7 @@ status_t BpDrmManagerService::setDrmServiceListener(      data.writeInterfaceToken(IDrmManagerService::getInterfaceDescriptor());      data.writeInt32(uniqueId); -    data.writeStrongBinder(drmServiceListener->asBinder()); +    data.writeStrongBinder(IInterface::asBinder(drmServiceListener));      remote()->transact(SET_DRM_SERVICE_LISTENER, data, &reply);      return reply.readInt32();  } diff --git a/drm/drmserver/Android.mk b/drm/drmserver/Android.mk index aa0ab9b..48ea385 100644 --- a/drm/drmserver/Android.mk +++ b/drm/drmserver/Android.mk @@ -26,7 +26,8 @@ LOCAL_SHARED_LIBRARIES := \      libutils \      liblog \      libbinder \ -    libdl +    libdl \ +    libselinux  LOCAL_STATIC_LIBRARIES := libdrmframeworkcommon diff --git a/drm/drmserver/DrmManagerService.cpp b/drm/drmserver/DrmManagerService.cpp index 63341e0..857d73e 100644 --- a/drm/drmserver/DrmManagerService.cpp +++ b/drm/drmserver/DrmManagerService.cpp @@ -29,20 +29,68 @@  #include "DrmManagerService.h"  #include "DrmManager.h" +#include <selinux/android.h> +  using namespace android; +static int selinux_enabled; +static char *drmserver_context;  static Vector<uid_t> trustedUids; -static bool isProtectedCallAllowed() { +const char *const DrmManagerService::drm_perm_labels[] = { +    "consumeRights", +    "setPlaybackStatus", +    "openDecryptSession", +    "closeDecryptSession", +    "initializeDecryptUnit", +    "decrypt", +    "finalizeDecryptUnit", +    "pread" +}; + +const char *DrmManagerService::get_perm_label(drm_perm_t perm) { +    unsigned int index = perm; + +    if (index < 0 || +            index >= (sizeof(drm_perm_labels) / sizeof(drm_perm_labels[0]))) { +        ALOGE("SELinux: Failed to retrieve permission label(perm=%d).\n", perm); +        abort(); +    } +    return drm_perm_labels[index]; +} + +bool DrmManagerService::selinuxIsProtectedCallAllowed(pid_t spid, drm_perm_t perm) { +    if (selinux_enabled <= 0) { +        return true; +    } + +    char *sctx; +    const char *selinux_class = "drmservice"; +    const char *str_perm = get_perm_label(perm); + +    if (getpidcon(spid, &sctx) != 0) { +        ALOGE("SELinux: getpidcon(pid=%d) failed.\n", spid); +        return false; +    } + +    bool allowed = (selinux_check_access(sctx, drmserver_context, selinux_class, +            str_perm, NULL) == 0); +    freecon(sctx); + +    return allowed; +} + +bool DrmManagerService::isProtectedCallAllowed(drm_perm_t perm) {      // TODO      // Following implementation is just for reference.      // Each OEM manufacturer should implement/replace with their own solutions.      IPCThreadState* ipcState = IPCThreadState::self();      uid_t uid = ipcState->getCallingUid(); +    pid_t spid = ipcState->getCallingPid();      for (unsigned int i = 0; i < trustedUids.size(); ++i) {          if (trustedUids[i] == uid) { -            return true; +            return selinuxIsProtectedCallAllowed(spid, perm);          }      }      return false; @@ -60,6 +108,16 @@ void DrmManagerService::instantiate() {          // Add trusted uids here          trustedUids.push(AID_MEDIA);      } + +    selinux_enabled = is_selinux_enabled(); +    if (selinux_enabled > 0 && getcon(&drmserver_context) != 0) { +        ALOGE("SELinux: DrmManagerService failed to get context for DrmManagerService. Aborting.\n"); +        abort(); +    } + +    union selinux_callback cb; +    cb.func_log = selinux_log_callback; +    selinux_set_callback(SELINUX_CB_LOG, cb);  }  DrmManagerService::DrmManagerService() : @@ -151,7 +209,7 @@ int DrmManagerService::checkRightsStatus(  status_t DrmManagerService::consumeRights(              int uniqueId, DecryptHandle* decryptHandle, int action, bool reserve) {      ALOGV("Entering consumeRights"); -    if (!isProtectedCallAllowed()) { +    if (!isProtectedCallAllowed(CONSUME_RIGHTS)) {          return DRM_ERROR_NO_PERMISSION;      }      return mDrmManager->consumeRights(uniqueId, decryptHandle, action, reserve); @@ -160,7 +218,7 @@ status_t DrmManagerService::consumeRights(  status_t DrmManagerService::setPlaybackStatus(              int uniqueId, DecryptHandle* decryptHandle, int playbackStatus, int64_t position) {      ALOGV("Entering setPlaybackStatus"); -    if (!isProtectedCallAllowed()) { +    if (!isProtectedCallAllowed(SET_PLAYBACK_STATUS)) {          return DRM_ERROR_NO_PERMISSION;      }      return mDrmManager->setPlaybackStatus(uniqueId, decryptHandle, playbackStatus, position); @@ -208,7 +266,7 @@ status_t DrmManagerService::getAllSupportInfo(  DecryptHandle* DrmManagerService::openDecryptSession(              int uniqueId, int fd, off64_t offset, off64_t length, const char* mime) {      ALOGV("Entering DrmManagerService::openDecryptSession"); -    if (isProtectedCallAllowed()) { +    if (isProtectedCallAllowed(OPEN_DECRYPT_SESSION)) {          return mDrmManager->openDecryptSession(uniqueId, fd, offset, length, mime);      } @@ -218,7 +276,7 @@ DecryptHandle* DrmManagerService::openDecryptSession(  DecryptHandle* DrmManagerService::openDecryptSession(              int uniqueId, const char* uri, const char* mime) {      ALOGV("Entering DrmManagerService::openDecryptSession with uri"); -    if (isProtectedCallAllowed()) { +    if (isProtectedCallAllowed(OPEN_DECRYPT_SESSION)) {          return mDrmManager->openDecryptSession(uniqueId, uri, mime);      } @@ -228,7 +286,7 @@ DecryptHandle* DrmManagerService::openDecryptSession(  DecryptHandle* DrmManagerService::openDecryptSession(              int uniqueId, const DrmBuffer& buf, const String8& mimeType) {      ALOGV("Entering DrmManagerService::openDecryptSession for streaming"); -    if (isProtectedCallAllowed()) { +    if (isProtectedCallAllowed(OPEN_DECRYPT_SESSION)) {          return mDrmManager->openDecryptSession(uniqueId, buf, mimeType);      } @@ -237,7 +295,7 @@ DecryptHandle* DrmManagerService::openDecryptSession(  status_t DrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* decryptHandle) {      ALOGV("Entering closeDecryptSession"); -    if (!isProtectedCallAllowed()) { +    if (!isProtectedCallAllowed(CLOSE_DECRYPT_SESSION)) {          return DRM_ERROR_NO_PERMISSION;      }      return mDrmManager->closeDecryptSession(uniqueId, decryptHandle); @@ -246,7 +304,7 @@ status_t DrmManagerService::closeDecryptSession(int uniqueId, DecryptHandle* dec  status_t DrmManagerService::initializeDecryptUnit(int uniqueId, DecryptHandle* decryptHandle,              int decryptUnitId, const DrmBuffer* headerInfo) {      ALOGV("Entering initializeDecryptUnit"); -    if (!isProtectedCallAllowed()) { +    if (!isProtectedCallAllowed(INITIALIZE_DECRYPT_UNIT)) {          return DRM_ERROR_NO_PERMISSION;      }      return mDrmManager->initializeDecryptUnit(uniqueId,decryptHandle, decryptUnitId, headerInfo); @@ -256,7 +314,7 @@ status_t DrmManagerService::decrypt(              int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId,              const DrmBuffer* encBuffer, DrmBuffer** decBuffer, DrmBuffer* IV) {      ALOGV("Entering decrypt"); -    if (!isProtectedCallAllowed()) { +    if (!isProtectedCallAllowed(DECRYPT)) {          return DRM_ERROR_NO_PERMISSION;      }      return mDrmManager->decrypt(uniqueId, decryptHandle, decryptUnitId, encBuffer, decBuffer, IV); @@ -265,7 +323,7 @@ status_t DrmManagerService::decrypt(  status_t DrmManagerService::finalizeDecryptUnit(              int uniqueId, DecryptHandle* decryptHandle, int decryptUnitId) {      ALOGV("Entering finalizeDecryptUnit"); -    if (!isProtectedCallAllowed()) { +    if (!isProtectedCallAllowed(FINALIZE_DECRYPT_UNIT)) {          return DRM_ERROR_NO_PERMISSION;      }      return mDrmManager->finalizeDecryptUnit(uniqueId, decryptHandle, decryptUnitId); @@ -274,7 +332,7 @@ status_t DrmManagerService::finalizeDecryptUnit(  ssize_t DrmManagerService::pread(int uniqueId, DecryptHandle* decryptHandle,              void* buffer, ssize_t numBytes, off64_t offset) {      ALOGV("Entering pread"); -    if (!isProtectedCallAllowed()) { +    if (!isProtectedCallAllowed(PREAD)) {          return DRM_ERROR_NO_PERMISSION;      }      return mDrmManager->pread(uniqueId, decryptHandle, buffer, numBytes, offset); diff --git a/drm/libdrmframework/DrmManagerClientImpl.cpp b/drm/libdrmframework/DrmManagerClientImpl.cpp index 2d2c90e..9457bb6 100644 --- a/drm/libdrmframework/DrmManagerClientImpl.cpp +++ b/drm/libdrmframework/DrmManagerClientImpl.cpp @@ -346,7 +346,7 @@ status_t DrmManagerClientImpl::notify(const DrmInfoEvent& event) {  DrmManagerClientImpl::DeathNotifier::~DeathNotifier() {      Mutex::Autolock lock(sMutex);      if (NULL != sDrmManagerService.get()) { -        sDrmManagerService->asBinder()->unlinkToDeath(this); +        IInterface::asBinder(sDrmManagerService)->unlinkToDeath(this);      }  } diff --git a/drm/libdrmframework/include/DrmManagerService.h b/drm/libdrmframework/include/DrmManagerService.h index 8bc59b4..45cee2e 100644 --- a/drm/libdrmframework/include/DrmManagerService.h +++ b/drm/libdrmframework/include/DrmManagerService.h @@ -42,9 +42,28 @@ public:      static void instantiate();  private: +    enum drm_perm_t { +        CONSUME_RIGHTS          = 0, +        SET_PLAYBACK_STATUS     = 1, +        OPEN_DECRYPT_SESSION    = 2, +        CLOSE_DECRYPT_SESSION   = 3, +        INITIALIZE_DECRYPT_UNIT = 4, +        DECRYPT                 = 5, +        FINALIZE_DECRYPT_UNIT   = 6, +        PREAD                   = 7, +    }; + +    static const char *const drm_perm_labels[]; +      DrmManagerService();      virtual ~DrmManagerService(); +    static const char *get_perm_label(drm_perm_t perm); + +    static bool selinuxIsProtectedCallAllowed(pid_t spid, drm_perm_t perm); + +    static bool isProtectedCallAllowed(drm_perm_t perm); +  public:      int addUniqueId(bool isNative); diff --git a/drm/libdrmframework/include/PlugInManager.h b/drm/libdrmframework/include/PlugInManager.h index c1d019a..466844d 100644 --- a/drm/libdrmframework/include/PlugInManager.h +++ b/drm/libdrmframework/include/PlugInManager.h @@ -234,14 +234,6 @@ private:      }      /** -     * True if the input entry is "." or ".." -     */ -    bool isDotOrDDot(const struct dirent* pEntry) const { -        String8 sName(pEntry->d_name); -        return "." == sName || ".." == sName; -    } - -    /**       * True if input entry is directory       */      bool isDirectory(const struct dirent* pEntry) const { diff --git a/drm/libdrmframework/plugins/forward-lock/FwdLockEngine/Android.mk b/drm/libdrmframework/plugins/forward-lock/FwdLockEngine/Android.mk index 48b0afe..933464f 100644 --- a/drm/libdrmframework/plugins/forward-lock/FwdLockEngine/Android.mk +++ b/drm/libdrmframework/plugins/forward-lock/FwdLockEngine/Android.mk @@ -58,8 +58,7 @@ LOCAL_C_INCLUDES += \      $(base)/drm/libdrmframework/plugins/forward-lock/internal-format/common \      $(base)/drm/libdrmframework/plugins/forward-lock/internal-format/converter \      $(base)/drm/libdrmframework/plugins/forward-lock/internal-format/decoder \ -    $(LOCAL_PATH)/include \ -    external/openssl/include +    $(LOCAL_PATH)/include  LOCAL_MODULE_RELATIVE_PATH := drm diff --git a/drm/libdrmframework/plugins/forward-lock/internal-format/common/Android.mk b/drm/libdrmframework/plugins/forward-lock/internal-format/common/Android.mk index 6c5d3cf..3b4c8b4 100644 --- a/drm/libdrmframework/plugins/forward-lock/internal-format/common/Android.mk +++ b/drm/libdrmframework/plugins/forward-lock/internal-format/common/Android.mk @@ -20,9 +20,6 @@ include $(CLEAR_VARS)  LOCAL_SRC_FILES := \      FwdLockGlue.c -LOCAL_C_INCLUDES := \ -    external/openssl/include -  LOCAL_SHARED_LIBRARIES := libcrypto  LOCAL_MODULE := libfwdlock-common diff --git a/drm/libdrmframework/plugins/forward-lock/internal-format/converter/Android.mk b/drm/libdrmframework/plugins/forward-lock/internal-format/converter/Android.mk index 8f08c88..2f51f0c 100644 --- a/drm/libdrmframework/plugins/forward-lock/internal-format/converter/Android.mk +++ b/drm/libdrmframework/plugins/forward-lock/internal-format/converter/Android.mk @@ -21,8 +21,7 @@ LOCAL_SRC_FILES := \      FwdLockConv.c  LOCAL_C_INCLUDES := \ -    frameworks/av/drm/libdrmframework/plugins/forward-lock/internal-format/common \ -    external/openssl/include +    frameworks/av/drm/libdrmframework/plugins/forward-lock/internal-format/common  LOCAL_SHARED_LIBRARIES := libcrypto diff --git a/drm/libdrmframework/plugins/forward-lock/internal-format/decoder/Android.mk b/drm/libdrmframework/plugins/forward-lock/internal-format/decoder/Android.mk index 7b493c3..3399ae5 100644 --- a/drm/libdrmframework/plugins/forward-lock/internal-format/decoder/Android.mk +++ b/drm/libdrmframework/plugins/forward-lock/internal-format/decoder/Android.mk @@ -21,8 +21,7 @@ LOCAL_SRC_FILES := \      FwdLockFile.c  LOCAL_C_INCLUDES := \ -    frameworks/av/drm/libdrmframework/plugins/forward-lock/internal-format/common \ -    external/openssl/include +    frameworks/av/drm/libdrmframework/plugins/forward-lock/internal-format/common  LOCAL_SHARED_LIBRARIES := libcrypto diff --git a/drm/mediadrm/plugins/clearkey/Android.mk b/drm/mediadrm/plugins/clearkey/Android.mk index 22a85b4..2efdcf5 100644 --- a/drm/mediadrm/plugins/clearkey/Android.mk +++ b/drm/mediadrm/plugins/clearkey/Android.mk @@ -31,9 +31,7 @@ LOCAL_SRC_FILES := \      Utils.cpp \  LOCAL_C_INCLUDES := \ -    bionic \      external/jsmn \ -    external/openssl/include \      frameworks/av/drm/mediadrm/plugins/clearkey \      frameworks/av/include \      frameworks/native/include \ diff --git a/drm/mediadrm/plugins/clearkey/tests/Android.mk b/drm/mediadrm/plugins/clearkey/tests/Android.mk index ac5bb21..392f218 100644 --- a/drm/mediadrm/plugins/clearkey/tests/Android.mk +++ b/drm/mediadrm/plugins/clearkey/tests/Android.mk @@ -28,25 +28,16 @@ LOCAL_SRC_FILES := \      JsonWebKeyUnittest.cpp \  LOCAL_C_INCLUDES := \ -    bionic \ -    external/gtest/include \      external/jsmn \ -    external/openssl/include \ -    external/stlport/stlport \      frameworks/av/drm/mediadrm/plugins/clearkey \      frameworks/av/include \      frameworks/native/include \ -LOCAL_STATIC_LIBRARIES := \ -    libgtest \ -    libgtest_main \ -  LOCAL_SHARED_LIBRARIES := \      libcrypto \      libdrmclearkeyplugin \      liblog \      libstagefright_foundation \ -    libstlport \      libutils \  include $(BUILD_NATIVE_TEST) diff --git a/include/media/IMediaPlayerService.h b/include/media/IMediaPlayerService.h index d7e584a..67b599a 100644 --- a/include/media/IMediaPlayerService.h +++ b/include/media/IMediaPlayerService.h @@ -51,17 +51,6 @@ public:      virtual sp<IMediaMetadataRetriever> createMetadataRetriever() = 0;      virtual sp<IMediaPlayer> create(const sp<IMediaPlayerClient>& client, int audioSessionId = 0) = 0; -    virtual status_t         decode( -            const sp<IMediaHTTPService> &httpService, -            const char* url, -            uint32_t *pSampleRate, -            int* pNumChannels, -            audio_format_t* pFormat, -            const sp<IMemoryHeap>& heap, size_t *pSize) = 0; - -    virtual status_t         decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, -                                    int* pNumChannels, audio_format_t* pFormat, -                                    const sp<IMemoryHeap>& heap, size_t *pSize) = 0;      virtual sp<IOMX>            getOMX() = 0;      virtual sp<ICrypto>         makeCrypto() = 0;      virtual sp<IDrm>            makeDrm() = 0; diff --git a/include/media/JetPlayer.h b/include/media/JetPlayer.h index 388f767..63d1980 100644 --- a/include/media/JetPlayer.h +++ b/include/media/JetPlayer.h @@ -22,6 +22,7 @@  #include <libsonivox/jet.h>  #include <libsonivox/eas_types.h>  #include <media/AudioTrack.h> +#include <media/MidiIoWrapper.h>  namespace android { @@ -86,15 +87,13 @@ private:      int                 mMaxTracks; // max number of MIDI tracks, usually 32      EAS_DATA_HANDLE     mEasData; -    EAS_FILE_LOCATOR    mEasJetFileLoc; +    sp<MidiIoWrapper>   mIoWrapper;      EAS_PCM*            mAudioBuffer;// EAS renders the MIDI data into this buffer,      sp<AudioTrack>      mAudioTrack; // and we play it in this audio track      int                 mTrackBufferSize;      S_JET_STATUS        mJetStatus;      S_JET_STATUS        mPreviousJetStatus; -    char                mJetFilePath[PATH_MAX]; -      class JetPlayerThread : public Thread {      public:          JetPlayerThread(JetPlayer *player) : mPlayer(player) { diff --git a/include/media/MediaPlayerInterface.h b/include/media/MediaPlayerInterface.h index c412299..4a6bf28 100644 --- a/include/media/MediaPlayerInterface.h +++ b/include/media/MediaPlayerInterface.h @@ -43,8 +43,6 @@ class IGraphicBufferProducer;  template<typename T> class SortedVector;  enum player_type { -    PV_PLAYER = 1, -    SONIVOX_PLAYER = 2,      STAGEFRIGHT_PLAYER = 3,      NU_PLAYER = 4,      // Test players are available only in the 'test' and 'eng' builds. @@ -90,7 +88,6 @@ public:          virtual             ~AudioSink() {}          virtual bool        ready() const = 0; // audio output is open and ready -        virtual bool        realtime() const = 0; // audio output is real-time output          virtual ssize_t     bufferSize() const = 0;          virtual ssize_t     frameCount() const = 0;          virtual ssize_t     channelCount() const = 0; diff --git a/include/media/MidiIoWrapper.h b/include/media/MidiIoWrapper.h new file mode 100644 index 0000000..e6f8cf7 --- /dev/null +++ b/include/media/MidiIoWrapper.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + *      http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef MIDI_IO_WRAPPER_H_ +#define MIDI_IO_WRAPPER_H_ + +#include <libsonivox/eas_types.h> + +#include "media/stagefright/DataSource.h" + +namespace android { + +class MidiIoWrapper : public RefBase { +public: +    MidiIoWrapper(const char *path); +    MidiIoWrapper(int fd, off64_t offset, int64_t size); +    MidiIoWrapper(const sp<DataSource> &source); + +    ~MidiIoWrapper(); + +    int readAt(void *buffer, int offset, int size); +    int size(); + +    EAS_FILE_LOCATOR getLocator(); + +private: +    int mFd; +    off64_t mBase; +    int64_t  mLength; +    sp<DataSource> mDataSource; +    EAS_FILE mEasFile; +}; + + +}  // namespace android + +#endif // MIDI_IO_WRAPPER_H_ diff --git a/include/media/SoundPool.h b/include/media/SoundPool.h deleted file mode 100644 index 5830475..0000000 --- a/include/media/SoundPool.h +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Copyright (C) 2007 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - *      http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef SOUNDPOOL_H_ -#define SOUNDPOOL_H_ - -#include <utils/threads.h> -#include <utils/List.h> -#include <utils/Vector.h> -#include <utils/KeyedVector.h> -#include <media/AudioTrack.h> -#include <binder/MemoryHeapBase.h> -#include <binder/MemoryBase.h> - -namespace android { - -static const int IDLE_PRIORITY = -1; - -// forward declarations -class SoundEvent; -class SoundPoolThread; -class SoundPool; - -// for queued events -class SoundPoolEvent { -public: -    SoundPoolEvent(int msg, int arg1=0, int arg2=0) : -        mMsg(msg), mArg1(arg1), mArg2(arg2) {} -    int         mMsg; -    int         mArg1; -    int         mArg2; -    enum MessageType { INVALID, SAMPLE_LOADED }; -}; - -// callback function prototype -typedef void SoundPoolCallback(SoundPoolEvent event, SoundPool* soundPool, void* user); - -// tracks samples used by application -class Sample  : public RefBase { -public: -    enum sample_state { UNLOADED, LOADING, READY, UNLOADING }; -    Sample(int sampleID, const char* url); -    Sample(int sampleID, int fd, int64_t offset, int64_t length); -    ~Sample(); -    int sampleID() { return mSampleID; } -    int numChannels() { return mNumChannels; } -    int sampleRate() { return mSampleRate; } -    audio_format_t format() { return mFormat; } -    size_t size() { return mSize; } -    int state() { return mState; } -    uint8_t* data() { return static_cast<uint8_t*>(mData->pointer()); } -    status_t doLoad(); -    void startLoad() { mState = LOADING; } -    sp<IMemory> getIMemory() { return mData; } - -    // hack -    void init(int numChannels, int sampleRate, audio_format_t format, size_t size, -            sp<IMemory> data ) { -        mNumChannels = numChannels; mSampleRate = sampleRate; mFormat = format; mSize = size; -            mData = data; } - -private: -    void init(); - -    size_t              mSize; -    volatile int32_t    mRefCount; -    uint16_t            mSampleID; -    uint16_t            mSampleRate; -    uint8_t             mState : 3; -    uint8_t             mNumChannels : 2; -    audio_format_t      mFormat; -    int                 mFd; -    int64_t             mOffset; -    int64_t             mLength; -    char*               mUrl; -    sp<IMemory>         mData; -    sp<MemoryHeapBase>  mHeap; -}; - -// stores pending events for stolen channels -class SoundEvent -{ -public: -    SoundEvent() : mChannelID(0), mLeftVolume(0), mRightVolume(0), -            mPriority(IDLE_PRIORITY), mLoop(0), mRate(0) {} -    void set(const sp<Sample>& sample, int channelID, float leftVolume, -            float rightVolume, int priority, int loop, float rate); -    sp<Sample>      sample() { return mSample; } -    int             channelID() { return mChannelID; } -    float           leftVolume() { return mLeftVolume; } -    float           rightVolume() { return mRightVolume; } -    int             priority() { return mPriority; } -    int             loop() { return mLoop; } -    float           rate() { return mRate; } -    void            clear() { mChannelID = 0; mSample.clear(); } - -protected: -    sp<Sample>      mSample; -    int             mChannelID; -    float           mLeftVolume; -    float           mRightVolume; -    int             mPriority; -    int             mLoop; -    float           mRate; -}; - -// for channels aka AudioTracks -class SoundChannel : public SoundEvent { -public: -    enum state { IDLE, RESUMING, STOPPING, PAUSED, PLAYING }; -    SoundChannel() : mState(IDLE), mNumChannels(1), -            mPos(0), mToggle(0), mAutoPaused(false) {} -    ~SoundChannel(); -    void init(SoundPool* soundPool); -    void play(const sp<Sample>& sample, int channelID, float leftVolume, float rightVolume, -            int priority, int loop, float rate); -    void setVolume_l(float leftVolume, float rightVolume); -    void setVolume(float leftVolume, float rightVolume); -    void stop_l(); -    void stop(); -    void pause(); -    void autoPause(); -    void resume(); -    void autoResume(); -    void setRate(float rate); -    int state() { return mState; } -    void setPriority(int priority) { mPriority = priority; } -    void setLoop(int loop); -    int numChannels() { return mNumChannels; } -    void clearNextEvent() { mNextEvent.clear(); } -    void nextEvent(); -    int nextChannelID() { return mNextEvent.channelID(); } -    void dump(); - -private: -    static void callback(int event, void* user, void *info); -    void process(int event, void *info, unsigned long toggle); -    bool doStop_l(); - -    SoundPool*          mSoundPool; -    sp<AudioTrack>      mAudioTrack; -    SoundEvent          mNextEvent; -    Mutex               mLock; -    int                 mState; -    int                 mNumChannels; -    int                 mPos; -    int                 mAudioBufferSize; -    unsigned long       mToggle; -    bool                mAutoPaused; -}; - -// application object for managing a pool of sounds -class SoundPool { -    friend class SoundPoolThread; -    friend class SoundChannel; -public: -    SoundPool(int maxChannels, const audio_attributes_t* pAttributes); -    ~SoundPool(); -    int load(const char* url, int priority); -    int load(int fd, int64_t offset, int64_t length, int priority); -    bool unload(int sampleID); -    int play(int sampleID, float leftVolume, float rightVolume, int priority, -            int loop, float rate); -    void pause(int channelID); -    void autoPause(); -    void resume(int channelID); -    void autoResume(); -    void stop(int channelID); -    void setVolume(int channelID, float leftVolume, float rightVolume); -    void setPriority(int channelID, int priority); -    void setLoop(int channelID, int loop); -    void setRate(int channelID, float rate); -    const audio_attributes_t* attributes() { return &mAttributes; } - -    // called from SoundPoolThread -    void sampleLoaded(int sampleID); - -    // called from AudioTrack thread -    void done_l(SoundChannel* channel); - -    // callback function -    void setCallback(SoundPoolCallback* callback, void* user); -    void* getUserData() { return mUserData; } - -private: -    SoundPool() {} // no default constructor -    bool startThreads(); -    void doLoad(sp<Sample>& sample); -    sp<Sample> findSample(int sampleID) { return mSamples.valueFor(sampleID); } -    SoundChannel* findChannel (int channelID); -    SoundChannel* findNextChannel (int channelID); -    SoundChannel* allocateChannel_l(int priority); -    void moveToFront_l(SoundChannel* channel); -    void notify(SoundPoolEvent event); -    void dump(); - -    // restart thread -    void addToRestartList(SoundChannel* channel); -    void addToStopList(SoundChannel* channel); -    static int beginThread(void* arg); -    int run(); -    void quit(); - -    Mutex                   mLock; -    Mutex                   mRestartLock; -    Condition               mCondition; -    SoundPoolThread*        mDecodeThread; -    SoundChannel*           mChannelPool; -    List<SoundChannel*>     mChannels; -    List<SoundChannel*>     mRestart; -    List<SoundChannel*>     mStop; -    DefaultKeyedVector< int, sp<Sample> >   mSamples; -    int                     mMaxChannels; -    audio_attributes_t      mAttributes; -    int                     mAllocated; -    int                     mNextSampleID; -    int                     mNextChannelID; -    bool                    mQuit; - -    // callback -    Mutex                   mCallbackLock; -    SoundPoolCallback*      mCallback; -    void*                   mUserData; -}; - -} // end namespace android - -#endif /*SOUNDPOOL_H_*/ diff --git a/include/media/ToneGenerator.h b/include/media/ToneGenerator.h index 98c4332..8406ed6 100644 --- a/include/media/ToneGenerator.h +++ b/include/media/ToneGenerator.h @@ -17,11 +17,12 @@  #ifndef ANDROID_TONEGENERATOR_H_  #define ANDROID_TONEGENERATOR_H_ -#include <utils/RefBase.h> -#include <utils/KeyedVector.h> -#include <utils/threads.h>  #include <media/AudioSystem.h>  #include <media/AudioTrack.h> +#include <utils/Compat.h> +#include <utils/KeyedVector.h> +#include <utils/RefBase.h> +#include <utils/threads.h>  namespace android { @@ -207,7 +208,7 @@ private:      static const unsigned int TONEGEN_MAX_WAVES = 3;     // Maximun number of sine waves in a tone segment      static const unsigned int TONEGEN_MAX_SEGMENTS = 12;  // Maximun number of segments in a tone descriptor      static const unsigned int TONEGEN_INF = 0xFFFFFFFF;  // Represents infinite time duration -    static const float TONEGEN_GAIN = 0.9;  // Default gain passed to  WaveGenerator(). +    static const CONSTEXPR float TONEGEN_GAIN = 0.9;  // Default gain passed to  WaveGenerator().      // ToneDescriptor class contains all parameters needed to generate a tone:      //    - The array waveFreq[]: diff --git a/include/media/mediaplayer.h b/include/media/mediaplayer.h index 9cc208e..5830933 100644 --- a/include/media/mediaplayer.h +++ b/include/media/mediaplayer.h @@ -232,17 +232,6 @@ public:              bool            isLooping();              status_t        setVolume(float leftVolume, float rightVolume);              void            notify(int msg, int ext1, int ext2, const Parcel *obj = NULL); -    static  status_t        decode( -            const sp<IMediaHTTPService> &httpService, -            const char* url, -            uint32_t *pSampleRate, -            int* pNumChannels, -            audio_format_t* pFormat, -            const sp<IMemoryHeap>& heap, -            size_t *pSize); -    static  status_t        decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, -                                   int* pNumChannels, audio_format_t* pFormat, -                                   const sp<IMemoryHeap>& heap, size_t *pSize);              status_t        invoke(const Parcel& request, Parcel *reply);              status_t        setMetadataFilter(const Parcel& filter);              status_t        getMetadata(bool update_only, bool apply_filter, Parcel *metadata); diff --git a/include/media/stagefright/AACWriter.h b/include/media/stagefright/AACWriter.h index df1b053..d22707a 100644 --- a/include/media/stagefright/AACWriter.h +++ b/include/media/stagefright/AACWriter.h @@ -17,6 +17,7 @@  #ifndef AAC_WRITER_H_  #define AAC_WRITER_H_ +#include "foundation/ABase.h"  #include <media/stagefright/MediaWriter.h>  #include <utils/threads.h> diff --git a/include/media/stagefright/ACodec.h b/include/media/stagefright/ACodec.h index 29c9002..7825508 100644 --- a/include/media/stagefright/ACodec.h +++ b/include/media/stagefright/ACodec.h @@ -291,7 +291,7 @@ private:              OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE desiredFormat);      status_t setupAMRCodec(bool encoder, bool isWAMR, int32_t bitRate); -    status_t setupG711Codec(bool encoder, int32_t numChannels); +    status_t setupG711Codec(bool encoder, int32_t sampleRate, int32_t numChannels);      status_t setupFlacCodec(              bool encoder, int32_t numChannels, int32_t sampleRate, int32_t compressionLevel); diff --git a/include/media/stagefright/ClockEstimator.h b/include/media/stagefright/ClockEstimator.h index 2fd6e75..1455b7f 100644 --- a/include/media/stagefright/ClockEstimator.h +++ b/include/media/stagefright/ClockEstimator.h @@ -19,7 +19,7 @@  #define CLOCK_ESTIMATOR_H_ - +#include "foundation/ABase.h"  #include <utils/RefBase.h>  #include <utils/Vector.h> diff --git a/include/media/stagefright/MediaDefs.h b/include/media/stagefright/MediaDefs.h index 13695d5..a0036e0 100644 --- a/include/media/stagefright/MediaDefs.h +++ b/include/media/stagefright/MediaDefs.h @@ -36,6 +36,7 @@ extern const char *MEDIA_MIMETYPE_AUDIO_AMR_WB;  extern const char *MEDIA_MIMETYPE_AUDIO_MPEG;           // layer III  extern const char *MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_I;  extern const char *MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_II; +extern const char *MEDIA_MIMETYPE_AUDIO_MIDI;  extern const char *MEDIA_MIMETYPE_AUDIO_AAC;  extern const char *MEDIA_MIMETYPE_AUDIO_QCELP;  extern const char *MEDIA_MIMETYPE_AUDIO_VORBIS; diff --git a/include/media/stagefright/MediaMuxer.h b/include/media/stagefright/MediaMuxer.h index bbe4303..9da98d9 100644 --- a/include/media/stagefright/MediaMuxer.h +++ b/include/media/stagefright/MediaMuxer.h @@ -22,6 +22,8 @@  #include <utils/Vector.h>  #include <utils/threads.h> +#include "foundation/ABase.h" +  namespace android {  struct ABuffer; diff --git a/include/media/stagefright/OMXCodec.h b/include/media/stagefright/OMXCodec.h index e341160..84b1b1a 100644 --- a/include/media/stagefright/OMXCodec.h +++ b/include/media/stagefright/OMXCodec.h @@ -250,7 +250,7 @@ private:      status_t setAC3Format(int32_t numChannels, int32_t sampleRate); -    void setG711Format(int32_t numChannels); +    void setG711Format(int32_t sampleRate, int32_t numChannels);      status_t setVideoPortFormatType(              OMX_U32 portIndex, diff --git a/include/media/stagefright/SurfaceMediaSource.h b/include/media/stagefright/SurfaceMediaSource.h index d15a226..2177c00 100644 --- a/include/media/stagefright/SurfaceMediaSource.h +++ b/include/media/stagefright/SurfaceMediaSource.h @@ -25,6 +25,8 @@  #include <media/stagefright/MediaSource.h>  #include <media/stagefright/MediaBuffer.h> +#include "foundation/ABase.h" +  namespace android {  // ---------------------------------------------------------------------------- @@ -233,7 +235,7 @@ private:      Condition mMediaBuffersAvailableCondition;      // Avoid copying and equating and default constructor -    DISALLOW_IMPLICIT_CONSTRUCTORS(SurfaceMediaSource); +    DISALLOW_EVIL_CONSTRUCTORS(SurfaceMediaSource);  };  // ---------------------------------------------------------------------------- diff --git a/include/media/stagefright/foundation/AHandler.h b/include/media/stagefright/foundation/AHandler.h index b008b54..41ade77 100644 --- a/include/media/stagefright/foundation/AHandler.h +++ b/include/media/stagefright/foundation/AHandler.h @@ -19,6 +19,7 @@  #define A_HANDLER_H_  #include <media/stagefright/foundation/ALooper.h> +#include <utils/KeyedVector.h>  #include <utils/RefBase.h>  namespace android { @@ -27,7 +28,8 @@ struct AMessage;  struct AHandler : public RefBase {      AHandler() -        : mID(0) { +        : mID(0), +          mMessageCounter(0) {      }      ALooper::handler_id id() const { @@ -48,6 +50,9 @@ private:          mID = id;      } +    uint32_t mMessageCounter; +    KeyedVector<uint32_t, uint32_t> mMessages; +      DISALLOW_EVIL_CONSTRUCTORS(AHandler);  }; diff --git a/include/media/stagefright/foundation/ALooperRoster.h b/include/media/stagefright/foundation/ALooperRoster.h index 4d76b64..a0be8eb 100644 --- a/include/media/stagefright/foundation/ALooperRoster.h +++ b/include/media/stagefright/foundation/ALooperRoster.h @@ -20,6 +20,7 @@  #include <media/stagefright/foundation/ALooper.h>  #include <utils/KeyedVector.h> +#include <utils/String16.h>  namespace android { @@ -42,6 +43,8 @@ struct ALooperRoster {      sp<ALooper> findLooper(ALooper::handler_id handlerID); +    void dump(int fd, const Vector<String16>& args); +  private:      struct HandlerInfo {          wp<ALooper> mLooper; diff --git a/include/media/stagefright/foundation/AString.h b/include/media/stagefright/foundation/AString.h index 7c98699..822dbb3 100644 --- a/include/media/stagefright/foundation/AString.h +++ b/include/media/stagefright/foundation/AString.h @@ -23,7 +23,7 @@  namespace android { -struct String8; +class String8;  struct Parcel;  struct AString { @@ -102,7 +102,7 @@ private:      void makeMutable();  }; -AString StringPrintf(const char *format, ...); +AString AStringPrintf(const char *format, ...);  }  // namespace android diff --git a/include/ndk/NdkMediaDrm.h b/include/ndk/NdkMediaDrm.h index 10afdd9..3c312a9 100644 --- a/include/ndk/NdkMediaDrm.h +++ b/include/ndk/NdkMediaDrm.h @@ -327,24 +327,24 @@ media_status_t AMediaDrm_releaseSecureStops(AMediaDrm *,  /**   * String property name: identifies the maker of the DRM engine plugin   */ -const char *PROPERTY_VENDOR = "vendor"; +#define PROPERTY_VENDOR "vendor"  /**   * String property name: identifies the version of the DRM engine plugin   */ -const char *PROPERTY_VERSION = "version"; +#define PROPERTY_VERSION "version"  /**   * String property name: describes the DRM engine plugin   */ -const char *PROPERTY_DESCRIPTION = "description"; +#define PROPERTY_DESCRIPTION "description"  /**   * String property name: a comma-separated list of cipher and mac algorithms   * supported by CryptoSession.  The list may be empty if the DRM engine   * plugin does not support CryptoSession operations.   */ -const char *PROPERTY_ALGORITHMS = "algorithms"; +#define PROPERTY_ALGORITHMS "algorithms"  /**   * Read a DRM engine plugin String property value, given the property name string. @@ -361,7 +361,7 @@ media_status_t AMediaDrm_getPropertyString(AMediaDrm *, const char *propertyName   * Byte array property name: the device unique identifier is established during   * device provisioning and provides a means of uniquely identifying each device.   */ -const char *PROPERTY_DEVICE_UNIQUE_ID = "deviceUniqueId"; +#define PROPERTY_DEVICE_UNIQUE_ID "deviceUniqueId"  /**   * Read a DRM engine plugin byte array property value, given the property name string. diff --git a/media/common_time/ICommonClock.cpp b/media/common_time/ICommonClock.cpp index 25ae69e..19b7d6e 100644 --- a/media/common_time/ICommonClock.cpp +++ b/media/common_time/ICommonClock.cpp @@ -206,7 +206,7 @@ class BpCommonClock : public BpInterface<ICommonClock>              const sp<ICommonClockListener>& listener) {          Parcel data, reply;          data.writeInterfaceToken(ICommonClock::getInterfaceDescriptor()); -        data.writeStrongBinder(listener->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(listener));          status_t status = remote()->transact(REGISTER_LISTENER, data, &reply); @@ -221,7 +221,7 @@ class BpCommonClock : public BpInterface<ICommonClock>              const sp<ICommonClockListener>& listener) {          Parcel data, reply;          data.writeInterfaceToken(ICommonClock::getInterfaceDescriptor()); -        data.writeStrongBinder(listener->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(listener));          status_t status = remote()->transact(UNREGISTER_LISTENER, data, &reply);          if (status == OK) { diff --git a/media/img_utils/include/img_utils/TiffEntryImpl.h b/media/img_utils/include/img_utils/TiffEntryImpl.h index f5ccb5e..c73e231 100644 --- a/media/img_utils/include/img_utils/TiffEntryImpl.h +++ b/media/img_utils/include/img_utils/TiffEntryImpl.h @@ -147,7 +147,7 @@ status_t TiffEntryImpl<T>::writeTagInfo(uint32_t offset, /*out*/EndianOutput* ou  }  template<typename T> -status_t TiffEntryImpl<T>::writeData(uint32_t offset, EndianOutput* out) const { +status_t TiffEntryImpl<T>::writeData(uint32_t /*offset*/, EndianOutput* out) const {      status_t ret = OK;      // Some tags have fixed-endian value output diff --git a/media/img_utils/src/FileInput.cpp b/media/img_utils/src/FileInput.cpp index 498e715..4c85a51 100644 --- a/media/img_utils/src/FileInput.cpp +++ b/media/img_utils/src/FileInput.cpp @@ -78,7 +78,7 @@ status_t FileInput::close() {          ret = BAD_VALUE;      }      mOpen = false; -    return OK; +    return ret;  }  } /*namespace img_utils*/ diff --git a/media/img_utils/src/FileOutput.cpp b/media/img_utils/src/FileOutput.cpp index ce763ff..0346762 100644 --- a/media/img_utils/src/FileOutput.cpp +++ b/media/img_utils/src/FileOutput.cpp @@ -72,7 +72,7 @@ status_t FileOutput::close() {          ret = BAD_VALUE;      }      mOpen = false; -    return OK; +    return ret;  }  } /*namespace img_utils*/ diff --git a/media/img_utils/src/TiffWriter.cpp b/media/img_utils/src/TiffWriter.cpp index ac41734..a6f9218 100644 --- a/media/img_utils/src/TiffWriter.cpp +++ b/media/img_utils/src/TiffWriter.cpp @@ -106,7 +106,6 @@ status_t TiffWriter::write(Output* out, StripSource** sources, size_t sourcesCou      for (size_t i = 0; i < offVecSize; ++i) {          uint32_t ifdKey = offsetVector.keyAt(i); -        uint32_t nextOffset = offsetVector[i];          uint32_t sizeToWrite = mNamedIfds[ifdKey]->getStripSize();          bool found = false;          for (size_t j = 0; j < sourcesCount; ++j) { @@ -124,7 +123,7 @@ status_t TiffWriter::write(Output* out, StripSource** sources, size_t sourcesCou              ALOGE("%s: No stream for byte strips for IFD %u", __FUNCTION__, ifdKey);              return BAD_VALUE;          } -        assert(nextOffset == endOut.getCurrentOffset()); +        assert(offsetVector[i] == endOut.getCurrentOffset());      }      return ret; diff --git a/media/libcpustats/ThreadCpuUsage.cpp b/media/libcpustats/ThreadCpuUsage.cpp index cfdcb51..b43b36c 100644 --- a/media/libcpustats/ThreadCpuUsage.cpp +++ b/media/libcpustats/ThreadCpuUsage.cpp @@ -19,6 +19,7 @@  #include <errno.h>  #include <stdlib.h> +#include <string.h>  #include <time.h>  #include <utils/Log.h> @@ -74,7 +75,6 @@ bool ThreadCpuUsage::setEnabled(bool isEnabled)  bool ThreadCpuUsage::sampleAndEnable(double& ns)  { -    bool ret;      bool wasEverEnabled = mWasEverEnabled;      if (enable()) {          // already enabled, so add a new sample relative to previous diff --git a/media/libeffects/loudness/Android.mk b/media/libeffects/loudness/Android.mk index edf964e..55d0611 100644 --- a/media/libeffects/loudness/Android.mk +++ b/media/libeffects/loudness/Android.mk @@ -12,16 +12,11 @@ LOCAL_CFLAGS+= -O2 -fvisibility=hidden  LOCAL_SHARED_LIBRARIES := \  	libcutils \  	liblog \ -	libstlport  LOCAL_MODULE_RELATIVE_PATH := soundfx  LOCAL_MODULE:= libldnhncr  LOCAL_C_INCLUDES := \  	$(call include-path-for, audio-effects) \ -	bionic \ -	bionic/libstdc++/include \ -	external/stlport/stlport -  include $(BUILD_SHARED_LIBRARY) diff --git a/media/libeffects/proxy/Android.mk b/media/libeffects/proxy/Android.mk index b438796..2ba452e 100644 --- a/media/libeffects/proxy/Android.mk +++ b/media/libeffects/proxy/Android.mk @@ -28,7 +28,6 @@ LOCAL_SHARED_LIBRARIES := liblog libcutils libutils libdl libeffects  LOCAL_C_INCLUDES := \          system/media/audio_effects/include \ -        bionic/libc/include \          frameworks/av/media/libeffects/factory  include $(BUILD_SHARED_LIBRARY) diff --git a/media/libeffects/testlibs/Android.mk_ b/media/libeffects/testlibs/Android.mk_ index 672ebba..14c373f 100644 --- a/media/libeffects/testlibs/Android.mk_ +++ b/media/libeffects/testlibs/Android.mk_ @@ -3,24 +3,18 @@ LOCAL_PATH:= $(call my-dir)  # Test Reverb library  include $(CLEAR_VARS) -LOCAL_SRC_FILES:= \ +LOCAL_SRC_FILES := \  	EffectReverb.c.arm \  	EffectsMath.c.arm -LOCAL_CFLAGS+= -O2 + +LOCAL_CFLAGS := -O2  LOCAL_SHARED_LIBRARIES := \ -	libcutils +	libcutils \ +	libdl  LOCAL_MODULE_RELATIVE_PATH := soundfx -LOCAL_MODULE:= libreverbtest - -ifeq ($(TARGET_OS)-$(TARGET_SIMULATOR),linux-true) -LOCAL_LDLIBS += -ldl -endif - -ifneq ($(TARGET_SIMULATOR),true) -LOCAL_SHARED_LIBRARIES += libdl -endif +LOCAL_MODULE := libreverbtest  LOCAL_C_INCLUDES := \  	$(call include-path-for, audio-effects) \ @@ -33,7 +27,7 @@ include $(BUILD_SHARED_LIBRARY)  # Test Equalizer library  include $(CLEAR_VARS) -LOCAL_SRC_FILES:= \ +LOCAL_SRC_FILES := \  	EffectsMath.c.arm \  	EffectEqualizer.cpp \  	AudioBiquadFilter.cpp.arm \ @@ -42,21 +36,14 @@ LOCAL_SRC_FILES:= \  	AudioShelvingFilter.cpp.arm \  	AudioEqualizer.cpp.arm -LOCAL_CFLAGS+= -O2 +LOCAL_CFLAGS := -O2  LOCAL_SHARED_LIBRARIES := \ -	libcutils +	libcutils \ +	libdl  LOCAL_MODULE_RELATIVE_PATH := soundfx -LOCAL_MODULE:= libequalizertest - -ifeq ($(TARGET_OS)-$(TARGET_SIMULATOR),linux-true) -LOCAL_LDLIBS += -ldl -endif - -ifneq ($(TARGET_SIMULATOR),true) -LOCAL_SHARED_LIBRARIES += libdl -endif +LOCAL_MODULE := libequalizertest  LOCAL_C_INCLUDES := \  	$(call include-path-for, graphics corecg) \ diff --git a/media/libmedia/Android.mk b/media/libmedia/Android.mk index a2e0909..6c585fb 100644 --- a/media/libmedia/Android.mk +++ b/media/libmedia/Android.mk @@ -42,6 +42,7 @@ LOCAL_SRC_FILES:= \      mediarecorder.cpp \      IMediaMetadataRetriever.cpp \      mediametadataretriever.cpp \ +    MidiIoWrapper.cpp \      ToneGenerator.cpp \      JetPlayer.cpp \      IOMX.cpp \ @@ -57,8 +58,6 @@ LOCAL_SRC_FILES:= \      AudioEffect.cpp \      Visualizer.cpp \      MemoryLeakTrackUtil.cpp \ -    SoundPool.cpp \ -    SoundPoolThread.cpp \      StringArray.cpp \      AudioPolicy.cpp @@ -75,12 +74,12 @@ LOCAL_WHOLE_STATIC_LIBRARIES := libmedia_helper  LOCAL_MODULE:= libmedia +LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk +  LOCAL_C_INCLUDES := \      $(TOP)/frameworks/native/include/media/openmax \      $(TOP)/frameworks/av/include/media/ \      $(TOP)/frameworks/av/media/libstagefright \ -    $(TOP)/external/icu/icu4c/source/common \ -    $(TOP)/external/icu/icu4c/source/i18n \      $(call include-path-for, audio-effects) \      $(call include-path-for, audio-utils) @@ -88,8 +87,6 @@ include $(BUILD_SHARED_LIBRARY)  include $(CLEAR_VARS) -# for <cutils/atomic-inline.h> -LOCAL_CFLAGS += -DANDROID_SMP=$(if $(findstring true,$(TARGET_CPU_SMP)),1,0)  LOCAL_SRC_FILES += SingleStateQueue.cpp  LOCAL_CFLAGS += -DSINGLE_STATE_QUEUE_INSTANTIATIONS='"SingleStateQueueInstantiations.cpp"' diff --git a/media/libmedia/AudioEffect.cpp b/media/libmedia/AudioEffect.cpp index 0d5d7e4..af103c1 100644 --- a/media/libmedia/AudioEffect.cpp +++ b/media/libmedia/AudioEffect.cpp @@ -150,7 +150,7 @@ status_t AudioEffect::set(const effect_uuid_t *type,      int bufOffset = ((sizeof(effect_param_cblk_t) - 1) / sizeof(int) + 1) * sizeof(int);      mCblk->buffer = (uint8_t *)mCblk + bufOffset; -    iEffect->asBinder()->linkToDeath(mIEffectClient); +    IInterface::asBinder(iEffect)->linkToDeath(mIEffectClient);      mClientPid = IPCThreadState::self()->getCallingPid();      ALOGV("set() %p OK effect: %s id: %d status %d enabled %d pid %d", this, mDescriptor.name, mId,              mStatus, mEnabled, mClientPid); @@ -173,7 +173,7 @@ AudioEffect::~AudioEffect()          }          if (mIEffect != NULL) {              mIEffect->disconnect(); -            mIEffect->asBinder()->unlinkToDeath(mIEffectClient); +            IInterface::asBinder(mIEffect)->unlinkToDeath(mIEffectClient);          }          IPCThreadState::self()->flushCommands();      } diff --git a/media/libmedia/AudioRecord.cpp b/media/libmedia/AudioRecord.cpp index ca3832d..07ca14f 100644 --- a/media/libmedia/AudioRecord.cpp +++ b/media/libmedia/AudioRecord.cpp @@ -107,7 +107,7 @@ AudioRecord::~AudioRecord()              mAudioRecordThread->requestExitAndWait();              mAudioRecordThread.clear();          } -        mAudioRecord->asBinder()->unlinkToDeath(mDeathNotifier, this); +        IInterface::asBinder(mAudioRecord)->unlinkToDeath(mDeathNotifier, this);          mAudioRecord.clear();          mCblkMemory.clear();          mBufferMemory.clear(); @@ -525,7 +525,7 @@ status_t AudioRecord::openRecord_l(size_t epoch)      // invariant that mAudioRecord != 0 is true only after set() returns successfully      if (mAudioRecord != 0) { -        mAudioRecord->asBinder()->unlinkToDeath(mDeathNotifier, this); +        IInterface::asBinder(mAudioRecord)->unlinkToDeath(mDeathNotifier, this);          mDeathNotifier.clear();      }      mAudioRecord = record; @@ -575,7 +575,7 @@ status_t AudioRecord::openRecord_l(size_t epoch)      mProxy->setMinimum(mNotificationFramesAct);      mDeathNotifier = new DeathNotifier(this); -    mAudioRecord->asBinder()->linkToDeath(mDeathNotifier, this); +    IInterface::asBinder(mAudioRecord)->linkToDeath(mDeathNotifier, this);      return NO_ERROR;      } diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp index 389aacc..735db5c 100644 --- a/media/libmedia/AudioTrack.cpp +++ b/media/libmedia/AudioTrack.cpp @@ -194,7 +194,7 @@ AudioTrack::~AudioTrack()              mAudioTrackThread->requestExitAndWait();              mAudioTrackThread.clear();          } -        mAudioTrack->asBinder()->unlinkToDeath(mDeathNotifier, this); +        IInterface::asBinder(mAudioTrack)->unlinkToDeath(mDeathNotifier, this);          mAudioTrack.clear();          mCblkMemory.clear();          mSharedBuffer.clear(); @@ -1138,7 +1138,7 @@ status_t AudioTrack::createTrack_l()      }      // invariant that mAudioTrack != 0 is true only after set() returns successfully      if (mAudioTrack != 0) { -        mAudioTrack->asBinder()->unlinkToDeath(mDeathNotifier, this); +        IInterface::asBinder(mAudioTrack)->unlinkToDeath(mDeathNotifier, this);          mDeathNotifier.clear();      }      mAudioTrack = track; @@ -1245,7 +1245,7 @@ status_t AudioTrack::createTrack_l()      mProxy->setMinimum(mNotificationFramesAct);      mDeathNotifier = new DeathNotifier(this); -    mAudioTrack->asBinder()->linkToDeath(mDeathNotifier, this); +    IInterface::asBinder(mAudioTrack)->linkToDeath(mDeathNotifier, this);      return NO_ERROR;      } diff --git a/media/libmedia/IAudioFlinger.cpp b/media/libmedia/IAudioFlinger.cpp index d7ca425..3e5c883 100644 --- a/media/libmedia/IAudioFlinger.cpp +++ b/media/libmedia/IAudioFlinger.cpp @@ -121,7 +121,7 @@ public:          // haveSharedBuffer          if (sharedBuffer != 0) {              data.writeInt32(true); -            data.writeStrongBinder(sharedBuffer->asBinder()); +            data.writeStrongBinder(IInterface::asBinder(sharedBuffer));          } else {              data.writeInt32(false);          } @@ -421,7 +421,7 @@ public:      {          Parcel data, reply;          data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); -        data.writeStrongBinder(client->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(client));          remote()->transact(REGISTER_CLIENT, data, &reply);      } @@ -718,7 +718,7 @@ public:          data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor());          data.write(pDesc, sizeof(effect_descriptor_t)); -        data.writeStrongBinder(client->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(client));          data.writeInt32(priority);          data.writeInt32((int32_t) output);          data.writeInt32(sessionId); @@ -941,7 +941,7 @@ status_t BnAudioFlinger::onTransact(              reply->writeInt32(flags);              reply->writeInt32(sessionId);              reply->writeInt32(status); -            reply->writeStrongBinder(track->asBinder()); +            reply->writeStrongBinder(IInterface::asBinder(track));              return NO_ERROR;          } break;          case OPEN_RECORD: { @@ -968,9 +968,9 @@ status_t BnAudioFlinger::onTransact(              reply->writeInt32(sessionId);              reply->writeInt64(notificationFrames);              reply->writeInt32(status); -            reply->writeStrongBinder(record->asBinder()); -            reply->writeStrongBinder(cblk->asBinder()); -            reply->writeStrongBinder(buffers->asBinder()); +            reply->writeStrongBinder(IInterface::asBinder(record)); +            reply->writeStrongBinder(IInterface::asBinder(cblk)); +            reply->writeStrongBinder(IInterface::asBinder(buffers));              return NO_ERROR;          } break;          case SAMPLE_RATE: { @@ -1256,7 +1256,7 @@ status_t BnAudioFlinger::onTransact(              reply->writeInt32(status);              reply->writeInt32(id);              reply->writeInt32(enabled); -            reply->writeStrongBinder(effect->asBinder()); +            reply->writeStrongBinder(IInterface::asBinder(effect));              reply->write(&desc, sizeof(effect_descriptor_t));              return NO_ERROR;          } break; diff --git a/media/libmedia/IAudioPolicyService.cpp b/media/libmedia/IAudioPolicyService.cpp index 12efa8a..cfb28a9 100644 --- a/media/libmedia/IAudioPolicyService.cpp +++ b/media/libmedia/IAudioPolicyService.cpp @@ -630,7 +630,7 @@ public:      {          Parcel data, reply;          data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); -        data.writeStrongBinder(client->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(client));          remote()->transact(REGISTER_CLIENT, data, &reply);      } diff --git a/media/libmedia/IAudioTrack.cpp b/media/libmedia/IAudioTrack.cpp index 265bb1b..df209fd 100644 --- a/media/libmedia/IAudioTrack.cpp +++ b/media/libmedia/IAudioTrack.cpp @@ -137,7 +137,7 @@ public:                                        int64_t pts) {          Parcel data, reply;          data.writeInterfaceToken(IAudioTrack::getInterfaceDescriptor()); -        data.writeStrongBinder(buffer->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(buffer));          data.writeInt64(pts);          status_t status = remote()->transact(QUEUE_TIMED_BUFFER,                                               data, &reply); @@ -207,7 +207,7 @@ status_t BnAudioTrack::onTransact(      switch (code) {          case GET_CBLK: {              CHECK_INTERFACE(IAudioTrack, data, reply); -            reply->writeStrongBinder(getCblk()->asBinder()); +            reply->writeStrongBinder(IInterface::asBinder(getCblk()));              return NO_ERROR;          } break;          case START: { @@ -241,7 +241,7 @@ status_t BnAudioTrack::onTransact(              status_t status = allocateTimedBuffer(data.readInt64(), &buffer);              reply->writeInt32(status);              if (status == NO_ERROR) { -                reply->writeStrongBinder(buffer->asBinder()); +                reply->writeStrongBinder(IInterface::asBinder(buffer));              }              return NO_ERROR;          } break; diff --git a/media/libmedia/IDrm.cpp b/media/libmedia/IDrm.cpp index 7e74de9..b08fa82 100644 --- a/media/libmedia/IDrm.cpp +++ b/media/libmedia/IDrm.cpp @@ -450,7 +450,7 @@ struct BpDrm : public BpInterface<IDrm> {      virtual status_t setListener(const sp<IDrmClient>& listener) {          Parcel data, reply;          data.writeInterfaceToken(IDrm::getInterfaceDescriptor()); -        data.writeStrongBinder(listener->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(listener));          remote()->transact(SET_LISTENER, data, &reply);          return reply.readInt32();      } diff --git a/media/libmedia/IEffect.cpp b/media/libmedia/IEffect.cpp index b94012a..c2fff78 100644 --- a/media/libmedia/IEffect.cpp +++ b/media/libmedia/IEffect.cpp @@ -190,7 +190,7 @@ status_t BnEffect::onTransact(          case GET_CBLK: {              CHECK_INTERFACE(IEffect, data, reply); -            reply->writeStrongBinder(getCblk()->asBinder()); +            reply->writeStrongBinder(IInterface::asBinder(getCblk()));              return NO_ERROR;          } break; diff --git a/media/libmedia/IHDCP.cpp b/media/libmedia/IHDCP.cpp index 9d93320..79944ee 100644 --- a/media/libmedia/IHDCP.cpp +++ b/media/libmedia/IHDCP.cpp @@ -65,7 +65,7 @@ struct BpHDCP : public BpInterface<IHDCP> {      virtual status_t setObserver(const sp<IHDCPObserver> &observer) {          Parcel data, reply;          data.writeInterfaceToken(IHDCP::getInterfaceDescriptor()); -        data.writeStrongBinder(observer->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(observer));          remote()->transact(HDCP_SET_OBSERVER, data, &reply);          return reply.readInt32();      } diff --git a/media/libmedia/IMediaDeathNotifier.cpp b/media/libmedia/IMediaDeathNotifier.cpp index 10b4934..38e9ca0 100644 --- a/media/libmedia/IMediaDeathNotifier.cpp +++ b/media/libmedia/IMediaDeathNotifier.cpp @@ -104,7 +104,7 @@ IMediaDeathNotifier::DeathNotifier::~DeathNotifier()      Mutex::Autolock _l(sServiceLock);      sObitRecipients.clear();      if (sMediaPlayerService != 0) { -        sMediaPlayerService->asBinder()->unlinkToDeath(this); +        IInterface::asBinder(sMediaPlayerService)->unlinkToDeath(this);      }  } diff --git a/media/libmedia/IMediaLogService.cpp b/media/libmedia/IMediaLogService.cpp index 8a66c7c..a4af7b7 100644 --- a/media/libmedia/IMediaLogService.cpp +++ b/media/libmedia/IMediaLogService.cpp @@ -42,7 +42,7 @@ public:      virtual void    registerWriter(const sp<IMemory>& shared, size_t size, const char *name) {          Parcel data, reply;          data.writeInterfaceToken(IMediaLogService::getInterfaceDescriptor()); -        data.writeStrongBinder(shared->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(shared));          data.writeInt64((int64_t) size);          data.writeCString(name);          status_t status = remote()->transact(REGISTER_WRITER, data, &reply); @@ -52,7 +52,7 @@ public:      virtual void    unregisterWriter(const sp<IMemory>& shared) {          Parcel data, reply;          data.writeInterfaceToken(IMediaLogService::getInterfaceDescriptor()); -        data.writeStrongBinder(shared->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(shared));          status_t status = remote()->transact(UNREGISTER_WRITER, data, &reply);          // FIXME ignores status      } diff --git a/media/libmedia/IMediaMetadataRetriever.cpp b/media/libmedia/IMediaMetadataRetriever.cpp index 38f717c..aa2665a 100644 --- a/media/libmedia/IMediaMetadataRetriever.cpp +++ b/media/libmedia/IMediaMetadataRetriever.cpp @@ -95,7 +95,7 @@ public:          data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());          data.writeInt32(httpService != NULL);          if (httpService != NULL) { -            data.writeStrongBinder(httpService->asBinder()); +            data.writeStrongBinder(IInterface::asBinder(httpService));          }          data.writeCString(srcUrl); @@ -246,7 +246,7 @@ status_t BnMediaMetadataRetriever::onTransact(              sp<IMemory> bitmap = getFrameAtTime(timeUs, option);              if (bitmap != 0) {  // Don't send NULL across the binder interface                  reply->writeInt32(NO_ERROR); -                reply->writeStrongBinder(bitmap->asBinder()); +                reply->writeStrongBinder(IInterface::asBinder(bitmap));              } else {                  reply->writeInt32(UNKNOWN_ERROR);              } @@ -263,7 +263,7 @@ status_t BnMediaMetadataRetriever::onTransact(              sp<IMemory> albumArt = extractAlbumArt();              if (albumArt != 0) {  // Don't send NULL across the binder interface                  reply->writeInt32(NO_ERROR); -                reply->writeStrongBinder(albumArt->asBinder()); +                reply->writeStrongBinder(IInterface::asBinder(albumArt));              } else {                  reply->writeInt32(UNKNOWN_ERROR);              } diff --git a/media/libmedia/IMediaPlayer.cpp b/media/libmedia/IMediaPlayer.cpp index d778d05..7f3e5cc 100644 --- a/media/libmedia/IMediaPlayer.cpp +++ b/media/libmedia/IMediaPlayer.cpp @@ -85,7 +85,7 @@ public:          data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());          data.writeInt32(httpService != NULL);          if (httpService != NULL) { -            data.writeStrongBinder(httpService->asBinder()); +            data.writeStrongBinder(IInterface::asBinder(httpService));          }          data.writeCString(url);          if (headers == NULL) { @@ -115,7 +115,7 @@ public:      status_t setDataSource(const sp<IStreamSource> &source) {          Parcel data, reply;          data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor()); -        data.writeStrongBinder(source->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(source));          remote()->transact(SET_DATA_SOURCE_STREAM, data, &reply);          return reply.readInt32();      } @@ -125,7 +125,7 @@ public:      {          Parcel data, reply;          data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor()); -        sp<IBinder> b(bufferProducer->asBinder()); +        sp<IBinder> b(IInterface::asBinder(bufferProducer));          data.writeStrongBinder(b);          remote()->transact(SET_VIDEO_SURFACETEXTURE, data, &reply);          return reply.readInt32(); @@ -323,7 +323,7 @@ public:      status_t setNextPlayer(const sp<IMediaPlayer>& player) {          Parcel data, reply;          data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor()); -        sp<IBinder> b(player->asBinder()); +        sp<IBinder> b(IInterface::asBinder(player));          data.writeStrongBinder(b);          remote()->transact(SET_NEXT_PLAYER, data, &reply);          return reply.readInt32(); diff --git a/media/libmedia/IMediaPlayerService.cpp b/media/libmedia/IMediaPlayerService.cpp index 2e02d17..feea267 100644 --- a/media/libmedia/IMediaPlayerService.cpp +++ b/media/libmedia/IMediaPlayerService.cpp @@ -39,8 +39,6 @@ namespace android {  enum {      CREATE = IBinder::FIRST_CALL_TRANSACTION, -    DECODE_URL, -    DECODE_FD,      CREATE_MEDIA_RECORDER,      CREATE_METADATA_RETRIEVER,      GET_OMX, @@ -73,7 +71,7 @@ public:              const sp<IMediaPlayerClient>& client, int audioSessionId) {          Parcel data, reply;          data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor()); -        data.writeStrongBinder(client->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(client));          data.writeInt32(audioSessionId);          remote()->transact(CREATE, data, &reply); @@ -88,59 +86,6 @@ public:          return interface_cast<IMediaRecorder>(reply.readStrongBinder());      } -    virtual status_t decode( -            const sp<IMediaHTTPService> &httpService, -            const char* url, -            uint32_t *pSampleRate, -            int* pNumChannels, -            audio_format_t* pFormat, -            const sp<IMemoryHeap>& heap, -            size_t *pSize) -    { -        Parcel data, reply; -        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor()); -        data.writeInt32(httpService != NULL); -        if (httpService != NULL) { -            data.writeStrongBinder(httpService->asBinder()); -        } -        data.writeCString(url); -        data.writeStrongBinder(heap->asBinder()); -        status_t status = remote()->transact(DECODE_URL, data, &reply); -        if (status == NO_ERROR) { -            status = (status_t)reply.readInt32(); -            if (status == NO_ERROR) { -                *pSampleRate = uint32_t(reply.readInt32()); -                *pNumChannels = reply.readInt32(); -                *pFormat = (audio_format_t)reply.readInt32(); -                *pSize = (size_t)reply.readInt32(); -            } -        } -        return status; -    } - -    virtual status_t decode(int fd, int64_t offset, int64_t length, uint32_t *pSampleRate, -                               int* pNumChannels, audio_format_t* pFormat, -                               const sp<IMemoryHeap>& heap, size_t *pSize) -    { -        Parcel data, reply; -        data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor()); -        data.writeFileDescriptor(fd); -        data.writeInt64(offset); -        data.writeInt64(length); -        data.writeStrongBinder(heap->asBinder()); -        status_t status = remote()->transact(DECODE_FD, data, &reply); -        if (status == NO_ERROR) { -            status = (status_t)reply.readInt32(); -            if (status == NO_ERROR) { -                *pSampleRate = uint32_t(reply.readInt32()); -                *pNumChannels = reply.readInt32(); -                *pFormat = (audio_format_t)reply.readInt32(); -                *pSize = (size_t)reply.readInt32(); -            } -        } -        return status; -    } -      virtual sp<IOMX> getOMX() {          Parcel data, reply;          data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor()); @@ -188,7 +133,7 @@ public:      {          Parcel data, reply;          data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor()); -        data.writeStrongBinder(client->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(client));          data.writeString8(iface);          remote()->transact(LISTEN_FOR_REMOTE_DISPLAY, data, &reply);          return interface_cast<IRemoteDisplay>(reply.readStrongBinder()); @@ -216,95 +161,44 @@ status_t BnMediaPlayerService::onTransact(                  interface_cast<IMediaPlayerClient>(data.readStrongBinder());              int audioSessionId = data.readInt32();              sp<IMediaPlayer> player = create(client, audioSessionId); -            reply->writeStrongBinder(player->asBinder()); -            return NO_ERROR; -        } break; -        case DECODE_URL: { -            CHECK_INTERFACE(IMediaPlayerService, data, reply); -            sp<IMediaHTTPService> httpService; -            if (data.readInt32()) { -                httpService = -                    interface_cast<IMediaHTTPService>(data.readStrongBinder()); -            } -            const char* url = data.readCString(); -            sp<IMemoryHeap> heap = interface_cast<IMemoryHeap>(data.readStrongBinder()); -            uint32_t sampleRate; -            int numChannels; -            audio_format_t format; -            size_t size; -            status_t status = -                decode(httpService, -                       url, -                       &sampleRate, -                       &numChannels, -                       &format, -                       heap, -                       &size); -            reply->writeInt32(status); -            if (status == NO_ERROR) { -                reply->writeInt32(sampleRate); -                reply->writeInt32(numChannels); -                reply->writeInt32((int32_t)format); -                reply->writeInt32((int32_t)size); -            } -            return NO_ERROR; -        } break; -        case DECODE_FD: { -            CHECK_INTERFACE(IMediaPlayerService, data, reply); -            int fd = dup(data.readFileDescriptor()); -            int64_t offset = data.readInt64(); -            int64_t length = data.readInt64(); -            sp<IMemoryHeap> heap = interface_cast<IMemoryHeap>(data.readStrongBinder()); -            uint32_t sampleRate; -            int numChannels; -            audio_format_t format; -            size_t size; -            status_t status = decode(fd, offset, length, &sampleRate, &numChannels, &format, -                                     heap, &size); -            reply->writeInt32(status); -            if (status == NO_ERROR) { -                reply->writeInt32(sampleRate); -                reply->writeInt32(numChannels); -                reply->writeInt32((int32_t)format); -                reply->writeInt32((int32_t)size); -            } +            reply->writeStrongBinder(IInterface::asBinder(player));              return NO_ERROR;          } break;          case CREATE_MEDIA_RECORDER: {              CHECK_INTERFACE(IMediaPlayerService, data, reply);              sp<IMediaRecorder> recorder = createMediaRecorder(); -            reply->writeStrongBinder(recorder->asBinder()); +            reply->writeStrongBinder(IInterface::asBinder(recorder));              return NO_ERROR;          } break;          case CREATE_METADATA_RETRIEVER: {              CHECK_INTERFACE(IMediaPlayerService, data, reply);              sp<IMediaMetadataRetriever> retriever = createMetadataRetriever(); -            reply->writeStrongBinder(retriever->asBinder()); +            reply->writeStrongBinder(IInterface::asBinder(retriever));              return NO_ERROR;          } break;          case GET_OMX: {              CHECK_INTERFACE(IMediaPlayerService, data, reply);              sp<IOMX> omx = getOMX(); -            reply->writeStrongBinder(omx->asBinder()); +            reply->writeStrongBinder(IInterface::asBinder(omx));              return NO_ERROR;          } break;          case MAKE_CRYPTO: {              CHECK_INTERFACE(IMediaPlayerService, data, reply);              sp<ICrypto> crypto = makeCrypto(); -            reply->writeStrongBinder(crypto->asBinder()); +            reply->writeStrongBinder(IInterface::asBinder(crypto));              return NO_ERROR;          } break;          case MAKE_DRM: {              CHECK_INTERFACE(IMediaPlayerService, data, reply);              sp<IDrm> drm = makeDrm(); -            reply->writeStrongBinder(drm->asBinder()); +            reply->writeStrongBinder(IInterface::asBinder(drm));              return NO_ERROR;          } break;          case MAKE_HDCP: {              CHECK_INTERFACE(IMediaPlayerService, data, reply);              bool createEncryptionModule = data.readInt32();              sp<IHDCP> hdcp = makeHDCP(createEncryptionModule); -            reply->writeStrongBinder(hdcp->asBinder()); +            reply->writeStrongBinder(IInterface::asBinder(hdcp));              return NO_ERROR;          } break;          case ADD_BATTERY_DATA: { @@ -324,13 +218,13 @@ status_t BnMediaPlayerService::onTransact(                      interface_cast<IRemoteDisplayClient>(data.readStrongBinder()));              String8 iface(data.readString8());              sp<IRemoteDisplay> display(listenForRemoteDisplay(client, iface)); -            reply->writeStrongBinder(display->asBinder()); +            reply->writeStrongBinder(IInterface::asBinder(display));              return NO_ERROR;          } break;          case GET_CODEC_LIST: {              CHECK_INTERFACE(IMediaPlayerService, data, reply);              sp<IMediaCodecList> mcl = getCodecList(); -            reply->writeStrongBinder(mcl->asBinder()); +            reply->writeStrongBinder(IInterface::asBinder(mcl));              return NO_ERROR;          } break;          default: diff --git a/media/libmedia/IMediaRecorder.cpp b/media/libmedia/IMediaRecorder.cpp index 95af006..a733b68 100644 --- a/media/libmedia/IMediaRecorder.cpp +++ b/media/libmedia/IMediaRecorder.cpp @@ -70,8 +70,8 @@ public:          ALOGV("setCamera(%p,%p)", camera.get(), proxy.get());          Parcel data, reply;          data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); -        data.writeStrongBinder(camera->asBinder()); -        data.writeStrongBinder(proxy->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(camera)); +        data.writeStrongBinder(IInterface::asBinder(proxy));          remote()->transact(SET_CAMERA, data, &reply);          return reply.readInt32();      } @@ -94,7 +94,7 @@ public:          ALOGV("setPreviewSurface(%p)", surface.get());          Parcel data, reply;          data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); -        data.writeStrongBinder(surface->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(surface));          remote()->transact(SET_PREVIEW_SURFACE, data, &reply);          return reply.readInt32();      } @@ -215,7 +215,7 @@ public:          ALOGV("setListener(%p)", listener.get());          Parcel data, reply;          data.writeInterfaceToken(IMediaRecorder::getInterfaceDescriptor()); -        data.writeStrongBinder(listener->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(listener));          remote()->transact(SET_LISTENER, data, &reply);          return reply.readInt32();      } @@ -468,7 +468,7 @@ status_t BnMediaRecorder::onTransact(              int returnedNull= (surfaceMediaSource == NULL) ? 1 : 0 ;              reply->writeInt32(returnedNull);              if (!returnedNull) { -                reply->writeStrongBinder(surfaceMediaSource->asBinder()); +                reply->writeStrongBinder(IInterface::asBinder(surfaceMediaSource));              }              return NO_ERROR;          } break; diff --git a/media/libmedia/IOMX.cpp b/media/libmedia/IOMX.cpp index c583d32..e208df9 100644 --- a/media/libmedia/IOMX.cpp +++ b/media/libmedia/IOMX.cpp @@ -100,7 +100,7 @@ public:          Parcel data, reply;          data.writeInterfaceToken(IOMX::getInterfaceDescriptor());          data.writeCString(name); -        data.writeStrongBinder(observer->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(observer));          remote()->transact(ALLOCATE_NODE, data, &reply);          status_t err = reply.readInt32(); @@ -248,7 +248,7 @@ public:          data.writeInterfaceToken(IOMX::getInterfaceDescriptor());          data.writeInt32((int32_t)node);          data.writeInt32(port_index); -        data.writeStrongBinder(params->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(params));          remote()->transact(USE_BUFFER, data, &reply);          status_t err = reply.readInt32(); @@ -418,7 +418,7 @@ public:          data.writeInterfaceToken(IOMX::getInterfaceDescriptor());          data.writeInt32((int32_t)node);          data.writeInt32(port_index); -        data.writeStrongBinder(params->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(params));          remote()->transact(ALLOC_BUFFER_WITH_BACKUP, data, &reply);          status_t err = reply.readInt32(); @@ -775,7 +775,7 @@ status_t BnOMX::onTransact(              reply->writeInt32(err);              if (err == OK) { -                reply->writeStrongBinder(bufferProducer->asBinder()); +                reply->writeStrongBinder(IInterface::asBinder(bufferProducer));              }              return NO_ERROR; diff --git a/media/libmedia/IRemoteDisplayClient.cpp b/media/libmedia/IRemoteDisplayClient.cpp index 7190879..9d63bc9 100644 --- a/media/libmedia/IRemoteDisplayClient.cpp +++ b/media/libmedia/IRemoteDisplayClient.cpp @@ -42,7 +42,7 @@ public:      {          Parcel data, reply;          data.writeInterfaceToken(IRemoteDisplayClient::getInterfaceDescriptor()); -        data.writeStrongBinder(bufferProducer->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(bufferProducer));          data.writeInt32(width);          data.writeInt32(height);          data.writeInt32(flags); diff --git a/media/libmedia/IStreamSource.cpp b/media/libmedia/IStreamSource.cpp index fe2cc61..d480aef 100644 --- a/media/libmedia/IStreamSource.cpp +++ b/media/libmedia/IStreamSource.cpp @@ -55,7 +55,7 @@ struct BpStreamSource : public BpInterface<IStreamSource> {      virtual void setListener(const sp<IStreamListener> &listener) {          Parcel data, reply;          data.writeInterfaceToken(IStreamSource::getInterfaceDescriptor()); -        data.writeStrongBinder(listener->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(listener));          remote()->transact(SET_LISTENER, data, &reply);      } @@ -64,7 +64,7 @@ struct BpStreamSource : public BpInterface<IStreamSource> {          data.writeInterfaceToken(IStreamSource::getInterfaceDescriptor());          data.writeInt64(static_cast<int64_t>(buffers.size()));          for (size_t i = 0; i < buffers.size(); ++i) { -            data.writeStrongBinder(buffers.itemAt(i)->asBinder()); +            data.writeStrongBinder(IInterface::asBinder(buffers.itemAt(i)));          }          remote()->transact(SET_BUFFERS, data, &reply);      } diff --git a/media/libmedia/JetPlayer.cpp b/media/libmedia/JetPlayer.cpp index f0f1832..721d8d7 100644 --- a/media/libmedia/JetPlayer.cpp +++ b/media/libmedia/JetPlayer.cpp @@ -36,7 +36,6 @@ JetPlayer::JetPlayer(void *javaJetPlayer, int maxTracks, int trackBufferSize) :          mPaused(false),          mMaxTracks(maxTracks),          mEasData(NULL), -        mEasJetFileLoc(NULL),          mTrackBufferSize(trackBufferSize)  {      ALOGV("JetPlayer constructor"); @@ -133,10 +132,7 @@ int JetPlayer::release()          JET_Shutdown(mEasData);          EAS_Shutdown(mEasData);      } -    if (mEasJetFileLoc) { -        free(mEasJetFileLoc); -        mEasJetFileLoc = NULL; -    } +    mIoWrapper.clear();      if (mAudioTrack != 0) {          mAudioTrack->stop();          mAudioTrack->flush(); @@ -327,16 +323,9 @@ int JetPlayer::loadFromFile(const char* path)      Mutex::Autolock lock(mMutex); -    mEasJetFileLoc = (EAS_FILE_LOCATOR) malloc(sizeof(EAS_FILE)); -    strncpy(mJetFilePath, path, sizeof(mJetFilePath)); -    mJetFilePath[sizeof(mJetFilePath) - 1] = '\0'; -    mEasJetFileLoc->path = mJetFilePath; - -    mEasJetFileLoc->fd = 0; -    mEasJetFileLoc->length = 0; -    mEasJetFileLoc->offset = 0; +    mIoWrapper = new MidiIoWrapper(path); -    EAS_RESULT result = JET_OpenFile(mEasData, mEasJetFileLoc); +    EAS_RESULT result = JET_OpenFile(mEasData, mIoWrapper->getLocator());      if (result != EAS_SUCCESS)          mState = EAS_STATE_ERROR;      else @@ -352,13 +341,9 @@ int JetPlayer::loadFromFD(const int fd, const long long offset, const long long      Mutex::Autolock lock(mMutex); -    mEasJetFileLoc = (EAS_FILE_LOCATOR) malloc(sizeof(EAS_FILE)); -    mEasJetFileLoc->fd = fd; -    mEasJetFileLoc->offset = offset; -    mEasJetFileLoc->length = length; -    mEasJetFileLoc->path = NULL; +    mIoWrapper = new MidiIoWrapper(fd, offset, length); -    EAS_RESULT result = JET_OpenFile(mEasData, mEasJetFileLoc); +    EAS_RESULT result = JET_OpenFile(mEasData, mIoWrapper->getLocator());      if (result != EAS_SUCCESS)          mState = EAS_STATE_ERROR;      else @@ -459,7 +444,6 @@ int JetPlayer::clearQueue()  //-------------------------------------------------------------------------------------------------  void JetPlayer::dump()  { -    ALOGE("JetPlayer dump: JET file=%s", mEasJetFileLoc->path);  }  void JetPlayer::dumpJetStatus(S_JET_STATUS* pJetStatus) diff --git a/media/libmedia/MemoryLeakTrackUtil.cpp b/media/libmedia/MemoryLeakTrackUtil.cpp index 66f7161..d31f721 100644 --- a/media/libmedia/MemoryLeakTrackUtil.cpp +++ b/media/libmedia/MemoryLeakTrackUtil.cpp @@ -18,6 +18,7 @@  #include <stdio.h>  #include <stdlib.h> +#include <string.h>  #include <sys/types.h>  #include <unistd.h> diff --git a/media/libmedia/MidiIoWrapper.cpp b/media/libmedia/MidiIoWrapper.cpp new file mode 100644 index 0000000..5197ce2 --- /dev/null +++ b/media/libmedia/MidiIoWrapper.cpp @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + *      http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +//#define LOG_NDEBUG 0 +#define LOG_TAG "MidiIoWrapper" +#include <utils/Log.h> +#include <utils/RefBase.h> + +#include <sys/stat.h> +#include <fcntl.h> + +#include "media/MidiIoWrapper.h" + +static int readAt(void *handle, void *buffer, int pos, int size) { +    return ((android::MidiIoWrapper*)handle)->readAt(buffer, pos, size); +} +static int size(void *handle) { +    return ((android::MidiIoWrapper*)handle)->size(); +} + +namespace android { + +MidiIoWrapper::MidiIoWrapper(const char *path) { +    ALOGV("MidiIoWrapper(%s)", path); +    mFd = open(path, O_RDONLY | O_LARGEFILE); +    mBase = 0; +    mLength = lseek(mFd, 0, SEEK_END); +} + +MidiIoWrapper::MidiIoWrapper(int fd, off64_t offset, int64_t size) { +    ALOGV("MidiIoWrapper(fd=%d)", fd); +    mFd = dup(fd); +    mBase = offset; +    mLength = size; +} + +MidiIoWrapper::MidiIoWrapper(const sp<DataSource> &source) { +    ALOGV("MidiIoWrapper(DataSource)"); +    mFd = -1; +    mDataSource = source; +    off64_t l; +    if (mDataSource->getSize(&l) == OK) { +        mLength = l; +    } else { +        mLength = 0; +    } +} + +MidiIoWrapper::~MidiIoWrapper() { +    ALOGV("~MidiIoWrapper"); +    close(mFd); +} + +int MidiIoWrapper::readAt(void *buffer, int offset, int size) { +    ALOGV("readAt(%p, %d, %d)", buffer, offset, size); + +    if (mDataSource != NULL) { +        return mDataSource->readAt(offset, buffer, size); +    } +    lseek(mFd, mBase + offset, SEEK_SET); +    if (offset + size > mLength) { +        size = mLength - offset; +    } +    return read(mFd, buffer, size); +} + +int MidiIoWrapper::size() { +    ALOGV("size() = %d", int(mLength)); +    return mLength; +} + +EAS_FILE_LOCATOR MidiIoWrapper::getLocator() { +    mEasFile.handle = this; +    mEasFile.readAt = ::readAt; +    mEasFile.size = ::size; +    return &mEasFile; +} + +}  // namespace android diff --git a/media/libmedia/SingleStateQueue.cpp b/media/libmedia/SingleStateQueue.cpp index 3503baa..c241184 100644 --- a/media/libmedia/SingleStateQueue.cpp +++ b/media/libmedia/SingleStateQueue.cpp @@ -16,7 +16,6 @@  #include <new>  #include <cutils/atomic.h> -#include <cutils/atomic-inline.h> // for android_memory_barrier()  #include <media/SingleStateQueue.h>  namespace android { diff --git a/media/libmedia/SoundPool.cpp b/media/libmedia/SoundPool.cpp deleted file mode 100644 index d2e381b..0000000 --- a/media/libmedia/SoundPool.cpp +++ /dev/null @@ -1,921 +0,0 @@ -/* - * Copyright (C) 2007 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - *      http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -//#define LOG_NDEBUG 0 -#define LOG_TAG "SoundPool" - -#include <inttypes.h> - -#include <utils/Log.h> - -#define USE_SHARED_MEM_BUFFER - -#include <media/AudioTrack.h> -#include <media/IMediaHTTPService.h> -#include <media/mediaplayer.h> -#include <media/SoundPool.h> -#include "SoundPoolThread.h" -#include <media/AudioPolicyHelper.h> - -namespace android -{ - -int kDefaultBufferCount = 4; -uint32_t kMaxSampleRate = 48000; -uint32_t kDefaultSampleRate = 44100; -uint32_t kDefaultFrameCount = 1200; -size_t kDefaultHeapSize = 1024 * 1024; // 1MB - - -SoundPool::SoundPool(int maxChannels, const audio_attributes_t* pAttributes) -{ -    ALOGV("SoundPool constructor: maxChannels=%d, attr.usage=%d, attr.flags=0x%x, attr.tags=%s", -            maxChannels, pAttributes->usage, pAttributes->flags, pAttributes->tags); - -    // check limits -    mMaxChannels = maxChannels; -    if (mMaxChannels < 1) { -        mMaxChannels = 1; -    } -    else if (mMaxChannels > 32) { -        mMaxChannels = 32; -    } -    ALOGW_IF(maxChannels != mMaxChannels, "App requested %d channels", maxChannels); - -    mQuit = false; -    mDecodeThread = 0; -    memcpy(&mAttributes, pAttributes, sizeof(audio_attributes_t)); -    mAllocated = 0; -    mNextSampleID = 0; -    mNextChannelID = 0; - -    mCallback = 0; -    mUserData = 0; - -    mChannelPool = new SoundChannel[mMaxChannels]; -    for (int i = 0; i < mMaxChannels; ++i) { -        mChannelPool[i].init(this); -        mChannels.push_back(&mChannelPool[i]); -    } - -    // start decode thread -    startThreads(); -} - -SoundPool::~SoundPool() -{ -    ALOGV("SoundPool destructor"); -    mDecodeThread->quit(); -    quit(); - -    Mutex::Autolock lock(&mLock); - -    mChannels.clear(); -    if (mChannelPool) -        delete [] mChannelPool; -    // clean up samples -    ALOGV("clear samples"); -    mSamples.clear(); - -    if (mDecodeThread) -        delete mDecodeThread; -} - -void SoundPool::addToRestartList(SoundChannel* channel) -{ -    Mutex::Autolock lock(&mRestartLock); -    if (!mQuit) { -        mRestart.push_back(channel); -        mCondition.signal(); -    } -} - -void SoundPool::addToStopList(SoundChannel* channel) -{ -    Mutex::Autolock lock(&mRestartLock); -    if (!mQuit) { -        mStop.push_back(channel); -        mCondition.signal(); -    } -} - -int SoundPool::beginThread(void* arg) -{ -    SoundPool* p = (SoundPool*)arg; -    return p->run(); -} - -int SoundPool::run() -{ -    mRestartLock.lock(); -    while (!mQuit) { -        mCondition.wait(mRestartLock); -        ALOGV("awake"); -        if (mQuit) break; - -        while (!mStop.empty()) { -            SoundChannel* channel; -            ALOGV("Getting channel from stop list"); -            List<SoundChannel* >::iterator iter = mStop.begin(); -            channel = *iter; -            mStop.erase(iter); -            mRestartLock.unlock(); -            if (channel != 0) { -                Mutex::Autolock lock(&mLock); -                channel->stop(); -            } -            mRestartLock.lock(); -            if (mQuit) break; -        } - -        while (!mRestart.empty()) { -            SoundChannel* channel; -            ALOGV("Getting channel from list"); -            List<SoundChannel*>::iterator iter = mRestart.begin(); -            channel = *iter; -            mRestart.erase(iter); -            mRestartLock.unlock(); -            if (channel != 0) { -                Mutex::Autolock lock(&mLock); -                channel->nextEvent(); -            } -            mRestartLock.lock(); -            if (mQuit) break; -        } -    } - -    mStop.clear(); -    mRestart.clear(); -    mCondition.signal(); -    mRestartLock.unlock(); -    ALOGV("goodbye"); -    return 0; -} - -void SoundPool::quit() -{ -    mRestartLock.lock(); -    mQuit = true; -    mCondition.signal(); -    mCondition.wait(mRestartLock); -    ALOGV("return from quit"); -    mRestartLock.unlock(); -} - -bool SoundPool::startThreads() -{ -    createThreadEtc(beginThread, this, "SoundPool"); -    if (mDecodeThread == NULL) -        mDecodeThread = new SoundPoolThread(this); -    return mDecodeThread != NULL; -} - -SoundChannel* SoundPool::findChannel(int channelID) -{ -    for (int i = 0; i < mMaxChannels; ++i) { -        if (mChannelPool[i].channelID() == channelID) { -            return &mChannelPool[i]; -        } -    } -    return NULL; -} - -SoundChannel* SoundPool::findNextChannel(int channelID) -{ -    for (int i = 0; i < mMaxChannels; ++i) { -        if (mChannelPool[i].nextChannelID() == channelID) { -            return &mChannelPool[i]; -        } -    } -    return NULL; -} - -int SoundPool::load(const char* path, int priority __unused) -{ -    ALOGV("load: path=%s, priority=%d", path, priority); -    Mutex::Autolock lock(&mLock); -    sp<Sample> sample = new Sample(++mNextSampleID, path); -    mSamples.add(sample->sampleID(), sample); -    doLoad(sample); -    return sample->sampleID(); -} - -int SoundPool::load(int fd, int64_t offset, int64_t length, int priority __unused) -{ -    ALOGV("load: fd=%d, offset=%" PRId64 ", length=%" PRId64 ", priority=%d", -            fd, offset, length, priority); -    Mutex::Autolock lock(&mLock); -    sp<Sample> sample = new Sample(++mNextSampleID, fd, offset, length); -    mSamples.add(sample->sampleID(), sample); -    doLoad(sample); -    return sample->sampleID(); -} - -void SoundPool::doLoad(sp<Sample>& sample) -{ -    ALOGV("doLoad: loading sample sampleID=%d", sample->sampleID()); -    sample->startLoad(); -    mDecodeThread->loadSample(sample->sampleID()); -} - -bool SoundPool::unload(int sampleID) -{ -    ALOGV("unload: sampleID=%d", sampleID); -    Mutex::Autolock lock(&mLock); -    return mSamples.removeItem(sampleID); -} - -int SoundPool::play(int sampleID, float leftVolume, float rightVolume, -        int priority, int loop, float rate) -{ -    ALOGV("play sampleID=%d, leftVolume=%f, rightVolume=%f, priority=%d, loop=%d, rate=%f", -            sampleID, leftVolume, rightVolume, priority, loop, rate); -    sp<Sample> sample; -    SoundChannel* channel; -    int channelID; - -    Mutex::Autolock lock(&mLock); - -    if (mQuit) { -        return 0; -    } -    // is sample ready? -    sample = findSample(sampleID); -    if ((sample == 0) || (sample->state() != Sample::READY)) { -        ALOGW("  sample %d not READY", sampleID); -        return 0; -    } - -    dump(); - -    // allocate a channel -    channel = allocateChannel_l(priority); - -    // no channel allocated - return 0 -    if (!channel) { -        ALOGV("No channel allocated"); -        return 0; -    } - -    channelID = ++mNextChannelID; - -    ALOGV("play channel %p state = %d", channel, channel->state()); -    channel->play(sample, channelID, leftVolume, rightVolume, priority, loop, rate); -    return channelID; -} - -SoundChannel* SoundPool::allocateChannel_l(int priority) -{ -    List<SoundChannel*>::iterator iter; -    SoundChannel* channel = NULL; - -    // allocate a channel -    if (!mChannels.empty()) { -        iter = mChannels.begin(); -        if (priority >= (*iter)->priority()) { -            channel = *iter; -            mChannels.erase(iter); -            ALOGV("Allocated active channel"); -        } -    } - -    // update priority and put it back in the list -    if (channel) { -        channel->setPriority(priority); -        for (iter = mChannels.begin(); iter != mChannels.end(); ++iter) { -            if (priority < (*iter)->priority()) { -                break; -            } -        } -        mChannels.insert(iter, channel); -    } -    return channel; -} - -// move a channel from its current position to the front of the list -void SoundPool::moveToFront_l(SoundChannel* channel) -{ -    for (List<SoundChannel*>::iterator iter = mChannels.begin(); iter != mChannels.end(); ++iter) { -        if (*iter == channel) { -            mChannels.erase(iter); -            mChannels.push_front(channel); -            break; -        } -    } -} - -void SoundPool::pause(int channelID) -{ -    ALOGV("pause(%d)", channelID); -    Mutex::Autolock lock(&mLock); -    SoundChannel* channel = findChannel(channelID); -    if (channel) { -        channel->pause(); -    } -} - -void SoundPool::autoPause() -{ -    ALOGV("autoPause()"); -    Mutex::Autolock lock(&mLock); -    for (int i = 0; i < mMaxChannels; ++i) { -        SoundChannel* channel = &mChannelPool[i]; -        channel->autoPause(); -    } -} - -void SoundPool::resume(int channelID) -{ -    ALOGV("resume(%d)", channelID); -    Mutex::Autolock lock(&mLock); -    SoundChannel* channel = findChannel(channelID); -    if (channel) { -        channel->resume(); -    } -} - -void SoundPool::autoResume() -{ -    ALOGV("autoResume()"); -    Mutex::Autolock lock(&mLock); -    for (int i = 0; i < mMaxChannels; ++i) { -        SoundChannel* channel = &mChannelPool[i]; -        channel->autoResume(); -    } -} - -void SoundPool::stop(int channelID) -{ -    ALOGV("stop(%d)", channelID); -    Mutex::Autolock lock(&mLock); -    SoundChannel* channel = findChannel(channelID); -    if (channel) { -        channel->stop(); -    } else { -        channel = findNextChannel(channelID); -        if (channel) -            channel->clearNextEvent(); -    } -} - -void SoundPool::setVolume(int channelID, float leftVolume, float rightVolume) -{ -    Mutex::Autolock lock(&mLock); -    SoundChannel* channel = findChannel(channelID); -    if (channel) { -        channel->setVolume(leftVolume, rightVolume); -    } -} - -void SoundPool::setPriority(int channelID, int priority) -{ -    ALOGV("setPriority(%d, %d)", channelID, priority); -    Mutex::Autolock lock(&mLock); -    SoundChannel* channel = findChannel(channelID); -    if (channel) { -        channel->setPriority(priority); -    } -} - -void SoundPool::setLoop(int channelID, int loop) -{ -    ALOGV("setLoop(%d, %d)", channelID, loop); -    Mutex::Autolock lock(&mLock); -    SoundChannel* channel = findChannel(channelID); -    if (channel) { -        channel->setLoop(loop); -    } -} - -void SoundPool::setRate(int channelID, float rate) -{ -    ALOGV("setRate(%d, %f)", channelID, rate); -    Mutex::Autolock lock(&mLock); -    SoundChannel* channel = findChannel(channelID); -    if (channel) { -        channel->setRate(rate); -    } -} - -// call with lock held -void SoundPool::done_l(SoundChannel* channel) -{ -    ALOGV("done_l(%d)", channel->channelID()); -    // if "stolen", play next event -    if (channel->nextChannelID() != 0) { -        ALOGV("add to restart list"); -        addToRestartList(channel); -    } - -    // return to idle state -    else { -        ALOGV("move to front"); -        moveToFront_l(channel); -    } -} - -void SoundPool::setCallback(SoundPoolCallback* callback, void* user) -{ -    Mutex::Autolock lock(&mCallbackLock); -    mCallback = callback; -    mUserData = user; -} - -void SoundPool::notify(SoundPoolEvent event) -{ -    Mutex::Autolock lock(&mCallbackLock); -    if (mCallback != NULL) { -        mCallback(event, this, mUserData); -    } -} - -void SoundPool::dump() -{ -    for (int i = 0; i < mMaxChannels; ++i) { -        mChannelPool[i].dump(); -    } -} - - -Sample::Sample(int sampleID, const char* url) -{ -    init(); -    mSampleID = sampleID; -    mUrl = strdup(url); -    ALOGV("create sampleID=%d, url=%s", mSampleID, mUrl); -} - -Sample::Sample(int sampleID, int fd, int64_t offset, int64_t length) -{ -    init(); -    mSampleID = sampleID; -    mFd = dup(fd); -    mOffset = offset; -    mLength = length; -    ALOGV("create sampleID=%d, fd=%d, offset=%" PRId64 " length=%" PRId64, -        mSampleID, mFd, mLength, mOffset); -} - -void Sample::init() -{ -    mSize = 0; -    mRefCount = 0; -    mSampleID = 0; -    mState = UNLOADED; -    mFd = -1; -    mOffset = 0; -    mLength = 0; -    mUrl = 0; -} - -Sample::~Sample() -{ -    ALOGV("Sample::destructor sampleID=%d, fd=%d", mSampleID, mFd); -    if (mFd > 0) { -        ALOGV("close(%d)", mFd); -        ::close(mFd); -    } -    free(mUrl); -} - -status_t Sample::doLoad() -{ -    uint32_t sampleRate; -    int numChannels; -    audio_format_t format; -    status_t status; -    mHeap = new MemoryHeapBase(kDefaultHeapSize); - -    ALOGV("Start decode"); -    if (mUrl) { -        status = MediaPlayer::decode( -                NULL /* httpService */, -                mUrl, -                &sampleRate, -                &numChannels, -                &format, -                mHeap, -                &mSize); -    } else { -        status = MediaPlayer::decode(mFd, mOffset, mLength, &sampleRate, &numChannels, &format, -                                     mHeap, &mSize); -        ALOGV("close(%d)", mFd); -        ::close(mFd); -        mFd = -1; -    } -    if (status != NO_ERROR) { -        ALOGE("Unable to load sample: %s", mUrl); -        goto error; -    } -    ALOGV("pointer = %p, size = %zu, sampleRate = %u, numChannels = %d", -          mHeap->getBase(), mSize, sampleRate, numChannels); - -    if (sampleRate > kMaxSampleRate) { -       ALOGE("Sample rate (%u) out of range", sampleRate); -       status = BAD_VALUE; -       goto error; -    } - -    if ((numChannels < 1) || (numChannels > 2)) { -        ALOGE("Sample channel count (%d) out of range", numChannels); -        status = BAD_VALUE; -        goto error; -    } - -    mData = new MemoryBase(mHeap, 0, mSize); -    mSampleRate = sampleRate; -    mNumChannels = numChannels; -    mFormat = format; -    mState = READY; -    return NO_ERROR; - -error: -    mHeap.clear(); -    return status; -} - - -void SoundChannel::init(SoundPool* soundPool) -{ -    mSoundPool = soundPool; -} - -// call with sound pool lock held -void SoundChannel::play(const sp<Sample>& sample, int nextChannelID, float leftVolume, -        float rightVolume, int priority, int loop, float rate) -{ -    sp<AudioTrack> oldTrack; -    sp<AudioTrack> newTrack; -    status_t status; - -    { // scope for the lock -        Mutex::Autolock lock(&mLock); - -        ALOGV("SoundChannel::play %p: sampleID=%d, channelID=%d, leftVolume=%f, rightVolume=%f," -                " priority=%d, loop=%d, rate=%f", -                this, sample->sampleID(), nextChannelID, leftVolume, rightVolume, -                priority, loop, rate); - -        // if not idle, this voice is being stolen -        if (mState != IDLE) { -            ALOGV("channel %d stolen - event queued for channel %d", channelID(), nextChannelID); -            mNextEvent.set(sample, nextChannelID, leftVolume, rightVolume, priority, loop, rate); -            stop_l(); -            return; -        } - -        // initialize track -        size_t afFrameCount; -        uint32_t afSampleRate; -        audio_stream_type_t streamType = audio_attributes_to_stream_type(mSoundPool->attributes()); -        if (AudioSystem::getOutputFrameCount(&afFrameCount, streamType) != NO_ERROR) { -            afFrameCount = kDefaultFrameCount; -        } -        if (AudioSystem::getOutputSamplingRate(&afSampleRate, streamType) != NO_ERROR) { -            afSampleRate = kDefaultSampleRate; -        } -        int numChannels = sample->numChannels(); -        uint32_t sampleRate = uint32_t(float(sample->sampleRate()) * rate + 0.5); -        uint32_t totalFrames = (kDefaultBufferCount * afFrameCount * sampleRate) / afSampleRate; -        uint32_t bufferFrames = (totalFrames + (kDefaultBufferCount - 1)) / kDefaultBufferCount; -        size_t frameCount = 0; - -        if (loop) { -            frameCount = sample->size()/numChannels/ -                ((sample->format() == AUDIO_FORMAT_PCM_16_BIT) ? sizeof(int16_t) : sizeof(uint8_t)); -        } - -#ifndef USE_SHARED_MEM_BUFFER -        // Ensure minimum audio buffer size in case of short looped sample -        if(frameCount < totalFrames) { -            frameCount = totalFrames; -        } -#endif - -        // mToggle toggles each time a track is started on a given channel. -        // The toggle is concatenated with the SoundChannel address and passed to AudioTrack -        // as callback user data. This enables the detection of callbacks received from the old -        // audio track while the new one is being started and avoids processing them with -        // wrong audio audio buffer size  (mAudioBufferSize) -        unsigned long toggle = mToggle ^ 1; -        void *userData = (void *)((unsigned long)this | toggle); -        audio_channel_mask_t channelMask = audio_channel_out_mask_from_count(numChannels); - -        // do not create a new audio track if current track is compatible with sample parameters -#ifdef USE_SHARED_MEM_BUFFER -        newTrack = new AudioTrack(streamType, sampleRate, sample->format(), -                channelMask, sample->getIMemory(), AUDIO_OUTPUT_FLAG_FAST, callback, userData); -#else -        newTrack = new AudioTrack(streamType, sampleRate, sample->format(), -                channelMask, frameCount, AUDIO_OUTPUT_FLAG_FAST, callback, userData, -                bufferFrames); -#endif -        oldTrack = mAudioTrack; -        status = newTrack->initCheck(); -        if (status != NO_ERROR) { -            ALOGE("Error creating AudioTrack"); -            goto exit; -        } -        ALOGV("setVolume %p", newTrack.get()); -        newTrack->setVolume(leftVolume, rightVolume); -        newTrack->setLoop(0, frameCount, loop); - -        // From now on, AudioTrack callbacks received with previous toggle value will be ignored. -        mToggle = toggle; -        mAudioTrack = newTrack; -        mPos = 0; -        mSample = sample; -        mChannelID = nextChannelID; -        mPriority = priority; -        mLoop = loop; -        mLeftVolume = leftVolume; -        mRightVolume = rightVolume; -        mNumChannels = numChannels; -        mRate = rate; -        clearNextEvent(); -        mState = PLAYING; -        mAudioTrack->start(); -        mAudioBufferSize = newTrack->frameCount()*newTrack->frameSize(); -    } - -exit: -    ALOGV("delete oldTrack %p", oldTrack.get()); -    if (status != NO_ERROR) { -        mAudioTrack.clear(); -    } -} - -void SoundChannel::nextEvent() -{ -    sp<Sample> sample; -    int nextChannelID; -    float leftVolume; -    float rightVolume; -    int priority; -    int loop; -    float rate; - -    // check for valid event -    { -        Mutex::Autolock lock(&mLock); -        nextChannelID = mNextEvent.channelID(); -        if (nextChannelID  == 0) { -            ALOGV("stolen channel has no event"); -            return; -        } - -        sample = mNextEvent.sample(); -        leftVolume = mNextEvent.leftVolume(); -        rightVolume = mNextEvent.rightVolume(); -        priority = mNextEvent.priority(); -        loop = mNextEvent.loop(); -        rate = mNextEvent.rate(); -    } - -    ALOGV("Starting stolen channel %d -> %d", channelID(), nextChannelID); -    play(sample, nextChannelID, leftVolume, rightVolume, priority, loop, rate); -} - -void SoundChannel::callback(int event, void* user, void *info) -{ -    SoundChannel* channel = static_cast<SoundChannel*>((void *)((unsigned long)user & ~1)); - -    channel->process(event, info, (unsigned long)user & 1); -} - -void SoundChannel::process(int event, void *info, unsigned long toggle) -{ -    //ALOGV("process(%d)", mChannelID); - -    Mutex::Autolock lock(&mLock); - -    AudioTrack::Buffer* b = NULL; -    if (event == AudioTrack::EVENT_MORE_DATA) { -       b = static_cast<AudioTrack::Buffer *>(info); -    } - -    if (mToggle != toggle) { -        ALOGV("process wrong toggle %p channel %d", this, mChannelID); -        if (b != NULL) { -            b->size = 0; -        } -        return; -    } - -    sp<Sample> sample = mSample; - -//    ALOGV("SoundChannel::process event %d", event); - -    if (event == AudioTrack::EVENT_MORE_DATA) { - -        // check for stop state -        if (b->size == 0) return; - -        if (mState == IDLE) { -            b->size = 0; -            return; -        } - -        if (sample != 0) { -            // fill buffer -            uint8_t* q = (uint8_t*) b->i8; -            size_t count = 0; - -            if (mPos < (int)sample->size()) { -                uint8_t* p = sample->data() + mPos; -                count = sample->size() - mPos; -                if (count > b->size) { -                    count = b->size; -                } -                memcpy(q, p, count); -//              ALOGV("fill: q=%p, p=%p, mPos=%u, b->size=%u, count=%d", q, p, mPos, b->size, -//                      count); -            } else if (mPos < mAudioBufferSize) { -                count = mAudioBufferSize - mPos; -                if (count > b->size) { -                    count = b->size; -                } -                memset(q, 0, count); -//              ALOGV("fill extra: q=%p, mPos=%u, b->size=%u, count=%d", q, mPos, b->size, count); -            } - -            mPos += count; -            b->size = count; -            //ALOGV("buffer=%p, [0]=%d", b->i16, b->i16[0]); -        } -    } else if (event == AudioTrack::EVENT_UNDERRUN || event == AudioTrack::EVENT_BUFFER_END || -            event == AudioTrack::EVENT_NEW_IAUDIOTRACK) { -        ALOGV("process %p channel %d event %s", -              this, mChannelID, (event == AudioTrack::EVENT_UNDERRUN) ? "UNDERRUN" : -                      (event == AudioTrack::EVENT_BUFFER_END) ? "BUFFER_END" : "NEW_IAUDIOTRACK"); -        mSoundPool->addToStopList(this); -    } else if (event == AudioTrack::EVENT_LOOP_END) { -        ALOGV("End loop %p channel %d", this, mChannelID); -    } else { -        ALOGW("SoundChannel::process unexpected event %d", event); -    } -} - - -// call with lock held -bool SoundChannel::doStop_l() -{ -    if (mState != IDLE) { -        setVolume_l(0, 0); -        ALOGV("stop"); -        mAudioTrack->stop(); -        mSample.clear(); -        mState = IDLE; -        mPriority = IDLE_PRIORITY; -        return true; -    } -    return false; -} - -// call with lock held and sound pool lock held -void SoundChannel::stop_l() -{ -    if (doStop_l()) { -        mSoundPool->done_l(this); -    } -} - -// call with sound pool lock held -void SoundChannel::stop() -{ -    bool stopped; -    { -        Mutex::Autolock lock(&mLock); -        stopped = doStop_l(); -    } - -    if (stopped) { -        mSoundPool->done_l(this); -    } -} - -//FIXME: Pause is a little broken right now -void SoundChannel::pause() -{ -    Mutex::Autolock lock(&mLock); -    if (mState == PLAYING) { -        ALOGV("pause track"); -        mState = PAUSED; -        mAudioTrack->pause(); -    } -} - -void SoundChannel::autoPause() -{ -    Mutex::Autolock lock(&mLock); -    if (mState == PLAYING) { -        ALOGV("pause track"); -        mState = PAUSED; -        mAutoPaused = true; -        mAudioTrack->pause(); -    } -} - -void SoundChannel::resume() -{ -    Mutex::Autolock lock(&mLock); -    if (mState == PAUSED) { -        ALOGV("resume track"); -        mState = PLAYING; -        mAutoPaused = false; -        mAudioTrack->start(); -    } -} - -void SoundChannel::autoResume() -{ -    Mutex::Autolock lock(&mLock); -    if (mAutoPaused && (mState == PAUSED)) { -        ALOGV("resume track"); -        mState = PLAYING; -        mAutoPaused = false; -        mAudioTrack->start(); -    } -} - -void SoundChannel::setRate(float rate) -{ -    Mutex::Autolock lock(&mLock); -    if (mAudioTrack != NULL && mSample != 0) { -        uint32_t sampleRate = uint32_t(float(mSample->sampleRate()) * rate + 0.5); -        mAudioTrack->setSampleRate(sampleRate); -        mRate = rate; -    } -} - -// call with lock held -void SoundChannel::setVolume_l(float leftVolume, float rightVolume) -{ -    mLeftVolume = leftVolume; -    mRightVolume = rightVolume; -    if (mAudioTrack != NULL) -        mAudioTrack->setVolume(leftVolume, rightVolume); -} - -void SoundChannel::setVolume(float leftVolume, float rightVolume) -{ -    Mutex::Autolock lock(&mLock); -    setVolume_l(leftVolume, rightVolume); -} - -void SoundChannel::setLoop(int loop) -{ -    Mutex::Autolock lock(&mLock); -    if (mAudioTrack != NULL && mSample != 0) { -        uint32_t loopEnd = mSample->size()/mNumChannels/ -            ((mSample->format() == AUDIO_FORMAT_PCM_16_BIT) ? sizeof(int16_t) : sizeof(uint8_t)); -        mAudioTrack->setLoop(0, loopEnd, loop); -        mLoop = loop; -    } -} - -SoundChannel::~SoundChannel() -{ -    ALOGV("SoundChannel destructor %p", this); -    { -        Mutex::Autolock lock(&mLock); -        clearNextEvent(); -        doStop_l(); -    } -    // do not call AudioTrack destructor with mLock held as it will wait for the AudioTrack -    // callback thread to exit which may need to execute process() and acquire the mLock. -    mAudioTrack.clear(); -} - -void SoundChannel::dump() -{ -    ALOGV("mState = %d mChannelID=%d, mNumChannels=%d, mPos = %d, mPriority=%d, mLoop=%d", -            mState, mChannelID, mNumChannels, mPos, mPriority, mLoop); -} - -void SoundEvent::set(const sp<Sample>& sample, int channelID, float leftVolume, -            float rightVolume, int priority, int loop, float rate) -{ -    mSample = sample; -    mChannelID = channelID; -    mLeftVolume = leftVolume; -    mRightVolume = rightVolume; -    mPriority = priority; -    mLoop = loop; -    mRate =rate; -} - -} // end namespace android diff --git a/media/libmedia/SoundPoolThread.cpp b/media/libmedia/SoundPoolThread.cpp deleted file mode 100644 index ba3b482..0000000 --- a/media/libmedia/SoundPoolThread.cpp +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (C) 2007 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - *      http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -//#define LOG_NDEBUG 0 -#define LOG_TAG "SoundPoolThread" -#include "utils/Log.h" - -#include "SoundPoolThread.h" - -namespace android { - -void SoundPoolThread::write(SoundPoolMsg msg) { -    Mutex::Autolock lock(&mLock); -    while (mMsgQueue.size() >= maxMessages) { -        mCondition.wait(mLock); -    } - -    // if thread is quitting, don't add to queue -    if (mRunning) { -        mMsgQueue.push(msg); -        mCondition.signal(); -    } -} - -const SoundPoolMsg SoundPoolThread::read() { -    Mutex::Autolock lock(&mLock); -    while (mMsgQueue.size() == 0) { -        mCondition.wait(mLock); -    } -    SoundPoolMsg msg = mMsgQueue[0]; -    mMsgQueue.removeAt(0); -    mCondition.signal(); -    return msg; -} - -void SoundPoolThread::quit() { -    Mutex::Autolock lock(&mLock); -    if (mRunning) { -        mRunning = false; -        mMsgQueue.clear(); -        mMsgQueue.push(SoundPoolMsg(SoundPoolMsg::KILL, 0)); -        mCondition.signal(); -        mCondition.wait(mLock); -    } -    ALOGV("return from quit"); -} - -SoundPoolThread::SoundPoolThread(SoundPool* soundPool) : -    mSoundPool(soundPool) -{ -    mMsgQueue.setCapacity(maxMessages); -    if (createThreadEtc(beginThread, this, "SoundPoolThread")) { -        mRunning = true; -    } -} - -SoundPoolThread::~SoundPoolThread() -{ -    quit(); -} - -int SoundPoolThread::beginThread(void* arg) { -    ALOGV("beginThread"); -    SoundPoolThread* soundPoolThread = (SoundPoolThread*)arg; -    return soundPoolThread->run(); -} - -int SoundPoolThread::run() { -    ALOGV("run"); -    for (;;) { -        SoundPoolMsg msg = read(); -        ALOGV("Got message m=%d, mData=%d", msg.mMessageType, msg.mData); -        switch (msg.mMessageType) { -        case SoundPoolMsg::KILL: -            ALOGV("goodbye"); -            return NO_ERROR; -        case SoundPoolMsg::LOAD_SAMPLE: -            doLoadSample(msg.mData); -            break; -        default: -            ALOGW("run: Unrecognized message %d\n", -                    msg.mMessageType); -            break; -        } -    } -} - -void SoundPoolThread::loadSample(int sampleID) { -    write(SoundPoolMsg(SoundPoolMsg::LOAD_SAMPLE, sampleID)); -} - -void SoundPoolThread::doLoadSample(int sampleID) { -    sp <Sample> sample = mSoundPool->findSample(sampleID); -    status_t status = -1; -    if (sample != 0) { -        status = sample->doLoad(); -    } -    mSoundPool->notify(SoundPoolEvent(SoundPoolEvent::SAMPLE_LOADED, sampleID, status)); -} - -} // end namespace android diff --git a/media/libmedia/SoundPoolThread.h b/media/libmedia/SoundPoolThread.h deleted file mode 100644 index 7e96900..0000000 --- a/media/libmedia/SoundPoolThread.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2007 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - *      http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef SOUNDPOOLTHREAD_H_ -#define SOUNDPOOLTHREAD_H_ - -#include <utils/threads.h> -#include <utils/Vector.h> -#include <media/AudioTrack.h> - -#include <media/SoundPool.h> - -namespace android { - -class SoundPoolMsg { -public: -    enum MessageType { INVALID, KILL, LOAD_SAMPLE }; -    SoundPoolMsg() : mMessageType(INVALID), mData(0) {} -    SoundPoolMsg(MessageType MessageType, int data) : -        mMessageType(MessageType), mData(data) {} -    uint16_t         mMessageType; -    uint16_t         mData; -}; - -/* - * This class handles background requests from the SoundPool - */ -class SoundPoolThread { -public: -    SoundPoolThread(SoundPool* SoundPool); -    ~SoundPoolThread(); -    void loadSample(int sampleID); -    void quit(); -    void write(SoundPoolMsg msg); - -private: -    static const size_t maxMessages = 5; - -    static int beginThread(void* arg); -    int run(); -    void doLoadSample(int sampleID); -    const SoundPoolMsg read(); - -    Mutex                   mLock; -    Condition               mCondition; -    Vector<SoundPoolMsg>    mMsgQueue; -    SoundPool*              mSoundPool; -    bool                    mRunning; -}; - -} // end namespace android - -#endif /*SOUNDPOOLTHREAD_H_*/ diff --git a/media/libmedia/ToneGenerator.cpp b/media/libmedia/ToneGenerator.cpp index 61b6d36..2cc4685 100644 --- a/media/libmedia/ToneGenerator.cpp +++ b/media/libmedia/ToneGenerator.cpp @@ -28,718 +28,718 @@ namespace android {  // Descriptors for all available tones (See ToneGenerator::ToneDescriptor class declaration for details)  const ToneGenerator::ToneDescriptor ToneGenerator::sToneDescriptors[] = { -        { segments: {{ duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 941, 0 }, 0, 0}, -                     { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_DTMF_0 -        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 697, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_DTMF_1 -        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 697, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_DTMF_2 -        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 697, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_DTMF_3 -        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 770, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_DTMF_4 -        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 770, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_DTMF_5 -        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 770, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_DTMF_6 -        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 852, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_DTMF_7 -        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1336, 852, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_DTMF_8 -        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 852, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_DTMF_9 -        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1209, 941, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_DTMF_S -        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1477, 941, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_DTMF_P -        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 697, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_DTMF_A -        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 770, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                             // TONE_DTMF_B -        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 852, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_DTMF_C -        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 1633, 941, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_DTMF_D -        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 425, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_SUP_DIAL -        { segments: { { duration: 500 , waveFreq: { 425, 0 }, 0, 0}, -                      { duration: 500, waveFreq: { 0 }, 0, 0}, -                         { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_SUP_BUSY -        { segments: { { duration: 200, waveFreq: { 425, 0 }, 0, 0 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_SUP_CONGESTION -        { segments: { { duration: 200, waveFreq: { 425, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: 0, -          repeatSegment: 0 },                              // TONE_SUP_RADIO_ACK -        { segments: { { duration: 200, waveFreq: { 425, 0 }, 0, 0}, -                      { duration: 200, waveFreq: { 0 }, 0, 0}, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: 2, -          repeatSegment: 0 },                              // TONE_SUP_RADIO_NOTAVAIL -        { segments: { { duration: 330, waveFreq: { 950, 1400, 1800, 0 }, 0, 0}, -                      { duration: 1000, waveFreq: { 0 }, 0, 0}, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_SUP_ERROR -        { segments: { { duration: 200, waveFreq: { 425, 0 }, 0, 0 }, -                      { duration: 600, waveFreq: { 0 }, 0, 0 }, -                      { duration: 200, waveFreq: { 425, 0 }, 0, 0 }, -                      { duration: 3000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_SUP_CALL_WAITING -        { segments: { { duration: 1000, waveFreq: { 425, 0 }, 0, 0 }, -                      { duration: 4000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_SUP_RINGTONE -        { segments: { { duration: 40, waveFreq: { 400, 1200, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: 0, -          repeatSegment: 0 },                              // TONE_PROP_BEEP -        { segments: { { duration: 100, waveFreq: { 1200, 0 }, 0, 0 }, -                      { duration: 100, waveFreq: { 0 }, 0, 0  }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: 1, -          repeatSegment: 0 },                              // TONE_PROP_ACK -        { segments: { { duration: 400, waveFreq: { 300, 400, 500, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: 0, -          repeatSegment: 0 },                              // TONE_PROP_NACK -        { segments: { { duration: 200, waveFreq: { 400, 1200, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: 0, -          repeatSegment: 0 },                              // TONE_PROP_PROMPT -        { segments: { { duration: 40, waveFreq: { 400, 1200, 0 }, 0, 0 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 40, waveFreq: { 400, 1200, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: 0, -          repeatSegment: 0 },                             // TONE_PROP_BEEP2 -        { segments: { { duration: 250, waveFreq: { 440, 0 }, 0, 0 }, -                      { duration: 250, waveFreq: { 620, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_SUP_INTERCEPT -        { segments: { { duration: 250, waveFreq: { 440, 0 }, 0, 0 }, -                      { duration: 250, waveFreq: { 620, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: 7, -          repeatSegment: 0 },                             // TONE_SUP_INTERCEPT_ABBREV -        { segments: { { duration: 250, waveFreq: { 480, 620, 0 }, 0, 0 }, -                      { duration: 250, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: 7, -          repeatSegment: 0 },                             // TONE_SUP_CONGESTION_ABBREV -        { segments: { { duration: 100, waveFreq: { 350, 440, 0 }, 0, 0 }, -                      { duration: 100, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: 2, -          repeatSegment: 0 },                             // TONE_SUP_CONFIRM -        { segments: { { duration: 100, waveFreq: { 480, 0 }, 0, 0 }, -                      { duration: 100, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: 3, -          repeatSegment: 0 },                              // TONE_SUP_PIP -        { segments: {{ duration: ToneGenerator::TONEGEN_INF, waveFreq: { 425, 0 }, 0, 0}, -                     { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_CDMA_DIAL_TONE_LITE -        { segments: { { duration: 2000, waveFreq: { 440, 480, 0 }, 0, 0 }, -                      { duration: 4000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_CDMA_NETWORK_USA_RINGBACK -        { segments: { { duration: 250, waveFreq: { 440, 0 }, 0, 0 }, -                      { duration: 250, waveFreq: { 620, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt:  ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                             // TONE_CDMA_INTERCEPT -        { segments: { { duration: 250, waveFreq: { 440, 0 }, 0, 0 }, -                      { duration: 250, waveFreq: { 620, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt:  0, -          repeatSegment: 0 },                             // TONE_CDMA_ABBR_INTERCEPT -        { segments: { { duration: 250, waveFreq: { 480, 620, 0 }, 0, 0 }, -                      { duration: 250, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_CDMA_REORDER -        { segments: { { duration: 250, waveFreq: { 480, 620, 0 }, 0, 0 }, -                      { duration: 250, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: 7, -          repeatSegment: 0 },                              // TONE_CDMA_ABBR_REORDER -        { segments: { { duration: 500, waveFreq: { 480, 620, 0 }, 0, 0 }, -                      { duration: 500, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_CDMA_NETWORK_BUSY -        { segments: { { duration: 100, waveFreq: { 350, 440, 0 }, 0, 0 }, -                      { duration: 100, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: 2, -          repeatSegment: 0 },                              // TONE_CDMA_CONFIRM -        { segments: { { duration: 500, waveFreq: { 660, 1000, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: 0, -          repeatSegment: 0 },                              // TONE_CDMA_ANSWER -        { segments: { { duration: 300, waveFreq: { 440, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: 0, -          repeatSegment: 0 },                              // TONE_CDMA_NETWORK_CALLWAITING -        { segments: { { duration: 100, waveFreq: { 480, 0 }, 0, 0 }, -                      { duration: 100, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: 3, -          repeatSegment: 0 },                              // TONE_CDMA_PIP - -        { segments: { { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, -                      { duration: 64, waveFreq: { 2556, 0}, 19, 0}, -                      { duration: 32, waveFreq: { 2091, 0}, 0, 0}, -                      { duration: 48, waveFreq: { 2556, 0}, 0, 0}, -                      { duration: 4000, waveFreq: { 0 }, 0, 0}, -                      { duration: 0,  waveFreq: { 0 }, 0, 0}}, -          repeatCnt: 0, -          repeatSegment: 0 },                             // TONE_CDMA_CALL_SIGNAL_ISDN_NORMAL -        { segments: { { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, -                      { duration: 64, waveFreq: { 2556, 0}, 7, 0 }, -                      { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, -                      { duration: 400, waveFreq: { 0 }, 0, 0 }, -                      { duration: 32,  waveFreq: { 2091, 0}, 0, 0 }, -                      { duration: 64,  waveFreq: { 2556, 0}, 7, 4 }, -                      { duration: 32,  waveFreq: { 2091, 0}, 0, 0 }, -                      { duration: 4000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0,    waveFreq: { 0 }, 0, 0 } }, -          repeatCnt: 0, -          repeatSegment: 0 },                              // TONE_CDMA_CALL_SIGNAL_ISDN_INTERGROUP -        { segments: { { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, -                      { duration: 64, waveFreq: { 2556, 0}, 3, 0 }, -                      { duration: 16, waveFreq: { 2091, 0}, 0, 0 }, -                      { duration: 200, waveFreq: { 0 },     0, 0 }, -                      { duration: 32, waveFreq: { 2091, 0}, 0, 0 }, -                      { duration: 64, waveFreq: { 2556, 0}, 3, 4 }, -                      { duration: 16, waveFreq: { 2091, 0}, 0, 0 }, -                      { duration: 200, waveFreq: { 0 },     0, 0 }, -                      { duration: 0,   waveFreq: { 0 },     0, 0 } }, -          repeatCnt: 0, -          repeatSegment: 0 },                            // TONE_CDMA_CALL_SIGNAL_ISDN_SP_PRI -        { segments: { { duration: 0,  waveFreq: { 0 }, 0, 0} }, -          repeatCnt: 0, -          repeatSegment: 0 },                            // TONE_CDMA_CALL_SIGNAL_ISDN_PAT3 -        { segments: { { duration: 32, waveFreq: { 2091, 0 }, 0, 0 }, -                      { duration: 64, waveFreq: { 2556, 0 }, 4, 0 }, -                      { duration: 20, waveFreq: { 2091, 0 }, 0, 0 }, -                      { duration: 0,  waveFreq: { 0 }      , 0, 0 } }, -          repeatCnt: 0, -          repeatSegment: 0 },                             // TONE_CDMA_CALL_SIGNAL_ISDN_PING_RING -        { segments: { { duration: 0,  waveFreq: { 0 }, 0, 0} }, -          repeatCnt: 0, -          repeatSegment: 0 },                             // TONE_CDMA_CALL_SIGNAL_ISDN_PAT5 -        { segments: { { duration: 0,  waveFreq: { 0 }, 0, 0} }, -          repeatCnt: 0, -          repeatSegment: 0 },                             // TONE_CDMA_CALL_SIGNAL_ISDN_PAT6 -        { segments: { { duration: 0,  waveFreq: { 0 }, 0, 0} }, -          repeatCnt: 0, -          repeatSegment: 0 },                             // TONE_CDMA_CALL_SIGNAL_ISDN_PAT7 - -        { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 4000, 0 }, 39, 0 }, -                      { duration: 4000, waveFreq: { 0 },     0, 0 }, -                      { duration: 0,    waveFreq: { 0 },     0, 0 } }, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_HIGH_L -        { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2900, 0 }, 39, 0 }, -                      { duration: 4000, waveFreq: { 0 },     0, 0 }, -                      { duration: 0,    waveFreq: { 0 },     0, 0 } }, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_MED_L -        { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1450, 0 }, 39, 0 }, -                      { duration: 4000, waveFreq: { 0 },     0, 0 }, -                      { duration: 0,    waveFreq: { 0 },     0, 0 } }, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_LOW_L -        { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 4000, 0 }, 15, 0 }, -                      { duration: 400, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 } }, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_HIGH_SS -        { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2900, 0 }, 15, 0 }, -                      { duration: 400, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_MED_SS -        { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1450, 0 }, 15, 0 }, -                      { duration: 400, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_LOW_SS -        { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 4000, 0 }, 7, 0 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 4000, 0 }, 7, 3 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 4000, 0 }, 15, 6 }, -                      { duration: 4000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_HIGH_SSL -        { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2900, 0 }, 7, 0 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2900, 0 }, 7, 3 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2900, 0 }, 15, 6 }, -                      { duration: 4000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_MED_SSL -        { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1450, 0 }, 7, 0 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1450, 0 }, 7, 3 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1450, 0 }, 15, 6 }, -                      { duration: 4000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_LOW_SSL -        { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 4000, 0 }, 19, 0 }, -                      { duration: 1000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 4000, 0 }, 19, 3 }, -                      { duration: 3000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_HIGH_SS_2 -        { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2900, 0 }, 19, 0 }, -                      { duration: 1000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2900, 0 }, 19, 3 }, -                      { duration: 3000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_MED_SS_2 -        { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1450, 0 }, 19, 0 }, -                      { duration: 1000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1450, 0 }, 19, 3 }, -                      { duration: 3000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_LOW_SS_2 -        { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 4000, 0 }, 9, 0 }, -                      { duration: 500, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 4000, 0 }, 19, 3 }, -                      { duration: 500, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 4000, 0 }, 9, 6 }, -                      { duration: 3000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_HIGH_SLS -        { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2900, 0 }, 9, 0 }, -                      { duration: 500, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2900, 0 }, 19, 3 }, -                      { duration: 500, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2900, 0 }, 9, 6 }, -                      { duration: 3000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_MED_SLS -        { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1450, 0 }, 9, 0 }, -                      { duration: 500, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1450, 0 }, 19, 3 }, -                      { duration: 500, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1450, 0 }, 9, 6 }, -                      { duration: 3000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_LOW_SLS -        { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 4000, 0 }, 9, 0 }, -                      { duration: 500, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 4000, 0 }, 9, 3 }, -                      { duration: 500, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 4000, 0 }, 9, 6 }, -                      { duration: 500, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 4000, 0 }, 9, 9 }, -                      { duration: 2500, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_HIGH_S_X4 -        { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2900, 0 }, 9, 0 }, -                      { duration: 500, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2900, 0 }, 9, 3 }, -                      { duration: 500, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2900, 0 }, 9, 6 }, -                      { duration: 500, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2900, 0 }, 9, 9 }, -                      { duration: 2500, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_MED_S_X4 -        { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1450, 0 }, 9, 0 }, -                      { duration: 500, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1450, 0 }, 9, 3 }, -                      { duration: 500, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1450, 0 }, 9, 6 }, -                      { duration: 500, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1450, 0 }, 9, 9 }, -                      { duration: 2500, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_LOW_S_X4 -        { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 4000, 0 }, 19, 0 }, -                      { duration: 2000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_HIGH_PBX_L -        { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2900, 0 }, 19, 0 }, -                      { duration: 2000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_MED_PBX_L -        { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1450, 0 }, 19, 0 }, -                      { duration: 2000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_LOW_PBX_L -        { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 4000, 0 }, 7, 0 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 4000, 0 }, 7, 3 }, -                      { duration: 2000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_HIGH_PBX_SS -        { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2900, 0 }, 7, 0 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2900, 0 }, 7, 3 }, -                      { duration: 2000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_MED_PBX_SS -        { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1450, 0 }, 7, 0 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1450, 0 }, 7, 3 }, -                      { duration: 2000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_LOW_PBX_SS -        { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 4000, 0 }, 7, 0 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 4000, 0 }, 7, 3 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 4000, 0 }, 15, 6 }, -                      { duration: 1000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_HIGH_PBX_SSL -        { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2900, 0 }, 7, 0 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2900, 0 }, 7, 3 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2900, 0 }, 15, 6 }, -                      { duration: 1000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_MED_PBX_SSL -        { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1450, 0 }, 7, 0 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1450, 0 }, 7, 3 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1450, 0 }, 15, 6 }, -                      { duration: 1000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_LOW_PBX_SSL -        { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 4000, 0 }, 7, 0 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 4000, 0 }, 15, 3 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 4000, 0 }, 7, 6 }, -                      { duration: 1000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_HIGH_PBX_SLS -        { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2900, 0 }, 7, 0 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2900, 0 }, 15, 3 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2900, 0 }, 7, 6 }, -                      { duration: 1000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_MED_PBX_SLS -        { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1450, 0 }, 7, 0 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1450, 0 }, 15, 3 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1450, 0 }, 7, 6 }, -                      { duration: 1000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_LOW_PBX_SLS -        { segments: { { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 4000, 0 }, 7, 0 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 4000, 0 }, 7, 3 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 4000, 0 }, 7, 6 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 3700, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 4000, 0 }, 7, 9 }, -                      { duration: 800, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_HIGH_PBX_S_X4 -        { segments: { { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2900, 0 }, 7, 0 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2900, 0 }, 7, 3 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2900, 0 }, 7, 6 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2600, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 2900, 0 }, 7, 9 }, -                      { duration: 800, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_MED_PBX_S_X4 -        { segments: { { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1450, 0 }, 7, 0 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1450, 0 }, 7, 3 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1450, 0 }, 7, 6 }, -                      { duration: 200, waveFreq: { 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1300, 0 }, 0, 0 }, -                      { duration: 25, waveFreq: { 1450, 0 }, 7, 9 }, -                      { duration: 800, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                           // TONE_CDMA_LOW_PBX_S_X4 - -        { segments: { { duration: 62, waveFreq: { 1109, 0 }, 0, 0 }, -                      { duration: 62, waveFreq: { 784, 0 },  0, 0 }, -                      { duration: 62, waveFreq: { 740, 0 },  0, 0 }, -                      { duration: 62, waveFreq: { 622, 0 },  0, 0 }, -                      { duration: 62, waveFreq: { 1109, 0 }, 0, 0 }, -                      { duration: 0,  waveFreq: { 0 },       0, 0 } }, -          repeatCnt: 0, -          repeatSegment: 0 },                            // TONE_CDMA_ALERT_NETWORK_LITE -        { segments: { { duration: 62, waveFreq: { 1245, 0 }, 0, 0 }, -                      { duration: 62, waveFreq: { 659, 0 },  2, 0 }, -                      { duration: 62, waveFreq: { 1245, 0 }, 0, 0 }, -                      { duration: 0,  waveFreq: { 0 },       0, 0 } }, -          repeatCnt: 0, -          repeatSegment: 0 },                            // TONE_CDMA_ALERT_AUTOREDIAL_LITE -        { segments: { { duration: 400, waveFreq: { 1150, 770, 0 }, 0, 0 }, -                      { duration: 0,   waveFreq: { 0 },            0, 0 } }, -          repeatCnt: 0, -          repeatSegment: 0 },                            // TONE_CDMA_ONE_MIN_BEEP -        { segments: { { duration: 120, waveFreq: { 941, 1477, 0 }, 0, 0 }, -                      { duration: 0,   waveFreq: { 0 },            0, 0 } }, -          repeatCnt: 0, -          repeatSegment: 0 },                            // TONE_CDMA_KEYPAD_VOLUME_KEY_LITE -        { segments: { { duration: 375, waveFreq: { 587, 0 }, 0, 0 }, -                      { duration: 125, waveFreq: { 1175, 0 }, 0, 0 }, -                      { duration: 0,   waveFreq: { 0 },       0, 0 } }, -          repeatCnt: 0, -          repeatSegment: 0 },                            // TONE_CDMA_PRESSHOLDKEY_LITE -        { segments: { { duration: 62, waveFreq: { 587, 0 }, 0, 0 }, -                      { duration: 62, waveFreq: { 784, 0 }, 0, 0 }, -                      { duration: 62, waveFreq: { 831, 0 }, 0, 0 }, -                      { duration: 62, waveFreq: { 784, 0 }, 0, 0 }, -                      { duration: 62, waveFreq: { 1109, 0 }, 0, 0 }, -                      { duration: 62, waveFreq: { 784, 0 }, 0, 0 }, -                      { duration: 62, waveFreq: { 831, 0 }, 0, 0 }, -                      { duration: 62, waveFreq: { 784, 0 }, 0, 0 }, -                      { duration: 0,  waveFreq: { 0 },      0, 0 } }, -          repeatCnt: 0, -          repeatSegment: 0 },                             // TONE_CDMA_ALERT_INCALL_LITE -        { segments: { { duration: 125, waveFreq: { 941, 0 }, 0, 0 }, -                      { duration: 10,  waveFreq: { 0 },      2, 0 }, -                      { duration: 4990, waveFreq: { 0 },     0, 0 }, -                      { duration: 0,    waveFreq: { 0 },     0, 0 } }, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                            // TONE_CDMA_EMERGENCY_RINGBACK -        { segments: { { duration: 125, waveFreq: { 1319, 0 }, 0, 0 }, -                      { duration: 125, waveFreq: { 0 },       0, 0 }, -                      { duration: 0,   waveFreq: { 0 },       0, 0 } }, -          repeatCnt: 2, -          repeatSegment: 0 },                            // TONE_CDMA_ALERT_CALL_GUARD -        { segments: { { duration: 125, waveFreq: { 1047, 0 }, 0, 0 }, -                      { duration: 125, waveFreq: { 370,  0 }, 0, 0 }, -                      { duration: 0,   waveFreq: { 0 },       0, 0 } }, -          repeatCnt: 0, -          repeatSegment: 0 },                            // TONE_CDMA_SOFT_ERROR_LITE -        { segments: { { duration: 125, waveFreq: { 1480, 0 }, 0, 0 }, -                      { duration: 125, waveFreq: { 1397, 0 }, 0, 0 }, -                      { duration: 125, waveFreq: { 784, 0 },  0, 0 }, -                      { duration: 0,   waveFreq: { 0 },       0, 0 } }, -          repeatCnt: 0, -          repeatSegment: 0 },                            // TONE_CDMA_CALLDROP_LITE - -        { segments: { { duration: 500, waveFreq: { 425, 0 }, 0, 0 }, -                      { duration: 500, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: 0, -          repeatSegment: 0 },                           // TONE_CDMA_NETWORK_BUSY_ONE_SHOT -        { segments: { { duration: 400, waveFreq: { 1150, 770 }, 0, 0 }, -                      { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: 0, -          repeatSegment: 0 },                           // TONE_CDMA_ABBR_ALERT -          { segments: { { duration: 0, waveFreq: { 0 }, 0, 0 }}, -          repeatCnt: 0, -          repeatSegment: 0 },                            // TONE_CDMA_SIGNAL_OFF - -        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 350, 440, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_ANSI_DIAL -        { segments: { { duration: 500, waveFreq: { 480, 620, 0 }, 0, 0 }, -                      { duration: 500, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_ANSI_BUSY -        { segments: { { duration: 250, waveFreq: { 480, 620, 0 }, 0, 0 }, -                      { duration: 250, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_ANSI_CONGESTION -        { segments: { { duration: 300, waveFreq: { 440, 0 }, 0, 0 }, -                      { duration: 9700, waveFreq: { 0 }, 0, 0 }, -                      { duration: 100, waveFreq: { 440, 0 }, 0, 0 }, -                      { duration: 100, waveFreq: { 0 }, 0, 0 }, -                      { duration: 100, waveFreq: { 440, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 1 },                              // TONE_ANSI_CALL_WAITING -        { segments: { { duration: 2000, waveFreq: { 440, 480, 0 }, 0, 0 }, -                      { duration: 4000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_ANSI_RINGTONE -        { segments: { { duration: ToneGenerator::TONEGEN_INF, waveFreq: { 400, 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_JAPAN_DIAL -        { segments: { { duration: 500, waveFreq: { 400, 0 }, 0, 0 }, -                      { duration: 500, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_JAPAN_BUSY -        { segments: { { duration: 1000, waveFreq: { 400, 0 }, 0, 0 }, -                      { duration: 2000, waveFreq: { 0 }, 0, 0 }, -                      { duration: 0 , waveFreq: { 0 }, 0, 0}}, -          repeatCnt: ToneGenerator::TONEGEN_INF, -          repeatSegment: 0 },                              // TONE_JAPAN_RADIO_ACK +        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1336, 941, 0 }, 0, 0}, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_DTMF_0 +        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1209, 697, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_DTMF_1 +        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1336, 697, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_DTMF_2 +        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1477, 697, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_DTMF_3 +        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1209, 770, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_DTMF_4 +        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1336, 770, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_DTMF_5 +        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1477, 770, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_DTMF_6 +        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1209, 852, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_DTMF_7 +        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1336, 852, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_DTMF_8 +        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1477, 852, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_DTMF_9 +        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1209, 941, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_DTMF_S +        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1477, 941, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_DTMF_P +        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1633, 697, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_DTMF_A +        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1633, 770, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                             // TONE_DTMF_B +        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1633, 852, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_DTMF_C +        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 1633, 941, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_DTMF_D +        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 425, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_SUP_DIAL +        { .segments = { { .duration = 500 , .waveFreq = { 425, 0 }, 0, 0}, +                        { .duration = 500, .waveFreq = { 0 }, 0, 0}, +                           { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_SUP_BUSY +        { .segments = { { .duration = 200, .waveFreq = { 425, 0 }, 0, 0 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_SUP_CONGESTION +        { .segments = { { .duration = 200, .waveFreq = { 425, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = 0, +          .repeatSegment = 0 },                              // TONE_SUP_RADIO_ACK +        { .segments = { { .duration = 200, .waveFreq = { 425, 0 }, 0, 0}, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0}, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = 2, +          .repeatSegment = 0 },                              // TONE_SUP_RADIO_NOTAVAIL +        { .segments = { { .duration = 330, .waveFreq = { 950, 1400, 1800, 0 }, 0, 0}, +                        { .duration = 1000, .waveFreq = { 0 }, 0, 0}, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_SUP_ERROR +        { .segments = { { .duration = 200, .waveFreq = { 425, 0 }, 0, 0 }, +                        { .duration = 600, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 200, .waveFreq = { 425, 0 }, 0, 0 }, +                        { .duration = 3000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_SUP_CALL_WAITING +        { .segments = { { .duration = 1000, .waveFreq = { 425, 0 }, 0, 0 }, +                        { .duration = 4000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_SUP_RINGTONE +        { .segments = { { .duration = 40, .waveFreq = { 400, 1200, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = 0, +          .repeatSegment = 0 },                              // TONE_PROP_BEEP +        { .segments = { { .duration = 100, .waveFreq = { 1200, 0 }, 0, 0 }, +                        { .duration = 100, .waveFreq = { 0 }, 0, 0  }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = 1, +          .repeatSegment = 0 },                              // TONE_PROP_ACK +        { .segments = { { .duration = 400, .waveFreq = { 300, 400, 500, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = 0, +          .repeatSegment = 0 },                              // TONE_PROP_NACK +        { .segments = { { .duration = 200, .waveFreq = { 400, 1200, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = 0, +          .repeatSegment = 0 },                              // TONE_PROP_PROMPT +        { .segments = { { .duration = 40, .waveFreq = { 400, 1200, 0 }, 0, 0 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 40, .waveFreq = { 400, 1200, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = 0, +          .repeatSegment = 0 },                             // TONE_PROP_BEEP2 +        { .segments = { { .duration = 250, .waveFreq = { 440, 0 }, 0, 0 }, +                        { .duration = 250, .waveFreq = { 620, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_SUP_INTERCEPT +        { .segments = { { .duration = 250, .waveFreq = { 440, 0 }, 0, 0 }, +                        { .duration = 250, .waveFreq = { 620, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = 7, +          .repeatSegment = 0 },                             // TONE_SUP_INTERCEPT_ABBREV +        { .segments = { { .duration = 250, .waveFreq = { 480, 620, 0 }, 0, 0 }, +                        { .duration = 250, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = 7, +          .repeatSegment = 0 },                             // TONE_SUP_CONGESTION_ABBREV +        { .segments = { { .duration = 100, .waveFreq = { 350, 440, 0 }, 0, 0 }, +                        { .duration = 100, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = 2, +          .repeatSegment = 0 },                             // TONE_SUP_CONFIRM +        { .segments = { { .duration = 100, .waveFreq = { 480, 0 }, 0, 0 }, +                        { .duration = 100, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = 3, +          .repeatSegment = 0 },                              // TONE_SUP_PIP +        { .segments = {{ .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 425, 0 }, 0, 0}, +                       { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_CDMA_DIAL_TONE_LITE +        { .segments = { { .duration = 2000, .waveFreq = { 440, 480, 0 }, 0, 0 }, +                        { .duration = 4000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_CDMA_NETWORK_USA_RINGBACK +        { .segments = { { .duration = 250, .waveFreq = { 440, 0 }, 0, 0 }, +                        { .duration = 250, .waveFreq = { 620, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt =  ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                             // TONE_CDMA_INTERCEPT +        { .segments = { { .duration = 250, .waveFreq = { 440, 0 }, 0, 0 }, +                        { .duration = 250, .waveFreq = { 620, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt =  0, +          .repeatSegment = 0 },                             // TONE_CDMA_ABBR_INTERCEPT +        { .segments = { { .duration = 250, .waveFreq = { 480, 620, 0 }, 0, 0 }, +                        { .duration = 250, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_CDMA_REORDER +        { .segments = { { .duration = 250, .waveFreq = { 480, 620, 0 }, 0, 0 }, +                        { .duration = 250, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = 7, +          .repeatSegment = 0 },                              // TONE_CDMA_ABBR_REORDER +        { .segments = { { .duration = 500, .waveFreq = { 480, 620, 0 }, 0, 0 }, +                        { .duration = 500, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_CDMA_NETWORK_BUSY +        { .segments = { { .duration = 100, .waveFreq = { 350, 440, 0 }, 0, 0 }, +                        { .duration = 100, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = 2, +          .repeatSegment = 0 },                              // TONE_CDMA_CONFIRM +        { .segments = { { .duration = 500, .waveFreq = { 660, 1000, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = 0, +          .repeatSegment = 0 },                              // TONE_CDMA_ANSWER +        { .segments = { { .duration = 300, .waveFreq = { 440, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = 0, +          .repeatSegment = 0 },                              // TONE_CDMA_NETWORK_CALLWAITING +        { .segments = { { .duration = 100, .waveFreq = { 480, 0 }, 0, 0 }, +                        { .duration = 100, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = 3, +          .repeatSegment = 0 },                              // TONE_CDMA_PIP + +        { .segments = { { .duration = 32, .waveFreq = { 2091, 0}, 0, 0 }, +                        { .duration = 64, .waveFreq = { 2556, 0}, 19, 0}, +                        { .duration = 32, .waveFreq = { 2091, 0}, 0, 0}, +                        { .duration = 48, .waveFreq = { 2556, 0}, 0, 0}, +                        { .duration = 4000, .waveFreq = { 0 }, 0, 0}, +                        { .duration = 0,  .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = 0, +          .repeatSegment = 0 },                             // TONE_CDMA_CALL_SIGNAL_ISDN_NORMAL +        { .segments = { { .duration = 32, .waveFreq = { 2091, 0}, 0, 0 }, +                        { .duration = 64, .waveFreq = { 2556, 0}, 7, 0 }, +                        { .duration = 32, .waveFreq = { 2091, 0}, 0, 0 }, +                        { .duration = 400, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 32,  .waveFreq = { 2091, 0}, 0, 0 }, +                        { .duration = 64,  .waveFreq = { 2556, 0}, 7, 4 }, +                        { .duration = 32,  .waveFreq = { 2091, 0}, 0, 0 }, +                        { .duration = 4000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0,    .waveFreq = { 0 }, 0, 0 } }, +          .repeatCnt = 0, +          .repeatSegment = 0 },                              // TONE_CDMA_CALL_SIGNAL_ISDN_INTERGROUP +        { .segments = { { .duration = 32, .waveFreq = { 2091, 0}, 0, 0 }, +                        { .duration = 64, .waveFreq = { 2556, 0}, 3, 0 }, +                        { .duration = 16, .waveFreq = { 2091, 0}, 0, 0 }, +                        { .duration = 200, .waveFreq = { 0 },     0, 0 }, +                        { .duration = 32, .waveFreq = { 2091, 0}, 0, 0 }, +                        { .duration = 64, .waveFreq = { 2556, 0}, 3, 4 }, +                        { .duration = 16, .waveFreq = { 2091, 0}, 0, 0 }, +                        { .duration = 200, .waveFreq = { 0 },     0, 0 }, +                        { .duration = 0,   .waveFreq = { 0 },     0, 0 } }, +          .repeatCnt = 0, +          .repeatSegment = 0 },                            // TONE_CDMA_CALL_SIGNAL_ISDN_SP_PRI +        { .segments = { { .duration = 0,  .waveFreq = { 0 }, 0, 0} }, +          .repeatCnt = 0, +          .repeatSegment = 0 },                            // TONE_CDMA_CALL_SIGNAL_ISDN_PAT3 +        { .segments = { { .duration = 32, .waveFreq = { 2091, 0 }, 0, 0 }, +                        { .duration = 64, .waveFreq = { 2556, 0 }, 4, 0 }, +                        { .duration = 20, .waveFreq = { 2091, 0 }, 0, 0 }, +                        { .duration = 0,  .waveFreq = { 0 }      , 0, 0 } }, +          .repeatCnt = 0, +          .repeatSegment = 0 },                             // TONE_CDMA_CALL_SIGNAL_ISDN_PING_RING +        { .segments = { { .duration = 0,  .waveFreq = { 0 }, 0, 0} }, +          .repeatCnt = 0, +          .repeatSegment = 0 },                             // TONE_CDMA_CALL_SIGNAL_ISDN_PAT5 +        { .segments = { { .duration = 0,  .waveFreq = { 0 }, 0, 0} }, +          .repeatCnt = 0, +          .repeatSegment = 0 },                             // TONE_CDMA_CALL_SIGNAL_ISDN_PAT6 +        { .segments = { { .duration = 0,  .waveFreq = { 0 }, 0, 0} }, +          .repeatCnt = 0, +          .repeatSegment = 0 },                             // TONE_CDMA_CALL_SIGNAL_ISDN_PAT7 + +        { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 4000, 0 }, 39, 0 }, +                        { .duration = 4000, .waveFreq = { 0 },     0, 0 }, +                        { .duration = 0,    .waveFreq = { 0 },     0, 0 } }, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_HIGH_L +        { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2900, 0 }, 39, 0 }, +                        { .duration = 4000, .waveFreq = { 0 },     0, 0 }, +                        { .duration = 0,    .waveFreq = { 0 },     0, 0 } }, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_MED_L +        { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1450, 0 }, 39, 0 }, +                        { .duration = 4000, .waveFreq = { 0 },     0, 0 }, +                        { .duration = 0,    .waveFreq = { 0 },     0, 0 } }, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_LOW_L +        { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 4000, 0 }, 15, 0 }, +                        { .duration = 400, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 } }, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_HIGH_SS +        { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2900, 0 }, 15, 0 }, +                        { .duration = 400, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_MED_SS +        { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1450, 0 }, 15, 0 }, +                        { .duration = 400, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_LOW_SS +        { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 4000, 0 }, 7, 0 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 4000, 0 }, 7, 3 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 4000, 0 }, 15, 6 }, +                        { .duration = 4000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_HIGH_SSL +        { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2900, 0 }, 7, 0 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2900, 0 }, 7, 3 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2900, 0 }, 15, 6 }, +                        { .duration = 4000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_MED_SSL +        { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1450, 0 }, 7, 0 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1450, 0 }, 7, 3 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1450, 0 }, 15, 6 }, +                        { .duration = 4000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_LOW_SSL +        { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 }, +                          { .duration = 25, .waveFreq = { 4000, 0 }, 19, 0 }, +                        { .duration = 1000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 4000, 0 }, 19, 3 }, +                        { .duration = 3000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_HIGH_SS_2 +        { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2900, 0 }, 19, 0 }, +                        { .duration = 1000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2900, 0 }, 19, 3 }, +                        { .duration = 3000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_MED_SS_2 +        { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1450, 0 }, 19, 0 }, +                        { .duration = 1000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1450, 0 }, 19, 3 }, +                        { .duration = 3000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_LOW_SS_2 +        { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 4000, 0 }, 9, 0 }, +                        { .duration = 500, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 4000, 0 }, 19, 3 }, +                        { .duration = 500, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 4000, 0 }, 9, 6 }, +                        { .duration = 3000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_HIGH_SLS +        { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2900, 0 }, 9, 0 }, +                        { .duration = 500, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2900, 0 }, 19, 3 }, +                        { .duration = 500, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2900, 0 }, 9, 6 }, +                        { .duration = 3000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_MED_SLS +        { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1450, 0 }, 9, 0 }, +                        { .duration = 500, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1450, 0 }, 19, 3 }, +                        { .duration = 500, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1450, 0 }, 9, 6 }, +                        { .duration = 3000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_LOW_SLS +        { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 4000, 0 }, 9, 0 }, +                        { .duration = 500, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 4000, 0 }, 9, 3 }, +                        { .duration = 500, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 4000, 0 }, 9, 6 }, +                        { .duration = 500, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 4000, 0 }, 9, 9 }, +                        { .duration = 2500, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_HIGH_S_X4 +        { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2900, 0 }, 9, 0 }, +                        { .duration = 500, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2900, 0 }, 9, 3 }, +                        { .duration = 500, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2900, 0 }, 9, 6 }, +                        { .duration = 500, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2900, 0 }, 9, 9 }, +                        { .duration = 2500, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_MED_S_X4 +        { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1450, 0 }, 9, 0 }, +                        { .duration = 500, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1450, 0 }, 9, 3 }, +                        { .duration = 500, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1450, 0 }, 9, 6 }, +                        { .duration = 500, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1450, 0 }, 9, 9 }, +                        { .duration = 2500, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_LOW_S_X4 +        { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 4000, 0 }, 19, 0 }, +                        { .duration = 2000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_HIGH_PBX_L +        { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2900, 0 }, 19, 0 }, +                        { .duration = 2000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_MED_PBX_L +        { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1450, 0 }, 19, 0 }, +                        { .duration = 2000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_LOW_PBX_L +        { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 4000, 0 }, 7, 0 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 4000, 0 }, 7, 3 }, +                        { .duration = 2000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_HIGH_PBX_SS +        { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2900, 0 }, 7, 0 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2900, 0 }, 7, 3 }, +                        { .duration = 2000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_MED_PBX_SS +        { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1450, 0 }, 7, 0 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1450, 0 }, 7, 3 }, +                        { .duration = 2000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_LOW_PBX_SS +        { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 4000, 0 }, 7, 0 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 4000, 0 }, 7, 3 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 4000, 0 }, 15, 6 }, +                        { .duration = 1000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_HIGH_PBX_SSL +        { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2900, 0 }, 7, 0 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2900, 0 }, 7, 3 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2900, 0 }, 15, 6 }, +                        { .duration = 1000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_MED_PBX_SSL +        { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1450, 0 }, 7, 0 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1450, 0 }, 7, 3 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1450, 0 }, 15, 6 }, +                        { .duration = 1000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_LOW_PBX_SSL +        { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 4000, 0 }, 7, 0 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 4000, 0 }, 15, 3 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 4000, 0 }, 7, 6 }, +                        { .duration = 1000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_HIGH_PBX_SLS +        { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2900, 0 }, 7, 0 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2900, 0 }, 15, 3 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2900, 0 }, 7, 6 }, +                        { .duration = 1000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_MED_PBX_SLS +        { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1450, 0 }, 7, 0 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1450, 0 }, 15, 3 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1450, 0 }, 7, 6 }, +                        { .duration = 1000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +           .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_LOW_PBX_SLS +        { .segments = { { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 4000, 0 }, 7, 0 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 4000, 0 }, 7, 3 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 4000, 0 }, 7, 6 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 3700, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 4000, 0 }, 7, 9 }, +                        { .duration = 800, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_HIGH_PBX_S_X4 +        { .segments = { { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2900, 0 }, 7, 0 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2900, 0 }, 7, 3 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2900, 0 }, 7, 6 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2600, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 2900, 0 }, 7, 9 }, +                        { .duration = 800, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_MED_PBX_S_X4 +        { .segments = { { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1450, 0 }, 7, 0 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1450, 0 }, 7, 3 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1450, 0 }, 7, 6 }, +                        { .duration = 200, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1300, 0 }, 0, 0 }, +                        { .duration = 25, .waveFreq = { 1450, 0 }, 7, 9 }, +                        { .duration = 800, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                           // TONE_CDMA_LOW_PBX_S_X4 + +        { .segments = { { .duration = 62, .waveFreq = { 1109, 0 }, 0, 0 }, +                        { .duration = 62, .waveFreq = { 784, 0 },  0, 0 }, +                        { .duration = 62, .waveFreq = { 740, 0 },  0, 0 }, +                        { .duration = 62, .waveFreq = { 622, 0 },  0, 0 }, +                        { .duration = 62, .waveFreq = { 1109, 0 }, 0, 0 }, +                        { .duration = 0,  .waveFreq = { 0 },       0, 0 } }, +          .repeatCnt = 0, +          .repeatSegment = 0 },                            // TONE_CDMA_ALERT_NETWORK_LITE +        { .segments = { { .duration = 62, .waveFreq = { 1245, 0 }, 0, 0 }, +                        { .duration = 62, .waveFreq = { 659, 0 },  2, 0 }, +                        { .duration = 62, .waveFreq = { 1245, 0 }, 0, 0 }, +                        { .duration = 0,  .waveFreq = { 0 },       0, 0 } }, +          .repeatCnt = 0, +          .repeatSegment = 0 },                            // TONE_CDMA_ALERT_AUTOREDIAL_LITE +        { .segments = { { .duration = 400, .waveFreq = { 1150, 770, 0 }, 0, 0 }, +                        { .duration = 0,   .waveFreq = { 0 },            0, 0 } }, +          .repeatCnt = 0, +          .repeatSegment = 0 },                            // TONE_CDMA_ONE_MIN_BEEP +        { .segments = { { .duration = 120, .waveFreq = { 941, 1477, 0 }, 0, 0 }, +                        { .duration = 0,   .waveFreq = { 0 },            0, 0 } }, +          .repeatCnt = 0, +          .repeatSegment = 0 },                            // TONE_CDMA_KEYPAD_VOLUME_KEY_LITE +        { .segments = { { .duration = 375, .waveFreq = { 587, 0 }, 0, 0 }, +                        { .duration = 125, .waveFreq = { 1175, 0 }, 0, 0 }, +                        { .duration = 0,   .waveFreq = { 0 },       0, 0 } }, +          .repeatCnt = 0, +          .repeatSegment = 0 },                            // TONE_CDMA_PRESSHOLDKEY_LITE +        { .segments = { { .duration = 62, .waveFreq = { 587, 0 }, 0, 0 }, +                        { .duration = 62, .waveFreq = { 784, 0 }, 0, 0 }, +                        { .duration = 62, .waveFreq = { 831, 0 }, 0, 0 }, +                        { .duration = 62, .waveFreq = { 784, 0 }, 0, 0 }, +                        { .duration = 62, .waveFreq = { 1109, 0 }, 0, 0 }, +                        { .duration = 62, .waveFreq = { 784, 0 }, 0, 0 }, +                        { .duration = 62, .waveFreq = { 831, 0 }, 0, 0 }, +                        { .duration = 62, .waveFreq = { 784, 0 }, 0, 0 }, +                        { .duration = 0,  .waveFreq = { 0 },      0, 0 } }, +          .repeatCnt = 0, +          .repeatSegment = 0 },                             // TONE_CDMA_ALERT_INCALL_LITE +        { .segments = { { .duration = 125, .waveFreq = { 941, 0 }, 0, 0 }, +                        { .duration = 10,  .waveFreq = { 0 },      2, 0 }, +                        { .duration = 4990, .waveFreq = { 0 },     0, 0 }, +                        { .duration = 0,    .waveFreq = { 0 },     0, 0 } }, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                            // TONE_CDMA_EMERGENCY_RINGBACK +        { .segments = { { .duration = 125, .waveFreq = { 1319, 0 }, 0, 0 }, +                        { .duration = 125, .waveFreq = { 0 },       0, 0 }, +                        { .duration = 0,   .waveFreq = { 0 },       0, 0 } }, +          .repeatCnt = 2, +          .repeatSegment = 0 },                            // TONE_CDMA_ALERT_CALL_GUARD +        { .segments = { { .duration = 125, .waveFreq = { 1047, 0 }, 0, 0 }, +                        { .duration = 125, .waveFreq = { 370,  0 }, 0, 0 }, +                        { .duration = 0,   .waveFreq = { 0 },       0, 0 } }, +          .repeatCnt = 0, +          .repeatSegment = 0 },                            // TONE_CDMA_SOFT_ERROR_LITE +        { .segments = { { .duration = 125, .waveFreq = { 1480, 0 }, 0, 0 }, +                        { .duration = 125, .waveFreq = { 1397, 0 }, 0, 0 }, +                        { .duration = 125, .waveFreq = { 784, 0 },  0, 0 }, +                        { .duration = 0,   .waveFreq = { 0 },       0, 0 } }, +          .repeatCnt = 0, +          .repeatSegment = 0 },                            // TONE_CDMA_CALLDROP_LITE + +        { .segments = { { .duration = 500, .waveFreq = { 425, 0 }, 0, 0 }, +                        { .duration = 500, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = 0, +          .repeatSegment = 0 },                           // TONE_CDMA_NETWORK_BUSY_ONE_SHOT +        { .segments = { { .duration = 400, .waveFreq = { 1150, 770 }, 0, 0 }, +                        { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = 0, +          .repeatSegment = 0 },                           // TONE_CDMA_ABBR_ALERT +          { .segments = { { .duration = 0, .waveFreq = { 0 }, 0, 0 }}, +          .repeatCnt = 0, +          .repeatSegment = 0 },                            // TONE_CDMA_SIGNAL_OFF + +        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 350, 440, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_ANSI_DIAL +        { .segments = { { .duration = 500, .waveFreq = { 480, 620, 0 }, 0, 0 }, +                        { .duration = 500, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_ANSI_BUSY +        { .segments = { { .duration = 250, .waveFreq = { 480, 620, 0 }, 0, 0 }, +                        { .duration = 250, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_ANSI_CONGESTION +        { .segments = { { .duration = 300, .waveFreq = { 440, 0 }, 0, 0 }, +                        { .duration = 9700, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 100, .waveFreq = { 440, 0 }, 0, 0 }, +                        { .duration = 100, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 100, .waveFreq = { 440, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 1 },                              // TONE_ANSI_CALL_WAITING +        { .segments = { { .duration = 2000, .waveFreq = { 440, 480, 0 }, 0, 0 }, +                        { .duration = 4000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_ANSI_RINGTONE +        { .segments = { { .duration = ToneGenerator::TONEGEN_INF, .waveFreq = { 400, 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_JAPAN_DIAL +        { .segments = { { .duration = 500, .waveFreq = { 400, 0 }, 0, 0 }, +                        { .duration = 500, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_JAPAN_BUSY +        { .segments = { { .duration = 1000, .waveFreq = { 400, 0 }, 0, 0 }, +                        { .duration = 2000, .waveFreq = { 0 }, 0, 0 }, +                        { .duration = 0 , .waveFreq = { 0 }, 0, 0}}, +          .repeatCnt = ToneGenerator::TONEGEN_INF, +          .repeatSegment = 0 },                              // TONE_JAPAN_RADIO_ACK diff --git a/media/libmedia/mediametadataretriever.cpp b/media/libmedia/mediametadataretriever.cpp index 39a239d..8e8a1ed 100644 --- a/media/libmedia/mediametadataretriever.cpp +++ b/media/libmedia/mediametadataretriever.cpp @@ -172,7 +172,7 @@ MediaMetadataRetriever::DeathNotifier::~DeathNotifier()  {      Mutex::Autolock lock(sServiceLock);      if (sService != 0) { -        sService->asBinder()->unlinkToDeath(this); +        IInterface::asBinder(sService)->unlinkToDeath(this);      }  } diff --git a/media/libmedia/mediaplayer.cpp b/media/libmedia/mediaplayer.cpp index 9611ac7..05c89ed 100644 --- a/media/libmedia/mediaplayer.cpp +++ b/media/libmedia/mediaplayer.cpp @@ -835,53 +835,12 @@ void MediaPlayer::notify(int msg, int ext1, int ext2, const Parcel *obj)      }  } -/*static*/ status_t MediaPlayer::decode( -        const sp<IMediaHTTPService> &httpService, -        const char* url, -        uint32_t *pSampleRate, -        int* pNumChannels, -        audio_format_t* pFormat, -        const sp<IMemoryHeap>& heap, -        size_t *pSize) -{ -    ALOGV("decode(%s)", url); -    status_t status; -    const sp<IMediaPlayerService>& service = getMediaPlayerService(); -    if (service != 0) { -        status = service->decode(httpService, url, pSampleRate, pNumChannels, pFormat, heap, pSize); -    } else { -        ALOGE("Unable to locate media service"); -        status = DEAD_OBJECT; -    } -    return status; - -} -  void MediaPlayer::died()  {      ALOGV("died");      notify(MEDIA_ERROR, MEDIA_ERROR_SERVER_DIED, 0);  } -/*static*/ status_t MediaPlayer::decode(int fd, int64_t offset, int64_t length, -                                        uint32_t *pSampleRate, int* pNumChannels, -                                        audio_format_t* pFormat, -                                        const sp<IMemoryHeap>& heap, size_t *pSize) -{ -    ALOGV("decode(%d, %" PRId64 ", %" PRId64 ")", fd, offset, length); -    status_t status; -    const sp<IMediaPlayerService>& service = getMediaPlayerService(); -    if (service != 0) { -        status = service->decode(fd, offset, length, pSampleRate, -                                 pNumChannels, pFormat, heap, pSize); -    } else { -        ALOGE("Unable to locate media service"); -        status = DEAD_OBJECT; -    } -    return status; - -} -  status_t MediaPlayer::setNextMediaPlayer(const sp<MediaPlayer>& next) {      if (mPlayer == NULL) {          return NO_INIT; diff --git a/media/libmediaplayerservice/Android.mk b/media/libmediaplayerservice/Android.mk index 2cf5710..9d8fe62 100644 --- a/media/libmediaplayerservice/Android.mk +++ b/media/libmediaplayerservice/Android.mk @@ -15,8 +15,6 @@ LOCAL_SRC_FILES:=               \      MediaPlayerService.cpp      \      MediaRecorderClient.cpp     \      MetadataRetrieverClient.cpp \ -    MidiFile.cpp                \ -    MidiMetadataRetriever.cpp   \      RemoteDisplay.cpp           \      SharedLibrary.cpp           \      StagefrightPlayer.cpp       \ diff --git a/media/libmediaplayerservice/Drm.cpp b/media/libmediaplayerservice/Drm.cpp index ac948a6..9d5ba15 100644 --- a/media/libmediaplayerservice/Drm.cpp +++ b/media/libmediaplayerservice/Drm.cpp @@ -85,10 +85,10 @@ status_t Drm::setListener(const sp<IDrmClient>& listener)  {      Mutex::Autolock lock(mEventLock);      if (mListener != NULL){ -        mListener->asBinder()->unlinkToDeath(this); +        IInterface::asBinder(mListener)->unlinkToDeath(this);      }      if (listener != NULL) { -        listener->asBinder()->linkToDeath(this); +        IInterface::asBinder(listener)->linkToDeath(this);      }      mListener = listener;      return NO_ERROR; diff --git a/media/libmediaplayerservice/MediaPlayerFactory.cpp b/media/libmediaplayerservice/MediaPlayerFactory.cpp index aeefb4c..48884b9 100644 --- a/media/libmediaplayerservice/MediaPlayerFactory.cpp +++ b/media/libmediaplayerservice/MediaPlayerFactory.cpp @@ -15,6 +15,7 @@  ** limitations under the License.  */ +//#define LOG_NDEBUG 0  #define LOG_TAG "MediaPlayerFactory"  #include <utils/Log.h> @@ -29,7 +30,6 @@  #include "MediaPlayerFactory.h" -#include "MidiFile.h"  #include "TestPlayerStub.h"  #include "StagefrightPlayer.h"  #include "nuplayer/NuPlayerDriver.h" @@ -279,75 +279,6 @@ class NuPlayerFactory : public MediaPlayerFactory::IFactory {      }  }; -class SonivoxPlayerFactory : public MediaPlayerFactory::IFactory { -  public: -    virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/, -                               const char* url, -                               float curScore) { -        static const float kOurScore = 0.4; -        static const char* const FILE_EXTS[] = { ".mid", -                                                 ".midi", -                                                 ".smf", -                                                 ".xmf", -                                                 ".mxmf", -                                                 ".imy", -                                                 ".rtttl", -                                                 ".rtx", -                                                 ".ota" }; -        if (kOurScore <= curScore) -            return 0.0; - -        // use MidiFile for MIDI extensions -        int lenURL = strlen(url); -        for (int i = 0; i < NELEM(FILE_EXTS); ++i) { -            int len = strlen(FILE_EXTS[i]); -            int start = lenURL - len; -            if (start > 0) { -                if (!strncasecmp(url + start, FILE_EXTS[i], len)) { -                    return kOurScore; -                } -            } -        } - -        return 0.0; -    } - -    virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/, -                               int fd, -                               int64_t offset, -                               int64_t length, -                               float curScore) { -        static const float kOurScore = 0.8; - -        if (kOurScore <= curScore) -            return 0.0; - -        // Some kind of MIDI? -        EAS_DATA_HANDLE easdata; -        if (EAS_Init(&easdata) == EAS_SUCCESS) { -            EAS_FILE locator; -            locator.path = NULL; -            locator.fd = fd; -            locator.offset = offset; -            locator.length = length; -            EAS_HANDLE  eashandle; -            if (EAS_OpenFile(easdata, &locator, &eashandle) == EAS_SUCCESS) { -                EAS_CloseFile(easdata, eashandle); -                EAS_Shutdown(easdata); -                return kOurScore; -            } -            EAS_Shutdown(easdata); -        } - -        return 0.0; -    } - -    virtual sp<MediaPlayerBase> createPlayer() { -        ALOGV(" create MidiFile"); -        return new MidiFile(); -    } -}; -  class TestPlayerFactory : public MediaPlayerFactory::IFactory {    public:      virtual float scoreFactory(const sp<IMediaPlayer>& /*client*/, @@ -374,7 +305,6 @@ void MediaPlayerFactory::registerBuiltinFactories() {      registerFactory_l(new StagefrightPlayerFactory(), STAGEFRIGHT_PLAYER);      registerFactory_l(new NuPlayerFactory(), NU_PLAYER); -    registerFactory_l(new SonivoxPlayerFactory(), SONIVOX_PLAYER);      registerFactory_l(new TestPlayerFactory(), TEST_PLAYER);      sInitComplete = true; diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp index d461af3..694f1a4 100644 --- a/media/libmediaplayerservice/MediaPlayerService.cpp +++ b/media/libmediaplayerservice/MediaPlayerService.cpp @@ -59,6 +59,7 @@  #include <media/stagefright/MediaErrors.h>  #include <media/stagefright/AudioPlayer.h>  #include <media/stagefright/foundation/ADebug.h> +#include <media/stagefright/foundation/ALooperRoster.h>  #include <system/audio.h> @@ -70,7 +71,6 @@  #include "MetadataRetrieverClient.h"  #include "MediaPlayerFactory.h" -#include "MidiFile.h"  #include "TestPlayerStub.h"  #include "StagefrightPlayer.h"  #include "nuplayer/NuPlayerDriver.h" @@ -248,6 +248,9 @@ void unmarshallAudioAttributes(const Parcel& parcel, audio_attributes_t *attribu  namespace android { +extern ALooperRoster gLooperRoster; + +  static bool checkPermission(const char* permissionString) {  #ifndef HAVE_ANDROID_OS      return true; @@ -385,28 +388,6 @@ sp<IRemoteDisplay> MediaPlayerService::listenForRemoteDisplay(      return new RemoteDisplay(client, iface.string());  } -status_t MediaPlayerService::AudioCache::dump(int fd, const Vector<String16>& /*args*/) const -{ -    const size_t SIZE = 256; -    char buffer[SIZE]; -    String8 result; - -    result.append(" AudioCache\n"); -    if (mHeap != 0) { -        snprintf(buffer, 255, "  heap base(%p), size(%zu), flags(%d)\n", -                mHeap->getBase(), mHeap->getSize(), mHeap->getFlags()); -        result.append(buffer); -    } -    snprintf(buffer, 255, "  msec per frame(%f), channel count(%d), format(%d), frame count(%zd)\n", -            mMsecsPerFrame, mChannelCount, mFormat, mFrameCount); -    result.append(buffer); -    snprintf(buffer, 255, "  sample rate(%d), size(%d), error(%d), command complete(%s)\n", -            mSampleRate, mSize, mError, mCommandComplete?"true":"false"); -    result.append(buffer); -    ::write(fd, result.string(), result.size()); -    return NO_ERROR; -} -  status_t MediaPlayerService::AudioOutput::dump(int fd, const Vector<String16>& args) const  {      const size_t SIZE = 256; @@ -451,6 +432,10 @@ status_t MediaPlayerService::Client::dump(int fd, const Vector<String16>& args)      return NO_ERROR;  } +/** + * The only arguments this understands right now are -c, -von and -voff, + * which are parsed by ALooperRoster::dump() + */  status_t MediaPlayerService::dump(int fd, const Vector<String16>& args)  {      const size_t SIZE = 256; @@ -484,7 +469,7 @@ status_t MediaPlayerService::dump(int fd, const Vector<String16>& args)          }          result.append(" Files opened and/or mapped:\n"); -        snprintf(buffer, SIZE, "/proc/%d/maps", gettid()); +        snprintf(buffer, SIZE, "/proc/%d/maps", getpid());          FILE *f = fopen(buffer, "r");          if (f) {              while (!feof(f)) { @@ -504,13 +489,13 @@ status_t MediaPlayerService::dump(int fd, const Vector<String16>& args)              result.append("\n");          } -        snprintf(buffer, SIZE, "/proc/%d/fd", gettid()); +        snprintf(buffer, SIZE, "/proc/%d/fd", getpid());          DIR *d = opendir(buffer);          if (d) {              struct dirent *ent;              while((ent = readdir(d)) != NULL) {                  if (strcmp(ent->d_name,".") && strcmp(ent->d_name,"..")) { -                    snprintf(buffer, SIZE, "/proc/%d/fd/%s", gettid(), ent->d_name); +                    snprintf(buffer, SIZE, "/proc/%d/fd/%s", getpid(), ent->d_name);                      struct stat s;                      if (lstat(buffer, &s) == 0) {                          if ((s.st_mode & S_IFMT) == S_IFLNK) { @@ -551,6 +536,8 @@ status_t MediaPlayerService::dump(int fd, const Vector<String16>& args)              result.append("\n");          } +        gLooperRoster.dump(fd, args); +          bool dumpMem = false;          for (size_t i = 0; i < args.size(); i++) {              if (args[i] == String16("-m")) { @@ -817,8 +804,7 @@ status_t MediaPlayerService::Client::setVideoSurfaceTexture(      sp<MediaPlayerBase> p = getPlayer();      if (p == 0) return UNKNOWN_ERROR; -    sp<IBinder> binder(bufferProducer == NULL ? NULL : -            bufferProducer->asBinder()); +    sp<IBinder> binder(IInterface::asBinder(bufferProducer));      if (mConnectedWindowBinder == binder) {          return OK;      } @@ -1281,129 +1267,6 @@ int Antagonizer::callbackThread(void* user)  }  #endif -status_t MediaPlayerService::decode( -        const sp<IMediaHTTPService> &httpService, -        const char* url, -        uint32_t *pSampleRate, -        int* pNumChannels, -        audio_format_t* pFormat, -        const sp<IMemoryHeap>& heap, -        size_t *pSize) -{ -    ALOGV("decode(%s)", url); -    sp<MediaPlayerBase> player; -    status_t status = BAD_VALUE; - -    // Protect our precious, precious DRMd ringtones by only allowing -    // decoding of http, but not filesystem paths or content Uris. -    // If the application wants to decode those, it should open a -    // filedescriptor for them and use that. -    if (url != NULL && strncmp(url, "http://", 7) != 0) { -        ALOGD("Can't decode %s by path, use filedescriptor instead", url); -        return BAD_VALUE; -    } - -    player_type playerType = -        MediaPlayerFactory::getPlayerType(NULL /* client */, url); -    ALOGV("player type = %d", playerType); - -    // create the right type of player -    sp<AudioCache> cache = new AudioCache(heap); -    player = MediaPlayerFactory::createPlayer(playerType, cache.get(), cache->notify); -    if (player == NULL) goto Exit; -    if (player->hardwareOutput()) goto Exit; - -    static_cast<MediaPlayerInterface*>(player.get())->setAudioSink(cache); - -    // set data source -    if (player->setDataSource(httpService, url) != NO_ERROR) goto Exit; - -    ALOGV("prepare"); -    player->prepareAsync(); - -    ALOGV("wait for prepare"); -    if (cache->wait() != NO_ERROR) goto Exit; - -    ALOGV("start"); -    player->start(); - -    ALOGV("wait for playback complete"); -    cache->wait(); -    // in case of error, return what was successfully decoded. -    if (cache->size() == 0) { -        goto Exit; -    } - -    *pSize = cache->size(); -    *pSampleRate = cache->sampleRate(); -    *pNumChannels = cache->channelCount(); -    *pFormat = cache->format(); -    ALOGV("return size %d sampleRate=%u, channelCount = %d, format = %d", -          *pSize, *pSampleRate, *pNumChannels, *pFormat); -    status = NO_ERROR; - -Exit: -    if (player != 0) player->reset(); -    return status; -} - -status_t MediaPlayerService::decode(int fd, int64_t offset, int64_t length, -                                       uint32_t *pSampleRate, int* pNumChannels, -                                       audio_format_t* pFormat, -                                       const sp<IMemoryHeap>& heap, size_t *pSize) -{ -    ALOGV("decode(%d, %lld, %lld)", fd, offset, length); -    sp<MediaPlayerBase> player; -    status_t status = BAD_VALUE; - -    player_type playerType = MediaPlayerFactory::getPlayerType(NULL /* client */, -                                                               fd, -                                                               offset, -                                                               length); -    ALOGV("player type = %d", playerType); - -    // create the right type of player -    sp<AudioCache> cache = new AudioCache(heap); -    player = MediaPlayerFactory::createPlayer(playerType, cache.get(), cache->notify); -    if (player == NULL) goto Exit; -    if (player->hardwareOutput()) goto Exit; - -    static_cast<MediaPlayerInterface*>(player.get())->setAudioSink(cache); - -    // set data source -    if (player->setDataSource(fd, offset, length) != NO_ERROR) goto Exit; - -    ALOGV("prepare"); -    player->prepareAsync(); - -    ALOGV("wait for prepare"); -    if (cache->wait() != NO_ERROR) goto Exit; - -    ALOGV("start"); -    player->start(); - -    ALOGV("wait for playback complete"); -    cache->wait(); -    // in case of error, return what was successfully decoded. -    if (cache->size() == 0) { -        goto Exit; -    } - -    *pSize = cache->size(); -    *pSampleRate = cache->sampleRate(); -    *pNumChannels = cache->channelCount(); -    *pFormat = cache->format(); -    ALOGV("return size %d, sampleRate=%u, channelCount = %d, format = %d", -          *pSize, *pSampleRate, *pNumChannels, *pFormat); -    status = NO_ERROR; - -Exit: -    if (player != 0) player->reset(); -    ::close(fd); -    return status; -} - -  #undef LOG_TAG  #define LOG_TAG "AudioSink"  MediaPlayerService::AudioOutput::AudioOutput(int sessionId, int uid, int pid, @@ -1953,47 +1816,6 @@ uint32_t MediaPlayerService::AudioOutput::getSampleRate() const      return mTrack->getSampleRate();  } -#undef LOG_TAG -#define LOG_TAG "AudioCache" -MediaPlayerService::AudioCache::AudioCache(const sp<IMemoryHeap>& heap) : -    mHeap(heap), mChannelCount(0), mFrameCount(1024), mSampleRate(0), mSize(0), -    mFrameSize(1), mError(NO_ERROR),  mCommandComplete(false) -{ -} - -uint32_t MediaPlayerService::AudioCache::latency () const -{ -    return 0; -} - -float MediaPlayerService::AudioCache::msecsPerFrame() const -{ -    return mMsecsPerFrame; -} - -status_t MediaPlayerService::AudioCache::getPosition(uint32_t *position) const -{ -    if (position == 0) return BAD_VALUE; -    *position = mSize / mFrameSize; -    return NO_ERROR; -} - -status_t MediaPlayerService::AudioCache::getTimestamp(AudioTimestamp &ts) const -{ -    ts.mPosition = mSize / mFrameSize; -    nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC); -    ts.mTime.tv_sec = now / 1000000000LL; -    ts.mTime.tv_nsec = now - (1000000000LL * ts.mTime.tv_sec); -    return NO_ERROR; -} - -status_t MediaPlayerService::AudioCache::getFramesWritten(uint32_t *written) const -{ -    if (written == 0) return BAD_VALUE; -    *written = mSize / mFrameSize; -    return NO_ERROR; -} -  ////////////////////////////////////////////////////////////////////////////////  struct CallbackThread : public Thread { @@ -2061,139 +1883,6 @@ bool CallbackThread::threadLoop() {  //////////////////////////////////////////////////////////////////////////////// -status_t MediaPlayerService::AudioCache::open( -        uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask, -        audio_format_t format, int bufferCount, -        AudioCallback cb, void *cookie, audio_output_flags_t /*flags*/, -        const audio_offload_info_t* /*offloadInfo*/) -{ -    ALOGV("open(%u, %d, 0x%x, %d, %d)", sampleRate, channelCount, channelMask, format, bufferCount); -    if (mHeap->getHeapID() < 0) { -        return NO_INIT; -    } - -    mSampleRate = sampleRate; -    mChannelCount = (uint16_t)channelCount; -    mFormat = format; -    mMsecsPerFrame = 1.e3 / (float) sampleRate; -    mFrameSize =  audio_is_linear_pcm(mFormat) -            ? mChannelCount * audio_bytes_per_sample(mFormat) : 1; -    mFrameCount = mHeap->getSize() / mFrameSize; - -    if (cb != NULL) { -        mCallbackThread = new CallbackThread(this, cb, cookie); -    } -    return NO_ERROR; -} - -status_t MediaPlayerService::AudioCache::start() { -    if (mCallbackThread != NULL) { -        mCallbackThread->run("AudioCache callback"); -    } -    return NO_ERROR; -} - -void MediaPlayerService::AudioCache::stop() { -    if (mCallbackThread != NULL) { -        mCallbackThread->requestExitAndWait(); -    } -} - -ssize_t MediaPlayerService::AudioCache::write(const void* buffer, size_t size) -{ -    ALOGV("write(%p, %u)", buffer, size); -    if ((buffer == 0) || (size == 0)) return size; - -    uint8_t* p = static_cast<uint8_t*>(mHeap->getBase()); -    if (p == NULL) return NO_INIT; -    p += mSize; -    ALOGV("memcpy(%p, %p, %u)", p, buffer, size); - -    bool overflow = mSize + size > mHeap->getSize(); -    if (overflow) { -        ALOGE("Heap size overflow! req size: %d, max size: %d", (mSize + size), mHeap->getSize()); -        size = mHeap->getSize() - mSize; -    } -    size -= size % mFrameSize; // consume only integral amounts of frame size -    memcpy(p, buffer, size); -    mSize += size; - -    if (overflow) { -        // Signal heap filled here (last frame may be truncated). -        // After this point, no more data should be written as the -        // heap is filled and the AudioCache should be effectively -        // immutable with respect to future writes. -        // -        // It is thus safe for another thread to read the AudioCache. -        Mutex::Autolock lock(mLock); -        mCommandComplete = true; -        mSignal.signal(); -    } -    return size; -} - -// call with lock held -status_t MediaPlayerService::AudioCache::wait() -{ -    Mutex::Autolock lock(mLock); -    while (!mCommandComplete) { -        mSignal.wait(mLock); -    } -    mCommandComplete = false; - -    if (mError == NO_ERROR) { -        ALOGV("wait - success"); -    } else { -        ALOGV("wait - error"); -    } -    return mError; -} - -void MediaPlayerService::AudioCache::notify( -        void* cookie, int msg, int ext1, int ext2, const Parcel* /*obj*/) -{ -    ALOGV("notify(%p, %d, %d, %d)", cookie, msg, ext1, ext2); -    AudioCache* p = static_cast<AudioCache*>(cookie); - -    // ignore buffering messages -    switch (msg) -    { -    case MEDIA_ERROR: -        ALOGE("Error %d, %d occurred", ext1, ext2); -        break; -    case MEDIA_PREPARED: -        ALOGV("prepared"); -        break; -    case MEDIA_PLAYBACK_COMPLETE: -        ALOGV("playback complete"); -        break; -    default: -        ALOGV("ignored"); -        return; -    } - -    // wake up thread -    Mutex::Autolock lock(p->mLock); -    if (msg == MEDIA_ERROR) { -        p->mError = ext1; -    } -    p->mCommandComplete = true; -    p->mSignal.signal(); -} - -int MediaPlayerService::AudioCache::getSessionId() const -{ -    return 0; -} - -uint32_t MediaPlayerService::AudioCache::getSampleRate() const -{ -    if (mMsecsPerFrame == 0) { -        return 0; -    } -    return (uint32_t)(1.e3 / mMsecsPerFrame); -} -  void MediaPlayerService::addBatteryData(uint32_t params)  {      Mutex::Autolock lock(mLock); @@ -2237,7 +1926,7 @@ void MediaPlayerService::addBatteryData(uint32_t params)          return;      } -    // an sudio stream is started +    // an audio stream is started      if (params & kBatteryDataAudioFlingerStart) {          // record the start time only if currently no other audio          // is being played diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h index 3b96e88..fad3447 100644 --- a/media/libmediaplayerservice/MediaPlayerService.h +++ b/media/libmediaplayerservice/MediaPlayerService.h @@ -77,7 +77,6 @@ class MediaPlayerService : public BnMediaPlayerService          virtual                 ~AudioOutput();          virtual bool            ready() const { return mTrack != 0; } -        virtual bool            realtime() const { return true; }          virtual ssize_t         bufferSize() const;          virtual ssize_t         frameCount() const;          virtual ssize_t         channelCount() const; @@ -184,75 +183,6 @@ class MediaPlayerService : public BnMediaPlayerService      }; // AudioOutput -    class AudioCache : public MediaPlayerBase::AudioSink -    { -    public: -                                AudioCache(const sp<IMemoryHeap>& heap); -        virtual                 ~AudioCache() {} - -        virtual bool            ready() const { return (mChannelCount > 0) && (mHeap->getHeapID() > 0); } -        virtual bool            realtime() const { return false; } -        virtual ssize_t         bufferSize() const { return frameSize() * mFrameCount; } -        virtual ssize_t         frameCount() const { return mFrameCount; } -        virtual ssize_t         channelCount() const { return (ssize_t)mChannelCount; } -        virtual ssize_t         frameSize() const { return (ssize_t)mFrameSize; } -        virtual uint32_t        latency() const; -        virtual float           msecsPerFrame() const; -        virtual status_t        getPosition(uint32_t *position) const; -        virtual status_t        getTimestamp(AudioTimestamp &ts) const; -        virtual status_t        getFramesWritten(uint32_t *frameswritten) const; -        virtual int             getSessionId() const; -        virtual uint32_t        getSampleRate() const; - -        virtual status_t        open( -                uint32_t sampleRate, int channelCount, audio_channel_mask_t channelMask, -                audio_format_t format, int bufferCount = 1, -                AudioCallback cb = NULL, void *cookie = NULL, -                audio_output_flags_t flags = AUDIO_OUTPUT_FLAG_NONE, -                const audio_offload_info_t *offloadInfo = NULL); - -        virtual status_t        start(); -        virtual ssize_t         write(const void* buffer, size_t size); -        virtual void            stop(); -        virtual void            flush() {} -        virtual void            pause() {} -        virtual void            close() {} -                void            setAudioStreamType(audio_stream_type_t streamType __unused) {} -                // stream type is not used for AudioCache -        virtual audio_stream_type_t getAudioStreamType() const { return AUDIO_STREAM_DEFAULT; } - -                void            setVolume(float left __unused, float right __unused) {} -        virtual status_t        setPlaybackRatePermille(int32_t ratePermille __unused) { return INVALID_OPERATION; } -                uint32_t        sampleRate() const { return mSampleRate; } -                audio_format_t  format() const { return mFormat; } -                size_t          size() const { return mSize; } -                status_t        wait(); - -                sp<IMemoryHeap> getHeap() const { return mHeap; } - -        static  void            notify(void* cookie, int msg, -                                       int ext1, int ext2, const Parcel *obj); -        virtual status_t        dump(int fd, const Vector<String16>& args) const; - -    private: -                                AudioCache(); - -        Mutex               mLock; -        Condition           mSignal; -        sp<IMemoryHeap>     mHeap; -        float               mMsecsPerFrame; -        uint16_t            mChannelCount; -        audio_format_t      mFormat; -        ssize_t             mFrameCount; -        uint32_t            mSampleRate; -        uint32_t            mSize; -        size_t              mFrameSize; -        int                 mError; -        bool                mCommandComplete; - -        sp<Thread>          mCallbackThread; -    }; // AudioCache -  public:      static  void                instantiate(); @@ -263,19 +193,6 @@ public:      virtual sp<IMediaPlayer>    create(const sp<IMediaPlayerClient>& client, int audioSessionId); -    virtual status_t            decode( -            const sp<IMediaHTTPService> &httpService, -            const char* url, -            uint32_t *pSampleRate, -            int* pNumChannels, -            audio_format_t* pFormat, -            const sp<IMemoryHeap>& heap, -            size_t *pSize); - -    virtual status_t            decode(int fd, int64_t offset, int64_t length, -                                       uint32_t *pSampleRate, int* pNumChannels, -                                       audio_format_t* pFormat, -                                       const sp<IMemoryHeap>& heap, size_t *pSize);      virtual sp<IMediaCodecList> getCodecList() const;      virtual sp<IOMX>            getOMX();      virtual sp<ICrypto>         makeCrypto(); diff --git a/media/libmediaplayerservice/MetadataRetrieverClient.cpp b/media/libmediaplayerservice/MetadataRetrieverClient.cpp index fa28451..715cc0c 100644 --- a/media/libmediaplayerservice/MetadataRetrieverClient.cpp +++ b/media/libmediaplayerservice/MetadataRetrieverClient.cpp @@ -35,7 +35,6 @@  #include <media/MediaMetadataRetrieverInterface.h>  #include <media/MediaPlayerInterface.h>  #include <private/media/VideoFrame.h> -#include "MidiMetadataRetriever.h"  #include "MetadataRetrieverClient.h"  #include "StagefrightMetadataRetriever.h"  #include "MediaPlayerFactory.h" @@ -90,10 +89,6 @@ static sp<MediaMetadataRetrieverBase> createRetriever(player_type playerType)              p = new StagefrightMetadataRetriever;              break;          } -        case SONIVOX_PLAYER: -            ALOGV("create midi metadata retriever"); -            p = new MidiMetadataRetriever(); -            break;          default:              // TODO:              // support for TEST_PLAYER diff --git a/media/libmediaplayerservice/MidiFile.cpp b/media/libmediaplayerservice/MidiFile.cpp deleted file mode 100644 index 60cbd3c..0000000 --- a/media/libmediaplayerservice/MidiFile.cpp +++ /dev/null @@ -1,560 +0,0 @@ -/* MidiFile.cpp -** -** Copyright 2007, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -**     http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - -//#define LOG_NDEBUG 0 -#define LOG_TAG "MidiFile" -#include "utils/Log.h" - -#include <stdio.h> -#include <assert.h> -#include <limits.h> -#include <unistd.h> -#include <fcntl.h> -#include <sched.h> -#include <utils/threads.h> -#include <libsonivox/eas_reverb.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <unistd.h> - -#include <system/audio.h> - -#include "MidiFile.h" - -// ---------------------------------------------------------------------------- - -namespace android { - -// ---------------------------------------------------------------------------- - -// The midi engine buffers are a bit small (128 frames), so we batch them up -static const int NUM_BUFFERS = 4; - -// TODO: Determine appropriate return codes -static status_t ERROR_NOT_OPEN = -1; -static status_t ERROR_OPEN_FAILED = -2; -static status_t ERROR_EAS_FAILURE = -3; -static status_t ERROR_ALLOCATE_FAILED = -4; - -static const S_EAS_LIB_CONFIG* pLibConfig = NULL; - -MidiFile::MidiFile() : -    mEasData(NULL), mEasHandle(NULL), mAudioBuffer(NULL), -    mPlayTime(-1), mDuration(-1), mState(EAS_STATE_ERROR), -    mStreamType(AUDIO_STREAM_MUSIC), mLoop(false), mExit(false), -    mPaused(false), mRender(false), mTid(-1) -{ -    ALOGV("constructor"); - -    mFileLocator.path = NULL; -    mFileLocator.fd = -1; -    mFileLocator.offset = 0; -    mFileLocator.length = 0; - -    // get the library configuration and do sanity check -    if (pLibConfig == NULL) -        pLibConfig = EAS_Config(); -    if ((pLibConfig == NULL) || (LIB_VERSION != pLibConfig->libVersion)) { -        ALOGE("EAS library/header mismatch"); -        goto Failed; -    } - -    // initialize EAS library -    if (EAS_Init(&mEasData) != EAS_SUCCESS) { -        ALOGE("EAS_Init failed"); -        goto Failed; -    } - -    // select reverb preset and enable -    EAS_SetParameter(mEasData, EAS_MODULE_REVERB, EAS_PARAM_REVERB_PRESET, EAS_PARAM_REVERB_CHAMBER); -    EAS_SetParameter(mEasData, EAS_MODULE_REVERB, EAS_PARAM_REVERB_BYPASS, EAS_FALSE); - -    // create playback thread -    { -        Mutex::Autolock l(mMutex); -        mThread = new MidiFileThread(this); -        mThread->run("midithread", ANDROID_PRIORITY_AUDIO); -        mCondition.wait(mMutex); -        ALOGV("thread started"); -    } - -    // indicate success -    if (mTid > 0) { -        ALOGV(" render thread(%d) started", mTid); -        mState = EAS_STATE_READY; -    } - -Failed: -    return; -} - -status_t MidiFile::initCheck() -{ -    if (mState == EAS_STATE_ERROR) return ERROR_EAS_FAILURE; -    return NO_ERROR; -} - -MidiFile::~MidiFile() { -    ALOGV("MidiFile destructor"); -    release(); -} - -status_t MidiFile::setDataSource( -        const sp<IMediaHTTPService> & /*httpService*/, -        const char* path, -        const KeyedVector<String8, String8> *) { -    ALOGV("MidiFile::setDataSource url=%s", path); -    Mutex::Autolock lock(mMutex); - -    // file still open? -    if (mEasHandle) { -        reset_nosync(); -    } - -    // open file and set paused state -    mFileLocator.path = strdup(path); -    mFileLocator.fd = -1; -    mFileLocator.offset = 0; -    mFileLocator.length = 0; -    EAS_RESULT result = EAS_OpenFile(mEasData, &mFileLocator, &mEasHandle); -    if (result == EAS_SUCCESS) { -        updateState(); -    } - -    if (result != EAS_SUCCESS) { -        ALOGE("EAS_OpenFile failed: [%d]", (int)result); -        mState = EAS_STATE_ERROR; -        return ERROR_OPEN_FAILED; -    } - -    mState = EAS_STATE_OPEN; -    mPlayTime = 0; -    return NO_ERROR; -} - -status_t MidiFile::setDataSource(int fd, int64_t offset, int64_t length) -{ -    ALOGV("MidiFile::setDataSource fd=%d", fd); -    Mutex::Autolock lock(mMutex); - -    // file still open? -    if (mEasHandle) { -        reset_nosync(); -    } - -    // open file and set paused state -    mFileLocator.fd = dup(fd); -    mFileLocator.offset = offset; -    mFileLocator.length = length; -    EAS_RESULT result = EAS_OpenFile(mEasData, &mFileLocator, &mEasHandle); -    updateState(); - -    if (result != EAS_SUCCESS) { -        ALOGE("EAS_OpenFile failed: [%d]", (int)result); -        mState = EAS_STATE_ERROR; -        return ERROR_OPEN_FAILED; -    } - -    mState = EAS_STATE_OPEN; -    mPlayTime = 0; -    return NO_ERROR; -} - -status_t MidiFile::prepare() -{ -    ALOGV("MidiFile::prepare"); -    Mutex::Autolock lock(mMutex); -    if (!mEasHandle) { -        return ERROR_NOT_OPEN; -    } -    EAS_RESULT result; -    if ((result = EAS_Prepare(mEasData, mEasHandle)) != EAS_SUCCESS) { -        ALOGE("EAS_Prepare failed: [%ld]", result); -        return ERROR_EAS_FAILURE; -    } -    updateState(); -    return NO_ERROR; -} - -status_t MidiFile::prepareAsync() -{ -    ALOGV("MidiFile::prepareAsync"); -    status_t ret = prepare(); - -    // don't hold lock during callback -    if (ret == NO_ERROR) { -        sendEvent(MEDIA_PREPARED); -    } else { -        sendEvent(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ret); -    } -    return ret; -} - -status_t MidiFile::start() -{ -    ALOGV("MidiFile::start"); -    Mutex::Autolock lock(mMutex); -    if (!mEasHandle) { -        return ERROR_NOT_OPEN; -    } - -    // resuming after pause? -    if (mPaused) { -        if (EAS_Resume(mEasData, mEasHandle) != EAS_SUCCESS) { -            return ERROR_EAS_FAILURE; -        } -        mPaused = false; -        updateState(); -    } - -    mRender = true; -    if (mState == EAS_STATE_PLAY) { -        sendEvent(MEDIA_STARTED); -    } - -    // wake up render thread -    ALOGV("  wakeup render thread"); -    mCondition.signal(); -    return NO_ERROR; -} - -status_t MidiFile::stop() -{ -    ALOGV("MidiFile::stop"); -    Mutex::Autolock lock(mMutex); -    if (!mEasHandle) { -        return ERROR_NOT_OPEN; -    } -    if (!mPaused && (mState != EAS_STATE_STOPPED)) { -        EAS_RESULT result = EAS_Pause(mEasData, mEasHandle); -        if (result != EAS_SUCCESS) { -            ALOGE("EAS_Pause returned error %ld", result); -            return ERROR_EAS_FAILURE; -        } -    } -    mPaused = false; -    sendEvent(MEDIA_STOPPED); -    return NO_ERROR; -} - -status_t MidiFile::seekTo(int position) -{ -    ALOGV("MidiFile::seekTo %d", position); -    // hold lock during EAS calls -    { -        Mutex::Autolock lock(mMutex); -        if (!mEasHandle) { -            return ERROR_NOT_OPEN; -        } -        EAS_RESULT result; -        if ((result = EAS_Locate(mEasData, mEasHandle, position, false)) -                != EAS_SUCCESS) -        { -            ALOGE("EAS_Locate returned %ld", result); -            return ERROR_EAS_FAILURE; -        } -        EAS_GetLocation(mEasData, mEasHandle, &mPlayTime); -    } -    sendEvent(MEDIA_SEEK_COMPLETE); -    return NO_ERROR; -} - -status_t MidiFile::pause() -{ -    ALOGV("MidiFile::pause"); -    Mutex::Autolock lock(mMutex); -    if (!mEasHandle) { -        return ERROR_NOT_OPEN; -    } -    if ((mState == EAS_STATE_PAUSING) || (mState == EAS_STATE_PAUSED)) return NO_ERROR; -    if (EAS_Pause(mEasData, mEasHandle) != EAS_SUCCESS) { -        return ERROR_EAS_FAILURE; -    } -    mPaused = true; -    sendEvent(MEDIA_PAUSED); -    return NO_ERROR; -} - -bool MidiFile::isPlaying() -{ -    ALOGV("MidiFile::isPlaying, mState=%d", int(mState)); -    if (!mEasHandle || mPaused) return false; -    return (mState == EAS_STATE_PLAY || (mState == EAS_STATE_READY && mRender)); -} - -status_t MidiFile::getCurrentPosition(int* position) -{ -    ALOGV("MidiFile::getCurrentPosition"); -    if (!mEasHandle) { -        ALOGE("getCurrentPosition(): file not open"); -        return ERROR_NOT_OPEN; -    } -    if (mPlayTime < 0) { -        ALOGE("getCurrentPosition(): mPlayTime = %ld", mPlayTime); -        return ERROR_EAS_FAILURE; -    } -    *position = mPlayTime; -    return NO_ERROR; -} - -status_t MidiFile::getDuration(int* duration) -{ - -    ALOGV("MidiFile::getDuration"); -    { -        Mutex::Autolock lock(mMutex); -        if (!mEasHandle) return ERROR_NOT_OPEN; -        *duration = mDuration; -    } - -    // if no duration cached, get the duration -    // don't need a lock here because we spin up a new engine -    if (*duration < 0) { -        EAS_I32 temp; -        EAS_DATA_HANDLE easData = NULL; -        EAS_HANDLE easHandle = NULL; -        EAS_RESULT result = EAS_Init(&easData); -        if (result == EAS_SUCCESS) { -            result = EAS_OpenFile(easData, &mFileLocator, &easHandle); -        } -        if (result == EAS_SUCCESS) { -            result = EAS_Prepare(easData, easHandle); -        } -        if (result == EAS_SUCCESS) { -            result = EAS_ParseMetaData(easData, easHandle, &temp); -        } -        if (easHandle) { -            EAS_CloseFile(easData, easHandle); -        } -        if (easData) { -            EAS_Shutdown(easData); -        } - -        if (result != EAS_SUCCESS) { -            return ERROR_EAS_FAILURE; -        } - -        // cache successful result -        mDuration = *duration = int(temp); -    } - -    return NO_ERROR; -} - -status_t MidiFile::release() -{ -    ALOGV("MidiFile::release"); -    Mutex::Autolock l(mMutex); -    reset_nosync(); - -    // wait for render thread to exit -    mExit = true; -    mCondition.signal(); - -    // wait for thread to exit -    if (mAudioBuffer) { -        mCondition.wait(mMutex); -    } - -    // release resources -    if (mEasData) { -        EAS_Shutdown(mEasData); -        mEasData = NULL; -    } -    return NO_ERROR; -} - -status_t MidiFile::reset() -{ -    ALOGV("MidiFile::reset"); -    Mutex::Autolock lock(mMutex); -    return reset_nosync(); -} - -// call only with mutex held -status_t MidiFile::reset_nosync() -{ -    ALOGV("MidiFile::reset_nosync"); -    sendEvent(MEDIA_STOPPED); -    // close file -    if (mEasHandle) { -        EAS_CloseFile(mEasData, mEasHandle); -        mEasHandle = NULL; -    } -    if (mFileLocator.path) { -        free((void*)mFileLocator.path); -        mFileLocator.path = NULL; -    } -    if (mFileLocator.fd >= 0) { -        close(mFileLocator.fd); -    } -    mFileLocator.fd = -1; -    mFileLocator.offset = 0; -    mFileLocator.length = 0; - -    mPlayTime = -1; -    mDuration = -1; -    mLoop = false; -    mPaused = false; -    mRender = false; -    return NO_ERROR; -} - -status_t MidiFile::setLooping(int loop) -{ -    ALOGV("MidiFile::setLooping"); -    Mutex::Autolock lock(mMutex); -    if (!mEasHandle) { -        return ERROR_NOT_OPEN; -    } -    loop = loop ? -1 : 0; -    if (EAS_SetRepeat(mEasData, mEasHandle, loop) != EAS_SUCCESS) { -        return ERROR_EAS_FAILURE; -    } -    return NO_ERROR; -} - -status_t MidiFile::createOutputTrack() { -    if (mAudioSink->open(pLibConfig->sampleRate, pLibConfig->numChannels, -            CHANNEL_MASK_USE_CHANNEL_ORDER, AUDIO_FORMAT_PCM_16_BIT, 2 /*bufferCount*/) != NO_ERROR) { -        ALOGE("mAudioSink open failed"); -        return ERROR_OPEN_FAILED; -    } -    return NO_ERROR; -} - -int MidiFile::render() { -    EAS_RESULT result = EAS_FAILURE; -    EAS_I32 count; -    int temp; -    bool audioStarted = false; - -    ALOGV("MidiFile::render"); - -    // allocate render buffer -    mAudioBuffer = new EAS_PCM[pLibConfig->mixBufferSize * pLibConfig->numChannels * NUM_BUFFERS]; -    if (!mAudioBuffer) { -        ALOGE("mAudioBuffer allocate failed"); -        goto threadExit; -    } - -    // signal main thread that we started -    { -        Mutex::Autolock l(mMutex); -        mTid = gettid(); -        ALOGV("render thread(%d) signal", mTid); -        mCondition.signal(); -    } - -    while (1) { -        mMutex.lock(); - -        // nothing to render, wait for client thread to wake us up -        while (!mRender && !mExit) -        { -            ALOGV("MidiFile::render - signal wait"); -            mCondition.wait(mMutex); -            ALOGV("MidiFile::render - signal rx'd"); -        } -        if (mExit) { -            mMutex.unlock(); -            break; -        } - -        // render midi data into the input buffer -        //ALOGV("MidiFile::render - rendering audio"); -        int num_output = 0; -        EAS_PCM* p = mAudioBuffer; -        for (int i = 0; i < NUM_BUFFERS; i++) { -            result = EAS_Render(mEasData, p, pLibConfig->mixBufferSize, &count); -            if (result != EAS_SUCCESS) { -                ALOGE("EAS_Render returned %ld", result); -            } -            p += count * pLibConfig->numChannels; -            num_output += count * pLibConfig->numChannels * sizeof(EAS_PCM); -        } - -        // update playback state and position -        // ALOGV("MidiFile::render - updating state"); -        EAS_GetLocation(mEasData, mEasHandle, &mPlayTime); -        EAS_State(mEasData, mEasHandle, &mState); -        mMutex.unlock(); - -        // create audio output track if necessary -        if (!mAudioSink->ready()) { -            ALOGV("MidiFile::render - create output track"); -            if (createOutputTrack() != NO_ERROR) -                goto threadExit; -        } - -        // Write data to the audio hardware -        // ALOGV("MidiFile::render - writing to audio output"); -        if ((temp = mAudioSink->write(mAudioBuffer, num_output)) < 0) { -            ALOGE("Error in writing:%d",temp); -            return temp; -        } - -        // start audio output if necessary -        if (!audioStarted) { -            //ALOGV("MidiFile::render - starting audio"); -            mAudioSink->start(); -            audioStarted = true; -        } - -        // still playing? -        if ((mState == EAS_STATE_STOPPED) || (mState == EAS_STATE_ERROR) || -                (mState == EAS_STATE_PAUSED)) -        { -            switch(mState) { -            case EAS_STATE_STOPPED: -            { -                ALOGV("MidiFile::render - stopped"); -                sendEvent(MEDIA_PLAYBACK_COMPLETE); -                break; -            } -            case EAS_STATE_ERROR: -            { -                ALOGE("MidiFile::render - error"); -                sendEvent(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN); -                break; -            } -            case EAS_STATE_PAUSED: -                ALOGV("MidiFile::render - paused"); -                break; -            default: -                break; -            } -            mAudioSink->stop(); -            audioStarted = false; -            mRender = false; -        } -    } - -threadExit: -    mAudioSink.clear(); -    if (mAudioBuffer) { -        delete [] mAudioBuffer; -        mAudioBuffer = NULL; -    } -    mMutex.lock(); -    mTid = -1; -    mCondition.signal(); -    mMutex.unlock(); -    return result; -} - -} // end namespace android diff --git a/media/libmediaplayerservice/MidiFile.h b/media/libmediaplayerservice/MidiFile.h deleted file mode 100644 index 82e4e88..0000000 --- a/media/libmediaplayerservice/MidiFile.h +++ /dev/null @@ -1,115 +0,0 @@ -/* -** -** Copyright 2008, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -**     http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - -#ifndef ANDROID_MIDIFILE_H -#define ANDROID_MIDIFILE_H - -#include <media/MediaPlayerInterface.h> -#include <libsonivox/eas.h> - -namespace android { - -// Note that the name MidiFile is misleading; this actually represents a MIDI file player -class MidiFile : public MediaPlayerInterface { -public: -                        MidiFile(); -                        ~MidiFile(); - -    virtual status_t    initCheck(); - -    virtual status_t    setDataSource( -            const sp<IMediaHTTPService> &httpService, -            const char* path, -            const KeyedVector<String8, String8> *headers); - -    virtual status_t    setDataSource(int fd, int64_t offset, int64_t length); -    virtual status_t    setVideoSurfaceTexture( -                                const sp<IGraphicBufferProducer>& /*bufferProducer*/) -                            { return UNKNOWN_ERROR; } -    virtual status_t    prepare(); -    virtual status_t    prepareAsync(); -    virtual status_t    start(); -    virtual status_t    stop(); -    virtual status_t    seekTo(int msec); -    virtual status_t    pause(); -    virtual bool        isPlaying(); -    virtual status_t    getCurrentPosition(int* msec); -    virtual status_t    getDuration(int* msec); -    virtual status_t    release(); -    virtual status_t    reset(); -    virtual status_t    setLooping(int loop); -    virtual player_type playerType() { return SONIVOX_PLAYER; } -    virtual status_t    invoke(const Parcel& /*request*/, Parcel* /*reply*/) { -        return INVALID_OPERATION; -    } -    virtual status_t    setParameter(int /*key*/, const Parcel &/*request*/) { -        return INVALID_OPERATION; -    } -    virtual status_t    getParameter(int /*key*/, Parcel* /*reply*/) { -        return INVALID_OPERATION; -    } - - -private: -            status_t    createOutputTrack(); -            status_t    reset_nosync(); -            int         render(); -            void        updateState(){ EAS_State(mEasData, mEasHandle, &mState); } - -    Mutex               mMutex; -    Condition           mCondition; -    EAS_DATA_HANDLE     mEasData; -    EAS_HANDLE          mEasHandle; -    EAS_PCM*            mAudioBuffer; -    EAS_I32             mPlayTime; -    EAS_I32             mDuration; -    EAS_STATE           mState; -    EAS_FILE            mFileLocator; -    audio_stream_type_t mStreamType; -    bool                mLoop; -    volatile bool       mExit; -    bool                mPaused; -    volatile bool       mRender; -    pid_t               mTid; - -    class MidiFileThread : public Thread { -    public: -        MidiFileThread(MidiFile *midiPlayer) : mMidiFile(midiPlayer) { -        } - -    protected: -        virtual ~MidiFileThread() {} - -    private: -        MidiFile *mMidiFile; - -        bool threadLoop() { -            int result; -            result = mMidiFile->render(); -            return false; -        } - -        MidiFileThread(const MidiFileThread &); -        MidiFileThread &operator=(const MidiFileThread &); -    }; - -    sp<MidiFileThread> mThread; -}; - -}; // namespace android - -#endif // ANDROID_MIDIFILE_H diff --git a/media/libmediaplayerservice/MidiMetadataRetriever.cpp b/media/libmediaplayerservice/MidiMetadataRetriever.cpp deleted file mode 100644 index f3cf6ef..0000000 --- a/media/libmediaplayerservice/MidiMetadataRetriever.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/* -** -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -**     http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - -//#define LOG_NDEBUG 0 -#define LOG_TAG "MidiMetadataRetriever" -#include <utils/Log.h> - -#include "MidiMetadataRetriever.h" -#include <media/mediametadataretriever.h> - -#include <media/IMediaHTTPService.h> - -namespace android { - -static status_t ERROR_NOT_OPEN = -1; -static status_t ERROR_OPEN_FAILED = -2; -static status_t ERROR_EAS_FAILURE = -3; -static status_t ERROR_ALLOCATE_FAILED = -4; - -void MidiMetadataRetriever::clearMetadataValues() -{ -    ALOGV("clearMetadataValues"); -    mMetadataValues[0][0] = '\0'; -} - -status_t MidiMetadataRetriever::setDataSource( -        const sp<IMediaHTTPService> &httpService, -        const char *url, -        const KeyedVector<String8, String8> *headers) -{ -    ALOGV("setDataSource: %s", url? url: "NULL pointer"); -    Mutex::Autolock lock(mLock); -    clearMetadataValues(); -    if (mMidiPlayer == 0) { -        mMidiPlayer = new MidiFile(); -    } -    return mMidiPlayer->setDataSource(httpService, url, headers); -} - -status_t MidiMetadataRetriever::setDataSource(int fd, int64_t offset, int64_t length) -{ -    ALOGV("setDataSource: fd(%d), offset(%lld), and length(%lld)", fd, offset, length); -    Mutex::Autolock lock(mLock); -    clearMetadataValues(); -    if (mMidiPlayer == 0) { -        mMidiPlayer = new MidiFile(); -    } -    return mMidiPlayer->setDataSource(fd, offset, length);; -} - -const char* MidiMetadataRetriever::extractMetadata(int keyCode) -{ -    ALOGV("extractMetdata: key(%d)", keyCode); -    Mutex::Autolock lock(mLock); -    if (mMidiPlayer == 0 || mMidiPlayer->initCheck() != NO_ERROR) { -        ALOGE("Midi player is not initialized yet"); -        return NULL; -    } -    switch (keyCode) { -    case METADATA_KEY_DURATION: -        { -            if (mMetadataValues[0][0] == '\0') { -                int duration = -1; -                if (mMidiPlayer->getDuration(&duration) != NO_ERROR) { -                    ALOGE("failed to get duration"); -                    return NULL; -                } -                snprintf(mMetadataValues[0], MAX_METADATA_STRING_LENGTH, "%d", duration); -            } - -            ALOGV("duration: %s ms", mMetadataValues[0]); -            return mMetadataValues[0]; -        } -    default: -        ALOGE("Unsupported key code (%d)", keyCode); -        return NULL; -    } -    return NULL; -} - -}; - diff --git a/media/libmediaplayerservice/MidiMetadataRetriever.h b/media/libmediaplayerservice/MidiMetadataRetriever.h deleted file mode 100644 index b8214ee..0000000 --- a/media/libmediaplayerservice/MidiMetadataRetriever.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -** -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -**     http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - -#ifndef ANDROID_MIDIMETADATARETRIEVER_H -#define ANDROID_MIDIMETADATARETRIEVER_H - -#include <utils/threads.h> -#include <utils/Errors.h> -#include <media/MediaMetadataRetrieverInterface.h> - -#include "MidiFile.h" - -namespace android { - -class MidiMetadataRetriever : public MediaMetadataRetrieverInterface { -public: -                                   MidiMetadataRetriever() {} -                                   ~MidiMetadataRetriever() {} - -    virtual status_t                setDataSource( -            const sp<IMediaHTTPService> &httpService, -            const char *url, -            const KeyedVector<String8, String8> *headers); - -    virtual status_t                setDataSource(int fd, int64_t offset, int64_t length); -    virtual const char*             extractMetadata(int keyCode); - -private: -    static const uint32_t MAX_METADATA_STRING_LENGTH = 128; -    void clearMetadataValues(); - -    Mutex               mLock; -    sp<MidiFile>        mMidiPlayer; -    char                mMetadataValues[1][MAX_METADATA_STRING_LENGTH]; -}; - -}; // namespace android - -#endif // ANDROID_MIDIMETADATARETRIEVER_H diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp index 3d093fa..86639cb 100644 --- a/media/libmediaplayerservice/StagefrightRecorder.cpp +++ b/media/libmediaplayerservice/StagefrightRecorder.cpp @@ -260,6 +260,9 @@ status_t StagefrightRecorder::setOutputFile(int fd, int64_t offset, int64_t leng          return -EBADF;      } +    // start with a clean, empty file +    ftruncate(fd, 0); +      if (mOutputFd >= 0) {          ::close(mOutputFd);      } diff --git a/media/libmediaplayerservice/TestPlayerStub.cpp b/media/libmediaplayerservice/TestPlayerStub.cpp index 5795773..c8bf6c5 100644 --- a/media/libmediaplayerservice/TestPlayerStub.cpp +++ b/media/libmediaplayerservice/TestPlayerStub.cpp @@ -45,7 +45,7 @@ bool isTestBuild()  {      char prop[PROPERTY_VALUE_MAX] = { '\0', }; -    property_get(kBuildTypePropName, prop, '\0'); +    property_get(kBuildTypePropName, prop, "\0");      return strcmp(prop, kEngBuild) == 0 || strcmp(prop, kTestBuild) == 0;  } diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.h b/media/libmediaplayerservice/nuplayer/NuPlayer.h index e99e598..30ede1a 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayer.h +++ b/media/libmediaplayerservice/nuplayer/NuPlayer.h @@ -26,7 +26,7 @@ namespace android {  struct ABuffer;  struct AMessage; -struct MetaData; +class MetaData;  struct NuPlayerDriver;  struct NuPlayer : public AHandler { diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp index e7e1759..bc79fdb 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp @@ -654,8 +654,7 @@ void NuPlayerDriver::notifyListener_l(                          mAutoLoop = false;                      }                  } -                if (mLooping || (mAutoLoop -                        && (mAudioSink == NULL || mAudioSink->realtime()))) { +                if (mLooping || mAutoLoop) {                      mPlayer->seekToAsync(0);                      if (mAudioSink != NULL) {                          // The renderer has stopped the sink at the end in order to play out diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerSource.h b/media/libmediaplayerservice/nuplayer/NuPlayerSource.h index 6daad1b..d9f14a2 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerSource.h +++ b/media/libmediaplayerservice/nuplayer/NuPlayerSource.h @@ -28,7 +28,6 @@  namespace android {  struct ABuffer; -struct MetaData;  struct MediaBuffer;  struct NuPlayer::Source : public AHandler { diff --git a/media/libstagefright/AACWriter.cpp b/media/libstagefright/AACWriter.cpp index 7cc9430..2e41d80 100644 --- a/media/libstagefright/AACWriter.cpp +++ b/media/libstagefright/AACWriter.cpp @@ -80,10 +80,6 @@ status_t AACWriter::initCheck() const {      return mInitCheck;  } -static int writeInt8(int fd, uint8_t x) { -    return ::write(fd, &x, 1); -} -  status_t AACWriter::addSource(const sp<MediaSource> &source) {      if (mInitCheck != OK) { diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp index 85e98f1..d49594f 100644 --- a/media/libstagefright/ACodec.cpp +++ b/media/libstagefright/ACodec.cpp @@ -940,7 +940,6 @@ status_t ACodec::cancelBufferToNativeWindow(BufferInfo *info) {  ACodec::BufferInfo *ACodec::dequeueBufferFromNativeWindow() {      ANativeWindowBuffer *buf; -    int fenceFd = -1;      CHECK(mNativeWindow.get() != NULL);      if (mTunneled) { @@ -1597,7 +1596,11 @@ status_t ACodec::configureCodec(          if (!msg->findInt32("channel-count", &numChannels)) {              err = INVALID_OPERATION;          } else { -            err = setupG711Codec(encoder, numChannels); +            int32_t sampleRate; +            if (!msg->findInt32("sample-rate", &sampleRate)) { +                sampleRate = 8000; +            } +            err = setupG711Codec(encoder, sampleRate, numChannels);          }      } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_FLAC)) {          int32_t numChannels, sampleRate, compressionLevel = -1; @@ -2051,11 +2054,11 @@ status_t ACodec::setupAMRCodec(bool encoder, bool isWAMR, int32_t bitrate) {              1 /* numChannels */);  } -status_t ACodec::setupG711Codec(bool encoder, int32_t numChannels) { +status_t ACodec::setupG711Codec(bool encoder, int32_t sampleRate, int32_t numChannels) {      CHECK(!encoder);  // XXX TODO      return setupRawAudioFormat( -            kPortIndexInput, 8000 /* sampleRate */, numChannels); +            kPortIndexInput, sampleRate, numChannels);  }  status_t ACodec::setupFlacCodec( @@ -3265,7 +3268,6 @@ bool ACodec::allYourBuffersAreBelongToUs() {  }  void ACodec::deferMessage(const sp<AMessage> &msg) { -    bool wasEmptyBefore = mDeferredQueue.empty();      mDeferredQueue.push_back(msg);  } @@ -3976,7 +3978,6 @@ status_t ACodec::pushBlankBuffersToNativeWindow() {      // on the screen and then been replaced, so an previous video frames are      // guaranteed NOT to be currently displayed.      for (int i = 0; i < numBufs + 1; i++) { -        int fenceFd = -1;          err = native_window_dequeue_buffer_and_wait(mNativeWindow.get(), &anb);          if (err != NO_ERROR) {              ALOGE("error pushing blank frames: dequeueBuffer failed: %s (%d)", @@ -4755,7 +4756,7 @@ void ACodec::UninitializedState::stateEntered() {      ALOGV("Now uninitialized");      if (mDeathNotifier != NULL) { -        mCodec->mOMX->asBinder()->unlinkToDeath(mDeathNotifier); +        IInterface::asBinder(mCodec->mOMX)->unlinkToDeath(mDeathNotifier);          mDeathNotifier.clear();      } @@ -4848,7 +4849,7 @@ bool ACodec::UninitializedState::onAllocateComponent(const sp<AMessage> &msg) {      sp<AMessage> notify = new AMessage(kWhatOMXDied, mCodec->id());      mDeathNotifier = new DeathNotifier(notify); -    if (omx->asBinder()->linkToDeath(mDeathNotifier) != OK) { +    if (IInterface::asBinder(omx)->linkToDeath(mDeathNotifier) != OK) {          // This was a local binder, if it dies so do we, we won't care          // about any notifications in the afterlife.          mDeathNotifier.clear(); @@ -4893,7 +4894,7 @@ bool ACodec::UninitializedState::onAllocateComponent(const sp<AMessage> &msg) {          componentName = matchingCodecs.itemAt(matchIndex).mName.string();          quirks = matchingCodecs.itemAt(matchIndex).mQuirks; -        pid_t tid = androidGetTid(); +        pid_t tid = gettid();          int prevPriority = androidGetThreadPriority(tid);          androidSetThreadPriority(tid, ANDROID_PRIORITY_FOREGROUND);          status_t err = omx->allocateNode(componentName.c_str(), observer, &node); @@ -5680,6 +5681,7 @@ bool ACodec::OutputPortSettingsChangedState::onMessageReceived(          case kWhatFlush:          case kWhatShutdown:          case kWhatResume: +        case kWhatSetParameters:          {              if (msg->what() == kWhatResume) {                  ALOGV("[%s] Deferring resume", mCodec->mComponentName.c_str()); diff --git a/media/libstagefright/Android.mk b/media/libstagefright/Android.mk index 193f8a7..2629afc 100644 --- a/media/libstagefright/Android.mk +++ b/media/libstagefright/Android.mk @@ -36,6 +36,7 @@ LOCAL_SRC_FILES:=                         \          MediaCodecSource.cpp              \          MediaDefs.cpp                     \          MediaExtractor.cpp                \ +        MidiExtractor.cpp                 \          http/MediaHTTP.cpp                \          MediaMuxer.cpp                    \          MediaSource.cpp                   \ @@ -68,11 +69,8 @@ LOCAL_C_INCLUDES:= \          $(TOP)/frameworks/native/include/media/openmax \          $(TOP)/external/flac/include \          $(TOP)/external/tremolo \ -        $(TOP)/external/openssl/include \          $(TOP)/external/libvpx/libwebm \          $(TOP)/system/netd/include \ -        $(TOP)/external/icu/icu4c/source/common \ -        $(TOP)/external/icu/icu4c/source/i18n \  LOCAL_SHARED_LIBRARIES := \          libbinder \ diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index 007c090..87eef1e 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -889,10 +889,7 @@ void AwesomePlayer::onStreamDone() {          }      }      if ((mFlags & LOOPING) -            || ((mFlags & AUTO_LOOPING) -                && (mAudioSink == NULL || mAudioSink->realtime()))) { -        // Don't AUTO_LOOP if we're being recorded, since that cannot be -        // turned off and recording would go on indefinitely. +            || (mFlags & AUTO_LOOPING)) {          seekTo_l(0); diff --git a/media/libstagefright/CameraSource.cpp b/media/libstagefright/CameraSource.cpp index c3a940a..ad12bdd 100644 --- a/media/libstagefright/CameraSource.cpp +++ b/media/libstagefright/CameraSource.cpp @@ -219,7 +219,7 @@ status_t CameraSource::isCameraAvailable(          mCameraFlags |= FLAGS_HOT_CAMERA;          mDeathNotifier = new DeathNotifier();          // isBinderAlive needs linkToDeath to work. -        mCameraRecordingProxy->asBinder()->linkToDeath(mDeathNotifier); +        IInterface::asBinder(mCameraRecordingProxy)->linkToDeath(mDeathNotifier);      }      mCamera->lock(); @@ -702,7 +702,7 @@ void CameraSource::releaseCamera() {      {          Mutex::Autolock autoLock(mLock);          if (mCameraRecordingProxy != 0) { -            mCameraRecordingProxy->asBinder()->unlinkToDeath(mDeathNotifier); +            IInterface::asBinder(mCameraRecordingProxy)->unlinkToDeath(mDeathNotifier);              mCameraRecordingProxy.clear();          }          mCameraFlags = 0; @@ -825,7 +825,7 @@ status_t CameraSource::read(                  mFrameAvailableCondition.waitRelative(mLock,                      mTimeBetweenFrameCaptureUs * 1000LL + CAMERA_SOURCE_TIMEOUT_NS)) {                  if (mCameraRecordingProxy != 0 && -                    !mCameraRecordingProxy->asBinder()->isBinderAlive()) { +                    !IInterface::asBinder(mCameraRecordingProxy)->isBinderAlive()) {                      ALOGW("camera recording proxy is gone");                      return ERROR_END_OF_STREAM;                  } diff --git a/media/libstagefright/DataSource.cpp b/media/libstagefright/DataSource.cpp index c99db84..f7dcf35 100644 --- a/media/libstagefright/DataSource.cpp +++ b/media/libstagefright/DataSource.cpp @@ -22,6 +22,7 @@  #include "include/DRMExtractor.h"  #include "include/FLACExtractor.h"  #include "include/HTTPBase.h" +#include "include/MidiExtractor.h"  #include "include/MP3Extractor.h"  #include "include/MPEG2PSExtractor.h"  #include "include/MPEG2TSExtractor.h" @@ -172,6 +173,7 @@ void DataSource::RegisterDefaultSniffers() {      RegisterSniffer_l(SniffAAC);      RegisterSniffer_l(SniffMPEG2PS);      RegisterSniffer_l(SniffWVM); +    RegisterSniffer_l(SniffMidi);      char value[PROPERTY_VALUE_MAX];      if (property_get("drm.service.enabled", value, NULL) diff --git a/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/MPEG4Extractor.cpp index 66a3793..08e989b 100644 --- a/media/libstagefright/MPEG4Extractor.cpp +++ b/media/libstagefright/MPEG4Extractor.cpp @@ -269,6 +269,8 @@ status_t MPEG4DataSource::setCachedRange(off64_t offset, size_t size) {  //////////////////////////////////////////////////////////////////////////////// +static const bool kUseHexDump = false; +  static void hexdump(const void *_data, size_t size) {      const uint8_t *data = (const uint8_t *)_data;      size_t offset = 0; @@ -611,7 +613,6 @@ status_t MPEG4Extractor::parseDrmSINF(      if (size < 0) {          return ERROR_IO;      } -    int32_t classSize = size;      data_offset += numOfBytes;      while(size >= 11 ) { @@ -672,7 +673,6 @@ status_t MPEG4Extractor::parseDrmSINF(      if (size < 0) {          return ERROR_IO;      } -    classSize = size;      data_offset += numOfBytes;      while (size > 0) { @@ -770,7 +770,7 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {          return ERROR_IO;      }      uint64_t chunk_size = ntohl(hdr[0]); -    uint32_t chunk_type = ntohl(hdr[1]); +    int32_t chunk_type = ntohl(hdr[1]);      off64_t data_offset = *offset + 8;      if (chunk_size == 1) { @@ -810,23 +810,23 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {      MakeFourCCString(chunk_type, chunk);      ALOGV("chunk: %s @ %lld, %d", chunk, *offset, depth); -#if 0 -    static const char kWhitespace[] = "                                        "; -    const char *indent = &kWhitespace[sizeof(kWhitespace) - 1 - 2 * depth]; -    printf("%sfound chunk '%s' of size %" PRIu64 "\n", indent, chunk, chunk_size); +    if (kUseHexDump) { +        static const char kWhitespace[] = "                                        "; +        const char *indent = &kWhitespace[sizeof(kWhitespace) - 1 - 2 * depth]; +        printf("%sfound chunk '%s' of size %" PRIu64 "\n", indent, chunk, chunk_size); -    char buffer[256]; -    size_t n = chunk_size; -    if (n > sizeof(buffer)) { -        n = sizeof(buffer); -    } -    if (mDataSource->readAt(*offset, buffer, n) -            < (ssize_t)n) { -        return ERROR_IO; -    } +        char buffer[256]; +        size_t n = chunk_size; +        if (n > sizeof(buffer)) { +            n = sizeof(buffer); +        } +        if (mDataSource->readAt(*offset, buffer, n) +                < (ssize_t)n) { +            return ERROR_IO; +        } -    hexdump(buffer, n); -#endif +        hexdump(buffer, n); +    }      PathAdder autoAdder(&mPath, chunk_type); @@ -1176,6 +1176,11 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {                  return ERROR_IO;              } +            if (!timescale) { +                ALOGE("timescale should not be ZERO."); +                return ERROR_MALFORMED; +            } +              mLastTrack->timescale = ntohl(timescale);              // 14496-12 says all ones means indeterminate, but some files seem to use @@ -1305,7 +1310,7 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {                  return ERROR_IO;              } -            uint16_t data_ref_index = U16_AT(&buffer[6]); +            uint16_t data_ref_index __unused = U16_AT(&buffer[6]);              uint32_t num_channels = U16_AT(&buffer[16]);              uint16_t sample_size = U16_AT(&buffer[18]); @@ -1358,7 +1363,7 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {                  return ERROR_IO;              } -            uint16_t data_ref_index = U16_AT(&buffer[6]); +            uint16_t data_ref_index __unused = U16_AT(&buffer[6]);              uint16_t width = U16_AT(&buffer[6 + 18]);              uint16_t height = U16_AT(&buffer[6 + 20]); @@ -1552,13 +1557,13 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {              break;          } -        // @xyz -        case FOURCC('\xA9', 'x', 'y', 'z'): +        // ©xyz +        case FOURCC(0xA9, 'x', 'y', 'z'):          {              *offset += chunk_size; -            // Best case the total data length inside "@xyz" box -            // would be 8, for instance "@xyz" + "\x00\x04\x15\xc7" + "0+0/", +            // Best case the total data length inside "©xyz" box +            // would be 8, for instance "©xyz" + "\x00\x04\x15\xc7" + "0+0/",              // where "\x00\x04" is the text string length with value = 4,              // "\0x15\xc7" is the language code = en, and "0+0" is a              // location (string) value with longitude = 0 and latitude = 0. @@ -1886,7 +1891,6 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {              if (chunk_data_size < 24) {                  return ERROR_IO;              } -            uint32_t duration;              Trex trex;              if (!mDataSource->getUInt32(data_offset + 4, &trex.track_ID) ||                  !mDataSource->getUInt32(data_offset + 8, &trex.default_sample_description_index) || @@ -2170,7 +2174,7 @@ status_t MPEG4Extractor::parseTrackHeader(          return ERROR_IO;      } -    uint64_t ctime, mtime, duration; +    uint64_t ctime __unused, mtime __unused, duration __unused;      int32_t id;      if (version == 1) { @@ -2192,12 +2196,13 @@ status_t MPEG4Extractor::parseTrackHeader(      size_t matrixOffset = dynSize + 16;      int32_t a00 = U32_AT(&buffer[matrixOffset]);      int32_t a01 = U32_AT(&buffer[matrixOffset + 4]); -    int32_t dx = U32_AT(&buffer[matrixOffset + 8]);      int32_t a10 = U32_AT(&buffer[matrixOffset + 12]);      int32_t a11 = U32_AT(&buffer[matrixOffset + 16]); -    int32_t dy = U32_AT(&buffer[matrixOffset + 20]);  #if 0 +    int32_t dx = U32_AT(&buffer[matrixOffset + 8]); +    int32_t dy = U32_AT(&buffer[matrixOffset + 20]); +      ALOGI("x' = %.2f * x + %.2f * y + %.2f",           a00 / 65536.0f, a01 / 65536.0f, dx / 65536.0f);      ALOGI("y' = %.2f * x + %.2f * y + %.2f", @@ -2258,7 +2263,7 @@ status_t MPEG4Extractor::parseITunesMetaData(off64_t offset, size_t size) {      char chunk[5];      MakeFourCCString(mPath[4], chunk);      ALOGV("meta: %s @ %lld", chunk, offset); -    switch (mPath[4]) { +    switch ((int32_t)mPath[4]) {          case FOURCC(0xa9, 'a', 'l', 'b'):          {              metadataKey = kKeyAlbum; @@ -2669,6 +2674,11 @@ status_t MPEG4Extractor::verifyTrack(Track *track) {          return ERROR_MALFORMED;      } +    if (track->timescale == 0) { +        ALOGE("timescale invalid."); +        return ERROR_MALFORMED; +    } +      return OK;  } @@ -2754,10 +2764,10 @@ status_t MPEG4Extractor::updateAudioTrackInfoFromESDS_MPEG4Audio(          return ERROR_MALFORMED;      } -#if 0 -    printf("ESD of size %d\n", csd_size); -    hexdump(csd, csd_size); -#endif +    if (kUseHexDump) { +        printf("ESD of size %d\n", csd_size); +        hexdump(csd, csd_size); +    }      if (csd_size == 0) {          // There's no further information, i.e. no codec specific data @@ -2808,7 +2818,7 @@ status_t MPEG4Extractor::updateAudioTrackInfoFromESDS_MPEG4Audio(      if (objectType == AOT_SBR || objectType == AOT_PS) {//SBR specific config per 14496-3 table 1.13          uint32_t extFreqIndex = br.getBits(4); -        int32_t extSampleRate; +        int32_t extSampleRate __unused;          if (extFreqIndex == 15) {              if (csd_size < 8) {                  return ERROR_MALFORMED; @@ -2858,12 +2868,12 @@ status_t MPEG4Extractor::updateAudioTrackInfoFromESDS_MPEG4Audio(          if (objectType == AOT_AAC_LC || objectType == AOT_ER_AAC_LC ||                  objectType == AOT_ER_AAC_LD || objectType == AOT_ER_AAC_SCAL ||                  objectType == AOT_ER_BSAC) { -            const int32_t frameLengthFlag = br.getBits(1); +            const int32_t frameLengthFlag __unused = br.getBits(1);              const int32_t dependsOnCoreCoder = br.getBits(1);              if (dependsOnCoreCoder ) { -                const int32_t coreCoderDelay = br.getBits(14); +                const int32_t coreCoderDelay __unused = br.getBits(14);              }              int32_t extensionFlag = -1; @@ -2892,54 +2902,54 @@ status_t MPEG4Extractor::updateAudioTrackInfoFromESDS_MPEG4Audio(              if (numChannels == 0) {                  int32_t channelsEffectiveNum = 0;                  int32_t channelsNum = 0; -                const int32_t ElementInstanceTag = br.getBits(4); -                const int32_t Profile = br.getBits(2); -                const int32_t SamplingFrequencyIndex = br.getBits(4); +                const int32_t ElementInstanceTag __unused = br.getBits(4); +                const int32_t Profile __unused = br.getBits(2); +                const int32_t SamplingFrequencyIndex __unused = br.getBits(4);                  const int32_t NumFrontChannelElements = br.getBits(4);                  const int32_t NumSideChannelElements = br.getBits(4);                  const int32_t NumBackChannelElements = br.getBits(4);                  const int32_t NumLfeChannelElements = br.getBits(2); -                const int32_t NumAssocDataElements = br.getBits(3); -                const int32_t NumValidCcElements = br.getBits(4); +                const int32_t NumAssocDataElements __unused = br.getBits(3); +                const int32_t NumValidCcElements __unused = br.getBits(4);                  const int32_t MonoMixdownPresent = br.getBits(1);                  if (MonoMixdownPresent != 0) { -                    const int32_t MonoMixdownElementNumber = br.getBits(4); +                    const int32_t MonoMixdownElementNumber __unused = br.getBits(4);                  }                  const int32_t StereoMixdownPresent = br.getBits(1);                  if (StereoMixdownPresent != 0) { -                    const int32_t StereoMixdownElementNumber = br.getBits(4); +                    const int32_t StereoMixdownElementNumber __unused = br.getBits(4);                  }                  const int32_t MatrixMixdownIndexPresent = br.getBits(1);                  if (MatrixMixdownIndexPresent != 0) { -                    const int32_t MatrixMixdownIndex = br.getBits(2); -                    const int32_t PseudoSurroundEnable = br.getBits(1); +                    const int32_t MatrixMixdownIndex __unused = br.getBits(2); +                    const int32_t PseudoSurroundEnable __unused = br.getBits(1);                  }                  int i;                  for (i=0; i < NumFrontChannelElements; i++) {                      const int32_t FrontElementIsCpe = br.getBits(1); -                    const int32_t FrontElementTagSelect = br.getBits(4); +                    const int32_t FrontElementTagSelect __unused = br.getBits(4);                      channelsNum += FrontElementIsCpe ? 2 : 1;                  }                  for (i=0; i < NumSideChannelElements; i++) {                      const int32_t SideElementIsCpe = br.getBits(1); -                    const int32_t SideElementTagSelect = br.getBits(4); +                    const int32_t SideElementTagSelect __unused = br.getBits(4);                      channelsNum += SideElementIsCpe ? 2 : 1;                  }                  for (i=0; i < NumBackChannelElements; i++) {                      const int32_t BackElementIsCpe = br.getBits(1); -                    const int32_t BackElementTagSelect = br.getBits(4); +                    const int32_t BackElementTagSelect __unused = br.getBits(4);                      channelsNum += BackElementIsCpe ? 2 : 1;                  }                  channelsEffectiveNum = channelsNum;                  for (i=0; i < NumLfeChannelElements; i++) { -                    const int32_t LfeElementTagSelect = br.getBits(4); +                    const int32_t LfeElementTagSelect __unused = br.getBits(4);                      channelsNum += 1;                  }                  ALOGV("mpeg4 audio channelsNum = %d", channelsNum); diff --git a/media/libstagefright/MPEG4Writer.cpp b/media/libstagefright/MPEG4Writer.cpp index 9f20b1d..844a019 100644 --- a/media/libstagefright/MPEG4Writer.cpp +++ b/media/libstagefright/MPEG4Writer.cpp @@ -823,6 +823,8 @@ void MPEG4Writer::release() {      mFd = -1;      mInitCheck = NO_INIT;      mStarted = false; +    free(mMoovBoxBuffer); +    mMoovBoxBuffer = NULL;  }  status_t MPEG4Writer::reset() { @@ -2800,8 +2802,10 @@ void MPEG4Writer::Track::writeMp4aEsdsBox() {      mOwner->writeInt16(0x03);  // XXX      mOwner->writeInt8(0x00);   // buffer size 24-bit -    mOwner->writeInt32(96000); // max bit rate -    mOwner->writeInt32(96000); // avg bit rate +    int32_t bitRate; +    bool success = mMeta->findInt32(kKeyBitRate, &bitRate); +    mOwner->writeInt32(success ? bitRate : 96000); // max bit rate +    mOwner->writeInt32(success ? bitRate : 96000); // avg bit rate      mOwner->writeInt8(0x05);   // DecoderSpecificInfoTag      mOwner->writeInt8(mCodecSpecificDataSize); diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp index a9c3a04..6ca123a 100644 --- a/media/libstagefright/MediaCodec.cpp +++ b/media/libstagefright/MediaCodec.cpp @@ -1711,7 +1711,7 @@ void MediaCodec::extractCSD(const sp<AMessage> &format) {      size_t i = 0;      for (;;) {          sp<ABuffer> csd; -        if (!format->findBuffer(StringPrintf("csd-%u", i).c_str(), &csd)) { +        if (!format->findBuffer(AStringPrintf("csd-%u", i).c_str(), &csd)) {              break;          } @@ -2234,7 +2234,7 @@ status_t MediaCodec::amendOutputFormatWithCodecSpecificData(              memcpy(csd->data() + 4, nalStart, nalSize);              mOutputFormat->setBuffer( -                    StringPrintf("csd-%u", csdIndex).c_str(), csd); +                    AStringPrintf("csd-%u", csdIndex).c_str(), csd);              ++csdIndex;          } diff --git a/media/libstagefright/MediaDefs.cpp b/media/libstagefright/MediaDefs.cpp index c5a6939..c48a5ae 100644 --- a/media/libstagefright/MediaDefs.cpp +++ b/media/libstagefright/MediaDefs.cpp @@ -34,6 +34,7 @@ const char *MEDIA_MIMETYPE_AUDIO_AMR_WB = "audio/amr-wb";  const char *MEDIA_MIMETYPE_AUDIO_MPEG = "audio/mpeg";  const char *MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_I = "audio/mpeg-L1";  const char *MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_II = "audio/mpeg-L2"; +const char *MEDIA_MIMETYPE_AUDIO_MIDI = "audio/midi";  const char *MEDIA_MIMETYPE_AUDIO_AAC = "audio/mp4a-latm";  const char *MEDIA_MIMETYPE_AUDIO_QCELP = "audio/qcelp";  const char *MEDIA_MIMETYPE_AUDIO_VORBIS = "audio/vorbis"; diff --git a/media/libstagefright/MediaExtractor.cpp b/media/libstagefright/MediaExtractor.cpp index 9ab6611..e21fe6e 100644 --- a/media/libstagefright/MediaExtractor.cpp +++ b/media/libstagefright/MediaExtractor.cpp @@ -29,6 +29,7 @@  #include "include/WVMExtractor.h"  #include "include/FLACExtractor.h"  #include "include/AACExtractor.h" +#include "include/MidiExtractor.h"  #include "matroska/MatroskaExtractor.h" @@ -116,6 +117,8 @@ sp<MediaExtractor> MediaExtractor::Create(          ret = new AACExtractor(source, meta);      } else if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPEG2PS)) {          ret = new MPEG2PSExtractor(source); +    } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MIDI)) { +        ret = new MidiExtractor(source);      }      if (ret != NULL) { diff --git a/media/libstagefright/MidiExtractor.cpp b/media/libstagefright/MidiExtractor.cpp new file mode 100644 index 0000000..66fab77 --- /dev/null +++ b/media/libstagefright/MidiExtractor.cpp @@ -0,0 +1,325 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + *      http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +//#define LOG_NDEBUG 0 +#define LOG_TAG "MidiExtractor" +#include <utils/Log.h> + +#include "include/MidiExtractor.h" + +#include <media/MidiIoWrapper.h> +#include <media/stagefright/foundation/ADebug.h> +#include <media/stagefright/MediaBufferGroup.h> +#include <media/stagefright/MediaDefs.h> +#include <media/stagefright/MetaData.h> +#include <media/stagefright/MediaSource.h> +#include <libsonivox/eas_reverb.h> + +namespace android { + +// how many Sonivox output buffers to aggregate into one MediaBuffer +static const int NUM_COMBINE_BUFFERS = 4; + +class MidiSource : public MediaSource { + +public: +    MidiSource( +            const sp<MidiEngine> &engine, +            const sp<MetaData> &trackMetadata); + +    virtual status_t start(MetaData *params); +    virtual status_t stop(); +    virtual sp<MetaData> getFormat(); + +    virtual status_t read( +            MediaBuffer **buffer, const ReadOptions *options = NULL); + +protected: +    virtual ~MidiSource(); + +private: +    sp<MidiEngine> mEngine; +    sp<MetaData> mTrackMetadata; +    bool mInitCheck; +    bool mStarted; + +    status_t init(); + +    // no copy constructor or assignment +    MidiSource(const MidiSource &); +    MidiSource &operator=(const MidiSource &); + +}; + + +// Midisource + +MidiSource::MidiSource( +        const sp<MidiEngine> &engine, +        const sp<MetaData> &trackMetadata) +    : mEngine(engine), +      mTrackMetadata(trackMetadata), +      mInitCheck(false), +      mStarted(false) +{ +    ALOGV("MidiSource ctor"); +    mInitCheck = init(); +} + +MidiSource::~MidiSource() +{ +    ALOGV("MidiSource dtor"); +    if (mStarted) { +        stop(); +    } +} + +status_t MidiSource::start(MetaData * /* params */) +{ +    ALOGV("MidiSource::start"); + +    CHECK(!mStarted); +    mStarted = true; +    mEngine->allocateBuffers(); +    return OK; +} + +status_t MidiSource::stop() +{ +    ALOGV("MidiSource::stop"); + +    CHECK(mStarted); +    mStarted = false; +    mEngine->releaseBuffers(); + +    return OK; +} + +sp<MetaData> MidiSource::getFormat() +{ +    return mTrackMetadata; +} + +status_t MidiSource::read( +        MediaBuffer **outBuffer, const ReadOptions *options) +{ +    ALOGV("MidiSource::read"); +    MediaBuffer *buffer; +    // process an optional seek request +    int64_t seekTimeUs; +    ReadOptions::SeekMode mode; +    if ((NULL != options) && options->getSeekTo(&seekTimeUs, &mode)) { +        if (seekTimeUs <= 0LL) { +            seekTimeUs = 0LL; +        } +        mEngine->seekTo(seekTimeUs); +    } +    buffer = mEngine->readBuffer(); +    *outBuffer = buffer; +    ALOGV("MidiSource::read %p done", this); +    return buffer != NULL ? (status_t) OK : (status_t) ERROR_END_OF_STREAM; +} + +status_t MidiSource::init() +{ +    ALOGV("MidiSource::init"); +    return OK; +} + +// MidiEngine + +MidiEngine::MidiEngine(const sp<DataSource> &dataSource, +        const sp<MetaData> &fileMetadata, +        const sp<MetaData> &trackMetadata) : +            mGroup(NULL), +            mEasData(NULL), +            mEasHandle(NULL), +            mEasConfig(NULL), +            mIsInitialized(false) { +    mIoWrapper = new MidiIoWrapper(dataSource); +    // spin up a new EAS engine +    EAS_I32 temp; +    EAS_RESULT result = EAS_Init(&mEasData); + +    if (result == EAS_SUCCESS) { +        result = EAS_OpenFile(mEasData, mIoWrapper->getLocator(), &mEasHandle); +    } +    if (result == EAS_SUCCESS) { +        result = EAS_Prepare(mEasData, mEasHandle); +    } +    if (result == EAS_SUCCESS) { +        result = EAS_ParseMetaData(mEasData, mEasHandle, &temp); +    } + +    if (result != EAS_SUCCESS) { +        return; +    } + +    if (fileMetadata != NULL) { +        fileMetadata->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_MIDI); +    } + +    if (trackMetadata != NULL) { +        trackMetadata->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RAW); +        trackMetadata->setInt64(kKeyDuration, 1000ll * temp); // milli->micro +        mEasConfig = EAS_Config(); +        trackMetadata->setInt32(kKeySampleRate, mEasConfig->sampleRate); +        trackMetadata->setInt32(kKeyChannelCount, mEasConfig->numChannels); +    } +    mIsInitialized = true; +} + +MidiEngine::~MidiEngine() { +    if (mEasHandle) { +        EAS_CloseFile(mEasData, mEasHandle); +    } +    if (mEasData) { +        EAS_Shutdown(mEasData); +    } +    delete mGroup; + +} + +status_t MidiEngine::initCheck() { +    return mIsInitialized ? OK : UNKNOWN_ERROR; +} + +status_t MidiEngine::allocateBuffers() { +    // select reverb preset and enable +    EAS_SetParameter(mEasData, EAS_MODULE_REVERB, EAS_PARAM_REVERB_PRESET, EAS_PARAM_REVERB_CHAMBER); +    EAS_SetParameter(mEasData, EAS_MODULE_REVERB, EAS_PARAM_REVERB_BYPASS, EAS_FALSE); + +    mGroup = new MediaBufferGroup; +    int bufsize = sizeof(EAS_PCM) +            * mEasConfig->mixBufferSize * mEasConfig->numChannels * NUM_COMBINE_BUFFERS; +    ALOGV("using %d byte buffer", bufsize); +    mGroup->add_buffer(new MediaBuffer(bufsize)); +    return OK; +} + +status_t MidiEngine::releaseBuffers() { +    delete mGroup; +    mGroup = NULL; +    return OK; +} + +status_t MidiEngine::seekTo(int64_t positionUs) { +    ALOGV("seekTo %lld", positionUs); +    EAS_RESULT result = EAS_Locate(mEasData, mEasHandle, positionUs / 1000, false); +    return result == EAS_SUCCESS ? OK : UNKNOWN_ERROR; +} + +MediaBuffer* MidiEngine::readBuffer() { +    EAS_STATE state; +    EAS_State(mEasData, mEasHandle, &state); +    if ((state == EAS_STATE_STOPPED) || (state == EAS_STATE_ERROR)) { +        return NULL; +    } +    MediaBuffer *buffer; +    status_t err = mGroup->acquire_buffer(&buffer); +    if (err != OK) { +        ALOGE("readBuffer: no buffer"); +        return NULL; +    } +    EAS_I32 timeMs; +    EAS_GetLocation(mEasData, mEasHandle, &timeMs); +    int64_t timeUs = 1000ll * timeMs; +    buffer->meta_data()->setInt64(kKeyTime, timeUs); + +    EAS_PCM* p = (EAS_PCM*) buffer->data(); +    int numBytesOutput = 0; +    for (int i = 0; i < NUM_COMBINE_BUFFERS; i++) { +        EAS_I32 numRendered; +        EAS_RESULT result = EAS_Render(mEasData, p, mEasConfig->mixBufferSize, &numRendered); +        if (result != EAS_SUCCESS) { +            ALOGE("EAS_Render returned %ld", result); +            break; +        } +        p += numRendered * mEasConfig->numChannels; +        numBytesOutput += numRendered * mEasConfig->numChannels * sizeof(EAS_PCM); +    } +    buffer->set_range(0, numBytesOutput); +    ALOGV("readBuffer: returning %zd in buffer %p", buffer->range_length(), buffer); +    return buffer; +} + + +// MidiExtractor + +MidiExtractor::MidiExtractor( +        const sp<DataSource> &dataSource) +    : mDataSource(dataSource), +      mInitCheck(false) +{ +    ALOGV("MidiExtractor ctor"); +    mFileMetadata = new MetaData; +    mTrackMetadata = new MetaData; +    mEngine = new MidiEngine(mDataSource, mFileMetadata, mTrackMetadata); +    mInitCheck = mEngine->initCheck(); +} + +MidiExtractor::~MidiExtractor() +{ +    ALOGV("MidiExtractor dtor"); +} + +size_t MidiExtractor::countTracks() +{ +    return mInitCheck == OK ? 1 : 0; +} + +sp<MediaSource> MidiExtractor::getTrack(size_t index) +{ +    if (mInitCheck != OK || index > 0) { +        return NULL; +    } +    return new MidiSource(mEngine, mTrackMetadata); +} + +sp<MetaData> MidiExtractor::getTrackMetaData( +        size_t index, uint32_t /* flags */) { +    ALOGV("MidiExtractor::getTrackMetaData"); +    if (mInitCheck != OK || index > 0) { +        return NULL; +    } +    return mTrackMetadata; +} + +sp<MetaData> MidiExtractor::getMetaData() +{ +    ALOGV("MidiExtractor::getMetaData"); +    return mFileMetadata; +} + +// Sniffer + +bool SniffMidi( +        const sp<DataSource> &source, String8 *mimeType, float *confidence, +        sp<AMessage> *) +{ +    sp<MidiEngine> p = new MidiEngine(source, NULL, NULL); +    if (p->initCheck() == OK) { +        *mimeType = MEDIA_MIMETYPE_AUDIO_MIDI; +        *confidence = 0.8; +        ALOGV("SniffMidi: yes"); +        return true; +    } +    ALOGV("SniffMidi: no"); +    return false; + +} + +}  // namespace android diff --git a/media/libstagefright/OMXClient.cpp b/media/libstagefright/OMXClient.cpp index ca031aa..230c1f7 100644 --- a/media/libstagefright/OMXClient.cpp +++ b/media/libstagefright/OMXClient.cpp @@ -37,7 +37,7 @@ struct MuxOMX : public IOMX {      MuxOMX(const sp<IOMX> &remoteOMX);      virtual ~MuxOMX(); -    virtual IBinder *onAsBinder() { return mRemoteOMX->asBinder().get(); } +    virtual IBinder *onAsBinder() { return IInterface::asBinder(mRemoteOMX).get(); }      virtual bool livesLocally(node_id node, pid_t pid); diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index 6cb0775..f41bbc2 100644 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -101,10 +101,10 @@ static sp<MediaSource> InstantiateSoftwareEncoder(  #undef FACTORY_CREATE_ENCODER  #undef FACTORY_REF -#define CODEC_LOGI(x, ...) ALOGI("[%s] "x, mComponentName, ##__VA_ARGS__) -#define CODEC_LOGV(x, ...) ALOGV("[%s] "x, mComponentName, ##__VA_ARGS__) -#define CODEC_LOGW(x, ...) ALOGW("[%s] "x, mComponentName, ##__VA_ARGS__) -#define CODEC_LOGE(x, ...) ALOGE("[%s] "x, mComponentName, ##__VA_ARGS__) +#define CODEC_LOGI(x, ...) ALOGI("[%s] " x, mComponentName, ##__VA_ARGS__) +#define CODEC_LOGV(x, ...) ALOGV("[%s] " x, mComponentName, ##__VA_ARGS__) +#define CODEC_LOGW(x, ...) ALOGW("[%s] " x, mComponentName, ##__VA_ARGS__) +#define CODEC_LOGE(x, ...) ALOGE("[%s] " x, mComponentName, ##__VA_ARGS__)  struct OMXCodecObserver : public BnOMXObserver {      OMXCodecObserver() { @@ -451,7 +451,7 @@ status_t OMXCodec::parseAVCCodecSpecificData(      // assertion, let's be lenient for now...      // CHECK((ptr[4] >> 2) == 0x3f);  // reserved -    size_t lengthSize = 1 + (ptr[4] & 3); +    size_t lengthSize __unused = 1 + (ptr[4] & 3);      // commented out check below as H264_QVGA_500_NO_AUDIO.3gp      // violates it... @@ -629,10 +629,14 @@ status_t OMXCodec::configureCodec(const sp<MetaData> &meta) {          // These are PCM-like formats with a fixed sample rate but          // a variable number of channels. +        int32_t sampleRate;          int32_t numChannels;          CHECK(meta->findInt32(kKeyChannelCount, &numChannels)); +        if (!meta->findInt32(kKeySampleRate, &sampleRate)) { +            sampleRate = 8000; +        } -        setG711Format(numChannels); +        setG711Format(sampleRate, numChannels);      } else if (!strcasecmp(MEDIA_MIMETYPE_AUDIO_RAW, mMIME)) {          CHECK(!mIsEncoder); @@ -2009,7 +2013,6 @@ status_t OMXCodec::cancelBufferToNativeWindow(BufferInfo *info) {  OMXCodec::BufferInfo* OMXCodec::dequeueBufferFromNativeWindow() {      // Dequeue the next buffer from the native window.      ANativeWindowBuffer* buf; -    int fenceFd = -1;      int err = native_window_dequeue_buffer_and_wait(mNativeWindow.get(), &buf);      if (err != 0) {        CODEC_LOGE("dequeueBuffer failed w/ error 0x%08x", err); @@ -2114,7 +2117,6 @@ status_t OMXCodec::pushBlankBuffersToNativeWindow() {      // on the screen and then been replaced, so an previous video frames are      // guaranteed NOT to be currently displayed.      for (int i = 0; i < numBufs + 1; i++) { -        int fenceFd = -1;          err = native_window_dequeue_buffer_and_wait(mNativeWindow.get(), &anb);          if (err != NO_ERROR) {              ALOGE("error pushing blank frames: dequeueBuffer failed: %s (%d)", @@ -3621,9 +3623,9 @@ status_t OMXCodec::setAC3Format(int32_t numChannels, int32_t sampleRate) {              sizeof(def));  } -void OMXCodec::setG711Format(int32_t numChannels) { +void OMXCodec::setG711Format(int32_t sampleRate, int32_t numChannels) {      CHECK(!mIsEncoder); -    setRawAudioFormat(kPortIndexInput, 8000, numChannels); +    setRawAudioFormat(kPortIndexInput, sampleRate, numChannels);  }  void OMXCodec::setImageOutputFormat( diff --git a/media/libstagefright/OggExtractor.cpp b/media/libstagefright/OggExtractor.cpp index 45095fc..976763c 100644 --- a/media/libstagefright/OggExtractor.cpp +++ b/media/libstagefright/OggExtractor.cpp @@ -849,6 +849,7 @@ void parseVorbisComment(          { "TRACKNUMBER", kKeyCDTrackNumber },          { "DISCNUMBER", kKeyDiscNumber },          { "DATE", kKeyDate }, +        { "YEAR", kKeyYear },          { "LYRICIST", kKeyWriter },          { "METADATA_BLOCK_PICTURE", kKeyAlbumArt },          { "ANDROID_LOOP", kKeyAutoLoop }, diff --git a/media/libstagefright/StagefrightMediaScanner.cpp b/media/libstagefright/StagefrightMediaScanner.cpp index 4449d57..db33e83 100644 --- a/media/libstagefright/StagefrightMediaScanner.cpp +++ b/media/libstagefright/StagefrightMediaScanner.cpp @@ -28,9 +28,6 @@  #include <media/mediametadataretriever.h>  #include <private/media/VideoFrame.h> -// Sonivox includes -#include <libsonivox/eas.h> -  namespace android {  StagefrightMediaScanner::StagefrightMediaScanner() {} @@ -57,54 +54,6 @@ static bool FileHasAcceptableExtension(const char *extension) {      return false;  } -static MediaScanResult HandleMIDI( -        const char *filename, MediaScannerClient *client) { -    // get the library configuration and do sanity check -    const S_EAS_LIB_CONFIG* pLibConfig = EAS_Config(); -    if ((pLibConfig == NULL) || (LIB_VERSION != pLibConfig->libVersion)) { -        ALOGE("EAS library/header mismatch\n"); -        return MEDIA_SCAN_RESULT_ERROR; -    } -    EAS_I32 temp; - -    // spin up a new EAS engine -    EAS_DATA_HANDLE easData = NULL; -    EAS_HANDLE easHandle = NULL; -    EAS_RESULT result = EAS_Init(&easData); -    if (result == EAS_SUCCESS) { -        EAS_FILE file; -        file.path = filename; -        file.fd = 0; -        file.offset = 0; -        file.length = 0; -        result = EAS_OpenFile(easData, &file, &easHandle); -    } -    if (result == EAS_SUCCESS) { -        result = EAS_Prepare(easData, easHandle); -    } -    if (result == EAS_SUCCESS) { -        result = EAS_ParseMetaData(easData, easHandle, &temp); -    } -    if (easHandle) { -        EAS_CloseFile(easData, easHandle); -    } -    if (easData) { -        EAS_Shutdown(easData); -    } - -    if (result != EAS_SUCCESS) { -        return MEDIA_SCAN_RESULT_SKIPPED; -    } - -    char buffer[20]; -    sprintf(buffer, "%ld", temp); -    status_t status = client->addStringTag("duration", buffer); -    if (status != OK) { -        return MEDIA_SCAN_RESULT_ERROR; -    } -    return MEDIA_SCAN_RESULT_OK; -} -  MediaScanResult StagefrightMediaScanner::processFile(          const char *path, const char *mimeType,          MediaScannerClient &client) { @@ -130,18 +79,6 @@ MediaScanResult StagefrightMediaScanner::processFileInternal(          return MEDIA_SCAN_RESULT_SKIPPED;      } -    if (!strcasecmp(extension, ".mid") -            || !strcasecmp(extension, ".smf") -            || !strcasecmp(extension, ".imy") -            || !strcasecmp(extension, ".midi") -            || !strcasecmp(extension, ".xmf") -            || !strcasecmp(extension, ".rtttl") -            || !strcasecmp(extension, ".rtx") -            || !strcasecmp(extension, ".ota") -            || !strcasecmp(extension, ".mxmf")) { -        return HandleMIDI(path, &client); -    } -      sp<MediaMetadataRetriever> mRetriever(new MediaMetadataRetriever);      int fd = open(path, O_RDONLY | O_LARGEFILE); diff --git a/media/libstagefright/SurfaceMediaSource.cpp b/media/libstagefright/SurfaceMediaSource.cpp index 530383b..e8abf48 100644 --- a/media/libstagefright/SurfaceMediaSource.cpp +++ b/media/libstagefright/SurfaceMediaSource.cpp @@ -26,6 +26,7 @@  #include <media/hardware/MetadataBufferType.h>  #include <ui/GraphicBuffer.h> +#include <gui/BufferItem.h>  #include <gui/ISurfaceComposer.h>  #include <gui/IGraphicBufferAlloc.h>  #include <OMX_Component.h> @@ -290,7 +291,7 @@ status_t SurfaceMediaSource::read(      // TODO: mCurrentSlot can be made a bufferstate since there      // can be more than one "current" slots. -    BufferQueue::BufferItem item; +    BufferItem item;      // If the recording has started and the queue is empty, then just      // wait here till the frames come in from the client side      while (mStarted) { diff --git a/media/libstagefright/TimedEventQueue.cpp b/media/libstagefright/TimedEventQueue.cpp index 1fdb244..7d15220 100644 --- a/media/libstagefright/TimedEventQueue.cpp +++ b/media/libstagefright/TimedEventQueue.cpp @@ -52,7 +52,7 @@ TimedEventQueue::TimedEventQueue()  TimedEventQueue::~TimedEventQueue() {      stop();      if (mPowerManager != 0) { -        sp<IBinder> binder = mPowerManager->asBinder(); +        sp<IBinder> binder = IInterface::asBinder(mPowerManager);          binder->unlinkToDeath(mDeathRecipient);      }  } diff --git a/media/libstagefright/Utils.cpp b/media/libstagefright/Utils.cpp index d86be6e..73f23f0 100644 --- a/media/libstagefright/Utils.cpp +++ b/media/libstagefright/Utils.cpp @@ -198,14 +198,14 @@ status_t convertMetaDataToMessage(          CHECK(size >= 7);          CHECK_EQ((unsigned)ptr[0], 1u);  // configurationVersion == 1 -        uint8_t profile = ptr[1]; -        uint8_t level = ptr[3]; +        uint8_t profile __unused = ptr[1]; +        uint8_t level __unused = ptr[3];          // There is decodable content out there that fails the following          // assertion, let's be lenient for now...          // CHECK((ptr[4] >> 2) == 0x3f);  // reserved -        size_t lengthSize = 1 + (ptr[4] & 3); +        size_t lengthSize __unused = 1 + (ptr[4] & 3);          // commented out check below as H264_QVGA_500_NO_AUDIO.3gp          // violates it... @@ -284,8 +284,8 @@ status_t convertMetaDataToMessage(          CHECK(size >= 7);          CHECK_EQ((unsigned)ptr[0], 1u);  // configurationVersion == 1 -        uint8_t profile = ptr[1] & 31; -        uint8_t level = ptr[12]; +        uint8_t profile __unused = ptr[1] & 31; +        uint8_t level __unused = ptr[12];          ptr += 22;          size -= 22; diff --git a/media/libstagefright/avc_utils.cpp b/media/libstagefright/avc_utils.cpp index cbdb816..5ec3438 100644 --- a/media/libstagefright/avc_utils.cpp +++ b/media/libstagefright/avc_utils.cpp @@ -505,8 +505,8 @@ bool ExtractDimensionsFromVOLHeader(      CHECK_NE(video_object_type_indication,               0x21u /* Fine Granularity Scalable */); -    unsigned video_object_layer_verid; -    unsigned video_object_layer_priority; +    unsigned video_object_layer_verid __unused; +    unsigned video_object_layer_priority __unused;      if (br.getBits(1)) {          video_object_layer_verid = br.getBits(4);          video_object_layer_priority = br.getBits(3); @@ -568,7 +568,7 @@ bool ExtractDimensionsFromVOLHeader(      unsigned video_object_layer_height = br.getBits(13);      CHECK(br.getBits(1));  // marker_bit -    unsigned interlaced = br.getBits(1); +    unsigned interlaced __unused = br.getBits(1);      *width = video_object_layer_width;      *height = video_object_layer_height; @@ -614,7 +614,7 @@ bool GetMPEGAudioFrameSize(          return false;      } -    unsigned protection = (header >> 16) & 1; +    unsigned protection __unused = (header >> 16) & 1;      unsigned bitrate_index = (header >> 12) & 0x0f; diff --git a/media/libstagefright/codecs/aacdec/SoftAAC2.cpp b/media/libstagefright/codecs/aacdec/SoftAAC2.cpp index 351ba1e..495bad0 100644 --- a/media/libstagefright/codecs/aacdec/SoftAAC2.cpp +++ b/media/libstagefright/codecs/aacdec/SoftAAC2.cpp @@ -876,7 +876,7 @@ void SoftAAC2::onQueueFilled(OMX_U32 /* portIndex */) {                          *nextTimeStamp += mStreamInfo->aacSamplesPerFrame *                                  1000000ll / mStreamInfo->sampleRate;                          ALOGV("adjusted nextTimeStamp/size to %lld/%d", -                                *nextTimeStamp, *currentBufLeft); +                                (long long) *nextTimeStamp, *currentBufLeft);                      } else {                          // move to next timestamp in list                          if (mBufferTimestamps.size() > 0) { @@ -885,7 +885,7 @@ void SoftAAC2::onQueueFilled(OMX_U32 /* portIndex */) {                              mBufferSizes.removeAt(0);                              currentBufLeft = &mBufferSizes.editItemAt(0);                              ALOGV("moved to next time/size: %lld/%d", -                                    *nextTimeStamp, *currentBufLeft); +                                    (long long) *nextTimeStamp, *currentBufLeft);                          }                          // try to limit output buffer size to match input buffers                          // (e.g when an input buffer contained 4 "sub" frames, output @@ -993,8 +993,6 @@ void SoftAAC2::onPortFlushCompleted(OMX_U32 portIndex) {  }  void SoftAAC2::drainDecoder() { -    int32_t outputDelay = mStreamInfo->outputDelay * mStreamInfo->numChannels; -      // flush decoder until outputDelay is compensated      while (mOutputDelayCompensated > 0) {          // a buffer big enough for MAX_CHANNEL_COUNT channels of decoded HE-AAC diff --git a/media/libstagefright/codecs/aacenc/AACEncoder.cpp b/media/libstagefright/codecs/aacenc/AACEncoder.cpp index 8b5007e..bebb9dc 100644 --- a/media/libstagefright/codecs/aacenc/AACEncoder.cpp +++ b/media/libstagefright/codecs/aacenc/AACEncoder.cpp @@ -214,8 +214,6 @@ sp<MetaData> AACEncoder::getFormat() {  status_t AACEncoder::read(          MediaBuffer **out, const ReadOptions *options) { -    status_t err; -      *out = NULL;      int64_t seekTimeUs; diff --git a/media/libstagefright/codecs/aacenc/basic_op/basic_op.h b/media/libstagefright/codecs/aacenc/basic_op/basic_op.h index 5cd7e5f..bbc753b 100644 --- a/media/libstagefright/codecs/aacenc/basic_op/basic_op.h +++ b/media/libstagefright/codecs/aacenc/basic_op/basic_op.h @@ -518,8 +518,6 @@ __inline Word32 L_shl(Word32 L_var1, Word16 var2)          return  ASM_L_shr( L_var1, -var2);      }  #else -    Word32 L_var_out = 0L; -      if (var2 <= 0)      {          L_var1 = L_shr(L_var1, (Word16)-var2); @@ -540,7 +538,6 @@ __inline Word32 L_shl(Word32 L_var1, Word16 var2)                  }              }              L_var1 <<= 1; -            L_var_out = L_var1;          }      }      return (L_var1); diff --git a/media/libstagefright/codecs/aacenc/basic_op/oper_32b.c b/media/libstagefright/codecs/aacenc/basic_op/oper_32b.c index 1d029fc..4fd16a1 100644 --- a/media/libstagefright/codecs/aacenc/basic_op/oper_32b.c +++ b/media/libstagefright/codecs/aacenc/basic_op/oper_32b.c @@ -245,10 +245,9 @@ Word16 iLog4(Word32 value)  Word32 rsqrt(Word32 value,     /*!< Operand to square root (0.0 ... 1) */               Word32 accuracy)  /*!< Number of valid bits that will be calculated */  { -    UNUSED(accuracy); -      Word32 root = 0;  	Word32 scale; +    UNUSED(accuracy);  	if(value < 0)  		return 0; @@ -351,12 +350,11 @@ Word32 pow2_xy(Word32 x, Word32 y)    UWord32 iPart;    UWord32 fPart;    Word32 res; -  Word32 tmp, tmp2; -  Word32 shift, shift2; +  Word32 tmp; -  tmp2 = -x; -  iPart = tmp2 / y; -  fPart = tmp2 - iPart*y; +  tmp = -x; +  iPart = tmp / y; +  fPart = tmp - iPart*y;    iPart = min(iPart,INT_BITS-1);    res = pow2Table[(POW2_TABLE_SIZE*fPart)/y] >> iPart; diff --git a/media/libstagefright/codecs/aacenc/src/aacenc.c b/media/libstagefright/codecs/aacenc/src/aacenc.c index 40db92c..df17787 100644 --- a/media/libstagefright/codecs/aacenc/src/aacenc.c +++ b/media/libstagefright/codecs/aacenc/src/aacenc.c @@ -39,18 +39,20 @@  VO_U32 VO_API voAACEncInit(VO_HANDLE * phCodec,VO_AUDIO_CODINGTYPE vType, VO_CODEC_INIT_USERDATA *pUserData)  {  	AAC_ENCODER*hAacEnc; -	AACENC_CONFIG config;  	int error;  #ifdef USE_DEAULT_MEM  	VO_MEM_OPERATOR voMemoprator;  #endif  	VO_MEM_OPERATOR *pMemOP; + +#ifdef USE_DEAULT_MEM  	int interMem; +        interMem = 0; +#endif          UNUSED(vType); -	interMem = 0;  	error = 0;  	/* init the memory operator */ @@ -214,7 +216,7 @@ VO_U32 VO_API voAACEncGetOutputData(VO_HANDLE hCodec, VO_CODECBUFFER * pOutput,  	AAC_ENCODER* hAacEnc = (AAC_ENCODER*)hCodec;  	Word16 numAncDataBytes=0;  	Word32  inbuflen; -	int ret, length; +	int length;  	if(NULL == hAacEnc)  		return VO_ERR_INVALID_ARG; diff --git a/media/libstagefright/codecs/aacenc/src/aacenc_core.c b/media/libstagefright/codecs/aacenc/src/aacenc_core.c index cecbc8f..de452d4 100644 --- a/media/libstagefright/codecs/aacenc/src/aacenc_core.c +++ b/media/libstagefright/codecs/aacenc/src/aacenc_core.c @@ -58,7 +58,6 @@ Word16  AacEncOpen(  AAC_ENCODER*      hAacEnc,        /* pointer to an encoder                       const  AACENC_CONFIG     config   /* pre-initialized config struct */                       )  { -  Word32 i;    Word32 error = 0;    Word16 profile = 1; diff --git a/media/libstagefright/codecs/aacenc/src/adj_thr.c b/media/libstagefright/codecs/aacenc/src/adj_thr.c index 471631c..8b8be0e 100644 --- a/media/libstagefright/codecs/aacenc/src/adj_thr.c +++ b/media/libstagefright/codecs/aacenc/src/adj_thr.c @@ -96,7 +96,7 @@ static void adaptMinSnr(PSY_OUT_CHANNEL     psyOutChannel[MAX_CHANNELS],                          MINSNR_ADAPT_PARAM *msaParam,                          const Word16        nChannels)  { -  Word16 ch, sfb, sfbOffs, shift; +  Word16 ch, sfb, sfbOffs;    Word32 nSfb, avgEn;    Word16 log_avgEn = 0;    Word32 startRatio_x_avgEn = 0; diff --git a/media/libstagefright/codecs/aacenc/src/bitbuffer.c b/media/libstagefright/codecs/aacenc/src/bitbuffer.c index 0ce93d3..15eebd0 100644 --- a/media/libstagefright/codecs/aacenc/src/bitbuffer.c +++ b/media/libstagefright/codecs/aacenc/src/bitbuffer.c @@ -24,29 +24,6 @@  /*****************************************************************************  * -* function name: updateBitBufWordPtr -* description:  update Bit Buffer pointer -* -*****************************************************************************/ -static void updateBitBufWordPtr(HANDLE_BIT_BUF hBitBuf, -                                UWord8 **pBitBufWord, -                                Word16   cnt) -{ -  *pBitBufWord += cnt; - - -  if(*pBitBufWord > hBitBuf->pBitBufEnd) { -    *pBitBufWord -= (hBitBuf->pBitBufEnd - hBitBuf->pBitBufBase + 1); -  } - -  if(*pBitBufWord < hBitBuf->pBitBufBase) { -    *pBitBufWord += (hBitBuf->pBitBufEnd - hBitBuf->pBitBufBase + 1); -  } -} - - -/***************************************************************************** -*  * function name: CreateBitBuffer  * description:  create and init Bit Buffer Management  * diff --git a/media/libstagefright/codecs/aacenc/src/bitenc.c b/media/libstagefright/codecs/aacenc/src/bitenc.c index d1fd647..9c81204 100644 --- a/media/libstagefright/codecs/aacenc/src/bitenc.c +++ b/media/libstagefright/codecs/aacenc/src/bitenc.c @@ -547,7 +547,7 @@ static void writeFillElement( const UWord8 *ancBytes,      totFillBits = totFillBits - (3+4); -    if ((cnt == (1<<4)-1)) { +    if (cnt == (1<<4)-1) {        esc_count = min( ((totFillBits >> 3) - ((1<<4)-1)), (1<<8)-1);        WriteBits(hBitStream,esc_count,8); diff --git a/media/libstagefright/codecs/aacenc/src/block_switch.c b/media/libstagefright/codecs/aacenc/src/block_switch.c index c80538f..11bc7e7 100644 --- a/media/libstagefright/codecs/aacenc/src/block_switch.c +++ b/media/libstagefright/codecs/aacenc/src/block_switch.c @@ -30,9 +30,6 @@  #define ENERGY_SHIFT (8 - 1)  /**************** internal function prototypes ***********/ -static Word16 -IIRFilter(const Word16 in, const Word32 coeff[], Word32 states[]); -  static Word32  SrchMaxWithIndex(const Word32 *in, Word16 *index, Word16 n); @@ -280,7 +277,7 @@ Word32 CalcWindowEnergy(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,                          Word16 chIncrement,                          Word16 windowLen)  { -  Word32 w, i, wOffset, tidx, ch; +  Word32 w, i, tidx;    Word32 accuUE, accuFE;    Word32 tempUnfiltered;    Word32 tempFiltered; @@ -329,30 +326,6 @@ Word32 CalcWindowEnergy(BLOCK_SWITCHING_CONTROL *blockSwitchingControl,  }  #endif -/***************************************************************************** -* -* function name: IIRFilter -* description:  calculate the iir-filter for an array -* returns:      the result after iir-filter -* -**********************************************************************************/ -static Word16 IIRFilter(const Word16 in, const Word32 coeff[], Word32 states[]) -{ -  Word32 accu1, accu2, accu3; -  Word32 out; - -  accu1 = L_mpy_ls(coeff[1], in); -  accu3 = accu1 - states[0]; -  accu2 = fixmul( coeff[0], states[1] ); -  out = accu3 - accu2; - -  states[0] = accu1; -  states[1] = out; - -  return round16(out); -} - -  static Word16 synchronizedBlockTypeTable[4][4] = {    /*                 LONG_WINDOW   START_WINDOW  SHORT_WINDOW  STOP_WINDOW */    /* LONG_WINDOW  */{LONG_WINDOW,  START_WINDOW, SHORT_WINDOW, STOP_WINDOW}, diff --git a/media/libstagefright/codecs/aacenc/src/ms_stereo.c b/media/libstagefright/codecs/aacenc/src/ms_stereo.c index 2e34f14..1e4b227 100644 --- a/media/libstagefright/codecs/aacenc/src/ms_stereo.c +++ b/media/libstagefright/codecs/aacenc/src/ms_stereo.c @@ -50,7 +50,6 @@ void MsStereoProcessing(Word32       *sfbEnergyLeft,                          const Word16  sfbPerGroup,                          const Word16  maxSfbPerGroup,                          const Word16 *sfbOffset) { -  Word32 temp;    Word32 sfb,sfboffs, j;    Word32 msMaskTrueSomewhere = 0;    Word32 msMaskFalseSomewhere = 0; diff --git a/media/libstagefright/codecs/aacenc/src/sf_estim.c b/media/libstagefright/codecs/aacenc/src/sf_estim.c index bc320ec..78947e1 100644 --- a/media/libstagefright/codecs/aacenc/src/sf_estim.c +++ b/media/libstagefright/codecs/aacenc/src/sf_estim.c @@ -99,7 +99,7 @@ CalcFormFactorChannel(Word16 *logSfbFormFactor,  {  	Word32 sfbw, sfbw1;  	Word32 i, j; -	Word32 sfbOffs, sfb, shift; +	Word32 sfbOffs, sfb;  	sfbw = sfbw1 = 0;  	for (sfbOffs=0; sfbOffs<psyOutChan->sfbCnt; sfbOffs+=psyOutChan->sfbPerGroup){ diff --git a/media/libstagefright/codecs/aacenc/src/tns.c b/media/libstagefright/codecs/aacenc/src/tns.c index 5172612..27c3971 100644 --- a/media/libstagefright/codecs/aacenc/src/tns.c +++ b/media/libstagefright/codecs/aacenc/src/tns.c @@ -140,7 +140,7 @@ Word16 InitTnsConfigurationLong(Word32 bitRate,          /*!< bitrate */                                  Word16 active)              /*!< tns active flag */  { -  Word32 bitratePerChannel; +  Word32 bitratePerChannel __unused;    tC->maxOrder     = TNS_MAX_ORDER;    tC->tnsStartFreq = 1275;    tC->coefRes      = 4; @@ -206,7 +206,7 @@ Word16 InitTnsConfigurationShort(Word32 bitRate,              /*!< bitrate */                                   PSY_CONFIGURATION_SHORT *pC, /*!< psy config struct */                                   Word16 active)               /*!< tns active flag */  { -  Word32 bitratePerChannel; +  Word32 bitratePerChannel __unused;    tC->maxOrder     = TNS_MAX_ORDER_SHORT;    tC->tnsStartFreq = 2750;    tC->coefRes      = 3; @@ -497,36 +497,6 @@ Word16 TnsEncode(TNS_INFO* tnsInfo,     /*!< tns info structure (modified) */  /*****************************************************************************  * -* function name: m_pow2_cordic -* description: Iterative power function -* -*	Calculates pow(2.0,x-1.0*(scale+1)) with INT_BITS bit precision -*	using modified cordic algorithm -* returns:     the result of pow2 -* -*****************************************************************************/ -static Word32 m_pow2_cordic(Word32 x, Word16 scale) -{ -  Word32 k; - -  Word32 accu_y = 0x40000000; -  accu_y = L_shr(accu_y,scale); - -  for(k=1; k<INT_BITS; k++) { -    const Word32 z = m_log2_table[k]; - -    while(L_sub(x,z) >= 0) { - -      x = L_sub(x, z); -      accu_y = L_add(accu_y, (accu_y >> k)); -    } -  } -  return(accu_y); -} - - -/***************************************************************************** -*  * function name: CalcWeightedSpectrum  * description: Calculate weighted spectrum for LPC calculation  * diff --git a/media/libstagefright/codecs/aacenc/src/transform.c b/media/libstagefright/codecs/aacenc/src/transform.c index a02336f..0080810 100644 --- a/media/libstagefright/codecs/aacenc/src/transform.c +++ b/media/libstagefright/codecs/aacenc/src/transform.c @@ -475,7 +475,6 @@ void Transform_Real(Word16 *mdctDelayBuffer,  	Word32 *winPtr;  	Word32 delayBufferSf,timeSignalSf,minSf; -	Word32 headRoom=0;  	switch(blockType){ diff --git a/media/libstagefright/codecs/amrnb/common/Android.mk b/media/libstagefright/codecs/amrnb/common/Android.mk index a2b3c8f..5e632a6 100644 --- a/media/libstagefright/codecs/amrnb/common/Android.mk +++ b/media/libstagefright/codecs/amrnb/common/Android.mk @@ -67,7 +67,7 @@ LOCAL_C_INCLUDES := \          $(LOCAL_PATH)/include  LOCAL_CFLAGS := \ -        -DOSCL_UNUSED_ARG= -DOSCL_IMPORT_REF= -DOSCL_EXPORT_REF= +        -D"OSCL_UNUSED_ARG(x)=(void)(x)" -DOSCL_IMPORT_REF= -DOSCL_EXPORT_REF=  LOCAL_CFLAGS += -Werror diff --git a/media/libstagefright/codecs/amrnb/common/include/basic_op_c_equivalent.h b/media/libstagefright/codecs/amrnb/common/include/basic_op_c_equivalent.h index 35638e3..c4e4d4f 100644 --- a/media/libstagefright/codecs/amrnb/common/include/basic_op_c_equivalent.h +++ b/media/libstagefright/codecs/amrnb/common/include/basic_op_c_equivalent.h @@ -115,7 +115,7 @@ extern "C"       Returns:          L_sum = 32-bit sum of L_var1 and L_var2 (Word32)      */ -    static inline Word32 L_add(register Word32 L_var1, register Word32 L_var2, Flag *pOverflow) +    static inline Word32 L_add(Word32 L_var1, Word32 L_var2, Flag *pOverflow)      {          Word32 L_sum; @@ -154,8 +154,8 @@ extern "C"       Returns:          L_diff = 32-bit difference of L_var1 and L_var2 (Word32)      */ -    static inline Word32 L_sub(register Word32 L_var1, register Word32 L_var2, -                               register Flag *pOverflow) +    static inline Word32 L_sub(Word32 L_var1, Word32 L_var2, +                               Flag *pOverflow)      {          Word32 L_diff; @@ -246,7 +246,7 @@ extern "C"      */      static inline Word32 L_mult(Word16 var1, Word16 var2, Flag *pOverflow)      { -        register Word32 L_product; +        Word32 L_product;          L_product = (Word32) var1 * var2; @@ -452,7 +452,7 @@ extern "C"      */      static inline Word16 mult(Word16 var1, Word16 var2, Flag *pOverflow)      { -        register Word32 product; +        Word32 product;          product = ((Word32) var1 * var2) >> 15; diff --git a/media/libstagefright/codecs/amrnb/common/src/az_lsp.cpp b/media/libstagefright/codecs/amrnb/common/src/az_lsp.cpp index 4135f30..976b1a6 100644 --- a/media/libstagefright/codecs/amrnb/common/src/az_lsp.cpp +++ b/media/libstagefright/codecs/amrnb/common/src/az_lsp.cpp @@ -564,10 +564,10 @@ void Az_lsp(      Flag   *pOverflow   /* (i/o): overflow flag                              */  )  { -    register Word16 i; -    register Word16 j; -    register Word16 nf; -    register Word16 ip; +    Word16 i; +    Word16 j; +    Word16 nf; +    Word16 ip;      Word16 xlow;      Word16 ylow;      Word16 xhigh; diff --git a/media/libstagefright/codecs/amrnb/common/src/div_s.cpp b/media/libstagefright/codecs/amrnb/common/src/div_s.cpp index f3bed7e..14d30c5 100644 --- a/media/libstagefright/codecs/amrnb/common/src/div_s.cpp +++ b/media/libstagefright/codecs/amrnb/common/src/div_s.cpp @@ -207,13 +207,13 @@ Word16 div_s (Word16 var1, Word16 var2)  /*----------------------------------------------------------------------------  ; FUNCTION CODE  ----------------------------------------------------------------------------*/ -Word16 div_s(register Word16 var1, register Word16 var2) +Word16 div_s(Word16 var1, Word16 var2)  {      /*----------------------------------------------------------------------------      ; Define all local variables      ----------------------------------------------------------------------------*/      Word16 var_out = 0; -    register Word16 iteration; +    Word16 iteration;      Word32 L_num;      Word32 L_denom;      Word32 L_denom_by_2; diff --git a/media/libstagefright/codecs/amrnb/common/src/gc_pred.cpp b/media/libstagefright/codecs/amrnb/common/src/gc_pred.cpp index 3650f3c..1c8a700 100644 --- a/media/libstagefright/codecs/amrnb/common/src/gc_pred.cpp +++ b/media/libstagefright/codecs/amrnb/common/src/gc_pred.cpp @@ -477,9 +477,9 @@ void gc_pred(      Flag   *pOverflow  )  { -    register Word16 i; -    register Word32 L_temp1, L_temp2; -    register Word32 L_tmp; +    Word16 i; +    Word32 L_temp1, L_temp2; +    Word32 L_tmp;      Word32 ener_code;      Word32 ener;      Word16 exp, frac; @@ -993,7 +993,7 @@ void gc_pred_average_limited(  )  {      Word16 av_pred_en; -    register Word16 i; +    Word16 i;      /* do average in MR122 mode (log2() domain) */      av_pred_en = 0; diff --git a/media/libstagefright/codecs/amrnb/common/src/gmed_n.cpp b/media/libstagefright/codecs/amrnb/common/src/gmed_n.cpp index be76241..2d3b9e4 100644 --- a/media/libstagefright/codecs/amrnb/common/src/gmed_n.cpp +++ b/media/libstagefright/codecs/amrnb/common/src/gmed_n.cpp @@ -185,9 +185,9 @@ Word16 gmed_n(            /* o : the median value    */      Word16 n        /* i : number of inputs    */  )  { -    register Word16 i, j, ix = 0; -    register Word16 max; -    register Word16 medianIndex; +    Word16 i, j, ix = 0; +    Word16 max; +    Word16 medianIndex;      Word16  tmp[NMAX];      Word16  tmp2[NMAX]; diff --git a/media/libstagefright/codecs/amrnb/common/src/lsp_az.cpp b/media/libstagefright/codecs/amrnb/common/src/lsp_az.cpp index 6b7b471..495359f 100644 --- a/media/libstagefright/codecs/amrnb/common/src/lsp_az.cpp +++ b/media/libstagefright/codecs/amrnb/common/src/lsp_az.cpp @@ -254,8 +254,8 @@ static void Get_lsp_pol(      Word32 *f,      Flag   *pOverflow)  { -    register Word16 i; -    register Word16 j; +    Word16 i; +    Word16 j;      Word16 hi;      Word16 lo; @@ -511,8 +511,8 @@ void Lsp_Az(      Flag  *pOverflow     /* (o)  : overflow flag                        */  )  { -    register Word16 i; -    register Word16 j; +    Word16 i; +    Word16 j;      Word32 f1[6];      Word32 f2[6]; diff --git a/media/libstagefright/codecs/amrnb/common/src/mult_r.cpp b/media/libstagefright/codecs/amrnb/common/src/mult_r.cpp index 0777e68..7112b3d 100644 --- a/media/libstagefright/codecs/amrnb/common/src/mult_r.cpp +++ b/media/libstagefright/codecs/amrnb/common/src/mult_r.cpp @@ -190,7 +190,7 @@ Word16 mult_r (Word16 var1, Word16 var2)  Word16 mult_r(Word16 var1, Word16 var2, Flag *pOverflow)  { -    register Word32 L_product_arr; +    Word32 L_product_arr;      L_product_arr = ((Word32) var1) * var2;              /* product */      L_product_arr += (Word32) 0x00004000L;               /* round */ diff --git a/media/libstagefright/codecs/amrnb/common/src/norm_l.cpp b/media/libstagefright/codecs/amrnb/common/src/norm_l.cpp index 132fed6..d8d1259 100644 --- a/media/libstagefright/codecs/amrnb/common/src/norm_l.cpp +++ b/media/libstagefright/codecs/amrnb/common/src/norm_l.cpp @@ -197,12 +197,12 @@ Word16 norm_l (Word32 L_var1)  ; FUNCTION CODE  ----------------------------------------------------------------------------*/  #if !( defined(PV_ARM_V5) || defined(PV_ARM_GCC_V5) ) -Word16 norm_l(register Word32 L_var1) +Word16 norm_l(Word32 L_var1)  {      /*----------------------------------------------------------------------------      ; Define all local variables      ----------------------------------------------------------------------------*/ -    register Word16 var_out = 0; +    Word16 var_out = 0;      /*----------------------------------------------------------------------------      ; Function body here diff --git a/media/libstagefright/codecs/amrnb/common/src/norm_s.cpp b/media/libstagefright/codecs/amrnb/common/src/norm_s.cpp index 8cdcdb8..6468b67 100644 --- a/media/libstagefright/codecs/amrnb/common/src/norm_s.cpp +++ b/media/libstagefright/codecs/amrnb/common/src/norm_s.cpp @@ -194,13 +194,13 @@ Word16 norm_s (Word16 var1)  ----------------------------------------------------------------------------*/  #if !( defined(PV_ARM_V5) || defined(PV_ARM_GCC_V5) ) -Word16 norm_s(register Word16 var1) +Word16 norm_s(Word16 var1)  {      /*----------------------------------------------------------------------------      ; Define all local variables      ----------------------------------------------------------------------------*/ -    register Word16 var_out = 0; +    Word16 var_out = 0;      /*----------------------------------------------------------------------------      ; Function body here diff --git a/media/libstagefright/codecs/amrnb/common/src/pred_lt.cpp b/media/libstagefright/codecs/amrnb/common/src/pred_lt.cpp index 9163623..8a1aa9e 100644 --- a/media/libstagefright/codecs/amrnb/common/src/pred_lt.cpp +++ b/media/libstagefright/codecs/amrnb/common/src/pred_lt.cpp @@ -260,9 +260,9 @@ void Pred_lt_3or6(      Flag  *pOverflow  /* output: if set, overflow occurred in this function */  )  { -    register Word16 i; -    register Word16 j; -    register Word16 k; +    Word16 i; +    Word16 j; +    Word16 k;      Word16 *pX0;      Word16 *pX2; diff --git a/media/libstagefright/codecs/amrnb/common/src/q_plsf_3.cpp b/media/libstagefright/codecs/amrnb/common/src/q_plsf_3.cpp index 2b30bf4..c70847e 100644 --- a/media/libstagefright/codecs/amrnb/common/src/q_plsf_3.cpp +++ b/media/libstagefright/codecs/amrnb/common/src/q_plsf_3.cpp @@ -281,7 +281,7 @@ static Word16 Vq_subvec4( /* o: quantization index,            Q0  */      Flag  *pOverflow      /* o : Flag set when overflow occurs     */  )  { -    register Word16 i; +    Word16 i;      Word16 temp;      const Word16 *p_dico;      Word16 index = 0; @@ -607,7 +607,7 @@ static Word16 Vq_subvec3( /* o: quantization index,            Q0  */      Flag use_half,        /* i: use every second entry in codebook */      Flag  *pOverflow)     /* o : Flag set when overflow occurs     */  { -    register Word16 i; +    Word16 i;      Word16 temp;      const Word16 *p_dico; @@ -1013,7 +1013,7 @@ void Q_plsf_3(      Flag  *pOverflow    /* o : Flag set when overflow occurs             */  )  { -    register Word16 i, j; +    Word16 i, j;      Word16 lsf1[M];      Word16 wf1[M];      Word16 lsf_p[M]; diff --git a/media/libstagefright/codecs/amrnb/common/src/residu.cpp b/media/libstagefright/codecs/amrnb/common/src/residu.cpp index b25d3be..2ad132f 100644 --- a/media/libstagefright/codecs/amrnb/common/src/residu.cpp +++ b/media/libstagefright/codecs/amrnb/common/src/residu.cpp @@ -202,7 +202,7 @@ void Residu(  { -    register Word16 i, j; +    Word16 i, j;      Word32 s1;      Word32 s2;      Word32 s3; diff --git a/media/libstagefright/codecs/amrnb/common/src/shr.cpp b/media/libstagefright/codecs/amrnb/common/src/shr.cpp index 775dc69..1018d9c 100644 --- a/media/libstagefright/codecs/amrnb/common/src/shr.cpp +++ b/media/libstagefright/codecs/amrnb/common/src/shr.cpp @@ -202,10 +202,10 @@ Word16 shr_std (Word16 var1, Word16 var2)  /*----------------------------------------------------------------------------  ; FUNCTION CODE  ----------------------------------------------------------------------------*/ -Word16 shr(register Word16 var1, register Word16 var2, Flag *pOverflow) +Word16 shr(Word16 var1, Word16 var2, Flag *pOverflow)  { -    register Word16 result; -    register Word32 temp_res; +    Word16 result; +    Word32 temp_res;      if (var2 != 0)      { diff --git a/media/libstagefright/codecs/amrnb/common/src/weight_a.cpp b/media/libstagefright/codecs/amrnb/common/src/weight_a.cpp index 2e2efc4..ee821ef 100644 --- a/media/libstagefright/codecs/amrnb/common/src/weight_a.cpp +++ b/media/libstagefright/codecs/amrnb/common/src/weight_a.cpp @@ -178,7 +178,7 @@ void Weight_Ai(      Word16 a_exp[]      /* (o)   : Spectral expanded LPC coefficients   */  )  { -    register Word16 i; +    Word16 i;      *(a_exp) = *(a); diff --git a/media/libstagefright/codecs/amrnb/dec/Android.mk b/media/libstagefright/codecs/amrnb/dec/Android.mk index b067456..3750e2e 100644 --- a/media/libstagefright/codecs/amrnb/dec/Android.mk +++ b/media/libstagefright/codecs/amrnb/dec/Android.mk @@ -45,7 +45,7 @@ LOCAL_C_INCLUDES := \          $(LOCAL_PATH)/../common/include  LOCAL_CFLAGS := \ -        -DOSCL_UNUSED_ARG= -DOSCL_IMPORT_REF= +        -D"OSCL_UNUSED_ARG(x)=(void)(x)" -DOSCL_IMPORT_REF=  LOCAL_CFLAGS += -Werror @@ -83,3 +83,24 @@ LOCAL_MODULE := libstagefright_soft_amrdec  LOCAL_MODULE_TAGS := optional  include $(BUILD_SHARED_LIBRARY) + +################################################################################ +include $(CLEAR_VARS) +LOCAL_SRC_FILES := \ +        test/amrnbdec_test.cpp + +LOCAL_C_INCLUDES := \ +        $(LOCAL_PATH)/src \ +        $(LOCAL_PATH)/../common/include \ +        $(call include-path-for, audio-utils) + +LOCAL_STATIC_LIBRARIES := \ +        libstagefright_amrnbdec libsndfile + +LOCAL_SHARED_LIBRARIES := \ +        libstagefright_amrnb_common libaudioutils + +LOCAL_MODULE := libstagefright_amrnbdec_test +LOCAL_MODULE_TAGS := optional + +include $(BUILD_EXECUTABLE) diff --git a/media/libstagefright/codecs/amrnb/dec/src/d1035pf.cpp b/media/libstagefright/codecs/amrnb/dec/src/d1035pf.cpp index 899daba..861b3e6 100644 --- a/media/libstagefright/codecs/amrnb/dec/src/d1035pf.cpp +++ b/media/libstagefright/codecs/amrnb/dec/src/d1035pf.cpp @@ -209,7 +209,7 @@ void dec_10i40_35bits(      Word16 cod[]       /* (o)     : algebraic (fixed) codebook excitation    */  )  { -    register Word16 i, j, pos1, pos2; +    Word16 i, j, pos1, pos2;      Word16 sign, tmp;      for (i = 0; i < L_CODE; i++) diff --git a/media/libstagefright/codecs/amrnb/dec/src/d_plsf_5.cpp b/media/libstagefright/codecs/amrnb/dec/src/d_plsf_5.cpp index 08b690d..7068c0a 100644 --- a/media/libstagefright/codecs/amrnb/dec/src/d_plsf_5.cpp +++ b/media/libstagefright/codecs/amrnb/dec/src/d_plsf_5.cpp @@ -308,7 +308,7 @@ void D_plsf_5(      Flag  *pOverflow    /* o : Flag set when overflow occurs                */  )  { -    register Word16 i; +    Word16 i;      Word16 temp;      Word16 sign; diff --git a/media/libstagefright/codecs/amrnb/dec/src/int_lsf.cpp b/media/libstagefright/codecs/amrnb/dec/src/int_lsf.cpp index c5aefe4..2ca30de 100644 --- a/media/libstagefright/codecs/amrnb/dec/src/int_lsf.cpp +++ b/media/libstagefright/codecs/amrnb/dec/src/int_lsf.cpp @@ -218,9 +218,9 @@ void Int_lsf(      Flag  *pOverflow  /* o : flag set if overflow occurs                    */  )  { -    register Word16 i; -    register Word16 temp1; -    register Word16 temp2; +    Word16 i; +    Word16 temp1; +    Word16 temp2;      if (i_subfr == 0)      { diff --git a/media/libstagefright/codecs/amrnb/dec/src/ph_disp.cpp b/media/libstagefright/codecs/amrnb/dec/src/ph_disp.cpp index da5445b..285465f 100644 --- a/media/libstagefright/codecs/amrnb/dec/src/ph_disp.cpp +++ b/media/libstagefright/codecs/amrnb/dec/src/ph_disp.cpp @@ -207,7 +207,7 @@ int ph_disp_reset (ph_dispState *state)  Word16 ph_disp_reset(ph_dispState *state)  { -    register Word16 i; +    Word16 i;      if (state == (ph_dispState *) NULL)      { @@ -667,15 +667,15 @@ void ph_disp(      Flag   *pOverflow       /* i/o     : oveflow indicator                  */  )  { -    register Word16 i, i1; -    register Word16 tmp1; +    Word16 i, i1; +    Word16 tmp1;      Word32 L_temp;      Word32 L_temp2;      Word16 impNr;           /* indicator for amount of disp./filter used */      Word16 inno_sav[L_SUBFR];      Word16 ps_poss[L_SUBFR]; -    register Word16 nze, nPulse; +    Word16 nze, nPulse;      Word16 ppos;      const Word16 *ph_imp;   /* Pointer to phase dispersion filter */ diff --git a/media/libstagefright/codecs/amrnb/dec/src/pstfilt.cpp b/media/libstagefright/codecs/amrnb/dec/src/pstfilt.cpp index 0336990..39e01a2 100644 --- a/media/libstagefright/codecs/amrnb/dec/src/pstfilt.cpp +++ b/media/libstagefright/codecs/amrnb/dec/src/pstfilt.cpp @@ -445,13 +445,13 @@ void Post_Filter(  )  {      Word16 Ap3[MP1]; -    Word16 Ap4[MP1];            /* bandwidth expanded LP parameters */ -    Word16 *Az;                 /* pointer to Az_4:                 */ +    Word16 Ap4[MP1];      /* bandwidth expanded LP parameters */ +    Word16 *Az;           /* pointer to Az_4:                 */      /*  LPC parameters in each subframe */ -    register Word16 i_subfr;    /* index for beginning of subframe  */ +    Word16 i_subfr;       /* index for beginning of subframe  */      Word16 h[L_H]; -    register Word16 i; +    Word16 i;      Word16 temp1;      Word16 temp2;      Word32 L_tmp; diff --git a/media/libstagefright/codecs/amrnb/dec/test/amrnbdec_test.cpp b/media/libstagefright/codecs/amrnb/dec/test/amrnbdec_test.cpp new file mode 100644 index 0000000..41a9e98 --- /dev/null +++ b/media/libstagefright/codecs/amrnb/dec/test/amrnbdec_test.cpp @@ -0,0 +1,150 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + *  * Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + *  * Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in + *    the documentation and/or other materials provided with the + *    distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <malloc.h> +#include <stdio.h> +#include <stdint.h> +#include <string.h> +#include <assert.h> + +#include "gsmamr_dec.h" +#include <audio_utils/sndfile.h> + +// Constants for AMR-NB +enum { +    kInputBufferSize = 64, +    kSamplesPerFrame = 160, +    kBitsPerSample = 16, +    kOutputBufferSize = kSamplesPerFrame * kBitsPerSample/8, +    kSampleRate = 8000, +    kChannels = 1, +    kFileHeaderSize = 6 +}; +const uint32_t kFrameSizes[] = {12, 13, 15, 17, 19, 20, 26, 31}; + + +int main(int argc, char *argv[]) { + +    if(argc != 3) { +        fprintf(stderr, "Usage %s <input file> <output file>\n", argv[0]); +        return 1; +    } + +    // Open the input file +    FILE* fpInput = fopen(argv[1], "rb"); +    if (!fpInput) { +        fprintf(stderr, "Could not open %s\n", argv[1]); +        return 1; +    } + +    // Validate the input AMR file +    char header[kFileHeaderSize]; +    int bytesRead = fread(header, 1, kFileHeaderSize, fpInput); +    if (bytesRead != kFileHeaderSize || memcmp(header, "#!AMR\n", kFileHeaderSize)) { +        fprintf(stderr, "Invalid AMR-NB file\n"); +        return 1; +    } + +    // Open the output file +    SF_INFO sfInfo; +    memset(&sfInfo, 0, sizeof(SF_INFO)); +    sfInfo.channels = kChannels; +    sfInfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16; +    sfInfo.samplerate = kSampleRate; +    SNDFILE *handle = sf_open(argv[2], SFM_WRITE, &sfInfo); +    if(!handle){ +        fprintf(stderr, "Could not create %s\n", argv[2]); +        return 1; +    } + +    // Create AMR-NB decoder instance +    void* amrHandle; +    int err = GSMInitDecode(&amrHandle, (Word8*)"AMRNBDecoder"); +    if(err != 0){ +        fprintf(stderr, "Error creating AMR-NB decoder instance\n"); +        return 1; +    } + +    //Allocate input buffer +    void *inputBuf = malloc(kInputBufferSize); +    assert(inputBuf != NULL); + +    //Allocate output buffer +    void *outputBuf = malloc(kOutputBufferSize); +    assert(outputBuf != NULL); + + +    // Decode loop +    uint32_t retVal = 0; +    while (1) { +        // Read mode +        uint8_t mode; +        bytesRead = fread(&mode, 1, 1, fpInput); +        if (bytesRead != 1) break; + +        // Find frame type +        Frame_Type_3GPP frameType = (Frame_Type_3GPP)((mode >> 3) & 0x0f); +        if (frameType >= AMR_SID){ +            fprintf(stderr, "Frame type %d not supported\n",frameType); +            retVal = 1; +            break; +        } + +        // Find frame type +        int32_t frameSize = kFrameSizes[frameType]; +        bytesRead = fread(inputBuf, 1, frameSize, fpInput); +        if (bytesRead != frameSize) break; + +        //Decode frame +        int32_t decodeStatus; +        decodeStatus = AMRDecode(amrHandle, frameType, (uint8_t*)inputBuf, +                                 (int16_t*)outputBuf, MIME_IETF); +        if(decodeStatus == -1) { +            fprintf(stderr, "Decoder encountered error\n"); +            retVal = 1; +            break; +        } + +        //Write output to wav +        sf_writef_short(handle, (int16_t*)outputBuf, kSamplesPerFrame); + +    } + +    // Close input and output file +    fclose(fpInput); +    sf_close(handle); + +    //Free allocated memory +    free(inputBuf); +    free(outputBuf); + +    // Close decoder instance +    GSMDecodeFrameExit(&amrHandle); + +    return retVal; +} diff --git a/media/libstagefright/codecs/amrnb/enc/Android.mk b/media/libstagefright/codecs/amrnb/enc/Android.mk index afc0b89..bdba8a9 100644 --- a/media/libstagefright/codecs/amrnb/enc/Android.mk +++ b/media/libstagefright/codecs/amrnb/enc/Android.mk @@ -67,7 +67,7 @@ LOCAL_C_INCLUDES := \          $(LOCAL_PATH)/../common/include  LOCAL_CFLAGS := \ -        -DOSCL_UNUSED_ARG= +        -D"OSCL_UNUSED_ARG(x)=(void)(x)"  LOCAL_CFLAGS += -Werror diff --git a/media/libstagefright/codecs/amrnb/enc/src/autocorr.cpp b/media/libstagefright/codecs/amrnb/enc/src/autocorr.cpp index 0d3acac..c71811d 100644 --- a/media/libstagefright/codecs/amrnb/enc/src/autocorr.cpp +++ b/media/libstagefright/codecs/amrnb/enc/src/autocorr.cpp @@ -306,9 +306,9 @@ Word16 Autocorr(      Flag  *pOverflow       /* (o)    : indicates overflow                 */  )  { -    register Word16 i; -    register Word16 j; -    register Word16 norm; +    Word16 i; +    Word16 j; +    Word16 norm;      Word16 y[L_WINDOW];      Word32 sum; diff --git a/media/libstagefright/codecs/amrnb/enc/src/c2_9pf.cpp b/media/libstagefright/codecs/amrnb/enc/src/c2_9pf.cpp index a33cdf74..b211032 100644 --- a/media/libstagefright/codecs/amrnb/enc/src/c2_9pf.cpp +++ b/media/libstagefright/codecs/amrnb/enc/src/c2_9pf.cpp @@ -318,7 +318,7 @@ extern "C"          Word16 dn_sign[L_CODE];          Word16 rr[L_CODE][L_CODE]; -        register Word16 i; +        Word16 i;          Word16 index;          Word16 sharp; @@ -592,10 +592,10 @@ extern "C"          Flag   * pOverflow   /* o : Flag set when overflow occurs      */      )      { -        register Word16 i0; -        register Word16 i1; +        Word16 i0; +        Word16 i1;          Word16 ix = 0; /* initialization only needed to keep gcc silent */ -        register Word16  track1; +        Word16 track1;          Word16 ipos[NB_PULSE];          Word16 psk;          Word16 ps0; @@ -608,7 +608,7 @@ extern "C"          Word32 s;          Word32 alp0;          Word32 alp1; -        register Word16 i; +        Word16 i;          Word32 L_temp;          Word16 *p_codvec = &codvec[0]; @@ -993,13 +993,13 @@ extern "C"          Flag  *pOverflow  /* o : Flag set when overflow occurs              */      )      { -        register Word16 i; -        register Word16 j; -        register Word16 k; -        register Word16 track; -        register Word16 first; -        register Word16 index; -        register Word16 rsign; +        Word16 i; +        Word16 j; +        Word16 k; +        Word16 track; +        Word16 first; +        Word16 index; +        Word16 rsign;          Word16 indx;          Word16 _sign[NB_PULSE];          Word16 *p0; diff --git a/media/libstagefright/codecs/amrnb/enc/src/cl_ltp.cpp b/media/libstagefright/codecs/amrnb/enc/src/cl_ltp.cpp index 4a05327..525e57d 100644 --- a/media/libstagefright/codecs/amrnb/enc/src/cl_ltp.cpp +++ b/media/libstagefright/codecs/amrnb/enc/src/cl_ltp.cpp @@ -638,7 +638,7 @@ void cl_ltp(      Flag   *pOverflow    /* o   : overflow indicator                        */  )  { -    register Word16 i; +    Word16 i;      Word16 index;      Word32 L_temp;     /* temporarily variable */      Word16 resu3;      /* flag for upsample resolution */ diff --git a/media/libstagefright/codecs/amrnb/enc/src/convolve.cpp b/media/libstagefright/codecs/amrnb/enc/src/convolve.cpp index e9ce7ba..5015a4a 100644 --- a/media/libstagefright/codecs/amrnb/enc/src/convolve.cpp +++ b/media/libstagefright/codecs/amrnb/enc/src/convolve.cpp @@ -212,7 +212,7 @@ void Convolve(      Word16 L           /* (i)     : vector size                            */  )  { -    register Word16 i, n; +    Word16 i, n;      Word32 s1, s2; diff --git a/media/libstagefright/codecs/amrnb/enc/src/cor_h.cpp b/media/libstagefright/codecs/amrnb/enc/src/cor_h.cpp index e46d99f..20583c4 100644 --- a/media/libstagefright/codecs/amrnb/enc/src/cor_h.cpp +++ b/media/libstagefright/codecs/amrnb/enc/src/cor_h.cpp @@ -272,8 +272,8 @@ void cor_h(      Flag  *pOverflow  )  { -    register Word16 i; -    register Word16 dec; +    Word16 i; +    Word16 dec;      Word16 h2[L_CODE];      Word32 s; diff --git a/media/libstagefright/codecs/amrnb/enc/src/cor_h_x.cpp b/media/libstagefright/codecs/amrnb/enc/src/cor_h_x.cpp index beb2aec..c25c026 100644 --- a/media/libstagefright/codecs/amrnb/enc/src/cor_h_x.cpp +++ b/media/libstagefright/codecs/amrnb/enc/src/cor_h_x.cpp @@ -249,9 +249,9 @@ void cor_h_x(      Flag   *pOverflow /* (o): pointer to overflow flag                      */  )  { -    register Word16 i; -    register Word16 j; -    register Word16 k; +    Word16 i; +    Word16 j; +    Word16 k;      Word32 s;      Word32 y32[L_CODE]; diff --git a/media/libstagefright/codecs/amrnb/enc/src/cor_h_x2.cpp b/media/libstagefright/codecs/amrnb/enc/src/cor_h_x2.cpp index da60640..b4fd867 100644 --- a/media/libstagefright/codecs/amrnb/enc/src/cor_h_x2.cpp +++ b/media/libstagefright/codecs/amrnb/enc/src/cor_h_x2.cpp @@ -236,9 +236,9 @@ void cor_h_x2(      Flag *pOverflow  )  { -    register Word16 i; -    register Word16 j; -    register Word16 k; +    Word16 i; +    Word16 j; +    Word16 k;      Word32 s;      Word32 y32[L_CODE];      Word32 max; diff --git a/media/libstagefright/codecs/amrnb/enc/src/dtx_enc.cpp b/media/libstagefright/codecs/amrnb/enc/src/dtx_enc.cpp index 276e590..2ccb777 100644 --- a/media/libstagefright/codecs/amrnb/enc/src/dtx_enc.cpp +++ b/media/libstagefright/codecs/amrnb/enc/src/dtx_enc.cpp @@ -130,7 +130,7 @@ terms listed above has been obtained from the copyright holder.  ; MACROS  ; Define module specific macros here  ----------------------------------------------------------------------------*/ -extern Word32 L_add(register Word32 L_var1, register Word32 L_var2, Flag *pOverflow); +extern Word32 L_add(Word32 L_var1, Word32 L_var2, Flag *pOverflow);  /*----------------------------------------------------------------------------  ; DEFINES @@ -671,7 +671,7 @@ void dtx_enc(dtx_encState *st,        /* i/o : State struct                  */               Flag   *pOverflow        /* i/o : overflow indicator            */              )  { -    register Word16 i, j; +    Word16 i, j;      Word16 temp;      Word16 log_en;      Word16 lsf[M]; @@ -943,7 +943,7 @@ void dtx_buffer(dtx_encState *st,   /* i/o : State struct                    */                 )  { -    register Word16 i; +    Word16 i;      Word32 L_frame_en;      Word32 L_temp;      Word16 log_en_e; diff --git a/media/libstagefright/codecs/amrnb/enc/src/levinson.cpp b/media/libstagefright/codecs/amrnb/enc/src/levinson.cpp index 001897b..29cdac6 100644 --- a/media/libstagefright/codecs/amrnb/enc/src/levinson.cpp +++ b/media/libstagefright/codecs/amrnb/enc/src/levinson.cpp @@ -638,8 +638,8 @@ Word16 Levinson(      Flag   *pOverflow  )  { -    register Word16 i; -    register Word16 j; +    Word16 i; +    Word16 j;      Word16 hi;      Word16 lo;      Word16 Kh;                    /* reflexion coefficient; hi and lo   */ @@ -651,9 +651,9 @@ Word16 Levinson(      Word16 Al[M + 1];      Word16 Anh[M + 1];            /* LPC coef.for next iteration in     */      Word16 Anl[M + 1];            /* double prec.                       */ -    register Word32 t0;           /* temporary variable                 */ -    register Word32 t1;           /* temporary variable                 */ -    register Word32 t2;           /* temporary variable                 */ +    Word32 t0;                    /* temporary variable                 */ +    Word32 t1;                    /* temporary variable                 */ +    Word32 t2;                    /* temporary variable                 */      Word16 *p_Rh;      Word16 *p_Rl; diff --git a/media/libstagefright/codecs/amrnb/enc/src/pitch_ol.cpp b/media/libstagefright/codecs/amrnb/enc/src/pitch_ol.cpp index d3a2ec0..c039bb0 100644 --- a/media/libstagefright/codecs/amrnb/enc/src/pitch_ol.cpp +++ b/media/libstagefright/codecs/amrnb/enc/src/pitch_ol.cpp @@ -320,7 +320,7 @@ static Word16 Lag_max(  /* o   : lag found                               */  )  #endif  { -    register Word16 i; +    Word16 i;      Word16 *p;      Word32 max;      Word32 t0; diff --git a/media/libstagefright/codecs/amrnb/enc/src/pre_proc.cpp b/media/libstagefright/codecs/amrnb/enc/src/pre_proc.cpp index fdc2440..042920e 100644 --- a/media/libstagefright/codecs/amrnb/enc/src/pre_proc.cpp +++ b/media/libstagefright/codecs/amrnb/enc/src/pre_proc.cpp @@ -542,7 +542,7 @@ void Pre_Process(      Word16 signal[], /* input/output signal */      Word16 lg)       /* length of signal    */  { -    register Word16 i; +    Word16 i;      Word16 x_n_2;      Word16 x_n_1;      Word32 L_tmp; diff --git a/media/libstagefright/codecs/amrnb/enc/src/set_sign.cpp b/media/libstagefright/codecs/amrnb/enc/src/set_sign.cpp index d626de3..fa43f78 100644 --- a/media/libstagefright/codecs/amrnb/enc/src/set_sign.cpp +++ b/media/libstagefright/codecs/amrnb/enc/src/set_sign.cpp @@ -248,7 +248,7 @@ void set_sign(Word16 dn[],   /* i/o : correlation between target and h[]    */                Word16 n       /* i   : # of maximum correlations in dn2[]    */               )  { -    register Word16 i, j, k; +    Word16 i, j, k;      Word16 val, min;      Word16 pos = 0; /* initialization only needed to keep gcc silent */ diff --git a/media/libstagefright/codecs/amrwb/Android.mk b/media/libstagefright/codecs/amrwb/Android.mk index efdf988..686f7a3 100644 --- a/media/libstagefright/codecs/amrwb/Android.mk +++ b/media/libstagefright/codecs/amrwb/Android.mk @@ -48,7 +48,7 @@ LOCAL_C_INCLUDES := \          $(LOCAL_PATH)/include  LOCAL_CFLAGS := \ -        -DOSCL_UNUSED_ARG= -DOSCL_IMPORT_REF= +        -D"OSCL_UNUSED_ARG(x)=(void)(x)" -DOSCL_IMPORT_REF=  LOCAL_CFLAGS += -Werror diff --git a/media/libstagefright/codecs/amrwb/src/pvamrwb_math_op.cpp b/media/libstagefright/codecs/amrwb/src/pvamrwb_math_op.cpp index d1ec790..5872512 100644 --- a/media/libstagefright/codecs/amrwb/src/pvamrwb_math_op.cpp +++ b/media/libstagefright/codecs/amrwb/src/pvamrwb_math_op.cpp @@ -205,7 +205,7 @@ int16 div_16by16(int16 var1, int16 var2)  {      int16 var_out = 0; -    register int16 iteration; +    int16 iteration;      int32 L_num;      int32 L_denom;      int32 L_denom_by_2; diff --git a/media/libstagefright/codecs/amrwbenc/Android.mk b/media/libstagefright/codecs/amrwbenc/Android.mk index 64fe8d1..024a292 100644 --- a/media/libstagefright/codecs/amrwbenc/Android.mk +++ b/media/libstagefright/codecs/amrwbenc/Android.mk @@ -86,6 +86,9 @@ LOCAL_SRC_FILES += \  endif +# ARMV5E/Filt_6k_7k_opt.s does not compile with Clang. +LOCAL_CLANG_ASFLAGS_arm += -no-integrated-as +  LOCAL_MODULE := libstagefright_amrwbenc  LOCAL_ARM_MODE := arm diff --git a/media/libstagefright/codecs/amrwbenc/src/q_pulse.c b/media/libstagefright/codecs/amrwbenc/src/q_pulse.c index 80a0b73..d658602 100644 --- a/media/libstagefright/codecs/amrwbenc/src/q_pulse.c +++ b/media/libstagefright/codecs/amrwbenc/src/q_pulse.c @@ -188,7 +188,7 @@ Word32 quant_4p_4N(                        /* (o) return 4*N bits             */  		Word16 pos[],                         /* (i) position of the pulse 1..4  */  		Word16 N)                             /* (i) number of bits for position */  { -	Word16 nb_pos, mask, n_1, tmp; +	Word16 nb_pos, mask __unused, n_1, tmp;  	Word16 posA[4], posB[4];  	Word32 i, j, k, index; diff --git a/media/libstagefright/codecs/amrwbenc/src/wb_vad.c b/media/libstagefright/codecs/amrwbenc/src/wb_vad.c index 13dd2aa..2beaefd 100644 --- a/media/libstagefright/codecs/amrwbenc/src/wb_vad.c +++ b/media/libstagefright/codecs/amrwbenc/src/wb_vad.c @@ -404,7 +404,7 @@ static void noise_estimate_update(  		alpha_down = ALPHA_DOWN1;  	} else  	{ -		if ((st->stat_count == 0)) +		if (st->stat_count == 0)  		{  			alpha_up = ALPHA_UP2;  			alpha_down = ALPHA_DOWN2; diff --git a/media/libstagefright/codecs/avc/common/src/deblock.cpp b/media/libstagefright/codecs/avc/common/src/deblock.cpp index de2d2b6..5f8b693 100644 --- a/media/libstagefright/codecs/avc/common/src/deblock.cpp +++ b/media/libstagefright/codecs/avc/common/src/deblock.cpp @@ -1279,7 +1279,7 @@ void EdgeLoop_Luma_vertical(uint8* SrcPtr, uint8 *Strength, int Alpha, int Beta,      int  C0, c0, dif, AbsDelta, Strng, tmp, tmp1;      int  L2 = 0, L1, L0, R0, R1, R2 = 0;      uint8 *ptr, *ptr1; -    register uint R_in, L_in; +    uint R_in, L_in;      uint R_out, L_out; diff --git a/media/libstagefright/codecs/avc/enc/Android.mk b/media/libstagefright/codecs/avc/enc/Android.mk index 537ba42..2ceebc8 100644 --- a/media/libstagefright/codecs/avc/enc/Android.mk +++ b/media/libstagefright/codecs/avc/enc/Android.mk @@ -28,7 +28,7 @@ LOCAL_C_INCLUDES := \      $(TOP)/frameworks/native/include/media/openmax  LOCAL_CFLAGS := \ -    -DOSCL_IMPORT_REF= -DOSCL_UNUSED_ARG= -DOSCL_EXPORT_REF= +    -DOSCL_IMPORT_REF= -D"OSCL_UNUSED_ARG(x)=(void)(x)" -DOSCL_EXPORT_REF=  LOCAL_CFLAGS += -Werror @@ -51,7 +51,7 @@ LOCAL_C_INCLUDES := \          $(LOCAL_PATH)/../common  LOCAL_CFLAGS := \ -    -DOSCL_IMPORT_REF= -DOSCL_UNUSED_ARG= -DOSCL_EXPORT_REF= +    -DOSCL_IMPORT_REF= -D"OSCL_UNUSED_ARG(x)=(void)(x)" -DOSCL_EXPORT_REF=  LOCAL_STATIC_LIBRARIES := \ diff --git a/media/libstagefright/codecs/avc/enc/SoftAVCEncoder.cpp b/media/libstagefright/codecs/avc/enc/SoftAVCEncoder.cpp index 6a7b222..fa6ec40 100644 --- a/media/libstagefright/codecs/avc/enc/SoftAVCEncoder.cpp +++ b/media/libstagefright/codecs/avc/enc/SoftAVCEncoder.cpp @@ -569,13 +569,6 @@ void SoftAVCEncoder::onQueueFilled(OMX_U32 /* portIndex */) {                  videoInput.coding_timestamp = (inHeader->nTimeStamp + 500) / 1000;  // in ms                  const uint8_t *inputData = NULL;                  if (mInputDataIsMeta) { -                    if (inHeader->nFilledLen != 8) { -                        ALOGE("MetaData buffer is wrong size! " -                                "(got %u bytes, expected 8)", inHeader->nFilledLen); -                        mSignalledError = true; -                        notify(OMX_EventError, OMX_ErrorUndefined, 0, 0); -                        return; -                    }                      inputData =                          extractGraphicBuffer(                                  mInputFrameData, (mWidth * mHeight * 3) >> 1, diff --git a/media/libstagefright/codecs/avc/enc/SoftAVCEncoder.h b/media/libstagefright/codecs/avc/enc/SoftAVCEncoder.h index f31c1f4..81de109 100644 --- a/media/libstagefright/codecs/avc/enc/SoftAVCEncoder.h +++ b/media/libstagefright/codecs/avc/enc/SoftAVCEncoder.h @@ -26,8 +26,6 @@  namespace android { -struct MediaBuffer; -  struct SoftAVCEncoder : public MediaBufferObserver,                          public SoftVideoEncoderOMXComponent {      SoftAVCEncoder( diff --git a/media/libstagefright/codecs/avc/enc/src/findhalfpel.cpp b/media/libstagefright/codecs/avc/enc/src/findhalfpel.cpp index 38a2a15..0b8d9e2 100644 --- a/media/libstagefright/codecs/avc/enc/src/findhalfpel.cpp +++ b/media/libstagefright/codecs/avc/enc/src/findhalfpel.cpp @@ -151,8 +151,7 @@ void GenerateHalfPelPred(uint8* subpel_pred, uint8 *ncand, int lx)      uint8 tmp8;      int32 tmp32;      int16 tmp_horz[18*22], *dst_16, *src_16; -    register int a = 0, b = 0, c = 0, d = 0, e = 0, f = 0; // temp register -    int msk; +    int a = 0, b = 0, c = 0, d = 0, e = 0, f = 0; // temp      int i, j;      /* first copy full-pel to the first array */ @@ -379,7 +378,6 @@ void GenerateHalfPelPred(uint8* subpel_pred, uint8 *ncand, int lx)      // one can just use the above code and change the for(i=2 to for(i=18      for (i = 16; i > 0; i -= 4)      { -        msk = 0;          for (j = 17; j > 0; j--)          {              a = *((uint32*)ref); /* load 4 bytes */ diff --git a/media/libstagefright/codecs/avc/enc/src/init.cpp b/media/libstagefright/codecs/avc/enc/src/init.cpp index c258b57..6e1413a 100644 --- a/media/libstagefright/codecs/avc/enc/src/init.cpp +++ b/media/libstagefright/codecs/avc/enc/src/init.cpp @@ -177,10 +177,6 @@ AVCEnc_Status  SetEncodeParam(AVCHandle* avcHandle, AVCEncParams* encParam,              seqParam->offset_for_non_ref_pic = extS->offset_for_non_ref_pic;              seqParam->offset_for_top_to_bottom_field = extS->offset_for_top_to_bottom_field;              seqParam->num_ref_frames_in_pic_order_cnt_cycle = extS->num_ref_frames_in_pic_order_cnt_cycle; -            if (extS->offset_for_ref_frame == NULL) -            { -                return AVCENC_ENCPARAM_MEM_FAIL; -            }              for (ii = 0; ii < (int) extS->num_ref_frames; ii++)              {                  seqParam->offset_for_ref_frame[ii] = extS->offset_for_ref_frame[ii]; diff --git a/media/libstagefright/codecs/avc/enc/src/rate_control.cpp b/media/libstagefright/codecs/avc/enc/src/rate_control.cpp index aa13873..09dcc28 100644 --- a/media/libstagefright/codecs/avc/enc/src/rate_control.cpp +++ b/media/libstagefright/codecs/avc/enc/src/rate_control.cpp @@ -171,7 +171,7 @@ AVCEnc_Status InitRateControlModule(AVCHandle *avcHandle)      AVCRateControl *rateCtrl = encvid->rateCtrl;      double L1, L2, L3, bpp;      int qp; -    int i, j; +    int i;      rateCtrl->basicUnit = video->PicSizeInMbs; diff --git a/media/libstagefright/codecs/avcdec/Android.mk b/media/libstagefright/codecs/avcdec/Android.mk new file mode 100644 index 0000000..902ab57 --- /dev/null +++ b/media/libstagefright/codecs/avcdec/Android.mk @@ -0,0 +1,27 @@ +#ifeq ($(if $(wildcard external/libh264),1,0),1) + +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE            := libstagefright_soft_avcdec +LOCAL_MODULE_TAGS       := optional + +LOCAL_STATIC_LIBRARIES  := libavcdec +LOCAL_SRC_FILES         := SoftAVCDec.cpp + +LOCAL_C_INCLUDES := $(TOP)/external/libavc/decoder +LOCAL_C_INCLUDES += $(TOP)/external/libavc/common +LOCAL_C_INCLUDES += $(TOP)/frameworks/av/media/libstagefright/include +LOCAL_C_INCLUDES += $(TOP)/frameworks/native/include/media/openmax + +LOCAL_SHARED_LIBRARIES  := libstagefright +LOCAL_SHARED_LIBRARIES  += libstagefright_omx +LOCAL_SHARED_LIBRARIES  += libstagefright_foundation +LOCAL_SHARED_LIBRARIES  += libutils +LOCAL_SHARED_LIBRARIES  += liblog + +LOCAL_LDFLAGS := -Wl,-Bsymbolic + +include $(BUILD_SHARED_LIBRARY) + +#endif diff --git a/media/libstagefright/codecs/avcdec/SoftAVCDec.cpp b/media/libstagefright/codecs/avcdec/SoftAVCDec.cpp new file mode 100644 index 0000000..8388472 --- /dev/null +++ b/media/libstagefright/codecs/avcdec/SoftAVCDec.cpp @@ -0,0 +1,808 @@ +/* + * Copyright 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + *      http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +//#define LOG_NDEBUG 0 +#define LOG_TAG "SoftAVCDec" +#include <utils/Log.h> + +#include "ih264_typedefs.h" +#include "iv.h" +#include "ivd.h" +#include "ithread.h" +#include "ih264d.h" +#include "SoftAVCDec.h" + +#include <media/stagefright/foundation/ADebug.h> +#include <media/stagefright/MediaDefs.h> +#include <OMX_VideoExt.h> + +namespace android { + +#define PRINT_TIME  ALOGV + +#define componentName                   "video_decoder.avc" +#define codingType                      OMX_VIDEO_CodingAVC +#define CODEC_MIME_TYPE                 MEDIA_MIMETYPE_VIDEO_AVC + +/** Function and structure definitions to keep code similar for each codec */ +#define ivdec_api_function              ih264d_api_function +#define ivdext_init_ip_t                ih264d_init_ip_t +#define ivdext_init_op_t                ih264d_init_op_t +#define ivdext_fill_mem_rec_ip_t        ih264d_fill_mem_rec_ip_t +#define ivdext_fill_mem_rec_op_t        ih264d_fill_mem_rec_op_t +#define ivdext_ctl_set_num_cores_ip_t   ih264d_ctl_set_num_cores_ip_t +#define ivdext_ctl_set_num_cores_op_t   ih264d_ctl_set_num_cores_op_t + +#define IVDEXT_CMD_CTL_SET_NUM_CORES    \ +        (IVD_CONTROL_API_COMMAND_TYPE_T)IH264D_CMD_CTL_SET_NUM_CORES + +static const CodecProfileLevel kProfileLevels[] = { +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel1  }, +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel1b }, +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel11 }, +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel12 }, +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel13 }, +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel2  }, +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel21 }, +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel22 }, +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel3  }, +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel31 }, +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel32 }, +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel4  }, +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel41 }, +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel42 }, +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel5  }, +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel51 }, +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel52 }, + +    { OMX_VIDEO_AVCProfileMain,     OMX_VIDEO_AVCLevel1  }, +    { OMX_VIDEO_AVCProfileMain,     OMX_VIDEO_AVCLevel1b }, +    { OMX_VIDEO_AVCProfileMain,     OMX_VIDEO_AVCLevel11 }, +    { OMX_VIDEO_AVCProfileMain,     OMX_VIDEO_AVCLevel12 }, +    { OMX_VIDEO_AVCProfileMain,     OMX_VIDEO_AVCLevel13 }, +    { OMX_VIDEO_AVCProfileMain,     OMX_VIDEO_AVCLevel2  }, +    { OMX_VIDEO_AVCProfileMain,     OMX_VIDEO_AVCLevel21 }, +    { OMX_VIDEO_AVCProfileMain,     OMX_VIDEO_AVCLevel22 }, +    { OMX_VIDEO_AVCProfileMain,     OMX_VIDEO_AVCLevel3  }, +    { OMX_VIDEO_AVCProfileMain,     OMX_VIDEO_AVCLevel31 }, +    { OMX_VIDEO_AVCProfileMain,     OMX_VIDEO_AVCLevel32 }, +    { OMX_VIDEO_AVCProfileMain,     OMX_VIDEO_AVCLevel4  }, +    { OMX_VIDEO_AVCProfileMain,     OMX_VIDEO_AVCLevel41 }, +    { OMX_VIDEO_AVCProfileMain,     OMX_VIDEO_AVCLevel42 }, +    { OMX_VIDEO_AVCProfileMain,     OMX_VIDEO_AVCLevel5  }, +    { OMX_VIDEO_AVCProfileMain,     OMX_VIDEO_AVCLevel51 }, +    { OMX_VIDEO_AVCProfileMain,     OMX_VIDEO_AVCLevel52 }, + +    { OMX_VIDEO_AVCProfileHigh,     OMX_VIDEO_AVCLevel1  }, +    { OMX_VIDEO_AVCProfileHigh,     OMX_VIDEO_AVCLevel1b }, +    { OMX_VIDEO_AVCProfileHigh,     OMX_VIDEO_AVCLevel11 }, +    { OMX_VIDEO_AVCProfileHigh,     OMX_VIDEO_AVCLevel12 }, +    { OMX_VIDEO_AVCProfileHigh,     OMX_VIDEO_AVCLevel13 }, +    { OMX_VIDEO_AVCProfileHigh,     OMX_VIDEO_AVCLevel2  }, +    { OMX_VIDEO_AVCProfileHigh,     OMX_VIDEO_AVCLevel21 }, +    { OMX_VIDEO_AVCProfileHigh,     OMX_VIDEO_AVCLevel22 }, +    { OMX_VIDEO_AVCProfileHigh,     OMX_VIDEO_AVCLevel3  }, +    { OMX_VIDEO_AVCProfileHigh,     OMX_VIDEO_AVCLevel31 }, +    { OMX_VIDEO_AVCProfileHigh,     OMX_VIDEO_AVCLevel32 }, +    { OMX_VIDEO_AVCProfileHigh,     OMX_VIDEO_AVCLevel4  }, +    { OMX_VIDEO_AVCProfileHigh,     OMX_VIDEO_AVCLevel41 }, +    { OMX_VIDEO_AVCProfileHigh,     OMX_VIDEO_AVCLevel42 }, +    { OMX_VIDEO_AVCProfileHigh,     OMX_VIDEO_AVCLevel5  }, +    { OMX_VIDEO_AVCProfileHigh,     OMX_VIDEO_AVCLevel51 }, +    { OMX_VIDEO_AVCProfileHigh,     OMX_VIDEO_AVCLevel52 }, +}; + +SoftAVC::SoftAVC( +        const char *name, +        const OMX_CALLBACKTYPE *callbacks, +        OMX_PTR appData, +        OMX_COMPONENTTYPE **component) +    : SoftVideoDecoderOMXComponent( +            name, componentName, codingType, +            kProfileLevels, ARRAY_SIZE(kProfileLevels), +            320 /* width */, 240 /* height */, callbacks, +            appData, component), +      mMemRecords(NULL), +      mFlushOutBuffer(NULL), +      mOmxColorFormat(OMX_COLOR_FormatYUV420Planar), +      mIvColorFormat(IV_YUV_420P), +      mNewWidth(mWidth), +      mNewHeight(mHeight), +      mChangingResolution(false) { +    initPorts( +            kNumBuffers, INPUT_BUF_SIZE, kNumBuffers, CODEC_MIME_TYPE); + +    GETTIME(&mTimeStart, NULL); + +    // If input dump is enabled, then open create an empty file +    GENERATE_FILE_NAMES(); +    CREATE_DUMP_FILE(mInFile); + +    CHECK_EQ(initDecoder(), (status_t)OK); +} + +SoftAVC::~SoftAVC() { +    CHECK_EQ(deInitDecoder(), (status_t)OK); +} + +static size_t GetCPUCoreCount() { +    long cpuCoreCount = 1; +#if defined(_SC_NPROCESSORS_ONLN) +    cpuCoreCount = sysconf(_SC_NPROCESSORS_ONLN); +#else +    // _SC_NPROC_ONLN must be defined... +    cpuCoreCount = sysconf(_SC_NPROC_ONLN); +#endif +    CHECK(cpuCoreCount >= 1); +    ALOGD("Number of CPU cores: %ld", cpuCoreCount); +    return (size_t)cpuCoreCount; +} + +void SoftAVC::logVersion() { +    ivd_ctl_getversioninfo_ip_t s_ctl_ip; +    ivd_ctl_getversioninfo_op_t s_ctl_op; +    UWORD8 au1_buf[512]; +    IV_API_CALL_STATUS_T status; + +    s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL; +    s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_GETVERSION; +    s_ctl_ip.u4_size = sizeof(ivd_ctl_getversioninfo_ip_t); +    s_ctl_op.u4_size = sizeof(ivd_ctl_getversioninfo_op_t); +    s_ctl_ip.pv_version_buffer = au1_buf; +    s_ctl_ip.u4_version_buffer_size = sizeof(au1_buf); + +    status = +        ivdec_api_function(mCodecCtx, (void *)&s_ctl_ip, (void *)&s_ctl_op); + +    if (status != IV_SUCCESS) { +        ALOGE("Error in getting version number: 0x%x", +                s_ctl_op.u4_error_code); +    } else { +        ALOGV("Ittiam decoder version number: %s", +                (char *)s_ctl_ip.pv_version_buffer); +    } +    return; +} + +status_t SoftAVC::setParams(size_t stride) { +    ivd_ctl_set_config_ip_t s_ctl_ip; +    ivd_ctl_set_config_op_t s_ctl_op; +    IV_API_CALL_STATUS_T status; +    s_ctl_ip.u4_disp_wd = (UWORD32)stride; +    s_ctl_ip.e_frm_skip_mode = IVD_SKIP_NONE; + +    s_ctl_ip.e_frm_out_mode = IVD_DISPLAY_FRAME_OUT; +    s_ctl_ip.e_vid_dec_mode = IVD_DECODE_FRAME; +    s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL; +    s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_SETPARAMS; +    s_ctl_ip.u4_size = sizeof(ivd_ctl_set_config_ip_t); +    s_ctl_op.u4_size = sizeof(ivd_ctl_set_config_op_t); + +    ALOGV("Set the run-time (dynamic) parameters stride = %u", stride); +    status = ivdec_api_function(mCodecCtx, (void *)&s_ctl_ip, (void *)&s_ctl_op); + +    if (status != IV_SUCCESS) { +        ALOGE("Error in setting the run-time parameters: 0x%x", +                s_ctl_op.u4_error_code); + +        return UNKNOWN_ERROR; +    } +    return OK; +} + +status_t SoftAVC::resetPlugin() { +    mIsInFlush = false; +    mReceivedEOS = false; +    memset(mTimeStamps, 0, sizeof(mTimeStamps)); +    memset(mTimeStampsValid, 0, sizeof(mTimeStampsValid)); + +    /* Initialize both start and end times */ +    gettimeofday(&mTimeStart, NULL); +    gettimeofday(&mTimeEnd, NULL); + +    return OK; +} + +status_t SoftAVC::resetDecoder() { +    ivd_ctl_reset_ip_t s_ctl_ip; +    ivd_ctl_reset_op_t s_ctl_op; +    IV_API_CALL_STATUS_T status; + +    s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL; +    s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_RESET; +    s_ctl_ip.u4_size = sizeof(ivd_ctl_reset_ip_t); +    s_ctl_op.u4_size = sizeof(ivd_ctl_reset_op_t); + +    status = ivdec_api_function(mCodecCtx, (void *)&s_ctl_ip, (void *)&s_ctl_op); +    if (IV_SUCCESS != status) { +        ALOGE("Error in reset: 0x%x", s_ctl_op.u4_error_code); +        return UNKNOWN_ERROR; +    } + +    /* Set the run-time (dynamic) parameters */ +    setParams(outputBufferWidth()); + +    /* Set number of cores/threads to be used by the codec */ +    setNumCores(); + +    return OK; +} + +status_t SoftAVC::setNumCores() { +    ivdext_ctl_set_num_cores_ip_t s_set_cores_ip; +    ivdext_ctl_set_num_cores_op_t s_set_cores_op; +    IV_API_CALL_STATUS_T status; +    s_set_cores_ip.e_cmd = IVD_CMD_VIDEO_CTL; +    s_set_cores_ip.e_sub_cmd = IVDEXT_CMD_CTL_SET_NUM_CORES; +    s_set_cores_ip.u4_num_cores = MIN(mNumCores, CODEC_MAX_NUM_CORES); +    s_set_cores_ip.u4_size = sizeof(ivdext_ctl_set_num_cores_ip_t); +    s_set_cores_op.u4_size = sizeof(ivdext_ctl_set_num_cores_op_t); +    status = ivdec_api_function( +            mCodecCtx, (void *)&s_set_cores_ip, (void *)&s_set_cores_op); +    if (IV_SUCCESS != status) { +        ALOGE("Error in setting number of cores: 0x%x", +                s_set_cores_op.u4_error_code); +        return UNKNOWN_ERROR; +    } +    return OK; +} + +status_t SoftAVC::setFlushMode() { +    IV_API_CALL_STATUS_T status; +    ivd_ctl_flush_ip_t s_video_flush_ip; +    ivd_ctl_flush_op_t s_video_flush_op; + +    s_video_flush_ip.e_cmd = IVD_CMD_VIDEO_CTL; +    s_video_flush_ip.e_sub_cmd = IVD_CMD_CTL_FLUSH; +    s_video_flush_ip.u4_size = sizeof(ivd_ctl_flush_ip_t); +    s_video_flush_op.u4_size = sizeof(ivd_ctl_flush_op_t); + +    /* Set the decoder in Flush mode, subsequent decode() calls will flush */ +    status = ivdec_api_function( +            mCodecCtx, (void *)&s_video_flush_ip, (void *)&s_video_flush_op); + +    if (status != IV_SUCCESS) { +        ALOGE("Error in setting the decoder in flush mode: (%d) 0x%x", status, +                s_video_flush_op.u4_error_code); +        return UNKNOWN_ERROR; +    } + +    mIsInFlush = true; +    return OK; +} + +status_t SoftAVC::initDecoder() { +    IV_API_CALL_STATUS_T status; + +    UWORD32 u4_num_reorder_frames; +    UWORD32 u4_num_ref_frames; +    UWORD32 u4_share_disp_buf; +    WORD32 i4_level; + +    mNumCores = GetCPUCoreCount(); + +    /* Initialize number of ref and reorder modes (for H264) */ +    u4_num_reorder_frames = 16; +    u4_num_ref_frames = 16; +    u4_share_disp_buf = 0; + +    uint32_t displayStride = outputBufferWidth(); +    uint32_t displayHeight = outputBufferHeight(); +    uint32_t displaySizeY = displayStride * displayHeight; + +    if (displaySizeY > (1920 * 1088)) { +        i4_level = 50; +    } else if (displaySizeY > (1280 * 720)) { +        i4_level = 40; +    } else if (displaySizeY > (720 * 576)) { +        i4_level = 31; +    } else if (displaySizeY > (624 * 320)) { +        i4_level = 30; +    } else if (displaySizeY > (352 * 288)) { +        i4_level = 21; +    } else { +        i4_level = 20; +    } + +    { +        iv_num_mem_rec_ip_t s_num_mem_rec_ip; +        iv_num_mem_rec_op_t s_num_mem_rec_op; + +        s_num_mem_rec_ip.u4_size = sizeof(s_num_mem_rec_ip); +        s_num_mem_rec_op.u4_size = sizeof(s_num_mem_rec_op); +        s_num_mem_rec_ip.e_cmd = IV_CMD_GET_NUM_MEM_REC; + +        ALOGV("Get number of mem records"); +        status = ivdec_api_function( +                mCodecCtx, (void *)&s_num_mem_rec_ip, (void *)&s_num_mem_rec_op); +        if (IV_SUCCESS != status) { +            ALOGE("Error in getting mem records: 0x%x", +                    s_num_mem_rec_op.u4_error_code); +            return UNKNOWN_ERROR; +        } + +        mNumMemRecords = s_num_mem_rec_op.u4_num_mem_rec; +    } + +    mMemRecords = (iv_mem_rec_t *)ivd_aligned_malloc( +            128, mNumMemRecords * sizeof(iv_mem_rec_t)); +    if (mMemRecords == NULL) { +        ALOGE("Allocation failure"); +        return NO_MEMORY; +    } + +    memset(mMemRecords, 0, mNumMemRecords * sizeof(iv_mem_rec_t)); + +    { +        size_t i; +        ivdext_fill_mem_rec_ip_t s_fill_mem_ip; +        ivdext_fill_mem_rec_op_t s_fill_mem_op; +        iv_mem_rec_t *ps_mem_rec; + +        s_fill_mem_ip.s_ivd_fill_mem_rec_ip_t.u4_size = +            sizeof(ivdext_fill_mem_rec_ip_t); +        s_fill_mem_ip.i4_level = i4_level; +        s_fill_mem_ip.u4_num_reorder_frames = u4_num_reorder_frames; +        s_fill_mem_ip.u4_num_ref_frames = u4_num_ref_frames; +        s_fill_mem_ip.u4_share_disp_buf = u4_share_disp_buf; +        s_fill_mem_ip.u4_num_extra_disp_buf = 0; +        s_fill_mem_ip.e_output_format = mIvColorFormat; + +        s_fill_mem_ip.s_ivd_fill_mem_rec_ip_t.e_cmd = IV_CMD_FILL_NUM_MEM_REC; +        s_fill_mem_ip.s_ivd_fill_mem_rec_ip_t.pv_mem_rec_location = mMemRecords; +        s_fill_mem_ip.s_ivd_fill_mem_rec_ip_t.u4_max_frm_wd = displayStride; +        s_fill_mem_ip.s_ivd_fill_mem_rec_ip_t.u4_max_frm_ht = displayHeight; +        s_fill_mem_op.s_ivd_fill_mem_rec_op_t.u4_size = +            sizeof(ivdext_fill_mem_rec_op_t); + +        ps_mem_rec = mMemRecords; +        for (i = 0; i < mNumMemRecords; i++) { +            ps_mem_rec[i].u4_size = sizeof(iv_mem_rec_t); +        } + +        status = ivdec_api_function( +                mCodecCtx, (void *)&s_fill_mem_ip, (void *)&s_fill_mem_op); + +        if (IV_SUCCESS != status) { +            ALOGE("Error in filling mem records: 0x%x", +                    s_fill_mem_op.s_ivd_fill_mem_rec_op_t.u4_error_code); +            return UNKNOWN_ERROR; +        } +        mNumMemRecords = +            s_fill_mem_op.s_ivd_fill_mem_rec_op_t.u4_num_mem_rec_filled; + +        ps_mem_rec = mMemRecords; + +        for (i = 0; i < mNumMemRecords; i++) { +            ps_mem_rec->pv_base = ivd_aligned_malloc( +                    ps_mem_rec->u4_mem_alignment, ps_mem_rec->u4_mem_size); +            if (ps_mem_rec->pv_base == NULL) { +                ALOGE("Allocation failure for memory record #%zu of size %u", +                        i, ps_mem_rec->u4_mem_size); +                status = IV_FAIL; +                return NO_MEMORY; +            } + +            ps_mem_rec++; +        } +    } + +    /* Initialize the decoder */ +    { +        ivdext_init_ip_t s_init_ip; +        ivdext_init_op_t s_init_op; + +        void *dec_fxns = (void *)ivdec_api_function; + +        s_init_ip.s_ivd_init_ip_t.u4_size = sizeof(ivdext_init_ip_t); +        s_init_ip.s_ivd_init_ip_t.e_cmd = (IVD_API_COMMAND_TYPE_T)IV_CMD_INIT; +        s_init_ip.s_ivd_init_ip_t.pv_mem_rec_location = mMemRecords; +        s_init_ip.s_ivd_init_ip_t.u4_frm_max_wd = displayStride; +        s_init_ip.s_ivd_init_ip_t.u4_frm_max_ht = displayHeight; + +        s_init_ip.i4_level = i4_level; +        s_init_ip.u4_num_reorder_frames = u4_num_reorder_frames; +        s_init_ip.u4_num_ref_frames = u4_num_ref_frames; +        s_init_ip.u4_share_disp_buf = u4_share_disp_buf; +        s_init_ip.u4_num_extra_disp_buf = 0; + +        s_init_op.s_ivd_init_op_t.u4_size = sizeof(s_init_op); + +        s_init_ip.s_ivd_init_ip_t.u4_num_mem_rec = mNumMemRecords; +        s_init_ip.s_ivd_init_ip_t.e_output_format = mIvColorFormat; + +        mCodecCtx = (iv_obj_t *)mMemRecords[0].pv_base; +        mCodecCtx->pv_fxns = dec_fxns; +        mCodecCtx->u4_size = sizeof(iv_obj_t); + +        status = ivdec_api_function(mCodecCtx, (void *)&s_init_ip, (void *)&s_init_op); +        if (status != IV_SUCCESS) { +            ALOGE("Error in init: 0x%x", +                    s_init_op.s_ivd_init_op_t.u4_error_code); +            return UNKNOWN_ERROR; +        } +    } + +    /* Reset the plugin state */ +    resetPlugin(); + +    /* Set the run time (dynamic) parameters */ +    setParams(displayStride); + +    /* Set number of cores/threads to be used by the codec */ +    setNumCores(); + +    /* Get codec version */ +    logVersion(); + +    /* Allocate internal picture buffer */ +    uint32_t bufferSize = displaySizeY * 3 / 2; +    mFlushOutBuffer = (uint8_t *)ivd_aligned_malloc(128, bufferSize); +    if (NULL == mFlushOutBuffer) { +        ALOGE("Could not allocate flushOutputBuffer of size %zu", bufferSize); +        return NO_MEMORY; +    } + +    mInitNeeded = false; +    mFlushNeeded = false; +    return OK; +} + +status_t SoftAVC::deInitDecoder() { +    size_t i; + +    if (mMemRecords) { +        iv_mem_rec_t *ps_mem_rec; + +        ps_mem_rec = mMemRecords; +        for (i = 0; i < mNumMemRecords; i++) { +            if (ps_mem_rec->pv_base) { +                ivd_aligned_free(ps_mem_rec->pv_base); +            } +            ps_mem_rec++; +        } +        ivd_aligned_free(mMemRecords); +        mMemRecords = NULL; +    } + +    if (mFlushOutBuffer) { +        ivd_aligned_free(mFlushOutBuffer); +        mFlushOutBuffer = NULL; +    } + +    mInitNeeded = true; +    mChangingResolution = false; + +    return OK; +} + +status_t SoftAVC::reInitDecoder() { +    status_t ret; + +    deInitDecoder(); + +    ret = initDecoder(); +    if (OK != ret) { +        ALOGE("Create failure"); +        deInitDecoder(); +        return NO_MEMORY; +    } +    return OK; +} + +void SoftAVC::onReset() { +    SoftVideoDecoderOMXComponent::onReset(); + +    resetDecoder(); +    resetPlugin(); +} + +OMX_ERRORTYPE SoftAVC::internalSetParameter(OMX_INDEXTYPE index, const OMX_PTR params) { +    const uint32_t oldWidth = mWidth; +    const uint32_t oldHeight = mHeight; +    OMX_ERRORTYPE ret = SoftVideoDecoderOMXComponent::internalSetParameter(index, params); +    if (mWidth != oldWidth || mHeight != oldHeight) { +        reInitDecoder(); +    } +    return ret; +} + +void SoftAVC::setDecodeArgs( +        ivd_video_decode_ip_t *ps_dec_ip, +        ivd_video_decode_op_t *ps_dec_op, +        OMX_BUFFERHEADERTYPE *inHeader, +        OMX_BUFFERHEADERTYPE *outHeader, +        size_t timeStampIx) { +    size_t sizeY = outputBufferWidth() * outputBufferHeight(); +    size_t sizeUV; +    uint8_t *pBuf; + +    ps_dec_ip->u4_size = sizeof(ivd_video_decode_ip_t); +    ps_dec_op->u4_size = sizeof(ivd_video_decode_op_t); + +    ps_dec_ip->e_cmd = IVD_CMD_VIDEO_DECODE; + +    /* When in flush and after EOS with zero byte input, +     * inHeader is set to zero. Hence check for non-null */ +    if (inHeader) { +        ps_dec_ip->u4_ts = timeStampIx; +        ps_dec_ip->pv_stream_buffer = +            inHeader->pBuffer + inHeader->nOffset; +        ps_dec_ip->u4_num_Bytes = inHeader->nFilledLen; +    } else { +        ps_dec_ip->u4_ts = 0; +        ps_dec_ip->pv_stream_buffer = NULL; +        ps_dec_ip->u4_num_Bytes = 0; +    } + +    if (outHeader) { +        pBuf = outHeader->pBuffer; +    } else { +        pBuf = mFlushOutBuffer; +    } + +    sizeUV = sizeY / 4; +    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[0] = sizeY; +    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[1] = sizeUV; +    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[2] = sizeUV; + +    ps_dec_ip->s_out_buffer.pu1_bufs[0] = pBuf; +    ps_dec_ip->s_out_buffer.pu1_bufs[1] = pBuf + sizeY; +    ps_dec_ip->s_out_buffer.pu1_bufs[2] = pBuf + sizeY + sizeUV; +    ps_dec_ip->s_out_buffer.u4_num_bufs = 3; +    return; +} +void SoftAVC::onPortFlushCompleted(OMX_U32 portIndex) { +    /* Once the output buffers are flushed, ignore any buffers that are held in decoder */ +    if (kOutputPortIndex == portIndex) { +        setFlushMode(); + +        while (true) { +            ivd_video_decode_ip_t s_dec_ip; +            ivd_video_decode_op_t s_dec_op; +            IV_API_CALL_STATUS_T status; +            size_t sizeY, sizeUV; + +            setDecodeArgs(&s_dec_ip, &s_dec_op, NULL, NULL, 0); + +            status = ivdec_api_function(mCodecCtx, (void *)&s_dec_ip, (void *)&s_dec_op); +            if (0 == s_dec_op.u4_output_present) { +                resetPlugin(); +                break; +            } +        } +    } +} + +void SoftAVC::onQueueFilled(OMX_U32 portIndex) { +    UNUSED(portIndex); + +    if (mOutputPortSettingsChange != NONE) { +        return; +    } + +    List<BufferInfo *> &inQueue = getPortQueue(kInputPortIndex); +    List<BufferInfo *> &outQueue = getPortQueue(kOutputPortIndex); + +    /* If input EOS is seen and decoder is not in flush mode, +     * set the decoder in flush mode. +     * There can be a case where EOS is sent along with last picture data +     * In that case, only after decoding that input data, decoder has to be +     * put in flush. This case is handled here  */ + +    if (mReceivedEOS && !mIsInFlush) { +        setFlushMode(); +    } + +    while (!outQueue.empty()) { +        BufferInfo *inInfo; +        OMX_BUFFERHEADERTYPE *inHeader; + +        BufferInfo *outInfo; +        OMX_BUFFERHEADERTYPE *outHeader; +        size_t timeStampIx; + +        inInfo = NULL; +        inHeader = NULL; + +        if (!mIsInFlush) { +            if (!inQueue.empty()) { +                inInfo = *inQueue.begin(); +                inHeader = inInfo->mHeader; +            } else { +                break; +            } +        } + +        outInfo = *outQueue.begin(); +        outHeader = outInfo->mHeader; +        outHeader->nFlags = 0; +        outHeader->nTimeStamp = 0; +        outHeader->nOffset = 0; + +        if (inHeader != NULL && (inHeader->nFlags & OMX_BUFFERFLAG_EOS)) { +            mReceivedEOS = true; +            if (inHeader->nFilledLen == 0) { +                inQueue.erase(inQueue.begin()); +                inInfo->mOwnedByUs = false; +                notifyEmptyBufferDone(inHeader); +                inHeader = NULL; +                setFlushMode(); +            } +        } + +        // When there is an init required and the decoder is not in flush mode, +        // update output port's definition and reinitialize decoder. +        if (mInitNeeded && !mIsInFlush) { +            bool portWillReset = false; +            handlePortSettingsChange(&portWillReset, mNewWidth, mNewHeight); + +            CHECK_EQ(reInitDecoder(), (status_t)OK); +            return; +        } + +        /* Get a free slot in timestamp array to hold input timestamp */ +        { +            size_t i; +            timeStampIx = 0; +            for (i = 0; i < MAX_TIME_STAMPS; i++) { +                if (!mTimeStampsValid[i]) { +                    timeStampIx = i; +                    break; +                } +            } +            if (inHeader != NULL) { +                mTimeStampsValid[timeStampIx] = true; +                mTimeStamps[timeStampIx] = inHeader->nTimeStamp; +            } +        } + +        { +            ivd_video_decode_ip_t s_dec_ip; +            ivd_video_decode_op_t s_dec_op; +            WORD32 timeDelay, timeTaken; +            size_t sizeY, sizeUV; + +            setDecodeArgs(&s_dec_ip, &s_dec_op, inHeader, outHeader, timeStampIx); +            // If input dump is enabled, then write to file +            DUMP_TO_FILE(mInFile, s_dec_ip.pv_stream_buffer, s_dec_ip.u4_num_Bytes); + +            GETTIME(&mTimeStart, NULL); +            /* Compute time elapsed between end of previous decode() +             * to start of current decode() */ +            TIME_DIFF(mTimeEnd, mTimeStart, timeDelay); + +            IV_API_CALL_STATUS_T status; +            status = ivdec_api_function(mCodecCtx, (void *)&s_dec_ip, (void *)&s_dec_op); + +            bool unsupportedDimensions = +                (IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED == (s_dec_op.u4_error_code & 0xFF)); +            bool resChanged = (IVD_RES_CHANGED == (s_dec_op.u4_error_code & 0xFF)); + +            GETTIME(&mTimeEnd, NULL); +            /* Compute time taken for decode() */ +            TIME_DIFF(mTimeStart, mTimeEnd, timeTaken); + +            PRINT_TIME("timeTaken=%6d delay=%6d numBytes=%6d", timeTaken, timeDelay, +                   s_dec_op.u4_num_bytes_consumed); +            if (s_dec_op.u4_frame_decoded_flag && !mFlushNeeded) { +                mFlushNeeded = true; +            } + +            if ((inHeader != NULL) && (1 != s_dec_op.u4_frame_decoded_flag)) { +                /* If the input did not contain picture data, then ignore +                 * the associated timestamp */ +                mTimeStampsValid[timeStampIx] = false; +            } + +            // This is needed to handle CTS DecoderTest testCodecResetsH264WithoutSurface, +            // which is not sending SPS/PPS after port reconfiguration and flush to the codec. +            if (unsupportedDimensions && !mFlushNeeded) { +                bool portWillReset = false; +                handlePortSettingsChange(&portWillReset, s_dec_op.u4_pic_wd, s_dec_op.u4_pic_ht); + +                CHECK_EQ(reInitDecoder(), (status_t)OK); + +                setDecodeArgs(&s_dec_ip, &s_dec_op, inHeader, outHeader, timeStampIx); + +                ivdec_api_function(mCodecCtx, (void *)&s_dec_ip, (void *)&s_dec_op); +                return; +            } + +            // If the decoder is in the changing resolution mode and there is no output present, +            // that means the switching is done and it's ready to reset the decoder and the plugin. +            if (mChangingResolution && !s_dec_op.u4_output_present) { +                mChangingResolution = false; +                resetDecoder(); +                resetPlugin(); +                continue; +            } + +            if (unsupportedDimensions || resChanged) { +                mChangingResolution = true; +                if (mFlushNeeded) { +                    setFlushMode(); +                } + +                if (unsupportedDimensions) { +                    mNewWidth = s_dec_op.u4_pic_wd; +                    mNewHeight = s_dec_op.u4_pic_ht; +                    mInitNeeded = true; +                } +                continue; +            } + +            if ((0 < s_dec_op.u4_pic_wd) && (0 < s_dec_op.u4_pic_ht)) { +                uint32_t width = s_dec_op.u4_pic_wd; +                uint32_t height = s_dec_op.u4_pic_ht; +                bool portWillReset = false; +                handlePortSettingsChange(&portWillReset, width, height); + +                if (portWillReset) { +                    resetDecoder(); +                    return; +                } +            } + +            if (s_dec_op.u4_output_present) { +                outHeader->nFilledLen = (mWidth * mHeight * 3) / 2; + +                outHeader->nTimeStamp = mTimeStamps[s_dec_op.u4_ts]; +                mTimeStampsValid[s_dec_op.u4_ts] = false; + +                outInfo->mOwnedByUs = false; +                outQueue.erase(outQueue.begin()); +                outInfo = NULL; +                notifyFillBufferDone(outHeader); +                outHeader = NULL; +            } else { +                /* If in flush mode and no output is returned by the codec, +                 * then come out of flush mode */ +                mIsInFlush = false; + +                /* If EOS was recieved on input port and there is no output +                 * from the codec, then signal EOS on output port */ +                if (mReceivedEOS) { +                    outHeader->nFilledLen = 0; +                    outHeader->nFlags |= OMX_BUFFERFLAG_EOS; + +                    outInfo->mOwnedByUs = false; +                    outQueue.erase(outQueue.begin()); +                    outInfo = NULL; +                    notifyFillBufferDone(outHeader); +                    outHeader = NULL; +                    resetPlugin(); +                } +            } +        } + +        if (inHeader != NULL) { +            inInfo->mOwnedByUs = false; +            inQueue.erase(inQueue.begin()); +            inInfo = NULL; +            notifyEmptyBufferDone(inHeader); +            inHeader = NULL; +        } +    } +} + +}  // namespace android + +android::SoftOMXComponent *createSoftOMXComponent( +        const char *name, const OMX_CALLBACKTYPE *callbacks, OMX_PTR appData, +        OMX_COMPONENTTYPE **component) { +    return new android::SoftAVC(name, callbacks, appData, component); +} diff --git a/media/libstagefright/codecs/avcdec/SoftAVCDec.h b/media/libstagefright/codecs/avcdec/SoftAVCDec.h new file mode 100644 index 0000000..191a71d --- /dev/null +++ b/media/libstagefright/codecs/avcdec/SoftAVCDec.h @@ -0,0 +1,177 @@ +/* + * Copyright 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + *      http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef SOFT_H264_DEC_H_ + +#define SOFT_H264_DEC_H_ + +#include "SoftVideoDecoderOMXComponent.h" +#include <sys/time.h> + +namespace android { + +#define ivd_aligned_malloc(alignment, size) memalign(alignment, size) +#define ivd_aligned_free(buf) free(buf) + +/** Number of entries in the time-stamp array */ +#define MAX_TIME_STAMPS 64 + +/** Maximum number of cores supported by the codec */ +#define CODEC_MAX_NUM_CORES 4 + +#define CODEC_MAX_WIDTH     1920 + +#define CODEC_MAX_HEIGHT    1088 + +/** Input buffer size */ +#define INPUT_BUF_SIZE (1024 * 1024) + +#define MIN(a, b) ((a) < (b)) ? (a) : (b) + +/** Used to remove warnings about unused parameters */ +#define UNUSED(x) ((void)(x)) + +/** Get time */ +#define GETTIME(a, b) gettimeofday(a, b); + +/** Compute difference between start and end */ +#define TIME_DIFF(start, end, diff) \ +    diff = ((end.tv_sec - start.tv_sec) * 1000000) + \ +            (end.tv_usec - start.tv_usec); + +struct SoftAVC : public SoftVideoDecoderOMXComponent { +    SoftAVC(const char *name, const OMX_CALLBACKTYPE *callbacks, +            OMX_PTR appData, OMX_COMPONENTTYPE **component); + +protected: +    virtual ~SoftAVC(); + +    virtual void onQueueFilled(OMX_U32 portIndex); +    virtual void onPortFlushCompleted(OMX_U32 portIndex); +    virtual void onReset(); +    virtual OMX_ERRORTYPE internalSetParameter(OMX_INDEXTYPE index, const OMX_PTR params); +private: +    // Number of input and output buffers +    enum { +        kNumBuffers = 8 +    }; + +    iv_obj_t *mCodecCtx;         // Codec context +    iv_mem_rec_t *mMemRecords;   // Memory records requested by the codec +    size_t mNumMemRecords;       // Number of memory records requested by the codec + +    size_t mNumCores;            // Number of cores to be uesd by the codec + +    struct timeval mTimeStart;   // Time at the start of decode() +    struct timeval mTimeEnd;     // Time at the end of decode() + +    // Internal buffer to be used to flush out the buffers from decoder +    uint8_t *mFlushOutBuffer; + +    // Status of entries in the timestamp array +    bool mTimeStampsValid[MAX_TIME_STAMPS]; + +    // Timestamp array - Since codec does not take 64 bit timestamps, +    // they are maintained in the plugin +    OMX_S64 mTimeStamps[MAX_TIME_STAMPS]; + +#ifdef FILE_DUMP_ENABLE +    char mInFile[200]; +#endif /* FILE_DUMP_ENABLE */ + +    OMX_COLOR_FORMATTYPE mOmxColorFormat;    // OMX Color format +    IV_COLOR_FORMAT_T mIvColorFormat;        // Ittiam Color format + +    bool mIsInFlush;        // codec is flush mode +    bool mReceivedEOS;      // EOS is receieved on input port +    bool mInitNeeded; +    uint32_t mNewWidth; +    uint32_t mNewHeight; +    // The input stream has changed to a different resolution, which is still supported by the +    // codec. So the codec is switching to decode the new resolution. +    bool mChangingResolution; +    bool mFlushNeeded; + +    status_t initDecoder(); +    status_t deInitDecoder(); +    status_t setFlushMode(); +    status_t setParams(size_t stride); +    void logVersion(); +    status_t setNumCores(); +    status_t resetDecoder(); +    status_t resetPlugin(); +    status_t reInitDecoder(); + +    void setDecodeArgs( +            ivd_video_decode_ip_t *ps_dec_ip, +            ivd_video_decode_op_t *ps_dec_op, +            OMX_BUFFERHEADERTYPE *inHeader, +            OMX_BUFFERHEADERTYPE *outHeader, +            size_t timeStampIx); + +    DISALLOW_EVIL_CONSTRUCTORS(SoftAVC); +}; + +#ifdef FILE_DUMP_ENABLE + +#define INPUT_DUMP_PATH     "/sdcard/media/avcd_input" +#define INPUT_DUMP_EXT      "h264" + +#define GENERATE_FILE_NAMES() {                         \ +    GETTIME(&mTimeStart, NULL);                         \ +    strcpy(mInFile, "");                                \ +    sprintf(mInFile, "%s_%ld.%ld.%s", INPUT_DUMP_PATH,  \ +            mTimeStart.tv_sec, mTimeStart.tv_usec,      \ +            INPUT_DUMP_EXT);                            \ +} + +#define CREATE_DUMP_FILE(m_filename) {                  \ +    FILE *fp = fopen(m_filename, "wb");                 \ +    if (fp != NULL) {                                   \ +        fclose(fp);                                     \ +    } else {                                            \ +        ALOGD("Could not open file %s", m_filename);    \ +    }                                                   \ +} +#define DUMP_TO_FILE(m_filename, m_buf, m_size)         \ +{                                                       \ +    FILE *fp = fopen(m_filename, "ab");                 \ +    if (fp != NULL && m_buf != NULL) {                  \ +        int i;                                          \ +        i = fwrite(m_buf, 1, m_size, fp);               \ +        ALOGD("fwrite ret %d to write %d", i, m_size);  \ +        if (i != (int) m_size) {                        \ +            ALOGD("Error in fwrite, returned %d", i);   \ +            perror("Error in write to file");           \ +        }                                               \ +        fclose(fp);                                     \ +    } else {                                            \ +        ALOGD("Could not write to file %s", m_filename);\ +    }                                                   \ +} +#else /* FILE_DUMP_ENABLE */ +#define INPUT_DUMP_PATH +#define INPUT_DUMP_EXT +#define OUTPUT_DUMP_PATH +#define OUTPUT_DUMP_EXT +#define GENERATE_FILE_NAMES() +#define CREATE_DUMP_FILE(m_filename) +#define DUMP_TO_FILE(m_filename, m_buf, m_size) +#endif /* FILE_DUMP_ENABLE */ + +} // namespace android + +#endif  // SOFT_H264_DEC_H_ diff --git a/media/libstagefright/codecs/avcenc/Android.mk b/media/libstagefright/codecs/avcenc/Android.mk new file mode 100644 index 0000000..24a4db9 --- /dev/null +++ b/media/libstagefright/codecs/avcenc/Android.mk @@ -0,0 +1,30 @@ +#ifeq ($(if $(wildcard external/libh264),1,0),1) + +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE            := libstagefright_soft_avcenc +LOCAL_MODULE_TAGS       := optional + +LOCAL_STATIC_LIBRARIES  := libavcenc +LOCAL_SRC_FILES         := SoftAVCEnc.cpp + +LOCAL_C_INCLUDES := $(TOP)/external/libavc/encoder +LOCAL_C_INCLUDES += $(TOP)/external/libavc/common +LOCAL_C_INCLUDES += $(TOP)/frameworks/av/media/libstagefright/include +LOCAL_C_INCLUDES += $(TOP)/frameworks/native/include/media/openmax +LOCAL_C_INCLUDES += $(TOP)/frameworks/av/media/libstagefright/include +LOCAL_C_INCLUDES += $(TOP)/frameworks/native/include/media/hardware +LOCAL_C_INCLUDES += $(TOP)/frameworks/native/include/media/openmax + +LOCAL_SHARED_LIBRARIES  := libstagefright +LOCAL_SHARED_LIBRARIES  += libstagefright_omx +LOCAL_SHARED_LIBRARIES  += libstagefright_foundation +LOCAL_SHARED_LIBRARIES  += libutils +LOCAL_SHARED_LIBRARIES  += liblog + +LOCAL_LDFLAGS := -Wl,-Bsymbolic + +include $(BUILD_SHARED_LIBRARY) + +#endif diff --git a/media/libstagefright/codecs/avcenc/SoftAVCEnc.cpp b/media/libstagefright/codecs/avcenc/SoftAVCEnc.cpp new file mode 100644 index 0000000..bf5e353 --- /dev/null +++ b/media/libstagefright/codecs/avcenc/SoftAVCEnc.cpp @@ -0,0 +1,1335 @@ +/* + * Copyright 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + *      http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +//#define LOG_NDEBUG 0 +#define LOG_TAG "SoftAVCEnc" +#include <utils/Log.h> +#include <utils/misc.h> + +#include "OMX_Video.h" + +#include <HardwareAPI.h> +#include <MetadataBufferType.h> +#include <media/stagefright/foundation/ADebug.h> +#include <media/stagefright/MediaDefs.h> +#include <media/stagefright/MediaErrors.h> +#include <media/stagefright/MetaData.h> +#include <media/stagefright/Utils.h> +#include <ui/Rect.h> + +#include "ih264_typedefs.h" +#include "iv2.h" +#include "ive2.h" +#include "ih264e.h" +#include "SoftAVCEnc.h" + +namespace android { + +    #define ive_api_function ih264e_api_function + +template<class T> +static void InitOMXParams(T *params) { +    params->nSize = sizeof(T); +    params->nVersion.s.nVersionMajor = 1; +    params->nVersion.s.nVersionMinor = 0; +    params->nVersion.s.nRevision = 0; +    params->nVersion.s.nStep = 0; +} + +typedef struct LevelConversion { +    OMX_VIDEO_AVCLEVELTYPE omxLevel; +    WORD32 avcLevel; +} LevelConcersion; + +static LevelConversion ConversionTable[] = { +    { OMX_VIDEO_AVCLevel1,  10 }, +    { OMX_VIDEO_AVCLevel1b, 9  }, +    { OMX_VIDEO_AVCLevel11, 11 }, +    { OMX_VIDEO_AVCLevel12, 12 }, +    { OMX_VIDEO_AVCLevel13, 13 }, +    { OMX_VIDEO_AVCLevel2,  20 }, +    { OMX_VIDEO_AVCLevel21, 21 }, +    { OMX_VIDEO_AVCLevel22, 22 }, +    { OMX_VIDEO_AVCLevel3,  30 }, +    { OMX_VIDEO_AVCLevel31, 31 }, +    { OMX_VIDEO_AVCLevel32, 32 }, +    { OMX_VIDEO_AVCLevel4,  40 }, +    { OMX_VIDEO_AVCLevel41, 41 }, +    { OMX_VIDEO_AVCLevel42, 42 }, +    { OMX_VIDEO_AVCLevel5,  50 }, +    { OMX_VIDEO_AVCLevel51, 51 }, +}; + +static const CodecProfileLevel kProfileLevels[] = { +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel1  }, +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel1b }, +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel11 }, +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel12 }, +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel13 }, +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel2  }, +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel21 }, +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel22 }, +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel3  }, +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel31 }, +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel32 }, +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel4  }, +    { OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel41 }, +}; + + +static size_t GetCPUCoreCount() { +    long cpuCoreCount = 1; +#if defined(_SC_NPROCESSORS_ONLN) +    cpuCoreCount = sysconf(_SC_NPROCESSORS_ONLN); +#else +    // _SC_NPROC_ONLN must be defined... +    cpuCoreCount = sysconf(_SC_NPROC_ONLN); +#endif +    CHECK(cpuCoreCount >= 1); +    ALOGD("Number of CPU cores: %ld", cpuCoreCount); +    return (size_t)cpuCoreCount; +} + +static status_t ConvertOmxAvcLevelToAvcSpecLevel( +        OMX_VIDEO_AVCLEVELTYPE omxLevel, WORD32 *avcLevel) { +    for (size_t i = 0; i < NELEM(ConversionTable); ++i) { +        if (omxLevel == ConversionTable[i].omxLevel) { +            *avcLevel = ConversionTable[i].avcLevel; +            return OK; +        } +    } + +    ALOGE("ConvertOmxAvcLevelToAvcSpecLevel: %d level not supported", +            (int32_t)omxLevel); + +    return BAD_VALUE; +} + +static status_t ConvertAvcSpecLevelToOmxAvcLevel( +        WORD32 avcLevel, OMX_VIDEO_AVCLEVELTYPE *omxLevel) { +    for (size_t i = 0; i < NELEM(ConversionTable); ++i) { +        if (avcLevel == ConversionTable[i].avcLevel) { +            *omxLevel = ConversionTable[i].omxLevel; +            return OK; +        } +    } + +    ALOGE("ConvertAvcSpecLevelToOmxAvcLevel: %d level not supported", +            (int32_t)avcLevel); + +    return BAD_VALUE; +} + + +SoftAVC::SoftAVC( +        const char *name, +        const OMX_CALLBACKTYPE *callbacks, +        OMX_PTR appData, +        OMX_COMPONENTTYPE **component) +    : SoftVideoEncoderOMXComponent( +            name, "video_encoder.avc", OMX_VIDEO_CodingAVC, +            kProfileLevels, NELEM(kProfileLevels), +            176 /* width */, 144 /* height */, +            callbacks, appData, component), +      mIvVideoColorFormat(IV_YUV_420P), +      mIDRFrameRefreshIntervalInSec(1), +      mAVCEncProfile(IV_PROFILE_BASE), +      mAVCEncLevel(31), +      mPrevTimestampUs(-1), +      mStarted(false), +      mSawInputEOS(false), +      mSignalledError(false), +      mConversionBuffer(NULL), +      mCodecCtx(NULL) { + +    initPorts(kNumBuffers, kNumBuffers, ((mWidth * mHeight * 3) >> 1), +            MEDIA_MIMETYPE_VIDEO_AVC, 2); + +    // If dump is enabled, then open create an empty file +    GENERATE_FILE_NAMES(); +    CREATE_DUMP_FILE(mInFile); +    CREATE_DUMP_FILE(mOutFile); + +} + +SoftAVC::~SoftAVC() { +    releaseEncoder(); +    List<BufferInfo *> &outQueue = getPortQueue(1); +    List<BufferInfo *> &inQueue = getPortQueue(0); +    CHECK(outQueue.empty()); +    CHECK(inQueue.empty()); +} + +OMX_ERRORTYPE SoftAVC::initEncParams() { +    mCodecCtx = NULL; +    mMemRecords = NULL; +    mNumMemRecords = DEFAULT_MEM_REC_CNT; +    mHeaderGenerated = 0; +    mNumCores = GetCPUCoreCount(); +    mArch = DEFAULT_ARCH; +    mSliceMode = DEFAULT_SLICE_MODE; +    mSliceParam = DEFAULT_SLICE_PARAM; +    mHalfPelEnable = DEFAULT_HPEL; +    mIInterval = DEFAULT_I_INTERVAL; +    mIDRInterval = DEFAULT_IDR_INTERVAL; +    mDisableDeblkLevel = DEFAULT_DISABLE_DEBLK_LEVEL; +    mFrameRate = DEFAULT_SRC_FRAME_RATE; +    mEnableFastSad = DEFAULT_ENABLE_FAST_SAD; +    mEnableAltRef = DEFAULT_ENABLE_ALT_REF; +    mEncSpeed = DEFAULT_ENC_SPEED; +    mIntra4x4 = DEFAULT_INTRA4x4; +    mAIRMode = DEFAULT_AIR; +    mAIRRefreshPeriod = DEFAULT_AIR_REFRESH_PERIOD; +    mPSNREnable = DEFAULT_PSNR_ENABLE; +    mReconEnable = DEFAULT_RECON_ENABLE; + +    gettimeofday(&mTimeStart, NULL); +    gettimeofday(&mTimeEnd, NULL); + +    return OMX_ErrorNone; +} + + +OMX_ERRORTYPE SoftAVC::setDimensions() { +    ive_ctl_set_dimensions_ip_t s_dimensions_ip; +    ive_ctl_set_dimensions_op_t s_dimensions_op; +    IV_STATUS_T status; + +    s_dimensions_ip.e_cmd = IVE_CMD_VIDEO_CTL; +    s_dimensions_ip.e_sub_cmd = IVE_CMD_CTL_SET_DIMENSIONS; +    s_dimensions_ip.u4_ht = mHeight; +    s_dimensions_ip.u4_wd = mWidth; +    s_dimensions_ip.u4_strd = mStride; + +    s_dimensions_ip.u4_timestamp_high = -1; +    s_dimensions_ip.u4_timestamp_low = -1; + +    s_dimensions_ip.u4_size = sizeof(ive_ctl_set_dimensions_ip_t); +    s_dimensions_op.u4_size = sizeof(ive_ctl_set_dimensions_op_t); + +    status = ive_api_function(mCodecCtx, &s_dimensions_ip, &s_dimensions_op); +    if (status != IV_SUCCESS) { +        ALOGE("Unable to set frame dimensions = 0x%x\n", +                s_dimensions_op.u4_error_code); +        return OMX_ErrorUndefined; +    } +    return OMX_ErrorNone; +} + +OMX_ERRORTYPE SoftAVC::setNumCores() { +    IV_STATUS_T status; +    ive_ctl_set_num_cores_ip_t s_num_cores_ip; +    ive_ctl_set_num_cores_op_t s_num_cores_op; +    s_num_cores_ip.e_cmd = IVE_CMD_VIDEO_CTL; +    s_num_cores_ip.e_sub_cmd = IVE_CMD_CTL_SET_NUM_CORES; +    s_num_cores_ip.u4_num_cores = MIN(mNumCores, CODEC_MAX_CORES); +    s_num_cores_ip.u4_timestamp_high = -1; +    s_num_cores_ip.u4_timestamp_low = -1; +    s_num_cores_ip.u4_size = sizeof(ive_ctl_set_num_cores_ip_t); + +    s_num_cores_op.u4_size = sizeof(ive_ctl_set_num_cores_op_t); + +    status = ive_api_function( +            mCodecCtx, (void *) &s_num_cores_ip, (void *) &s_num_cores_op); +    if (status != IV_SUCCESS) { +        ALOGE("Unable to set processor params = 0x%x\n", +                s_num_cores_op.u4_error_code); +        return OMX_ErrorUndefined; +    } +    return OMX_ErrorNone; +} + +OMX_ERRORTYPE SoftAVC::setFrameRate() { +    ive_ctl_set_frame_rate_ip_t s_frame_rate_ip; +    ive_ctl_set_frame_rate_op_t s_frame_rate_op; +    IV_STATUS_T status; + +    s_frame_rate_ip.e_cmd = IVE_CMD_VIDEO_CTL; +    s_frame_rate_ip.e_sub_cmd = IVE_CMD_CTL_SET_FRAMERATE; + +    s_frame_rate_ip.u4_src_frame_rate = mFrameRate; +    s_frame_rate_ip.u4_tgt_frame_rate = mFrameRate; + +    s_frame_rate_ip.u4_timestamp_high = -1; +    s_frame_rate_ip.u4_timestamp_low = -1; + +    s_frame_rate_ip.u4_size = sizeof(ive_ctl_set_frame_rate_ip_t); +    s_frame_rate_op.u4_size = sizeof(ive_ctl_set_frame_rate_op_t); + +    status = ive_api_function(mCodecCtx, &s_frame_rate_ip, &s_frame_rate_op); +    if (status != IV_SUCCESS) { +        ALOGE("Unable to set frame rate = 0x%x\n", +                s_frame_rate_op.u4_error_code); +        return OMX_ErrorUndefined; +    } +    return OMX_ErrorNone; +} + +OMX_ERRORTYPE SoftAVC::setIpeParams() { +    ive_ctl_set_ipe_params_ip_t s_ipe_params_ip; +    ive_ctl_set_ipe_params_op_t s_ipe_params_op; +    IV_STATUS_T status; + +    s_ipe_params_ip.e_cmd = IVE_CMD_VIDEO_CTL; +    s_ipe_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_IPE_PARAMS; + +    s_ipe_params_ip.u4_enable_intra_4x4 = mIntra4x4; +    s_ipe_params_ip.u4_enc_speed_preset = mEncSpeed; + +    s_ipe_params_ip.u4_timestamp_high = -1; +    s_ipe_params_ip.u4_timestamp_low = -1; + +    s_ipe_params_ip.u4_size = sizeof(ive_ctl_set_ipe_params_ip_t); +    s_ipe_params_op.u4_size = sizeof(ive_ctl_set_ipe_params_op_t); + +    status = ive_api_function(mCodecCtx, &s_ipe_params_ip, &s_ipe_params_op); +    if (status != IV_SUCCESS) { +        ALOGE("Unable to set ipe params = 0x%x\n", +                s_ipe_params_op.u4_error_code); +        return OMX_ErrorUndefined; +    } +    return OMX_ErrorNone; +} + +OMX_ERRORTYPE SoftAVC::setBitRate() { +    ive_ctl_set_bitrate_ip_t s_bitrate_ip; +    ive_ctl_set_bitrate_op_t s_bitrate_op; +    IV_STATUS_T status; + +    s_bitrate_ip.e_cmd = IVE_CMD_VIDEO_CTL; +    s_bitrate_ip.e_sub_cmd = IVE_CMD_CTL_SET_BITRATE; + +    s_bitrate_ip.u4_target_bitrate = mBitrate; + +    s_bitrate_ip.u4_timestamp_high = -1; +    s_bitrate_ip.u4_timestamp_low = -1; + +    s_bitrate_ip.u4_size = sizeof(ive_ctl_set_bitrate_ip_t); +    s_bitrate_op.u4_size = sizeof(ive_ctl_set_bitrate_op_t); + +    status = ive_api_function(mCodecCtx, &s_bitrate_ip, &s_bitrate_op); +    if (status != IV_SUCCESS) { +        ALOGE("Unable to set bit rate = 0x%x\n", s_bitrate_op.u4_error_code); +        return OMX_ErrorUndefined; +    } +    return OMX_ErrorNone; +} + +OMX_ERRORTYPE SoftAVC::setFrameType(IV_PICTURE_CODING_TYPE_T e_frame_type) { +    ive_ctl_set_frame_type_ip_t s_frame_type_ip; +    ive_ctl_set_frame_type_op_t s_frame_type_op; +    IV_STATUS_T status; + +    s_frame_type_ip.e_cmd = IVE_CMD_VIDEO_CTL; +    s_frame_type_ip.e_sub_cmd = IVE_CMD_CTL_SET_FRAMETYPE; + +    s_frame_type_ip.e_frame_type = e_frame_type; + +    s_frame_type_ip.u4_timestamp_high = -1; +    s_frame_type_ip.u4_timestamp_low = -1; + +    s_frame_type_ip.u4_size = sizeof(ive_ctl_set_frame_type_ip_t); +    s_frame_type_op.u4_size = sizeof(ive_ctl_set_frame_type_op_t); + +    status = ive_api_function(mCodecCtx, &s_frame_type_ip, &s_frame_type_op); +    if (status != IV_SUCCESS) { +        ALOGE("Unable to set frame type = 0x%x\n", +                s_frame_type_op.u4_error_code); +        return OMX_ErrorUndefined; +    } +    return OMX_ErrorNone; +} + +OMX_ERRORTYPE SoftAVC::setQp() { +    ive_ctl_set_qp_ip_t s_qp_ip; +    ive_ctl_set_qp_op_t s_qp_op; +    IV_STATUS_T status; + +    s_qp_ip.e_cmd = IVE_CMD_VIDEO_CTL; +    s_qp_ip.e_sub_cmd = IVE_CMD_CTL_SET_QP; + +    s_qp_ip.u4_i_qp = DEFAULT_I_QP; +    s_qp_ip.u4_i_qp_max = DEFAULT_QP_MAX; +    s_qp_ip.u4_i_qp_min = DEFAULT_QP_MIN; + +    s_qp_ip.u4_p_qp = DEFAULT_P_QP; +    s_qp_ip.u4_p_qp_max = DEFAULT_QP_MAX; +    s_qp_ip.u4_p_qp_min = DEFAULT_QP_MIN; + +    s_qp_ip.u4_b_qp = DEFAULT_P_QP; +    s_qp_ip.u4_b_qp_max = DEFAULT_QP_MAX; +    s_qp_ip.u4_b_qp_min = DEFAULT_QP_MIN; + +    s_qp_ip.u4_timestamp_high = -1; +    s_qp_ip.u4_timestamp_low = -1; + +    s_qp_ip.u4_size = sizeof(ive_ctl_set_qp_ip_t); +    s_qp_op.u4_size = sizeof(ive_ctl_set_qp_op_t); + +    status = ive_api_function(mCodecCtx, &s_qp_ip, &s_qp_op); +    if (status != IV_SUCCESS) { +        ALOGE("Unable to set qp 0x%x\n", s_qp_op.u4_error_code); +        return OMX_ErrorUndefined; +    } +    return OMX_ErrorNone; +} + +OMX_ERRORTYPE SoftAVC::setEncMode(IVE_ENC_MODE_T e_enc_mode) { +    IV_STATUS_T status; +    ive_ctl_set_enc_mode_ip_t s_enc_mode_ip; +    ive_ctl_set_enc_mode_op_t s_enc_mode_op; + +    s_enc_mode_ip.e_cmd = IVE_CMD_VIDEO_CTL; +    s_enc_mode_ip.e_sub_cmd = IVE_CMD_CTL_SET_ENC_MODE; + +    s_enc_mode_ip.e_enc_mode = e_enc_mode; + +    s_enc_mode_ip.u4_timestamp_high = -1; +    s_enc_mode_ip.u4_timestamp_low = -1; + +    s_enc_mode_ip.u4_size = sizeof(ive_ctl_set_enc_mode_ip_t); +    s_enc_mode_op.u4_size = sizeof(ive_ctl_set_enc_mode_op_t); + +    status = ive_api_function(mCodecCtx, &s_enc_mode_ip, &s_enc_mode_op); +    if (status != IV_SUCCESS) { +        ALOGE("Unable to set in header encode mode = 0x%x\n", +                s_enc_mode_op.u4_error_code); +        return OMX_ErrorUndefined; +    } +    return OMX_ErrorNone; +} + +OMX_ERRORTYPE SoftAVC::setVbvParams() { +    ive_ctl_set_vbv_params_ip_t s_vbv_ip; +    ive_ctl_set_vbv_params_op_t s_vbv_op; +    IV_STATUS_T status; + +    s_vbv_ip.e_cmd = IVE_CMD_VIDEO_CTL; +    s_vbv_ip.e_sub_cmd = IVE_CMD_CTL_SET_VBV_PARAMS; + +    s_vbv_ip.u4_vbv_buf_size = 0; +    s_vbv_ip.u4_vbv_buffer_delay = 1000; + +    s_vbv_ip.u4_timestamp_high = -1; +    s_vbv_ip.u4_timestamp_low = -1; + +    s_vbv_ip.u4_size = sizeof(ive_ctl_set_vbv_params_ip_t); +    s_vbv_op.u4_size = sizeof(ive_ctl_set_vbv_params_op_t); + +    status = ive_api_function(mCodecCtx, &s_vbv_ip, &s_vbv_op); +    if (status != IV_SUCCESS) { +        ALOGE("Unable to set VBC params = 0x%x\n", s_vbv_op.u4_error_code); +        return OMX_ErrorUndefined; +    } +    return OMX_ErrorNone; +} + +OMX_ERRORTYPE SoftAVC::setAirParams() { +    ive_ctl_set_air_params_ip_t s_air_ip; +    ive_ctl_set_air_params_op_t s_air_op; +    IV_STATUS_T status; + +    s_air_ip.e_cmd = IVE_CMD_VIDEO_CTL; +    s_air_ip.e_sub_cmd = IVE_CMD_CTL_SET_AIR_PARAMS; + +    s_air_ip.e_air_mode = mAIRMode; +    s_air_ip.u4_air_refresh_period = mAIRRefreshPeriod; + +    s_air_ip.u4_timestamp_high = -1; +    s_air_ip.u4_timestamp_low = -1; + +    s_air_ip.u4_size = sizeof(ive_ctl_set_air_params_ip_t); +    s_air_op.u4_size = sizeof(ive_ctl_set_air_params_op_t); + +    status = ive_api_function(mCodecCtx, &s_air_ip, &s_air_op); +    if (status != IV_SUCCESS) { +        ALOGE("Unable to set air params = 0x%x\n", s_air_op.u4_error_code); +        return OMX_ErrorUndefined; +    } +    return OMX_ErrorNone; +} + +OMX_ERRORTYPE SoftAVC::setMeParams() { +    IV_STATUS_T status; +    ive_ctl_set_me_params_ip_t s_me_params_ip; +    ive_ctl_set_me_params_op_t s_me_params_op; + +    s_me_params_ip.e_cmd = IVE_CMD_VIDEO_CTL; +    s_me_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_ME_PARAMS; + +    s_me_params_ip.u4_enable_fast_sad = mEnableFastSad; +    s_me_params_ip.u4_enable_alt_ref = mEnableAltRef; + +    s_me_params_ip.u4_enable_hpel = mHalfPelEnable; +    s_me_params_ip.u4_enable_qpel = DEFAULT_QPEL; +    s_me_params_ip.u4_me_speed_preset = DEFAULT_ME_SPEED; +    s_me_params_ip.u4_srch_rng_x = DEFAULT_SRCH_RNG_X; +    s_me_params_ip.u4_srch_rng_y = DEFAULT_SRCH_RNG_Y; + +    s_me_params_ip.u4_timestamp_high = -1; +    s_me_params_ip.u4_timestamp_low = -1; + +    s_me_params_ip.u4_size = sizeof(ive_ctl_set_me_params_ip_t); +    s_me_params_op.u4_size = sizeof(ive_ctl_set_me_params_op_t); + +    status = ive_api_function(mCodecCtx, &s_me_params_ip, &s_me_params_op); +    if (status != IV_SUCCESS) { +        ALOGE("Unable to set me params = 0x%x\n", s_me_params_op.u4_error_code); +        return OMX_ErrorUndefined; +    } +    return OMX_ErrorNone; +} + +OMX_ERRORTYPE SoftAVC::setGopParams() { +    IV_STATUS_T status; +    ive_ctl_set_gop_params_ip_t s_gop_params_ip; +    ive_ctl_set_gop_params_op_t s_gop_params_op; + +    s_gop_params_ip.e_cmd = IVE_CMD_VIDEO_CTL; +    s_gop_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_GOP_PARAMS; + +    s_gop_params_ip.u4_i_frm_interval = mIInterval; +    s_gop_params_ip.u4_idr_frm_interval = mIDRInterval; +    s_gop_params_ip.u4_num_b_frames = DEFAULT_B_FRAMES; + +    s_gop_params_ip.u4_timestamp_high = -1; +    s_gop_params_ip.u4_timestamp_low = -1; + +    s_gop_params_ip.u4_size = sizeof(ive_ctl_set_gop_params_ip_t); +    s_gop_params_op.u4_size = sizeof(ive_ctl_set_gop_params_op_t); + +    status = ive_api_function(mCodecCtx, &s_gop_params_ip, &s_gop_params_op); +    if (status != IV_SUCCESS) { +        ALOGE("Unable to set ME params = 0x%x\n", +                s_gop_params_op.u4_error_code); +        return OMX_ErrorUndefined; +    } +    return OMX_ErrorNone; +} + +OMX_ERRORTYPE SoftAVC::setProfileParams() { +    IV_STATUS_T status; +    ive_ctl_set_profile_params_ip_t s_profile_params_ip; +    ive_ctl_set_profile_params_op_t s_profile_params_op; + +    s_profile_params_ip.e_cmd = IVE_CMD_VIDEO_CTL; +    s_profile_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_PROFILE_PARAMS; + +    s_profile_params_ip.e_profile = DEFAULT_EPROFILE; + +    s_profile_params_ip.u4_timestamp_high = -1; +    s_profile_params_ip.u4_timestamp_low = -1; + +    s_profile_params_ip.u4_size = sizeof(ive_ctl_set_profile_params_ip_t); +    s_profile_params_op.u4_size = sizeof(ive_ctl_set_profile_params_op_t); + +    status = ive_api_function(mCodecCtx, &s_profile_params_ip, &s_profile_params_op); +    if (status != IV_SUCCESS) { +        ALOGE("Unable to set profile params = 0x%x\n", +                s_profile_params_op.u4_error_code); +        return OMX_ErrorUndefined; +    } +    return OMX_ErrorNone; +} + +OMX_ERRORTYPE SoftAVC::setDeblockParams() { +    IV_STATUS_T status; +    ive_ctl_set_deblock_params_ip_t s_deblock_params_ip; +    ive_ctl_set_deblock_params_op_t s_deblock_params_op; + +    s_deblock_params_ip.e_cmd = IVE_CMD_VIDEO_CTL; +    s_deblock_params_ip.e_sub_cmd = IVE_CMD_CTL_SET_DEBLOCK_PARAMS; + +    s_deblock_params_ip.u4_disable_deblock_level = mDisableDeblkLevel; + +    s_deblock_params_ip.u4_timestamp_high = -1; +    s_deblock_params_ip.u4_timestamp_low = -1; + +    s_deblock_params_ip.u4_size = sizeof(ive_ctl_set_deblock_params_ip_t); +    s_deblock_params_op.u4_size = sizeof(ive_ctl_set_deblock_params_op_t); + +    status = ive_api_function(mCodecCtx, &s_deblock_params_ip, &s_deblock_params_op); +    if (status != IV_SUCCESS) { +        ALOGE("Unable to enable/disable deblock params = 0x%x\n", +                s_deblock_params_op.u4_error_code); +        return OMX_ErrorUndefined; +    } +    return OMX_ErrorNone; +} + +void SoftAVC::logVersion() { +    ive_ctl_getversioninfo_ip_t s_ctl_ip; +    ive_ctl_getversioninfo_op_t s_ctl_op; +    UWORD8 au1_buf[512]; +    IV_STATUS_T status; + +    s_ctl_ip.e_cmd = IVE_CMD_VIDEO_CTL; +    s_ctl_ip.e_sub_cmd = IVE_CMD_CTL_GETVERSION; +    s_ctl_ip.u4_size = sizeof(ive_ctl_getversioninfo_ip_t); +    s_ctl_op.u4_size = sizeof(ive_ctl_getversioninfo_op_t); +    s_ctl_ip.pu1_version = au1_buf; +    s_ctl_ip.u4_version_bufsize = sizeof(au1_buf); + +    status = ive_api_function(mCodecCtx, (void *) &s_ctl_ip, (void *) &s_ctl_op); + +    if (status != IV_SUCCESS) { +        ALOGE("Error in getting version: 0x%x", s_ctl_op.u4_error_code); +    } else { +        ALOGV("Ittiam encoder version: %s", (char *)s_ctl_ip.pu1_version); +    } +    return; +} + +OMX_ERRORTYPE SoftAVC::initEncoder() { +    IV_STATUS_T status; +    size_t i; +    WORD32 level; +    uint32_t displaySizeY; +    CHECK(!mStarted); + +    OMX_ERRORTYPE errType = OMX_ErrorNone; + +    displaySizeY = mWidth * mHeight; +    if (displaySizeY > (1920 * 1088)) { +        level = 50; +    } else if (displaySizeY > (1280 * 720)) { +        level = 40; +    } else if (displaySizeY > (720 * 576)) { +        level = 31; +    } else if (displaySizeY > (624 * 320)) { +        level = 30; +    } else if (displaySizeY > (352 * 288)) { +        level = 21; +    } else { +        level = 20; +    } +    mAVCEncLevel = MAX(level, mAVCEncLevel); + +    if (OMX_ErrorNone != (errType = initEncParams())) { +        ALOGE("Failed to initialize encoder params"); +        mSignalledError = true; +        notify(OMX_EventError, OMX_ErrorUndefined, 0, 0); +        return errType; +    } + +    mStride = ALIGN16(mWidth); + +    if (mInputDataIsMeta) { +        if (mConversionBuffer) { +            free(mConversionBuffer); +            mConversionBuffer = NULL; +        } + +        if (mConversionBuffer == NULL) { +            mConversionBuffer = (uint8_t *)malloc(mStride * mHeight * 3 / 2); +            if (mConversionBuffer == NULL) { +                ALOGE("Allocating conversion buffer failed."); +                return OMX_ErrorUndefined; +            } +        } +    } + +    switch (mColorFormat) { +        case OMX_COLOR_FormatYUV420SemiPlanar: +            mIvVideoColorFormat = IV_YUV_420SP_UV; +            ALOGV("colorFormat YUV_420SP"); +            break; +        default: +        case OMX_COLOR_FormatYUV420Planar: +            mIvVideoColorFormat = IV_YUV_420P; +            ALOGV("colorFormat YUV_420P"); +            break; +    } + +    ALOGV("Params width %d height %d level %d colorFormat %d", mWidth, +            mHeight, mAVCEncLevel, mIvVideoColorFormat); + +    /* Getting Number of MemRecords */ +    { +        iv_num_mem_rec_ip_t s_num_mem_rec_ip; +        iv_num_mem_rec_op_t s_num_mem_rec_op; + +        s_num_mem_rec_ip.u4_size = sizeof(iv_num_mem_rec_ip_t); +        s_num_mem_rec_op.u4_size = sizeof(iv_num_mem_rec_op_t); + +        s_num_mem_rec_ip.e_cmd = IV_CMD_GET_NUM_MEM_REC; + +        status = ive_api_function(0, &s_num_mem_rec_ip, &s_num_mem_rec_op); + +        if (status != IV_SUCCESS) { +            ALOGE("Get number of memory records failed = 0x%x\n", +                    s_num_mem_rec_op.u4_error_code); +            return OMX_ErrorUndefined; +        } + +        mNumMemRecords = s_num_mem_rec_op.u4_num_mem_rec; +    } + +    /* Allocate array to hold memory records */ +    mMemRecords = (iv_mem_rec_t *)malloc(mNumMemRecords * sizeof(iv_mem_rec_t)); +    if (NULL == mMemRecords) { +        ALOGE("Unable to allocate memory for hold memory records: Size %d", +                mNumMemRecords * sizeof(iv_mem_rec_t)); +        mSignalledError = true; +        notify(OMX_EventError, OMX_ErrorUndefined, 0, 0); +        return OMX_ErrorUndefined; +    } + +    { +        iv_mem_rec_t *ps_mem_rec; +        ps_mem_rec = mMemRecords; +        for (i = 0; i < mNumMemRecords; i++) { +            ps_mem_rec->u4_size = sizeof(iv_mem_rec_t); +            ps_mem_rec->pv_base = NULL; +            ps_mem_rec->u4_mem_size = 0; +            ps_mem_rec->u4_mem_alignment = 0; +            ps_mem_rec->e_mem_type = IV_NA_MEM_TYPE; + +            ps_mem_rec++; +        } +    } + +    /* Getting MemRecords Attributes */ +    { +        iv_fill_mem_rec_ip_t s_fill_mem_rec_ip; +        iv_fill_mem_rec_op_t s_fill_mem_rec_op; + +        s_fill_mem_rec_ip.u4_size = sizeof(iv_fill_mem_rec_ip_t); +        s_fill_mem_rec_op.u4_size = sizeof(iv_fill_mem_rec_op_t); + +        s_fill_mem_rec_ip.e_cmd = IV_CMD_FILL_NUM_MEM_REC; +        s_fill_mem_rec_ip.ps_mem_rec = mMemRecords; +        s_fill_mem_rec_ip.u4_num_mem_rec = mNumMemRecords; +        s_fill_mem_rec_ip.u4_max_wd = mWidth; +        s_fill_mem_rec_ip.u4_max_ht = mHeight; +        s_fill_mem_rec_ip.u4_max_level = mAVCEncLevel; +        s_fill_mem_rec_ip.e_color_format = DEFAULT_INP_COLOR_FORMAT; +        s_fill_mem_rec_ip.u4_max_ref_cnt = DEFAULT_MAX_REF_FRM; +        s_fill_mem_rec_ip.u4_max_reorder_cnt = DEFAULT_MAX_REORDER_FRM; +        s_fill_mem_rec_ip.u4_max_srch_rng_x = DEFAULT_MAX_SRCH_RANGE_X; +        s_fill_mem_rec_ip.u4_max_srch_rng_y = DEFAULT_MAX_SRCH_RANGE_Y; + +        status = ive_api_function(0, &s_fill_mem_rec_ip, &s_fill_mem_rec_op); + +        if (status != IV_SUCCESS) { +            ALOGE("Fill memory records failed = 0x%x\n", +                    s_fill_mem_rec_op.u4_error_code); +            mSignalledError = true; +            notify(OMX_EventError, OMX_ErrorUndefined, 0, 0); +            return OMX_ErrorUndefined; +        } +    } + +    /* Allocating Memory for Mem Records */ +    { +        WORD32 total_size; +        iv_mem_rec_t *ps_mem_rec; +        total_size = 0; + +        ps_mem_rec = mMemRecords; +        for (i = 0; i < mNumMemRecords; i++) { +            ps_mem_rec->pv_base = ive_aligned_malloc( +                    ps_mem_rec->u4_mem_alignment, ps_mem_rec->u4_mem_size); +            if (ps_mem_rec->pv_base == NULL) { +                ALOGE("Allocation failure for mem record id %d size %d\n", i, +                        ps_mem_rec->u4_mem_size); +                mSignalledError = true; +                notify(OMX_EventError, OMX_ErrorUndefined, 0, 0); +                return OMX_ErrorUndefined; + +            } +            total_size += ps_mem_rec->u4_mem_size; + +            ps_mem_rec++; +        } +        printf("\nTotal memory for codec %d\n", total_size); +    } + +    /* Codec Instance Creation */ +    { +        ive_init_ip_t s_init_ip; +        ive_init_op_t s_init_op; + +        mCodecCtx = (iv_obj_t *)mMemRecords[0].pv_base; +        mCodecCtx->u4_size = sizeof(iv_obj_t); +        mCodecCtx->pv_fxns = (void *)ive_api_function; + +        s_init_ip.u4_size = sizeof(ive_init_ip_t); +        s_init_op.u4_size = sizeof(ive_init_op_t); + +        s_init_ip.e_cmd = IV_CMD_INIT; +        s_init_ip.u4_num_mem_rec = mNumMemRecords; +        s_init_ip.ps_mem_rec = mMemRecords; +        s_init_ip.u4_max_wd = mWidth; +        s_init_ip.u4_max_ht = mHeight; +        s_init_ip.u4_max_ref_cnt = DEFAULT_MAX_REF_FRM; +        s_init_ip.u4_max_reorder_cnt = DEFAULT_MAX_REORDER_FRM; +        s_init_ip.u4_max_level = mAVCEncLevel; +        s_init_ip.e_inp_color_fmt = mIvVideoColorFormat; + +        if (mReconEnable || mPSNREnable) { +            s_init_ip.u4_enable_recon = 1; +        } else { +            s_init_ip.u4_enable_recon = 0; +        } +        s_init_ip.e_recon_color_fmt = DEFAULT_RECON_COLOR_FORMAT; +        s_init_ip.e_rc_mode = DEFAULT_RC_MODE; +        s_init_ip.u4_max_framerate = DEFAULT_MAX_FRAMERATE; +        s_init_ip.u4_max_bitrate = DEFAULT_MAX_BITRATE; +        s_init_ip.u4_max_num_bframes = DEFAULT_B_FRAMES; +        s_init_ip.e_content_type = IV_PROGRESSIVE; +        s_init_ip.u4_max_srch_rng_x = DEFAULT_MAX_SRCH_RANGE_X; +        s_init_ip.u4_max_srch_rng_y = DEFAULT_MAX_SRCH_RANGE_Y; +        s_init_ip.e_slice_mode = mSliceMode; +        s_init_ip.u4_slice_param = mSliceParam; +        s_init_ip.e_arch = mArch; +        s_init_ip.e_soc = DEFAULT_SOC; + +        status = ive_api_function(mCodecCtx, &s_init_ip, &s_init_op); + +        if (status != IV_SUCCESS) { +            ALOGE("Init memory records failed = 0x%x\n", +                    s_init_op.u4_error_code); +            mSignalledError = true; +            notify(OMX_EventError, OMX_ErrorUndefined, 0 /* arg2 */, NULL /* data */); +            return OMX_ErrorUndefined; +        } +    } + +    /* Get Codec Version */ +    logVersion(); + +    /* set processor details */ +    setNumCores(); + +    /* Video control Set Frame dimensions */ +    setDimensions(); + +    /* Video control Set Frame rates */ +    setFrameRate(); + +    /* Video control Set IPE Params */ +    setIpeParams(); + +    /* Video control Set Bitrate */ +    setBitRate(); + +    /* Video control Set QP */ +    setQp(); + +    /* Video control Set AIR params */ +    setAirParams(); + +    /* Video control Set VBV params */ +    setVbvParams(); + +    /* Video control Set Motion estimation params */ +    setMeParams(); + +    /* Video control Set GOP params */ +    setGopParams(); + +    /* Video control Set Deblock params */ +    setDeblockParams(); + +    /* Video control Set Profile params */ +    setProfileParams(); + +    /* Video control Set in Encode header mode */ +    setEncMode(IVE_ENC_MODE_HEADER); + +    ALOGV("init_codec successfull"); + +    mSpsPpsHeaderReceived = false; +    mStarted = true; + +    return OMX_ErrorNone; +} + +OMX_ERRORTYPE SoftAVC::releaseEncoder() { +    IV_STATUS_T status = IV_SUCCESS; +    iv_retrieve_mem_rec_ip_t s_retrieve_mem_ip; +    iv_retrieve_mem_rec_op_t s_retrieve_mem_op; +    iv_mem_rec_t *ps_mem_rec; +    UWORD32 i; + +    if (!mStarted) { +        return OMX_ErrorNone; +    } + +    s_retrieve_mem_ip.u4_size = sizeof(iv_retrieve_mem_rec_ip_t); +    s_retrieve_mem_op.u4_size = sizeof(iv_retrieve_mem_rec_op_t); +    s_retrieve_mem_ip.e_cmd = IV_CMD_RETRIEVE_MEMREC; +    s_retrieve_mem_ip.ps_mem_rec = mMemRecords; + +    status = ive_api_function(mCodecCtx, &s_retrieve_mem_ip, &s_retrieve_mem_op); + +    if (status != IV_SUCCESS) { +        ALOGE("Unable to retrieve memory records = 0x%x\n", +                s_retrieve_mem_op.u4_error_code); +        return OMX_ErrorUndefined; +    } + +    /* Free memory records */ +    ps_mem_rec = mMemRecords; +    for (i = 0; i < s_retrieve_mem_op.u4_num_mem_rec_filled; i++) { +        ive_aligned_free(ps_mem_rec->pv_base); +        ps_mem_rec++; +    } + +    free(mMemRecords); + +    if (mConversionBuffer != NULL) { +        free(mConversionBuffer); +        mConversionBuffer = NULL; +    } + +    mStarted = false; + +    return OMX_ErrorNone; +} + +OMX_ERRORTYPE SoftAVC::internalGetParameter(OMX_INDEXTYPE index, OMX_PTR params) { +    switch (index) { +        case OMX_IndexParamVideoBitrate: +        { +            OMX_VIDEO_PARAM_BITRATETYPE *bitRate = +                (OMX_VIDEO_PARAM_BITRATETYPE *)params; + +            if (bitRate->nPortIndex != 1) { +                return OMX_ErrorUndefined; +            } + +            bitRate->eControlRate = OMX_Video_ControlRateVariable; +            bitRate->nTargetBitrate = mBitrate; +            return OMX_ErrorNone; +        } + +        case OMX_IndexParamVideoAvc: +        { +            OMX_VIDEO_PARAM_AVCTYPE *avcParams = (OMX_VIDEO_PARAM_AVCTYPE *)params; + +            if (avcParams->nPortIndex != 1) { +                return OMX_ErrorUndefined; +            } + +            avcParams->eProfile = OMX_VIDEO_AVCProfileBaseline; +            OMX_VIDEO_AVCLEVELTYPE omxLevel = OMX_VIDEO_AVCLevel31; +            if (OMX_ErrorNone +                    != ConvertAvcSpecLevelToOmxAvcLevel(mAVCEncLevel, &omxLevel)) { +                return OMX_ErrorUndefined; +            } + +            avcParams->eLevel = omxLevel; +            avcParams->nRefFrames = 1; +            avcParams->nBFrames = 0; +            avcParams->bUseHadamard = OMX_TRUE; +            avcParams->nAllowedPictureTypes = (OMX_VIDEO_PictureTypeI +                    | OMX_VIDEO_PictureTypeP); +            avcParams->nRefIdx10ActiveMinus1 = 0; +            avcParams->nRefIdx11ActiveMinus1 = 0; +            avcParams->bWeightedPPrediction = OMX_FALSE; +            avcParams->bEntropyCodingCABAC = OMX_FALSE; +            avcParams->bconstIpred = OMX_FALSE; +            avcParams->bDirect8x8Inference = OMX_FALSE; +            avcParams->bDirectSpatialTemporal = OMX_FALSE; +            avcParams->nCabacInitIdc = 0; +            return OMX_ErrorNone; +        } + +        default: +            return SoftVideoEncoderOMXComponent::internalGetParameter(index, params); +    } +} + +OMX_ERRORTYPE SoftAVC::internalSetParameter(OMX_INDEXTYPE index, const OMX_PTR params) { +    int32_t indexFull = index; + +    switch (indexFull) { +        case OMX_IndexParamVideoBitrate: +        { +            return internalSetBitrateParams( +                    (const OMX_VIDEO_PARAM_BITRATETYPE *)params); +        } + +        case OMX_IndexParamVideoAvc: +        { +            OMX_VIDEO_PARAM_AVCTYPE *avcType = (OMX_VIDEO_PARAM_AVCTYPE *)params; + +            if (avcType->nPortIndex != 1) { +                return OMX_ErrorUndefined; +            } + +            if (avcType->eProfile != OMX_VIDEO_AVCProfileBaseline +                    || avcType->nRefFrames != 1 || avcType->nBFrames != 0 +                    || avcType->bUseHadamard != OMX_TRUE +                    || (avcType->nAllowedPictureTypes & OMX_VIDEO_PictureTypeB) != 0 +                    || avcType->nRefIdx10ActiveMinus1 != 0 +                    || avcType->nRefIdx11ActiveMinus1 != 0 +                    || avcType->bWeightedPPrediction != OMX_FALSE +                    || avcType->bEntropyCodingCABAC != OMX_FALSE +                    || avcType->bconstIpred != OMX_FALSE +                    || avcType->bDirect8x8Inference != OMX_FALSE +                    || avcType->bDirectSpatialTemporal != OMX_FALSE +                    || avcType->nCabacInitIdc != 0) { +                return OMX_ErrorUndefined; +            } + +            if (OK != ConvertOmxAvcLevelToAvcSpecLevel(avcType->eLevel, &mAVCEncLevel)) { +                return OMX_ErrorUndefined; +            } + +            return OMX_ErrorNone; +        } + +        default: +            return SoftVideoEncoderOMXComponent::internalSetParameter(index, params); +    } +} + +OMX_ERRORTYPE SoftAVC::setConfig( +        OMX_INDEXTYPE index, const OMX_PTR _params) { +    switch (index) { +        case OMX_IndexConfigVideoIntraVOPRefresh: +        { +            OMX_CONFIG_INTRAREFRESHVOPTYPE *params = +                (OMX_CONFIG_INTRAREFRESHVOPTYPE *)_params; + +            if (params->nPortIndex != kOutputPortIndex) { +                return OMX_ErrorBadPortIndex; +            } + +            mKeyFrameRequested = params->IntraRefreshVOP; +            return OMX_ErrorNone; +        } + +        case OMX_IndexConfigVideoBitrate: +        { +            OMX_VIDEO_CONFIG_BITRATETYPE *params = +                (OMX_VIDEO_CONFIG_BITRATETYPE *)_params; + +            if (params->nPortIndex != kOutputPortIndex) { +                return OMX_ErrorBadPortIndex; +            } + +            if (mBitrate != params->nEncodeBitrate) { +                mBitrate = params->nEncodeBitrate; +                mBitrateUpdated = true; +            } +            return OMX_ErrorNone; +        } + +        default: +            return SimpleSoftOMXComponent::setConfig(index, _params); +    } +} + +OMX_ERRORTYPE SoftAVC::internalSetBitrateParams( +        const OMX_VIDEO_PARAM_BITRATETYPE *bitrate) { +    if (bitrate->nPortIndex != kOutputPortIndex) { +        return OMX_ErrorUnsupportedIndex; +    } + +    mBitrate = bitrate->nTargetBitrate; +    mBitrateUpdated = true; + +    return OMX_ErrorNone; +} + +OMX_ERRORTYPE SoftAVC::setEncodeArgs( +        ive_video_encode_ip_t *ps_encode_ip, +        ive_video_encode_op_t *ps_encode_op, +        OMX_BUFFERHEADERTYPE *inputBufferHeader, +        OMX_BUFFERHEADERTYPE *outputBufferHeader) { +    iv_raw_buf_t *ps_inp_raw_buf; +    const uint8_t *source; +    UWORD8 *pu1_buf; + +    ps_inp_raw_buf = &ps_encode_ip->s_inp_buf; +    ps_encode_ip->s_out_buf.pv_buf = outputBufferHeader->pBuffer; +    ps_encode_ip->s_out_buf.u4_bytes = 0; +    ps_encode_ip->s_out_buf.u4_bufsize = outputBufferHeader->nAllocLen; +    ps_encode_ip->u4_size = sizeof(ive_video_encode_ip_t); +    ps_encode_op->u4_size = sizeof(ive_video_encode_op_t); + +    ps_encode_ip->e_cmd = IVE_CMD_VIDEO_ENCODE; +    ps_encode_ip->pv_bufs = NULL; +    ps_encode_ip->pv_mb_info = NULL; +    ps_encode_ip->pv_pic_info = NULL; +    ps_encode_ip->u4_mb_info_type = 0; +    ps_encode_ip->u4_pic_info_type = 0; +    ps_encode_op->s_out_buf.pv_buf = NULL; + +    /* Initialize color formats */ +    ps_inp_raw_buf->e_color_fmt = mIvVideoColorFormat; + +    source = NULL; +    if (inputBufferHeader) { +        source = inputBufferHeader->pBuffer + inputBufferHeader->nOffset; + +        if (mInputDataIsMeta) { +            source = extractGraphicBuffer( +                    mConversionBuffer, (mWidth * mHeight * 3 / 2), source, +                    inputBufferHeader->nFilledLen, mWidth, mHeight); + +            if (source == NULL) { +                ALOGE("Error in extractGraphicBuffer"); +                notify(OMX_EventError, OMX_ErrorUndefined, 0, 0); +                return OMX_ErrorUndefined; +            } +        } +    } + +    pu1_buf = (UWORD8 *)source; +    switch (mIvVideoColorFormat) { +        case IV_YUV_420P: +        { +            ps_inp_raw_buf->apv_bufs[0] = pu1_buf; +            pu1_buf += (mStride) * mHeight; +            ps_inp_raw_buf->apv_bufs[1] = pu1_buf; +            pu1_buf += (mStride / 2) * mHeight / 2; +            ps_inp_raw_buf->apv_bufs[2] = pu1_buf; + +            ps_inp_raw_buf->au4_wd[0] = mWidth; +            ps_inp_raw_buf->au4_wd[1] = mWidth / 2; +            ps_inp_raw_buf->au4_wd[2] = mWidth / 2; + +            ps_inp_raw_buf->au4_ht[0] = mHeight; +            ps_inp_raw_buf->au4_ht[1] = mHeight / 2; +            ps_inp_raw_buf->au4_ht[2] = mHeight / 2; + +            ps_inp_raw_buf->au4_strd[0] = mStride; +            ps_inp_raw_buf->au4_strd[1] = (mStride / 2); +            ps_inp_raw_buf->au4_strd[2] = (mStride / 2); +            break; +        } + +        case IV_YUV_422ILE: +        { +            ps_inp_raw_buf->apv_bufs[0] = pu1_buf; +            ps_inp_raw_buf->au4_wd[0] = mWidth * 2; +            ps_inp_raw_buf->au4_ht[0] = mHeight; +            ps_inp_raw_buf->au4_strd[0] = mStride * 2; +            break; +        } + +        case IV_YUV_420SP_UV: +        case IV_YUV_420SP_VU: +        default: +        { +            ps_inp_raw_buf->apv_bufs[0] = pu1_buf; +            pu1_buf += (mStride) * mHeight; +            ps_inp_raw_buf->apv_bufs[1] = pu1_buf; + +            ps_inp_raw_buf->au4_wd[0] = mWidth; +            ps_inp_raw_buf->au4_wd[1] = mWidth; + +            ps_inp_raw_buf->au4_ht[0] = mHeight; +            ps_inp_raw_buf->au4_ht[1] = mHeight / 2; + +            ps_inp_raw_buf->au4_strd[0] = mStride; +            ps_inp_raw_buf->au4_strd[1] = mStride; +            break; +        } +    } + +    ps_encode_ip->u4_is_last = 0; + +    if (inputBufferHeader) { +        ps_encode_ip->u4_timestamp_high = (inputBufferHeader->nTimeStamp) >> 32; +        ps_encode_ip->u4_timestamp_low = (inputBufferHeader->nTimeStamp) & 0xFFFFFFFF; +    } + +    return OMX_ErrorNone; +} + +void SoftAVC::onQueueFilled(OMX_U32 portIndex) { +    IV_STATUS_T status; +    WORD32 timeDelay, timeTaken; + +    UNUSED(portIndex); + +    // Initialize encoder if not already initialized +    if (mCodecCtx == NULL) { +        if (OMX_ErrorNone != initEncoder()) { +            ALOGE("Failed to initialize encoder"); +            notify(OMX_EventError, OMX_ErrorUndefined, 0 /* arg2 */, NULL /* data */); +            return; +        } +    } +    if (mSignalledError || mSawInputEOS) { +        return; +    } + +    List<BufferInfo *> &inQueue = getPortQueue(0); +    List<BufferInfo *> &outQueue = getPortQueue(1); + +    while (!mSawInputEOS && !inQueue.empty() && !outQueue.empty()) { +        OMX_ERRORTYPE error; +        ive_video_encode_ip_t s_encode_ip; +        ive_video_encode_op_t s_encode_op; + +        BufferInfo *inputBufferInfo = *inQueue.begin(); +        OMX_BUFFERHEADERTYPE *inputBufferHeader = inputBufferInfo->mHeader; + +        BufferInfo *outputBufferInfo = *outQueue.begin(); +        OMX_BUFFERHEADERTYPE *outputBufferHeader = outputBufferInfo->mHeader; + +        if (inputBufferHeader->nFlags & OMX_BUFFERFLAG_EOS) { +            inQueue.erase(inQueue.begin()); +            inputBufferInfo->mOwnedByUs = false; +            notifyEmptyBufferDone(inputBufferHeader); + +            outputBufferHeader->nFilledLen = 0; +            outputBufferHeader->nFlags = OMX_BUFFERFLAG_EOS; + +            outQueue.erase(outQueue.begin()); +            outputBufferInfo->mOwnedByUs = false; +            notifyFillBufferDone(outputBufferHeader); +            return; +        } + +        outputBufferHeader->nTimeStamp = 0; +        outputBufferHeader->nFlags = 0; +        outputBufferHeader->nOffset = 0; +        outputBufferHeader->nFilledLen = 0; +        outputBufferHeader->nOffset = 0; + +        uint8_t *outPtr = (uint8_t *)outputBufferHeader->pBuffer; + +        if (!mSpsPpsHeaderReceived) { +            error = setEncodeArgs(&s_encode_ip, &s_encode_op, NULL, outputBufferHeader); +            if (error != OMX_ErrorNone) { +                mSignalledError = true; +                notify(OMX_EventError, OMX_ErrorUndefined, 0, 0); +                return; +            } +            status = ive_api_function(mCodecCtx, &s_encode_ip, &s_encode_op); + +            if (IV_SUCCESS != status) { +                ALOGE("Encode Frame failed = 0x%x\n", +                        s_encode_op.u4_error_code); +            } else { +                ALOGV("Bytes Generated in header %d\n", +                        s_encode_op.s_out_buf.u4_bytes); +            } + +            mSpsPpsHeaderReceived = true; + +            outputBufferHeader->nFlags = OMX_BUFFERFLAG_CODECCONFIG; +            outputBufferHeader->nFilledLen = s_encode_op.s_out_buf.u4_bytes; +            outputBufferHeader->nTimeStamp = inputBufferHeader->nTimeStamp; + +            outQueue.erase(outQueue.begin()); +            outputBufferInfo->mOwnedByUs = false; +            DUMP_TO_FILE( +                    mOutFile, outputBufferHeader->pBuffer, +                    outputBufferHeader->nFilledLen); +            notifyFillBufferDone(outputBufferHeader); + +            setEncMode(IVE_ENC_MODE_PICTURE); +            return; +        } + +        if (mBitrateUpdated) { +            setBitRate(); +        } + +        if (mKeyFrameRequested) { +            setFrameType(IV_IDR_FRAME); +        } + +        mPrevTimestampUs = inputBufferHeader->nTimeStamp; + +        if (inputBufferHeader->nFlags & OMX_BUFFERFLAG_EOS) { +            mSawInputEOS = true; +        } + +        error = setEncodeArgs( +                &s_encode_ip, &s_encode_op, inputBufferHeader, outputBufferHeader); +        if (error != OMX_ErrorNone) { +            mSignalledError = true; +            notify(OMX_EventError, OMX_ErrorUndefined, 0, 0); +            return; +        } + +        DUMP_TO_FILE( +                mInFile, s_encode_ip.s_inp_buf.apv_bufs[0], +                (mHeight * mStride * 3 / 2)); +        //DUMP_TO_FILE(mInFile, inputBufferHeader->pBuffer + inputBufferHeader->nOffset, +        //    inputBufferHeader->nFilledLen); + +        GETTIME(&mTimeStart, NULL); +        /* Compute time elapsed between end of previous decode() +         * to start of current decode() */ +        TIME_DIFF(mTimeEnd, mTimeStart, timeDelay); + +        status = ive_api_function(mCodecCtx, &s_encode_ip, &s_encode_op); + +        if (IV_SUCCESS != status) { +            ALOGE("Encode Frame failed = 0x%x\n", +                    s_encode_op.u4_error_code); +            mSignalledError = true; +            notify(OMX_EventError, OMX_ErrorUndefined, 0, 0); +            return; +        } + +        GETTIME(&mTimeEnd, NULL); +        /* Compute time taken for decode() */ +        TIME_DIFF(mTimeStart, mTimeEnd, timeTaken); + +        ALOGV("timeTaken=%6d delay=%6d numBytes=%6d", timeTaken, timeDelay, +                s_encode_op.s_out_buf.u4_bytes); + + +        outputBufferHeader->nFlags = inputBufferHeader->nFlags; +        outputBufferHeader->nFilledLen = s_encode_op.s_out_buf.u4_bytes; +        outputBufferHeader->nTimeStamp = inputBufferHeader->nTimeStamp; + +        if (IV_IDR_FRAME +                == s_encode_op.u4_encoded_frame_type) { +            outputBufferHeader->nFlags |= OMX_BUFFERFLAG_SYNCFRAME; +        } + +        inQueue.erase(inQueue.begin()); +        inputBufferInfo->mOwnedByUs = false; + +        notifyEmptyBufferDone(inputBufferHeader); + +        if (mSawInputEOS) { +            outputBufferHeader->nFlags |= OMX_BUFFERFLAG_EOS; +        } + +        outputBufferInfo->mOwnedByUs = false; +        outQueue.erase(outQueue.begin()); + +        DUMP_TO_FILE( +                mOutFile, outputBufferHeader->pBuffer, +                outputBufferHeader->nFilledLen); +        notifyFillBufferDone(outputBufferHeader); + +    } +    return; +} + + +}  // namespace android + +android::SoftOMXComponent *createSoftOMXComponent( +        const char *name, const OMX_CALLBACKTYPE *callbacks, +        OMX_PTR appData, OMX_COMPONENTTYPE **component) { +    return new android::SoftAVC(name, callbacks, appData, component); +} diff --git a/media/libstagefright/codecs/avcenc/SoftAVCEnc.h b/media/libstagefright/codecs/avcenc/SoftAVCEnc.h new file mode 100644 index 0000000..c4e26a9 --- /dev/null +++ b/media/libstagefright/codecs/avcenc/SoftAVCEnc.h @@ -0,0 +1,309 @@ +/* + * Copyright 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + *      http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __SOFT_AVC_ENC_H__ +#define __SOFT_AVC_ENC_H__ + +#include <media/stagefright/MediaBuffer.h> +#include <media/stagefright/foundation/ABase.h> +#include <utils/Vector.h> + +#include "SoftVideoEncoderOMXComponent.h" + +namespace android { + +struct MediaBuffer; + +#define CODEC_MAX_CORES          4 +#define LEN_STATUS_BUFFER        (10  * 1024) +#define MAX_VBV_BUFF_SIZE        (120 * 16384) +#define MAX_NUM_IO_BUFS           3 + +#define DEFAULT_MAX_REF_FRM         1 +#define DEFAULT_MAX_REORDER_FRM     0 +#define DEFAULT_QP_MIN              10 +#define DEFAULT_QP_MAX              40 +#define DEFAULT_MAX_BITRATE         20000000 +#define DEFAULT_MAX_SRCH_RANGE_X    256 +#define DEFAULT_MAX_SRCH_RANGE_Y    256 +#define DEFAULT_MAX_FRAMERATE       120000 +#define DEFAULT_NUM_CORES           1 +#define DEFAULT_NUM_CORES_PRE_ENC   0 +#define DEFAULT_FPS                 30 +#define DEFAULT_ENC_SPEED           IVE_NORMAL + +#define DEFAULT_MEM_REC_CNT         0 +#define DEFAULT_RECON_ENABLE        0 +#define DEFAULT_CHKSUM_ENABLE       0 +#define DEFAULT_START_FRM           0 +#define DEFAULT_NUM_FRMS            0xFFFFFFFF +#define DEFAULT_INP_COLOR_FORMAT       IV_YUV_420SP_VU +#define DEFAULT_RECON_COLOR_FORMAT     IV_YUV_420P +#define DEFAULT_LOOPBACK            0 +#define DEFAULT_SRC_FRAME_RATE      30 +#define DEFAULT_TGT_FRAME_RATE      30 +#define DEFAULT_MAX_WD              1920 +#define DEFAULT_MAX_HT              1920 +#define DEFAULT_MAX_LEVEL           40 +#define DEFAULT_STRIDE              0 +#define DEFAULT_WD                  1280 +#define DEFAULT_HT                  720 +#define DEFAULT_PSNR_ENABLE         0 +#define DEFAULT_ME_SPEED            100 +#define DEFAULT_ENABLE_FAST_SAD     0 +#define DEFAULT_ENABLE_ALT_REF      0 +#define DEFAULT_RC_MODE             IVE_RC_STORAGE +#define DEFAULT_BITRATE             6000000 +#define DEFAULT_I_QP                22 +#define DEFAULT_I_QP_MAX            DEFAULT_QP_MAX +#define DEFAULT_I_QP_MIN            DEFAULT_QP_MIN +#define DEFAULT_P_QP                28 +#define DEFAULT_P_QP_MAX            DEFAULT_QP_MAX +#define DEFAULT_P_QP_MIN            DEFAULT_QP_MIN +#define DEFAULT_B_QP                22 +#define DEFAULT_B_QP_MAX            DEFAULT_QP_MAX +#define DEFAULT_B_QP_MIN            DEFAULT_QP_MIN +#define DEFAULT_AIR                 IVE_AIR_MODE_NONE +#define DEFAULT_AIR_REFRESH_PERIOD  30 +#define DEFAULT_SRCH_RNG_X          64 +#define DEFAULT_SRCH_RNG_Y          48 +#define DEFAULT_I_INTERVAL          30 +#define DEFAULT_IDR_INTERVAL        1000 +#define DEFAULT_B_FRAMES            0 +#define DEFAULT_DISABLE_DEBLK_LEVEL 0 +#define DEFAULT_HPEL                1 +#define DEFAULT_QPEL                1 +#define DEFAULT_I4                  1 +#define DEFAULT_EPROFILE            IV_PROFILE_BASE +#define DEFAULT_SLICE_MODE          IVE_SLICE_MODE_NONE +#define DEFAULT_SLICE_PARAM         256 +#define DEFAULT_ARCH                ARCH_ARM_A9Q +#define DEFAULT_SOC                 SOC_GENERIC +#define DEFAULT_INTRA4x4            0 +#define STRLENGTH                   500 + + + +#define MIN(a, b) ((a) < (b))? (a) : (b) +#define MAX(a, b) ((a) > (b))? (a) : (b) +#define ALIGN16(x) ((((x) + 15) >> 4) << 4) +#define ALIGN128(x) ((((x) + 127) >> 7) << 7) +#define ALIGN4096(x) ((((x) + 4095) >> 12) << 12) + +/** Used to remove warnings about unused parameters */ +#define UNUSED(x) ((void)(x)) + +/** Get time */ +#define GETTIME(a, b) gettimeofday(a, b); + +/** Compute difference between start and end */ +#define TIME_DIFF(start, end, diff) \ +    diff = ((end.tv_sec - start.tv_sec) * 1000000) + \ +            (end.tv_usec - start.tv_usec); + +#define ive_aligned_malloc(alignment, size) memalign(alignment, size) +#define ive_aligned_free(buf) free(buf) + +struct SoftAVC : public SoftVideoEncoderOMXComponent { +    SoftAVC( +            const char *name, +            const OMX_CALLBACKTYPE *callbacks, +            OMX_PTR appData, +            OMX_COMPONENTTYPE **component); + +    // Override SimpleSoftOMXComponent methods +    virtual OMX_ERRORTYPE internalGetParameter( +            OMX_INDEXTYPE index, OMX_PTR params); + +    virtual OMX_ERRORTYPE internalSetParameter( +            OMX_INDEXTYPE index, const OMX_PTR params); + +    virtual void onQueueFilled(OMX_U32 portIndex); + +protected: +    virtual ~SoftAVC(); + +private: +    enum { +        kNumBuffers = 2, +    }; + +    // OMX input buffer's timestamp and flags +    typedef struct { +        int64_t mTimeUs; +        int32_t mFlags; +    } InputBufferInfo; + +    int32_t  mStride; + +    uint32_t mFrameRate; + +    struct timeval mTimeStart;   // Time at the start of decode() +    struct timeval mTimeEnd;     // Time at the end of decode() + + +    // If a request for a change it bitrate has been received. +    bool mBitrateUpdated; + +    bool mKeyFrameRequested; + +#ifdef FILE_DUMP_ENABLE +    char mInFile[200]; +    char mOutFile[200]; +#endif /* FILE_DUMP_ENABLE */ + +    IV_COLOR_FORMAT_T mIvVideoColorFormat; + +    int32_t  mIDRFrameRefreshIntervalInSec; +    IV_PROFILE_T mAVCEncProfile; +    WORD32   mAVCEncLevel; +    int64_t  mNumInputFrames; +    int64_t  mPrevTimestampUs; +    bool     mStarted; +    bool     mSpsPpsHeaderReceived; + +    bool     mSawInputEOS; +    bool     mSignalledError; +    bool     mIntra4x4; +    bool     mEnableFastSad; +    bool     mEnableAltRef; +    bool    mReconEnable; +    bool    mPSNREnable; +    IVE_SPEED_CONFIG     mEncSpeed; + +    uint8_t *mConversionBuffer; + +    iv_obj_t *mCodecCtx;         // Codec context +    iv_mem_rec_t *mMemRecords;   // Memory records requested by the codec +    size_t mNumMemRecords;       // Number of memory records requested by codec +    size_t mNumCores;            // Number of cores used by the codec + +    UWORD32 mHeaderGenerated; + +    IV_ARCH_T mArch; +    IVE_SLICE_MODE_T mSliceMode; +    UWORD32 mSliceParam; +    bool mHalfPelEnable; +    UWORD32 mIInterval; +    UWORD32 mIDRInterval; +    UWORD32 mDisableDeblkLevel; +    IVE_AIR_MODE_T mAIRMode; +    UWORD32 mAIRRefreshPeriod; + +    OMX_ERRORTYPE initEncParams(); +    OMX_ERRORTYPE initEncoder(); +    OMX_ERRORTYPE releaseEncoder(); + +    // Verifies the component role tried to be set to this OMX component is +    // strictly video_encoder.avc +    OMX_ERRORTYPE internalSetRoleParams( +        const OMX_PARAM_COMPONENTROLETYPE *role); + +    // Updates bitrate to reflect port settings. +    OMX_ERRORTYPE internalSetBitrateParams( +        const OMX_VIDEO_PARAM_BITRATETYPE *bitrate); + +    OMX_ERRORTYPE setConfig( +        OMX_INDEXTYPE index, const OMX_PTR _params); + +    // Handles port definition changes. +    OMX_ERRORTYPE internalSetPortParams( +        const OMX_PARAM_PORTDEFINITIONTYPE *port); + +    OMX_ERRORTYPE internalSetFormatParams( +        const OMX_VIDEO_PARAM_PORTFORMATTYPE *format); + +    OMX_ERRORTYPE setFrameType(IV_PICTURE_CODING_TYPE_T  e_frame_type); +    OMX_ERRORTYPE setQp(); +    OMX_ERRORTYPE setEncMode(IVE_ENC_MODE_T e_enc_mode); +    OMX_ERRORTYPE setDimensions(); +    OMX_ERRORTYPE setNumCores(); +    OMX_ERRORTYPE setFrameRate(); +    OMX_ERRORTYPE setIpeParams(); +    OMX_ERRORTYPE setBitRate(); +    OMX_ERRORTYPE setAirParams(); +    OMX_ERRORTYPE setMeParams(); +    OMX_ERRORTYPE setGopParams(); +    OMX_ERRORTYPE setProfileParams(); +    OMX_ERRORTYPE setDeblockParams(); +    OMX_ERRORTYPE setVbvParams(); +    void logVersion(); +    OMX_ERRORTYPE setEncodeArgs( +        ive_video_encode_ip_t *ps_encode_ip, +        ive_video_encode_op_t *ps_encode_op, +        OMX_BUFFERHEADERTYPE *inputBufferHeader, +        OMX_BUFFERHEADERTYPE *outputBufferHeader); + +    DISALLOW_EVIL_CONSTRUCTORS(SoftAVC); +}; + +#ifdef FILE_DUMP_ENABLE + +#define INPUT_DUMP_PATH     "/sdcard/media/avce_input" +#define INPUT_DUMP_EXT      "yuv" +#define OUTPUT_DUMP_PATH    "/sdcard/media/avce_output" +#define OUTPUT_DUMP_EXT     "h264" + +#define GENERATE_FILE_NAMES() {                         \ +    GETTIME(&mTimeStart, NULL);                         \ +    strcpy(mInFile, "");                                \ +    sprintf(mInFile, "%s_%ld.%ld.%s", INPUT_DUMP_PATH,  \ +            mTimeStart.tv_sec, mTimeStart.tv_usec,      \ +            INPUT_DUMP_EXT);                            \ +    strcpy(mOutFile, "");                               \ +    sprintf(mOutFile, "%s_%ld.%ld.%s", OUTPUT_DUMP_PATH,\ +            mTimeStart.tv_sec, mTimeStart.tv_usec,      \ +            OUTPUT_DUMP_EXT);                           \ +} + +#define CREATE_DUMP_FILE(m_filename) {                  \ +    FILE *fp = fopen(m_filename, "wb");                 \ +    if (fp != NULL) {                                   \ +        ALOGD("Opened file %s", m_filename);            \ +        fclose(fp);                                     \ +    } else {                                            \ +        ALOGD("Could not open file %s", m_filename);    \ +    }                                                   \ +} +#define DUMP_TO_FILE(m_filename, m_buf, m_size)         \ +{                                                       \ +    FILE *fp = fopen(m_filename, "ab");                 \ +    if (fp != NULL && m_buf != NULL) {                  \ +        int i;                                          \ +        i = fwrite(m_buf, 1, m_size, fp);               \ +        ALOGD("fwrite ret %d to write %d", i, m_size);  \ +        if (i != (int)m_size) {                         \ +            ALOGD("Error in fwrite, returned %d", i);   \ +            perror("Error in write to file");           \ +        }                                               \ +        fclose(fp);                                     \ +    } else {                                            \ +        ALOGD("Could not write to file %s", m_filename);\ +    }                                                   \ +} +#else /* FILE_DUMP_ENABLE */ +#define INPUT_DUMP_PATH +#define INPUT_DUMP_EXT +#define OUTPUT_DUMP_PATH +#define OUTPUT_DUMP_EXT +#define GENERATE_FILE_NAMES() +#define CREATE_DUMP_FILE(m_filename) +#define DUMP_TO_FILE(m_filename, m_buf, m_size) +#endif /* FILE_DUMP_ENABLE */ + +}  // namespace android + +#endif  // __SOFT_AVC_ENC_H__ diff --git a/media/libstagefright/codecs/flac/enc/SoftFlacEncoder.cpp b/media/libstagefright/codecs/flac/enc/SoftFlacEncoder.cpp index 1301060..9edffd2 100644 --- a/media/libstagefright/codecs/flac/enc/SoftFlacEncoder.cpp +++ b/media/libstagefright/codecs/flac/enc/SoftFlacEncoder.cpp @@ -421,7 +421,6 @@ OMX_ERRORTYPE SoftFlacEncoder::configureEncoder() {      }      FLAC__bool ok = true; -    FLAC__StreamEncoderInitStatus initStatus = FLAC__STREAM_ENCODER_INIT_STATUS_OK;      ok = ok && FLAC__stream_encoder_set_channels(mFlacStreamEncoder, mNumChannels);      ok = ok && FLAC__stream_encoder_set_sample_rate(mFlacStreamEncoder, mSampleRate);      ok = ok && FLAC__stream_encoder_set_bits_per_sample(mFlacStreamEncoder, 16); diff --git a/media/libstagefright/codecs/g711/dec/SoftG711.cpp b/media/libstagefright/codecs/g711/dec/SoftG711.cpp index 3a69095..015515e 100644 --- a/media/libstagefright/codecs/g711/dec/SoftG711.cpp +++ b/media/libstagefright/codecs/g711/dec/SoftG711.cpp @@ -41,8 +41,9 @@ SoftG711::SoftG711(          OMX_COMPONENTTYPE **component)      : SimpleSoftOMXComponent(name, callbacks, appData, component),        mIsMLaw(true), +      mSignalledError(false),        mNumChannels(1), -      mSignalledError(false) { +      mSamplingRate(8000) {      if (!strcmp(name, "OMX.google.g711.alaw.decoder")) {          mIsMLaw = false;      } else { @@ -129,7 +130,7 @@ OMX_ERRORTYPE SoftG711::internalGetParameter(              pcmParams->eChannelMapping[1] = OMX_AUDIO_ChannelRF;              pcmParams->nChannels = mNumChannels; -            pcmParams->nSamplingRate = 8000; +            pcmParams->nSamplingRate = mSamplingRate;              return OMX_ErrorNone;          } @@ -159,6 +160,8 @@ OMX_ERRORTYPE SoftG711::internalSetParameter(                  mNumChannels = pcmParams->nChannels;              } +            mSamplingRate = pcmParams->nSamplingRate; +              return OMX_ErrorNone;          } diff --git a/media/libstagefright/codecs/g711/dec/SoftG711.h b/media/libstagefright/codecs/g711/dec/SoftG711.h index bff0c68..16b6340 100644 --- a/media/libstagefright/codecs/g711/dec/SoftG711.h +++ b/media/libstagefright/codecs/g711/dec/SoftG711.h @@ -46,8 +46,9 @@ private:      };      bool mIsMLaw; -    OMX_U32 mNumChannels;      bool mSignalledError; +    OMX_U32 mNumChannels; +    int32_t mSamplingRate;      void initPorts(); diff --git a/media/libstagefright/codecs/gsm/dec/SoftGSM.cpp b/media/libstagefright/codecs/gsm/dec/SoftGSM.cpp index 4debc48..bd01a1a 100644 --- a/media/libstagefright/codecs/gsm/dec/SoftGSM.cpp +++ b/media/libstagefright/codecs/gsm/dec/SoftGSM.cpp @@ -34,6 +34,9 @@ static void InitOMXParams(T *params) {      params->nVersion.s.nStep = 0;  } +// Microsoft WAV GSM encoding packs two GSM frames into 65 bytes. +static const int kMSGSMFrameSize = 65; +  SoftGSM::SoftGSM(          const char *name,          const OMX_CALLBACKTYPE *callbacks, @@ -64,7 +67,7 @@ void SoftGSM::initPorts() {      def.eDir = OMX_DirInput;      def.nBufferCountMin = kNumBuffers;      def.nBufferCountActual = def.nBufferCountMin; -    def.nBufferSize = sizeof(gsm_frame); +    def.nBufferSize = 1024 / kMSGSMFrameSize * kMSGSMFrameSize;      def.bEnabled = OMX_TRUE;      def.bPopulated = OMX_FALSE;      def.eDomain = OMX_PortDomainAudio; @@ -207,8 +210,8 @@ void SoftGSM::onQueueFilled(OMX_U32 /* portIndex */) {              mSignalledError = true;          } -        if(((inHeader->nFilledLen / 65) * 65) != inHeader->nFilledLen) { -            ALOGE("input buffer not multiple of 65 (%d).", inHeader->nFilledLen); +        if(((inHeader->nFilledLen / kMSGSMFrameSize) * kMSGSMFrameSize) != inHeader->nFilledLen) { +            ALOGE("input buffer not multiple of %d (%d).", kMSGSMFrameSize, inHeader->nFilledLen);              notify(OMX_EventError, OMX_ErrorUndefined, 0, NULL);              mSignalledError = true;          } @@ -258,6 +261,25 @@ int SoftGSM::DecodeGSM(gsm handle,      return ret;  } +void SoftGSM::onPortFlushCompleted(OMX_U32 portIndex) { +    if (portIndex == 0) { +        gsm_destroy(mGsm); +        mGsm = gsm_create(); +        int msopt = 1; +        gsm_option(mGsm, GSM_OPT_WAV49, &msopt); +    } +} + +void SoftGSM::onReset() { +    gsm_destroy(mGsm); +    mGsm = gsm_create(); +    int msopt = 1; +    gsm_option(mGsm, GSM_OPT_WAV49, &msopt); +    mSignalledError = false; +} + + +  }  // namespace android diff --git a/media/libstagefright/codecs/gsm/dec/SoftGSM.h b/media/libstagefright/codecs/gsm/dec/SoftGSM.h index 8ab6116..0303dea 100644 --- a/media/libstagefright/codecs/gsm/dec/SoftGSM.h +++ b/media/libstagefright/codecs/gsm/dec/SoftGSM.h @@ -43,6 +43,9 @@ protected:      virtual void onQueueFilled(OMX_U32 portIndex); +    virtual void onPortFlushCompleted(OMX_U32 portIndex); +    virtual void onReset(); +  private:      enum {          kNumBuffers = 4, diff --git a/media/libstagefright/codecs/m4v_h263/dec/src/find_min_max.cpp b/media/libstagefright/codecs/m4v_h263/dec/src/find_min_max.cpp index a357ea6..1ac88a1 100644 --- a/media/libstagefright/codecs/m4v_h263/dec/src/find_min_max.cpp +++ b/media/libstagefright/codecs/m4v_h263/dec/src/find_min_max.cpp @@ -138,8 +138,8 @@ void  FindMaxMin(      /*----------------------------------------------------------------------------      ; Define all local variables      ----------------------------------------------------------------------------*/ -    register    uint    i, j; -    register    int min, max; +    uint    i, j; +    int min, max;      /*----------------------------------------------------------------------------      ; Function body here diff --git a/media/libstagefright/codecs/m4v_h263/enc/Android.mk b/media/libstagefright/codecs/m4v_h263/enc/Android.mk index c9006d9..7117692 100644 --- a/media/libstagefright/codecs/m4v_h263/enc/Android.mk +++ b/media/libstagefright/codecs/m4v_h263/enc/Android.mk @@ -25,7 +25,7 @@ LOCAL_MODULE := libstagefright_m4vh263enc  LOCAL_CFLAGS := \      -DBX_RC \ -    -DOSCL_IMPORT_REF= -DOSCL_UNUSED_ARG= -DOSCL_EXPORT_REF= +    -DOSCL_IMPORT_REF= -D"OSCL_UNUSED_ARG(x)=(void)(x)" -DOSCL_EXPORT_REF=  LOCAL_C_INCLUDES := \      $(LOCAL_PATH)/src \ @@ -55,7 +55,7 @@ LOCAL_C_INCLUDES := \  LOCAL_CFLAGS := \      -DBX_RC \ -    -DOSCL_IMPORT_REF= -DOSCL_UNUSED_ARG= -DOSCL_EXPORT_REF= +    -DOSCL_IMPORT_REF= -D"OSCL_UNUSED_ARG(x)=(void)(x)" -DOSCL_EXPORT_REF=  LOCAL_STATIC_LIBRARIES := \ diff --git a/media/libstagefright/codecs/m4v_h263/enc/SoftMPEG4Encoder.cpp b/media/libstagefright/codecs/m4v_h263/enc/SoftMPEG4Encoder.cpp index fa3486c..8240f83 100644 --- a/media/libstagefright/codecs/m4v_h263/enc/SoftMPEG4Encoder.cpp +++ b/media/libstagefright/codecs/m4v_h263/enc/SoftMPEG4Encoder.cpp @@ -413,13 +413,6 @@ void SoftMPEG4Encoder::onQueueFilled(OMX_U32 /* portIndex */) {          if (inHeader->nFilledLen > 0) {              const uint8_t *inputData = NULL;              if (mInputDataIsMeta) { -                if (inHeader->nFilledLen != 8) { -                    ALOGE("MetaData buffer is wrong size! " -                            "(got %u bytes, expected 8)", inHeader->nFilledLen); -                    mSignalledError = true; -                    notify(OMX_EventError, OMX_ErrorUndefined, 0, 0); -                    return; -                }                  inputData =                      extractGraphicBuffer(                              mInputFrameData, (mWidth * mHeight * 3) >> 1, diff --git a/media/libstagefright/codecs/m4v_h263/enc/SoftMPEG4Encoder.h b/media/libstagefright/codecs/m4v_h263/enc/SoftMPEG4Encoder.h index 25ecdc9..3389c37 100644 --- a/media/libstagefright/codecs/m4v_h263/enc/SoftMPEG4Encoder.h +++ b/media/libstagefright/codecs/m4v_h263/enc/SoftMPEG4Encoder.h @@ -26,7 +26,6 @@  namespace android {  struct CodecProfileLevel; -struct MediaBuffer;  struct SoftMPEG4Encoder : public SoftVideoEncoderOMXComponent {      SoftMPEG4Encoder( diff --git a/media/libstagefright/codecs/m4v_h263/enc/src/dct.cpp b/media/libstagefright/codecs/m4v_h263/enc/src/dct.cpp index fa4ae23..8d7d9f1 100644 --- a/media/libstagefright/codecs/m4v_h263/enc/src/dct.cpp +++ b/media/libstagefright/codecs/m4v_h263/enc/src/dct.cpp @@ -267,7 +267,7 @@ extern "C"      Void Block4x4DCT_AANwSub(Short *out, UChar *cur, UChar *pred, Int width)      {          Short *dst; -        register Int k0, k1, k2, k3, k4, k5, k6, k7; +        Int k0, k1, k2, k3, k4, k5, k6, k7;          Int round;          Int k12 = 0x022A02D4;          Int k14 = 0x0188053A; @@ -473,7 +473,7 @@ extern "C"      Void Block2x2DCT_AANwSub(Short *out, UChar *cur, UChar *pred, Int width)      {          Short *dst; -        register Int k0, k1, k2, k3, k4, k5, k6, k7; +        Int k0, k1, k2, k3, k4, k5, k6, k7;          Int round;          Int k12 = 0x022A02D4;          Int k14 = 0x018803B2; @@ -863,7 +863,7 @@ extern "C"      Void Block4x4DCT_AANIntra(Short *out, UChar *cur, UChar *dummy2, Int width)      {          Short *dst; -        register Int k0, k1, k2, k3, k4, k5, k6, k7; +        Int k0, k1, k2, k3, k4, k5, k6, k7;          Int round;          Int k12 = 0x022A02D4;          Int k14 = 0x0188053A; @@ -1050,7 +1050,7 @@ extern "C"      Void Block2x2DCT_AANIntra(Short *out, UChar *cur, UChar *dummy2, Int width)      {          Short *dst; -        register Int k0, k1, k2, k3, k4, k5, k6, k7; +        Int k0, k1, k2, k3, k4, k5, k6, k7;          Int round;          Int k12 = 0x022A02D4;          Int k14 = 0x018803B2; diff --git a/media/libstagefright/codecs/m4v_h263/enc/src/vlc_encode.cpp b/media/libstagefright/codecs/m4v_h263/enc/src/vlc_encode.cpp index 7ea5dc4..2aec815 100644 --- a/media/libstagefright/codecs/m4v_h263/enc/src/vlc_encode.cpp +++ b/media/libstagefright/codecs/m4v_h263/enc/src/vlc_encode.cpp @@ -271,7 +271,7 @@ PutCBPY(Int cbpy, Char intra, BitstreamEncVideo *bitstream)      Int ind;      Int length; -    if ((intra == 0)) +    if (intra == 0)          cbpy = 15 - cbpy;      ind = cbpy; diff --git a/media/libstagefright/codecs/mp3dec/Android.mk b/media/libstagefright/codecs/mp3dec/Android.mk index 8284490..948ae29 100644 --- a/media/libstagefright/codecs/mp3dec/Android.mk +++ b/media/libstagefright/codecs/mp3dec/Android.mk @@ -48,7 +48,7 @@ LOCAL_C_INCLUDES := \          $(LOCAL_PATH)/include  LOCAL_CFLAGS := \ -        -DOSCL_UNUSED_ARG= +        -D"OSCL_UNUSED_ARG(x)=(void)(x)"  LOCAL_CFLAGS += -Werror diff --git a/media/libstagefright/codecs/mpeg2dec/Android.mk b/media/libstagefright/codecs/mpeg2dec/Android.mk new file mode 100644 index 0000000..23b126d --- /dev/null +++ b/media/libstagefright/codecs/mpeg2dec/Android.mk @@ -0,0 +1,27 @@ +ifeq ($(if $(wildcard external/libmpeg2),1,0),1) + +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE            := libstagefright_soft_mpeg2dec +LOCAL_MODULE_TAGS       := optional + +LOCAL_STATIC_LIBRARIES  := libmpeg2dec +LOCAL_SRC_FILES         := SoftMPEG2.cpp + +LOCAL_C_INCLUDES := $(TOP)/external/libmpeg2/decoder +LOCAL_C_INCLUDES += $(TOP)/external/libmpeg2/common +LOCAL_C_INCLUDES += $(TOP)/frameworks/av/media/libstagefright/include +LOCAL_C_INCLUDES += $(TOP)/frameworks/native/include/media/openmax + +LOCAL_SHARED_LIBRARIES  := libstagefright +LOCAL_SHARED_LIBRARIES  += libstagefright_omx +LOCAL_SHARED_LIBRARIES  += libstagefright_foundation +LOCAL_SHARED_LIBRARIES  += libutils +LOCAL_SHARED_LIBRARIES  += liblog + +LOCAL_LDFLAGS := -Wl,-Bsymbolic + +include $(BUILD_SHARED_LIBRARY) + +endif diff --git a/media/libstagefright/codecs/mpeg2dec/SoftMPEG2.cpp b/media/libstagefright/codecs/mpeg2dec/SoftMPEG2.cpp new file mode 100644 index 0000000..7e98928 --- /dev/null +++ b/media/libstagefright/codecs/mpeg2dec/SoftMPEG2.cpp @@ -0,0 +1,771 @@ +/* + * Copyright 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + *      http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +//#define LOG_NDEBUG 0 +#define LOG_TAG "SoftMPEG2" +#include <utils/Log.h> + +#include "iv_datatypedef.h" +#include "iv.h" +#include "ivd.h" +#include "ithread.h" +#include "impeg2d.h" +#include "SoftMPEG2.h" + +#include <media/stagefright/foundation/ADebug.h> +#include <media/stagefright/MediaDefs.h> +#include <OMX_VideoExt.h> + +namespace android { + +#define componentName                   "video_decoder.mpeg2" +#define codingType                      OMX_VIDEO_CodingMPEG2 +#define CODEC_MIME_TYPE                 MEDIA_MIMETYPE_VIDEO_MPEG2 + +/** Function and structure definitions to keep code similar for each codec */ +#define ivdec_api_function              impeg2d_api_function +#define ivdext_init_ip_t                impeg2d_init_ip_t +#define ivdext_init_op_t                impeg2d_init_op_t +#define ivdext_fill_mem_rec_ip_t        impeg2d_fill_mem_rec_ip_t +#define ivdext_fill_mem_rec_op_t        impeg2d_fill_mem_rec_op_t +#define ivdext_ctl_set_num_cores_ip_t   impeg2d_ctl_set_num_cores_ip_t +#define ivdext_ctl_set_num_cores_op_t   impeg2d_ctl_set_num_cores_op_t + +#define IVDEXT_CMD_CTL_SET_NUM_CORES    \ +        (IVD_CONTROL_API_COMMAND_TYPE_T)IMPEG2D_CMD_CTL_SET_NUM_CORES + +static const CodecProfileLevel kProfileLevels[] = { +    { OMX_VIDEO_MPEG2ProfileSimple, OMX_VIDEO_MPEG2LevelLL  }, +    { OMX_VIDEO_MPEG2ProfileSimple, OMX_VIDEO_MPEG2LevelML  }, +    { OMX_VIDEO_MPEG2ProfileSimple, OMX_VIDEO_MPEG2LevelH14 }, +    { OMX_VIDEO_MPEG2ProfileSimple, OMX_VIDEO_MPEG2LevelHL  }, + +    { OMX_VIDEO_MPEG2ProfileMain  , OMX_VIDEO_MPEG2LevelLL  }, +    { OMX_VIDEO_MPEG2ProfileMain  , OMX_VIDEO_MPEG2LevelML  }, +    { OMX_VIDEO_MPEG2ProfileMain  , OMX_VIDEO_MPEG2LevelH14 }, +    { OMX_VIDEO_MPEG2ProfileMain  , OMX_VIDEO_MPEG2LevelHL  }, +}; + +SoftMPEG2::SoftMPEG2( +        const char *name, +        const OMX_CALLBACKTYPE *callbacks, +        OMX_PTR appData, +        OMX_COMPONENTTYPE **component) +    : SoftVideoDecoderOMXComponent( +            name, componentName, codingType, +            kProfileLevels, ARRAY_SIZE(kProfileLevels), +            320 /* width */, 240 /* height */, callbacks, +            appData, component), +      mMemRecords(NULL), +      mFlushOutBuffer(NULL), +      mOmxColorFormat(OMX_COLOR_FormatYUV420Planar), +      mIvColorFormat(IV_YUV_420P), +      mNewWidth(mWidth), +      mNewHeight(mHeight), +      mChangingResolution(false) { +    initPorts(kNumBuffers, INPUT_BUF_SIZE, kNumBuffers, CODEC_MIME_TYPE); + +    // If input dump is enabled, then open create an empty file +    GENERATE_FILE_NAMES(); +    CREATE_DUMP_FILE(mInFile); + +    CHECK_EQ(initDecoder(), (status_t)OK); +} + +SoftMPEG2::~SoftMPEG2() { +    CHECK_EQ(deInitDecoder(), (status_t)OK); +} + + +static size_t getMinTimestampIdx(OMX_S64 *pNTimeStamp, bool *pIsTimeStampValid) { +    OMX_S64 minTimeStamp = LLONG_MAX; +    int idx = -1; +    for (size_t i = 0; i < MAX_TIME_STAMPS; i++) { +        if (pIsTimeStampValid[i]) { +            if (pNTimeStamp[i] < minTimeStamp) { +                minTimeStamp = pNTimeStamp[i]; +                idx = i; +            } +        } +    } +    return idx; +} + +static size_t GetCPUCoreCount() { +    long cpuCoreCount = 1; +#if defined(_SC_NPROCESSORS_ONLN) +    cpuCoreCount = sysconf(_SC_NPROCESSORS_ONLN); +#else +    // _SC_NPROC_ONLN must be defined... +    cpuCoreCount = sysconf(_SC_NPROC_ONLN); +#endif +    CHECK(cpuCoreCount >= 1); +    ALOGV("Number of CPU cores: %ld", cpuCoreCount); +    return (size_t)cpuCoreCount; +} + +void SoftMPEG2::logVersion() { +    ivd_ctl_getversioninfo_ip_t s_ctl_ip; +    ivd_ctl_getversioninfo_op_t s_ctl_op; +    UWORD8 au1_buf[512]; +    IV_API_CALL_STATUS_T status; + +    s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL; +    s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_GETVERSION; +    s_ctl_ip.u4_size = sizeof(ivd_ctl_getversioninfo_ip_t); +    s_ctl_op.u4_size = sizeof(ivd_ctl_getversioninfo_op_t); +    s_ctl_ip.pv_version_buffer = au1_buf; +    s_ctl_ip.u4_version_buffer_size = sizeof(au1_buf); + +    status = ivdec_api_function(mCodecCtx, (void *)&s_ctl_ip, (void *)&s_ctl_op); + +    if (status != IV_SUCCESS) { +        ALOGE("Error in getting version number: 0x%x", +                s_ctl_op.u4_error_code); +    } else { +        ALOGV("Ittiam decoder version number: %s", +                (char *)s_ctl_ip.pv_version_buffer); +    } +    return; +} + +status_t SoftMPEG2::setParams(size_t stride) { +    ivd_ctl_set_config_ip_t s_ctl_ip; +    ivd_ctl_set_config_op_t s_ctl_op; +    IV_API_CALL_STATUS_T status; +    s_ctl_ip.u4_disp_wd = (UWORD32)stride; +    s_ctl_ip.e_frm_skip_mode = IVD_SKIP_NONE; + +    s_ctl_ip.e_frm_out_mode = IVD_DISPLAY_FRAME_OUT; +    s_ctl_ip.e_vid_dec_mode = IVD_DECODE_FRAME; +    s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL; +    s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_SETPARAMS; +    s_ctl_ip.u4_size = sizeof(ivd_ctl_set_config_ip_t); +    s_ctl_op.u4_size = sizeof(ivd_ctl_set_config_op_t); + +    ALOGV("Set the run-time (dynamic) parameters stride = %u", stride); +    status = ivdec_api_function(mCodecCtx, (void *)&s_ctl_ip, (void *)&s_ctl_op); + +    if (status != IV_SUCCESS) { +        ALOGE("Error in setting the run-time parameters: 0x%x", +                s_ctl_op.u4_error_code); + +        return UNKNOWN_ERROR; +    } +    return OK; +} + +status_t SoftMPEG2::resetPlugin() { +    mIsInFlush = false; +    mReceivedEOS = false; +    memset(mTimeStamps, 0, sizeof(mTimeStamps)); +    memset(mTimeStampsValid, 0, sizeof(mTimeStampsValid)); + +    /* Initialize both start and end times */ +    gettimeofday(&mTimeStart, NULL); +    gettimeofday(&mTimeEnd, NULL); + +    return OK; +} + +status_t SoftMPEG2::resetDecoder() { +    ivd_ctl_reset_ip_t s_ctl_ip; +    ivd_ctl_reset_op_t s_ctl_op; +    IV_API_CALL_STATUS_T status; + +    s_ctl_ip.e_cmd = IVD_CMD_VIDEO_CTL; +    s_ctl_ip.e_sub_cmd = IVD_CMD_CTL_RESET; +    s_ctl_ip.u4_size = sizeof(ivd_ctl_reset_ip_t); +    s_ctl_op.u4_size = sizeof(ivd_ctl_reset_op_t); + +    status = ivdec_api_function(mCodecCtx, (void *)&s_ctl_ip, (void *)&s_ctl_op); +    if (IV_SUCCESS != status) { +        ALOGE("Error in reset: 0x%x", s_ctl_op.u4_error_code); +        return UNKNOWN_ERROR; +    } + +    /* Set the run-time (dynamic) parameters */ +    setParams(outputBufferWidth()); + +    /* Set number of cores/threads to be used by the codec */ +    setNumCores(); + +    return OK; +} + +status_t SoftMPEG2::setNumCores() { +    ivdext_ctl_set_num_cores_ip_t s_set_cores_ip; +    ivdext_ctl_set_num_cores_op_t s_set_cores_op; +    IV_API_CALL_STATUS_T status; +    s_set_cores_ip.e_cmd = IVD_CMD_VIDEO_CTL; +    s_set_cores_ip.e_sub_cmd = IVDEXT_CMD_CTL_SET_NUM_CORES; +    s_set_cores_ip.u4_num_cores = MIN(mNumCores, CODEC_MAX_NUM_CORES); +    s_set_cores_ip.u4_size = sizeof(ivdext_ctl_set_num_cores_ip_t); +    s_set_cores_op.u4_size = sizeof(ivdext_ctl_set_num_cores_op_t); + +    status = ivdec_api_function(mCodecCtx, (void *)&s_set_cores_ip, (void *)&s_set_cores_op); +    if (IV_SUCCESS != status) { +        ALOGE("Error in setting number of cores: 0x%x", +                s_set_cores_op.u4_error_code); +        return UNKNOWN_ERROR; +    } +    return OK; +} + +status_t SoftMPEG2::setFlushMode() { +    IV_API_CALL_STATUS_T status; +    ivd_ctl_flush_ip_t s_video_flush_ip; +    ivd_ctl_flush_op_t s_video_flush_op; + +    s_video_flush_ip.e_cmd = IVD_CMD_VIDEO_CTL; +    s_video_flush_ip.e_sub_cmd = IVD_CMD_CTL_FLUSH; +    s_video_flush_ip.u4_size = sizeof(ivd_ctl_flush_ip_t); +    s_video_flush_op.u4_size = sizeof(ivd_ctl_flush_op_t); + +    /* Set the decoder in Flush mode, subsequent decode() calls will flush */ +    status = ivdec_api_function( +            mCodecCtx, (void *)&s_video_flush_ip, (void *)&s_video_flush_op); + +    if (status != IV_SUCCESS) { +        ALOGE("Error in setting the decoder in flush mode: (%d) 0x%x", status, +                s_video_flush_op.u4_error_code); +        return UNKNOWN_ERROR; +    } + +    mWaitForI = true; +    mIsInFlush = true; +    return OK; +} + +status_t SoftMPEG2::initDecoder() { +    IV_API_CALL_STATUS_T status; + +    UWORD32 u4_num_reorder_frames; +    UWORD32 u4_num_ref_frames; +    UWORD32 u4_share_disp_buf; + +    mNumCores = GetCPUCoreCount(); +    mWaitForI = true; + +    /* Initialize number of ref and reorder modes (for MPEG2) */ +    u4_num_reorder_frames = 16; +    u4_num_ref_frames = 16; +    u4_share_disp_buf = 0; + +    uint32_t displayStride = outputBufferWidth(); +    uint32_t displayHeight = outputBufferHeight(); +    uint32_t displaySizeY = displayStride * displayHeight; + +    { +        iv_num_mem_rec_ip_t s_num_mem_rec_ip; +        iv_num_mem_rec_op_t s_num_mem_rec_op; + +        s_num_mem_rec_ip.u4_size = sizeof(s_num_mem_rec_ip); +        s_num_mem_rec_op.u4_size = sizeof(s_num_mem_rec_op); +        s_num_mem_rec_ip.e_cmd = IV_CMD_GET_NUM_MEM_REC; + +        status = ivdec_api_function( +                mCodecCtx, (void *)&s_num_mem_rec_ip, (void *)&s_num_mem_rec_op); +        if (IV_SUCCESS != status) { +            ALOGE("Error in getting mem records: 0x%x", +                    s_num_mem_rec_op.u4_error_code); +            return UNKNOWN_ERROR; +        } + +        mNumMemRecords = s_num_mem_rec_op.u4_num_mem_rec; +    } + +    mMemRecords = (iv_mem_rec_t *)ivd_aligned_malloc( +            128, mNumMemRecords * sizeof(iv_mem_rec_t)); +    if (mMemRecords == NULL) { +        ALOGE("Allocation failure"); +        return NO_MEMORY; +    } + +    memset(mMemRecords, 0, mNumMemRecords * sizeof(iv_mem_rec_t)); + +    { +        size_t i; +        ivdext_fill_mem_rec_ip_t s_fill_mem_ip; +        ivdext_fill_mem_rec_op_t s_fill_mem_op; +        iv_mem_rec_t *ps_mem_rec; + +        s_fill_mem_ip.s_ivd_fill_mem_rec_ip_t.u4_size = +            sizeof(ivdext_fill_mem_rec_ip_t); + +        s_fill_mem_ip.u4_share_disp_buf = u4_share_disp_buf; +        s_fill_mem_ip.e_output_format = mIvColorFormat; + +        s_fill_mem_ip.s_ivd_fill_mem_rec_ip_t.e_cmd = IV_CMD_FILL_NUM_MEM_REC; +        s_fill_mem_ip.s_ivd_fill_mem_rec_ip_t.pv_mem_rec_location = mMemRecords; +        s_fill_mem_ip.s_ivd_fill_mem_rec_ip_t.u4_max_frm_wd = displayStride; +        s_fill_mem_ip.s_ivd_fill_mem_rec_ip_t.u4_max_frm_ht = displayHeight; +        s_fill_mem_op.s_ivd_fill_mem_rec_op_t.u4_size = +            sizeof(ivdext_fill_mem_rec_op_t); + +        ps_mem_rec = mMemRecords; +        for (i = 0; i < mNumMemRecords; i++) { +            ps_mem_rec[i].u4_size = sizeof(iv_mem_rec_t); +        } + +        status = ivdec_api_function( +                mCodecCtx, (void *)&s_fill_mem_ip, (void *)&s_fill_mem_op); + +        if (IV_SUCCESS != status) { +            ALOGE("Error in filling mem records: 0x%x", +                    s_fill_mem_op.s_ivd_fill_mem_rec_op_t.u4_error_code); +            return UNKNOWN_ERROR; +        } +        mNumMemRecords = +            s_fill_mem_op.s_ivd_fill_mem_rec_op_t.u4_num_mem_rec_filled; + +        ps_mem_rec = mMemRecords; + +        for (i = 0; i < mNumMemRecords; i++) { +            ps_mem_rec->pv_base = ivd_aligned_malloc( +                    ps_mem_rec->u4_mem_alignment, ps_mem_rec->u4_mem_size); +            if (ps_mem_rec->pv_base == NULL) { +                ALOGE("Allocation failure for memory record #%zu of size %u", +                        i, ps_mem_rec->u4_mem_size); +                status = IV_FAIL; +                return NO_MEMORY; +            } + +            ps_mem_rec++; +        } +    } + +    /* Initialize the decoder */ +    { +        ivdext_init_ip_t s_init_ip; +        ivdext_init_op_t s_init_op; + +        void *dec_fxns = (void *)ivdec_api_function; + +        s_init_ip.s_ivd_init_ip_t.u4_size = sizeof(ivdext_init_ip_t); +        s_init_ip.s_ivd_init_ip_t.e_cmd = (IVD_API_COMMAND_TYPE_T)IV_CMD_INIT; +        s_init_ip.s_ivd_init_ip_t.pv_mem_rec_location = mMemRecords; +        s_init_ip.s_ivd_init_ip_t.u4_frm_max_wd = displayStride; +        s_init_ip.s_ivd_init_ip_t.u4_frm_max_ht = displayHeight; + +        s_init_ip.u4_share_disp_buf = u4_share_disp_buf; + +        s_init_op.s_ivd_init_op_t.u4_size = sizeof(s_init_op); + +        s_init_ip.s_ivd_init_ip_t.u4_num_mem_rec = mNumMemRecords; +        s_init_ip.s_ivd_init_ip_t.e_output_format = mIvColorFormat; + +        mCodecCtx = (iv_obj_t *)mMemRecords[0].pv_base; +        mCodecCtx->pv_fxns = dec_fxns; +        mCodecCtx->u4_size = sizeof(iv_obj_t); + +        status = ivdec_api_function(mCodecCtx, (void *)&s_init_ip, (void *)&s_init_op); +        if (status != IV_SUCCESS) { +            ALOGE("Error in init: 0x%x", +                    s_init_op.s_ivd_init_op_t.u4_error_code); +            return UNKNOWN_ERROR; +        } +    } + +    /* Reset the plugin state */ +    resetPlugin(); + +    /* Set the run time (dynamic) parameters */ +    setParams(displayStride); + +    /* Set number of cores/threads to be used by the codec */ +    setNumCores(); + +    /* Get codec version */ +    logVersion(); + +    /* Allocate internal picture buffer */ +    uint32_t bufferSize = displaySizeY * 3 / 2; +    mFlushOutBuffer = (uint8_t *)ivd_aligned_malloc(128, bufferSize); +    if (NULL == mFlushOutBuffer) { +        ALOGE("Could not allocate flushOutputBuffer of size %zu", bufferSize); +        return NO_MEMORY; +    } + +    mInitNeeded = false; +    mFlushNeeded = false; +    return OK; +} + +status_t SoftMPEG2::deInitDecoder() { +    size_t i; + +    if (mMemRecords) { +        iv_mem_rec_t *ps_mem_rec; + +        ps_mem_rec = mMemRecords; +        for (i = 0; i < mNumMemRecords; i++) { +            if (ps_mem_rec->pv_base) { +                ivd_aligned_free(ps_mem_rec->pv_base); +            } +            ps_mem_rec++; +        } +        ivd_aligned_free(mMemRecords); +        mMemRecords = NULL; +    } + +    if (mFlushOutBuffer) { +        ivd_aligned_free(mFlushOutBuffer); +        mFlushOutBuffer = NULL; +    } + +    mInitNeeded = true; +    mChangingResolution = false; + +    return OK; +} + +status_t SoftMPEG2::reInitDecoder() { +    status_t ret; + +    deInitDecoder(); + +    ret = initDecoder(); +    if (OK != ret) { +        ALOGE("Create failure"); +        deInitDecoder(); +        return NO_MEMORY; +    } +    return OK; +} + +void SoftMPEG2::onReset() { +    SoftVideoDecoderOMXComponent::onReset(); + +    mWaitForI = true; + +    resetDecoder(); +    resetPlugin(); +} + +OMX_ERRORTYPE SoftMPEG2::internalSetParameter(OMX_INDEXTYPE index, const OMX_PTR params) { +    const uint32_t oldWidth = mWidth; +    const uint32_t oldHeight = mHeight; +    OMX_ERRORTYPE ret = SoftVideoDecoderOMXComponent::internalSetParameter(index, params); +    if (mWidth != oldWidth || mHeight != oldHeight) { +        reInitDecoder(); +    } +    return ret; +} + +void SoftMPEG2::setDecodeArgs( +        ivd_video_decode_ip_t *ps_dec_ip, +        ivd_video_decode_op_t *ps_dec_op, +        OMX_BUFFERHEADERTYPE *inHeader, +        OMX_BUFFERHEADERTYPE *outHeader, +        size_t timeStampIx) { +    size_t sizeY = outputBufferWidth() * outputBufferHeight(); +    size_t sizeUV; +    uint8_t *pBuf; + +    ps_dec_ip->u4_size = sizeof(ivd_video_decode_ip_t); +    ps_dec_op->u4_size = sizeof(ivd_video_decode_op_t); + +    ps_dec_ip->e_cmd = IVD_CMD_VIDEO_DECODE; + +    /* When in flush and after EOS with zero byte input, +     * inHeader is set to zero. Hence check for non-null */ +    if (inHeader) { +        ps_dec_ip->u4_ts = timeStampIx; +        ps_dec_ip->pv_stream_buffer = inHeader->pBuffer +                + inHeader->nOffset; +        ps_dec_ip->u4_num_Bytes = inHeader->nFilledLen; +    } else { +        ps_dec_ip->u4_ts = 0; +        ps_dec_ip->pv_stream_buffer = NULL; +        ps_dec_ip->u4_num_Bytes = 0; +    } + +    if (outHeader) { +        pBuf = outHeader->pBuffer; +    } else { +        pBuf = mFlushOutBuffer; +    } + +    sizeUV = sizeY / 4; +    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[0] = sizeY; +    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[1] = sizeUV; +    ps_dec_ip->s_out_buffer.u4_min_out_buf_size[2] = sizeUV; + +    ps_dec_ip->s_out_buffer.pu1_bufs[0] = pBuf; +    ps_dec_ip->s_out_buffer.pu1_bufs[1] = pBuf + sizeY; +    ps_dec_ip->s_out_buffer.pu1_bufs[2] = pBuf + sizeY + sizeUV; +    ps_dec_ip->s_out_buffer.u4_num_bufs = 3; +    return; +} +void SoftMPEG2::onPortFlushCompleted(OMX_U32 portIndex) { +    /* Once the output buffers are flushed, ignore any buffers that are held in decoder */ +    if (kOutputPortIndex == portIndex) { +        setFlushMode(); + +        while (true) { +            ivd_video_decode_ip_t s_dec_ip; +            ivd_video_decode_op_t s_dec_op; +            IV_API_CALL_STATUS_T status; +            size_t sizeY, sizeUV; + +            setDecodeArgs(&s_dec_ip, &s_dec_op, NULL, NULL, 0); + +            status = ivdec_api_function(mCodecCtx, (void *)&s_dec_ip, (void *)&s_dec_op); +            if (0 == s_dec_op.u4_output_present) { +                resetPlugin(); +                break; +            } +        } +    } +} + +void SoftMPEG2::onQueueFilled(OMX_U32 portIndex) { +    UNUSED(portIndex); + +    if (mOutputPortSettingsChange != NONE) { +        return; +    } + +    List<BufferInfo *> &inQueue = getPortQueue(kInputPortIndex); +    List<BufferInfo *> &outQueue = getPortQueue(kOutputPortIndex); + +    /* If input EOS is seen and decoder is not in flush mode, +     * set the decoder in flush mode. +     * There can be a case where EOS is sent along with last picture data +     * In that case, only after decoding that input data, decoder has to be +     * put in flush. This case is handled here  */ + +    if (mReceivedEOS && !mIsInFlush) { +        setFlushMode(); +    } + +    while (!outQueue.empty()) { +        BufferInfo *inInfo; +        OMX_BUFFERHEADERTYPE *inHeader; + +        BufferInfo *outInfo; +        OMX_BUFFERHEADERTYPE *outHeader; +        size_t timeStampIx; + +        inInfo = NULL; +        inHeader = NULL; + +        if (!mIsInFlush) { +            if (!inQueue.empty()) { +                inInfo = *inQueue.begin(); +                inHeader = inInfo->mHeader; +            } else { +                break; +            } +        } + +        outInfo = *outQueue.begin(); +        outHeader = outInfo->mHeader; +        outHeader->nFlags = 0; +        outHeader->nTimeStamp = 0; +        outHeader->nOffset = 0; + +        if (inHeader != NULL && (inHeader->nFlags & OMX_BUFFERFLAG_EOS)) { +            mReceivedEOS = true; +            if (inHeader->nFilledLen == 0) { +                inQueue.erase(inQueue.begin()); +                inInfo->mOwnedByUs = false; +                notifyEmptyBufferDone(inHeader); +                inHeader = NULL; +                setFlushMode(); +            } +        } + +        // When there is an init required and the decoder is not in flush mode, +        // update output port's definition and reinitialize decoder. +        if (mInitNeeded && !mIsInFlush) { +            bool portWillReset = false; +            handlePortSettingsChange(&portWillReset, mNewWidth, mNewHeight); + +            CHECK_EQ(reInitDecoder(), (status_t)OK); +            return; +        } + +        /* Get a free slot in timestamp array to hold input timestamp */ +        { +            size_t i; +            timeStampIx = 0; +            for (i = 0; i < MAX_TIME_STAMPS; i++) { +                if (!mTimeStampsValid[i]) { +                    timeStampIx = i; +                    break; +                } +            } +            if (inHeader != NULL) { +                mTimeStampsValid[timeStampIx] = true; +                mTimeStamps[timeStampIx] = inHeader->nTimeStamp; +            } +        } + +        { +            ivd_video_decode_ip_t s_dec_ip; +            ivd_video_decode_op_t s_dec_op; +            WORD32 timeDelay, timeTaken; +            size_t sizeY, sizeUV; + +            setDecodeArgs(&s_dec_ip, &s_dec_op, inHeader, outHeader, timeStampIx); +            // If input dump is enabled, then write to file +            DUMP_TO_FILE(mInFile, s_dec_ip.pv_stream_buffer, s_dec_ip.u4_num_Bytes); + +            if (s_dec_ip.u4_num_Bytes > 0) { +                char *ptr = (char *)s_dec_ip.pv_stream_buffer; +            } + +            GETTIME(&mTimeStart, NULL); +            /* Compute time elapsed between end of previous decode() +             * to start of current decode() */ +            TIME_DIFF(mTimeEnd, mTimeStart, timeDelay); + +            IV_API_CALL_STATUS_T status; +            status = ivdec_api_function(mCodecCtx, (void *)&s_dec_ip, (void *)&s_dec_op); + +            bool unsupportedDimensions = (IMPEG2D_UNSUPPORTED_DIMENSIONS == s_dec_op.u4_error_code); +            bool resChanged = (IVD_RES_CHANGED == (s_dec_op.u4_error_code & 0xFF)); + +            GETTIME(&mTimeEnd, NULL); +            /* Compute time taken for decode() */ +            TIME_DIFF(mTimeStart, mTimeEnd, timeTaken); + +            ALOGV("timeTaken=%6d delay=%6d numBytes=%6d", timeTaken, timeDelay, +                   s_dec_op.u4_num_bytes_consumed); +            if (s_dec_op.u4_frame_decoded_flag && !mFlushNeeded) { +                mFlushNeeded = true; +            } + +            if ((inHeader != NULL) && (1 != s_dec_op.u4_frame_decoded_flag)) { +                /* If the input did not contain picture data, then ignore +                 * the associated timestamp */ +                mTimeStampsValid[timeStampIx] = false; +            } + +            // This is needed to handle CTS DecoderTest testCodecResetsMPEG2WithoutSurface, +            // which is not sending SPS/PPS after port reconfiguration and flush to the codec. +            if (unsupportedDimensions && !mFlushNeeded) { +                bool portWillReset = false; +                handlePortSettingsChange(&portWillReset, s_dec_op.u4_pic_wd, s_dec_op.u4_pic_ht); + +                CHECK_EQ(reInitDecoder(), (status_t)OK); + +                setDecodeArgs(&s_dec_ip, &s_dec_op, inHeader, outHeader, timeStampIx); + +                ivdec_api_function(mCodecCtx, (void *)&s_dec_ip, (void *)&s_dec_op); +                return; +            } + +            // If the decoder is in the changing resolution mode and there is no output present, +            // that means the switching is done and it's ready to reset the decoder and the plugin. +            if (mChangingResolution && !s_dec_op.u4_output_present) { +                mChangingResolution = false; +                resetDecoder(); +                resetPlugin(); +                continue; +            } + +            if (unsupportedDimensions || resChanged) { +                mChangingResolution = true; +                if (mFlushNeeded) { +                    setFlushMode(); +                } + +                if (unsupportedDimensions) { +                    mNewWidth = s_dec_op.u4_pic_wd; +                    mNewHeight = s_dec_op.u4_pic_ht; +                    mInitNeeded = true; +                } +                continue; +            } + +            if ((0 < s_dec_op.u4_pic_wd) && (0 < s_dec_op.u4_pic_ht)) { +                uint32_t width = s_dec_op.u4_pic_wd; +                uint32_t height = s_dec_op.u4_pic_ht; +                bool portWillReset = false; +                handlePortSettingsChange(&portWillReset, width, height); + +                if (portWillReset) { +                    resetDecoder(); +                    return; +                } +            } + +            if (s_dec_op.u4_output_present) { +                size_t timeStampIdx; +                outHeader->nFilledLen = (mWidth * mHeight * 3) / 2; + +                timeStampIdx = getMinTimestampIdx(mTimeStamps, mTimeStampsValid); +                outHeader->nTimeStamp = mTimeStamps[timeStampIdx]; +                mTimeStampsValid[timeStampIdx] = false; + +                /* mWaitForI waits for the first I picture. Once made FALSE, it +                   has to remain false till explicitly set to TRUE. */ +                mWaitForI = mWaitForI && !(IV_I_FRAME == s_dec_op.e_pic_type); + +                if (mWaitForI) { +                    s_dec_op.u4_output_present = false; +                } else { +                    ALOGV("Output timestamp: %lld, res: %ux%u", +                            (long long)outHeader->nTimeStamp, mWidth, mHeight); +                    DUMP_TO_FILE(mOutFile, outHeader->pBuffer, outHeader->nFilledLen); +                    outInfo->mOwnedByUs = false; +                    outQueue.erase(outQueue.begin()); +                    outInfo = NULL; +                    notifyFillBufferDone(outHeader); +                    outHeader = NULL; +                } +            } else { +                /* If in flush mode and no output is returned by the codec, +                 * then come out of flush mode */ +                mIsInFlush = false; + +                /* If EOS was recieved on input port and there is no output +                 * from the codec, then signal EOS on output port */ +                if (mReceivedEOS) { +                    outHeader->nFilledLen = 0; +                    outHeader->nFlags |= OMX_BUFFERFLAG_EOS; + +                    outInfo->mOwnedByUs = false; +                    outQueue.erase(outQueue.begin()); +                    outInfo = NULL; +                    notifyFillBufferDone(outHeader); +                    outHeader = NULL; +                    resetPlugin(); +                } +            } +        } + +        // TODO: Handle more than one picture data +        if (inHeader != NULL) { +            inInfo->mOwnedByUs = false; +            inQueue.erase(inQueue.begin()); +            inInfo = NULL; +            notifyEmptyBufferDone(inHeader); +            inHeader = NULL; +        } +    } +} + +}  // namespace android + +android::SoftOMXComponent *createSoftOMXComponent( +        const char *name, const OMX_CALLBACKTYPE *callbacks, OMX_PTR appData, +        OMX_COMPONENTTYPE **component) { +    return new android::SoftMPEG2(name, callbacks, appData, component); +} diff --git a/media/libstagefright/codecs/mpeg2dec/SoftMPEG2.h b/media/libstagefright/codecs/mpeg2dec/SoftMPEG2.h new file mode 100644 index 0000000..a625e08 --- /dev/null +++ b/media/libstagefright/codecs/mpeg2dec/SoftMPEG2.h @@ -0,0 +1,179 @@ +/* + * Copyright 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + *      http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef SOFT_MPEG2_H_ + +#define SOFT_MPEG2_H_ + +#include "SoftVideoDecoderOMXComponent.h" +#include <sys/time.h> + +namespace android { + +#define ivd_aligned_malloc(alignment, size) memalign(alignment, size) +#define ivd_aligned_free(buf) free(buf) + +/** Number of entries in the time-stamp array */ +#define MAX_TIME_STAMPS 64 + +/** Maximum number of cores supported by the codec */ +#define CODEC_MAX_NUM_CORES 4 + +#define CODEC_MAX_WIDTH     1920 + +#define CODEC_MAX_HEIGHT    1088 + +/** Input buffer size */ +#define INPUT_BUF_SIZE (1024 * 1024) + +#define MIN(a, b) ((a) < (b)) ? (a) : (b) + +/** Used to remove warnings about unused parameters */ +#define UNUSED(x) ((void)(x)) + +/** Get time */ +#define GETTIME(a, b) gettimeofday(a, b); + +/** Compute difference between start and end */ +#define TIME_DIFF(start, end, diff) \ +    diff = ((end.tv_sec - start.tv_sec) * 1000000) + \ +            (end.tv_usec - start.tv_usec); + +struct SoftMPEG2 : public SoftVideoDecoderOMXComponent { +    SoftMPEG2( +            const char *name, const OMX_CALLBACKTYPE *callbacks, +            OMX_PTR appData, OMX_COMPONENTTYPE **component); + +protected: +    virtual ~SoftMPEG2(); + +    virtual void onQueueFilled(OMX_U32 portIndex); +    virtual void onPortFlushCompleted(OMX_U32 portIndex); +    virtual void onReset(); +    virtual OMX_ERRORTYPE internalSetParameter(OMX_INDEXTYPE index, const OMX_PTR params); +private: +    // Number of input and output buffers +    enum { +        kNumBuffers = 8 +    }; + +    iv_obj_t *mCodecCtx;         // Codec context +    iv_mem_rec_t *mMemRecords;   // Memory records requested by the codec +    size_t mNumMemRecords;       // Number of memory records requested by the codec + +    size_t mNumCores;            // Number of cores to be uesd by the codec + +    struct timeval mTimeStart;   // Time at the start of decode() +    struct timeval mTimeEnd;     // Time at the end of decode() + +    // Internal buffer to be used to flush out the buffers from decoder +    uint8_t *mFlushOutBuffer; + +    // Status of entries in the timestamp array +    bool mTimeStampsValid[MAX_TIME_STAMPS]; + +    // Timestamp array - Since codec does not take 64 bit timestamps, +    // they are maintained in the plugin +    OMX_S64 mTimeStamps[MAX_TIME_STAMPS]; + +#ifdef FILE_DUMP_ENABLE +    char mInFile[200]; +#endif /* FILE_DUMP_ENABLE */ + +    OMX_COLOR_FORMATTYPE mOmxColorFormat;    // OMX Color format +    IV_COLOR_FORMAT_T mIvColorFormat;        // Ittiam Color format + +    bool mIsInFlush;        // codec is flush mode +    bool mReceivedEOS;      // EOS is receieved on input port +    bool mInitNeeded; +    uint32_t mNewWidth; +    uint32_t mNewHeight; +    // The input stream has changed to a different resolution, which is still supported by the +    // codec. So the codec is switching to decode the new resolution. +    bool mChangingResolution; +    bool mFlushNeeded; +    bool mWaitForI; + +    status_t initDecoder(); +    status_t deInitDecoder(); +    status_t setFlushMode(); +    status_t setParams(size_t stride); +    void logVersion(); +    status_t setNumCores(); +    status_t resetDecoder(); +    status_t resetPlugin(); +    status_t reInitDecoder(); + +    void setDecodeArgs( +            ivd_video_decode_ip_t *ps_dec_ip, +            ivd_video_decode_op_t *ps_dec_op, +            OMX_BUFFERHEADERTYPE *inHeader, +            OMX_BUFFERHEADERTYPE *outHeader, +            size_t timeStampIx); + +    DISALLOW_EVIL_CONSTRUCTORS(SoftMPEG2); +}; + +#ifdef FILE_DUMP_ENABLE + +#define INPUT_DUMP_PATH     "/sdcard/media/mpeg2d_input" +#define INPUT_DUMP_EXT      "m2v" + +#define GENERATE_FILE_NAMES() {                         \ +    GETTIME(&mTimeStart, NULL);                         \ +    strcpy(mInFile, "");                                \ +    sprintf(mInFile, "%s_%ld.%ld.%s", INPUT_DUMP_PATH,  \ +            mTimeStart.tv_sec, mTimeStart.tv_usec,      \ +            INPUT_DUMP_EXT);                            \ +} + +#define CREATE_DUMP_FILE(m_filename) {                  \ +    FILE *fp = fopen(m_filename, "wb");                 \ +    if (fp != NULL) {                                   \ +        fclose(fp);                                     \ +    } else {                                            \ +        ALOGD("Could not open file %s", m_filename);    \ +    }                                                   \ +} +#define DUMP_TO_FILE(m_filename, m_buf, m_size)         \ +{                                                       \ +    FILE *fp = fopen(m_filename, "ab");                 \ +    if (fp != NULL && m_buf != NULL) {                  \ +        int i;                                          \ +        i = fwrite(m_buf, 1, m_size, fp);               \ +        ALOGD("fwrite ret %d to write %d", i, m_size);  \ +        if (i != (int)m_size) {                         \ +            ALOGD("Error in fwrite, returned %d", i);   \ +            perror("Error in write to file");           \ +        }                                               \ +        fclose(fp);                                     \ +    } else {                                            \ +        ALOGD("Could not write to file %s", m_filename);\ +    }                                                   \ +} +#else /* FILE_DUMP_ENABLE */ +#define INPUT_DUMP_PATH +#define INPUT_DUMP_EXT +#define OUTPUT_DUMP_PATH +#define OUTPUT_DUMP_EXT +#define GENERATE_FILE_NAMES() +#define CREATE_DUMP_FILE(m_filename) +#define DUMP_TO_FILE(m_filename, m_buf, m_size) +#endif /* FILE_DUMP_ENABLE */ + +} // namespace android + +#endif  // SOFT_MPEG2_H_ diff --git a/media/libstagefright/codecs/on2/enc/Android.mk b/media/libstagefright/codecs/on2/enc/Android.mk index e265104..253fa04 100644 --- a/media/libstagefright/codecs/on2/enc/Android.mk +++ b/media/libstagefright/codecs/on2/enc/Android.mk @@ -6,7 +6,6 @@ LOCAL_SRC_FILES := \  LOCAL_C_INCLUDES := \          $(TOP)/external/libvpx/libvpx \ -        $(TOP)/external/openssl/include \          $(TOP)/external/libvpx/libvpx/vpx_codec \          $(TOP)/external/libvpx/libvpx/vpx_ports \          frameworks/av/media/libstagefright/include \ diff --git a/media/libstagefright/codecs/on2/h264dec/Android.mk b/media/libstagefright/codecs/on2/h264dec/Android.mk index bf03ad9..e63b6b1 100644 --- a/media/libstagefright/codecs/on2/h264dec/Android.mk +++ b/media/libstagefright/codecs/on2/h264dec/Android.mk @@ -94,6 +94,8 @@ ifeq ($(TARGET_ARCH),arm)      LOCAL_C_INCLUDES += $(LOCAL_PATH)/./omxdl/arm_neon/api \                          $(LOCAL_PATH)/./omxdl/arm_neon/vc/api \                          $(LOCAL_PATH)/./omxdl/arm_neon/vc/m4p10/api +    # h264bsdWriteMacroblock.S does not compile with Clang. +    LOCAL_CLANG_ASFLAGS_arm += -no-integrated-as    endif  endif diff --git a/media/libstagefright/codecs/on2/h264dec/inc/H264SwDecApi.h b/media/libstagefright/codecs/on2/h264dec/inc/H264SwDecApi.h index fe112bc..fe112bc 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/inc/H264SwDecApi.h +++ b/media/libstagefright/codecs/on2/h264dec/inc/H264SwDecApi.h diff --git a/media/libstagefright/codecs/on2/h264dec/inc/basetype.h b/media/libstagefright/codecs/on2/h264dec/inc/basetype.h index 63d5653..63d5653 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/inc/basetype.h +++ b/media/libstagefright/codecs/on2/h264dec/inc/basetype.h diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM.h b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM.h index 91e38b8..91e38b8 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM.h +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM.h diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM_BitDec_s.h b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM_BitDec_s.h index 56344e3..56344e3 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM_BitDec_s.h +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM_BitDec_s.h diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM_Bitstream.h b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM_Bitstream.h index 8c0ef37..8c0ef37 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM_Bitstream.h +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM_Bitstream.h diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM_IDCTTable.h b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM_IDCTTable.h index d761f61..d761f61 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM_IDCTTable.h +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM_IDCTTable.h diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM_IDCT_s.h b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM_IDCT_s.h index 9130223..9130223 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM_IDCT_s.h +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM_IDCT_s.h diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM_MaskTable.h b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM_MaskTable.h index 5ffc835..5ffc835 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM_MaskTable.h +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM_MaskTable.h diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM_Version.h b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM_Version.h index 41b3e1e..41b3e1e 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM_Version.h +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM_Version.h diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM_s.h b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM_s.h index 321d2d3..321d2d3 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM_s.h +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armCOMM_s.h diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armOMX.h b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armOMX.h index 303abd9..303abd9 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armOMX.h +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/armOMX.h diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/omxtypes.h b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/omxtypes.h index 912cb0d..912cb0d 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/omxtypes.h +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/omxtypes.h diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/omxtypes_s.h b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/omxtypes_s.h index 6e742c7..6e742c7 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/omxtypes_s.h +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/api/omxtypes_s.h diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/src/armCOMM.c b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/src/armCOMM.c index e8dbf41..e8dbf41 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/src/armCOMM.c +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/src/armCOMM.c diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/src/armCOMM_Bitstream.c b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/src/armCOMM_Bitstream.c index 99f53ca..99f53ca 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/src/armCOMM_Bitstream.c +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/src/armCOMM_Bitstream.c diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/src/armCOMM_IDCTTable.c b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/src/armCOMM_IDCTTable.c index 85d4c67..85d4c67 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/src/armCOMM_IDCTTable.c +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/src/armCOMM_IDCTTable.c diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/src/armCOMM_MaskTable.c b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/src/armCOMM_MaskTable.c index f169a16..f169a16 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/src/armCOMM_MaskTable.c +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/src/armCOMM_MaskTable.c diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/api/armVC.h b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/api/armVC.h index 1d37a5d..1d37a5d 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/api/armVC.h +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/api/armVC.h diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/api/armVCCOMM_s.h b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/api/armVCCOMM_s.h index cfc2a3b..cfc2a3b 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/api/armVCCOMM_s.h +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/api/armVCCOMM_s.h diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/api/omxVC.h b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/api/omxVC.h index 7b3cc72..7b3cc72 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/api/omxVC.h +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/api/omxVC.h diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/api/omxVC_s.h b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/api/omxVC_s.h index 89f3040..89f3040 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/api/omxVC_s.h +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/api/omxVC_s.h diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/api/armVCM4P10_CAVLCTables.h b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/api/armVCM4P10_CAVLCTables.h index 7dde9a7..7dde9a7 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/api/armVCM4P10_CAVLCTables.h +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/api/armVCM4P10_CAVLCTables.h diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src/armVCM4P10_CAVLCTables.c b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src/armVCM4P10_CAVLCTables.c index bb4bd9e..bb4bd9e 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src/armVCM4P10_CAVLCTables.c +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src/armVCM4P10_CAVLCTables.c diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src/omxVCM4P10_DeblockChroma_I.c b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src/omxVCM4P10_DeblockChroma_I.c index 0a6448d..0a6448d 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src/omxVCM4P10_DeblockChroma_I.c +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src/omxVCM4P10_DeblockChroma_I.c diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src/omxVCM4P10_DeblockLuma_I.c b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src/omxVCM4P10_DeblockLuma_I.c index 7b89be7..7b89be7 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src/omxVCM4P10_DeblockLuma_I.c +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src/omxVCM4P10_DeblockLuma_I.c diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src/omxVCM4P10_DecodeChromaDcCoeffsToPairCAVLC.c b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src/omxVCM4P10_DecodeChromaDcCoeffsToPairCAVLC.c index 950f348..950f348 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src/omxVCM4P10_DecodeChromaDcCoeffsToPairCAVLC.c +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src/omxVCM4P10_DecodeChromaDcCoeffsToPairCAVLC.c diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src/omxVCM4P10_DecodeCoeffsToPairCAVLC.c b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src/omxVCM4P10_DecodeCoeffsToPairCAVLC.c index 5e78b4c..5e78b4c 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src/omxVCM4P10_DecodeCoeffsToPairCAVLC.c +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src/omxVCM4P10_DecodeCoeffsToPairCAVLC.c diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src/omxVCM4P10_InterpolateChroma.c b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src/omxVCM4P10_InterpolateChroma.c index c6b3f41..c6b3f41 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src/omxVCM4P10_InterpolateChroma.c +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src/omxVCM4P10_InterpolateChroma.c diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p2/api/armVCM4P2_Huff_Tables_VLC.h b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p2/api/armVCM4P2_Huff_Tables_VLC.h index 6cbc5ff..6cbc5ff 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p2/api/armVCM4P2_Huff_Tables_VLC.h +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p2/api/armVCM4P2_Huff_Tables_VLC.h diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p2/api/armVCM4P2_ZigZag_Tables.h b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p2/api/armVCM4P2_ZigZag_Tables.h index 0d64a68..0d64a68 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p2/api/armVCM4P2_ZigZag_Tables.h +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p2/api/armVCM4P2_ZigZag_Tables.h diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p2/src/armVCM4P2_Huff_Tables_VLC.c b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p2/src/armVCM4P2_Huff_Tables_VLC.c index 5a77832..5a77832 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p2/src/armVCM4P2_Huff_Tables_VLC.c +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p2/src/armVCM4P2_Huff_Tables_VLC.c diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p2/src/armVCM4P2_Lookup_Tables.c b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p2/src/armVCM4P2_Lookup_Tables.c index e915d3c..e915d3c 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p2/src/armVCM4P2_Lookup_Tables.c +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p2/src/armVCM4P2_Lookup_Tables.c diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p2/src/armVCM4P2_Zigzag_Tables.c b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p2/src/armVCM4P2_Zigzag_Tables.c index 719b434..719b434 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p2/src/armVCM4P2_Zigzag_Tables.c +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p2/src/armVCM4P2_Zigzag_Tables.c diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p2/src/omxVCM4P2_DecodeBlockCoef_Inter.c b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p2/src/omxVCM4P2_DecodeBlockCoef_Inter.c index 95346ad..95346ad 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p2/src/omxVCM4P2_DecodeBlockCoef_Inter.c +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p2/src/omxVCM4P2_DecodeBlockCoef_Inter.c diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p2/src/omxVCM4P2_DecodeBlockCoef_Intra.c b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p2/src/omxVCM4P2_DecodeBlockCoef_Intra.c index 91ec5d2..91ec5d2 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p2/src/omxVCM4P2_DecodeBlockCoef_Intra.c +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p2/src/omxVCM4P2_DecodeBlockCoef_Intra.c diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/src/armVC_Version.c b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/src/armVC_Version.c index 5d93681..5d93681 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/src/armVC_Version.c +++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/src/armVC_Version.c diff --git a/media/libstagefright/codecs/on2/h264dec/source/DecTestBench.c b/media/libstagefright/codecs/on2/h264dec/source/DecTestBench.c index dcf2ef6..dcf2ef6 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/DecTestBench.c +++ b/media/libstagefright/codecs/on2/h264dec/source/DecTestBench.c diff --git a/media/libstagefright/codecs/on2/h264dec/source/EvaluationTestBench.c b/media/libstagefright/codecs/on2/h264dec/source/EvaluationTestBench.c index aadc75f..aadc75f 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/EvaluationTestBench.c +++ b/media/libstagefright/codecs/on2/h264dec/source/EvaluationTestBench.c diff --git a/media/libstagefright/codecs/on2/h264dec/source/H264SwDecApi.c b/media/libstagefright/codecs/on2/h264dec/source/H264SwDecApi.c index 524a3f0..a073dcb 100644 --- a/media/libstagefright/codecs/on2/h264dec/source/H264SwDecApi.c +++ b/media/libstagefright/codecs/on2/h264dec/source/H264SwDecApi.c @@ -36,6 +36,7 @@      1. Include headers  ------------------------------------------------------------------------------*/  #include <stdlib.h> +#include <string.h>  #include "basetype.h"  #include "h264bsd_container.h"  #include "H264SwDecApi.h" diff --git a/media/libstagefright/codecs/on2/h264dec/source/TestBenchMultipleInstance.c b/media/libstagefright/codecs/on2/h264dec/source/TestBenchMultipleInstance.c index 42170d3..42170d3 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/TestBenchMultipleInstance.c +++ b/media/libstagefright/codecs/on2/h264dec/source/TestBenchMultipleInstance.c diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_byte_stream.c b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_byte_stream.c index db77f8c..db77f8c 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_byte_stream.c +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_byte_stream.c diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_byte_stream.h b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_byte_stream.h index 36aec76..36aec76 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_byte_stream.h +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_byte_stream.h diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_cavlc.c b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_cavlc.c index 91d78bd..91d78bd 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_cavlc.c +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_cavlc.c diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_cavlc.h b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_cavlc.h index 80353d3..80353d3 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_cavlc.h +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_cavlc.h diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_cfg.h b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_cfg.h index 2baba5a..2baba5a 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_cfg.h +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_cfg.h diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_conceal.c b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_conceal.c index 7a262ed..7a262ed 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_conceal.c +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_conceal.c diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_conceal.h b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_conceal.h index 3134670..3134670 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_conceal.h +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_conceal.h diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_container.h b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_container.h index 99b74a0..99b74a0 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_container.h +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_container.h diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_deblocking.c b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_deblocking.c index f8c1f76..f8c1f76 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_deblocking.c +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_deblocking.c diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_deblocking.h b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_deblocking.h index 2571dda..2571dda 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_deblocking.h +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_deblocking.h diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_dpb.c b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_dpb.c index 9517d0a..9517d0a 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_dpb.c +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_dpb.c diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_dpb.h b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_dpb.h index 0e25084..0e25084 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_dpb.h +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_dpb.h diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_image.c b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_image.c index 7b92870..7b92870 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_image.c +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_image.c diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_image.h b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_image.h index ed7c18c..ed7c18c 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_image.h +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_image.h diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_inter_prediction.c b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_inter_prediction.c index 2a81c4a..2a81c4a 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_inter_prediction.c +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_inter_prediction.c diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_inter_prediction.h b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_inter_prediction.h index 94dee25..94dee25 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_inter_prediction.h +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_inter_prediction.h diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_intra_prediction.c b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_intra_prediction.c index 52c85e5..52c85e5 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_intra_prediction.c +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_intra_prediction.c diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_intra_prediction.h b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_intra_prediction.h index 4652bd5..4652bd5 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_intra_prediction.h +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_intra_prediction.h diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_macroblock_layer.c b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_macroblock_layer.c index 2b3e7f0..2b3e7f0 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_macroblock_layer.c +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_macroblock_layer.c diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_macroblock_layer.h b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_macroblock_layer.h index 32bc340..32bc340 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_macroblock_layer.h +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_macroblock_layer.h diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_nal_unit.c b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_nal_unit.c index e44c43a..e44c43a 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_nal_unit.c +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_nal_unit.c diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_nal_unit.h b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_nal_unit.h index 38957bf..38957bf 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_nal_unit.h +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_nal_unit.h diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_neighbour.c b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_neighbour.c index ce5eeff..ce5eeff 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_neighbour.c +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_neighbour.c diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_neighbour.h b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_neighbour.h index fce0ad1..fce0ad1 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_neighbour.h +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_neighbour.h diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_pic_order_cnt.c b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_pic_order_cnt.c index fb23352..fb23352 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_pic_order_cnt.c +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_pic_order_cnt.c diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_pic_order_cnt.h b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_pic_order_cnt.h index 19741eb..19741eb 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_pic_order_cnt.h +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_pic_order_cnt.h diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_pic_param_set.c b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_pic_param_set.c index e04dea4..e04dea4 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_pic_param_set.c +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_pic_param_set.c diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_pic_param_set.h b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_pic_param_set.h index 6328638..6328638 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_pic_param_set.h +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_pic_param_set.h diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_reconstruct.c b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_reconstruct.c index b409a06..b409a06 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_reconstruct.c +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_reconstruct.c diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_reconstruct.h b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_reconstruct.h index 5a1a140..5a1a140 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_reconstruct.h +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_reconstruct.h diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_sei.c b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_sei.c index 0756c47..0756c47 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_sei.c +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_sei.c diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_sei.h b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_sei.h index efe543a..efe543a 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_sei.h +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_sei.h diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_seq_param_set.h b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_seq_param_set.h index e18df94..e18df94 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_seq_param_set.h +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_seq_param_set.h diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_slice_data.c b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_slice_data.c index c288d4b..c288d4b 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_slice_data.c +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_slice_data.c diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_slice_data.h b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_slice_data.h index f23d49e..f23d49e 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_slice_data.h +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_slice_data.h diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_slice_group_map.c b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_slice_group_map.c index 7cbb534..7cbb534 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_slice_group_map.c +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_slice_group_map.c diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_slice_group_map.h b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_slice_group_map.h index 4bcb6f2..4bcb6f2 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_slice_group_map.h +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_slice_group_map.h diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_slice_header.c b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_slice_header.c index 23401c6..23401c6 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_slice_header.c +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_slice_header.c diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_slice_header.h b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_slice_header.h index 198898a..198898a 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_slice_header.h +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_slice_header.h diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_storage.c b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_storage.c index 3234754..3234754 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_storage.c +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_storage.c diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_storage.h b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_storage.h index ba3b2da..ba3b2da 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_storage.h +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_storage.h diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_stream.c b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_stream.c index 20d1083..20d1083 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_stream.c +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_stream.c diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_stream.h b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_stream.h index 4404b66..4404b66 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_stream.h +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_stream.h diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_transform.c b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_transform.c index 4eb6dd0..4eb6dd0 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_transform.c +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_transform.c diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_transform.h b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_transform.h index 4f41a23..4f41a23 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_transform.h +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_transform.h diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_util.c b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_util.c index fb97a28..fb97a28 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_util.c +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_util.c diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_util.h b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_util.h index 216ad04..216ad04 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_util.h +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_util.h diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_vlc.c b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_vlc.c index 060f35e..060f35e 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_vlc.c +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_vlc.c diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_vlc.h b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_vlc.h index 4c16773..4c16773 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_vlc.h +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_vlc.h diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_vui.c b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_vui.c index 4a9335a..4a9335a 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_vui.c +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_vui.c diff --git a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_vui.h b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_vui.h index 05d52a4..05d52a4 100755..100644 --- a/media/libstagefright/codecs/on2/h264dec/source/h264bsd_vui.h +++ b/media/libstagefright/codecs/on2/h264dec/source/h264bsd_vui.h diff --git a/media/libstagefright/data/media_codecs_google_audio.xml b/media/libstagefright/data/media_codecs_google_audio.xml index a06684b..b957b0c 100644 --- a/media/libstagefright/data/media_codecs_google_audio.xml +++ b/media/libstagefright/data/media_codecs_google_audio.xml @@ -38,12 +38,12 @@          </MediaCodec>          <MediaCodec name="OMX.google.g711.alaw.decoder" type="audio/g711-alaw">              <Limit name="channel-count" max="1" /> -            <Limit name="sample-rate" ranges="8000" /> +            <Limit name="sample-rate" ranges="8000-48000" />              <Limit name="bitrate" range="64000" />          </MediaCodec>          <MediaCodec name="OMX.google.g711.mlaw.decoder" type="audio/g711-mlaw">              <Limit name="channel-count" max="1" /> -            <Limit name="sample-rate" ranges="8000" /> +            <Limit name="sample-rate" ranges="8000-48000" />              <Limit name="bitrate" range="64000" />          </MediaCodec>          <MediaCodec name="OMX.google.vorbis.decoder" type="audio/vorbis"> diff --git a/media/libstagefright/data/media_codecs_google_video.xml b/media/libstagefright/data/media_codecs_google_video.xml index 7e9fa18..740f96b 100644..100755 --- a/media/libstagefright/data/media_codecs_google_video.xml +++ b/media/libstagefright/data/media_codecs_google_video.xml @@ -16,6 +16,15 @@  <Included>      <Decoders> +        <MediaCodec name="OMX.google.mpeg2.decoder" type="video/mpeg2"> +            <!-- profiles and levels:  ProfileMain : LevelHL --> +            <Limit name="size" min="16x16" max="1920x1088" /> +            <Limit name="alignment" value="2x2" /> +            <Limit name="block-size" value="16x16" /> +            <Limit name="blocks-per-second" range="1-244800" /> +            <Limit name="bitrate" range="1-20000000" /> +            <Feature name="adaptive-playback" /> +        </MediaCodec>          <MediaCodec name="OMX.google.mpeg4.decoder" type="video/mp4v-es">              <!-- profiles and levels:  ProfileSimple : Level3 -->              <Limit name="size" min="2x2" max="352x288" /> @@ -34,12 +43,12 @@              <Feature name="adaptive-playback" />          </MediaCodec>          <MediaCodec name="OMX.google.h264.decoder" type="video/avc"> -            <!-- profiles and levels:  ProfileBaseline : Level51 --> -            <Limit name="size" min="2x2" max="2048x2048" /> +            <!-- profiles and levels:  ProfileHigh : Level41 --> +            <Limit name="size" min="16x16" max="1920x1088" />              <Limit name="alignment" value="2x2" />              <Limit name="block-size" value="16x16" /> -            <Limit name="blocks-per-second" range="1-983040" /> -            <Limit name="bitrate" range="1-40000000" /> +            <Limit name="blocks-per-second" range="1-244800" /> +            <Limit name="bitrate" range="1-12000000" />              <Feature name="adaptive-playback" />          </MediaCodec>          <MediaCodec name="OMX.google.hevc.decoder" type="video/hevc"> @@ -78,12 +87,12 @@              <Limit name="bitrate" range="1-128000" />          </MediaCodec>          <MediaCodec name="OMX.google.h264.encoder" type="video/avc"> -            <!-- profiles and levels:  ProfileBaseline : Level2 --> -            <Limit name="size" min="16x16" max="896x896" /> -            <Limit name="alignment" value="16x16" /> +            <!-- profiles and levels:  ProfileBaseline : Level41 --> +            <Limit name="size" min="16x16" max="1920x1088" /> +            <Limit name="alignment" value="2x2" />              <Limit name="block-size" value="16x16" /> -            <Limit name="blocks-per-second" range="1-11880" /> -            <Limit name="bitrate" range="1-2000000" /> +            <Limit name="blocks-per-second" range="1-244800" /> +            <Limit name="bitrate" range="1-12000000" />          </MediaCodec>          <MediaCodec name="OMX.google.mpeg4.encoder" type="video/mp4v-es">              <!-- profiles and levels:  ProfileCore : Level2 --> diff --git a/media/libstagefright/foundation/ALooperRoster.cpp b/media/libstagefright/foundation/ALooperRoster.cpp index e0dc768..2d57aee 100644 --- a/media/libstagefright/foundation/ALooperRoster.cpp +++ b/media/libstagefright/foundation/ALooperRoster.cpp @@ -17,6 +17,7 @@  //#define LOG_NDEBUG 0  #define LOG_TAG "ALooperRoster"  #include <utils/Log.h> +#include <utils/String8.h>  #include "ALooperRoster.h" @@ -26,6 +27,8 @@  namespace android { +static bool verboseStats = false; +  ALooperRoster::ALooperRoster()      : mNextHandlerID(1),        mNextReplyID(1) { @@ -136,6 +139,17 @@ void ALooperRoster::deliverMessage(const sp<AMessage> &msg) {      }      handler->onMessageReceived(msg); +    handler->mMessageCounter++; + +    if (verboseStats) { +        uint32_t what = msg->what(); +        ssize_t idx = handler->mMessages.indexOfKey(what); +        if (idx < 0) { +            handler->mMessages.add(what, 1); +        } else { +            handler->mMessages.editValueAt(idx)++; +        } +    }  }  sp<ALooper> ALooperRoster::findLooper(ALooper::handler_id handlerID) { @@ -196,4 +210,72 @@ void ALooperRoster::postReply(uint32_t replyID, const sp<AMessage> &reply) {      mRepliesCondition.broadcast();  } +static void makeFourCC(uint32_t fourcc, char *s) { +    s[0] = (fourcc >> 24) & 0xff; +    if (s[0]) { +        s[1] = (fourcc >> 16) & 0xff; +        s[2] = (fourcc >> 8) & 0xff; +        s[3] = fourcc & 0xff; +        s[4] = 0; +    } else { +        sprintf(s, "%u", fourcc); +    } +} + +void ALooperRoster::dump(int fd, const Vector<String16>& args) { +    bool clear = false; +    bool oldVerbose = verboseStats; +    for (size_t i = 0;i < args.size(); i++) { +        if (args[i] == String16("-c")) { +            clear = true; +        } else if (args[i] == String16("-von")) { +            verboseStats = true; +        } else if (args[i] == String16("-voff")) { +            verboseStats = false; +        } +    } +    String8 s; +    if (verboseStats && !oldVerbose) { +        s.append("(verbose stats collection enabled, stats will be cleared)\n"); +    } + +    Mutex::Autolock autoLock(mLock); +    size_t n = mHandlers.size(); +    s.appendFormat(" %zd registered handlers:\n", n); + +    for (size_t i = 0; i < n; i++) { +        s.appendFormat("  %zd: ", i); +        HandlerInfo &info = mHandlers.editValueAt(i); +        sp<ALooper> looper = info.mLooper.promote(); +        if (looper != NULL) { +            s.append(looper->mName.c_str()); +            sp<AHandler> handler = info.mHandler.promote(); +            if (handler != NULL) { +                s.appendFormat(": %u messages processed", handler->mMessageCounter); +                if (verboseStats) { +                    for (size_t j = 0; j < handler->mMessages.size(); j++) { +                        char fourcc[15]; +                        makeFourCC(handler->mMessages.keyAt(j), fourcc); +                        s.appendFormat("\n    %s: %d", +                                fourcc, +                                handler->mMessages.valueAt(j)); +                    } +                } else { +                    handler->mMessages.clear(); +                } +                if (clear || (verboseStats && !oldVerbose)) { +                    handler->mMessageCounter = 0; +                    handler->mMessages.clear(); +                } +            } else { +                s.append(": <stale handler>"); +            } +        } else { +            s.append("<stale>"); +        } +        s.append("\n"); +    } +    write(fd, s.string(), s.size()); +} +  }  // namespace android diff --git a/media/libstagefright/foundation/AMessage.cpp b/media/libstagefright/foundation/AMessage.cpp index 795e8a6..1f46bc9 100644 --- a/media/libstagefright/foundation/AMessage.cpp +++ b/media/libstagefright/foundation/AMessage.cpp @@ -426,19 +426,19 @@ AString AMessage::debugString(int32_t indent) const {      AString tmp;      if (isFourcc(mWhat)) { -        tmp = StringPrintf( +        tmp = AStringPrintf(                  "'%c%c%c%c'",                  (char)(mWhat >> 24),                  (char)((mWhat >> 16) & 0xff),                  (char)((mWhat >> 8) & 0xff),                  (char)(mWhat & 0xff));      } else { -        tmp = StringPrintf("0x%08x", mWhat); +        tmp = AStringPrintf("0x%08x", mWhat);      }      s.append(tmp);      if (mTarget != 0) { -        tmp = StringPrintf(", target = %d", mTarget); +        tmp = AStringPrintf(", target = %d", mTarget);          s.append(tmp);      }      s.append(") = {\n"); @@ -448,37 +448,37 @@ AString AMessage::debugString(int32_t indent) const {          switch (item.mType) {              case kTypeInt32: -                tmp = StringPrintf( +                tmp = AStringPrintf(                          "int32_t %s = %d", item.mName, item.u.int32Value);                  break;              case kTypeInt64: -                tmp = StringPrintf( +                tmp = AStringPrintf(                          "int64_t %s = %lld", item.mName, item.u.int64Value);                  break;              case kTypeSize: -                tmp = StringPrintf( +                tmp = AStringPrintf(                          "size_t %s = %d", item.mName, item.u.sizeValue);                  break;              case kTypeFloat: -                tmp = StringPrintf( +                tmp = AStringPrintf(                          "float %s = %f", item.mName, item.u.floatValue);                  break;              case kTypeDouble: -                tmp = StringPrintf( +                tmp = AStringPrintf(                          "double %s = %f", item.mName, item.u.doubleValue);                  break;              case kTypePointer: -                tmp = StringPrintf( +                tmp = AStringPrintf(                          "void *%s = %p", item.mName, item.u.ptrValue);                  break;              case kTypeString: -                tmp = StringPrintf( +                tmp = AStringPrintf(                          "string %s = \"%s\"",                          item.mName,                          item.u.stringValue->c_str());                  break;              case kTypeObject: -                tmp = StringPrintf( +                tmp = AStringPrintf(                          "RefBase *%s = %p", item.mName, item.u.refValue);                  break;              case kTypeBuffer: @@ -486,18 +486,18 @@ AString AMessage::debugString(int32_t indent) const {                  sp<ABuffer> buffer = static_cast<ABuffer *>(item.u.refValue);                  if (buffer != NULL && buffer->data() != NULL && buffer->size() <= 64) { -                    tmp = StringPrintf("Buffer %s = {\n", item.mName); +                    tmp = AStringPrintf("Buffer %s = {\n", item.mName);                      hexdump(buffer->data(), buffer->size(), indent + 4, &tmp);                      appendIndent(&tmp, indent + 2);                      tmp.append("}");                  } else { -                    tmp = StringPrintf( +                    tmp = AStringPrintf(                              "Buffer *%s = %p", item.mName, buffer.get());                  }                  break;              }              case kTypeMessage: -                tmp = StringPrintf( +                tmp = AStringPrintf(                          "AMessage %s = %s",                          item.mName,                          static_cast<AMessage *>( @@ -505,7 +505,7 @@ AString AMessage::debugString(int32_t indent) const {                                  indent + strlen(item.mName) + 14).c_str());                  break;              case kTypeRect: -                tmp = StringPrintf( +                tmp = AStringPrintf(                          "Rect %s(%d, %d, %d, %d)",                          item.mName,                          item.u.rectValue.mLeft, diff --git a/media/libstagefright/foundation/ANetworkSession.cpp b/media/libstagefright/foundation/ANetworkSession.cpp index 4504c2b..b230400 100644 --- a/media/libstagefright/foundation/ANetworkSession.cpp +++ b/media/libstagefright/foundation/ANetworkSession.cpp @@ -187,7 +187,7 @@ ANetworkSession::Session::Session(          CHECK_GE(res, 0);          in_addr_t addr = ntohl(localAddr.sin_addr.s_addr); -        AString localAddrString = StringPrintf( +        AString localAddrString = AStringPrintf(                  "%d.%d.%d.%d",                  (addr >> 24),                  (addr >> 16) & 0xff, @@ -195,7 +195,7 @@ ANetworkSession::Session::Session(                  addr & 0xff);          addr = ntohl(remoteAddr.sin_addr.s_addr); -        AString remoteAddrString = StringPrintf( +        AString remoteAddrString = AStringPrintf(                  "%d.%d.%d.%d",                  (addr >> 24),                  (addr >> 16) & 0xff, @@ -301,7 +301,7 @@ status_t ANetworkSession::Session::readMore() {                  uint32_t ip = ntohl(remoteAddr.sin_addr.s_addr);                  notify->setString(                          "fromAddr", -                        StringPrintf( +                        AStringPrintf(                              "%u.%u.%u.%u",                              ip >> 24,                              (ip >> 16) & 0xff, diff --git a/media/libstagefright/foundation/AString.cpp b/media/libstagefright/foundation/AString.cpp index 9835ca3..b167543 100644 --- a/media/libstagefright/foundation/AString.cpp +++ b/media/libstagefright/foundation/AString.cpp @@ -366,7 +366,7 @@ status_t AString::writeToParcel(Parcel *parcel) const {      return err;  } -AString StringPrintf(const char *format, ...) { +AString AStringPrintf(const char *format, ...) {      va_list ap;      va_start(ap, format); diff --git a/media/libstagefright/foundation/AWakeLock.cpp b/media/libstagefright/foundation/AWakeLock.cpp index 88c4f6e..d9277ac 100644 --- a/media/libstagefright/foundation/AWakeLock.cpp +++ b/media/libstagefright/foundation/AWakeLock.cpp @@ -36,7 +36,7 @@ AWakeLock::AWakeLock() :  AWakeLock::~AWakeLock() {      if (mPowerManager != NULL) { -        sp<IBinder> binder = mPowerManager->asBinder(); +        sp<IBinder> binder = IInterface::asBinder(mPowerManager);          binder->unlinkToDeath(mDeathRecipient);      }      clearPowerManager(); diff --git a/media/libstagefright/http/MediaHTTP.cpp b/media/libstagefright/http/MediaHTTP.cpp index 2d29913..bb89567 100644 --- a/media/libstagefright/http/MediaHTTP.cpp +++ b/media/libstagefright/http/MediaHTTP.cpp @@ -129,7 +129,7 @@ status_t MediaHTTP::getSize(off64_t *size) {      *size = mCachedSize; -    return *size < 0 ? *size : OK; +    return *size < 0 ? *size : static_cast<status_t>(OK);  }  uint32_t MediaHTTP::flags() { diff --git a/media/libstagefright/httplive/Android.mk b/media/libstagefright/httplive/Android.mk index e8d558c..93b7935 100644 --- a/media/libstagefright/httplive/Android.mk +++ b/media/libstagefright/httplive/Android.mk @@ -10,8 +10,7 @@ LOCAL_SRC_FILES:=               \  LOCAL_C_INCLUDES:= \  	$(TOP)/frameworks/av/media/libstagefright \ -	$(TOP)/frameworks/native/include/media/openmax \ -	$(TOP)/external/openssl/include +	$(TOP)/frameworks/native/include/media/openmax  LOCAL_CFLAGS += -Werror diff --git a/media/libstagefright/httplive/LiveSession.cpp b/media/libstagefright/httplive/LiveSession.cpp index 4355a3c..d0f3bc2 100644 --- a/media/libstagefright/httplive/LiveSession.cpp +++ b/media/libstagefright/httplive/LiveSession.cpp @@ -709,7 +709,6 @@ void LiveSession::onConnect(const sp<AMessage> &msg) {              AString uri;              mPlaylist->itemAt(i, &uri, &meta); -            unsigned long bandwidth;              CHECK(meta->findInt32("bandwidth", (int32_t *)&item.mBandwidth));              if (initialBandwidth == 0) { @@ -847,11 +846,11 @@ ssize_t LiveSession::fetchFile(                  headers.add(                          String8("Range"),                          String8( -                            StringPrintf( +                            AStringPrintf(                                  "bytes=%lld-%s",                                  range_offset,                                  range_length < 0 -                                    ? "" : StringPrintf("%lld", +                                    ? "" : AStringPrintf("%lld",                                              range_offset + range_length - 1).c_str()).c_str()));              }              status_t err = mHTTPDataSource->connect(url, &headers); @@ -990,9 +989,11 @@ sp<M3UParser> LiveSession::fetchPlaylist(      return playlist;  } +#if 0  static double uniformRand() {      return (double)rand() / RAND_MAX;  } +#endif  size_t LiveSession::getBandwidthIndex() {      if (mBandwidthItems.size() == 0) { @@ -1469,7 +1470,6 @@ void LiveSession::onChangeConfiguration3(const sp<AMessage> &msg) {          sp<PlaylistFetcher> fetcher = addFetcher(uri.c_str());          CHECK(fetcher != NULL); -        int32_t latestSeq = -1;          int64_t startTimeUs = -1;          int64_t segmentStartTimeUs = -1ll;          int32_t discontinuitySeq = -1; @@ -1497,7 +1497,6 @@ void LiveSession::onChangeConfiguration3(const sp<AMessage> &msg) {                              ATSParser::DISCONTINUITY_TIME, extra, true);                  } else {                      int32_t type; -                    int64_t srcSegmentStartTimeUs;                      sp<AMessage> meta;                      if (pickTrack) {                          // selecting diff --git a/media/libstagefright/httplive/LiveSession.h b/media/libstagefright/httplive/LiveSession.h index dfb5e59..2d3a25a 100644 --- a/media/libstagefright/httplive/LiveSession.h +++ b/media/libstagefright/httplive/LiveSession.h @@ -33,7 +33,6 @@ struct IMediaHTTPService;  struct LiveDataSource;  struct M3UParser;  struct PlaylistFetcher; -struct Parcel;  struct LiveSession : public AHandler {      enum Flags { diff --git a/media/libstagefright/httplive/PlaylistFetcher.cpp b/media/libstagefright/httplive/PlaylistFetcher.cpp index 00e52ee..1227600 100644 --- a/media/libstagefright/httplive/PlaylistFetcher.cpp +++ b/media/libstagefright/httplive/PlaylistFetcher.cpp @@ -291,7 +291,6 @@ status_t PlaylistFetcher::decryptBuffer(  }  status_t PlaylistFetcher::checkDecryptPadding(const sp<ABuffer> &buffer) { -    status_t err;      AString method;      CHECK(buffer->meta()->findString("cipher-method", &method));      if (method == "NONE") { @@ -1547,7 +1546,7 @@ status_t PlaylistFetcher::extractAndQueueAccessUnits(          CHECK_EQ(bits.getBits(12), 0xfffu);          bits.skipBits(3);  // ID, layer -        bool protection_absent = bits.getBits(1) != 0; +        bool protection_absent __unused = bits.getBits(1) != 0;          unsigned profile = bits.getBits(2);          CHECK_NE(profile, 3u); @@ -1689,7 +1688,7 @@ void PlaylistFetcher::updateDuration() {  }  int64_t PlaylistFetcher::resumeThreshold(const sp<AMessage> &msg) { -    int64_t durationUs, threshold; +    int64_t durationUs;      if (msg->findInt64("durationUs", &durationUs) && durationUs > 0) {          return kNumSkipFrames * durationUs;      } diff --git a/media/libstagefright/httplive/PlaylistFetcher.h b/media/libstagefright/httplive/PlaylistFetcher.h index 67161a9..4e15f85 100644 --- a/media/libstagefright/httplive/PlaylistFetcher.h +++ b/media/libstagefright/httplive/PlaylistFetcher.h @@ -31,7 +31,7 @@ struct DataSource;  struct HTTPBase;  struct LiveDataSource;  struct M3UParser; -struct String8; +class String8;  struct PlaylistFetcher : public AHandler {      static const int64_t kMinBufferedDurationUs; diff --git a/media/libstagefright/id3/ID3.cpp b/media/libstagefright/id3/ID3.cpp index 683c6ef..00f87aa 100644 --- a/media/libstagefright/id3/ID3.cpp +++ b/media/libstagefright/id3/ID3.cpp @@ -636,7 +636,10 @@ void ID3::Iterator::findFrame() {                  | (mParent.mData[mOffset + 4] << 8)                  | mParent.mData[mOffset + 5]; -            mFrameSize += 6; +            if (mFrameSize == 0) { +                return; +            } +            mFrameSize += 6; // add tag id and size field              // Prevent integer overflow in validation              if (SIZE_MAX - mOffset <= mFrameSize) { @@ -818,8 +821,8 @@ ID3::getAlbumArt(size_t *length, String8 *mime) const {              mime->setTo((const char *)&data[1]);              size_t mimeLen = strlen((const char *)&data[1]) + 1; -            uint8_t picType = data[1 + mimeLen];  #if 0 +            uint8_t picType = data[1 + mimeLen];              if (picType != 0x03) {                  // Front Cover Art                  it.next(); diff --git a/media/libstagefright/include/AACEncoder.h b/media/libstagefright/include/AACEncoder.h index 3d5fc60..52beb0e 100644 --- a/media/libstagefright/include/AACEncoder.h +++ b/media/libstagefright/include/AACEncoder.h @@ -25,7 +25,7 @@ struct VO_MEM_OPERATOR;  namespace android { -struct MediaBufferGroup; +class MediaBufferGroup;  class AACEncoder: public MediaSource {      public: diff --git a/media/libstagefright/include/ID3.h b/media/libstagefright/include/ID3.h index e83f3ef..c2c4a6d 100644 --- a/media/libstagefright/include/ID3.h +++ b/media/libstagefright/include/ID3.h @@ -22,8 +22,8 @@  namespace android { -struct DataSource; -struct String8; +class DataSource; +class String8;  struct ID3 {      enum Version { diff --git a/media/libstagefright/include/MPEG2TSExtractor.h b/media/libstagefright/include/MPEG2TSExtractor.h index c5e86a6..db1187d 100644 --- a/media/libstagefright/include/MPEG2TSExtractor.h +++ b/media/libstagefright/include/MPEG2TSExtractor.h @@ -28,7 +28,7 @@ namespace android {  struct AMessage;  struct AnotherPacketSource;  struct ATSParser; -struct DataSource; +class DataSource;  struct MPEG2TSSource;  struct String8; diff --git a/media/libstagefright/include/MidiExtractor.h b/media/libstagefright/include/MidiExtractor.h new file mode 100644 index 0000000..9a2abc0 --- /dev/null +++ b/media/libstagefright/include/MidiExtractor.h @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + *      http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef MIDI_EXTRACTOR_H_ +#define MIDI_EXTRACTOR_H_ + +#include <media/stagefright/DataSource.h> +#include <media/stagefright/MediaExtractor.h> +#include <media/stagefright/MediaBuffer.h> +#include <media/stagefright/MediaBufferGroup.h> +#include <media/MidiIoWrapper.h> +#include <utils/String8.h> +#include <libsonivox/eas.h> + +namespace android { + +class MidiEngine : public RefBase { +public: +    MidiEngine(const sp<DataSource> &dataSource, +            const sp<MetaData> &fileMetadata, +            const sp<MetaData> &trackMetadata); +    ~MidiEngine(); + +    status_t initCheck(); + +    status_t allocateBuffers(); +    status_t releaseBuffers(); +    status_t seekTo(int64_t positionUs); +    MediaBuffer* readBuffer(); +private: +    sp<MidiIoWrapper> mIoWrapper; +    MediaBufferGroup *mGroup; +    EAS_DATA_HANDLE mEasData; +    EAS_HANDLE mEasHandle; +    const S_EAS_LIB_CONFIG* mEasConfig; +    bool mIsInitialized; +}; + +class MidiExtractor : public MediaExtractor { + +public: +    // Extractor assumes ownership of source +    MidiExtractor(const sp<DataSource> &source); + +    virtual size_t countTracks(); +    virtual sp<MediaSource> getTrack(size_t index); +    virtual sp<MetaData> getTrackMetaData(size_t index, uint32_t flags); + +    virtual sp<MetaData> getMetaData(); + +protected: +    virtual ~MidiExtractor(); + +private: +    sp<DataSource> mDataSource; +    status_t mInitCheck; +    sp<MetaData> mFileMetadata; + +    // There is only one track +    sp<MetaData> mTrackMetadata; + +    sp<MidiEngine> mEngine; + +    EAS_DATA_HANDLE     mEasData; +    EAS_HANDLE          mEasHandle; +    EAS_PCM*            mAudioBuffer; +    EAS_I32             mPlayTime; +    EAS_I32             mDuration; +    EAS_STATE           mState; +    EAS_FILE            mFileLocator; + +    MidiExtractor(const MidiExtractor &); +    MidiExtractor &operator=(const MidiExtractor &); + +}; + +bool SniffMidi(const sp<DataSource> &source, String8 *mimeType, +        float *confidence, sp<AMessage> *); + +}  // namespace android + +#endif  // MIDI_EXTRACTOR_H_ diff --git a/media/libstagefright/include/avc_utils.h b/media/libstagefright/include/avc_utils.h index d517320..c270bc1 100644 --- a/media/libstagefright/include/avc_utils.h +++ b/media/libstagefright/include/avc_utils.h @@ -23,7 +23,7 @@  namespace android { -struct ABitReader; +class ABitReader;  enum {      kAVCProfileBaseline      = 0x42, @@ -49,7 +49,7 @@ status_t getNextNALUnit(          const uint8_t **nalStart, size_t *nalSize,          bool startCodeFollows = false); -struct MetaData; +class MetaData;  sp<MetaData> MakeAVCCodecSpecificData(const sp<ABuffer> &accessUnit);  bool IsIDR(const sp<ABuffer> &accessUnit); diff --git a/media/libstagefright/matroska/MatroskaExtractor.cpp b/media/libstagefright/matroska/MatroskaExtractor.cpp index e53319b..c30e807 100644 --- a/media/libstagefright/matroska/MatroskaExtractor.cpp +++ b/media/libstagefright/matroska/MatroskaExtractor.cpp @@ -501,17 +501,6 @@ static unsigned U24_AT(const uint8_t *ptr) {      return ptr[0] << 16 | ptr[1] << 8 | ptr[2];  } -static size_t clz(uint8_t x) { -    size_t numLeadingZeroes = 0; - -    while (!(x & 0x80)) { -        ++numLeadingZeroes; -        x = x << 1; -    } - -    return numLeadingZeroes; -} -  void MatroskaSource::clearPendingFrames() {      while (!mPendingFrames.empty()) {          MediaBuffer *frame = *mPendingFrames.begin(); diff --git a/media/libstagefright/mpeg2ts/ATSParser.cpp b/media/libstagefright/mpeg2ts/ATSParser.cpp index 482ccff..1eae6cf 100644 --- a/media/libstagefright/mpeg2ts/ATSParser.cpp +++ b/media/libstagefright/mpeg2ts/ATSParser.cpp @@ -136,6 +136,7 @@ private:      sp<ABuffer> mBuffer;      sp<AnotherPacketSource> mSource;      bool mPayloadStarted; +    bool mEOSReached;      uint64_t mPrevPTS; @@ -493,6 +494,7 @@ ATSParser::Stream::Stream(        mPCR_PID(PCR_PID),        mExpectedContinuityCounter(-1),        mPayloadStarted(false), +      mEOSReached(false),        mPrevPTS(0),        mQueue(NULL) {      switch (mStreamType) { @@ -692,6 +694,8 @@ void ATSParser::Stream::signalEOS(status_t finalResult) {      if (mSource != NULL) {          mSource->signalEOS(finalResult);      } +    mEOSReached = true; +    flush();  }  status_t ATSParser::Stream::parsePES(ABitReader *br) { @@ -902,6 +906,10 @@ void ATSParser::Stream::onPayloadData(      status_t err = mQueue->appendData(data, size, timeUs); +    if (mEOSReached) { +        mQueue->signalEOS(); +    } +      if (err != OK) {          return;      } diff --git a/media/libstagefright/mpeg2ts/ATSParser.h b/media/libstagefright/mpeg2ts/ATSParser.h index 5d76cbd..75d76dc 100644 --- a/media/libstagefright/mpeg2ts/ATSParser.h +++ b/media/libstagefright/mpeg2ts/ATSParser.h @@ -28,7 +28,7 @@  namespace android { -struct ABitReader; +class ABitReader;  struct ABuffer;  struct MediaSource; diff --git a/media/libstagefright/mpeg2ts/ESQueue.cpp b/media/libstagefright/mpeg2ts/ESQueue.cpp index 2ed3ccc..5527df0 100644 --- a/media/libstagefright/mpeg2ts/ESQueue.cpp +++ b/media/libstagefright/mpeg2ts/ESQueue.cpp @@ -38,7 +38,8 @@ namespace android {  ElementaryStreamQueue::ElementaryStreamQueue(Mode mode, uint32_t flags)      : mMode(mode), -      mFlags(flags) { +      mFlags(flags), +      mEOSReached(false) {  }  sp<MetaData> ElementaryStreamQueue::getFormat() { @@ -63,8 +64,6 @@ static unsigned parseAC3SyncFrame(          const uint8_t *ptr, size_t size, sp<MetaData> *metaData) {      static const unsigned channelCountTable[] = {2, 1, 2, 3, 3, 4, 4, 5};      static const unsigned samplingRateTable[] = {48000, 44100, 32000}; -    static const unsigned rates[] = {32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, -            320, 384, 448, 512, 576, 640};      static const unsigned frameSizeTable[19][3] = {          { 64, 69, 96 }, @@ -89,7 +88,6 @@ static unsigned parseAC3SyncFrame(      };      ABitReader bits(ptr, size); -    unsigned syncStartPos = 0;  // in bytes      if (bits.numBitsLeft() < 16) {          return 0;      } @@ -121,11 +119,11 @@ static unsigned parseAC3SyncFrame(          return 0;      } -    unsigned bsmod = bits.getBits(3); +    unsigned bsmod __unused = bits.getBits(3);      unsigned acmod = bits.getBits(3); -    unsigned cmixlev = 0; -    unsigned surmixlev = 0; -    unsigned dsurmod = 0; +    unsigned cmixlev __unused = 0; +    unsigned surmixlev __unused = 0; +    unsigned dsurmod __unused = 0;      if ((acmod & 1) > 0 && acmod != 1) {          if (bits.numBitsLeft() < 2) { @@ -247,6 +245,11 @@ static bool IsSeeminglyValidMPEGAudioHeader(const uint8_t *ptr, size_t size) {  status_t ElementaryStreamQueue::appendData(          const void *data, size_t size, int64_t timeUs) { + +    if (mEOSReached) { +        ALOGE("appending data after EOS"); +        return ERROR_MALFORMED; +    }      if (mBuffer == NULL || mBuffer->size() == 0) {          switch (mMode) {              case H264: @@ -260,8 +263,8 @@ status_t ElementaryStreamQueue::appendData(                  uint8_t *ptr = (uint8_t *)data;                  ssize_t startOffset = -1; -                for (size_t i = 0; i + 3 < size; ++i) { -                    if (!memcmp("\x00\x00\x00\x01", &ptr[i], 4)) { +                for (size_t i = 0; i + 2 < size; ++i) { +                    if (!memcmp("\x00\x00\x01", &ptr[i], 3)) {                          startOffset = i;                          break;                      } @@ -556,7 +559,7 @@ sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitPCMAudio() {      CHECK_EQ(bits.getBits(8), 0xa0);      unsigned numAUs = bits.getBits(8);      bits.skipBits(8); -    unsigned quantization_word_length = bits.getBits(2); +    unsigned quantization_word_length __unused = bits.getBits(2);      unsigned audio_sampling_frequency = bits.getBits(3);      unsigned num_channels = bits.getBits(3); @@ -634,7 +637,7 @@ sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitAAC() {          CHECK_EQ(bits.getBits(12), 0xfffu);          bits.skipBits(3);  // ID, layer -        bool protection_absent = bits.getBits(1) != 0; +        bool protection_absent __unused = bits.getBits(1) != 0;          if (mFormat == NULL) {              unsigned profile = bits.getBits(2); @@ -683,7 +686,7 @@ sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitAAC() {              return NULL;          } -        size_t headerSize = protection_absent ? 7 : 9; +        size_t headerSize __unused = protection_absent ? 7 : 9;          offset += aac_frame_length;          // TODO: move back to concatenation when codec can support arbitrary input buffers. @@ -1285,4 +1288,17 @@ sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitMPEG4Video() {      return NULL;  } +void ElementaryStreamQueue::signalEOS() { +    if (!mEOSReached) { +        if (mMode == MPEG_VIDEO) { +            const char *theEnd = "\x00\x00\x01\x00"; +            appendData(theEnd, 4, 0); +        } +        mEOSReached = true; +    } else { +        ALOGW("EOS already signaled"); +    } +} + +  }  // namespace android diff --git a/media/libstagefright/mpeg2ts/ESQueue.h b/media/libstagefright/mpeg2ts/ESQueue.h index 7c81ff0..a6d812f 100644 --- a/media/libstagefright/mpeg2ts/ESQueue.h +++ b/media/libstagefright/mpeg2ts/ESQueue.h @@ -26,7 +26,7 @@  namespace android {  struct ABuffer; -struct MetaData; +class MetaData;  struct ElementaryStreamQueue {      enum Mode { @@ -46,6 +46,7 @@ struct ElementaryStreamQueue {      ElementaryStreamQueue(Mode mode, uint32_t flags = 0);      status_t appendData(const void *data, size_t size, int64_t timeUs); +    void signalEOS();      void clear(bool clearFormat);      sp<ABuffer> dequeueAccessUnit(); @@ -60,6 +61,7 @@ private:      Mode mMode;      uint32_t mFlags; +    bool mEOSReached;      sp<ABuffer> mBuffer;      List<RangeInfo> mRangeInfos; diff --git a/media/libstagefright/mpeg2ts/MPEG2TSExtractor.cpp b/media/libstagefright/mpeg2ts/MPEG2TSExtractor.cpp index 35ca118..74cb5d8 100644 --- a/media/libstagefright/mpeg2ts/MPEG2TSExtractor.cpp +++ b/media/libstagefright/mpeg2ts/MPEG2TSExtractor.cpp @@ -85,12 +85,6 @@ status_t MPEG2TSSource::read(          MediaBuffer **out, const ReadOptions *options) {      *out = NULL; -    int64_t seekTimeUs; -    ReadOptions::SeekMode seekMode; -    if (mSeekable && options && options->getSeekTo(&seekTimeUs, &seekMode)) { -        return ERROR_UNSUPPORTED; -    } -      status_t finalResult;      while (!mImpl->hasBufferAvailable(&finalResult)) {          if (finalResult != OK) { @@ -103,6 +97,17 @@ status_t MPEG2TSSource::read(          }      } +    int64_t seekTimeUs; +    ReadOptions::SeekMode seekMode; +    if (mSeekable && options && options->getSeekTo(&seekTimeUs, &seekMode)) { +        // A seek was requested, but we don't actually support seeking and so can only "seek" to +        // the current position +        int64_t nextBufTimeUs; +        if (mImpl->nextBufferTime(&nextBufTimeUs) != OK || seekTimeUs != nextBufTimeUs) { +            return ERROR_UNSUPPORTED; +        } +    } +      return mImpl->read(out, options);  } @@ -159,7 +164,6 @@ void MPEG2TSExtractor::init() {      int numPacketsParsed = 0;      while (feedMore() == OK) { -        ATSParser::SourceType type;          if (haveAudio && haveVideo) {              break;          } @@ -200,6 +204,9 @@ status_t MPEG2TSExtractor::feedMore() {      ssize_t n = mDataSource->readAt(mOffset, packet, kTSPacketSize);      if (n < (ssize_t)kTSPacketSize) { +        if (n >= 0) { +            mParser->signalEOS(ERROR_END_OF_STREAM); +        }          return (n < 0) ? (status_t)n : ERROR_END_OF_STREAM;      } diff --git a/media/libstagefright/omx/GraphicBufferSource.cpp b/media/libstagefright/omx/GraphicBufferSource.cpp index 44c7edc..2945644 100644 --- a/media/libstagefright/omx/GraphicBufferSource.cpp +++ b/media/libstagefright/omx/GraphicBufferSource.cpp @@ -28,6 +28,7 @@  #include <media/hardware/MetadataBufferType.h>  #include <ui/GraphicBuffer.h> +#include <gui/BufferItem.h>  #include <inttypes.h> @@ -359,7 +360,7 @@ void GraphicBufferSource::suspend(bool suspend) {          mSuspended = true;          while (mNumFramesAvailable > 0) { -            BufferQueue::BufferItem item; +            BufferItem item;              status_t err = mConsumer->acquireBuffer(&item, 0);              if (err == BufferQueue::NO_BUFFER_AVAILABLE) { @@ -409,7 +410,7 @@ bool GraphicBufferSource::fillCodecBuffer_l() {      ALOGV("fillCodecBuffer_l: acquiring buffer, avail=%zu",              mNumFramesAvailable); -    BufferQueue::BufferItem item; +    BufferItem item;      status_t err = mConsumer->acquireBuffer(&item, 0);      if (err == BufferQueue::NO_BUFFER_AVAILABLE) {          // shouldn't happen @@ -492,7 +493,7 @@ bool GraphicBufferSource::repeatLatestSubmittedBuffer_l() {          return false;      } -    BufferQueue::BufferItem item; +    BufferItem item;      item.mBuf = mLatestSubmittedBufferId;      item.mFrameNumber = mLatestSubmittedBufferFrameNum;      item.mTimestamp = mRepeatLastFrameTimestamp; @@ -523,7 +524,7 @@ bool GraphicBufferSource::repeatLatestSubmittedBuffer_l() {  }  void GraphicBufferSource::setLatestSubmittedBuffer_l( -        const BufferQueue::BufferItem &item) { +        const BufferItem &item) {      ALOGV("setLatestSubmittedBuffer_l");      if (mLatestSubmittedBufferId >= 0) { @@ -579,7 +580,7 @@ status_t GraphicBufferSource::signalEndOfInputStream() {      return OK;  } -int64_t GraphicBufferSource::getTimestamp(const BufferQueue::BufferItem &item) { +int64_t GraphicBufferSource::getTimestamp(const BufferItem &item) {      int64_t timeUs = item.mTimestamp / 1000;      if (mTimePerCaptureUs > 0ll) { @@ -640,7 +641,7 @@ int64_t GraphicBufferSource::getTimestamp(const BufferQueue::BufferItem &item) {  }  status_t GraphicBufferSource::submitBuffer_l( -        const BufferQueue::BufferItem &item, int cbi) { +        const BufferItem &item, int cbi) {      ALOGV("submitBuffer_l cbi=%d", cbi);      int64_t timeUs = getTimestamp(item); @@ -766,7 +767,7 @@ void GraphicBufferSource::onFrameAvailable(const BufferItem& /*item*/) {              ALOGV("onFrameAvailable: suspended, ignoring frame");          } -        BufferQueue::BufferItem item; +        BufferItem item;          status_t err = mConsumer->acquireBuffer(&item, 0);          if (err == OK) {              // If this is the first time we're seeing this buffer, add it to our diff --git a/media/libstagefright/omx/GraphicBufferSource.h b/media/libstagefright/omx/GraphicBufferSource.h index c8e3775..401bbc3 100644 --- a/media/libstagefright/omx/GraphicBufferSource.h +++ b/media/libstagefright/omx/GraphicBufferSource.h @@ -187,15 +187,15 @@ private:      // Marks the mCodecBuffers entry as in-use, copies the GraphicBuffer      // reference into the codec buffer, and submits the data to the codec. -    status_t submitBuffer_l(const BufferQueue::BufferItem &item, int cbi); +    status_t submitBuffer_l(const BufferItem &item, int cbi);      // Submits an empty buffer, with the EOS flag set.   Returns without      // doing anything if we don't have a codec buffer available.      void submitEndOfInputStream_l(); -    void setLatestSubmittedBuffer_l(const BufferQueue::BufferItem &item); +    void setLatestSubmittedBuffer_l(const BufferItem &item);      bool repeatLatestSubmittedBuffer_l(); -    int64_t getTimestamp(const BufferQueue::BufferItem &item); +    int64_t getTimestamp(const BufferItem &item);      // Lock, covers all member variables.      mutable Mutex mMutex; diff --git a/media/libstagefright/omx/OMX.cpp b/media/libstagefright/omx/OMX.cpp index 6d46eee..f8d38ff 100644 --- a/media/libstagefright/omx/OMX.cpp +++ b/media/libstagefright/omx/OMX.cpp @@ -245,8 +245,8 @@ status_t OMX::allocateNode(      instance->setHandle(*node, handle); -    mLiveNodes.add(observer->asBinder(), instance); -    observer->asBinder()->linkToDeath(this); +    mLiveNodes.add(IInterface::asBinder(observer), instance); +    IInterface::asBinder(observer)->linkToDeath(this);      return OK;  } @@ -256,7 +256,7 @@ status_t OMX::freeNode(node_id node) {      {          Mutex::Autolock autoLock(mLock); -        ssize_t index = mLiveNodes.indexOfKey(instance->observer()->asBinder()); +        ssize_t index = mLiveNodes.indexOfKey(IInterface::asBinder(instance->observer()));          if (index < 0) {              // This could conceivably happen if the observer dies at roughly the              // same time that a client attempts to free the node explicitly. @@ -265,7 +265,7 @@ status_t OMX::freeNode(node_id node) {          mLiveNodes.removeItemsAt(index);      } -    instance->observer()->asBinder()->unlinkToDeath(this); +    IInterface::asBinder(instance->observer())->unlinkToDeath(this);      status_t err = instance->freeNode(mMaster); diff --git a/media/libstagefright/omx/OMXNodeInstance.cpp b/media/libstagefright/omx/OMXNodeInstance.cpp index a2318b6..63c8f54 100644 --- a/media/libstagefright/omx/OMXNodeInstance.cpp +++ b/media/libstagefright/omx/OMXNodeInstance.cpp @@ -158,7 +158,7 @@ static inline const char *portString(OMX_U32 portIndex) {      switch (portIndex) {          case kPortIndexInput:  return "Input";          case kPortIndexOutput: return "Output"; -        case ~0:               return "All"; +        case ~0U:              return "All";          default:               return "port";      }  } diff --git a/media/libstagefright/omx/SoftOMXPlugin.cpp b/media/libstagefright/omx/SoftOMXPlugin.cpp index 9b6958a..0f9c00c 100644..100755 --- a/media/libstagefright/omx/SoftOMXPlugin.cpp +++ b/media/libstagefright/omx/SoftOMXPlugin.cpp @@ -40,11 +40,12 @@ static const struct {      { "OMX.google.amrnb.encoder", "amrnbenc", "audio_encoder.amrnb" },      { "OMX.google.amrwb.decoder", "amrdec", "audio_decoder.amrwb" },      { "OMX.google.amrwb.encoder", "amrwbenc", "audio_encoder.amrwb" }, -    { "OMX.google.h264.decoder", "h264dec", "video_decoder.avc" }, -    { "OMX.google.h264.encoder", "h264enc", "video_encoder.avc" }, +    { "OMX.google.h264.decoder", "avcdec", "video_decoder.avc" }, +    { "OMX.google.h264.encoder", "avcenc", "video_encoder.avc" },      { "OMX.google.hevc.decoder", "hevcdec", "video_decoder.hevc" },      { "OMX.google.g711.alaw.decoder", "g711dec", "audio_decoder.g711alaw" },      { "OMX.google.g711.mlaw.decoder", "g711dec", "audio_decoder.g711mlaw" }, +    { "OMX.google.mpeg2.decoder", "mpeg2dec", "video_decoder.mpeg2" },      { "OMX.google.h263.decoder", "mpeg4dec", "video_decoder.h263" },      { "OMX.google.h263.encoder", "mpeg4enc", "video_encoder.h263" },      { "OMX.google.mpeg4.decoder", "mpeg4dec", "video_decoder.mpeg4" }, @@ -85,7 +86,7 @@ OMX_ERRORTYPE SoftOMXPlugin::makeComponentInstance(          void *libHandle = dlopen(libName.c_str(), RTLD_NOW);          if (libHandle == NULL) { -            ALOGE("unable to dlopen %s", libName.c_str()); +            ALOGE("unable to dlopen %s: %s", libName.c_str(), dlerror());              return OMX_ErrorComponentNotFound;          } diff --git a/media/libstagefright/omx/SoftVideoEncoderOMXComponent.cpp b/media/libstagefright/omx/SoftVideoEncoderOMXComponent.cpp index b2d3623..d4d6217 100644 --- a/media/libstagefright/omx/SoftVideoEncoderOMXComponent.cpp +++ b/media/libstagefright/omx/SoftVideoEncoderOMXComponent.cpp @@ -500,12 +500,12 @@ const uint8_t *SoftVideoEncoderOMXComponent::extractGraphicBuffer(      size_t srcStride;      size_t srcVStride;      if (usingGraphicBuffer) { -        if (srcSize < 4 + sizeof(GraphicBuffer *)) { -            ALOGE("Metadata is too small (%zu vs %zu)", srcSize, 4 + sizeof(GraphicBuffer *)); +        if (srcSize < sizeof(OMX_U32) + sizeof(GraphicBuffer *)) { +            ALOGE("Metadata is too small (%zu vs %zu)", srcSize, sizeof(OMX_U32) + sizeof(GraphicBuffer *));              return NULL;          } -        GraphicBuffer *buffer = *(GraphicBuffer **)(src + 4); +        GraphicBuffer *buffer = *(GraphicBuffer **)(src + sizeof(OMX_U32));          handle = buffer->handle;          format = buffer->format;          srcStride = buffer->stride; @@ -519,12 +519,12 @@ const uint8_t *SoftVideoEncoderOMXComponent::extractGraphicBuffer(      } else {          // TODO: remove this part.  Check if anyone uses this. -        if (srcSize < 4 + sizeof(buffer_handle_t)) { -            ALOGE("Metadata is too small (%zu vs %zu)", srcSize, 4 + sizeof(buffer_handle_t)); +        if (srcSize < sizeof(OMX_U32) + sizeof(buffer_handle_t)) { +            ALOGE("Metadata is too small (%zu vs %zu)", srcSize, sizeof(OMX_U32) + sizeof(buffer_handle_t));              return NULL;          } -        handle = *(buffer_handle_t *)(src + 4); +        handle = *(buffer_handle_t *)(src + sizeof(OMX_U32));          // assume HAL_PIXEL_FORMAT_RGBA_8888          // there is no way to get the src stride without the graphic buffer          format = HAL_PIXEL_FORMAT_RGBA_8888; diff --git a/media/libstagefright/omx/tests/OMXHarness.cpp b/media/libstagefright/omx/tests/OMXHarness.cpp index f4dfd6b..67ff145 100644 --- a/media/libstagefright/omx/tests/OMXHarness.cpp +++ b/media/libstagefright/omx/tests/OMXHarness.cpp @@ -253,29 +253,6 @@ static sp<MediaExtractor> CreateExtractorFromURI(const char *uri) {      return MediaExtractor::Create(source);  } -static sp<MediaSource> MakeSource( -        const char *uri, -        const char *mimeType) { -    sp<MediaExtractor> extractor = CreateExtractorFromURI(uri); - -    if (extractor == NULL) { -        return NULL; -    } - -    for (size_t i = 0; i < extractor->countTracks(); ++i) { -        sp<MetaData> meta = extractor->getTrackMetaData(i); - -        const char *trackMIME; -        CHECK(meta->findCString(kKeyMIMEType, &trackMIME)); - -        if (!strcasecmp(trackMIME, mimeType)) { -            return extractor->getTrack(i); -        } -    } - -    return NULL; -} -  status_t Harness::testStateTransitions(          const char *componentName, const char *componentRole) {      if (strncmp(componentName, "OMX.", 4)) { diff --git a/media/libstagefright/rtsp/AAMRAssembler.cpp b/media/libstagefright/rtsp/AAMRAssembler.cpp index 9e8725a..bb2a238 100644 --- a/media/libstagefright/rtsp/AAMRAssembler.cpp +++ b/media/libstagefright/rtsp/AAMRAssembler.cpp @@ -143,8 +143,8 @@ ARTPAssembler::AssemblyStatus AAMRAssembler::addPacket(          return MALFORMED_PACKET;      } -    unsigned payloadHeader = buffer->data()[0]; -    unsigned CMR = payloadHeader >> 4; +    unsigned payloadHeader __unused = buffer->data()[0]; +    unsigned CMR __unused = payloadHeader >> 4;      Vector<uint8_t> tableOfContents; diff --git a/media/libstagefright/rtsp/AMPEG2TSAssembler.h b/media/libstagefright/rtsp/AMPEG2TSAssembler.h index 712e18e..f39c2b5 100644 --- a/media/libstagefright/rtsp/AMPEG2TSAssembler.h +++ b/media/libstagefright/rtsp/AMPEG2TSAssembler.h @@ -24,7 +24,7 @@ namespace android {  struct AMessage;  struct AString; -struct MetaData; +class MetaData;  struct AMPEG2TSAssembler : public ARTPAssembler {      AMPEG2TSAssembler( diff --git a/media/libstagefright/rtsp/AMPEG4AudioAssembler.cpp b/media/libstagefright/rtsp/AMPEG4AudioAssembler.cpp index 851805f..a1a6576 100644 --- a/media/libstagefright/rtsp/AMPEG4AudioAssembler.cpp +++ b/media/libstagefright/rtsp/AMPEG4AudioAssembler.cpp @@ -108,7 +108,7 @@ static status_t parseAudioObjectType(  static status_t parseGASpecificConfig(          ABitReader *bits,          unsigned audioObjectType, unsigned channelConfiguration) { -    unsigned frameLengthFlag = bits->getBits(1); +    unsigned frameLengthFlag __unused = bits->getBits(1);      unsigned dependsOnCoreCoder = bits->getBits(1);      if (dependsOnCoreCoder) {          /* unsigned coreCoderDelay = */bits->getBits(1); @@ -217,7 +217,7 @@ static status_t parseAudioSpecificConfig(ABitReader *bits, sp<ABuffer> *asc) {                  // Apparently an extension is always considered an even                  // multiple of 8 bits long. -                ALOGI("Skipping %d bits after sync extension", +                ALOGI("Skipping %zu bits after sync extension",                       8 - (numBitsInExtension & 7));                  bits->skipBits(8 - (numBitsInExtension & 7)); @@ -423,7 +423,7 @@ sp<ABuffer> AMPEG4AudioAssembler::removeLATMFraming(const sp<ABuffer> &buffer) {      }      if (offset < buffer->size()) { -        ALOGI("ignoring %d bytes of trailing data", buffer->size() - offset); +        ALOGI("ignoring %zu bytes of trailing data", buffer->size() - offset);      }      CHECK_LE(offset, buffer->size()); diff --git a/media/libstagefright/rtsp/AMPEG4ElementaryAssembler.cpp b/media/libstagefright/rtsp/AMPEG4ElementaryAssembler.cpp index 7eb6542..156004c 100644 --- a/media/libstagefright/rtsp/AMPEG4ElementaryAssembler.cpp +++ b/media/libstagefright/rtsp/AMPEG4ElementaryAssembler.cpp @@ -360,7 +360,7 @@ ARTPAssembler::AssemblyStatus AMPEG4ElementaryAssembler::addPacket(          }          if (offset != buffer->size()) { -            ALOGW("potentially malformed packet (offset %d, size %d)", +            ALOGW("potentially malformed packet (offset %zu, size %zu)",                      offset, buffer->size());          }      } diff --git a/media/libstagefright/rtsp/APacketSource.cpp b/media/libstagefright/rtsp/APacketSource.cpp index 09f52bc..cfafaa7 100644 --- a/media/libstagefright/rtsp/APacketSource.cpp +++ b/media/libstagefright/rtsp/APacketSource.cpp @@ -279,8 +279,6 @@ sp<ABuffer> MakeAACCodecSpecificData2(const char *params) {      // be encoded.      CHECK_LT(20 + config->size(), 128u); -    const uint8_t *data = config->data(); -      static const uint8_t kStaticESDS[] = {          0x03, 22,          0x00, 0x00,     // ES_ID diff --git a/media/libstagefright/rtsp/ARTPConnection.cpp b/media/libstagefright/rtsp/ARTPConnection.cpp index 372fbe9..a6bd824 100644 --- a/media/libstagefright/rtsp/ARTPConnection.cpp +++ b/media/libstagefright/rtsp/ARTPConnection.cpp @@ -664,11 +664,10 @@ void ARTPConnection::onInjectPacket(const sp<AMessage> &msg) {      StreamInfo *s = &*it; -    status_t err;      if (it->mRTPSocket == index) { -        err = parseRTP(s, buffer); +        parseRTP(s, buffer);      } else { -        err = parseRTCP(s, buffer); +        parseRTCP(s, buffer);      }  } diff --git a/media/libstagefright/rtsp/ARTPWriter.cpp b/media/libstagefright/rtsp/ARTPWriter.cpp index 793d116..e1607bf 100644 --- a/media/libstagefright/rtsp/ARTPWriter.cpp +++ b/media/libstagefright/rtsp/ARTPWriter.cpp @@ -461,7 +461,7 @@ void ARTPWriter::dumpSessionDesc() {          sdp.append("m=audio ");      } -    sdp.append(StringPrintf("%d", ntohs(mRTPAddr.sin_port))); +    sdp.append(AStringPrintf("%d", ntohs(mRTPAddr.sin_port)));      sdp.append(            " RTP/AVP " PT_STR "\r\n"            "b=AS 320000\r\n" @@ -480,7 +480,7 @@ void ARTPWriter::dumpSessionDesc() {          CHECK_EQ(sampleRate, (mMode == AMR_NB) ? 8000 : 16000);          sdp.append(mMode == AMR_NB ? "AMR" : "AMR-WB"); -        sdp.append(StringPrintf("/%d/%d", sampleRate, numChannels)); +        sdp.append(AStringPrintf("/%d/%d", sampleRate, numChannels));      } else {          TRESPASS();      } @@ -543,7 +543,7 @@ void ARTPWriter::makeH264SPropParamSets(MediaBuffer *buffer) {      CHECK_EQ((unsigned)data[0], 0x67u);      mProfileLevel = -        StringPrintf("%02X%02X%02X", data[1], data[2], data[3]); +        AStringPrintf("%02X%02X%02X", data[1], data[2], data[3]);      encodeBase64(data, startCodePos, &mSeqParamSet); diff --git a/media/libstagefright/rtsp/ARTSPConnection.cpp b/media/libstagefright/rtsp/ARTSPConnection.cpp index f25539c..60b3aaf 100644 --- a/media/libstagefright/rtsp/ARTSPConnection.cpp +++ b/media/libstagefright/rtsp/ARTSPConnection.cpp @@ -42,7 +42,7 @@ const int64_t ARTSPConnection::kSelectTimeoutUs = 1000ll;  // static  const AString ARTSPConnection::sUserAgent = -    StringPrintf("User-Agent: %s\r\n", MakeUserAgent().c_str()); +    AStringPrintf("User-Agent: %s\r\n", MakeUserAgent().c_str());  ARTSPConnection::ARTSPConnection(bool uidValid, uid_t uid)      : mUIDValid(uidValid), diff --git a/media/libstagefright/rtsp/ARawAudioAssembler.h b/media/libstagefright/rtsp/ARawAudioAssembler.h index ed7af08..bc1dea6 100644 --- a/media/libstagefright/rtsp/ARawAudioAssembler.h +++ b/media/libstagefright/rtsp/ARawAudioAssembler.h @@ -24,7 +24,7 @@ namespace android {  struct AMessage;  struct AString; -struct MetaData; +class MetaData;  struct ARawAudioAssembler : public ARTPAssembler {      ARawAudioAssembler( diff --git a/media/libstagefright/rtsp/Android.mk b/media/libstagefright/rtsp/Android.mk index d60dc2f..9fedb71 100644 --- a/media/libstagefright/rtsp/Android.mk +++ b/media/libstagefright/rtsp/Android.mk @@ -19,10 +19,11 @@ LOCAL_SRC_FILES:=       \          ASessionDescription.cpp     \          SDPLoader.cpp               \ +LOCAL_SHARED_LIBRARIES += libcrypto +  LOCAL_C_INCLUDES:= \  	$(TOP)/frameworks/av/media/libstagefright \ -	$(TOP)/frameworks/native/include/media/openmax \ -	$(TOP)/external/openssl/include +	$(TOP)/frameworks/native/include/media/openmax  LOCAL_MODULE:= libstagefright_rtsp diff --git a/media/libstagefright/rtsp/MyHandler.h b/media/libstagefright/rtsp/MyHandler.h index 423a420..3bf489b 100644 --- a/media/libstagefright/rtsp/MyHandler.h +++ b/media/libstagefright/rtsp/MyHandler.h @@ -156,7 +156,7 @@ struct MyHandler : public AHandler {              mSessionURL.append("rtsp://");              mSessionURL.append(host);              mSessionURL.append(":"); -            mSessionURL.append(StringPrintf("%u", port)); +            mSessionURL.append(AStringPrintf("%u", port));              mSessionURL.append(path);              ALOGV("rewritten session url: '%s'", mSessionURL.c_str()); @@ -508,7 +508,7 @@ struct MyHandler : public AHandler {                              mSessionURL.append("rtsp://");                              mSessionURL.append(host);                              mSessionURL.append(":"); -                            mSessionURL.append(StringPrintf("%u", port)); +                            mSessionURL.append(AStringPrintf("%u", port));                              mSessionURL.append(path);                              ALOGI("rewritten session url: '%s'", mSessionURL.c_str()); @@ -1238,7 +1238,7 @@ struct MyHandler : public AHandler {                  request.append("\r\n");                  request.append( -                        StringPrintf( +                        AStringPrintf(                              "Range: npt=%lld-\r\n", timeUs / 1000000ll));                  request.append("\r\n"); diff --git a/media/libstagefright/rtsp/SDPLoader.cpp b/media/libstagefright/rtsp/SDPLoader.cpp index 424badf..a24eb69 100644 --- a/media/libstagefright/rtsp/SDPLoader.cpp +++ b/media/libstagefright/rtsp/SDPLoader.cpp @@ -105,7 +105,7 @@ void SDPLoader::onLoad(const sp<AMessage> &msg) {          headers = NULL;      } -    off64_t sdpSize; +    off64_t sdpSize = 0;      if (err == OK && !mCancelled) {          err = mHTTPDataSource->getSize(&sdpSize); diff --git a/media/libstagefright/tests/Android.mk b/media/libstagefright/tests/Android.mk index 99b480ad..8d6ff5b 100644 --- a/media/libstagefright/tests/Android.mk +++ b/media/libstagefright/tests/Android.mk @@ -1,8 +1,7 @@  # Build the unit tests.  LOCAL_PATH:= $(call my-dir)  include $(CLEAR_VARS) - -ifneq ($(TARGET_SIMULATOR),true) +LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk  LOCAL_MODULE := SurfaceMediaSource_test @@ -22,33 +21,23 @@ LOCAL_SHARED_LIBRARIES := \  	libstagefright \  	libstagefright_foundation \  	libstagefright_omx \ -	libstlport \  	libsync \  	libui \  	libutils \  	liblog -LOCAL_STATIC_LIBRARIES := \ -	libgtest \ -	libgtest_main \ -  LOCAL_C_INCLUDES := \ -	bionic \ -	bionic/libstdc++/include \ -	external/gtest/include \ -	external/stlport/stlport \  	frameworks/av/media/libstagefright \  	frameworks/av/media/libstagefright/include \  	$(TOP)/frameworks/native/include/media/openmax \  LOCAL_32_BIT_ONLY := true -include $(BUILD_EXECUTABLE) - -endif +include $(BUILD_NATIVE_TEST)  include $(CLEAR_VARS) +LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk  LOCAL_MODULE := Utils_test @@ -64,23 +53,14 @@ LOCAL_SHARED_LIBRARIES := \  	libstagefright \  	libstagefright_foundation \  	libstagefright_omx \ -	libstlport \ - -LOCAL_STATIC_LIBRARIES := \ -	libgtest \ -	libgtest_main \  LOCAL_C_INCLUDES := \ -	bionic \ -	bionic/libstdc++/include \ -	external/gtest/include \ -	external/stlport/stlport \  	frameworks/av/include \  	frameworks/av/media/libstagefright \  	frameworks/av/media/libstagefright/include \  	$(TOP)/frameworks/native/include/media/openmax \ -include $(BUILD_EXECUTABLE) +include $(BUILD_NATIVE_TEST)  # Include subdirectory makefiles  # ============================================================ diff --git a/media/libstagefright/timedtext/TimedTextDriver.cpp b/media/libstagefright/timedtext/TimedTextDriver.cpp index 71aa21e..55a9803 100644 --- a/media/libstagefright/timedtext/TimedTextDriver.cpp +++ b/media/libstagefright/timedtext/TimedTextDriver.cpp @@ -133,7 +133,7 @@ status_t TimedTextDriver::selectTrack(size_t index) {              }              mPlayer->start();              break; -        defaut: +        default:              TRESPASS();      }      return ret; @@ -181,7 +181,7 @@ status_t TimedTextDriver::seekToAsync(int64_t timeUs) {          case PLAYING:              mPlayer->seekToAsync(timeUs);              return OK; -        defaut: +        default:              TRESPASS();      }      return UNKNOWN_ERROR; diff --git a/media/libstagefright/timedtext/TimedTextPlayer.h b/media/libstagefright/timedtext/TimedTextPlayer.h index ec8ed25..9cb49ec 100644 --- a/media/libstagefright/timedtext/TimedTextPlayer.h +++ b/media/libstagefright/timedtext/TimedTextPlayer.h @@ -27,7 +27,7 @@  namespace android { -class AMessage; +struct AMessage;  class MediaPlayerBase;  class TimedTextDriver;  class TimedTextSource; diff --git a/media/libstagefright/timedtext/TimedTextSRTSource.h b/media/libstagefright/timedtext/TimedTextSRTSource.h index 598c200..232675e 100644 --- a/media/libstagefright/timedtext/TimedTextSRTSource.h +++ b/media/libstagefright/timedtext/TimedTextSRTSource.h @@ -25,7 +25,7 @@  namespace android { -class AString; +struct AString;  class DataSource;  class MediaBuffer;  class Parcel; diff --git a/media/libstagefright/timedtext/test/TimedTextSRTSource_test.cpp b/media/libstagefright/timedtext/test/TimedTextSRTSource_test.cpp index 40e93c7..3a06d61 100644 --- a/media/libstagefright/timedtext/test/TimedTextSRTSource_test.cpp +++ b/media/libstagefright/timedtext/test/TimedTextSRTSource_test.cpp @@ -120,26 +120,26 @@ TEST_F(TimedTextSRTSourceTest, readAll) {          err = mSource->read(&startTimeUs, &endTimeUs, &parcel);          EXPECT_EQ(OK, err);          CheckStartTimeMs(parcel, i * kSecToMsec); -        subtitle = StringPrintf("%d\n\n", i); +        subtitle = AStringPrintf("%d\n\n", i);          CheckDataEquals(parcel, subtitle.c_str());      }      // read edge cases      err = mSource->read(&startTimeUs, &endTimeUs, &parcel);      EXPECT_EQ(OK, err);      CheckStartTimeMs(parcel, 5500); -    subtitle = StringPrintf("6\n\n"); +    subtitle = AStringPrintf("6\n\n");      CheckDataEquals(parcel, subtitle.c_str());      err = mSource->read(&startTimeUs, &endTimeUs, &parcel);      EXPECT_EQ(OK, err);      CheckStartTimeMs(parcel, 5800); -    subtitle = StringPrintf("7\n\n"); +    subtitle = AStringPrintf("7\n\n");      CheckDataEquals(parcel, subtitle.c_str());      err = mSource->read(&startTimeUs, &endTimeUs, &parcel);      EXPECT_EQ(OK, err);      CheckStartTimeMs(parcel, 6000); -    subtitle = StringPrintf("8\n\n"); +    subtitle = AStringPrintf("8\n\n");      CheckDataEquals(parcel, subtitle.c_str());      err = mSource->read(&startTimeUs, &endTimeUs, &parcel); @@ -202,21 +202,21 @@ TEST_F(TimedTextSRTSourceTest, checkEdgeCase) {      err = mSource->read(&startTimeUs, &endTimeUs, &parcel, &options);      EXPECT_EQ(OK, err);      EXPECT_EQ(5500 * kMsecToUsec, startTimeUs); -    subtitle = StringPrintf("6\n\n"); +    subtitle = AStringPrintf("6\n\n");      CheckDataEquals(parcel, subtitle.c_str());      options.setSeekTo(5800 * kMsecToUsec, MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC);      err = mSource->read(&startTimeUs, &endTimeUs, &parcel, &options);      EXPECT_EQ(OK, err);      EXPECT_EQ(5800 * kMsecToUsec, startTimeUs); -    subtitle = StringPrintf("7\n\n"); +    subtitle = AStringPrintf("7\n\n");      CheckDataEquals(parcel, subtitle.c_str());      options.setSeekTo(6000 * kMsecToUsec, MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC);      err = mSource->read(&startTimeUs, &endTimeUs, &parcel, &options);      EXPECT_EQ(OK, err);      EXPECT_EQ(6000 * kMsecToUsec, startTimeUs); -    subtitle = StringPrintf("8\n\n"); +    subtitle = AStringPrintf("8\n\n");      CheckDataEquals(parcel, subtitle.c_str());  } diff --git a/media/libstagefright/webm/WebmWriter.cpp b/media/libstagefright/webm/WebmWriter.cpp index 03cf92a..069961b 100644 --- a/media/libstagefright/webm/WebmWriter.cpp +++ b/media/libstagefright/webm/WebmWriter.cpp @@ -333,7 +333,6 @@ status_t WebmWriter::reset() {      serializeCodedUnsigned(segmentSizeCoded, bary);      ::write(mFd, bary, sizeOf(kMkvUnknownLength)); -    uint64_t size;      uint64_t durationOffset = mInfoOffset + sizeOf(kMkvInfo) + sizeOf(mInfoSize)          + sizeOf(kMkvSegmentDuration) + sizeOf(sizeof(double));      sp<WebmElement> duration = new WebmFloat( diff --git a/media/libstagefright/wifi-display/VideoFormats.cpp b/media/libstagefright/wifi-display/VideoFormats.cpp index 04e02c1..2f4af5b 100644 --- a/media/libstagefright/wifi-display/VideoFormats.cpp +++ b/media/libstagefright/wifi-display/VideoFormats.cpp @@ -435,7 +435,7 @@ AString VideoFormats::getFormatSpec(bool forM4Message) const {      //   max-hres (none or 2 byte)      //   max-vres (none or 2 byte) -    return StringPrintf( +    return AStringPrintf(              "%02x 00 %02x %02x %08x %08x %08x 00 0000 0000 00 none none",              forM4Message ? 0x00 : ((mNativeIndex << 3) | mNativeType),              mConfigs[mNativeType][mNativeIndex].profile, diff --git a/media/libstagefright/wifi-display/source/TSPacketizer.cpp b/media/libstagefright/wifi-display/source/TSPacketizer.cpp index 50d317a..4c5ad17 100644 --- a/media/libstagefright/wifi-display/source/TSPacketizer.cpp +++ b/media/libstagefright/wifi-display/source/TSPacketizer.cpp @@ -106,7 +106,7 @@ void TSPacketizer::Track::extractCSDIfNecessary() {              || !strcasecmp(mMIME.c_str(), MEDIA_MIMETYPE_AUDIO_AAC)) {          for (size_t i = 0;; ++i) {              sp<ABuffer> csd; -            if (!mFormat->findBuffer(StringPrintf("csd-%d", i).c_str(), &csd)) { +            if (!mFormat->findBuffer(AStringPrintf("csd-%d", i).c_str(), &csd)) {                  break;              } diff --git a/media/libstagefright/wifi-display/source/WifiDisplaySource.cpp b/media/libstagefright/wifi-display/source/WifiDisplaySource.cpp index da405e2..7eb8b73 100644 --- a/media/libstagefright/wifi-display/source/WifiDisplaySource.cpp +++ b/media/libstagefright/wifi-display/source/WifiDisplaySource.cpp @@ -43,6 +43,10 @@  namespace android {  // static +const int64_t WifiDisplaySource::kReaperIntervalUs; +const int64_t WifiDisplaySource::kTeardownTriggerTimeouSecs; +const int64_t WifiDisplaySource::kPlaybackSessionTimeoutSecs; +const int64_t WifiDisplaySource::kPlaybackSessionTimeoutUs;  const AString WifiDisplaySource::sUserAgent = MakeUserAgent();  WifiDisplaySource::WifiDisplaySource( @@ -594,7 +598,7 @@ status_t WifiDisplaySource::sendM3(int32_t sessionID) {      AppendCommonResponse(&request, mNextCSeq);      request.append("Content-Type: text/parameters\r\n"); -    request.append(StringPrintf("Content-Length: %d\r\n", body.size())); +    request.append(AStringPrintf("Content-Length: %d\r\n", body.size()));      request.append("\r\n");      request.append(body); @@ -635,26 +639,26 @@ status_t WifiDisplaySource::sendM4(int32_t sessionID) {      if (mSinkSupportsAudio) {          body.append( -                StringPrintf("wfd_audio_codecs: %s\r\n", +                AStringPrintf("wfd_audio_codecs: %s\r\n",                               (mUsingPCMAudio                                  ? "LPCM 00000002 00" // 2 ch PCM 48kHz                                  : "AAC 00000001 00")));  // 2 ch AAC 48kHz      }      body.append( -            StringPrintf( +            AStringPrintf(                  "wfd_presentation_URL: rtsp://%s/wfd1.0/streamid=0 none\r\n",                  mClientInfo.mLocalIP.c_str()));      body.append( -            StringPrintf( +            AStringPrintf(                  "wfd_client_rtp_ports: %s\r\n", mWfdClientRtpPorts.c_str()));      AString request = "SET_PARAMETER rtsp://localhost/wfd1.0 RTSP/1.0\r\n";      AppendCommonResponse(&request, mNextCSeq);      request.append("Content-Type: text/parameters\r\n"); -    request.append(StringPrintf("Content-Length: %d\r\n", body.size())); +    request.append(AStringPrintf("Content-Length: %d\r\n", body.size()));      request.append("\r\n");      request.append(body); @@ -700,7 +704,7 @@ status_t WifiDisplaySource::sendTrigger(      AppendCommonResponse(&request, mNextCSeq);      request.append("Content-Type: text/parameters\r\n"); -    request.append(StringPrintf("Content-Length: %d\r\n", body.size())); +    request.append(AStringPrintf("Content-Length: %d\r\n", body.size()));      request.append("\r\n");      request.append(body); @@ -725,7 +729,7 @@ status_t WifiDisplaySource::sendM16(int32_t sessionID) {      CHECK_EQ(sessionID, mClientSessionID);      request.append( -            StringPrintf("Session: %d\r\n", mClientInfo.mPlaybackSessionID)); +            AStringPrintf("Session: %d\r\n", mClientInfo.mPlaybackSessionID));      request.append("\r\n");  // Empty body      status_t err = @@ -1301,7 +1305,7 @@ status_t WifiDisplaySource::onSetupRequest(      if (rtpMode == RTPSender::TRANSPORT_TCP_INTERLEAVED) {          response.append( -                StringPrintf( +                AStringPrintf(                      "Transport: RTP/AVP/TCP;interleaved=%d-%d;",                      clientRtp, clientRtcp));      } else { @@ -1314,14 +1318,14 @@ status_t WifiDisplaySource::onSetupRequest(          if (clientRtcp >= 0) {              response.append( -                    StringPrintf( +                    AStringPrintf(                          "Transport: RTP/AVP/%s;unicast;client_port=%d-%d;"                          "server_port=%d-%d\r\n",                          transportString.c_str(),                          clientRtp, clientRtcp, serverRtp, serverRtp + 1));          } else {              response.append( -                    StringPrintf( +                    AStringPrintf(                          "Transport: RTP/AVP/%s;unicast;client_port=%d;"                          "server_port=%d\r\n",                          transportString.c_str(), @@ -1581,15 +1585,15 @@ void WifiDisplaySource::AppendCommonResponse(      response->append(buf);      response->append("\r\n"); -    response->append(StringPrintf("Server: %s\r\n", sUserAgent.c_str())); +    response->append(AStringPrintf("Server: %s\r\n", sUserAgent.c_str()));      if (cseq >= 0) { -        response->append(StringPrintf("CSeq: %d\r\n", cseq)); +        response->append(AStringPrintf("CSeq: %d\r\n", cseq));      }      if (playbackSessionID >= 0ll) {          response->append( -                StringPrintf( +                AStringPrintf(                      "Session: %d;timeout=%lld\r\n",                      playbackSessionID, kPlaybackSessionTimeoutSecs));      } diff --git a/media/mtp/MtpDevice.cpp b/media/mtp/MtpDevice.cpp index e0d679d..3eafd6f 100644 --- a/media/mtp/MtpDevice.cpp +++ b/media/mtp/MtpDevice.cpp @@ -131,13 +131,22 @@ MtpDevice* MtpDevice::open(const char* deviceName, int fd) {              struct usb_endpoint_descriptor *ep_in_desc = NULL;              struct usb_endpoint_descriptor *ep_out_desc = NULL;              struct usb_endpoint_descriptor *ep_intr_desc = NULL; +            //USB3 add USB_DT_SS_ENDPOINT_COMP as companion descriptor; +            struct usb_ss_ep_comp_descriptor *ep_ss_ep_comp_desc = NULL;              for (int i = 0; i < 3; i++) {                  ep = (struct usb_endpoint_descriptor *)usb_descriptor_iter_next(&iter); +                if (ep && ep->bDescriptorType == USB_DT_SS_ENDPOINT_COMP) { +                    ALOGD("Descriptor type is USB_DT_SS_ENDPOINT_COMP for USB3 \n"); +                    ep_ss_ep_comp_desc = (usb_ss_ep_comp_descriptor*)ep; +                    ep = (struct usb_endpoint_descriptor *)usb_descriptor_iter_next(&iter); +                 } +                  if (!ep || ep->bDescriptorType != USB_DT_ENDPOINT) {                      ALOGE("endpoints not found\n");                      usb_device_close(device);                      return NULL;                  } +                  if (ep->bmAttributes == USB_ENDPOINT_XFER_BULK) {                      if (ep->bEndpointAddress & USB_ENDPOINT_DIR_MASK)                          ep_in_desc = ep; diff --git a/services/audioflinger/Android.mk b/services/audioflinger/Android.mk index f0196c6..44d2553 100644 --- a/services/audioflinger/Android.mk +++ b/services/audioflinger/Android.mk @@ -29,6 +29,12 @@ include $(BUILD_SHARED_LIBRARY)  include $(CLEAR_VARS) +# Clang++ aborts on AudioMixer.cpp, +# b/18373866, "do not know how to split this operator." +ifeq ($(filter $(TARGET_ARCH),arm arm64),$(TARGET_ARCH)) +    LOCAL_CLANG := false +endif +  LOCAL_SRC_FILES:=               \      AudioFlinger.cpp            \      Threads.cpp                 \ @@ -74,13 +80,6 @@ LOCAL_SRC_FILES += FastCapture.cpp FastCaptureState.cpp  LOCAL_CFLAGS += -DSTATE_QUEUE_INSTANTIATIONS='"StateQueueInstantiations.cpp"' -# Define ANDROID_SMP appropriately. Used to get inline tracing fast-path. -ifeq ($(TARGET_CPU_SMP),true) -    LOCAL_CFLAGS += -DANDROID_SMP=1 -else -    LOCAL_CFLAGS += -DANDROID_SMP=0 -endif -  LOCAL_CFLAGS += -fvisibility=hidden  include $(BUILD_SHARED_LIBRARY) diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp index b4c9905..18ba1ae 100644 --- a/services/audioflinger/AudioFlinger.cpp +++ b/services/audioflinger/AudioFlinger.cpp @@ -1219,7 +1219,7 @@ void AudioFlinger::registerClient(const sp<IAudioFlingerClient>& client)              mNotificationClients.add(pid, notificationClient); -            sp<IBinder> binder = client->asBinder(); +            sp<IBinder> binder = IInterface::asBinder(client);              binder->linkToDeath(notificationClient);              clientAdded = true;          } diff --git a/services/audioflinger/AudioMixer.h b/services/audioflinger/AudioMixer.h index 3b972bb..f4f142b 100644 --- a/services/audioflinger/AudioMixer.h +++ b/services/audioflinger/AudioMixer.h @@ -21,15 +21,15 @@  #include <stdint.h>  #include <sys/types.h> +#include <hardware/audio_effect.h> +#include <media/AudioBufferProvider.h> +#include <media/nbaio/NBLog.h> +#include <system/audio.h> +#include <utils/Compat.h>  #include <utils/threads.h> -#include <media/AudioBufferProvider.h>  #include "AudioResampler.h" -#include <hardware/audio_effect.h> -#include <system/audio.h> -#include <media/nbaio/NBLog.h> -  // FIXME This is actually unity gain, which might not be max in future, expressed in U.12  #define MAX_GAIN_INT AudioMixer::UNITY_GAIN_INT @@ -58,7 +58,7 @@ public:      static const uint32_t MAX_NUM_CHANNELS_TO_DOWNMIX = AUDIO_CHANNEL_COUNT_MAX;      static const uint16_t UNITY_GAIN_INT = 0x1000; -    static const float    UNITY_GAIN_FLOAT = 1.0f; +    static const CONSTEXPR float UNITY_GAIN_FLOAT = 1.0f;      enum { // names diff --git a/services/audioflinger/AudioMixerOps.h b/services/audioflinger/AudioMixerOps.h index f7376a8..2678857 100644 --- a/services/audioflinger/AudioMixerOps.h +++ b/services/audioflinger/AudioMixerOps.h @@ -52,15 +52,12 @@ struct is_same<T, T>  // partial specialization   *   * For high precision audio, only the <TO, TI, TV> = <float, float, float>   * needs to be accelerated. This is perhaps the easiest form to do quickly as well. + * + * A generic version is NOT defined to catch any mistake of using it.   */  template <typename TO, typename TI, typename TV> -inline TO MixMul(TI value, TV volume) { -    COMPILE_TIME_ASSERT_FUNCTION_SCOPE(false); -    // should not be here :-). -    // To avoid mistakes, this template is always specialized. -    return value * volume; -} +TO MixMul(TI value, TV volume);  template <>  inline int32_t MixMul<int32_t, int16_t, int16_t>(int16_t value, int16_t volume) { diff --git a/services/audioflinger/AudioResampler.cpp b/services/audioflinger/AudioResampler.cpp index 1f7a613..46e3d6c 100644 --- a/services/audioflinger/AudioResampler.cpp +++ b/services/audioflinger/AudioResampler.cpp @@ -29,14 +29,11 @@  #include "AudioResamplerDyn.h"  #ifdef __arm__ -#include <machine/cpu-features.h> +    #define ASM_ARM_RESAMP1 // enable asm optimisation for ResamplerOrder1  #endif  namespace android { -#ifdef __ARM_HAVE_HALFWORD_MULTIPLY // optimized asm option -    #define ASM_ARM_RESAMP1 // enable asm optimisation for ResamplerOrder1 -#endif // __ARM_HAVE_HALFWORD_MULTIPLY  // ----------------------------------------------------------------------------  class AudioResamplerOrder1 : public AudioResampler { diff --git a/services/audioflinger/AudioResampler.h b/services/audioflinger/AudioResampler.h index cdc6d92..069d946 100644 --- a/services/audioflinger/AudioResampler.h +++ b/services/audioflinger/AudioResampler.h @@ -19,7 +19,9 @@  #include <stdint.h>  #include <sys/types.h> +  #include <cutils/compiler.h> +#include <utils/Compat.h>  #include <media/AudioBufferProvider.h>  #include <system/audio.h> @@ -47,7 +49,7 @@ public:          DYN_HIGH_QUALITY=7,      }; -    static const float UNITY_GAIN_FLOAT = 1.0f; +    static const CONSTEXPR float UNITY_GAIN_FLOAT = 1.0f;      static AudioResampler* create(audio_format_t format, int inChannelCount,              int32_t sampleRate, src_quality quality=DEFAULT_QUALITY); diff --git a/services/audioflinger/AudioResamplerFirGen.h b/services/audioflinger/AudioResamplerFirGen.h index d024b2f..f3718b6 100644 --- a/services/audioflinger/AudioResamplerFirGen.h +++ b/services/audioflinger/AudioResamplerFirGen.h @@ -17,6 +17,8 @@  #ifndef ANDROID_AUDIO_RESAMPLER_FIR_GEN_H  #define ANDROID_AUDIO_RESAMPLER_FIR_GEN_H +#include "utils/Compat.h" +  namespace android {  /* @@ -187,22 +189,22 @@ static inline int64_t toint(double x, int64_t maxval) {  template <int N>  struct I0Term { -    static const double value = I0Term<N-1>::value / (4. * N * N); +    static const CONSTEXPR double value = I0Term<N-1>::value / (4. * N * N);  };  template <>  struct I0Term<0> { -    static const double value = 1.; +    static const CONSTEXPR double value = 1.;  };  template <int N>  struct I0ATerm { -    static const double value = I0ATerm<N-1>::value * (2.*N-1.) * (2.*N-1.) / (8. * N); +    static const CONSTEXPR double value = I0ATerm<N-1>::value * (2.*N-1.) * (2.*N-1.) / (8. * N);  };  template <>  struct I0ATerm<0> { // 1/sqrt(2*PI); -    static const double value = 0.398942280401432677939946059934381868475858631164934657665925; +    static const CONSTEXPR double value = 0.398942280401432677939946059934381868475858631164934657665925;  };  #if USE_HORNERS_METHOD diff --git a/services/audioflinger/AudioResamplerSinc.cpp b/services/audioflinger/AudioResamplerSinc.cpp index d03e578..e6fb76c 100644 --- a/services/audioflinger/AudioResamplerSinc.cpp +++ b/services/audioflinger/AudioResamplerSinc.cpp @@ -31,7 +31,10 @@  #include "AudioResamplerSinc.h" - +#if defined(__clang__) && !__has_builtin(__builtin_assume_aligned) +#define __builtin_assume_aligned(p, a) \ +	(((uintptr_t(p) % (a)) == 0) ? (p) : (__builtin_unreachable(), (p))) +#endif  #if defined(__arm__) && !defined(__thumb__)  #define USE_INLINE_ASSEMBLY (true) diff --git a/services/audioflinger/StateQueue.cpp b/services/audioflinger/StateQueue.cpp index 40d7bcd..9d4188f 100644 --- a/services/audioflinger/StateQueue.cpp +++ b/services/audioflinger/StateQueue.cpp @@ -48,7 +48,7 @@ template<typename T> StateQueue<T>::StateQueue() :      , mObserverDump(&mObserverDummyDump), mMutatorDump(&mMutatorDummyDump)  #endif  { -    atomic_init(&mNext, 0); +    atomic_init(&mNext, static_cast<uintptr_t>(0));  }  template<typename T> StateQueue<T>::~StateQueue() diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp index 5282ffe..e5b6661 100644 --- a/services/audioflinger/Threads.cpp +++ b/services/audioflinger/Threads.cpp @@ -338,7 +338,7 @@ AudioFlinger::ThreadBase::~ThreadBase()      // do not lock the mutex in destructor      releaseWakeLock_l();      if (mPowerManager != 0) { -        sp<IBinder> binder = mPowerManager->asBinder(); +        sp<IBinder> binder = IInterface::asBinder(mPowerManager);          binder->unlinkToDeath(mDeathRecipient);      }  } diff --git a/services/audioflinger/tests/Android.mk b/services/audioflinger/tests/Android.mk index 7bba05b..8604ef5 100644 --- a/services/audioflinger/tests/Android.mk +++ b/services/audioflinger/tests/Android.mk @@ -10,19 +10,10 @@ LOCAL_SHARED_LIBRARIES := \  	liblog \  	libutils \  	libcutils \ -	libstlport \  	libaudioutils \  	libaudioresampler -LOCAL_STATIC_LIBRARIES := \ -	libgtest \ -	libgtest_main -  LOCAL_C_INCLUDES := \ -	bionic \ -	bionic/libstdc++/include \ -	external/gtest/include \ -	external/stlport/stlport \  	$(call include-path-for, audio-utils) \  	frameworks/av/services/audioflinger @@ -32,21 +23,24 @@ LOCAL_SRC_FILES := \  LOCAL_MODULE := resampler_tests  LOCAL_MODULE_TAGS := tests -include $(BUILD_EXECUTABLE) +include $(BUILD_NATIVE_TEST)  #  # audio mixer test tool  #  include $(CLEAR_VARS) +# Clang++ aborts on AudioMixer.cpp, +# b/18373866, "do not know how to split this operator." +ifeq ($(filter $(TARGET_ARCH),arm arm64),$(TARGET_ARCH)) +    LOCAL_CLANG := false +endif +  LOCAL_SRC_FILES:= \  	test-mixer.cpp \  	../AudioMixer.cpp.arm \  LOCAL_C_INCLUDES := \ -	bionic \ -	bionic/libstdc++/include \ -	external/stlport/stlport \  	$(call include-path-for, audio-effects) \  	$(call include-path-for, audio-utils) \  	frameworks/av/services/audioflinger @@ -55,7 +49,6 @@ LOCAL_STATIC_LIBRARIES := \  	libsndfile  LOCAL_SHARED_LIBRARIES := \ -	libstlport \  	libeffects \  	libnbaio \  	libcommon_time_client \ @@ -70,4 +63,6 @@ LOCAL_MODULE:= test-mixer  LOCAL_MODULE_TAGS := optional +LOCAL_CXX_STL := libc++ +  include $(BUILD_EXECUTABLE) diff --git a/services/audiopolicy/AudioPolicyService.cpp b/services/audiopolicy/AudioPolicyService.cpp index 0955e10..eb9116d 100644 --- a/services/audiopolicy/AudioPolicyService.cpp +++ b/services/audiopolicy/AudioPolicyService.cpp @@ -35,6 +35,7 @@  #include <hardware_legacy/power.h>  #include <media/AudioEffect.h>  #include <media/EffectsFactoryApi.h> +#include <media/AudioParameter.h>  #include <hardware/hardware.h>  #include <system/audio.h> @@ -160,7 +161,7 @@ void AudioPolicyService::registerClient(const sp<IAudioPolicyServiceClient>& cli          mNotificationClients.add(uid, notificationClient); -        sp<IBinder> binder = client->asBinder(); +        sp<IBinder> binder = IInterface::asBinder(client);          binder->linkToDeath(notificationClient);      }  } diff --git a/services/audiopolicy/AudioPolicyService.h b/services/audiopolicy/AudioPolicyService.h index 09375cf..80284a4 100644 --- a/services/audiopolicy/AudioPolicyService.h +++ b/services/audiopolicy/AudioPolicyService.h @@ -31,7 +31,9 @@  #include <media/ToneGenerator.h>  #include <media/AudioEffect.h>  #include <media/AudioPolicy.h> +#ifdef USE_LEGACY_AUDIO_POLICY  #include <hardware_legacy/AudioPolicyInterface.h> +#endif  #include "AudioPolicyEffects.h"  #include "AudioPolicyManager.h" diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp index 76428da..1232c32 100644 --- a/services/camera/libcameraservice/CameraService.cpp +++ b/services/camera/libcameraservice/CameraService.cpp @@ -755,7 +755,7 @@ status_t CameraService::connect(          Mutex::Autolock lock(mServiceLock);          sp<BasicClient> clientTmp;          if (!canConnectUnsafe(cameraId, clientPackageName, -                              cameraClient->asBinder(), +                              IInterface::asBinder(cameraClient),                                /*out*/clientTmp)) {              return -EBUSY;          } else if (client.get() != NULL) { @@ -818,7 +818,7 @@ status_t CameraService::connectLegacy(          Mutex::Autolock lock(mServiceLock);          sp<BasicClient> clientTmp;          if (!canConnectUnsafe(cameraId, clientPackageName, -                              cameraClient->asBinder(), +                              IInterface::asBinder(cameraClient),                                /*out*/clientTmp)) {              return -EBUSY;          } else if (client.get() != NULL) { @@ -889,7 +889,7 @@ status_t CameraService::connectPro(          {              sp<BasicClient> client;              if (!canConnectUnsafe(cameraId, clientPackageName, -                                  cameraCb->asBinder(), +                                  IInterface::asBinder(cameraCb),                                    /*out*/client)) {                  return -EBUSY;              } @@ -962,7 +962,7 @@ status_t CameraService::connectDevice(          {              sp<BasicClient> client;              if (!canConnectUnsafe(cameraId, clientPackageName, -                                  cameraCb->asBinder(), +                                  IInterface::asBinder(cameraCb),                                    /*out*/client)) {                  return -EBUSY;              } @@ -1024,7 +1024,7 @@ status_t CameraService::addListener(      Vector<sp<ICameraServiceListener> >::iterator it, end;      for (it = mListenerList.begin(); it != mListenerList.end(); ++it) { -        if ((*it)->asBinder() == listener->asBinder()) { +        if (IInterface::asBinder(*it) == IInterface::asBinder(listener)) {              ALOGW("%s: Tried to add listener %p which was already subscribed",                    __FUNCTION__, listener.get());              return ALREADY_EXISTS; @@ -1057,7 +1057,7 @@ status_t CameraService::removeListener(      Vector<sp<ICameraServiceListener> >::iterator it;      for (it = mListenerList.begin(); it != mListenerList.end(); ++it) { -        if ((*it)->asBinder() == listener->asBinder()) { +        if (IInterface::asBinder(*it) == IInterface::asBinder(listener)) {              mListenerList.erase(it);              return OK;          } @@ -1170,7 +1170,7 @@ void CameraService::removeClientByRemote(const wp<IBinder>& remoteBinder) {              // Found our camera, clear and leave.              LOG1("removeClient: clear pro %p", clientPro.get()); -            clientPro->getRemoteCallback()->asBinder()->unlinkToDeath(this); +            IInterface::asBinder(clientPro->getRemoteCallback())->unlinkToDeath(this);          }      } @@ -1364,7 +1364,8 @@ CameraService::Client::Client(const sp<CameraService>& cameraService,          int cameraId, int cameraFacing,          int clientPid, uid_t clientUid,          int servicePid) : -        CameraService::BasicClient(cameraService, cameraClient->asBinder(), +        CameraService::BasicClient(cameraService, +                IInterface::asBinder(cameraClient),                  clientPackageName,                  cameraId, cameraFacing,                  clientPid, clientUid, @@ -1477,7 +1478,9 @@ status_t CameraService::BasicClient::finishCameraOps() {      }      // Always stop watching, even if no camera op is active -    mAppOpsManager.stopWatchingMode(mOpsCallback); +    if (mOpsCallback != NULL) { +        mAppOpsManager.stopWatchingMode(mOpsCallback); +    }      mOpsCallback.clear();      return OK; @@ -1573,7 +1576,7 @@ CameraService::ProClient::ProClient(const sp<CameraService>& cameraService,          int clientPid,          uid_t clientUid,          int servicePid) -        : CameraService::BasicClient(cameraService, remoteCallback->asBinder(), +        : CameraService::BasicClient(cameraService, IInterface::asBinder(remoteCallback),                  clientPackageName, cameraId, cameraFacing,                  clientPid,  clientUid, servicePid)  { diff --git a/services/camera/libcameraservice/CameraService.h b/services/camera/libcameraservice/CameraService.h index a7328cf..126d8d9 100644 --- a/services/camera/libcameraservice/CameraService.h +++ b/services/camera/libcameraservice/CameraService.h @@ -273,7 +273,7 @@ public:          }          virtual sp<IBinder> asBinderWrapper() { -            return asBinder(); +            return asBinder(this);          }      protected: diff --git a/services/camera/libcameraservice/api1/Camera2Client.cpp b/services/camera/libcameraservice/api1/Camera2Client.cpp index dcab4ad..0ed5586 100644 --- a/services/camera/libcameraservice/api1/Camera2Client.cpp +++ b/services/camera/libcameraservice/api1/Camera2Client.cpp @@ -165,7 +165,8 @@ status_t Camera2Client::dump(int fd, const Vector<String16>& args) {      String8 result;      result.appendFormat("Client2[%d] (%p) Client: %s PID: %d, dump:\n",              mCameraId, -            getRemoteCallback()->asBinder().get(), +            (getRemoteCallback() != NULL ? +                    (IInterface::asBinder(getRemoteCallback()).get()) : NULL),              String8(mClientPackageName).string(),              mClientPid);      result.append("  State: "); @@ -531,7 +532,7 @@ status_t Camera2Client::setPreviewTarget(      sp<IBinder> binder;      sp<ANativeWindow> window;      if (bufferProducer != 0) { -        binder = bufferProducer->asBinder(); +        binder = IInterface::asBinder(bufferProducer);          // Using controlledByApp flag to ensure that the buffer queue remains in          // async mode for the old camera API, where many applications depend          // on that behavior. diff --git a/services/camera/libcameraservice/api1/CameraClient.cpp b/services/camera/libcameraservice/api1/CameraClient.cpp index 1a4d9a6..bbb2fe0 100644 --- a/services/camera/libcameraservice/api1/CameraClient.cpp +++ b/services/camera/libcameraservice/api1/CameraClient.cpp @@ -118,7 +118,8 @@ status_t CameraClient::dump(int fd, const Vector<String16>& args) {      size_t len = snprintf(buffer, SIZE, "Client[%d] (%p) PID: %d\n",              mCameraId, -            getRemoteCallback()->asBinder().get(), +            (getRemoteCallback() != NULL ? +                    IInterface::asBinder(getRemoteCallback()).get() : NULL),              mClientPid);      len = (len > SIZE - 1) ? SIZE - 1 : len;      write(fd, buffer, len); @@ -205,7 +206,7 @@ status_t CameraClient::connect(const sp<ICameraClient>& client) {      }      if (mRemoteCallback != 0 && -        (client->asBinder() == mRemoteCallback->asBinder())) { +        (IInterface::asBinder(client) == IInterface::asBinder(mRemoteCallback))) {          LOG1("Connect to the same client");          return NO_ERROR;      } @@ -328,7 +329,7 @@ status_t CameraClient::setPreviewTarget(      sp<IBinder> binder;      sp<ANativeWindow> window;      if (bufferProducer != 0) { -        binder = bufferProducer->asBinder(); +        binder = IInterface::asBinder(bufferProducer);          // Using controlledByApp flag to ensure that the buffer queue remains in          // async mode for the old camera API, where many applications depend          // on that behavior. diff --git a/services/camera/libcameraservice/api1/client2/Parameters.h b/services/camera/libcameraservice/api1/client2/Parameters.h index 7e5be84..e628a7e 100644 --- a/services/camera/libcameraservice/api1/client2/Parameters.h +++ b/services/camera/libcameraservice/api1/client2/Parameters.h @@ -19,11 +19,13 @@  #include <system/graphics.h> +#include <utils/Compat.h>  #include <utils/Errors.h> +#include <utils/KeyedVector.h>  #include <utils/Mutex.h>  #include <utils/String8.h>  #include <utils/Vector.h> -#include <utils/KeyedVector.h> +  #include <camera/CameraParameters.h>  #include <camera/CameraParameters2.h>  #include <camera/CameraMetadata.h> @@ -187,7 +189,7 @@ struct Parameters {      static const int MAX_INITIAL_PREVIEW_WIDTH = 1920;      static const int MAX_INITIAL_PREVIEW_HEIGHT = 1080;      // Aspect ratio tolerance -    static const float ASPECT_RATIO_TOLERANCE = 0.001; +    static const CONSTEXPR float ASPECT_RATIO_TOLERANCE = 0.001;      // Full static camera info, object owned by someone else, such as      // Camera2Device. diff --git a/services/camera/libcameraservice/api1/client2/StreamingProcessor.cpp b/services/camera/libcameraservice/api1/client2/StreamingProcessor.cpp index 470624b..146d572 100644 --- a/services/camera/libcameraservice/api1/client2/StreamingProcessor.cpp +++ b/services/camera/libcameraservice/api1/client2/StreamingProcessor.cpp @@ -27,6 +27,7 @@  #include <utils/Log.h>  #include <utils/Trace.h> +#include <gui/BufferItem.h>  #include <gui/Surface.h>  #include <media/hardware/MetadataBufferType.h> @@ -675,7 +676,7 @@ status_t StreamingProcessor::processRecordingFrame() {      sp<Camera2Client> client = mClient.promote();      if (client == 0) {          // Discard frames during shutdown -        BufferItemConsumer::BufferItem imgBuffer; +        BufferItem imgBuffer;          res = mRecordingConsumer->acquireBuffer(&imgBuffer, 0);          if (res != OK) {              if (res != BufferItemConsumer::NO_BUFFER_AVAILABLE) { @@ -693,7 +694,7 @@ status_t StreamingProcessor::processRecordingFrame() {              with Camera2Client code calling into StreamingProcessor */          SharedParameters::Lock l(client->getParameters());          Mutex::Autolock m(mMutex); -        BufferItemConsumer::BufferItem imgBuffer; +        BufferItem imgBuffer;          res = mRecordingConsumer->acquireBuffer(&imgBuffer, 0);          if (res != OK) {              if (res != BufferItemConsumer::NO_BUFFER_AVAILABLE) { @@ -819,8 +820,7 @@ void StreamingProcessor::releaseRecordingFrame(const sp<IMemory>& mem) {      size_t itemIndex;      for (itemIndex = 0; itemIndex < mRecordingBuffers.size(); itemIndex++) { -        const BufferItemConsumer::BufferItem item = -                mRecordingBuffers[itemIndex]; +        const BufferItem item = mRecordingBuffers[itemIndex];          if (item.mBuf != BufferItemConsumer::INVALID_BUFFER_SLOT &&                  item.mGraphicBuffer->handle == imgHandle) {              break; @@ -864,8 +864,7 @@ void StreamingProcessor::releaseAllRecordingFramesLocked() {      size_t releasedCount = 0;      for (size_t itemIndex = 0; itemIndex < mRecordingBuffers.size(); itemIndex++) { -        const BufferItemConsumer::BufferItem item = -                mRecordingBuffers[itemIndex]; +        const BufferItem item = mRecordingBuffers[itemIndex];          if (item.mBuf != BufferItemConsumer::INVALID_BUFFER_SLOT) {              res = mRecordingConsumer->releaseBuffer(mRecordingBuffers[itemIndex]);              if (res != OK) { diff --git a/services/camera/libcameraservice/api1/client2/StreamingProcessor.h b/services/camera/libcameraservice/api1/client2/StreamingProcessor.h index 1d679a4..2474062 100644 --- a/services/camera/libcameraservice/api1/client2/StreamingProcessor.h +++ b/services/camera/libcameraservice/api1/client2/StreamingProcessor.h @@ -124,7 +124,7 @@ class StreamingProcessor:      static const size_t kDefaultRecordingHeapCount = 8;      size_t mRecordingHeapCount; -    Vector<BufferItemConsumer::BufferItem> mRecordingBuffers; +    Vector<BufferItem> mRecordingBuffers;      size_t mRecordingHeapHead, mRecordingHeapFree;      virtual bool threadLoop(); diff --git a/services/camera/libcameraservice/api1/client2/ZslProcessor.cpp b/services/camera/libcameraservice/api1/client2/ZslProcessor.cpp index 8b7e4b4..186ce6c 100644 --- a/services/camera/libcameraservice/api1/client2/ZslProcessor.cpp +++ b/services/camera/libcameraservice/api1/client2/ZslProcessor.cpp @@ -440,7 +440,7 @@ status_t ZslProcessor::processNewZslBuffer() {          zslConsumer = mZslConsumer;      }      ALOGVV("Trying to get next buffer"); -    BufferItemConsumer::BufferItem item; +    BufferItem item;      res = zslConsumer->acquireBuffer(&item, 0);      if (res != OK) {          if (res != BufferItemConsumer::NO_BUFFER_AVAILABLE) { diff --git a/services/camera/libcameraservice/api1/client2/ZslProcessor.h b/services/camera/libcameraservice/api1/client2/ZslProcessor.h index 2099c38..5f50d7b 100644 --- a/services/camera/libcameraservice/api1/client2/ZslProcessor.h +++ b/services/camera/libcameraservice/api1/client2/ZslProcessor.h @@ -22,6 +22,7 @@  #include <utils/Vector.h>  #include <utils/Mutex.h>  #include <utils/Condition.h> +#include <gui/BufferItem.h>  #include <gui/BufferItemConsumer.h>  #include <camera/CameraMetadata.h>  #include <camera/CaptureResult.h> @@ -103,7 +104,7 @@ class ZslProcessor:      sp<ANativeWindow>      mZslWindow;      struct ZslPair { -        BufferItemConsumer::BufferItem buffer; +        BufferItem buffer;          CameraMetadata frame;      }; diff --git a/services/camera/libcameraservice/api1/client2/ZslProcessor3.h b/services/camera/libcameraservice/api1/client2/ZslProcessor3.h index fc9f70c..2960478 100644 --- a/services/camera/libcameraservice/api1/client2/ZslProcessor3.h +++ b/services/camera/libcameraservice/api1/client2/ZslProcessor3.h @@ -22,6 +22,7 @@  #include <utils/Vector.h>  #include <utils/Mutex.h>  #include <utils/Condition.h> +#include <gui/BufferItem.h>  #include <gui/BufferItemConsumer.h>  #include <camera/CameraMetadata.h> @@ -104,7 +105,7 @@ class ZslProcessor3 :      sp<camera3::Camera3ZslStream> mZslStream;      struct ZslPair { -        BufferItemConsumer::BufferItem buffer; +        BufferItem buffer;          CameraMetadata frame;      }; diff --git a/services/camera/libcameraservice/api2/CameraDeviceClient.cpp b/services/camera/libcameraservice/api2/CameraDeviceClient.cpp index e6865bb..6a1ee44 100644 --- a/services/camera/libcameraservice/api2/CameraDeviceClient.cpp +++ b/services/camera/libcameraservice/api2/CameraDeviceClient.cpp @@ -42,8 +42,14 @@ CameraDeviceClientBase::CameraDeviceClientBase(          int clientPid,          uid_t clientUid,          int servicePid) : -    BasicClient(cameraService, remoteCallback->asBinder(), clientPackageName, -                cameraId, cameraFacing, clientPid, clientUid, servicePid), +    BasicClient(cameraService, +            IInterface::asBinder(remoteCallback), +            clientPackageName, +            cameraId, +            cameraFacing, +            clientPid, +            clientUid, +            servicePid),      mRemoteCallback(remoteCallback) {  } @@ -157,7 +163,7 @@ status_t CameraDeviceClient::submitRequestList(List<sp<CaptureRequest> > request              if (surface == 0) continue;              sp<IGraphicBufferProducer> gbp = surface->getIGraphicBufferProducer(); -            int idx = mStreamMap.indexOfKey(gbp->asBinder()); +            int idx = mStreamMap.indexOfKey(IInterface::asBinder(gbp));              // Trying to submit request with surface that wasn't created              if (idx == NAME_NOT_FOUND) { @@ -327,7 +333,7 @@ status_t CameraDeviceClient::createStream(int width, int height, int format,      // Don't create multiple streams for the same target surface      { -        ssize_t index = mStreamMap.indexOfKey(bufferProducer->asBinder()); +        ssize_t index = mStreamMap.indexOfKey(IInterface::asBinder(bufferProducer));          if (index != NAME_NOT_FOUND) {              ALOGW("%s: Camera %d: Buffer producer already has a stream for it "                    "(ID %zd)", @@ -361,12 +367,8 @@ status_t CameraDeviceClient::createStream(int width, int height, int format,      bool flexibleConsumer = (consumerUsage & disallowedFlags) == 0 &&              (consumerUsage & allowedFlags) != 0; -    sp<IBinder> binder; -    sp<ANativeWindow> anw; -    if (bufferProducer != 0) { -        binder = bufferProducer->asBinder(); -        anw = new Surface(bufferProducer, useAsync); -    } +    sp<IBinder> binder = IInterface::asBinder(bufferProducer); +    sp<ANativeWindow> anw = new Surface(bufferProducer, useAsync);      // TODO: remove w,h,f since we are ignoring them @@ -407,7 +409,7 @@ status_t CameraDeviceClient::createStream(int width, int height, int format,      res = mDevice->createStream(anw, width, height, format, &streamId);      if (res == OK) { -        mStreamMap.add(bufferProducer->asBinder(), streamId); +        mStreamMap.add(binder, streamId);          ALOGV("%s: Camera %d: Successfully created a new stream ID %d",                __FUNCTION__, mCameraId, streamId); @@ -582,7 +584,8 @@ status_t CameraDeviceClient::dump(int fd, const Vector<String16>& args) {      String8 result;      result.appendFormat("CameraDeviceClient[%d] (%p) dump:\n",              mCameraId, -            getRemoteCallback()->asBinder().get()); +            (getRemoteCallback() != NULL ? +                    IInterface::asBinder(getRemoteCallback()).get() : NULL) );      result.appendFormat("  Current client: %s (PID %d, UID %u)\n",              String8(mClientPackageName).string(),              mClientPid, mClientUid); diff --git a/services/camera/libcameraservice/api_pro/ProCamera2Client.cpp b/services/camera/libcameraservice/api_pro/ProCamera2Client.cpp index 2ea460f..59e5083 100644 --- a/services/camera/libcameraservice/api_pro/ProCamera2Client.cpp +++ b/services/camera/libcameraservice/api_pro/ProCamera2Client.cpp @@ -276,7 +276,7 @@ status_t ProCamera2Client::createStream(int width, int height, int format,      sp<IBinder> binder;      sp<ANativeWindow> window;      if (bufferProducer != 0) { -        binder = bufferProducer->asBinder(); +        binder = IInterface::asBinder(bufferProducer);          window = new Surface(bufferProducer);      } @@ -334,7 +334,8 @@ status_t ProCamera2Client::dump(int fd, const Vector<String16>& args) {      String8 result;      result.appendFormat("ProCamera2Client[%d] (%p) PID: %d, dump:\n",              mCameraId, -            getRemoteCallback()->asBinder().get(), +            (getRemoteCallback() != NULL ? +                    IInterface::asBinder(getRemoteCallback()).get() : NULL),              mClientPid);      result.append("  State:\n");      write(fd, result.string(), result.size()); diff --git a/services/camera/libcameraservice/common/Camera2ClientBase.cpp b/services/camera/libcameraservice/common/Camera2ClientBase.cpp index d6db151..453c8bd 100644 --- a/services/camera/libcameraservice/common/Camera2ClientBase.cpp +++ b/services/camera/libcameraservice/common/Camera2ClientBase.cpp @@ -128,7 +128,8 @@ status_t Camera2ClientBase<TClientBase>::dump(int fd,      String8 result;      result.appendFormat("Camera2ClientBase[%d] (%p) PID: %d, dump:\n",              TClientBase::mCameraId, -            TClientBase::getRemoteCallback()->asBinder().get(), +            (TClientBase::getRemoteCallback() != NULL ? +                    IInterface::asBinder(TClientBase::getRemoteCallback()).get() : NULL),              TClientBase::mClientPid);      result.append("  State: "); diff --git a/services/camera/libcameraservice/common/Camera2ClientBase.h b/services/camera/libcameraservice/common/Camera2ClientBase.h index d198e4e..e09c1b5 100644 --- a/services/camera/libcameraservice/common/Camera2ClientBase.h +++ b/services/camera/libcameraservice/common/Camera2ClientBase.h @@ -111,7 +111,7 @@ protected:      pid_t mInitialClientPid;      virtual sp<IBinder> asBinderWrapper() { -        return IInterface::asBinder(); +        return IInterface::asBinder(this);      }      virtual status_t      dumpDevice(int fd, const Vector<String16>& args); diff --git a/services/camera/libcameraservice/device1/CameraHardwareInterface.h b/services/camera/libcameraservice/device1/CameraHardwareInterface.h index 6386838..1935c2b 100644 --- a/services/camera/libcameraservice/device1/CameraHardwareInterface.h +++ b/services/camera/libcameraservice/device1/CameraHardwareInterface.h @@ -588,7 +588,7 @@ private:  #ifndef container_of  #define container_of(ptr, type, member) ({                      \ -        const typeof(((type *) 0)->member) *__mptr = (ptr);     \ +        const __typeof__(((type *) 0)->member) *__mptr = (ptr);     \          (type *) ((char *) __mptr - (char *)(&((type *)0)->member)); })  #endif diff --git a/services/camera/libcameraservice/device3/Camera3InputStream.cpp b/services/camera/libcameraservice/device3/Camera3InputStream.cpp index 319be1d..9c1e28b 100644 --- a/services/camera/libcameraservice/device3/Camera3InputStream.cpp +++ b/services/camera/libcameraservice/device3/Camera3InputStream.cpp @@ -18,6 +18,7 @@  #define ATRACE_TAG ATRACE_TAG_CAMERA  //#define LOG_NDEBUG 0 +#include <gui/BufferItem.h>  #include <utils/Log.h>  #include <utils/Trace.h>  #include "Camera3InputStream.h" diff --git a/services/camera/libcameraservice/device3/Camera3InputStream.h b/services/camera/libcameraservice/device3/Camera3InputStream.h index ae49467..fd17f4f 100644 --- a/services/camera/libcameraservice/device3/Camera3InputStream.h +++ b/services/camera/libcameraservice/device3/Camera3InputStream.h @@ -48,8 +48,6 @@ class Camera3InputStream : public Camera3IOStreamBase {    private: -    typedef BufferItemConsumer::BufferItem BufferItem; -      sp<BufferItemConsumer> mConsumer;      Vector<BufferItem> mBuffersInFlight; diff --git a/services/camera/libcameraservice/gui/RingBufferConsumer.cpp b/services/camera/libcameraservice/gui/RingBufferConsumer.cpp index d0f29de..8cd6800 100644 --- a/services/camera/libcameraservice/gui/RingBufferConsumer.cpp +++ b/services/camera/libcameraservice/gui/RingBufferConsumer.cpp @@ -268,7 +268,7 @@ status_t RingBufferConsumer::releaseOldestBufferLocked(size_t* pinnedFrames) {      return OK;  } -void RingBufferConsumer::onFrameAvailable(const android::BufferItem& item) { +void RingBufferConsumer::onFrameAvailable(const BufferItem& item) {      status_t err;      { diff --git a/services/camera/libcameraservice/gui/RingBufferConsumer.h b/services/camera/libcameraservice/gui/RingBufferConsumer.h index 90fd734..83e7298 100644 --- a/services/camera/libcameraservice/gui/RingBufferConsumer.h +++ b/services/camera/libcameraservice/gui/RingBufferConsumer.h @@ -17,6 +17,7 @@  #ifndef ANDROID_GUI_RINGBUFFERCONSUMER_H  #define ANDROID_GUI_RINGBUFFERCONSUMER_H +#include <gui/BufferItem.h>  #include <gui/ConsumerBase.h>  #include <ui/GraphicBuffer.h> @@ -54,8 +55,6 @@ class RingBufferConsumer : public ConsumerBase,    public:      typedef ConsumerBase::FrameAvailableListener FrameAvailableListener; -    typedef BufferQueue::BufferItem BufferItem; -      enum { INVALID_BUFFER_SLOT = BufferQueue::INVALID_BUFFER_SLOT };      enum { NO_BUFFER_AVAILABLE = BufferQueue::NO_BUFFER_AVAILABLE }; @@ -165,7 +164,7 @@ class RingBufferConsumer : public ConsumerBase,    private:      // Override ConsumerBase::onFrameAvailable -    virtual void onFrameAvailable(const android::BufferItem& item); +    virtual void onFrameAvailable(const BufferItem& item);      void pinBufferLocked(const BufferItem& item);      void unpinBuffer(const BufferItem& item); diff --git a/services/soundtrigger/SoundTriggerHwService.cpp b/services/soundtrigger/SoundTriggerHwService.cpp index d3b67f6..081aff7 100644 --- a/services/soundtrigger/SoundTriggerHwService.cpp +++ b/services/soundtrigger/SoundTriggerHwService.cpp @@ -143,7 +143,7 @@ status_t SoundTriggerHwService::attach(const sound_trigger_module_handle_t handl      sp<Module> module = mModules.valueAt(index);      module->setClient(client); -    client->asBinder()->linkToDeath(module); +    IInterface::asBinder(client)->linkToDeath(module);      moduleInterface = module;      module->setCaptureState_l(mCaptureState); @@ -510,7 +510,7 @@ void SoundTriggerHwService::Module::detach() {          mModels.clear();      }      if (mClient != 0) { -        mClient->asBinder()->unlinkToDeath(this); +        IInterface::asBinder(mClient)->unlinkToDeath(this);      }      sp<SoundTriggerHwService> service = mService.promote();      if (service == 0) { diff --git a/soundtrigger/ISoundTrigger.cpp b/soundtrigger/ISoundTrigger.cpp index 42280d1..eecc1ea 100644 --- a/soundtrigger/ISoundTrigger.cpp +++ b/soundtrigger/ISoundTrigger.cpp @@ -58,7 +58,7 @@ public:          }          Parcel data, reply;          data.writeInterfaceToken(ISoundTrigger::getInterfaceDescriptor()); -        data.writeStrongBinder(modelMemory->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(modelMemory));          status_t status = remote()->transact(LOAD_SOUND_MODEL, data, &reply);          if (status != NO_ERROR ||                  (status = (status_t)reply.readInt32()) != NO_ERROR) { @@ -91,7 +91,7 @@ public:          } else {              data.writeInt32(dataMemory->size());          } -        data.writeStrongBinder(dataMemory->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(dataMemory));          status_t status = remote()->transact(START_RECOGNITION, data, &reply);          if (status != NO_ERROR) {              status = (status_t)reply.readInt32(); diff --git a/soundtrigger/ISoundTriggerClient.cpp b/soundtrigger/ISoundTriggerClient.cpp index b0b4428..e0d3add 100644 --- a/soundtrigger/ISoundTriggerClient.cpp +++ b/soundtrigger/ISoundTriggerClient.cpp @@ -44,7 +44,7 @@ public:      {          Parcel data, reply;          data.writeInterfaceToken(ISoundTriggerClient::getInterfaceDescriptor()); -        data.writeStrongBinder(eventMemory->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(eventMemory));          remote()->transact(ON_RECOGNITION_EVENT,                             data,                             &reply); @@ -54,7 +54,7 @@ public:      {          Parcel data, reply;          data.writeInterfaceToken(ISoundTriggerClient::getInterfaceDescriptor()); -        data.writeStrongBinder(eventMemory->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(eventMemory));          remote()->transact(ON_SOUNDMODEL_EVENT,                             data,                             &reply); @@ -63,7 +63,7 @@ public:      {          Parcel data, reply;          data.writeInterfaceToken(ISoundTriggerClient::getInterfaceDescriptor()); -        data.writeStrongBinder(eventMemory->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(eventMemory));          remote()->transact(ON_SERVICE_STATE_CHANGE,                             data,                             &reply); diff --git a/soundtrigger/ISoundTriggerHwService.cpp b/soundtrigger/ISoundTriggerHwService.cpp index 05728e9..75f68b8 100644 --- a/soundtrigger/ISoundTriggerHwService.cpp +++ b/soundtrigger/ISoundTriggerHwService.cpp @@ -82,7 +82,7 @@ public:          Parcel data, reply;          data.writeInterfaceToken(ISoundTriggerHwService::getInterfaceDescriptor());          data.write(&handle, sizeof(sound_trigger_module_handle_t)); -        data.writeStrongBinder(client->asBinder()); +        data.writeStrongBinder(IInterface::asBinder(client));          remote()->transact(ATTACH, data, &reply);          status_t status = reply.readInt32();          if (reply.readInt32() != 0) { @@ -147,7 +147,7 @@ status_t BnSoundTriggerHwService::onTransact(              reply->writeInt32(status);              if (module != 0) {                  reply->writeInt32(1); -                reply->writeStrongBinder(module->asBinder()); +                reply->writeStrongBinder(IInterface::asBinder(module));              } else {                  reply->writeInt32(0);              } diff --git a/soundtrigger/SoundTrigger.cpp b/soundtrigger/SoundTrigger.cpp index 0015c30..2138cb7 100644 --- a/soundtrigger/SoundTrigger.cpp +++ b/soundtrigger/SoundTrigger.cpp @@ -104,7 +104,7 @@ sp<SoundTrigger> SoundTrigger::attach(const sound_trigger_module_handle_t module      status_t status = service->attach(module, soundTrigger, soundTrigger->mISoundTrigger);      if (status == NO_ERROR && soundTrigger->mISoundTrigger != 0) { -        soundTrigger->mISoundTrigger->asBinder()->linkToDeath(soundTrigger); +        IInterface::asBinder(soundTrigger->mISoundTrigger)->linkToDeath(soundTrigger);      } else {          ALOGW("Error %d connecting to sound trigger service", status);          soundTrigger.clear(); @@ -144,7 +144,7 @@ void SoundTrigger::detach() {      mCallback.clear();      if (mISoundTrigger != 0) {          mISoundTrigger->detach(); -        mISoundTrigger->asBinder()->unlinkToDeath(this); +        IInterface::asBinder(mISoundTrigger)->unlinkToDeath(this);          mISoundTrigger = 0;      }  }  | 
