Delete pre_decode_callback.
Only user was the replay.cc tool, when dumping frames to a file. It is changed to instead inject a special decoder. Bug: None Change-Id: I521fbba1a0ef440cff7d786f6f4c6397e33f764f Reviewed-on: https://webrtc-review.googlesource.com/83121 Reviewed-by: Patrik Höglund <phoglund@webrtc.org> Reviewed-by: Erik Språng <sprang@webrtc.org> Commit-Queue: Niels Moller <nisse@webrtc.org> Cr-Commit-Position: refs/heads/master@{#23675}
This commit is contained in:
parent
5297bd21b1
commit
f88a22cf11
@ -88,8 +88,6 @@ std::string VideoReceiveStream::Config::ToString() const {
|
|||||||
ss << ", render_delay_ms: " << render_delay_ms;
|
ss << ", render_delay_ms: " << render_delay_ms;
|
||||||
if (!sync_group.empty())
|
if (!sync_group.empty())
|
||||||
ss << ", sync_group: " << sync_group;
|
ss << ", sync_group: " << sync_group;
|
||||||
ss << ", pre_decode_callback: "
|
|
||||||
<< (pre_decode_callback ? "(EncodedFrameObserver)" : "nullptr");
|
|
||||||
ss << ", target_delay_ms: " << target_delay_ms;
|
ss << ", target_delay_ms: " << target_delay_ms;
|
||||||
ss << '}';
|
ss << '}';
|
||||||
|
|
||||||
|
|||||||
@ -213,11 +213,6 @@ class VideoReceiveStream {
|
|||||||
// to one of the audio streams.
|
// to one of the audio streams.
|
||||||
std::string sync_group;
|
std::string sync_group;
|
||||||
|
|
||||||
// Called for each incoming video frame, i.e. in encoded state. E.g. used
|
|
||||||
// when
|
|
||||||
// saving the stream to a file. 'nullptr' disables the callback.
|
|
||||||
EncodedFrameObserver* pre_decode_callback = nullptr;
|
|
||||||
|
|
||||||
// Target delay in milliseconds. A positive value indicates this stream is
|
// Target delay in milliseconds. A positive value indicates this stream is
|
||||||
// used for streaming instead of a real-time call.
|
// used for streaming instead of a real-time call.
|
||||||
int target_delay_ms = 0;
|
int target_delay_ms = 0;
|
||||||
|
|||||||
@ -57,17 +57,6 @@ class FakeH264Decoder : public FakeDecoder {
|
|||||||
int64_t render_time_ms) override;
|
int64_t render_time_ms) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
class FakeNullDecoder : public FakeDecoder {
|
|
||||||
public:
|
|
||||||
virtual ~FakeNullDecoder() {}
|
|
||||||
|
|
||||||
int32_t Decode(const EncodedImage& input,
|
|
||||||
bool missing_frames,
|
|
||||||
const CodecSpecificInfo* codec_specific_info,
|
|
||||||
int64_t render_time_ms) override {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
} // namespace test
|
} // namespace test
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
|
|
||||||
|
|||||||
@ -225,15 +225,6 @@ TEST_P(CallOperationEndToEndTest, ObserversEncodedFrames) {
|
|||||||
|
|
||||||
bool Wait() { return called_.Wait(kDefaultTimeoutMs); }
|
bool Wait() { return called_.Wait(kDefaultTimeoutMs); }
|
||||||
|
|
||||||
void ExpectEqualFrames(const EncodedFrameTestObserver& observer) {
|
|
||||||
ASSERT_EQ(length_, observer.length_)
|
|
||||||
<< "Observed frames are of different lengths.";
|
|
||||||
EXPECT_EQ(frame_type_, observer.frame_type_)
|
|
||||||
<< "Observed frames have different frame types.";
|
|
||||||
EXPECT_EQ(0, memcmp(buffer_.get(), observer.buffer_.get(), length_))
|
|
||||||
<< "Observed encoded frames have different content.";
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::unique_ptr<uint8_t[]> buffer_;
|
std::unique_ptr<uint8_t[]> buffer_;
|
||||||
size_t length_;
|
size_t length_;
|
||||||
@ -242,7 +233,6 @@ TEST_P(CallOperationEndToEndTest, ObserversEncodedFrames) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
EncodedFrameTestObserver post_encode_observer;
|
EncodedFrameTestObserver post_encode_observer;
|
||||||
EncodedFrameTestObserver pre_decode_observer;
|
|
||||||
test::FrameForwarder forwarder;
|
test::FrameForwarder forwarder;
|
||||||
std::unique_ptr<test::FrameGenerator> frame_generator;
|
std::unique_ptr<test::FrameGenerator> frame_generator;
|
||||||
|
|
||||||
@ -262,7 +252,6 @@ TEST_P(CallOperationEndToEndTest, ObserversEncodedFrames) {
|
|||||||
CreateSendConfig(1, 0, 0, sender_transport.get());
|
CreateSendConfig(1, 0, 0, sender_transport.get());
|
||||||
CreateMatchingReceiveConfigs(receiver_transport.get());
|
CreateMatchingReceiveConfigs(receiver_transport.get());
|
||||||
video_send_config_.post_encode_callback = &post_encode_observer;
|
video_send_config_.post_encode_callback = &post_encode_observer;
|
||||||
video_receive_configs_[0].pre_decode_callback = &pre_decode_observer;
|
|
||||||
|
|
||||||
CreateVideoStreams();
|
CreateVideoStreams();
|
||||||
Start();
|
Start();
|
||||||
@ -277,11 +266,6 @@ TEST_P(CallOperationEndToEndTest, ObserversEncodedFrames) {
|
|||||||
EXPECT_TRUE(post_encode_observer.Wait())
|
EXPECT_TRUE(post_encode_observer.Wait())
|
||||||
<< "Timed out while waiting for send-side encoded-frame callback.";
|
<< "Timed out while waiting for send-side encoded-frame callback.";
|
||||||
|
|
||||||
EXPECT_TRUE(pre_decode_observer.Wait())
|
|
||||||
<< "Timed out while waiting for pre-decode encoded-frame callback.";
|
|
||||||
|
|
||||||
post_encode_observer.ExpectEqualFrames(pre_decode_observer);
|
|
||||||
|
|
||||||
task_queue_.SendTask([this, &sender_transport, &receiver_transport]() {
|
task_queue_.SendTask([this, &sender_transport, &receiver_transport]() {
|
||||||
Stop();
|
Stop();
|
||||||
DestroyStreams();
|
DestroyStreams();
|
||||||
|
|||||||
@ -201,7 +201,7 @@ class FileRenderPassthrough : public rtc::VideoSinkInterface<VideoFrame> {
|
|||||||
size_t count_;
|
size_t count_;
|
||||||
};
|
};
|
||||||
|
|
||||||
class DecoderBitstreamFileWriter : public EncodedFrameObserver {
|
class DecoderBitstreamFileWriter : public test::FakeDecoder {
|
||||||
public:
|
public:
|
||||||
explicit DecoderBitstreamFileWriter(const char* filename)
|
explicit DecoderBitstreamFileWriter(const char* filename)
|
||||||
: file_(fopen(filename, "wb")) {
|
: file_(fopen(filename, "wb")) {
|
||||||
@ -209,8 +209,16 @@ class DecoderBitstreamFileWriter : public EncodedFrameObserver {
|
|||||||
}
|
}
|
||||||
~DecoderBitstreamFileWriter() { fclose(file_); }
|
~DecoderBitstreamFileWriter() { fclose(file_); }
|
||||||
|
|
||||||
virtual void EncodedFrameCallback(const EncodedFrame& encoded_frame) {
|
int32_t Decode(const EncodedImage& encoded_frame,
|
||||||
fwrite(encoded_frame.data_, 1, encoded_frame.length_, file_);
|
bool /* missing_frames */,
|
||||||
|
const CodecSpecificInfo* /* codec_specific_info */,
|
||||||
|
int64_t /* render_time_ms */) override {
|
||||||
|
if (fwrite(encoded_frame._buffer, 1, encoded_frame._length, file_)
|
||||||
|
< encoded_frame._length) {
|
||||||
|
RTC_LOG_ERR(LS_ERROR) << "fwrite of encoded frame failed.";
|
||||||
|
return WEBRTC_VIDEO_CODEC_ERROR;
|
||||||
|
}
|
||||||
|
return WEBRTC_VIDEO_CODEC_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -252,19 +260,14 @@ void RtpReplay() {
|
|||||||
receive_config.renderer = &file_passthrough;
|
receive_config.renderer = &file_passthrough;
|
||||||
|
|
||||||
VideoReceiveStream::Decoder decoder;
|
VideoReceiveStream::Decoder decoder;
|
||||||
std::unique_ptr<DecoderBitstreamFileWriter> bitstream_writer;
|
|
||||||
if (!flags::DecoderBitstreamFilename().empty()) {
|
|
||||||
bitstream_writer.reset(new DecoderBitstreamFileWriter(
|
|
||||||
flags::DecoderBitstreamFilename().c_str()));
|
|
||||||
receive_config.pre_decode_callback = bitstream_writer.get();
|
|
||||||
}
|
|
||||||
decoder =
|
decoder =
|
||||||
test::CreateMatchingDecoder(flags::MediaPayloadType(), flags::Codec());
|
test::CreateMatchingDecoder(flags::MediaPayloadType(), flags::Codec());
|
||||||
if (!flags::DecoderBitstreamFilename().empty()) {
|
if (!flags::DecoderBitstreamFilename().empty()) {
|
||||||
// Replace with a null decoder if we're writing the bitstream to a file
|
// Replace decoder with file writer if we're writing the bitstream to a file
|
||||||
// instead.
|
// instead.
|
||||||
delete decoder.decoder;
|
delete decoder.decoder;
|
||||||
decoder.decoder = new test::FakeNullDecoder();
|
decoder.decoder = new DecoderBitstreamFileWriter(
|
||||||
|
flags::DecoderBitstreamFilename().c_str());
|
||||||
}
|
}
|
||||||
receive_config.decoders.push_back(decoder);
|
receive_config.decoders.push_back(decoder);
|
||||||
|
|
||||||
|
|||||||
@ -97,7 +97,8 @@ namespace webrtc {
|
|||||||
|
|
||||||
class VideoAnalyzer : public PacketReceiver,
|
class VideoAnalyzer : public PacketReceiver,
|
||||||
public Transport,
|
public Transport,
|
||||||
public rtc::VideoSinkInterface<VideoFrame> {
|
public rtc::VideoSinkInterface<VideoFrame>,
|
||||||
|
public EncodedFrameObserver {
|
||||||
public:
|
public:
|
||||||
VideoAnalyzer(test::LayerFilteringTransport* transport,
|
VideoAnalyzer(test::LayerFilteringTransport* transport,
|
||||||
const std::string& test_label,
|
const std::string& test_label,
|
||||||
@ -129,7 +130,6 @@ class VideoAnalyzer : public PacketReceiver,
|
|||||||
selected_sl_(selected_sl),
|
selected_sl_(selected_sl),
|
||||||
selected_tl_(selected_tl),
|
selected_tl_(selected_tl),
|
||||||
pre_encode_proxy_(this),
|
pre_encode_proxy_(this),
|
||||||
encode_timing_proxy_(this),
|
|
||||||
last_fec_bytes_(0),
|
last_fec_bytes_(0),
|
||||||
frames_to_process_(duration_frames),
|
frames_to_process_(duration_frames),
|
||||||
frames_recorded_(0),
|
frames_recorded_(0),
|
||||||
@ -279,7 +279,8 @@ class VideoAnalyzer : public PacketReceiver,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PostEncodeFrameCallback(const EncodedFrame& encoded_frame) {
|
// EncodedFrameObserver implementation, wired to post_encode_callback.
|
||||||
|
void EncodedFrameCallback(const EncodedFrame& encoded_frame) override {
|
||||||
rtc::CritScope lock(&crit_);
|
rtc::CritScope lock(&crit_);
|
||||||
if (!first_sent_timestamp_ &&
|
if (!first_sent_timestamp_ &&
|
||||||
encoded_frame.stream_id_ == selected_stream_) {
|
encoded_frame.stream_id_ == selected_stream_) {
|
||||||
@ -419,7 +420,6 @@ class VideoAnalyzer : public PacketReceiver,
|
|||||||
rtc::VideoSinkInterface<VideoFrame>* pre_encode_proxy() {
|
rtc::VideoSinkInterface<VideoFrame>* pre_encode_proxy() {
|
||||||
return &pre_encode_proxy_;
|
return &pre_encode_proxy_;
|
||||||
}
|
}
|
||||||
EncodedFrameObserver* encode_timing_proxy() { return &encode_timing_proxy_; }
|
|
||||||
|
|
||||||
void StartMeasuringCpuProcessTime() {
|
void StartMeasuringCpuProcessTime() {
|
||||||
rtc::CritScope lock(&cpu_measurement_lock_);
|
rtc::CritScope lock(&cpu_measurement_lock_);
|
||||||
@ -529,20 +529,6 @@ class VideoAnalyzer : public PacketReceiver,
|
|||||||
double ssim;
|
double ssim;
|
||||||
};
|
};
|
||||||
|
|
||||||
// This class receives the send-side OnEncodeTiming and is provided to not
|
|
||||||
// conflict with the receiver-side pre_decode_callback.
|
|
||||||
class OnEncodeTimingProxy : public EncodedFrameObserver {
|
|
||||||
public:
|
|
||||||
explicit OnEncodeTimingProxy(VideoAnalyzer* parent) : parent_(parent) {}
|
|
||||||
|
|
||||||
void EncodedFrameCallback(const EncodedFrame& frame) override {
|
|
||||||
parent_->PostEncodeFrameCallback(frame);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
VideoAnalyzer* const parent_;
|
|
||||||
};
|
|
||||||
|
|
||||||
// This class receives the send-side OnFrame callback and is provided to not
|
// This class receives the send-side OnFrame callback and is provided to not
|
||||||
// conflict with the receiver-side renderer callback.
|
// conflict with the receiver-side renderer callback.
|
||||||
class PreEncodeProxy : public rtc::VideoSinkInterface<VideoFrame> {
|
class PreEncodeProxy : public rtc::VideoSinkInterface<VideoFrame> {
|
||||||
@ -1000,7 +986,6 @@ class VideoAnalyzer : public PacketReceiver,
|
|||||||
const int selected_sl_;
|
const int selected_sl_;
|
||||||
const int selected_tl_;
|
const int selected_tl_;
|
||||||
PreEncodeProxy pre_encode_proxy_;
|
PreEncodeProxy pre_encode_proxy_;
|
||||||
OnEncodeTimingProxy encode_timing_proxy_;
|
|
||||||
std::vector<Sample> samples_ RTC_GUARDED_BY(comparison_lock_);
|
std::vector<Sample> samples_ RTC_GUARDED_BY(comparison_lock_);
|
||||||
test::Statistics sender_time_ RTC_GUARDED_BY(comparison_lock_);
|
test::Statistics sender_time_ RTC_GUARDED_BY(comparison_lock_);
|
||||||
test::Statistics receiver_time_ RTC_GUARDED_BY(comparison_lock_);
|
test::Statistics receiver_time_ RTC_GUARDED_BY(comparison_lock_);
|
||||||
@ -2007,8 +1992,7 @@ void VideoQualityTest::RunWithAnalyzer(const Params& params) {
|
|||||||
analyzer.get();
|
analyzer.get();
|
||||||
video_send_configs_[0].pre_encode_callback = analyzer->pre_encode_proxy();
|
video_send_configs_[0].pre_encode_callback = analyzer->pre_encode_proxy();
|
||||||
RTC_DCHECK(!video_send_configs_[0].post_encode_callback);
|
RTC_DCHECK(!video_send_configs_[0].post_encode_callback);
|
||||||
video_send_configs_[0].post_encode_callback =
|
video_send_configs_[0].post_encode_callback = analyzer.get();
|
||||||
analyzer->encode_timing_proxy();
|
|
||||||
|
|
||||||
CreateFlexfecStreams();
|
CreateFlexfecStreams();
|
||||||
CreateVideoStreams();
|
CreateVideoStreams();
|
||||||
|
|||||||
@ -324,11 +324,6 @@ EncodedImageCallback::Result VideoReceiveStream::OnEncodedImage(
|
|||||||
if (codec_specific_info->codecType == kVideoCodecVP8) {
|
if (codec_specific_info->codecType == kVideoCodecVP8) {
|
||||||
simulcast_idx = codec_specific_info->codecSpecific.VP8.simulcastIdx;
|
simulcast_idx = codec_specific_info->codecSpecific.VP8.simulcastIdx;
|
||||||
}
|
}
|
||||||
if (config_.pre_decode_callback) {
|
|
||||||
config_.pre_decode_callback->EncodedFrameCallback(EncodedFrame(
|
|
||||||
encoded_image._buffer, encoded_image._length, encoded_image._frameType,
|
|
||||||
simulcast_idx, encoded_image._timeStamp));
|
|
||||||
}
|
|
||||||
{
|
{
|
||||||
rtc::CritScope lock(&ivf_writer_lock_);
|
rtc::CritScope lock(&ivf_writer_lock_);
|
||||||
if (ivf_writer_.get()) {
|
if (ivf_writer_.get()) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user