Adding thread annotations to parts of Audio Coding Module
Picking some low-hanging fruit. Add annotations for acm_crit_sect_ that do not require lock changes. Also adding annotations for callbacks. BUG=3401 R=pbos@webrtc.org Review URL: https://webrtc-codereview.appspot.com/12579005 git-svn-id: http://webrtc.googlecode.com/svn/trunk@6299 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
parent
2812b59acd
commit
fe41a8f68d
@ -116,7 +116,7 @@ static int TimestampLessThan(uint32_t t1, uint32_t t2) {
|
|||||||
|
|
||||||
AudioCodingModuleImpl::AudioCodingModuleImpl(
|
AudioCodingModuleImpl::AudioCodingModuleImpl(
|
||||||
const AudioCodingModule::Config& config)
|
const AudioCodingModule::Config& config)
|
||||||
: packetization_callback_(NULL),
|
: acm_crit_sect_(CriticalSectionWrapper::CreateCriticalSection()),
|
||||||
id_(config.id),
|
id_(config.id),
|
||||||
expected_codec_ts_(0xD87F3F9F),
|
expected_codec_ts_(0xD87F3F9F),
|
||||||
expected_in_ts_(0xD87F3F9F),
|
expected_in_ts_(0xD87F3F9F),
|
||||||
@ -133,8 +133,6 @@ AudioCodingModuleImpl::AudioCodingModuleImpl(
|
|||||||
current_send_codec_idx_(-1),
|
current_send_codec_idx_(-1),
|
||||||
send_codec_registered_(false),
|
send_codec_registered_(false),
|
||||||
receiver_(config),
|
receiver_(config),
|
||||||
acm_crit_sect_(CriticalSectionWrapper::CreateCriticalSection()),
|
|
||||||
vad_callback_(NULL),
|
|
||||||
is_first_red_(true),
|
is_first_red_(true),
|
||||||
red_enabled_(false),
|
red_enabled_(false),
|
||||||
last_red_timestamp_(0),
|
last_red_timestamp_(0),
|
||||||
@ -142,10 +140,12 @@ AudioCodingModuleImpl::AudioCodingModuleImpl(
|
|||||||
previous_pltype_(255),
|
previous_pltype_(255),
|
||||||
aux_rtp_header_(NULL),
|
aux_rtp_header_(NULL),
|
||||||
receiver_initialized_(false),
|
receiver_initialized_(false),
|
||||||
callback_crit_sect_(CriticalSectionWrapper::CreateCriticalSection()),
|
|
||||||
secondary_send_codec_inst_(),
|
secondary_send_codec_inst_(),
|
||||||
codec_timestamp_(expected_codec_ts_),
|
codec_timestamp_(expected_codec_ts_),
|
||||||
first_10ms_data_(false) {
|
first_10ms_data_(false),
|
||||||
|
callback_crit_sect_(CriticalSectionWrapper::CreateCriticalSection()),
|
||||||
|
packetization_callback_(NULL),
|
||||||
|
vad_callback_(NULL) {
|
||||||
|
|
||||||
// Nullify send codec memory, set payload type and set codec name to
|
// Nullify send codec memory, set payload type and set codec name to
|
||||||
// invalid values.
|
// invalid values.
|
||||||
|
@ -19,11 +19,11 @@
|
|||||||
#include "webrtc/modules/audio_coding/main/acm2/acm_receiver.h"
|
#include "webrtc/modules/audio_coding/main/acm2/acm_receiver.h"
|
||||||
#include "webrtc/modules/audio_coding/main/acm2/acm_resampler.h"
|
#include "webrtc/modules/audio_coding/main/acm2/acm_resampler.h"
|
||||||
#include "webrtc/system_wrappers/interface/scoped_ptr.h"
|
#include "webrtc/system_wrappers/interface/scoped_ptr.h"
|
||||||
|
#include "webrtc/system_wrappers/interface/thread_annotations.h"
|
||||||
|
|
||||||
namespace webrtc {
|
namespace webrtc {
|
||||||
|
|
||||||
class CriticalSectionWrapper;
|
class CriticalSectionWrapper;
|
||||||
class RWLockWrapper;
|
|
||||||
|
|
||||||
namespace acm2 {
|
namespace acm2 {
|
||||||
|
|
||||||
@ -246,13 +246,14 @@ class AudioCodingModuleImpl : public AudioCodingModule {
|
|||||||
|
|
||||||
ACMGenericCodec* CreateCodec(const CodecInst& codec);
|
ACMGenericCodec* CreateCodec(const CodecInst& codec);
|
||||||
|
|
||||||
int InitializeReceiverSafe();
|
int InitializeReceiverSafe() EXCLUSIVE_LOCKS_REQUIRED(acm_crit_sect_);
|
||||||
|
|
||||||
bool HaveValidEncoder(const char* caller_name) const;
|
bool HaveValidEncoder(const char* caller_name) const;
|
||||||
|
|
||||||
// Set VAD/DTX status. This function does not acquire a lock, and it is
|
// Set VAD/DTX status. This function does not acquire a lock, and it is
|
||||||
// created to be called only from inside a critical section.
|
// created to be called only from inside a critical section.
|
||||||
int SetVADSafe(bool enable_dtx, bool enable_vad, ACMVADMode mode);
|
int SetVADSafe(bool enable_dtx, bool enable_vad, ACMVADMode mode)
|
||||||
|
EXCLUSIVE_LOCKS_REQUIRED(acm_crit_sect_);
|
||||||
|
|
||||||
// Process buffered audio when dual-streaming is not enabled (When RED is
|
// Process buffered audio when dual-streaming is not enabled (When RED is
|
||||||
// enabled still this function is used.)
|
// enabled still this function is used.)
|
||||||
@ -274,18 +275,22 @@ class AudioCodingModuleImpl : public AudioCodingModule {
|
|||||||
// -1: if encountering an error.
|
// -1: if encountering an error.
|
||||||
// 0: otherwise.
|
// 0: otherwise.
|
||||||
int PreprocessToAddData(const AudioFrame& in_frame,
|
int PreprocessToAddData(const AudioFrame& in_frame,
|
||||||
const AudioFrame** ptr_out);
|
const AudioFrame** ptr_out)
|
||||||
|
EXCLUSIVE_LOCKS_REQUIRED(acm_crit_sect_);
|
||||||
|
|
||||||
// Change required states after starting to receive the codec corresponding
|
// Change required states after starting to receive the codec corresponding
|
||||||
// to |index|.
|
// to |index|.
|
||||||
int UpdateUponReceivingCodec(int index);
|
int UpdateUponReceivingCodec(int index);
|
||||||
|
|
||||||
int EncodeFragmentation(int fragmentation_index, int payload_type,
|
int EncodeFragmentation(int fragmentation_index,
|
||||||
|
int payload_type,
|
||||||
uint32_t current_timestamp,
|
uint32_t current_timestamp,
|
||||||
ACMGenericCodec* encoder,
|
ACMGenericCodec* encoder,
|
||||||
uint8_t* stream);
|
uint8_t* stream)
|
||||||
|
EXCLUSIVE_LOCKS_REQUIRED(acm_crit_sect_);
|
||||||
|
|
||||||
void ResetFragmentation(int vector_size);
|
void ResetFragmentation(int vector_size)
|
||||||
|
EXCLUSIVE_LOCKS_REQUIRED(acm_crit_sect_);
|
||||||
|
|
||||||
// Get a pointer to AudioDecoder of the given codec. For some codecs, e.g.
|
// Get a pointer to AudioDecoder of the given codec. For some codecs, e.g.
|
||||||
// iSAC, encoding and decoding have to be performed on a shared
|
// iSAC, encoding and decoding have to be performed on a shared
|
||||||
@ -300,53 +305,50 @@ class AudioCodingModuleImpl : public AudioCodingModule {
|
|||||||
int GetAudioDecoder(const CodecInst& codec, int codec_id,
|
int GetAudioDecoder(const CodecInst& codec, int codec_id,
|
||||||
int mirror_id, AudioDecoder** decoder);
|
int mirror_id, AudioDecoder** decoder);
|
||||||
|
|
||||||
AudioPacketizationCallback* packetization_callback_;
|
CriticalSectionWrapper* acm_crit_sect_;
|
||||||
|
int id_; // TODO(henrik.lundin) Make const.
|
||||||
|
uint32_t expected_codec_ts_ GUARDED_BY(acm_crit_sect_);
|
||||||
|
uint32_t expected_in_ts_ GUARDED_BY(acm_crit_sect_);
|
||||||
|
CodecInst send_codec_inst_ GUARDED_BY(acm_crit_sect_);
|
||||||
|
|
||||||
int id_;
|
uint8_t cng_nb_pltype_ GUARDED_BY(acm_crit_sect_);
|
||||||
uint32_t expected_codec_ts_;
|
uint8_t cng_wb_pltype_ GUARDED_BY(acm_crit_sect_);
|
||||||
uint32_t expected_in_ts_;
|
uint8_t cng_swb_pltype_ GUARDED_BY(acm_crit_sect_);
|
||||||
CodecInst send_codec_inst_;
|
uint8_t cng_fb_pltype_ GUARDED_BY(acm_crit_sect_);
|
||||||
|
|
||||||
uint8_t cng_nb_pltype_;
|
uint8_t red_pltype_ GUARDED_BY(acm_crit_sect_);
|
||||||
uint8_t cng_wb_pltype_;
|
bool vad_enabled_ GUARDED_BY(acm_crit_sect_);
|
||||||
uint8_t cng_swb_pltype_;
|
bool dtx_enabled_ GUARDED_BY(acm_crit_sect_);
|
||||||
uint8_t cng_fb_pltype_;
|
ACMVADMode vad_mode_ GUARDED_BY(acm_crit_sect_);
|
||||||
|
|
||||||
uint8_t red_pltype_;
|
|
||||||
bool vad_enabled_;
|
|
||||||
bool dtx_enabled_;
|
|
||||||
ACMVADMode vad_mode_;
|
|
||||||
ACMGenericCodec* codecs_[ACMCodecDB::kMaxNumCodecs];
|
ACMGenericCodec* codecs_[ACMCodecDB::kMaxNumCodecs];
|
||||||
int mirror_codec_idx_[ACMCodecDB::kMaxNumCodecs];
|
int mirror_codec_idx_[ACMCodecDB::kMaxNumCodecs];
|
||||||
bool stereo_send_;
|
bool stereo_send_ GUARDED_BY(acm_crit_sect_);
|
||||||
int current_send_codec_idx_;
|
int current_send_codec_idx_;
|
||||||
bool send_codec_registered_;
|
bool send_codec_registered_;
|
||||||
ACMResampler resampler_;
|
ACMResampler resampler_ GUARDED_BY(acm_crit_sect_);
|
||||||
AcmReceiver receiver_;
|
AcmReceiver receiver_;
|
||||||
CriticalSectionWrapper* acm_crit_sect_;
|
|
||||||
ACMVADCallback* vad_callback_;
|
|
||||||
|
|
||||||
// RED.
|
// RED.
|
||||||
bool is_first_red_;
|
bool is_first_red_ GUARDED_BY(acm_crit_sect_);
|
||||||
bool red_enabled_;
|
bool red_enabled_ GUARDED_BY(acm_crit_sect_);
|
||||||
|
|
||||||
// TODO(turajs): |red_buffer_| is allocated in constructor, why having them
|
// TODO(turajs): |red_buffer_| is allocated in constructor, why having them
|
||||||
// as pointers and not an array. If concerned about the memory, then make a
|
// as pointers and not an array. If concerned about the memory, then make a
|
||||||
// set-up function to allocate them only when they are going to be used, i.e.
|
// set-up function to allocate them only when they are going to be used, i.e.
|
||||||
// RED or Dual-streaming is enabled.
|
// RED or Dual-streaming is enabled.
|
||||||
uint8_t* red_buffer_;
|
uint8_t* red_buffer_ GUARDED_BY(acm_crit_sect_);
|
||||||
|
|
||||||
// TODO(turajs): we actually don't need |fragmentation_| as a member variable.
|
// TODO(turajs): we actually don't need |fragmentation_| as a member variable.
|
||||||
// It is sufficient to keep the length & payload type of previous payload in
|
// It is sufficient to keep the length & payload type of previous payload in
|
||||||
// member variables.
|
// member variables.
|
||||||
RTPFragmentationHeader fragmentation_;
|
RTPFragmentationHeader fragmentation_ GUARDED_BY(acm_crit_sect_);
|
||||||
uint32_t last_red_timestamp_;
|
uint32_t last_red_timestamp_ GUARDED_BY(acm_crit_sect_);
|
||||||
|
|
||||||
// Codec internal FEC
|
// Codec internal FEC
|
||||||
bool codec_fec_enabled_;
|
bool codec_fec_enabled_;
|
||||||
|
|
||||||
// This is to keep track of CN instances where we can send DTMFs.
|
// This is to keep track of CN instances where we can send DTMFs.
|
||||||
uint8_t previous_pltype_;
|
uint8_t previous_pltype_ GUARDED_BY(acm_crit_sect_);
|
||||||
|
|
||||||
// Used when payloads are pushed into ACM without any RTP info
|
// Used when payloads are pushed into ACM without any RTP info
|
||||||
// One example is when pre-encoded bit-stream is pushed from
|
// One example is when pre-encoded bit-stream is pushed from
|
||||||
@ -356,15 +358,18 @@ class AudioCodingModuleImpl : public AudioCodingModule {
|
|||||||
// be used in other methods, locks need to be taken.
|
// be used in other methods, locks need to be taken.
|
||||||
WebRtcRTPHeader* aux_rtp_header_;
|
WebRtcRTPHeader* aux_rtp_header_;
|
||||||
|
|
||||||
bool receiver_initialized_;
|
bool receiver_initialized_ GUARDED_BY(acm_crit_sect_);
|
||||||
|
|
||||||
|
AudioFrame preprocess_frame_ GUARDED_BY(acm_crit_sect_);
|
||||||
|
CodecInst secondary_send_codec_inst_ GUARDED_BY(acm_crit_sect_);
|
||||||
|
scoped_ptr<ACMGenericCodec> secondary_encoder_ GUARDED_BY(acm_crit_sect_);
|
||||||
|
uint32_t codec_timestamp_ GUARDED_BY(acm_crit_sect_);
|
||||||
|
bool first_10ms_data_ GUARDED_BY(acm_crit_sect_);
|
||||||
|
|
||||||
CriticalSectionWrapper* callback_crit_sect_;
|
CriticalSectionWrapper* callback_crit_sect_;
|
||||||
|
AudioPacketizationCallback* packetization_callback_
|
||||||
AudioFrame preprocess_frame_;
|
GUARDED_BY(callback_crit_sect_);
|
||||||
CodecInst secondary_send_codec_inst_;
|
ACMVADCallback* vad_callback_ GUARDED_BY(callback_crit_sect_);
|
||||||
scoped_ptr<ACMGenericCodec> secondary_encoder_;
|
|
||||||
uint32_t codec_timestamp_;
|
|
||||||
bool first_10ms_data_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace acm2
|
} // namespace acm2
|
||||||
|
Loading…
x
Reference in New Issue
Block a user