/*
 * Copyright (C) 2014-2018 Intel Corporation
 *
 * 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 CAMERA3_HAL_MEDIAENTITY_H_
#define CAMERA3_HAL_MEDIAENTITY_H_

#include "cros-camera/v4l2_device.h"
#include <memory>
#include <vector>
#include <linux/media.h>

#include "utils/Errors.h"

namespace cros {
namespace intel {
enum V4L2DeviceType {
        DEVICE_VIDEO,   /*!< MEDIA_ENT_T_DEVNODE_V4L */
        SUBDEV_GENERIC, /*!< MEDIA_ENT_T_V4L2_SUBDEV */
        SUBDEV_SENSOR,  /*!< MEDIA_ENT_T_V4L2_SUBDEV_SENSOR */
        SUBDEV_FLASH,   /*!< MEDIA_ENT_T_V4L2_SUBDEV_FLASH */
        SUBDEV_LENS,    /*!< MEDIA_ENT_T_V4L2_SUBDEV_LENS */
        UNKNOWN_TYPE
    };

/**
 * \class MediaEntity
 *
 * This class models a media entity, which is a basic media hardware or software
 * building block (e.g. sensor, scaler, CSI-2 receiver).
 *
 * Each media entity has one or more pads and links. A pad is a connection endpoint
 * through which an entity can interact with other entities. Data produced by an entity
 * flows from the entity's output to one or more entity inputs. A link is a connection
 * between two pads, either on the same entity or on different entities. Data flows
 * from a source pad to a sink pad.
 */
class MediaEntity
{
public:
    MediaEntity(struct media_entity_desc &entity, struct media_link_desc *links,
                    struct media_pad_desc *pads);
    ~MediaEntity();

    status_t getDevice(std::shared_ptr<cros::V4L2Device> &device);
    void updateLinks(const struct media_link_desc *links);
    V4L2DeviceType getType();
    void getLinkDesc(std::vector<media_link_desc>  &links) const { links = mLinks; }
    void getEntityDesc(struct media_entity_desc &entity) const { entity = mInfo; }
    void getPadDesc(struct media_pad_desc &pad, int index) const { pad = mPads[index]; }
    const char* getName() const { return mInfo.name; }

private:
    status_t openDevice(std::shared_ptr<cros::V4L2Device> &device);

private:
    struct media_entity_desc        mInfo;       /*!< media entity descriptor info */
    std::vector<struct media_link_desc>  mLinks;      /*!< media entity links */
    std::vector<struct media_pad_desc>   mPads;       /*!< media entity pads */

    std::shared_ptr<cros::V4L2Device>              mDevice;     /*!< V4L2 video node or subdevice */

}; // class MediaEntity

} /* namespace intel */
} /* namespace cros */
#endif
