diff options
| author | Lajos Molnar <lajos@google.com> | 2015-04-24 17:10:07 -0700 | 
|---|---|---|
| committer | Lajos Molnar <lajos@google.com> | 2015-04-30 16:56:10 -0700 | 
| commit | 3a474aa67fc31505740526dd249d96204c08bf79 (patch) | |
| tree | 4db784ee57ffad037fa2ded86d0fd8b3a40173d5 /include | |
| parent | a8df0b716bdfda1e10790e6f7297eeff83d2e52a (diff) | |
| download | frameworks_av-3a474aa67fc31505740526dd249d96204c08bf79.zip frameworks_av-3a474aa67fc31505740526dd249d96204c08bf79.tar.gz frameworks_av-3a474aa67fc31505740526dd249d96204c08bf79.tar.bz2  | |
stagefright: support setting/getting playback/sync config in MediaSync
Bug: 18249558
Bug: 19666434
Bug: 20057497
Change-Id: I5868b17423d7c20cfaf4a399f3eb67bfba440605
Diffstat (limited to 'include')
| -rw-r--r-- | include/media/AVSyncSettings.h | 61 | ||||
| -rw-r--r-- | include/media/AudioTrack.h | 6 | ||||
| -rw-r--r-- | include/media/IMediaPlayer.h | 8 | ||||
| -rw-r--r-- | include/media/MediaPlayerInterface.h | 31 | ||||
| -rw-r--r-- | include/media/mediaplayer.h | 13 | ||||
| -rw-r--r-- | include/media/stagefright/AudioPlayer.h | 6 | ||||
| -rw-r--r-- | include/media/stagefright/MediaSync.h | 56 | ||||
| -rw-r--r-- | include/media/stagefright/Utils.h | 9 | 
8 files changed, 168 insertions, 22 deletions
diff --git a/include/media/AVSyncSettings.h b/include/media/AVSyncSettings.h new file mode 100644 index 0000000..10e3bcc --- /dev/null +++ b/include/media/AVSyncSettings.h @@ -0,0 +1,61 @@ +/* + * 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 ANDROID_AV_SYNC_SETTINGS_H +#define ANDROID_AV_SYNC_SETTINGS_H + +namespace android { + +enum AVSyncSource : unsigned { +    // let the system decide the best sync source +    AVSYNC_SOURCE_DEFAULT = 0, +    // sync to the system clock +    AVSYNC_SOURCE_SYSTEM_CLOCK = 1, +    // sync to the audio track +    AVSYNC_SOURCE_AUDIO = 2, +    // sync to the display vsync +    AVSYNC_SOURCE_VSYNC = 3, +    AVSYNC_SOURCE_MAX, +}; + +enum AVSyncAudioAdjustMode : unsigned { +    // let the system decide the best audio adjust mode +    AVSYNC_AUDIO_ADJUST_MODE_DEFAULT = 0, +    // adjust audio by time stretching +    AVSYNC_AUDIO_ADJUST_MODE_STRETCH = 1, +    // adjust audio by resampling +    AVSYNC_AUDIO_ADJUST_MODE_RESAMPLE = 2, +    AVSYNC_AUDIO_ADJUST_MODE_MAX, +}; + +// max tolerance when adjusting playback speed to desired playback speed +#define AVSYNC_TOLERANCE_MAX 1.0f + +struct AVSyncSettings { +    AVSyncSource mSource; +    AVSyncAudioAdjustMode mAudioAdjustMode; +    float mTolerance; +    AVSyncSettings() +        : mSource(AVSYNC_SOURCE_DEFAULT), +          mAudioAdjustMode(AVSYNC_AUDIO_ADJUST_MODE_DEFAULT), +          mTolerance(.044f) { } +}; + +} // namespace android + +// --------------------------------------------------------------------------- + +#endif // ANDROID_AV_SYNC_SETTINGS_H diff --git a/include/media/AudioTrack.h b/include/media/AudioTrack.h index d361901..51d40bb 100644 --- a/include/media/AudioTrack.h +++ b/include/media/AudioTrack.h @@ -360,6 +360,11 @@ public:      /* Return current source sample rate in Hz */              uint32_t    getSampleRate() const; +    /* Return the original source sample rate in Hz. This corresponds to the sample rate +     * if playback rate had normal speed and pitch. +     */ +            uint32_t    getOriginalSampleRate() const; +      /* Set source playback rate for timestretch       * 1.0 is normal speed: < 1.0 is slower, > 1.0 is faster       * 1.0 is normal pitch: < 1.0 is lower pitch, > 1.0 is higher pitch @@ -749,6 +754,7 @@ protected:      float                   mVolume[2];      float                   mSendLevel;      mutable uint32_t        mSampleRate;            // mutable because getSampleRate() can update it +    uint32_t                mOriginalSampleRate;      AudioPlaybackRate       mPlaybackRate;      size_t                  mFrameCount;            // corresponds to current IAudioTrack, value is                                                      // reported back by AudioFlinger to the client diff --git a/include/media/IMediaPlayer.h b/include/media/IMediaPlayer.h index df6130d..0fd8933 100644 --- a/include/media/IMediaPlayer.h +++ b/include/media/IMediaPlayer.h @@ -35,6 +35,8 @@ class IDataSource;  struct IStreamSource;  class IGraphicBufferProducer;  struct IMediaHTTPService; +struct AudioPlaybackRate; +struct AVSyncSettings;  class IMediaPlayer: public IInterface  { @@ -58,7 +60,11 @@ public:      virtual status_t        stop() = 0;      virtual status_t        pause() = 0;      virtual status_t        isPlaying(bool* state) = 0; -    virtual status_t        setPlaybackRate(float rate) = 0; +    virtual status_t        setPlaybackSettings(const AudioPlaybackRate& rate) = 0; +    virtual status_t        getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */) = 0; +    virtual status_t        setSyncSettings(const AVSyncSettings& sync, float videoFpsHint) = 0; +    virtual status_t        getSyncSettings(AVSyncSettings* sync /* nonnull */, +                                            float* videoFps /* nonnull */) = 0;      virtual status_t        seekTo(int msec) = 0;      virtual status_t        getCurrentPosition(int* msec) = 0;      virtual status_t        getDuration(int* msec) = 0; diff --git a/include/media/MediaPlayerInterface.h b/include/media/MediaPlayerInterface.h index 824762a..fa917f9 100644 --- a/include/media/MediaPlayerInterface.h +++ b/include/media/MediaPlayerInterface.h @@ -26,8 +26,10 @@  #include <utils/RefBase.h>  #include <media/mediaplayer.h> +#include <media/AudioResamplerPublic.h>  #include <media/AudioSystem.h>  #include <media/AudioTimestamp.h> +#include <media/AVSyncSettings.h>  #include <media/Metadata.h>  // Fwd decl to make sure everyone agrees that the scope of struct sockaddr_in is @@ -132,7 +134,8 @@ public:          virtual void        pause() = 0;          virtual void        close() = 0; -        virtual status_t    setPlaybackRatePermille(int32_t /* rate */) { return INVALID_OPERATION;} +        virtual status_t    setPlaybackRate(const AudioPlaybackRate& rate) = 0; +        virtual status_t    getPlaybackRate(AudioPlaybackRate* rate /* nonnull */) = 0;          virtual bool        needsTrailingPadding() { return true; }          virtual status_t    setParameters(const String8& /* keyValuePairs */) { return NO_ERROR; } @@ -173,7 +176,31 @@ public:      virtual status_t    stop() = 0;      virtual status_t    pause() = 0;      virtual bool        isPlaying() = 0; -    virtual status_t    setPlaybackRate(float /* rate */) { return INVALID_OPERATION; } +    virtual status_t    setPlaybackSettings(const AudioPlaybackRate& rate) { +        // by default, players only support setting rate to the default +        if (!isAudioPlaybackRateEqual(rate, AUDIO_PLAYBACK_RATE_DEFAULT)) { +            return BAD_VALUE; +        } +        return OK; +    } +    virtual status_t    getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */) { +        *rate = AUDIO_PLAYBACK_RATE_DEFAULT; +        return OK; +    } +    virtual status_t    setSyncSettings(const AVSyncSettings& sync, float /* videoFps */) { +        // By default, players only support setting sync source to default; all other sync +        // settings are ignored. There is no requirement for getters to return set values. +        if (sync.mSource != AVSYNC_SOURCE_DEFAULT) { +            return BAD_VALUE; +        } +        return OK; +    } +    virtual status_t    getSyncSettings( +                                AVSyncSettings* sync /* nonnull */, float* videoFps /* nonnull */) { +        *sync = AVSyncSettings(); +        *videoFps = -1.f; +        return OK; +    }      virtual status_t    seekTo(int msec) = 0;      virtual status_t    getCurrentPosition(int *msec) = 0;      virtual status_t    getDuration(int *msec) = 0; diff --git a/include/media/mediaplayer.h b/include/media/mediaplayer.h index 256fa9a..3fe749c 100644 --- a/include/media/mediaplayer.h +++ b/include/media/mediaplayer.h @@ -20,6 +20,8 @@  #include <arpa/inet.h>  #include <binder/IMemory.h> + +#include <media/AudioResamplerPublic.h>  #include <media/IMediaPlayerClient.h>  #include <media/IMediaPlayer.h>  #include <media/IMediaDeathNotifier.h> @@ -32,8 +34,9 @@ class ANativeWindow;  namespace android { -class Surface; +struct AVSyncSettings;  class IGraphicBufferProducer; +class Surface;  enum media_event_type {      MEDIA_NOP               = 0, // interface test message @@ -223,7 +226,12 @@ public:              status_t        stop();              status_t        pause();              bool            isPlaying(); -            status_t        setPlaybackRate(float rate); +            status_t        setPlaybackSettings(const AudioPlaybackRate& rate); +            status_t        getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */); +            status_t        setSyncSettings(const AVSyncSettings& sync, float videoFpsHint); +            status_t        getSyncSettings( +                                    AVSyncSettings* sync /* nonnull */, +                                    float* videoFps /* nonnull */);              status_t        getVideoWidth(int *w);              status_t        getVideoHeight(int *h);              status_t        seekTo(int msec); @@ -278,7 +286,6 @@ private:      int                         mVideoWidth;      int                         mVideoHeight;      int                         mAudioSessionId; -    float                       mPlaybackRate;      float                       mSendLevel;      struct sockaddr_in          mRetransmitEndpoint;      bool                        mRetransmitEndpointValid; diff --git a/include/media/stagefright/AudioPlayer.h b/include/media/stagefright/AudioPlayer.h index 98c4fa7..e0cd965 100644 --- a/include/media/stagefright/AudioPlayer.h +++ b/include/media/stagefright/AudioPlayer.h @@ -25,9 +25,10 @@  namespace android { -class MediaSource; +struct AudioPlaybackRate;  class AudioTrack;  struct AwesomePlayer; +class MediaSource;  class AudioPlayer : public TimeSource {  public: @@ -73,7 +74,8 @@ public:      bool isSeeking();      bool reachedEOS(status_t *finalStatus); -    status_t setPlaybackRatePermille(int32_t ratePermille); +    status_t setPlaybackRate(const AudioPlaybackRate &rate); +    status_t getPlaybackRate(AudioPlaybackRate *rate /* nonnull */);      void notifyAudioEOS(); diff --git a/include/media/stagefright/MediaSync.h b/include/media/stagefright/MediaSync.h index e071b65..a349986 100644 --- a/include/media/stagefright/MediaSync.h +++ b/include/media/stagefright/MediaSync.h @@ -20,6 +20,8 @@  #include <gui/IConsumerListener.h>  #include <gui/IProducerListener.h> +#include <media/AudioResamplerPublic.h> +#include <media/AVSyncSettings.h>  #include <media/stagefright/foundation/AHandler.h>  #include <utils/Condition.h> @@ -77,10 +79,7 @@ public:      // Called when audio track is used as media clock source. It should be      // called before updateQueuedAudioData(). -    // |nativeSampleRateInHz| is the sample rate of audio data fed into audio -    // track. It's the same number used to create AudioTrack. -    status_t configureAudioTrack( -            const sp<AudioTrack> &audioTrack, uint32_t nativeSampleRateInHz); +    status_t configureAudioTrack(const sp<AudioTrack> &audioTrack);      // Create a surface for client to render video frames. This is the surface      // on which the client should render video frames. Those video frames will @@ -99,21 +98,31 @@ public:      // Set the consumer name of the input queue.      void setName(const AString &name); -    // Set the playback in a desired speed. -    // This method can be called any time. -    // |rate| is the ratio between desired speed and the normal one, and should -    // be non-negative. The meaning of rate values: -    // 1.0 -- normal playback -    // 0.0 -- stop or pause -    // larger than 1.0 -- faster than normal speed -    // between 0.0 and 1.0 -- slower than normal speed -    status_t setPlaybackRate(float rate); -      // Get the media clock used by the MediaSync so that the client can obtain      // corresponding media time or real time via      // MediaClock::getMediaTime() and MediaClock::getRealTimeFor().      sp<const MediaClock> getMediaClock(); +    // Set the video frame rate hint - this is used by the video FrameScheduler +    status_t setVideoFrameRateHint(float rate); + +    // Get the video frame rate measurement from the FrameScheduler +    // returns -1 if there is no measurement +    float getVideoFrameRate(); + +    // Set the sync settings parameters. +    status_t setSyncSettings(const AVSyncSettings &syncSettings); + +    // Gets the sync settings parameters. +    void getSyncSettings(AVSyncSettings *syncSettings /* nonnull */); + +    // Sets the playback rate using playback settings. +    // This method can be called any time. +    status_t setPlaybackSettings(const AudioPlaybackRate &rate); + +    // Gets the playback rate (playback settings parameters). +    void getPlaybackSettings(AudioPlaybackRate *rate /* nonnull */); +      // Get the play time for pending audio frames in audio sink.      status_t getPlayTimeForPendingAudioFrames(int64_t *outTimeUs); @@ -201,6 +210,9 @@ private:      sp<ALooper> mLooper;      float mPlaybackRate; +    AudioPlaybackRate mPlaybackSettings; +    AVSyncSettings mSyncSettings; +      sp<MediaClock> mMediaClock;      MediaSync(); @@ -239,6 +251,22 @@ private:      // up. This must be called with mMutex locked.      void onAbandoned_l(bool isInput); +    // Set the playback in a desired speed. +    // This method can be called any time. +    // |rate| is the ratio between desired speed and the normal one, and should +    // be non-negative. The meaning of rate values: +    // 1.0 -- normal playback +    // 0.0 -- stop or pause +    // larger than 1.0 -- faster than normal speed +    // between 0.0 and 1.0 -- slower than normal speed +    void updatePlaybackRate_l(float rate); + +    // apply new sync settings +    void resync_l(); + +    // apply playback settings only - without resyncing or updating playback rate +    status_t setPlaybackSettings_l(const AudioPlaybackRate &rate); +      // helper.      bool isPlaying() { return mPlaybackRate != 0.0; } diff --git a/include/media/stagefright/Utils.h b/include/media/stagefright/Utils.h index 0ce1603..5e9d7d4 100644 --- a/include/media/stagefright/Utils.h +++ b/include/media/stagefright/Utils.h @@ -76,6 +76,15 @@ struct HLSTime {  bool operator <(const HLSTime &t0, const HLSTime &t1); +// read and write various object to/from AMessage + +void writeToAMessage(sp<AMessage> msg, const AudioPlaybackRate &rate); +void readFromAMessage(const sp<AMessage> &msg, AudioPlaybackRate *rate /* nonnull */); + +void writeToAMessage(sp<AMessage> msg, const AVSyncSettings &sync, float videoFpsHint); +void readFromAMessage( +        const sp<AMessage> &msg, AVSyncSettings *sync /* nonnull */, float *videoFps /* nonnull */); +  }  // namespace android  #endif  // UTILS_H_  | 
