| /* | 
 |  *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 
 |  * | 
 |  *  Use of this source code is governed by a BSD-style license | 
 |  *  that can be found in the LICENSE file in the root of the source | 
 |  *  tree. An additional intellectual property rights grant can be found | 
 |  *  in the file PATENTS.  All contributing project authors may | 
 |  *  be found in the AUTHORS file in the root of the source tree. | 
 |  */ | 
 |  | 
 | #ifndef WEBRTC_MODULES_VIDEO_CODING_FRAME_BUFFER2_H_ | 
 | #define WEBRTC_MODULES_VIDEO_CODING_FRAME_BUFFER2_H_ | 
 |  | 
 | #include <array> | 
 | #include <map> | 
 | #include <memory> | 
 | #include <set> | 
 | #include <utility> | 
 |  | 
 | #include "webrtc/base/constructormagic.h" | 
 | #include "webrtc/base/criticalsection.h" | 
 | #include "webrtc/base/event.h" | 
 | #include "webrtc/base/thread_annotations.h" | 
 | #include "webrtc/modules/video_coding/include/video_coding_defines.h" | 
 | #include "webrtc/modules/video_coding/inter_frame_delay.h" | 
 |  | 
 | namespace webrtc { | 
 |  | 
 | class Clock; | 
 | class VCMJitterEstimator; | 
 | class VCMTiming; | 
 |  | 
 | namespace video_coding { | 
 |  | 
 | class FrameObject; | 
 |  | 
 | class FrameBuffer { | 
 |  public: | 
 |   enum ReturnReason { kFrameFound, kTimeout, kStopped }; | 
 |  | 
 |   FrameBuffer(Clock* clock, | 
 |               VCMJitterEstimator* jitter_estimator, | 
 |               VCMTiming* timing); | 
 |  | 
 |   // Insert a frame into the frame buffer. | 
 |   void InsertFrame(std::unique_ptr<FrameObject> frame); | 
 |  | 
 |   // Get the next frame for decoding. Will return at latest after | 
 |   // |max_wait_time_ms|. | 
 |   //  - If a frame is availiable within |max_wait_time_ms| it will return | 
 |   //    kFrameFound and set |frame_out| to the resulting frame. | 
 |   //  - If no frame is available after |max_wait_time_ms| it will return | 
 |   //    kTimeout. | 
 |   //  - If the FrameBuffer is stopped then it will return kStopped. | 
 |   ReturnReason NextFrame(int64_t max_wait_time_ms, | 
 |                          std::unique_ptr<FrameObject>* frame_out); | 
 |  | 
 |   // Tells the FrameBuffer which protection mode that is in use. Affects | 
 |   // the frame timing. | 
 |   // TODO(philipel): Remove this when new timing calculations has been | 
 |   //                 implemented. | 
 |   void SetProtectionMode(VCMVideoProtection mode); | 
 |  | 
 |   // Start the frame buffer, has no effect if the frame buffer is started. | 
 |   // The frame buffer is started upon construction. | 
 |   void Start(); | 
 |  | 
 |   // Stop the frame buffer, causing any sleeping thread in NextFrame to | 
 |   // return immediately. | 
 |   void Stop(); | 
 |  | 
 |  private: | 
 |   // FrameKey is a pair of (picture id, spatial layer). | 
 |   using FrameKey = std::pair<uint16_t, uint8_t>; | 
 |  | 
 |   // Comparator used to sort frames, first on their picture id, and second | 
 |   // on their spatial layer. | 
 |   struct FrameComp { | 
 |     bool operator()(const FrameKey& f1, const FrameKey& f2) const; | 
 |   }; | 
 |  | 
 |   // Determines whether a frame is continuous. | 
 |   bool IsContinuous(const FrameObject& frame) const | 
 |       EXCLUSIVE_LOCKS_REQUIRED(crit_); | 
 |  | 
 |   // Keep track of decoded frames. | 
 |   std::set<FrameKey, FrameComp> decoded_frames_ GUARDED_BY(crit_); | 
 |  | 
 |   // The actual buffer that holds the FrameObjects. | 
 |   std::map<FrameKey, std::unique_ptr<FrameObject>, FrameComp> frames_ | 
 |       GUARDED_BY(crit_); | 
 |  | 
 |   rtc::CriticalSection crit_; | 
 |   Clock* const clock_; | 
 |   rtc::Event frame_inserted_event_; | 
 |   VCMJitterEstimator* const jitter_estimator_ GUARDED_BY(crit_); | 
 |   VCMTiming* const timing_ GUARDED_BY(crit_); | 
 |   VCMInterFrameDelay inter_frame_delay_ GUARDED_BY(crit_); | 
 |   int newest_picture_id_ GUARDED_BY(crit_); | 
 |   bool stopped_ GUARDED_BY(crit_); | 
 |   VCMVideoProtection protection_mode_ GUARDED_BY(crit_); | 
 |  | 
 |   RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(FrameBuffer); | 
 | }; | 
 |  | 
 | }  // namespace video_coding | 
 | }  // namespace webrtc | 
 |  | 
 | #endif  // WEBRTC_MODULES_VIDEO_CODING_FRAME_BUFFER2_H_ |