From 2d60e53ad5dde01a9d2be29ba20f052f979c3491 Mon Sep 17 00:00:00 2001 From: magjed Date: Tue, 22 Nov 2016 08:42:06 -0800 Subject: [PATCH] H264 encoder: Include QP information in encoded images Set the |qp_| field in EncodedImage before calling OnEncodedImage. BUG=webrtc:6541 Review-Url: https://codereview.webrtc.org/2499003002 Cr-Commit-Position: refs/heads/master@{#15199} --- .../api/android/jni/androidmediaencoder_jni.cc | 1 + .../codecs/h264/h264_encoder_impl.cc | 16 +++++++++------- .../Classes/h264_video_toolbox_encoder.mm | 1 + 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/webrtc/api/android/jni/androidmediaencoder_jni.cc b/webrtc/api/android/jni/androidmediaencoder_jni.cc index d5998c032c..d0a293173e 100644 --- a/webrtc/api/android/jni/androidmediaencoder_jni.cc +++ b/webrtc/api/android/jni/androidmediaencoder_jni.cc @@ -1145,6 +1145,7 @@ bool MediaCodecVideoEncoder::DeliverPendingOutputs(JNIEnv* jni) { if (h264_bitstream_parser_.GetLastSliceQp(&qp)) { current_acc_qp_ += qp; quality_scaler_.ReportQP(qp); + image->qp_ = qp; } } // For H.264 search for start codes. 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 d411b18bf8..6012f073ca 100644 --- a/webrtc/modules/video_coding/codecs/h264/h264_encoder_impl.cc +++ b/webrtc/modules/video_coding/codecs/h264/h264_encoder_impl.cc @@ -384,18 +384,20 @@ int32_t H264EncoderImpl::Encode(const VideoFrame& input_frame, // Encoder can skip frames to save bandwidth in which case // |encoded_image_._length| == 0. if (encoded_image_._length > 0) { + // Parse and report QP. + h264_bitstream_parser_.ParseBitstream(encoded_image_._buffer, + encoded_image_._length); + int qp = -1; + if (h264_bitstream_parser_.GetLastSliceQp(&qp)) { + quality_scaler_.ReportQP(qp); + encoded_image_.qp_ = qp; + } + // Deliver encoded image. CodecSpecificInfo codec_specific; codec_specific.codecType = kVideoCodecH264; encoded_image_callback_->OnEncodedImage(encoded_image_, &codec_specific, &frag_header); - - // Parse and report QP. - h264_bitstream_parser_.ParseBitstream(encoded_image_._buffer, - encoded_image_._length); - int qp = -1; - if (h264_bitstream_parser_.GetLastSliceQp(&qp)) - quality_scaler_.ReportQP(qp); } else { quality_scaler_.ReportDroppedFrame(); } diff --git a/webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_encoder.mm b/webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_encoder.mm index 63939596f2..9f435b2e1a 100644 --- a/webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_encoder.mm +++ b/webrtc/sdk/objc/Framework/Classes/h264_video_toolbox_encoder.mm @@ -756,6 +756,7 @@ void H264VideoToolboxEncoder::OnEncodedFrame( if (h264_bitstream_parser_.GetLastSliceQp(&qp)) { rtc::CritScope lock(&quality_scaler_crit_); quality_scaler_.ReportQP(qp); + frame.qp_ = qp; } EncodedImageCallback::Result result =