• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2020 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_MEDIA_SIMULATED_TRANSCODER_H
18 #define ANDROID_MEDIA_SIMULATED_TRANSCODER_H
19 
20 #include <android-base/thread_annotations.h>
21 #include <media/TranscoderInterface.h>
22 
23 #include <list>
24 #include <map>
25 #include <mutex>
26 
27 namespace android {
28 
29 /**
30  * SimulatedTranscoder is currently used to instantiate MediaTranscodingService
31  * on service side for testing, so that we could actually test the IPC calls of
32  * MediaTranscodingService to expose issues that's observable only over IPC.
33  * SimulatedTranscoder is used when useSimulatedTranscoder in TranscodingTestConfig
34  * is set to true.
35  *
36  * SimulatedTranscoder simulates session execution by reporting finish after kSessionDurationUs.
37  * Session lifecycle events are reported via progress updates with special progress
38  * numbers (equal to the Event's type).
39  */
40 class SimulatedTranscoder : public TranscoderInterface,
41                             public std::enable_shared_from_this<SimulatedTranscoder> {
42 public:
43     struct Event {
44         enum Type { NoEvent, Start, Pause, Resume, Stop, Finished, Failed, Abandon } type;
45         ClientIdType clientId;
46         SessionIdType sessionId;
47         std::function<void()> runnable;
48     };
49 
50     static constexpr int64_t kSessionDurationUs = 1000000;
51 
52     SimulatedTranscoder(const std::shared_ptr<TranscoderCallbackInterface>& cb);
53     ~SimulatedTranscoder();
54 
55     // TranscoderInterface
56     void start(ClientIdType clientId, SessionIdType sessionId,
57                const TranscodingRequestParcel& request, uid_t callingUid,
58                const std::shared_ptr<ITranscodingClientCallback>& clientCallback) override;
59     void pause(ClientIdType clientId, SessionIdType sessionId) override;
60     void resume(ClientIdType clientId, SessionIdType sessionId,
61                 const TranscodingRequestParcel& request, uid_t callingUid,
62                 const std::shared_ptr<ITranscodingClientCallback>& clientCallback) override;
63     void stop(ClientIdType clientId, SessionIdType sessionId, bool abandon = false) override;
64     // ~TranscoderInterface
65 
66 private:
67     std::weak_ptr<TranscoderCallbackInterface> mCallback;
68     std::mutex mLock;
69     std::condition_variable mCondition;
70     std::list<Event> mQueue GUARDED_BY(mLock);
71     bool mLooperReady;
72 
73     using SessionKeyType = std::pair<ClientIdType, SessionIdType>;
74     // map of session's remaining time in microsec.
75     std::map<SessionKeyType, std::chrono::microseconds> mRemainingTimeMap;
76 
77     static const char* toString(Event::Type type);
78     void queueEvent(Event::Type type, ClientIdType clientId, SessionIdType sessionId,
79                     std::function<void()> runnable);
80     void threadLoop();
81 };
82 
83 }  // namespace android
84 
85 #endif  // ANDROID_MEDIA_SIMULATED_TRANSCODER_H
86