aboutsummaryrefslogtreecommitdiff
path: root/webrtc/modules/rtp_rtcp/source/rtp_receiver_strategy.h
diff options
context:
space:
mode:
Diffstat (limited to 'webrtc/modules/rtp_rtcp/source/rtp_receiver_strategy.h')
-rw-r--r--webrtc/modules/rtp_rtcp/source/rtp_receiver_strategy.h106
1 files changed, 106 insertions, 0 deletions
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_receiver_strategy.h b/webrtc/modules/rtp_rtcp/source/rtp_receiver_strategy.h
new file mode 100644
index 0000000000..37c3e6e49a
--- /dev/null
+++ b/webrtc/modules/rtp_rtcp/source/rtp_receiver_strategy.h
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 2012 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_RTP_RTCP_SOURCE_RTP_RECEIVER_STRATEGY_H_
+#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_RECEIVER_STRATEGY_H_
+
+#include "webrtc/base/scoped_ptr.h"
+#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h"
+#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
+#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
+#include "webrtc/system_wrappers/include/critical_section_wrapper.h"
+#include "webrtc/typedefs.h"
+
+namespace webrtc {
+
+class TelephoneEventHandler;
+
+// This strategy deals with media-specific RTP packet processing.
+// This class is not thread-safe and must be protected by its caller.
+class RTPReceiverStrategy {
+ public:
+ static RTPReceiverStrategy* CreateVideoStrategy(RtpData* data_callback);
+ static RTPReceiverStrategy* CreateAudioStrategy(
+ RtpData* data_callback,
+ RtpAudioFeedback* incoming_messages_callback);
+
+ virtual ~RTPReceiverStrategy() {}
+
+ // Parses the RTP packet and calls the data callback with the payload data.
+ // Implementations are encouraged to use the provided packet buffer and RTP
+ // header as arguments to the callback; implementations are also allowed to
+ // make changes in the data as necessary. The specific_payload argument
+ // provides audio or video-specific data. The is_first_packet argument is true
+ // if this packet is either the first packet ever or the first in its frame.
+ virtual int32_t ParseRtpPacket(WebRtcRTPHeader* rtp_header,
+ const PayloadUnion& specific_payload,
+ bool is_red,
+ const uint8_t* payload,
+ size_t payload_length,
+ int64_t timestamp_ms,
+ bool is_first_packet) = 0;
+
+ virtual TelephoneEventHandler* GetTelephoneEventHandler() = 0;
+
+ // Retrieves the last known applicable frequency.
+ virtual int GetPayloadTypeFrequency() const = 0;
+
+ // Computes the current dead-or-alive state.
+ virtual RTPAliveType ProcessDeadOrAlive(
+ uint16_t last_payload_length) const = 0;
+
+ // Returns true if we should report CSRC changes for this payload type.
+ // TODO(phoglund): should move out of here along with other payload stuff.
+ virtual bool ShouldReportCsrcChanges(uint8_t payload_type) const = 0;
+
+ // Notifies the strategy that we have created a new non-RED payload type in
+ // the payload registry.
+ virtual int32_t OnNewPayloadTypeCreated(
+ const char payloadName[RTP_PAYLOAD_NAME_SIZE],
+ int8_t payloadType,
+ uint32_t frequency) = 0;
+
+ // Invokes the OnInitializeDecoder callback in a media-specific way.
+ virtual int32_t InvokeOnInitializeDecoder(
+ RtpFeedback* callback,
+ int8_t payload_type,
+ const char payload_name[RTP_PAYLOAD_NAME_SIZE],
+ const PayloadUnion& specific_payload) const = 0;
+
+ // Checks if the payload type has changed, and returns whether we should
+ // reset statistics and/or discard this packet.
+ virtual void CheckPayloadChanged(int8_t payload_type,
+ PayloadUnion* specific_payload,
+ bool* should_discard_changes);
+
+ virtual int Energy(uint8_t array_of_energy[kRtpCsrcSize]) const;
+
+ // Stores / retrieves the last media specific payload for later reference.
+ void GetLastMediaSpecificPayload(PayloadUnion* payload) const;
+ void SetLastMediaSpecificPayload(const PayloadUnion& payload);
+
+ protected:
+ // The data callback is where we should send received payload data.
+ // See ParseRtpPacket. This class does not claim ownership of the callback.
+ // Implementations must NOT hold any critical sections while calling the
+ // callback.
+ //
+ // Note: Implementations may call the callback for other reasons than calls
+ // to ParseRtpPacket, for instance if the implementation somehow recovers a
+ // packet.
+ RTPReceiverStrategy(RtpData* data_callback);
+
+ rtc::scoped_ptr<CriticalSectionWrapper> crit_sect_;
+ PayloadUnion last_payload_;
+ RtpData* data_callback_;
+};
+} // namespace webrtc
+
+#endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_RECEIVER_STRATEGY_H_