// Copyright (c) 2010 The WebM project authors. All Rights Reserved.
//
// Use of this source code is governed by a BSD-style license and patent
// grant that can be found in the LICENSE file in the root of the source
// tree. All contributing project authors may be found in the AUTHORS
// file in the root of the source tree.

#pragma once
#include "webmmuxstream.hpp"
#include <list>

namespace WebmMux
{

class StreamVideo : public Stream
{
    StreamVideo(const StreamVideo&);
    StreamVideo& operator=(const StreamVideo&);
    
protected:
    StreamVideo(Context&, const AM_MEDIA_TYPE&);
    ~StreamVideo();

    void WriteTrackType();
    
public:
    void Flush();
    bool Wait() const;

    class VideoFrame : public Frame
    {
        VideoFrame(const VideoFrame&);
        VideoFrame& operator=(const VideoFrame&);

    protected:
        VideoFrame();

    };

    virtual LONG GetLastTimecode() const = 0;

    typedef std::list<VideoFrame*> frames_t;    
    frames_t& GetFrames();
    frames_t& GetKeyFrames();
    
protected:
    frames_t m_vframes;
    frames_t m_rframes;    
    AM_MEDIA_TYPE m_mt;     

    const BITMAPINFOHEADER& GetBitmapInfoHeader() const;
    float GetFramerate() const;

};

} //end namespace WebmMux
