blob: 2993ab10632598d0e1a363b6f9f63056114c8d8c [file] [log] [blame]
Wei Jia53692fa2017-12-11 10:33:46 -08001/*
2 * Copyright 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ANDROID_MEDIAPLAYER2_H
18#define ANDROID_MEDIAPLAYER2_H
19
Wei Jiaec044b02018-02-19 12:41:23 -080020#include <media/AVSyncSettings.h>
Wei Jia53692fa2017-12-11 10:33:46 -080021#include <media/AudioResamplerPublic.h>
22#include <media/BufferingSettings.h>
Wei Jiaec044b02018-02-19 12:41:23 -080023#include <media/mediaplayer_common.h>
24#include <mediaplayer2/MediaPlayer2Interface.h>
25#include <mediaplayer2/MediaPlayer2Types.h>
Dichen Zhangc2465c52018-11-12 11:56:05 -080026#include <mediaplayer2/JObjectHolder.h>
Wei Jia53692fa2017-12-11 10:33:46 -080027
Dichen Zhangf8726912018-10-17 13:31:26 -070028#include <jni.h>
Wei Jiaec044b02018-02-19 12:41:23 -080029#include <utils/Errors.h>
30#include <utils/Mutex.h>
31#include <utils/RefBase.h>
32#include <utils/String16.h>
33#include <utils/Vector.h>
34#include <system/audio-base.h>
Wei Jia53692fa2017-12-11 10:33:46 -080035
Dongwon Kang0d7042d2018-10-12 16:52:14 -070036#include "jni.h"
37
Wei Jia53692fa2017-12-11 10:33:46 -080038namespace android {
39
Wei Jia28288fb2017-12-15 13:45:29 -080040struct ANativeWindowWrapper;
Wei Jiac2636032018-02-01 09:15:25 -080041struct DataSourceDesc;
Wei Jiaec044b02018-02-19 12:41:23 -080042class MediaPlayer2AudioOutput;
Wei Jia53692fa2017-12-11 10:33:46 -080043
Wei Jia53692fa2017-12-11 10:33:46 -080044// ref-counted object for callbacks
45class MediaPlayer2Listener: virtual public RefBase
46{
47public:
Dongwon Kang41929fb2018-09-09 08:29:56 -070048 virtual void notify(int64_t srcId, int msg, int ext1, int ext2,
49 const PlayerMessage *obj = NULL) = 0;
Wei Jia53692fa2017-12-11 10:33:46 -080050};
51
Wei Jiaec044b02018-02-19 12:41:23 -080052class MediaPlayer2 : public MediaPlayer2InterfaceListener
Wei Jia53692fa2017-12-11 10:33:46 -080053{
54public:
Wei Jia53692fa2017-12-11 10:33:46 -080055 ~MediaPlayer2();
Wei Jiaec044b02018-02-19 12:41:23 -080056
Dichen Zhangfc9f40f2019-01-04 14:15:28 -080057 static sp<MediaPlayer2> Create(int32_t sessionId, jobject context);
Wei Jiaec044b02018-02-19 12:41:23 -080058 static status_t DumpAll(int fd, const Vector<String16>& args);
59
Wei Jia53692fa2017-12-11 10:33:46 -080060 void disconnect();
61
Wei Jiad2bb1bd2018-02-08 09:47:37 -080062 status_t getSrcId(int64_t *srcId);
Wei Jiac2636032018-02-01 09:15:25 -080063 status_t setDataSource(const sp<DataSourceDesc> &dsd);
Wei Jia57aeffd2018-02-15 16:01:14 -080064 status_t prepareNextDataSource(const sp<DataSourceDesc> &dsd);
65 status_t playNextDataSource(int64_t srcId);
Wei Jia28288fb2017-12-15 13:45:29 -080066 status_t setVideoSurfaceTexture(const sp<ANativeWindowWrapper>& nww);
Wei Jia53692fa2017-12-11 10:33:46 -080067 status_t setListener(const sp<MediaPlayer2Listener>& listener);
68 status_t getBufferingSettings(BufferingSettings* buffering /* nonnull */);
69 status_t setBufferingSettings(const BufferingSettings& buffering);
Wei Jia53692fa2017-12-11 10:33:46 -080070 status_t prepareAsync();
71 status_t start();
Wei Jia53692fa2017-12-11 10:33:46 -080072 status_t pause();
73 bool isPlaying();
Wei Jia1f043e42018-06-20 16:52:50 -070074 mediaplayer2_states getState();
Wei Jia53692fa2017-12-11 10:33:46 -080075 status_t setPlaybackSettings(const AudioPlaybackRate& rate);
76 status_t getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */);
77 status_t setSyncSettings(const AVSyncSettings& sync, float videoFpsHint);
78 status_t getSyncSettings(
79 AVSyncSettings* sync /* nonnull */,
80 float* videoFps /* nonnull */);
81 status_t getVideoWidth(int *w);
82 status_t getVideoHeight(int *h);
83 status_t seekTo(
Wei Jia800fe372018-02-20 15:00:45 -080084 int64_t msec,
Wei Jia53692fa2017-12-11 10:33:46 -080085 MediaPlayer2SeekMode mode = MediaPlayer2SeekMode::SEEK_PREVIOUS_SYNC);
86 status_t notifyAt(int64_t mediaTimeUs);
Wei Jia800fe372018-02-20 15:00:45 -080087 status_t getCurrentPosition(int64_t *msec);
Wei Jia17944af2018-12-13 18:13:10 -080088 status_t getDuration(int64_t srcId, int64_t *msec);
Wei Jia53692fa2017-12-11 10:33:46 -080089 status_t reset();
90 status_t setAudioStreamType(audio_stream_type_t type);
91 status_t getAudioStreamType(audio_stream_type_t *type);
92 status_t setLooping(int loop);
93 bool isLooping();
Dichen Zhang7398ca02018-10-15 10:25:12 -070094 status_t setVolume(float volume);
Wei Jiad2bb1bd2018-02-08 09:47:37 -080095 void notify(int64_t srcId, int msg, int ext1, int ext2,
Dongwon Kang41929fb2018-09-09 08:29:56 -070096 const PlayerMessage *obj = NULL);
Dongwon Kang9f631982018-07-10 12:34:41 -070097 status_t invoke(const PlayerMessage &request, PlayerMessage *reply);
Dichen Zhang23658642018-11-15 10:26:16 -080098 status_t setAudioSessionId(int32_t sessionId);
99 int32_t getAudioSessionId();
Wei Jia53692fa2017-12-11 10:33:46 -0800100 status_t setAuxEffectSendLevel(float level);
101 status_t attachAuxEffect(int effectId);
Dichen Zhangc2465c52018-11-12 11:56:05 -0800102 status_t setAudioAttributes(const jobject attributes);
103 jobject getAudioAttributes();
Wei Jia53692fa2017-12-11 10:33:46 -0800104 status_t getParameter(int key, Parcel* reply);
Ray Essick89269d62019-01-20 14:46:19 -0800105 status_t getMetrics(char **buffer, size_t *length);
Wei Jia53692fa2017-12-11 10:33:46 -0800106
Wei Jia53692fa2017-12-11 10:33:46 -0800107 // Modular DRM
Robert Shih3c3728d2018-12-04 17:06:36 -0800108 status_t prepareDrm(int64_t srcId,
109 const uint8_t uuid[16],
110 const Vector<uint8_t>& drmSessionId);
111 status_t releaseDrm(int64_t srcId);
Wei Jia53692fa2017-12-11 10:33:46 -0800112 // AudioRouting
Dongwon Kang0d7042d2018-10-12 16:52:14 -0700113 status_t setPreferredDevice(jobject device);
114 jobject getRoutedDevice();
Dichen Zhangf8726912018-10-17 13:31:26 -0700115 status_t addAudioDeviceCallback(jobject routingDelegate);
116 status_t removeAudioDeviceCallback(jobject listener);
Wei Jia53692fa2017-12-11 10:33:46 -0800117
Wei Jiaec044b02018-02-19 12:41:23 -0800118 status_t dump(int fd, const Vector<String16>& args);
Wei Jia53692fa2017-12-11 10:33:46 -0800119
Wei Jiaec044b02018-02-19 12:41:23 -0800120private:
Dichen Zhangfc9f40f2019-01-04 14:15:28 -0800121 MediaPlayer2(int32_t sessionId, jobject context);
Wei Jiaec044b02018-02-19 12:41:23 -0800122 bool init();
123
Wei Jiaec044b02018-02-19 12:41:23 -0800124 // Disconnect from the currently connected ANativeWindow.
125 void disconnectNativeWindow_l();
126
Dichen Zhangc2465c52018-11-12 11:56:05 -0800127 status_t setAudioAttributes_l(const jobject attributes);
Wei Jiaec044b02018-02-19 12:41:23 -0800128
129 void clear_l();
Wei Jia800fe372018-02-20 15:00:45 -0800130 status_t seekTo_l(int64_t msec, MediaPlayer2SeekMode mode);
Wei Jiaec044b02018-02-19 12:41:23 -0800131 status_t prepareAsync_l();
Wei Jia800fe372018-02-20 15:00:45 -0800132 status_t getDuration_l(int64_t *msec);
Wei Jiaec044b02018-02-19 12:41:23 -0800133 status_t reset_l();
Dichen Zhangc2465c52018-11-12 11:56:05 -0800134 status_t checkState_l();
Wei Jiaec044b02018-02-19 12:41:23 -0800135
136 pid_t mPid;
137 uid_t mUid;
138 sp<MediaPlayer2Interface> mPlayer;
139 sp<MediaPlayer2AudioOutput> mAudioOutput;
Wei Jiad2bb1bd2018-02-08 09:47:37 -0800140 int64_t mSrcId;
Wei Jia53692fa2017-12-11 10:33:46 -0800141 thread_id_t mLockThreadId;
Wei Jiaec044b02018-02-19 12:41:23 -0800142 mutable Mutex mLock;
Wei Jia53692fa2017-12-11 10:33:46 -0800143 Mutex mNotifyLock;
Wei Jia53692fa2017-12-11 10:33:46 -0800144 sp<MediaPlayer2Listener> mListener;
Wei Jia98787a72018-03-02 14:33:06 -0800145 media_player2_internal_states mCurrentState;
Wei Jia800fe372018-02-20 15:00:45 -0800146 int64_t mCurrentPosition;
Wei Jia53692fa2017-12-11 10:33:46 -0800147 MediaPlayer2SeekMode mCurrentSeekMode;
Wei Jia800fe372018-02-20 15:00:45 -0800148 int64_t mSeekPosition;
Wei Jia53692fa2017-12-11 10:33:46 -0800149 MediaPlayer2SeekMode mSeekMode;
Wei Jia53692fa2017-12-11 10:33:46 -0800150 audio_stream_type_t mStreamType;
Wei Jia53692fa2017-12-11 10:33:46 -0800151 bool mLoop;
Dichen Zhang7398ca02018-10-15 10:25:12 -0700152 float mVolume;
Wei Jia53692fa2017-12-11 10:33:46 -0800153 int mVideoWidth;
154 int mVideoHeight;
Dichen Zhang23658642018-11-15 10:26:16 -0800155 int32_t mAudioSessionId;
Dichen Zhangc2465c52018-11-12 11:56:05 -0800156 sp<JObjectHolder> mAudioAttributes;
Dichen Zhangfc9f40f2019-01-04 14:15:28 -0800157 sp<JObjectHolder> mContext;
Wei Jia53692fa2017-12-11 10:33:46 -0800158 float mSendLevel;
Wei Jiaec044b02018-02-19 12:41:23 -0800159 sp<ANativeWindowWrapper> mConnectedWindow;
Wei Jia53692fa2017-12-11 10:33:46 -0800160};
161
162}; // namespace android
163
164#endif // ANDROID_MEDIAPLAYER2_H