blob: 6662637d548a7ca688206706f2845ac2efb435ba [file] [log] [blame]
Hongguang600a6ae2021-07-08 18:51:51 -07001/*
2 * Copyright 2021 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#pragma once
18
19#include <fcntl.h>
20#include <fmq/AidlMessageQueue.h>
21#include <gtest/gtest.h>
22#include <log/log.h>
23#include <utils/Condition.h>
24#include <utils/Mutex.h>
Hongguang901aa7b2021-08-26 12:20:56 -070025#include <atomic>
Hongguang600a6ae2021-07-08 18:51:51 -070026#include <fstream>
27#include <iostream>
28#include <map>
Hongguang901aa7b2021-08-26 12:20:56 -070029#include <thread>
Hongguang600a6ae2021-07-08 18:51:51 -070030
31#include <aidl/android/hardware/tv/tuner/BnDvrCallback.h>
32#include <aidl/android/hardware/tv/tuner/IDvr.h>
33#include <aidl/android/hardware/tv/tuner/ITuner.h>
34
35#include "FilterTests.h"
36
37using ::aidl::android::hardware::common::fmq::MQDescriptor;
38using ::aidl::android::hardware::common::fmq::SynchronizedReadWrite;
39using ::android::AidlMessageQueue;
40using ::android::Condition;
41using ::android::Mutex;
42using ::android::hardware::EventFlag;
43
44using namespace aidl::android::hardware::tv::tuner;
45using namespace std;
46
47#define WAIT_TIMEOUT 3000000000
48
49class DvrCallback : public BnDvrCallback {
50 public:
51 virtual ::ndk::ScopedAStatus onRecordStatus(RecordStatus status) override {
52 ALOGD("[vts] record status %hhu", status);
53 switch (status) {
54 case RecordStatus::DATA_READY:
55 break;
56 case RecordStatus::LOW_WATER:
57 break;
58 case RecordStatus::HIGH_WATER:
59 case RecordStatus::OVERFLOW:
60 ALOGD("[vts] record overflow. Flushing.");
61 EXPECT_TRUE(mDvr) << "Dvr callback is not set with an IDvr";
62 if (mDvr) {
63 ndk::ScopedAStatus result = mDvr->flush();
64 ALOGD("[vts] Flushing result %s.", result.getMessage());
65 }
66 break;
67 }
68 return ndk::ScopedAStatus::ok();
69 }
70
71 virtual ::ndk::ScopedAStatus onPlaybackStatus(PlaybackStatus status) override {
72 // android::Mutex::Autolock autoLock(mMsgLock);
73 ALOGD("[vts] playback status %d", status);
74 switch (status) {
75 case PlaybackStatus::SPACE_EMPTY:
76 case PlaybackStatus::SPACE_ALMOST_EMPTY:
77 ALOGD("[vts] keep playback inputing %d", status);
78 mKeepWritingPlaybackFMQ = true;
79 break;
80 case PlaybackStatus::SPACE_ALMOST_FULL:
81 case PlaybackStatus::SPACE_FULL:
82 ALOGD("[vts] stop playback inputing %d", status);
83 mKeepWritingPlaybackFMQ = false;
84 break;
85 }
86 return ndk::ScopedAStatus::ok();
87 }
88
89 void stopPlaybackThread();
90 void testRecordOutput();
91 void stopRecordThread();
92
93 void startPlaybackInputThread(string& dataInputFile, PlaybackSettings& settings,
94 MQDesc& playbackMQDescriptor);
95 void startRecordOutputThread(RecordSettings recordSettings, MQDesc& recordMQDescriptor);
96 static void* __threadLoopPlayback(void* user);
97 static void* __threadLoopRecord(void* threadArgs);
98 void playbackThreadLoop();
Hongguang901aa7b2021-08-26 12:20:56 -070099 void recordThreadLoop();
Hongguang600a6ae2021-07-08 18:51:51 -0700100
101 bool readRecordFMQ();
102
103 void setDvr(std::shared_ptr<IDvr> dvr) { mDvr = dvr; }
104
105 private:
106 struct RecordThreadArgs {
107 DvrCallback* user;
108 RecordSettings* recordSettings;
109 bool* keepReadingRecordFMQ;
110 };
111 // uint16_t mDataLength = 0;
112 std::vector<int8_t> mDataOutputBuffer;
113
114 std::map<uint32_t, std::unique_ptr<FilterMQ>> mFilterMQ;
115 std::unique_ptr<FilterMQ> mPlaybackMQ;
116 std::unique_ptr<FilterMQ> mRecordMQ;
117 std::map<uint32_t, EventFlag*> mFilterMQEventFlag;
118
119 android::Mutex mMsgLock;
Hongguang600a6ae2021-07-08 18:51:51 -0700120 android::Condition mMsgCondition;
121
Hongguang901aa7b2021-08-26 12:20:56 -0700122 std::atomic<bool> mKeepWritingPlaybackFMQ = true;
123 std::atomic<bool> mKeepReadingRecordFMQ = true;
124 std::atomic<bool> mPlaybackThreadRunning;
125 std::atomic<bool> mRecordThreadRunning;
126 std::thread mPlaybackThread;
127 std::thread mRecordThread;
Hongguang600a6ae2021-07-08 18:51:51 -0700128 string mInputDataFile;
129 PlaybackSettings mPlaybackSettings;
130
131 std::shared_ptr<IDvr> mDvr = nullptr;
132
133 // int mPidFilterOutputCount = 0;
134};
135
136class DvrTests {
137 public:
138 void setService(std::shared_ptr<ITuner> tuner) { mService = tuner; }
139 void setDemux(std::shared_ptr<IDemux> demux) { mDemux = demux; }
140
141 void startPlaybackInputThread(string& dataInputFile, PlaybackSettings& settings) {
142 mDvrPlaybackCallback->startPlaybackInputThread(dataInputFile, settings,
143 mDvrPlaybackMQDescriptor);
144 };
145
146 void startRecordOutputThread(RecordSettings settings) {
147 mDvrRecordCallback->startRecordOutputThread(settings, mDvrRecordMQDescriptor);
148 };
149
150 void stopPlaybackThread() { mDvrPlaybackCallback->stopPlaybackThread(); }
151 void testRecordOutput() { mDvrRecordCallback->testRecordOutput(); }
152 void stopRecordThread() { mDvrRecordCallback->stopRecordThread(); }
153
154 AssertionResult openDvrInDemux(DvrType type, int32_t bufferSize);
155 AssertionResult configDvrPlayback(DvrSettings setting);
156 AssertionResult configDvrRecord(DvrSettings setting);
157 AssertionResult getDvrPlaybackMQDescriptor();
158 AssertionResult getDvrRecordMQDescriptor();
159 AssertionResult attachFilterToDvr(std::shared_ptr<IFilter> filter);
160 AssertionResult detachFilterToDvr(std::shared_ptr<IFilter> filter);
161 AssertionResult stopDvrPlayback();
162 AssertionResult startDvrPlayback();
163 AssertionResult stopDvrRecord();
164 AssertionResult startDvrRecord();
165 void closeDvrPlayback();
166 void closeDvrRecord();
167
168 protected:
169 static AssertionResult failure() { return ::testing::AssertionFailure(); }
170
171 static AssertionResult success() { return ::testing::AssertionSuccess(); }
172
173 std::shared_ptr<ITuner> mService;
174 std::shared_ptr<IDvr> mDvrPlayback;
175 std::shared_ptr<IDvr> mDvrRecord;
176 std::shared_ptr<IDemux> mDemux;
177 std::shared_ptr<DvrCallback> mDvrPlaybackCallback;
178 std::shared_ptr<DvrCallback> mDvrRecordCallback;
179 MQDesc mDvrPlaybackMQDescriptor;
180 MQDesc mDvrRecordMQDescriptor;
181};