 Chromium Code Reviews
 Chromium Code Reviews Issue 2911193002:
  Implement timing frames.  (Closed)
    
  
    Issue 2911193002:
  Implement timing frames.  (Closed) 
  | Index: webrtc/modules/video_coding/codecs/h264/h264_encoder_impl.cc | 
| diff --git a/webrtc/modules/video_coding/codecs/h264/h264_encoder_impl.cc b/webrtc/modules/video_coding/codecs/h264/h264_encoder_impl.cc | 
| index 1a10ddfa62272d5d354c0f8866f772999f99218e..c47ac2eb40b8604f876f62017dc5d0df622f6fa2 100644 | 
| --- a/webrtc/modules/video_coding/codecs/h264/h264_encoder_impl.cc | 
| +++ b/webrtc/modules/video_coding/codecs/h264/h264_encoder_impl.cc | 
| @@ -21,8 +21,8 @@ | 
| #include "webrtc/base/checks.h" | 
| #include "webrtc/base/logging.h" | 
| +#include "webrtc/base/timeutils.h" | 
| #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" | 
| -#include "webrtc/media/base/mediaconstants.h" | 
| #include "webrtc/system_wrappers/include/metrics.h" | 
| namespace webrtc { | 
| @@ -167,7 +167,10 @@ H264EncoderImpl::H264EncoderImpl(const cricket::VideoCodec& codec) | 
| number_of_cores_(0), | 
| encoded_image_callback_(nullptr), | 
| has_reported_init_(false), | 
| - has_reported_error_(false) { | 
| + has_reported_error_(false), | 
| + last_timing_frame_time_ms_(0), | 
| 
sprang_webrtc
2017/05/31 11:12:55
Probably a good idea to use -1 as uninitialized va
 
ilnik
2017/05/31 15:17:45
Done.
 | 
| + timing_frames_delay_ms_(0), | 
| + min_frame_size_to_force_timing_frame_bytes_(0) { | 
| RTC_CHECK(cricket::CodecNamesEq(codec.name, cricket::kH264CodecName)); | 
| std::string packetization_mode_string; | 
| if (codec.GetParam(cricket::kH264FmtpPacketizationMode, | 
| @@ -231,6 +234,9 @@ int32_t H264EncoderImpl::InitEncode(const VideoCodec* codec_settings, | 
| frame_dropping_on_ = codec_settings->H264().frameDroppingOn; | 
| key_frame_interval_ = codec_settings->H264().keyFrameInterval; | 
| max_payload_size_ = max_payload_size; | 
| + min_frame_size_to_force_timing_frame_bytes_ = | 
| + codec_settings->minFrameSizeToForceTimingFrameBytes; | 
| + timing_frames_delay_ms_ = codec_settings->timingFramesDelayMs; | 
| // Codec_settings uses kbits/second; encoder uses bits/second. | 
| max_bps_ = codec_settings->maxBitrate * 1000; | 
| @@ -308,6 +314,7 @@ int32_t H264EncoderImpl::Encode(const VideoFrame& input_frame, | 
| ReportError(); | 
| return WEBRTC_VIDEO_CODEC_UNINITIALIZED; | 
| } | 
| + int64_t encode_start_ms = rtc::TimeMillis(); | 
| if (!encoded_image_callback_) { | 
| LOG(LS_WARNING) << "InitEncode() has been called, but a callback function " | 
| << "has not been set with RegisterEncodeCompleteCallback()"; | 
| @@ -385,6 +392,25 @@ int32_t H264EncoderImpl::Encode(const VideoFrame& input_frame, | 
| encoded_image_._length); | 
| h264_bitstream_parser_.GetLastSliceQp(&encoded_image_.qp_); | 
| + // Add timing information if needed. Timing delay is counted based on | 
| + // capture time to ensure that simulcast encoders will mark frames on all | 
| + // the streams together. | 
| + int64_t now_ms = rtc::TimeMillis(); | 
| + bool is_time_for_timing_frame = | 
| + encoded_image_.capture_time_ms_ - last_timing_frame_time_ms_ >= | 
| + timing_frames_delay_ms_; | 
| + if (is_time_for_timing_frame) { | 
| + last_timing_frame_time_ms_ = encoded_image_.capture_time_ms_; | 
| + } | 
| + if (is_time_for_timing_frame || | 
| + encoded_image_._length >= min_frame_size_to_force_timing_frame_bytes_) { | 
| + encoded_image_.timing_.is_timing_frame = true; | 
| + encoded_image_.timing_.encode_start_ms = encode_start_ms; | 
| + encoded_image_.timing_.encode_finish_ms = now_ms; | 
| + } else { | 
| + encoded_image_.timing_.is_timing_frame = false; | 
| + } | 
| + | 
| 
sprang_webrtc
2017/05/31 11:12:55
I'm not sure you need to do this on a per codec le
 
ilnik
2017/05/31 15:17:45
Firstly, it will be very troublesome to update VCM
 
sprang_webrtc
2017/06/05 14:39:20
You can always start by having a simple method dec
 
ilnik
2017/06/07 14:25:03
Done.
 | 
| // Deliver encoded image. | 
| CodecSpecificInfo codec_specific; | 
| codec_specific.codecType = kVideoCodecH264; |