bd7d9192创建于 2024年9月18日历史提交
/*
 * Copyright (c) 2021-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.
 */

#include "avbuffer_utils.h"
#include "avbuffer_queue_producer_impl.h"
#include "common/log.h"

namespace {
constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, LOG_DOMAIN_FOUNDATION, "AVBufferQueueProducerStub" };
}

namespace OHOS {
namespace Media {

AVBufferQueueProducerStub::AVBufferQueueProducerStub()
{
    stubFuncMap_[PRODUCER_GET_QUEUE_SIZE] = &AVBufferQueueProducerStub::OnGetQueueSize;
    stubFuncMap_[PRODUCER_SET_QUEUE_SIZE] = &AVBufferQueueProducerStub::OnSetQueueSize;
    stubFuncMap_[PRODUCER_REQUEST_BUFFER] = &AVBufferQueueProducerStub::OnRequestBuffer;
    stubFuncMap_[PRODUCER_PUSH_BUFFER] = &AVBufferQueueProducerStub::OnPushBuffer;
    stubFuncMap_[PRODUCER_RETURN_BUFFER] = &AVBufferQueueProducerStub::OnReturnBuffer;
    stubFuncMap_[PRODUCER_ATTACH_BUFFER] = &AVBufferQueueProducerStub::OnAttachBuffer;
    stubFuncMap_[PRODUCER_DETACH_BUFFER] = &AVBufferQueueProducerStub::OnDetachBuffer;
    stubFuncMap_[PRODUCER_SET_FILLED_LISTENER] = &AVBufferQueueProducerStub::OnSetBufferFilledListener;
    stubFuncMap_[PRODUCER_REMOVE_FILLED_LISTENER] = &AVBufferQueueProducerStub::OnRemoveBufferFilledListener;
    stubFuncMap_[PRODUCER_SET_AVAILABLE_LISTENER] = &AVBufferQueueProducerStub::OnSetBufferAvailableListener;
}

int AVBufferQueueProducerStub::OnRemoteRequest(
    uint32_t code, MessageParcel& arguments, MessageParcel& reply, MessageOption& option)
{
    auto it = stubFuncMap_.find(code);
    FALSE_RETURN_V(it != stubFuncMap_.end(), IPC_STUB_INVALID_DATA_ERR);
    FALSE_RETURN_V(it->second != nullptr, IPC_STUB_ERR);
    FALSE_RETURN_V(GetDescriptor() == arguments.ReadInterfaceToken(), ERR_INVALID_STATE);

    return (this->*(it->second))(arguments, reply, option);
}

int32_t AVBufferQueueProducerStub::OnGetQueueSize(
    MessageParcel& arguments, MessageParcel& reply, MessageOption& option)
{
    auto size = GetQueueSize();

    reply.WriteInt32(0);
    reply.WriteUint32(size);

    return 0;
}

int32_t AVBufferQueueProducerStub::OnSetQueueSize(
    MessageParcel& arguments, MessageParcel& reply, MessageOption& option)
{
    auto size = arguments.ReadUint32();
    auto ret = SetQueueSize(size);

    reply.WriteInt32(static_cast<int32_t>(ret));

    return 0;
}

int32_t AVBufferQueueProducerStub::OnRequestBuffer(
    MessageParcel& arguments, MessageParcel& reply, MessageOption& option)
{
    std::shared_ptr<AVBuffer> buffer = nullptr;
    AVBufferConfig config;
    UnmarshallingConfig(arguments, config);
    auto timeoutMs = arguments.ReadInt32();

    auto ret = RequestBuffer(buffer, config, timeoutMs);

    reply.WriteInt32(static_cast<int32_t>(ret));
    if (ret == Status::OK) {
        buffer->WriteToMessageParcel(reply);
    }

    return 0;
}

int32_t AVBufferQueueProducerStub::OnPushBuffer(
    MessageParcel& arguments, MessageParcel& reply, MessageOption& option)
{
    auto uniqueId = arguments.ReadUint64();
    auto available = arguments.ReadBool();

    auto ret = PushBuffer(uniqueId, available);
    reply.WriteInt32(static_cast<int32_t>(ret));

    return 0;
}

int32_t AVBufferQueueProducerStub::OnReturnBuffer(
    MessageParcel& arguments, MessageParcel& reply, MessageOption& option)
{
    auto uniqueId = arguments.ReadUint64();
    auto available = arguments.ReadBool();

    auto ret = ReturnBuffer(uniqueId, available);
    reply.WriteInt32(static_cast<int32_t>(ret));

    return 0;
}

int32_t AVBufferQueueProducerStub::OnAttachBuffer(
    MessageParcel& arguments, MessageParcel& reply, MessageOption& option)
{
    auto buffer = AVBuffer::CreateAVBuffer();
    if (buffer == nullptr) {
        reply.WriteInt32(static_cast<int32_t>(Status::ERROR_NO_MEMORY));
        return 0;
    }
    buffer->ReadFromMessageParcel(arguments);
    auto isFilled = arguments.ReadBool();

    auto ret = AttachBuffer(buffer, isFilled);
    reply.WriteInt32(static_cast<int32_t>(ret));

    return 0;
}

int32_t AVBufferQueueProducerStub::OnDetachBuffer(
    MessageParcel& arguments, MessageParcel& reply, MessageOption& option)
{
    auto uniqueId = arguments.ReadUint64();

    auto ret = DetachBuffer(uniqueId);
    reply.WriteInt32(static_cast<int32_t>(ret));

    return 0;
}

int32_t AVBufferQueueProducerStub::OnSetBufferFilledListener(
    MessageParcel& arguments, MessageParcel& reply, MessageOption& option)
{
    auto listenerObject = arguments.ReadRemoteObject();
    sptr<IBrokerListener> listener = iface_cast<IBrokerListener>(listenerObject);
    FALSE_RETURN_V_MSG_E(listener != nullptr, IPC_STUB_ERR, "listener is nullptr!");

    auto ret = SetBufferFilledListener(listener);
    reply.WriteInt32(static_cast<int32_t>(ret));

    return 0;
}

int32_t AVBufferQueueProducerStub::OnRemoveBufferFilledListener(
    MessageParcel& arguments, MessageParcel& reply, MessageOption& option)
{
    auto listenerObject = arguments.ReadRemoteObject();
    sptr<IBrokerListener> listener = iface_cast<IBrokerListener>(listenerObject);
    FALSE_RETURN_V_MSG_E(listener != nullptr, IPC_STUB_ERR, "listener is nullptr!");
 
    auto ret = RemoveBufferFilledListener(listener);
    reply.WriteInt32(static_cast<int32_t>(ret));
 
    return 0;
}

int32_t AVBufferQueueProducerStub::OnSetBufferAvailableListener(
    MessageParcel& arguments, MessageParcel& reply, MessageOption& option)
{
    auto listenerObject = arguments.ReadRemoteObject();
    sptr<IProducerListener> listener = iface_cast<IProducerListener>(listenerObject);
    FALSE_RETURN_V_MSG_E(listener != nullptr, IPC_STUB_ERR, "listener is nullptr!");
    auto ret = SetBufferAvailableListener(listener);
    reply.WriteInt32(static_cast<int32_t>(ret));

    return 0;
}

} // namespace Media
} // namespace OHOS