178 lines
5.3 KiB
C++
178 lines
5.3 KiB
C++
/*
|
|
* Copyright 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.
|
|
*/
|
|
|
|
//#define LOG_NDEBUG 0
|
|
#define LOG_TAG "Codec2-InputSurface"
|
|
#include <android-base/logging.h>
|
|
|
|
#include <codec2/hidl/1.0/InputSurface.h>
|
|
#include <codec2/hidl/1.0/InputSurfaceConnection.h>
|
|
|
|
#include <C2Component.h>
|
|
#include <C2Config.h>
|
|
|
|
#include <memory>
|
|
|
|
namespace android {
|
|
namespace hardware {
|
|
namespace media {
|
|
namespace c2 {
|
|
namespace V1_0 {
|
|
namespace utils {
|
|
|
|
using namespace ::android;
|
|
|
|
// Derived class of C2InterfaceHelper
|
|
class InputSurface::Interface : public C2InterfaceHelper {
|
|
public:
|
|
explicit Interface(
|
|
const std::shared_ptr<C2ReflectorHelper> &helper)
|
|
: C2InterfaceHelper(helper) {
|
|
|
|
setDerivedInstance(this);
|
|
|
|
addParameter(
|
|
DefineParam(mEos, C2_PARAMKEY_INPUT_SURFACE_EOS)
|
|
.withDefault(new C2InputSurfaceEosTuning(false))
|
|
.withFields({C2F(mEos, value).oneOf({true, false})})
|
|
.withSetter(EosSetter)
|
|
.build());
|
|
}
|
|
|
|
static C2R EosSetter(bool mayBlock, C2P<C2InputSurfaceEosTuning> &me) {
|
|
(void)mayBlock;
|
|
return me.F(me.v.value).validatePossible(me.v.value);
|
|
}
|
|
|
|
bool eos() const { return mEos->value; }
|
|
|
|
private:
|
|
std::shared_ptr<C2InputSurfaceEosTuning> mEos;
|
|
};
|
|
|
|
// Derived class of ConfigurableC2Intf
|
|
class InputSurface::ConfigurableIntf : public ConfigurableC2Intf {
|
|
public:
|
|
ConfigurableIntf(
|
|
const std::shared_ptr<InputSurface::Interface> &intf,
|
|
const sp<GraphicBufferSource> &source)
|
|
: ConfigurableC2Intf("input-surface", 0),
|
|
mIntf(intf),
|
|
mSource(source) {
|
|
}
|
|
|
|
virtual ~ConfigurableIntf() override = default;
|
|
|
|
virtual c2_status_t query(
|
|
const std::vector<C2Param::Index> &indices,
|
|
c2_blocking_t mayBlock,
|
|
std::vector<std::unique_ptr<C2Param>>* const params
|
|
) const override {
|
|
return mIntf->query({}, indices, mayBlock, params);
|
|
}
|
|
|
|
virtual c2_status_t config(
|
|
const std::vector<C2Param*> ¶ms,
|
|
c2_blocking_t mayBlock,
|
|
std::vector<std::unique_ptr<C2SettingResult>>* const failures
|
|
) override {
|
|
c2_status_t err = mIntf->config(params, mayBlock, failures);
|
|
if (mIntf->eos()) {
|
|
sp<GraphicBufferSource> source = mSource.promote();
|
|
if (source == nullptr || source->signalEndOfInputStream() != OK) {
|
|
// TODO: put something in |failures|
|
|
err = C2_BAD_VALUE;
|
|
}
|
|
// TODO: reset eos?
|
|
}
|
|
return err;
|
|
}
|
|
|
|
virtual c2_status_t querySupportedParams(
|
|
std::vector<std::shared_ptr<C2ParamDescriptor>>* const params
|
|
) const override {
|
|
return mIntf->querySupportedParams(params);
|
|
}
|
|
|
|
virtual c2_status_t querySupportedValues(
|
|
std::vector<C2FieldSupportedValuesQuery>& fields,
|
|
c2_blocking_t mayBlock) const override {
|
|
return mIntf->querySupportedValues(fields, mayBlock);
|
|
}
|
|
|
|
private:
|
|
const std::shared_ptr<InputSurface::Interface> mIntf;
|
|
wp<GraphicBufferSource> mSource;
|
|
};
|
|
|
|
Return<sp<InputSurface::HGraphicBufferProducer>> InputSurface::getGraphicBufferProducer() {
|
|
return mProducer;
|
|
}
|
|
|
|
Return<sp<IConfigurable>> InputSurface::getConfigurable() {
|
|
return mConfigurable;
|
|
}
|
|
|
|
Return<void> InputSurface::connect(
|
|
const sp<IInputSink>& sink,
|
|
connect_cb _hidl_cb) {
|
|
Status status;
|
|
sp<InputSurfaceConnection> connection;
|
|
if (!sink) {
|
|
_hidl_cb(Status::BAD_VALUE, nullptr);
|
|
return Void();
|
|
}
|
|
std::shared_ptr<C2Component> comp = Component::findLocalComponent(sink);
|
|
if (comp) {
|
|
connection = new InputSurfaceConnection(mSource, comp, mParameterCache);
|
|
} else {
|
|
connection = new InputSurfaceConnection(mSource, sink, mParameterCache);
|
|
}
|
|
if (!connection->init()) {
|
|
connection = nullptr;
|
|
status = Status::BAD_VALUE;
|
|
} else {
|
|
status = Status::OK;
|
|
}
|
|
_hidl_cb(status, connection);
|
|
return Void();
|
|
}
|
|
|
|
// Constructor is exclusive to ComponentStore.
|
|
InputSurface::InputSurface(
|
|
const std::shared_ptr<ParameterCache>& cache,
|
|
const std::shared_ptr<C2ReflectorHelper>& reflector,
|
|
const sp<HGraphicBufferProducer>& producer,
|
|
const sp<GraphicBufferSource>& source)
|
|
: mParameterCache{cache},
|
|
mProducer{producer},
|
|
mSource{source},
|
|
mIntf{std::make_shared<Interface>(reflector)},
|
|
mConfigurable{new CachedConfigurable(
|
|
std::make_unique<ConfigurableIntf>(
|
|
mIntf, source))} {
|
|
|
|
mConfigurable->init(mParameterCache);
|
|
}
|
|
|
|
} // namespace utils
|
|
} // namespace V1_0
|
|
} // namespace c2
|
|
} // namespace media
|
|
} // namespace hardware
|
|
} // namespace android
|
|
|