video_receiver2.cc (3959B)
1 /* 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "modules/video_coding/video_receiver2.h" 12 13 #include <cstddef> 14 #include <cstdint> 15 #include <memory> 16 #include <utility> 17 18 #include "api/field_trials_view.h" 19 #include "api/sequence_checker.h" 20 #include "api/video/encoded_frame.h" 21 #include "api/video_codecs/video_decoder.h" 22 #include "common_video/include/corruption_score_calculator.h" 23 #include "modules/video_coding/decoder_database.h" 24 #include "modules/video_coding/generic_decoder.h" 25 #include "modules/video_coding/include/video_coding_defines.h" 26 #include "modules/video_coding/timing/timing.h" 27 #include "rtc_base/checks.h" 28 #include "rtc_base/trace_event.h" 29 #include "system_wrappers/include/clock.h" 30 31 namespace webrtc { 32 33 VideoReceiver2::VideoReceiver2( 34 Clock* clock, 35 VCMTiming* timing, 36 const FieldTrialsView& field_trials, 37 CorruptionScoreCalculator* corruption_score_calculator) 38 : clock_(clock), 39 decoded_frame_callback_(timing, 40 clock_, 41 field_trials, 42 corruption_score_calculator), 43 codec_database_() { 44 decoder_sequence_checker_.Detach(); 45 } 46 47 VideoReceiver2::~VideoReceiver2() { 48 RTC_DCHECK_RUN_ON(&construction_sequence_checker_); 49 } 50 51 // Register a receive callback. Will be called whenever there is a new frame 52 // ready for rendering. 53 int32_t VideoReceiver2::RegisterReceiveCallback( 54 VCMReceiveCallback* receive_callback) { 55 RTC_DCHECK_RUN_ON(&construction_sequence_checker_); 56 // This value is set before the decoder thread starts and unset after 57 // the decoder thread has been stopped. 58 decoded_frame_callback_.SetUserReceiveCallback(receive_callback); 59 return VCM_OK; 60 } 61 62 void VideoReceiver2::RegisterExternalDecoder( 63 std::unique_ptr<VideoDecoder> decoder, 64 uint8_t payload_type) { 65 RTC_DCHECK_RUN_ON(&decoder_sequence_checker_); 66 RTC_DCHECK(decoded_frame_callback_.UserReceiveCallback()); 67 68 if (decoder) { 69 RTC_DCHECK(!codec_database_.IsExternalDecoderRegistered(payload_type)); 70 codec_database_.RegisterExternalDecoder(payload_type, std::move(decoder)); 71 } else { 72 codec_database_.DeregisterExternalDecoder(payload_type); 73 } 74 } 75 76 bool VideoReceiver2::IsExternalDecoderRegistered(uint8_t payload_type) const { 77 RTC_DCHECK_RUN_ON(&decoder_sequence_checker_); 78 return codec_database_.IsExternalDecoderRegistered(payload_type); 79 } 80 81 // Must be called from inside the receive side critical section. 82 int32_t VideoReceiver2::Decode(const EncodedFrame* frame) { 83 RTC_DCHECK_RUN_ON(&decoder_sequence_checker_); 84 TRACE_EVENT0("webrtc", "VideoReceiver2::Decode"); 85 // Change decoder if payload type has changed. 86 VCMGenericDecoder* decoder = 87 codec_database_.GetDecoder(*frame, &decoded_frame_callback_); 88 if (decoder == nullptr) { 89 return VCM_NO_CODEC_REGISTERED; 90 } 91 return decoder->Decode(*frame, clock_->CurrentTime()); 92 } 93 94 // Register possible receive codecs, can be called multiple times. 95 // Called before decoder thread is started. 96 void VideoReceiver2::RegisterReceiveCodec( 97 uint8_t payload_type, 98 const VideoDecoder::Settings& settings) { 99 RTC_DCHECK_RUN_ON(&construction_sequence_checker_); 100 codec_database_.RegisterReceiveCodec(payload_type, settings); 101 } 102 103 void VideoReceiver2::DeregisterReceiveCodec(uint8_t payload_type) { 104 RTC_DCHECK_RUN_ON(&construction_sequence_checker_); 105 codec_database_.DeregisterReceiveCodec(payload_type); 106 } 107 108 void VideoReceiver2::DeregisterReceiveCodecs() { 109 RTC_DCHECK_RUN_ON(&construction_sequence_checker_); 110 codec_database_.DeregisterReceiveCodecs(); 111 } 112 113 } // namespace webrtc