diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/camera/Camera.h | 4 | ||||
| -rw-r--r-- | include/camera/ICameraService.h | 6 | ||||
| -rw-r--r-- | include/media/AudioIoDescriptor.h | 21 | ||||
| -rw-r--r-- | include/media/AudioRecord.h | 34 | ||||
| -rw-r--r-- | include/media/AudioSystem.h | 43 | ||||
| -rw-r--r-- | include/media/AudioTrack.h | 35 | ||||
| -rw-r--r-- | include/media/MediaResourcePolicy.h | 4 | ||||
| -rw-r--r-- | include/media/RingBuffer.h | 361 | ||||
| -rw-r--r-- | include/media/stagefright/ACodec.h | 6 | ||||
| -rw-r--r-- | include/media/stagefright/MediaCodec.h | 9 | ||||
| -rw-r--r-- | include/media/stagefright/MediaCodecList.h | 3 | ||||
| -rw-r--r-- | include/media/stagefright/OMXCodec.h | 2 | ||||
| -rw-r--r-- | include/media/stagefright/SurfaceUtils.h | 34 | ||||
| -rw-r--r-- | include/media/stagefright/foundation/ADebug.h | 20 | 
14 files changed, 557 insertions, 25 deletions
diff --git a/include/camera/Camera.h b/include/camera/Camera.h index 25d75f7..2b60842 100644 --- a/include/camera/Camera.h +++ b/include/camera/Camera.h @@ -71,11 +71,11 @@ public:              // construct a camera client from an existing remote      static  sp<Camera>  create(const sp<ICamera>& camera);      static  sp<Camera>  connect(int cameraId, -                                const String16& opPackageName, +                                const String16& clientPackageName,                                  int clientUid);      static  status_t  connectLegacy(int cameraId, int halVersion, -                                     const String16& opPackageName, +                                     const String16& clientPackageName,                                       int clientUid, sp<Camera>& camera);              virtual     ~Camera(); diff --git a/include/camera/ICameraService.h b/include/camera/ICameraService.h index 38bff3e..cad275e 100644 --- a/include/camera/ICameraService.h +++ b/include/camera/ICameraService.h @@ -109,7 +109,7 @@ public:       */      virtual status_t connect(const sp<ICameraClient>& cameraClient,              int cameraId, -            const String16& opPackageName, +            const String16& clientPackageName,              int clientUid,              /*out*/              sp<ICamera>& device) = 0; @@ -117,7 +117,7 @@ public:      virtual status_t connectDevice(              const sp<ICameraDeviceCallbacks>& cameraCb,              int cameraId, -            const String16& opPackageName, +            const String16& clientPackageName,              int clientUid,              /*out*/              sp<ICameraDeviceUser>& device) = 0; @@ -141,7 +141,7 @@ public:       */      virtual status_t connectLegacy(const sp<ICameraClient>& cameraClient,              int cameraId, int halVersion, -            const String16& opPackageName, +            const String16& clientPackageName,              int clientUid,              /*out*/              sp<ICamera>& device) = 0; diff --git a/include/media/AudioIoDescriptor.h b/include/media/AudioIoDescriptor.h index 2437901..c94b738 100644 --- a/include/media/AudioIoDescriptor.h +++ b/include/media/AudioIoDescriptor.h @@ -33,12 +33,31 @@ enum audio_io_config_event {  class AudioIoDescriptor : public RefBase {  public:      AudioIoDescriptor() : +        mIoHandle(AUDIO_IO_HANDLE_NONE),          mSamplingRate(0), mFormat(AUDIO_FORMAT_DEFAULT), mChannelMask(AUDIO_CHANNEL_NONE), -        mFrameCount(0), mLatency(0) {} +        mFrameCount(0), mLatency(0) +    { +        memset(&mPatch, 0, sizeof(struct audio_patch)); +    }      virtual ~AudioIoDescriptor() {} +    audio_port_handle_t getDeviceId() { +        if (mPatch.num_sources != 0 && mPatch.num_sinks != 0) { +            if (mPatch.sources[0].type == AUDIO_PORT_TYPE_MIX) { +                // this is an output mix +                // FIXME: the API only returns the first device in case of multiple device selection +                return mPatch.sinks[0].id; +            } else { +                // this is an input mix +                return mPatch.sources[0].id; +            } +        } +        return AUDIO_PORT_HANDLE_NONE; +    } +      audio_io_handle_t mIoHandle; +    struct audio_patch mPatch;      uint32_t mSamplingRate;      audio_format_t mFormat;      audio_channel_mask_t mChannelMask; diff --git a/include/media/AudioRecord.h b/include/media/AudioRecord.h index 4d8bd32..c4c7b0e 100644 --- a/include/media/AudioRecord.h +++ b/include/media/AudioRecord.h @@ -394,6 +394,39 @@ public:       * TODO Document this method.       */              audio_port_handle_t getInputDevice(); + +     /* Returns the ID of the audio device actually used by the input to which this AudioRecord +      * is attached. +      * A value of AUDIO_PORT_HANDLE_NONE indicates the AudioRecord is not attached to any input. +      * +      * Parameters: +      *  none. +      */ +     audio_port_handle_t getRoutedDeviceId(); + +    /* Add an AudioDeviceCallback. The caller will be notified when the audio device +     * to which this AudioRecord is routed is updated. +     * Replaces any previously installed callback. +     * Parameters: +     *  callback:  The callback interface +     * Returns NO_ERROR if successful. +     *         INVALID_OPERATION if the same callback is already installed. +     *         NO_INIT or PREMISSION_DENIED if AudioFlinger service is not reachable +     *         BAD_VALUE if the callback is NULL +     */ +            status_t addAudioDeviceCallback( +                    const sp<AudioSystem::AudioDeviceCallback>& callback); + +    /* remove an AudioDeviceCallback. +     * Parameters: +     *  callback:  The callback interface +     * Returns NO_ERROR if successful. +     *         INVALID_OPERATION if the callback is not installed +     *         BAD_VALUE if the callback is NULL +     */ +            status_t removeAudioDeviceCallback( +                    const sp<AudioSystem::AudioDeviceCallback>& callback); +  private:      /* If nonContig is non-NULL, it is an output parameter that will be set to the number of       * additional non-contiguous frames that are predicted to be available immediately, @@ -588,6 +621,7 @@ private:      // For Device Selection API      //  a value of AUDIO_PORT_HANDLE_NONE indicated default (AudioPolicyManager) routing.      audio_port_handle_t    mSelectedDeviceId; +    sp<AudioSystem::AudioDeviceCallback> mDeviceCallback;  };  }; // namespace android diff --git a/include/media/AudioSystem.h b/include/media/AudioSystem.h index 0cbcdb1..3241e9c 100644 --- a/include/media/AudioSystem.h +++ b/include/media/AudioSystem.h @@ -332,8 +332,26 @@ public:      }; -    static status_t addAudioPortCallback(const sp<AudioPortCallback>& callBack); -    static status_t removeAudioPortCallback(const sp<AudioPortCallback>& callBack); +    static status_t addAudioPortCallback(const sp<AudioPortCallback>& callback); +    static status_t removeAudioPortCallback(const sp<AudioPortCallback>& callback); + +    class AudioDeviceCallback : public RefBase +    { +    public: + +                AudioDeviceCallback() {} +        virtual ~AudioDeviceCallback() {} + +        virtual void onAudioDeviceUpdate(audio_io_handle_t audioIo, +                                         audio_port_handle_t deviceId) = 0; +    }; + +    static status_t addAudioDeviceCallback(const sp<AudioDeviceCallback>& callback, +                                           audio_io_handle_t audioIo); +    static status_t removeAudioDeviceCallback(const sp<AudioDeviceCallback>& callback, +                                              audio_io_handle_t audioIo); + +    static audio_port_handle_t getDeviceIdForIo(audio_io_handle_t audioIo);  private: @@ -359,10 +377,20 @@ private:          // values for output/input parameters up-to-date in client process          virtual void ioConfigChanged(audio_io_config_event event,                                       const sp<AudioIoDescriptor>& ioDesc); + + +        status_t addAudioDeviceCallback(const sp<AudioDeviceCallback>& callback, +                                               audio_io_handle_t audioIo); +        status_t removeAudioDeviceCallback(const sp<AudioDeviceCallback>& callback, +                                           audio_io_handle_t audioIo); + +        audio_port_handle_t getDeviceIdForIo(audio_io_handle_t audioIo); +      private:          Mutex                               mLock; -        DefaultKeyedVector<audio_io_handle_t, sp<AudioIoDescriptor> > mIoDescriptors; - +        DefaultKeyedVector<audio_io_handle_t, sp<AudioIoDescriptor> >   mIoDescriptors; +        DefaultKeyedVector<audio_io_handle_t, Vector < sp<AudioDeviceCallback> > > +                                                                        mAudioDeviceCallbacks;          // cached values for recording getInputBufferSize() queries          size_t                              mInBuffSize;    // zero indicates cache is invalid          uint32_t                            mInSamplingRate; @@ -377,8 +405,8 @@ private:          AudioPolicyServiceClient() {          } -        status_t addAudioPortCallback(const sp<AudioPortCallback>& callBack); -        status_t removeAudioPortCallback(const sp<AudioPortCallback>& callBack); +        status_t addAudioPortCallback(const sp<AudioPortCallback>& callback); +        status_t removeAudioPortCallback(const sp<AudioPortCallback>& callback);          // DeathRecipient          virtual void binderDied(const wp<IBinder>& who); @@ -393,6 +421,9 @@ private:          Vector <sp <AudioPortCallback> >    mAudioPortCallbacks;      }; +    static const sp<AudioFlingerClient> getAudioFlingerClient(); +    static sp<AudioIoDescriptor> getIoDescriptor(audio_io_handle_t ioHandle); +      static sp<AudioFlingerClient> gAudioFlingerClient;      static sp<AudioPolicyServiceClient> gAudioPolicyServiceClient;      friend class AudioFlingerClient; diff --git a/include/media/AudioTrack.h b/include/media/AudioTrack.h index 0ccd19e..458f4b4 100644 --- a/include/media/AudioTrack.h +++ b/include/media/AudioTrack.h @@ -510,7 +510,7 @@ public:       */              status_t    setOutputDevice(audio_port_handle_t deviceId); -    /* Returns the ID of the audio device used for output of this AudioTrack. +    /* Returns the ID of the audio device selected for this AudioTrack.       * A value of AUDIO_PORT_HANDLE_NONE indicates default (AudioPolicyManager) routing.       *       * Parameters: @@ -518,6 +518,15 @@ public:       */       audio_port_handle_t getOutputDevice(); +     /* Returns the ID of the audio device actually used by the output to which this AudioTrack is +      * attached. +      * A value of AUDIO_PORT_HANDLE_NONE indicates the audio track is not attached to any output. +      * +      * Parameters: +      *  none. +      */ +     audio_port_handle_t getRoutedDeviceId(); +      /* Returns the unique session ID associated with this track.       *       * Parameters: @@ -664,6 +673,28 @@ public:       */              status_t    getTimestamp(AudioTimestamp& timestamp); +    /* Add an AudioDeviceCallback. The caller will be notified when the audio device to which this +     * AudioTrack is routed is updated. +     * Replaces any previously installed callback. +     * Parameters: +     *  callback:  The callback interface +     * Returns NO_ERROR if successful. +     *         INVALID_OPERATION if the same callback is already installed. +     *         NO_INIT or PREMISSION_DENIED if AudioFlinger service is not reachable +     *         BAD_VALUE if the callback is NULL +     */ +            status_t addAudioDeviceCallback(const sp<AudioSystem::AudioDeviceCallback>& callback); + +    /* remove an AudioDeviceCallback. +     * Parameters: +     *  callback:  The callback interface +     * Returns NO_ERROR if successful. +     *         INVALID_OPERATION if the callback is not installed +     *         BAD_VALUE if the callback is NULL +     */ +            status_t removeAudioDeviceCallback( +                    const sp<AudioSystem::AudioDeviceCallback>& callback); +  protected:      /* copying audio tracks is not allowed */                          AudioTrack(const AudioTrack& other); @@ -885,6 +916,8 @@ private:      uint32_t                mSequence;              // incremented for each new IAudioTrack attempt      int                     mClientUid;      pid_t                   mClientPid; + +    sp<AudioSystem::AudioDeviceCallback> mDeviceCallback;  };  class TimedAudioTrack : public AudioTrack diff --git a/include/media/MediaResourcePolicy.h b/include/media/MediaResourcePolicy.h index 1e1c341..9bc2eec 100644 --- a/include/media/MediaResourcePolicy.h +++ b/include/media/MediaResourcePolicy.h @@ -29,7 +29,7 @@ extern const char kPolicySupportsSecureWithNonSecureCodec[];  class MediaResourcePolicy {  public:      MediaResourcePolicy(); -    MediaResourcePolicy(String8 type, uint64_t value); +    MediaResourcePolicy(String8 type, String8 value);      void readFromParcel(const Parcel &parcel);      void writeToParcel(Parcel *parcel) const; @@ -37,7 +37,7 @@ public:      String8 toString() const;      String8 mType; -    uint64_t mValue; +    String8 mValue;  };  }; // namespace android diff --git a/include/media/RingBuffer.h b/include/media/RingBuffer.h new file mode 100644 index 0000000..df7c00e --- /dev/null +++ b/include/media/RingBuffer.h @@ -0,0 +1,361 @@ +/* + * Copyright (C) 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 ANDROID_SERVICE_UTILS_RING_BUFFER_H +#define ANDROID_SERVICE_UTILS_RING_BUFFER_H + +#include <utils/Log.h> +#include <cutils/compiler.h> + +#include <iterator> +#include <utility> +#include <vector> + +namespace android { + +/** + * A RingBuffer class that maintains an array of objects that can grow up to a certain size. + * Elements added to the RingBuffer are inserted in the logical front of the buffer, and + * invalidate all current iterators for that RingBuffer object. + */ +template <class T> +class RingBuffer final { +public: + +    /** +     * Construct a RingBuffer that can grow up to the given length. +     */ +    RingBuffer(size_t length); + +    /** +     * Forward iterator to this class.  Implements an std:forward_iterator. +     */ +    class iterator : public std::iterator<std::forward_iterator_tag, T> { +    public: +        iterator(T* ptr, size_t size, size_t pos, size_t ctr); + +        iterator& operator++(); + +        iterator operator++(int); + +        bool operator==(const iterator& rhs); + +        bool operator!=(const iterator& rhs); + +        T& operator*(); + +        T* operator->(); + +    private: +        T* mPtr; +        size_t mSize; +        size_t mPos; +        size_t mCtr; +    }; + +    /** +     * Constant forward iterator to this class.  Implements an std:forward_iterator. +     */ +    class const_iterator : public std::iterator<std::forward_iterator_tag, T> { +    public: +        const_iterator(const T* ptr, size_t size, size_t pos, size_t ctr); + +        const_iterator& operator++(); + +        const_iterator operator++(int); + +        bool operator==(const const_iterator& rhs); + +        bool operator!=(const const_iterator& rhs); + +        const T& operator*(); + +        const T* operator->(); + +    private: +        const T* mPtr; +        size_t mSize; +        size_t mPos; +        size_t mCtr; +    }; + +    /** +     * Adds item to the front of this RingBuffer.  If the RingBuffer is at its maximum length, +     * this will result in the last element being replaced (this is done using the element's +     * assignment operator). +     * +     * All current iterators are invalidated. +     */ +    void add(const T& item); + +    /** +     * Moves item to the front of this RingBuffer.  Following a call to this, item should no +     * longer be used.  If the RingBuffer is at its maximum length, this will result in the +     * last element being replaced (this is done using the element's assignment operator). +     * +     * All current iterators are invalidated. +     */ +    void add(T&& item); + +    /** +     * Construct item in-place in the front of this RingBuffer using the given arguments.  If +     * the RingBuffer is at its maximum length, this will result in the last element being +     * replaced (this is done using the element's assignment operator). +     * +     * All current iterators are invalidated. +     */ +    template <class... Args> +    void emplace(Args&&... args); + +    /** +     * Get an iterator to the front of this RingBuffer. +     */ +    iterator begin(); + +    /** +     * Get an iterator to the end of this RingBuffer. +     */ +    iterator end(); + +    /** +     * Get a const_iterator to the front of this RingBuffer. +     */ +    const_iterator begin() const; + +    /** +     * Get a const_iterator to the end of this RingBuffer. +     */ +    const_iterator end() const; + +    /** +     * Return a reference to the element at a given index.  If the index is out of range for +     * this ringbuffer, [0, size), the behavior for this is undefined. +     */ +    T& operator[](size_t index); + +    /** +     * Return a const reference to the element at a given index.  If the index is out of range +     * for this ringbuffer, [0, size), the behavior for this is undefined. +     */ +    const T& operator[](size_t index) const; + +    /** +     * Return the current size of this RingBuffer. +     */ +    size_t size() const; + +    /** +     * Remove all elements from this RingBuffer and set the size to 0. +     */ +    void clear(); + +private: +    size_t mFrontIdx; +    size_t mMaxBufferSize; +    std::vector<T> mBuffer; +}; // class RingBuffer + + +template <class T> +RingBuffer<T>::RingBuffer(size_t length) : mFrontIdx{0}, mMaxBufferSize{length} {} + +template <class T> +RingBuffer<T>::iterator::iterator(T* ptr, size_t size, size_t pos, size_t ctr) : +        mPtr{ptr}, mSize{size}, mPos{pos}, mCtr{ctr} {} + +template <class T> +typename RingBuffer<T>::iterator& RingBuffer<T>::iterator::operator++() { +    ++mCtr; + +    if (CC_UNLIKELY(mCtr == mSize)) { +        mPos = mSize; +        return *this; +    } + +    mPos = ((CC_UNLIKELY(mPos == 0)) ? mSize - 1 : mPos - 1); +    return *this; +} + +template <class T> +typename RingBuffer<T>::iterator RingBuffer<T>::iterator::operator++(int) { +    iterator tmp{mPtr, mSize, mPos, mCtr}; +    ++(*this); +    return tmp; +} + +template <class T> +bool RingBuffer<T>::iterator::operator==(const iterator& rhs) { +    return (mPtr + mPos) == (rhs.mPtr + rhs.mPos); +} + +template <class T> +bool RingBuffer<T>::iterator::operator!=(const iterator& rhs) { +    return (mPtr + mPos) != (rhs.mPtr + rhs.mPos); +} + +template <class T> +T& RingBuffer<T>::iterator::operator*() { +    return *(mPtr + mPos); +} + +template <class T> +T* RingBuffer<T>::iterator::operator->() { +    return mPtr + mPos; +} + +template <class T> +RingBuffer<T>::const_iterator::const_iterator(const T* ptr, size_t size, size_t pos, size_t ctr) : +        mPtr{ptr}, mSize{size}, mPos{pos}, mCtr{ctr} {} + +template <class T> +typename RingBuffer<T>::const_iterator& RingBuffer<T>::const_iterator::operator++() { +    ++mCtr; + +    if (CC_UNLIKELY(mCtr == mSize)) { +        mPos = mSize; +        return *this; +    } + +    mPos = ((CC_UNLIKELY(mPos == 0)) ? mSize - 1 : mPos - 1); +    return *this; +} + +template <class T> +typename RingBuffer<T>::const_iterator RingBuffer<T>::const_iterator::operator++(int) { +    const_iterator tmp{mPtr, mSize, mPos, mCtr}; +    ++(*this); +    return tmp; +} + +template <class T> +bool RingBuffer<T>::const_iterator::operator==(const const_iterator& rhs) { +    return (mPtr + mPos) == (rhs.mPtr + rhs.mPos); +} + +template <class T> +bool RingBuffer<T>::const_iterator::operator!=(const const_iterator& rhs) { +    return (mPtr + mPos) != (rhs.mPtr + rhs.mPos); +} + +template <class T> +const T& RingBuffer<T>::const_iterator::operator*() { +    return *(mPtr + mPos); +} + +template <class T> +const T* RingBuffer<T>::const_iterator::operator->() { +    return mPtr + mPos; +} + +template <class T> +void RingBuffer<T>::add(const T& item) { +    if (mBuffer.size() < mMaxBufferSize) { +        mBuffer.push_back(item); +        mFrontIdx = ((mFrontIdx + 1) % mMaxBufferSize); +        return; +    } + +    mBuffer[mFrontIdx] = item; +    mFrontIdx = ((mFrontIdx + 1) % mMaxBufferSize); +} + +template <class T> +void RingBuffer<T>::add(T&& item) { +    if (mBuffer.size() != mMaxBufferSize) { +        mBuffer.push_back(std::forward<T>(item)); +        mFrontIdx = ((mFrontIdx + 1) % mMaxBufferSize); +        return; +    } + +    // Only works for types with move assignment operator +    mBuffer[mFrontIdx] = std::forward<T>(item); +    mFrontIdx = ((mFrontIdx + 1) % mMaxBufferSize); +} + +template <class T> +template <class... Args> +void RingBuffer<T>::emplace(Args&&... args) { +    if (mBuffer.size() != mMaxBufferSize) { +        mBuffer.emplace_back(std::forward<Args>(args)...); +        mFrontIdx = ((mFrontIdx + 1) % mMaxBufferSize); +        return; +    } + +    // Only works for types with move assignment operator +    mBuffer[mFrontIdx] = T(std::forward<Args>(args)...); +    mFrontIdx = ((mFrontIdx + 1) % mMaxBufferSize); +} + +template <class T> +typename RingBuffer<T>::iterator RingBuffer<T>::begin() { +    size_t tmp = (mBuffer.size() == 0) ? 0 : mBuffer.size() - 1; +    return iterator(mBuffer.data(), mBuffer.size(), (mFrontIdx == 0) ? tmp : mFrontIdx - 1, 0); +} + +template <class T> +typename RingBuffer<T>::iterator RingBuffer<T>::end() { +    size_t s = mBuffer.size(); +    return iterator(mBuffer.data(), s, s, s); +} + +template <class T> +typename RingBuffer<T>::const_iterator RingBuffer<T>::begin() const { +    size_t tmp = (mBuffer.size() == 0) ? 0 : mBuffer.size() - 1; +    return const_iterator(mBuffer.data(), mBuffer.size(), +            (mFrontIdx == 0) ? tmp : mFrontIdx - 1, 0); +} + +template <class T> +typename RingBuffer<T>::const_iterator RingBuffer<T>::end() const { +    size_t s = mBuffer.size(); +    return const_iterator(mBuffer.data(), s, s, s); +} + +template <class T> +T& RingBuffer<T>::operator[](size_t index) { +    LOG_ALWAYS_FATAL_IF(index >= mBuffer.size(), "Index %zu out of bounds, size is %zu.", +            index, mBuffer.size()); +    size_t pos = (index >= mFrontIdx) ? +            mBuffer.size() - 1 - (index - mFrontIdx) : mFrontIdx - 1 - index; +    return mBuffer[pos]; +} + +template <class T> +const T& RingBuffer<T>::operator[](size_t index) const { +    LOG_ALWAYS_FATAL_IF(index >= mBuffer.size(), "Index %zu out of bounds, size is %zu.", +            index, mBuffer.size()); +    size_t pos = (index >= mFrontIdx) ? +            mBuffer.size() - 1 - (index - mFrontIdx) : mFrontIdx - 1 - index; +    return mBuffer[pos]; +} + +template <class T> +size_t RingBuffer<T>::size() const { +    return mBuffer.size(); +} + +template <class T> +void RingBuffer<T>::clear() { +    mBuffer.clear(); +    mFrontIdx = 0; +} + +}; // namespace android + +#endif // ANDROID_SERVICE_UTILS_RING_BUFFER_H + + diff --git a/include/media/stagefright/ACodec.h b/include/media/stagefright/ACodec.h index cdb923d..b8327a3 100644 --- a/include/media/stagefright/ACodec.h +++ b/include/media/stagefright/ACodec.h @@ -216,6 +216,7 @@ private:      int32_t mChannelMask;      unsigned mDequeueCounter;      bool mStoreMetaDataInOutputBuffers; +    bool mLegacyAdaptiveExperiment;      int32_t mMetaDataBuffersToSubmit;      size_t mNumUndequeuedBuffers; @@ -236,9 +237,6 @@ private:      status_t freeBuffer(OMX_U32 portIndex, size_t i);      status_t handleSetSurface(const sp<Surface> &surface); -    status_t setNativeWindowSizeFormatAndUsage( -            ANativeWindow *nativeWindow /* nonnull */, -            int width, int height, int format, int rotation, int usage);      status_t setupNativeWindowSizeFormatAndUsage(ANativeWindow *nativeWindow /* nonnull */);      status_t configureOutputBuffersFromNativeWindow( @@ -332,8 +330,6 @@ private:      status_t initNativeWindow(); -    status_t pushBlankBuffersToNativeWindow(); -      // Returns true iff all buffers on the given port have status      // OWNED_BY_US or OWNED_BY_NATIVE_WINDOW.      bool allYourBuffersAreBelongToUs(OMX_U32 portIndex); diff --git a/include/media/stagefright/MediaCodec.h b/include/media/stagefright/MediaCodec.h index f5d523d..82c768d 100644 --- a/include/media/stagefright/MediaCodec.h +++ b/include/media/stagefright/MediaCodec.h @@ -164,6 +164,11 @@ protected:      virtual void onMessageReceived(const sp<AMessage> &msg);  private: +    // used by ResourceManagerClient +    status_t reclaim(); +    friend struct ResourceManagerClient; + +private:      enum State {          UNINITIALIZED,          INITIALIZING, @@ -224,6 +229,7 @@ private:          kFlagGatherCodecSpecificData    = 512,          kFlagIsAsync                    = 1024,          kFlagIsComponentAllocated       = 2048, +        kFlagPushBlankBuffersOnShutdown = 4096,      };      struct BufferInfo { @@ -261,6 +267,7 @@ private:      };      State mState; +    bool mReleasedByResourceManager;      sp<ALooper> mLooper;      sp<ALooper> mCodecLooper;      sp<CodecBase> mCodec; @@ -320,7 +327,7 @@ private:      static status_t PostAndAwaitResponse(              const sp<AMessage> &msg, sp<AMessage> *response); -    static void PostReplyWithError(const sp<AReplyToken> &replyID, int32_t err); +    void PostReplyWithError(const sp<AReplyToken> &replyID, int32_t err);      status_t init(const AString &name, bool nameIsType, bool encoder); diff --git a/include/media/stagefright/MediaCodecList.h b/include/media/stagefright/MediaCodecList.h index 9d1d675..ce34338 100644 --- a/include/media/stagefright/MediaCodecList.h +++ b/include/media/stagefright/MediaCodecList.h @@ -54,7 +54,7 @@ struct MediaCodecList : public BnMediaCodecList {      static sp<IMediaCodecList> getLocalInstance();      // only to be used in getLocalInstance -    void updateDetailsForMultipleCodecs(const KeyedVector<AString, CodecSettings>& updates); +    void parseTopLevelXMLFile(const char *path, bool ignore_errors = false);  private:      class BinderDeathObserver : public IBinder::DeathRecipient { @@ -97,7 +97,6 @@ private:      status_t initCheck() const;      void parseXMLFile(const char *path); -    void parseTopLevelXMLFile(const char *path, bool ignore_errors = false);      static void StartElementHandlerWrapper(              void *me, const char *name, const char **attrs); diff --git a/include/media/stagefright/OMXCodec.h b/include/media/stagefright/OMXCodec.h index 84b1b1a..7fabcb3 100644 --- a/include/media/stagefright/OMXCodec.h +++ b/include/media/stagefright/OMXCodec.h @@ -298,7 +298,6 @@ private:      status_t queueBufferToNativeWindow(BufferInfo *info);      status_t cancelBufferToNativeWindow(BufferInfo *info);      BufferInfo* dequeueBufferFromNativeWindow(); -    status_t pushBlankBuffersToNativeWindow();      status_t freeBuffersOnPort(              OMX_U32 portIndex, bool onlyThoseWeOwn = false); @@ -347,7 +346,6 @@ private:      status_t configureCodec(const sp<MetaData> &meta); -    status_t applyRotation();      status_t waitForBufferFilled_l();      int64_t getDecodingTimeUs(); diff --git a/include/media/stagefright/SurfaceUtils.h b/include/media/stagefright/SurfaceUtils.h new file mode 100644 index 0000000..c1a9c0a --- /dev/null +++ b/include/media/stagefright/SurfaceUtils.h @@ -0,0 +1,34 @@ +/* + * 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 SURFACE_UTILS_H_ + +#define SURFACE_UTILS_H_ + +#include <utils/Errors.h> + +struct ANativeWindow; + +namespace android { + +status_t setNativeWindowSizeFormatAndUsage( +        ANativeWindow *nativeWindow /* nonnull */, +        int width, int height, int format, int rotation, int usage); +status_t pushBlankBuffersToNativeWindow(ANativeWindow *nativeWindow /* nonnull */); + +} // namespace android + +#endif  // SURFACE_UTILS_H_ diff --git a/include/media/stagefright/foundation/ADebug.h b/include/media/stagefright/foundation/ADebug.h index 1d0e2cb..a97dd9b 100644 --- a/include/media/stagefright/foundation/ADebug.h +++ b/include/media/stagefright/foundation/ADebug.h @@ -108,6 +108,26 @@ struct ADebug {      // remove redundant segments of a codec name, and return a newly allocated      // string suitable for debugging      static char *GetDebugName(const char *name); + +    inline static bool isExperimentEnabled( +            const char *name __unused /* nonnull */, bool allow __unused = true) { +#ifdef ENABLE_STAGEFRIGHT_EXPERIMENTS +        if (!strcmp(name, "legacy-adaptive")) { +            return getExperimentFlag(allow, name, 2, 1); // every other day +        } else if (!strcmp(name, "legacy-setsurface")) { +            return getExperimentFlag(allow, name, 3, 1); // every third day +        } else { +            ALOGE("unknown experiment '%s' (disabled)", name); +        } +#endif +        return false; +    } + +private: +    // pass in allow, so we can print in the log if the experiment is disabled +    static bool getExperimentFlag( +            bool allow, const char *name, uint64_t modulo, uint64_t limit, +            uint64_t plus = 0, uint64_t timeDivisor = 24 * 60 * 60 /* 1 day */);  };  }  // namespace android  | 
