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