/* * 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 MODULES_AUDIO_CODING_INCLUDE_AUDIO_CODING_MODULE_H_ #define MODULES_AUDIO_CODING_INCLUDE_AUDIO_CODING_MODULE_H_ #include #include #include #include #include "absl/types/optional.h" #include "api/audio_codecs/audio_encoder.h" #include "api/function_view.h" #include "modules/audio_coding/include/audio_coding_module_typedefs.h" namespace webrtc { // forward declarations class AudioDecoder; class AudioEncoder; class AudioFrame; struct RTPHeader; // Callback class used for sending data ready to be packetized class AudioPacketizationCallback { public: virtual ~AudioPacketizationCallback() {} virtual int32_t SendData(AudioFrameType frame_type, uint8_t payload_type, uint32_t timestamp, const uint8_t* payload_data, size_t payload_len_bytes, int64_t absolute_capture_timestamp_ms) { // TODO(bugs.webrtc.org/10739): Deprecate the old SendData and make this one // pure virtual. return SendData(frame_type, payload_type, timestamp, payload_data, payload_len_bytes); } virtual int32_t SendData(AudioFrameType frame_type, uint8_t payload_type, uint32_t timestamp, const uint8_t* payload_data, size_t payload_len_bytes) { RTC_DCHECK_NOTREACHED() << "This method must be overridden, or not used."; return -1; } }; class AudioCodingModule { protected: AudioCodingModule() {} public: static std::unique_ptr Create(); virtual ~AudioCodingModule() = default; // `modifier` is called exactly once with one argument: a pointer to the // unique_ptr that holds the current encoder (which is null if there is no // current encoder). For the duration of the call, `modifier` has exclusive // access to the unique_ptr; it may call the encoder, steal the encoder and // replace it with another encoder or with nullptr, etc. virtual void ModifyEncoder( rtc::FunctionView*)> modifier) = 0; // Utility method for simply replacing the existing encoder with a new one. void SetEncoder(std::unique_ptr new_encoder) { ModifyEncoder([&](std::unique_ptr* encoder) { *encoder = std::move(new_encoder); }); } // int32_t RegisterTransportCallback() // Register a transport callback which will be called to deliver // the encoded buffers whenever Process() is called and a // bit-stream is ready. // // Input: // -transport : pointer to the callback class // transport->SendData() is called whenever // Process() is called and bit-stream is ready // to deliver. // // Return value: // -1 if the transport callback could not be registered // 0 if registration is successful. // virtual int32_t RegisterTransportCallback( AudioPacketizationCallback* transport) = 0; /////////////////////////////////////////////////////////////////////////// // int32_t Add10MsData() // Add 10MS of raw (PCM) audio data and encode it. If the sampling // frequency of the audio does not match the sampling frequency of the // current encoder ACM will resample the audio. If an encoded packet was // produced, it will be delivered via the callback object registered using // RegisterTransportCallback, and the return value from this function will // be the number of bytes encoded. // // Input: // -audio_frame : the input audio frame, containing raw audio // sampling frequency etc. // // Return value: // >= 0 number of bytes encoded. // -1 some error occurred. // virtual int32_t Add10MsData(const AudioFrame& audio_frame) = 0; /////////////////////////////////////////////////////////////////////////// // int SetPacketLossRate() // Sets expected packet loss rate for encoding. Some encoders provide packet // loss gnostic encoding to make stream less sensitive to packet losses, // through e.g., FEC. No effects on codecs that do not provide such encoding. // // Input: // -packet_loss_rate : expected packet loss rate (0 -- 100 inclusive). // // Return value // -1 if failed to set packet loss rate, // 0 if succeeded. // // This is only used in test code that rely on old ACM APIs. // TODO(minyue): Remove it when possible. virtual int SetPacketLossRate(int packet_loss_rate) = 0; /////////////////////////////////////////////////////////////////////////// // statistics // virtual ANAStats GetANAStats() const = 0; virtual int GetTargetBitrate() const = 0; }; } // namespace webrtc #endif // MODULES_AUDIO_CODING_INCLUDE_AUDIO_CODING_MODULE_H_