Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 307b00e1 authored by Lajos Molnar's avatar Lajos Molnar Committed by Android (Google) Code Review
Browse files

Merge changes I373db2f4,I3f0cc1dd,I05f8ed86,Iec0cc3d2,I01cfcaf1, ...

* changes:
  codec2: signal aliases in XML vs. C2Store
  codec2: Codec2InfoBuilder rework
  stagefright: list only the first codec for a given name
  stagefright: find codecs by their aliases as well
  stagefright: MediaCodecsXmlParser: add support for parsing rank
  stagefright: add method to MediaCodecInfoWriter to find existing info
  stagefright: rework and simplify OmxInfoBuilder
  codec2: CCodec plugin CreateInputSurface should create C2 HAL surface
  codec2: C2PlatformStore: signal component traits via interface
  codec2: make C2Component::Traits.aliases a vector of C2Strings
parents 90ece66a c9b4ca0d
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -120,11 +120,9 @@ bool objcpy(
        IComponentStore::ComponentTraits* d,
        const C2Component::Traits& s);

// ComponentTraits -> C2Component::Traits, std::unique_ptr<std::vector<std::string>>
// Note: The output d is only valid as long as aliasesBuffer remains alive.
// ComponentTraits -> C2Component::Traits
bool objcpy(
        C2Component::Traits* d,
        std::unique_ptr<std::vector<std::string>>* aliasesBuffer,
        const IComponentStore::ComponentTraits& s);

