/*
 * Copyright (C) 2013-2018 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

#pragma once

#if ENABLE(VIDEO)

#include <wtf/Ref.h>
#include <wtf/RefCounted.h>

namespace WebCore {

struct VideoPlaybackQualityMetrics;

class VideoPlaybackQuality : public RefCounted<VideoPlaybackQuality> {
    WTF_MAKE_NONCOPYABLE(VideoPlaybackQuality)
public:
    static Ref<VideoPlaybackQuality> create(double creationTime, const VideoPlaybackQualityMetrics&);

    double creationTime() const { return m_creationTime; }
    unsigned totalVideoFrames() const { return m_totalVideoFrames; }
    unsigned droppedVideoFrames() const { return m_droppedVideoFrames; }
    unsigned corruptedVideoFrames() const { return m_corruptedVideoFrames; }
    unsigned displayCompositedVideoFrames() const { return m_displayCompositedVideoFrames; }
    double totalFrameDelay() const { return m_totalFrameDelay; }

private:
    VideoPlaybackQuality(double creationTime, const VideoPlaybackQualityMetrics&);

    double m_creationTime;
    uint32_t m_totalVideoFrames;
    uint32_t m_droppedVideoFrames;
    uint32_t m_corruptedVideoFrames;
    uint32_t m_displayCompositedVideoFrames;
    double m_totalFrameDelay;
};

} // namespace WebCore

#endif // ENABLE(VIDEO)
