blob: fe35420c736d3eb32b6004bcb1e6f60f90aaf7cb [file] [log] [blame]
Niels Mölleree3d9952019-09-09 12:51:55 +02001/*
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
Rasmus Brandtc4d253c2022-05-25 12:03:35 +020011#include "modules/video_coding/video_receiver2.h"
12
Niels Mölleree3d9952019-09-09 12:51:55 +020013#include <stddef.h>
14
15#include <cstdint>
16#include <vector>
17
Niels Mölleree3d9952019-09-09 12:51:55 +020018#include "api/video_codecs/video_codec.h"
19#include "api/video_codecs/video_decoder.h"
20#include "modules/video_coding/decoder_database.h"
21#include "modules/video_coding/encoded_frame.h"
22#include "modules/video_coding/generic_decoder.h"
23#include "modules/video_coding/include/video_coding_defines.h"
Rasmus Brandtc4d253c2022-05-25 12:03:35 +020024#include "modules/video_coding/timing/timing.h"
Niels Mölleree3d9952019-09-09 12:51:55 +020025#include "rtc_base/checks.h"
26#include "rtc_base/trace_event.h"
27#include "system_wrappers/include/clock.h"
28
29namespace webrtc {
30
Jonas Orelande02f9ee2022-03-25 12:43:14 +010031VideoReceiver2::VideoReceiver2(Clock* clock,
32 VCMTiming* timing,
Jonas Orelande62c2f22022-03-29 11:04:48 +020033 const FieldTrialsView& field_trials)
Niels Mölleree3d9952019-09-09 12:51:55 +020034 : clock_(clock),
35 timing_(timing),
Jonas Orelande02f9ee2022-03-25 12:43:14 +010036 decodedFrameCallback_(timing_, clock_, field_trials),
Niels Mölleree3d9952019-09-09 12:51:55 +020037 codecDataBase_() {
Johannes Kron16359f62021-02-18 23:37:22 +010038 decoder_sequence_checker_.Detach();
Niels Mölleree3d9952019-09-09 12:51:55 +020039}
40
41VideoReceiver2::~VideoReceiver2() {
Johannes Kron16359f62021-02-18 23:37:22 +010042 RTC_DCHECK_RUN_ON(&construction_sequence_checker_);
Niels Mölleree3d9952019-09-09 12:51:55 +020043}
44
45// Register a receive callback. Will be called whenever there is a new frame
46// ready for rendering.
47int32_t VideoReceiver2::RegisterReceiveCallback(
48 VCMReceiveCallback* receiveCallback) {
Johannes Kron16359f62021-02-18 23:37:22 +010049 RTC_DCHECK_RUN_ON(&construction_sequence_checker_);
Niels Mölleree3d9952019-09-09 12:51:55 +020050 // This value is set before the decoder thread starts and unset after
51 // the decoder thread has been stopped.
52 decodedFrameCallback_.SetUserReceiveCallback(receiveCallback);
53 return VCM_OK;
54}
55
Niels Mölleree3d9952019-09-09 12:51:55 +020056void VideoReceiver2::RegisterExternalDecoder(VideoDecoder* externalDecoder,
57 uint8_t payloadType) {
Erik Språng79c96de2022-08-19 11:48:10 +020058 RTC_DCHECK_RUN_ON(&decoder_sequence_checker_);
59 RTC_DCHECK(decodedFrameCallback_.UserReceiveCallback());
Johannes Kron16359f62021-02-18 23:37:22 +010060
Niels Mölleree3d9952019-09-09 12:51:55 +020061 if (externalDecoder == nullptr) {
Johannes Kron16359f62021-02-18 23:37:22 +010062 codecDataBase_.DeregisterExternalDecoder(payloadType);
Erik Språng79c96de2022-08-19 11:48:10 +020063 } else {
64 codecDataBase_.RegisterExternalDecoder(payloadType, externalDecoder);
Niels Mölleree3d9952019-09-09 12:51:55 +020065 }
Niels Mölleree3d9952019-09-09 12:51:55 +020066}
67
Johannes Kron16359f62021-02-18 23:37:22 +010068bool VideoReceiver2::IsExternalDecoderRegistered(uint8_t payloadType) const {
69 RTC_DCHECK_RUN_ON(&decoder_sequence_checker_);
70 return codecDataBase_.IsExternalDecoderRegistered(payloadType);
71}
72
Niels Mölleree3d9952019-09-09 12:51:55 +020073// Must be called from inside the receive side critical section.
74int32_t VideoReceiver2::Decode(const VCMEncodedFrame* frame) {
Johannes Kron16359f62021-02-18 23:37:22 +010075 RTC_DCHECK_RUN_ON(&decoder_sequence_checker_);
Niels Mölleree3d9952019-09-09 12:51:55 +020076 TRACE_EVENT0("webrtc", "VideoReceiver2::Decode");
Erik Språng79c96de2022-08-19 11:48:10 +020077 // Change decoder if payload type has changed.
Niels Mölleree3d9952019-09-09 12:51:55 +020078 VCMGenericDecoder* decoder =
79 codecDataBase_.GetDecoder(*frame, &decodedFrameCallback_);
80 if (decoder == nullptr) {
81 return VCM_NO_CODEC_REGISTERED;
82 }
Johannes Kron05f84872020-01-16 14:09:33 +010083 return decoder->Decode(*frame, clock_->CurrentTime());
Niels Mölleree3d9952019-09-09 12:51:55 +020084}
85
Erik Språng79c96de2022-08-19 11:48:10 +020086// Register possible receive codecs, can be called multiple times.
87// Called before decoder thread is started.
Danil Chapovalovba0a3062021-08-13 18:15:55 +020088void VideoReceiver2::RegisterReceiveCodec(
Danil Chapovalov355b8d22021-08-13 16:50:37 +020089 uint8_t payload_type,
90 const VideoDecoder::Settings& settings) {
Johannes Kron16359f62021-02-18 23:37:22 +010091 RTC_DCHECK_RUN_ON(&construction_sequence_checker_);
Danil Chapovalovba0a3062021-08-13 18:15:55 +020092 codecDataBase_.RegisterReceiveCodec(payload_type, settings);
Niels Mölleree3d9952019-09-09 12:51:55 +020093}
94
Niels Mölleree3d9952019-09-09 12:51:55 +020095} // namespace webrtc