blob: 2e964495e37f0e35b324a40781382678e127d02c [file] [log] [blame]
Hongguang4092f2f2021-07-08 18:49:12 -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 <aidl/android/hardware/tv/tuner/BnDvr.h>
20#include <aidl/android/hardware/tv/tuner/RecordStatus.h>
21
22#include <fmq/AidlMessageQueue.h>
23#include <math.h>
Hongguange423acd2021-07-27 16:56:47 -070024#include <atomic>
Hongguang4092f2f2021-07-08 18:49:12 -070025#include <set>
Hongguange423acd2021-07-27 16:56:47 -070026#include <thread>
Hongguang4092f2f2021-07-08 18:49:12 -070027#include "Demux.h"
28#include "Frontend.h"
29#include "Tuner.h"
30
31using namespace std;
32
33namespace aidl {
34namespace android {
35namespace hardware {
36namespace tv {
37namespace tuner {
38
39using ::aidl::android::hardware::common::fmq::MQDescriptor;
40using ::aidl::android::hardware::common::fmq::SynchronizedReadWrite;
41using ::android::AidlMessageQueue;
42using ::android::hardware::EventFlag;
43
44using DvrMQ = AidlMessageQueue<int8_t, SynchronizedReadWrite>;
45
46struct MediaEsMetaData {
47 bool isAudio;
48 int startIndex;
49 int len;
50 int pts;
51};
52
53class Demux;
54class Filter;
55class Frontend;
56class Tuner;
57
58class Dvr : public BnDvr {
59 public:
Hongguang50899fb2021-08-05 22:51:58 -070060 Dvr(DvrType type, uint32_t bufferSize, const std::shared_ptr<IDvrCallback>& cb, Demux* demux);
Hongguang4092f2f2021-07-08 18:49:12 -070061 ~Dvr();
62
63 ::ndk::ScopedAStatus getQueueDesc(
64 MQDescriptor<int8_t, SynchronizedReadWrite>* out_queue) override;
65 ::ndk::ScopedAStatus configure(const DvrSettings& in_settings) override;
66 ::ndk::ScopedAStatus attachFilter(const std::shared_ptr<IFilter>& in_filter) override;
67 ::ndk::ScopedAStatus detachFilter(const std::shared_ptr<IFilter>& in_filter) override;
68 ::ndk::ScopedAStatus start() override;
69 ::ndk::ScopedAStatus stop() override;
70 ::ndk::ScopedAStatus flush() override;
71 ::ndk::ScopedAStatus close() override;
72
73 /**
74 * To create a DvrMQ and its Event Flag.
75 *
76 * Return false is any of the above processes fails.
77 */
78 bool createDvrMQ();
79 bool writeRecordFMQ(const std::vector<int8_t>& data);
80 bool addPlaybackFilter(int64_t filterId, std::shared_ptr<IFilter> filter);
81 bool removePlaybackFilter(int64_t filterId);
82 bool readPlaybackFMQ(bool isVirtualFrontend, bool isRecording);
83 bool processEsDataOnPlayback(bool isVirtualFrontend, bool isRecording);
84 bool startFilterDispatcher(bool isVirtualFrontend, bool isRecording);
85 EventFlag* getDvrEventFlag();
86 DvrSettings getSettings() { return mDvrSettings; }
87
88 private:
89 // Demux service
Hongguang50899fb2021-08-05 22:51:58 -070090 Demux* mDemux;
Hongguang4092f2f2021-07-08 18:49:12 -070091
92 DvrType mType;
93 uint32_t mBufferSize;
94 std::shared_ptr<IDvrCallback> mCallback;
95 std::map<int64_t, std::shared_ptr<IFilter>> mFilters;
96
97 void deleteEventFlag();
98 bool readDataFromMQ();
99 void getMetaDataValue(int& index, int8_t* dataOutputBuffer, int& value);
100 void maySendPlaybackStatusCallback();
101 void maySendRecordStatusCallback();
102 PlaybackStatus checkPlaybackStatusChange(uint32_t availableToWrite, uint32_t availableToRead,
103 uint32_t highThreshold, uint32_t lowThreshold);
104 RecordStatus checkRecordStatusChange(uint32_t availableToWrite, uint32_t availableToRead,
105 uint32_t highThreshold, uint32_t lowThreshold);
106 /**
107 * A dispatcher to read and dispatch input data to all the started filters.
108 * Each filter handler handles the data filtering/output writing/filterEvent updating.
109 */
110 void startTpidFilter(vector<int8_t> data);
Hongguang4092f2f2021-07-08 18:49:12 -0700111 void playbackThreadLoop();
Hongguang4092f2f2021-07-08 18:49:12 -0700112
113 unique_ptr<DvrMQ> mDvrMQ;
114 EventFlag* mDvrEventFlag;
115 /**
116 * Demux callbacks used on filter events or IO buffer status
117 */
118 bool mDvrConfigured = false;
119 DvrSettings mDvrSettings;
120
121 // Thread handlers
Hongguange423acd2021-07-27 16:56:47 -0700122 std::thread mDvrThread;
Hongguang4092f2f2021-07-08 18:49:12 -0700123
124 // FMQ status local records
125 PlaybackStatus mPlaybackStatus;
126 RecordStatus mRecordStatus;
127 /**
128 * If a specific filter's writing loop is still running
129 */
Hongguange423acd2021-07-27 16:56:47 -0700130 std::atomic<bool> mDvrThreadRunning;
Hongguang4092f2f2021-07-08 18:49:12 -0700131 bool mKeepFetchingDataFromFrontend;
132 /**
133 * Lock to protect writes to the FMQs
134 */
135 std::mutex mWriteLock;
136 /**
137 * Lock to protect writes to the input status
138 */
139 std::mutex mPlaybackStatusLock;
140 std::mutex mRecordStatusLock;
Hongguang4092f2f2021-07-08 18:49:12 -0700141
142 const bool DEBUG_DVR = false;
Hongguang4092f2f2021-07-08 18:49:12 -0700143};
144
145} // namespace tuner
146} // namespace tv
147} // namespace hardware
148} // namespace android
149} // namespace aidl