From c85990cadd2361bc534af0ef200bbe51acb0af95 Mon Sep 17 00:00:00 2001 From: Artem Titov Date: Mon, 3 Aug 2020 19:30:19 +0000 Subject: [PATCH] Revert "Stop using RTPFragmentationHeader in sdk/android as unneeded" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 0d000c0530fcd8b0c0b0b46d60d5b39878fdef6f. Reason for revert: CL that added API with 2 params callback was reverter: https://webrtc-review.googlesource.com/c/src/+/180821 Original change's description: > Stop using RTPFragmentationHeader in sdk/android as unneeded > > Bug: webrtc:6471 > Change-Id: I81bbea4b7fd6e0325791456bb521e9dd0a64487d > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/180806 > Reviewed-by: Sami Kalliomäki > Commit-Queue: Danil Chapovalov > Cr-Commit-Position: refs/heads/master@{#31836} TBR=danilchap@webrtc.org,sakal@webrtc.org Change-Id: I15809f663fd365ab11c0667e3705314fdbb38024 No-Presubmit: true No-Tree-Checks: true No-Try: true Bug: webrtc:6471 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/180822 Reviewed-by: Artem Titov Cr-Commit-Position: refs/heads/master@{#31840} --- sdk/android/src/jni/video_encoder_wrapper.cc | 33 ++++++++++++++++++-- sdk/android/src/jni/video_encoder_wrapper.h | 2 ++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/sdk/android/src/jni/video_encoder_wrapper.cc b/sdk/android/src/jni/video_encoder_wrapper.cc index c12f5cff52..1b34e99dce 100644 --- a/sdk/android/src/jni/video_encoder_wrapper.cc +++ b/sdk/android/src/jni/video_encoder_wrapper.cc @@ -254,12 +254,13 @@ void VideoEncoderWrapper::OnEncodedFrame( frame_copy.SetTimestamp(frame_extra_info.timestamp_rtp); frame_copy.capture_time_ms_ = capture_time_ns / rtc::kNumNanosecsPerMillisec; + RTPFragmentationHeader header = ParseFragmentationHeader(frame); if (frame_copy.qp_ < 0) frame_copy.qp_ = ParseQp(frame); CodecSpecificInfo info(ParseCodecSpecificInfo(frame)); - callback_->OnEncodedImage(frame_copy, &info); + callback_->OnEncodedImage(frame_copy, &info, &header); } int32_t VideoEncoderWrapper::HandleReturnCode(JNIEnv* jni, @@ -288,6 +289,35 @@ int32_t VideoEncoderWrapper::HandleReturnCode(JNIEnv* jni, return WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE; } +RTPFragmentationHeader VideoEncoderWrapper::ParseFragmentationHeader( + rtc::ArrayView buffer) { + RTPFragmentationHeader header; + if (codec_settings_.codecType == kVideoCodecH264) { + h264_bitstream_parser_.ParseBitstream(buffer.data(), buffer.size()); + + // For H.264 search for start codes. + const std::vector nalu_idxs = + H264::FindNaluIndices(buffer.data(), buffer.size()); + if (nalu_idxs.empty()) { + RTC_LOG(LS_ERROR) << "Start code is not found!"; + RTC_LOG(LS_ERROR) << "Data:" << buffer[0] << " " << buffer[1] << " " + << buffer[2] << " " << buffer[3] << " " << buffer[4] + << " " << buffer[5]; + } + header.VerifyAndAllocateFragmentationHeader(nalu_idxs.size()); + for (size_t i = 0; i < nalu_idxs.size(); i++) { + header.fragmentationOffset[i] = nalu_idxs[i].payload_start_offset; + header.fragmentationLength[i] = nalu_idxs[i].payload_size; + } + } else { + // Generate a header describing a single fragment. + header.VerifyAndAllocateFragmentationHeader(1); + header.fragmentationOffset[0] = 0; + header.fragmentationLength[0] = buffer.size(); + } + return header; +} + int VideoEncoderWrapper::ParseQp(rtc::ArrayView buffer) { int qp; bool success; @@ -299,7 +329,6 @@ int VideoEncoderWrapper::ParseQp(rtc::ArrayView buffer) { success = vp9::GetQp(buffer.data(), buffer.size(), &qp); break; case kVideoCodecH264: - h264_bitstream_parser_.ParseBitstream(buffer.data(), buffer.size()); success = h264_bitstream_parser_.GetLastSliceQp(&qp); break; default: // Default is to not provide QP. diff --git a/sdk/android/src/jni/video_encoder_wrapper.h b/sdk/android/src/jni/video_encoder_wrapper.h index cee3a609a3..0e9d37bf23 100644 --- a/sdk/android/src/jni/video_encoder_wrapper.h +++ b/sdk/android/src/jni/video_encoder_wrapper.h @@ -67,6 +67,8 @@ class VideoEncoderWrapper : public VideoEncoder { const JavaRef& j_value, const char* method_name); + RTPFragmentationHeader ParseFragmentationHeader( + rtc::ArrayView buffer); int ParseQp(rtc::ArrayView buffer); CodecSpecificInfo ParseCodecSpecificInfo(const EncodedImage& frame); ScopedJavaLocalRef ToJavaBitrateAllocation(