1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_MODULES_UTILITY_SOURCE_VIDEO_FRAMES_QUEUE_H_
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_MODULES_UTILITY_SOURCE_VIDEO_FRAMES_QUEUE_H_
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_MODULE_UTILITY_VIDEO
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
16083049f2945b2924203b25c8428300d40d994f35henrike@webrtc.org#include <list>
17083049f2945b2924203b25c8428300d40d994f35henrike@webrtc.org
18f72d6b0ae18a7d27c6437397eda03beb4e60e5abpbos@webrtc.org#include "webrtc/common_video/interface/i420_video_frame.h"
19f72d6b0ae18a7d27c6437397eda03beb4e60e5abpbos@webrtc.org#include "webrtc/engine_configurations.h"
20f72d6b0ae18a7d27c6437397eda03beb4e60e5abpbos@webrtc.org#include "webrtc/typedefs.h"
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
24e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.orgclass VideoFramesQueue {
25e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.org public:
26e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.org  VideoFramesQueue();
27e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.org  ~VideoFramesQueue();
28e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.org
29e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.org  // Put newFrame (last) in the queue.
30f85a509a2d847b32cddf23d077d83fc0601a43d7pbos@webrtc.org  int32_t AddFrame(const I420VideoFrame& newFrame);
31e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.org
32e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.org  // Return the most current frame. I.e. the frame with the highest
33e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.org  // VideoFrame::RenderTimeMs() that is lower than
34e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.org  // TickTime::MillisecondTimestamp().
35e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.org  I420VideoFrame* FrameToRecord();
36e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.org
37e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.org  // Set the render delay estimate to renderDelay ms.
38f85a509a2d847b32cddf23d077d83fc0601a43d7pbos@webrtc.org  int32_t SetRenderDelay(uint32_t renderDelay);
39e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.org
40e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.org protected:
41e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.org  // Make ptrOldFrame available for re-use. I.e. put it in the empty frames
42e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.org  // queue.
43f85a509a2d847b32cddf23d077d83fc0601a43d7pbos@webrtc.org  int32_t ReturnFrame(I420VideoFrame* ptrOldFrame);
44e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.org
45e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.org private:
46083049f2945b2924203b25c8428300d40d994f35henrike@webrtc.org  typedef std::list<I420VideoFrame*> FrameList;
47e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.org  // Don't allow the buffer to expand beyond KMaxNumberOfFrames VideoFrames.
48e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.org  // 300 frames correspond to 10 seconds worth of frames at 30 fps.
49e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.org  enum {KMaxNumberOfFrames = 300};
50e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.org
51e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.org  // List of VideoFrame pointers. The list is sorted in the order of when the
52e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.org  // VideoFrame was inserted into the list. The first VideoFrame in the list
53e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.org  // was inserted first.
54083049f2945b2924203b25c8428300d40d994f35henrike@webrtc.org  FrameList    _incomingFrames;
55e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.org  // A list of frames that are free to be re-used.
56083049f2945b2924203b25c8428300d40d994f35henrike@webrtc.org  FrameList    _emptyFrames;
57e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.org
58e4bf294e2ece8fc3f7cccfc9b0885eb435cdd309mikhal@webrtc.org  // Estimated render delay.
59f85a509a2d847b32cddf23d077d83fc0601a43d7pbos@webrtc.org  uint32_t _renderDelayMs;
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
613b89e10f31160da35b408fd00cb8f89d2b08862dpbos@webrtc.org}  // namespace webrtc
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif // WEBRTC_MODULE_UTILITY_VIDEO
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif  // WEBRTC_MODULES_UTILITY_SOURCE_VIDEO_FRAMES_QUEUE_H_
64