blob: 50e3ac5c508ade0342d52784029861ce57a78bfa [file] [log] [blame]
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef MEDIA_C2_HIDL_TEST_COMMON_H
#define MEDIA_C2_HIDL_TEST_COMMON_H
#include <C2Component.h>
#include <C2Config.h>
#include <codec2/hidl/client.h>
#include <getopt.h>
#include <gtest/gtest.h>
#include <hidl/HidlSupport.h>
#include <chrono>
#include <fstream>
#define FLAG_NON_DISPLAY_FRAME (1 << 4)
#define MAX_RETRY 20
#define TIME_OUT 400ms
#define MAX_INPUT_BUFFERS 8
#define FLUSH_INTERVAL 30
using ::android::hardware::hidl_string;
using ::android::hardware::hidl_vec;
using ::android::hardware::Return;
using ::android::hardware::Void;
using namespace ::std::chrono;
static std::vector<std::tuple<std::string, std::string>> kTestParameters;
struct FrameInfo {
int bytesCount;
uint32_t flags;
int64_t timestamp;
};
/*
* Handle Callback functions onWorkDone(), onTripped(),
* onError(), onDeath(), onFramesRendered()
*/
struct CodecListener : public android::Codec2Client::Listener {
public:
CodecListener(
const std::function<void(std::list<std::unique_ptr<C2Work>>& workItems)> fn = nullptr)
: callBack(fn) {}
virtual void onWorkDone(const std::weak_ptr<android::Codec2Client::Component>& comp,
std::list<std::unique_ptr<C2Work>>& workItems) override {
/* TODO */
ALOGD("onWorkDone called");
(void)comp;
if (callBack) callBack(workItems);
}
virtual void onTripped(
const std::weak_ptr<android::Codec2Client::Component>& comp,
const std::vector<std::shared_ptr<C2SettingResult>>& settingResults) override {
/* TODO */
(void)comp;
(void)settingResults;
}
virtual void onError(const std::weak_ptr<android::Codec2Client::Component>& comp,
uint32_t errorCode) override {
/* TODO */
(void)comp;
ALOGD("onError called");
if (errorCode != 0) ALOGE("Error : %u", errorCode);
}
virtual void onDeath(const std::weak_ptr<android::Codec2Client::Component>& comp) override {
/* TODO */
(void)comp;
}
virtual void onInputBufferDone(uint64_t frameIndex, size_t arrayIndex) override {
/* TODO */
(void)frameIndex;
(void)arrayIndex;
}
virtual void onFrameRendered(uint64_t bufferQueueId, int32_t slotId,
int64_t timestampNs) override {
/* TODO */
(void)bufferQueueId;
(void)slotId;
(void)timestampNs;
}
// std::mutex mQueueLock;
// std::condition_variable mQueueCondition;
// std::list<std::unique_ptr<C2Work>> mWorkQueue;
std::function<void(std::list<std::unique_ptr<C2Work>>& workItems)> callBack;
};
// Return all test parameters, a list of tuple of <instance, component>.
const std::vector<std::tuple<std::string, std::string>>& getTestParameters();
// Return all test parameters, a list of tuple of <instance, component> with matching domain and
// kind.
const std::vector<std::tuple<std::string, std::string>>& getTestParameters(
C2Component::domain_t domain, C2Component::kind_t kind);
/*
* common functions declarations
*/
void testInputBuffer(const std::shared_ptr<android::Codec2Client::Component>& component,
std::mutex& queueLock, std::list<std::unique_ptr<C2Work>>& workQueue,
uint32_t flags, bool isNullBuffer);
void waitOnInputConsumption(std::mutex& queueLock, std::condition_variable& queueCondition,
std::list<std::unique_ptr<C2Work>>& workQueue,
size_t bufferCount = MAX_INPUT_BUFFERS);
void workDone(const std::shared_ptr<android::Codec2Client::Component>& component,
std::unique_ptr<C2Work>& work, std::list<uint64_t>& flushedIndices,
std::mutex& queueLock, std::condition_variable& queueCondition,
std::list<std::unique_ptr<C2Work>>& workQueue, bool& eos, bool& csd,
uint32_t& framesReceived);
int64_t getNowUs();
int32_t populateInfoVector(std::string info, android::Vector<FrameInfo>* frameInfo,
bool timestampDevTest, std::list<uint64_t>* timestampUslist);
void verifyFlushOutput(std::list<std::unique_ptr<C2Work>>& flushedWork,
std::list<std::unique_ptr<C2Work>>& workQueue,
std::list<uint64_t>& flushedIndices, std::mutex& queueLock);
#endif // MEDIA_C2_HIDL_TEST_COMMON_H