/* * Copyright (c) 2011 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. */ /* * This file defines classes for doing reference picture selection, primarily * with VP8. */ #ifndef WEBRTC_MODULES_VIDEO_CODING_CODECS_REFERENCE_PICTURE_SELECTION_H_ #define WEBRTC_MODULES_VIDEO_CODING_CODECS_REFERENCE_PICTURE_SELECTION_H_ #include "webrtc/typedefs.h" namespace webrtc { class ReferencePictureSelection { public: ReferencePictureSelection(); void Init(); // Report a received reference picture selection indication. This will // introduce a new established reference if the received RPSI isn't too late. void ReceivedRPSI(int rpsi_picture_id); // Report a received slice loss indication. Returns true if a refresh frame // must be sent to the receiver, which is accomplished by only predicting // from the established reference. // |now_ts| is the RTP timestamp corresponding to the current time. Typically // the capture timestamp of the frame currently being processed. // Returns true if it's time to encode a decoder refresh, otherwise false. bool ReceivedSLI(uint32_t now_ts); // Returns the recommended VP8 encode flags needed. May refresh the decoder // and/or update the reference buffers. // |picture_id| picture id of the frame to be encoded. // |send_refresh| should be set to true if a decoder refresh should be // encoded, otherwise false. // |now_ts| is the RTP timestamp corresponding to the current time. Typically // the capture timestamp of the frame currently being processed. // Returns the flags to be given to the libvpx encoder when encoding the next // frame. int EncodeFlags(int picture_id, bool send_refresh, uint32_t now_ts); // Notify the RPS that the frame with picture id |picture_id| was encoded as // a key frame, effectively updating all reference buffers. void EncodedKeyFrame(int picture_id); // Set the round-trip time between the sender and the receiver to |rtt| // milliseconds. void SetRtt(int64_t rtt); private: static int64_t TimestampDiff(uint32_t new_ts, uint32_t old_ts); const double kRttConfidence; bool update_golden_next_; bool established_golden_; bool received_ack_; int last_sent_ref_picture_id_; uint32_t last_sent_ref_update_time_; int established_ref_picture_id_; uint32_t last_refresh_time_; int64_t rtt_; }; } // namespace webrtc #endif // WEBRTC_MODULES_VIDEO_CODING_CODECS_REFERENCE_PICTURE_SELECTION_H_