/*
 * Copyright (c) 2021 Huawei Device Co., Ltd.
 * 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 STREAM_OPERATOR_STREAM_OPERATOR_H
#define STREAM_OPERATOR_STREAM_OPERATOR_H

#include "istream_operator.h"
#include "stream_operator_c_if.h"
#include "stream_operator_stub.h"

namespace OHOS::Camera {
class StreamOperator : public StreamOperatorStub {
public:
    void Init(StreamOperatorCIF* op);
    CamRetCode IsStreamsSupported(OperationMode mode,
        const std::shared_ptr<CameraMetadata> &modeSetting,
        const std::shared_ptr<StreamInfo> &pInfo,
        StreamSupportType &pType) override;
    CamRetCode CreateStreams(const std::vector<std::shared_ptr<StreamInfo>> &streamInfos) override;
    CamRetCode ReleaseStreams(const std::vector<int> &streamIds) override;
    CamRetCode CommitStreams(OperationMode mode,
        const std::shared_ptr<CameraMetadata> &modeSetting) override;
    CamRetCode GetStreamAttributes(std::vector<std::shared_ptr<StreamAttribute>> &attributes) override;
    CamRetCode AttachBufferQueue(int streamId, const OHOS::sptr<OHOS::IBufferProducer> &producer) override;
    CamRetCode DetachBufferQueue(int streamId) override;
    CamRetCode Capture(int captureId, const std::shared_ptr<CaptureInfo> &pInfo,  bool isStreaming) override;
    CamRetCode CancelCapture(int captureId) override;
    CamRetCode ChangeToOfflineStream(const std::vector<int> &streamIds,
        OHOS::sptr<IStreamOperatorCallback> &callback,
        OHOS::sptr<IOfflineStreamOperator> &offlineOperator) override;

public:
    StreamOperator();
    virtual ~StreamOperator();
    StreamOperator(const StreamOperator &other) = delete;
    StreamOperator(StreamOperator &&other) = delete;
    StreamOperator& operator=(const StreamOperator &other) = delete;
    StreamOperator& operator=(StreamOperator &&other) = delete;

private:
    StreamOperatorCIF* operator_ = nullptr;
};
} // end namespace OHOS::Camera
#endif // STREAM_OPERATOR_STREAM_OPERATOR_H