blob: a782f716c0666223dabd2292036c5d02832b4c89 [file] [log] [blame]
Linus Nilsson0da327a2020-01-31 16:22:18 -08001/*
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#include <media/MediaTrackTranscoder.h>
Chong Zhang308e91f2020-06-10 15:27:56 -070018#include <media/MediaTrackTranscoderCallback.h>
Linus Nilsson0da327a2020-01-31 16:22:18 -080019
20#include <condition_variable>
21#include <memory>
22#include <mutex>
23
24namespace android {
25
26//
27// This file contains test utilities used by more than one track transcoder test.
28//
29
30class TrackTranscoderTestUtils {
31public:
32 static std::shared_ptr<AMediaFormat> getDefaultVideoDestinationFormat(
Linus Nilsson800793f2020-07-31 16:16:38 -070033 AMediaFormat* sourceFormat, bool includeBitrate = true) {
Linus Nilsson0da327a2020-01-31 16:22:18 -080034 // Default video destination format setup.
35 static constexpr float kFrameRate = 30.0f;
Linus Nilsson0da327a2020-01-31 16:22:18 -080036 static constexpr int32_t kBitRate = 2 * 1000 * 1000;
Linus Nilsson0da327a2020-01-31 16:22:18 -080037
38 AMediaFormat* destinationFormat = AMediaFormat_new();
39 AMediaFormat_copy(destinationFormat, sourceFormat);
40 AMediaFormat_setFloat(destinationFormat, AMEDIAFORMAT_KEY_FRAME_RATE, kFrameRate);
Linus Nilsson800793f2020-07-31 16:16:38 -070041 if (includeBitrate) {
42 AMediaFormat_setInt32(destinationFormat, AMEDIAFORMAT_KEY_BIT_RATE, kBitRate);
43 }
Linus Nilsson0da327a2020-01-31 16:22:18 -080044
Linus Nilsson800793f2020-07-31 16:16:38 -070045 return std::shared_ptr<AMediaFormat>(destinationFormat, &AMediaFormat_delete);
Linus Nilsson0da327a2020-01-31 16:22:18 -080046 }
47};
48
49class TestCallback : public MediaTrackTranscoderCallback {
50public:
51 TestCallback() = default;
52 ~TestCallback() = default;
53
54 // MediaTrackTranscoderCallback
Linus Nilsson800793f2020-07-31 16:16:38 -070055 void onTrackFormatAvailable(const MediaTrackTranscoder* transcoder __unused) {
56 std::unique_lock<std::mutex> lock(mMutex);
57 mTrackFormatAvailable = true;
58 mTrackFormatAvailableCondition.notify_all();
59 }
Chong Zhanga2cc86b2020-06-17 16:56:49 -070060
Linus Nilssoncab39d82020-05-14 16:32:21 -070061 void onTrackFinished(const MediaTrackTranscoder* transcoder __unused) {
Linus Nilsson0da327a2020-01-31 16:22:18 -080062 std::unique_lock<std::mutex> lock(mMutex);
63 mTranscodingFinished = true;
Linus Nilsson800793f2020-07-31 16:16:38 -070064 mTranscodingFinishedCondition.notify_all();
Linus Nilsson0da327a2020-01-31 16:22:18 -080065 }
66
Linus Nilssonfdb3e332020-09-18 17:11:41 -070067 virtual void onTrackStopped(const MediaTrackTranscoder* transcoder __unused) override {
68 std::unique_lock<std::mutex> lock(mMutex);
69 mTranscodingFinished = true;
70 mTranscodingStopped = true;
71 mTranscodingFinishedCondition.notify_all();
72 }
73
Linus Nilssoncab39d82020-05-14 16:32:21 -070074 void onTrackError(const MediaTrackTranscoder* transcoder __unused, media_status_t status) {
Linus Nilsson0da327a2020-01-31 16:22:18 -080075 std::unique_lock<std::mutex> lock(mMutex);
76 mTranscodingFinished = true;
77 mStatus = status;
Linus Nilsson800793f2020-07-31 16:16:38 -070078 mTranscodingFinishedCondition.notify_all();
Linus Nilsson0da327a2020-01-31 16:22:18 -080079 }
80 // ~MediaTrackTranscoderCallback
81
82 media_status_t waitUntilFinished() {
83 std::unique_lock<std::mutex> lock(mMutex);
84 while (!mTranscodingFinished) {
Linus Nilsson800793f2020-07-31 16:16:38 -070085 mTranscodingFinishedCondition.wait(lock);
Linus Nilsson0da327a2020-01-31 16:22:18 -080086 }
87 return mStatus;
88 }
89
Linus Nilsson800793f2020-07-31 16:16:38 -070090 void waitUntilTrackFormatAvailable() {
91 std::unique_lock<std::mutex> lock(mMutex);
92 while (!mTrackFormatAvailable) {
93 mTrackFormatAvailableCondition.wait(lock);
94 }
95 }
96
Linus Nilssonfdb3e332020-09-18 17:11:41 -070097 bool transcodingWasStopped() const { return mTranscodingFinished && mTranscodingStopped; }
98 bool transcodingFinished() const {
99 return mTranscodingFinished && !mTranscodingStopped && mStatus == AMEDIA_OK;
100 }
101
Linus Nilsson0da327a2020-01-31 16:22:18 -0800102private:
103 media_status_t mStatus = AMEDIA_OK;
104 std::mutex mMutex;
Linus Nilsson800793f2020-07-31 16:16:38 -0700105 std::condition_variable mTranscodingFinishedCondition;
106 std::condition_variable mTrackFormatAvailableCondition;
Linus Nilsson0da327a2020-01-31 16:22:18 -0800107 bool mTranscodingFinished = false;
Linus Nilssonfdb3e332020-09-18 17:11:41 -0700108 bool mTranscodingStopped = false;
Linus Nilsson800793f2020-07-31 16:16:38 -0700109 bool mTrackFormatAvailable = false;
Linus Nilsson0da327a2020-01-31 16:22:18 -0800110};
111
Linus Nilssonc31d2492020-09-23 12:30:00 -0700112class OneShotSemaphore {
113public:
114 void wait() {
115 std::unique_lock<std::mutex> lock(mMutex);
116 while (!mSignaled) {
117 mCondition.wait(lock);
118 }
119 }
120
121 void signal() {
122 std::unique_lock<std::mutex> lock(mMutex);
123 mSignaled = true;
124 mCondition.notify_all();
125 }
126
127private:
128 std::mutex mMutex;
129 std::condition_variable mCondition;
130 bool mSignaled = false;
131};
132
Linus Nilsson0da327a2020-01-31 16:22:18 -0800133}; // namespace android