/* ------------------------------------------------------------------
 * Copyright (C) 1998-2009 PacketVideo
 *
 * 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.
 * -------------------------------------------------------------------
 */
/**
 *  @file pvmf_video.h
 *  @brief This file defines structures/utilities specific to video
 *
 */

#ifndef PVMF_VIDEO_H_INCLUDED
#define PVMF_VIDEO_H_INCLUDED

#ifndef PV_UUID_H_INCLUDED
#include "pv_uuid.h"
#endif

#ifndef PVMF_FORMAT_TYPE_H_INCLUDED
#include "pvmf_format_type.h"
#endif

#define PVMF_VIDEO_INPUT_WIDTH 176
#define PVMF_VIDEO_INPUT_HEIGHT 144
#define PVMF_VIDEO_INPUT_FRAME_RATE 15
//#define VIDEO_INPUT_FORMAT PVMFVEN_INPUT_YUV420

const PVUid32 PVMFYuvFormatSpecificInfo0_UID = 0x1;
const PVUid32 PVMFEOSFormatSpecificInfo_UID = 0x2;
class PVMFYuvFormatSpecificInfo0
{
    public:
        PVMFYuvFormatSpecificInfo0()
        {
            uid = PVMFYuvFormatSpecificInfo0_UID;
            video_format = PVMF_MIME_FORMAT_UNKNOWN;
            display_width = 0;
            display_height = 0;
            width = 0;
            height = 0;
        };

        virtual ~PVMFYuvFormatSpecificInfo0() {};

        PVUid32 uid;
        PVMFFormatType video_format;
        uint32 display_width;
        uint32 display_height;
        uint32 width;
        uint32 height;
};

class PVMFVideoResolution
{
    public:
        PVMFVideoResolution(uint16 w, uint16 h) : width(w), height(h) {}
        uint16 width;
        uint16 height;
};

#define PVMF_RESOLUTION_NULL PVMFVideoResolution(0,0)
#define PVMF_RESOLUTION_SQCIF PVMFVideoResolution(128,96)
#define PVMF_RESOLUTION_QCIF PVMFVideoResolution(176,144)
#define PVMF_RESOLUTION_CIF PVMFVideoResolution(352,288)
#define PVMF_RESOLUTION_4CIF PVMFVideoResolution(704,576)
#define PVMF_RESOLUTION_16CIF PVMFVideoResolution(1408,1152)

class PVMFVideoResolutionRange
{
    public:
        PVMFVideoResolutionRange(PVMFVideoResolution first, PVMFVideoResolution last)
                : iFirst(first), iLast(last) {}
        bool isFit(PVMFVideoResolution res)
        {
            return (res.width >= iFirst.width && res.height >= iFirst.height && res.width <= iLast.width && res.height <= iLast.height);
        }
        PVMFVideoResolution iFirst;
        PVMFVideoResolution iLast;
};
#endif