// C2StructDescriptor -> StructDescriptor
+2 −9
Original line number Diff line number Diff line
@@ -351,7 +351,6 @@ bool objcpy(
// ComponentTraits -> C2Component::Traits, std::unique_ptr<std::vector<std::string>>
bool objcpy(
        C2Component::Traits* d,
        std::unique_ptr<std::vector<std::string>>* aliasesBuffer,
        const IComponentStore::ComponentTraits& s) {
    d->name = s.name.c_str();

@@ -394,15 +393,9 @@ bool objcpy(

    d->rank = static_cast<C2Component::rank_t>(s.rank);
    d->mediaType = s.mediaType.c_str();

    // aliasesBuffer must not be resized after this.
    *aliasesBuffer = std::make_unique<std::vector<std::string>>(
            s.aliases.size());
    (*aliasesBuffer)->resize(s.aliases.size());
    std::vector<C2StringLiteral> dAliases(s.aliases.size());
    d->aliases.resize(s.aliases.size());
    for (size_t i = 0; i < s.aliases.size(); ++i) {
        (**aliasesBuffer)[i] = s.aliases[i].c_str();
        d->aliases[i] = (**aliasesBuffer)[i].c_str();
        d->aliases[i] = s.aliases[i];
    }
    return true;
}
+1 −2
Original line number Diff line number Diff line
@@ -564,9 +564,8 @@ const std::vector<C2Component::Traits>& Codec2Client::listComponents() const {
                    return;
                }
                mTraitsList.resize(t.size());
                mAliasesBuffer.resize(t.size());
                for (size_t i = 0; i < t.size(); ++i) {
                    if (!objcpy(&mTraitsList[i], &mAliasesBuffer[i], t[i])) {
                    if (!objcpy(&mTraitsList[i], t[i])) {
                        LOG(ERROR) << "listComponents -- corrupted output.";
                        return;
                    }
+0 −2
Original line number Diff line number Diff line
@@ -232,8 +232,6 @@ protected:
    mutable bool mListed;
    std::string mServiceName;
    mutable std::vector<C2Component::Traits> mTraitsList;
    mutable std::vector<std::unique_ptr<std::vector<std::string>>>
            mAliasesBuffer;

    sp<::android::hardware::media::bufferpool::V2_0::IClientManager>
            mHostPoolManager;
+49 −37
Original line number Diff line number Diff line
@@ -937,6 +937,47 @@ void CCodec::initiateCreateInputSurface() {
    (new AMessage(kWhatCreateInputSurface, this))->post();
}

sp<PersistentSurface> CCodec::CreateOmxInputSurface() {
    using namespace android::hardware::media::omx::V1_0;
    using namespace android::hardware::media::omx::V1_0::utils;
    using namespace android::hardware::graphics::bufferqueue::V1_0::utils;
    typedef android::hardware::media::omx::V1_0::Status OmxStatus;
    android::sp<IOmx> omx = IOmx::getService();
    typedef android::hardware::graphics::bufferqueue::V1_0::
            IGraphicBufferProducer HGraphicBufferProducer;
    typedef android::hardware::media::omx::V1_0::
            IGraphicBufferSource HGraphicBufferSource;
    OmxStatus s;
    android::sp<HGraphicBufferProducer> gbp;
    android::sp<HGraphicBufferSource> gbs;
    android::Return<void> transStatus = omx->createInputSurface(
            [&s, &gbp, &gbs](
                    OmxStatus status,
                    const android::sp<HGraphicBufferProducer>& producer,
                    const android::sp<HGraphicBufferSource>& source) {
                s = status;
                gbp = producer;
                gbs = source;
            });
    if (transStatus.isOk() && s == OmxStatus::OK) {
        return new PersistentSurface(
                new H2BGraphicBufferProducer(gbp),
                sp<::android::IGraphicBufferSource>(new LWGraphicBufferSource(gbs)));
    }

    return nullptr;
}

sp<PersistentSurface> CCodec::CreateCompatibleInputSurface() {
    sp<PersistentSurface> surface(CreateInputSurface());

    if (surface == nullptr) {
        surface = CreateOmxInputSurface();
    }

    return surface;
}

void CCodec::createInputSurface() {
    status_t err;
    sp<IGraphicBufferProducer> bufferProducer;
@@ -949,7 +990,7 @@ void CCodec::createInputSurface() {
        outputFormat = config->mOutputFormat;
    }

    std::shared_ptr<PersistentSurface> persistentSurface(CreateInputSurface());
    sp<PersistentSurface> persistentSurface = CreateCompatibleInputSurface();

    if (persistentSurface->getHidlTarget()) {
        sp<IInputSurface> hidlInputSurface = IInputSurface::castFrom(
@@ -1669,46 +1710,17 @@ extern "C" android::CodecBase *CreateCodec() {
    return new android::CCodec;
}

// Create Codec 2.0 input surface
extern "C" android::PersistentSurface *CreateInputSurface() {
    // Attempt to create a Codec2's input surface.
    std::shared_ptr<android::Codec2Client::InputSurface> inputSurface =
            android::Codec2Client::CreateInputSurface();
    if (inputSurface) {
    if (!inputSurface) {
        return nullptr;
    }
    return new android::PersistentSurface(
            inputSurface->getGraphicBufferProducer(),
            static_cast<android::sp<android::hidl::base::V1_0::IBase>>(
            inputSurface->getHalInterface()));
}
    // Fall back to OMX.
    using namespace android::hardware::media::omx::V1_0;
    using namespace android::hardware::media::omx::V1_0::utils;
    using namespace android::hardware::graphics::bufferqueue::V1_0::utils;
    typedef android::hardware::media::omx::V1_0::Status OmxStatus;
    android::sp<IOmx> omx = IOmx::getService();
    typedef android::hardware::graphics::bufferqueue::V1_0::
            IGraphicBufferProducer HGraphicBufferProducer;
    typedef android::hardware::media::omx::V1_0::
            IGraphicBufferSource HGraphicBufferSource;
    OmxStatus s;
    android::sp<HGraphicBufferProducer> gbp;
    android::sp<HGraphicBufferSource> gbs;
    android::Return<void> transStatus = omx->createInputSurface(
            [&s, &gbp, &gbs](
                    OmxStatus status,
                    const android::sp<HGraphicBufferProducer>& producer,
                    const android::sp<HGraphicBufferSource>& source) {
                s = status;
                gbp = producer;
                gbs = source;
            });
    if (transStatus.isOk() && s == OmxStatus::OK) {
        return new android::PersistentSurface(
                new H2BGraphicBufferProducer(gbp),
                sp<::android::IGraphicBufferSource>(
                    new LWGraphicBufferSource(gbs)));
    }

    return nullptr;
}
Loading