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

Commit 0eb2dbe0 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "InputSurface: InputSurface and stream configuration" into main am: 71bda905 am: 4c0a3ae1

parents 83b7c2eb 4c0a3ae1
Loading
Loading
Loading
Loading
+85 −7
Original line number Diff line number Diff line
@@ -17,15 +17,21 @@
#pragma once

#include <aidl/android/hardware/media/c2/BnInputSurface.h>
#include <utils/RefBase.h>

#include <C2.h>
#include <C2Config.h>
#include <codec2/aidl/Configurable.h>
#include <util/C2InterfaceHelper.h>

#include <C2.h>

#include <memory>

namespace aidl::android::hardware::media::c2::implementation {
class InputSurfaceSource;
}

namespace aidl::android::hardware::media::c2::utils {
struct InputSurfaceConnection;

struct InputSurface : public BnInputSurface {
    InputSurface();
@@ -40,6 +46,61 @@ struct InputSurface : public BnInputSurface {
            const std::shared_ptr<IInputSink>& sink,
            std::shared_ptr<IInputSurfaceConnection>* connection) override;

    // Constant definitions.
    // Default image size for AImageReader
    constexpr static uint32_t kDefaultImageWidth = 1280;
    constexpr static uint32_t kDefaultImageHeight = 720;
    // Default # of buffers for AImageReader
    constexpr static uint32_t kDefaultImageBufferCount = 16;
    constexpr static uint32_t kDefaultImageDataspace = HAL_DATASPACE_BT709;

    // Configs
    // Config for AImageReader creation
    struct ImageConfig {
        int32_t mWidth;         // image width
        int32_t mHeight;        // image height
        int32_t mFormat;        // image pixel format
        int32_t mNumBuffers;    // number of max images for AImageReader(consumer)
        uint64_t mUsage;        // image usage
        uint32_t mDataspace;    // image dataspace
    };

    // Config for InputSurface active buffer stream control
    struct StreamConfig {
        // IN PARAMS
        float mMinFps = 0.0;        // minimum fps (repeat frame to achieve this)
        float mMaxFps = 0.0;        // max fps (via frame drop)
        float mCaptureFps = 0.0;    // capture fps
        float mCodedFps = 0.0;      // coded fps
        bool mSuspended = false;    // suspended
        int64_t mSuspendAtUs = 0;   // suspend time
        int64_t mResumeAtUs = 0;   // resume time
        bool mStopped = false;      // stopped
        int64_t mStopAtUs = 0;      // stop time
        int64_t mStartAtUs = 0;     // start time
        int64_t mTimeOffsetUs = 0;  // time offset (input => codec)

        // IN PARAMS (CODEC WRAPPER)
        C2TimestampGapAdjustmentStruct::mode_t
                mAdjustedFpsMode = C2TimestampGapAdjustmentStruct::NONE;
        int64_t mAdjustedGapUs = 0;
        int mPriority = INT_MAX;        // priority of queue thread (if any);
                                        // INT_MAX for no-op
    };

    // TODO: optimize this
    // The client requests the change of these configurations now.
    // We can request the change of these configurations from HAL directly
    // where onWorkDone() callback is called.
    //
    // Config for current work status w.r.t input buffers
    struct WorkStatusConfig {
        int32_t mLastDoneIndex = -1;      // Last work done input buffer index
        uint32_t mLastDoneCount = 0;      // # of work done count
        uint64_t mEmptyCount = 0;         // # of input buffers being emptied
    };


protected:
    class Interface;
    class ConfigurableIntf;
@@ -50,12 +111,29 @@ protected:

    virtual ~InputSurface() override;

private:
    ::android::sp<implementation::InputSurfaceSource> mSource;
    std::shared_ptr<InputSurfaceConnection> mConnection;

    ImageConfig mImageConfig;
    StreamConfig mStreamConfig;
    WorkStatusConfig mWorkStatusConfig;

    std::mutex mLock;

    friend class ConfigurableIntf;

    bool updateConfig(
            ImageConfig &imageConfig,
            StreamConfig &streamConfig,
            WorkStatusConfig &workStatusConfig,
            int64_t *inputDelayUs);

    void updateImageConfig(ImageConfig &config);
    bool updateStreamConfig(StreamConfig &config, int64_t *inputDelayUs);
    void updateWorkStatusConfig(WorkStatusConfig &config);

    ::ndk::ScopedAIBinder_DeathRecipient mDeathRecipient;
    static void OnBinderDied(void *cookie);
    static void OnBinderUnlinked(void *cookie);
    struct DeathContext;
    DeathContext *mDeathContext;
    void release();
};

}  // namespace aidl::android::hardware::media::c2::utils
+13 −1
Original line number Diff line number Diff line
@@ -16,17 +16,25 @@

#pragma once

#include <aidl/android/hardware/media/c2/BnInputSink.h>
#include <aidl/android/hardware/media/c2/BnInputSurfaceConnection.h>
#include <media/NdkImage.h>
#include <utils/RefBase.h>

#include <C2.h>

#include <memory>

namespace aidl::android::hardware::media::c2::implementation {
class InputSurfaceSource;
}

namespace aidl::android::hardware::media::c2::utils {

struct InputSurfaceConnection : public BnInputSurfaceConnection {
    InputSurfaceConnection();
    InputSurfaceConnection(
            const std::shared_ptr<IInputSink>& sink,
            ::android::sp<c2::implementation::InputSurfaceSource> const &source);
    c2_status_t status() const;

    // Methods from IInputSurfaceConnection follow.
@@ -51,6 +59,10 @@ struct InputSurfaceConnection : public BnInputSurfaceConnection {

protected:
    virtual ~InputSurfaceConnection() override;

private:
    std::weak_ptr<IInputSink> mSink;
    ::android::sp<c2::implementation::InputSurfaceSource> mSource;
};

}  // namespace aidl::android::hardware::media::c2::utils
+509 −18

File changed.

Preview size limit exceeded, changes collapsed.

+10 −1
Original line number Diff line number Diff line
@@ -19,15 +19,24 @@
#include <android-base/logging.h>

#include <codec2/aidl/inputsurface/InputSurfaceConnection.h>
#include <codec2/aidl/inputsurface/InputSurfaceSource.h>

namespace aidl::android::hardware::media::c2::utils {

InputSurfaceConnection::InputSurfaceConnection() {
InputSurfaceConnection::InputSurfaceConnection(
        const std::shared_ptr<IInputSink>& sink,
        ::android::sp<c2::implementation::InputSurfaceSource> const &source)
        : mSink{sink}, mSource{source} {
}

InputSurfaceConnection::~InputSurfaceConnection() {
}

c2_status_t InputSurfaceConnection::status() const {
    // TODO;
    return C2_OK;
}

::ndk::ScopedAStatus InputSurfaceConnection::disconnect() {
    return ::ndk::ScopedAStatus::ok();
}