| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2015 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 235 int current_encoding_time_ms_; // Overall encoding time in the current second | 235 int current_encoding_time_ms_; // Overall encoding time in the current second |
| 236 int64_t last_input_timestamp_ms_; // Timestamp of last received yuv frame. | 236 int64_t last_input_timestamp_ms_; // Timestamp of last received yuv frame. |
| 237 int64_t last_output_timestamp_ms_; // Timestamp of last encoded frame. | 237 int64_t last_output_timestamp_ms_; // Timestamp of last encoded frame. |
| 238 // Holds the task while the polling loop is paused. | 238 // Holds the task while the polling loop is paused. |
| 239 std::unique_ptr<rtc::QueuedTask> encode_task_; | 239 std::unique_ptr<rtc::QueuedTask> encode_task_; |
| 240 | 240 |
| 241 struct InputFrameInfo { | 241 struct InputFrameInfo { |
| 242 InputFrameInfo(int64_t encode_start_time, | 242 InputFrameInfo(int64_t encode_start_time, |
| 243 int32_t frame_timestamp, | 243 int32_t frame_timestamp, |
| 244 int64_t frame_render_time_ms, | 244 int64_t frame_render_time_ms, |
| 245 webrtc::VideoRotation rotation) | 245 webrtc::VideoRotation rotation, |
| 246 webrtc::VideoContentTypeId content_type) |
| 246 : encode_start_time(encode_start_time), | 247 : encode_start_time(encode_start_time), |
| 247 frame_timestamp(frame_timestamp), | 248 frame_timestamp(frame_timestamp), |
| 248 frame_render_time_ms(frame_render_time_ms), | 249 frame_render_time_ms(frame_render_time_ms), |
| 249 rotation(rotation) {} | 250 rotation(rotation), |
| 251 content_type(content_type) {} |
| 250 // Time when video frame is sent to encoder input. | 252 // Time when video frame is sent to encoder input. |
| 251 const int64_t encode_start_time; | 253 const int64_t encode_start_time; |
| 252 | 254 |
| 253 // Input frame information. | 255 // Input frame information. |
| 254 const int32_t frame_timestamp; | 256 const int32_t frame_timestamp; |
| 255 const int64_t frame_render_time_ms; | 257 const int64_t frame_render_time_ms; |
| 256 const webrtc::VideoRotation rotation; | 258 const webrtc::VideoRotation rotation; |
| 259 const webrtc::VideoContentTypeId content_type; |
| 257 }; | 260 }; |
| 258 std::list<InputFrameInfo> input_frame_infos_; | 261 std::list<InputFrameInfo> input_frame_infos_; |
| 259 int32_t output_timestamp_; // Last output frame timestamp from | 262 int32_t output_timestamp_; // Last output frame timestamp from |
| 260 // |input_frame_infos_|. | 263 // |input_frame_infos_|. |
| 261 int64_t output_render_time_ms_; // Last output frame render time from | 264 int64_t output_render_time_ms_; // Last output frame render time from |
| 262 // |input_frame_infos_|. | 265 // |input_frame_infos_|. |
| 263 webrtc::VideoRotation output_rotation_; // Last output frame rotation from | 266 webrtc::VideoRotation output_rotation_; // Last output frame rotation from |
| 264 // |input_frame_infos_|. | 267 // |input_frame_infos_|. |
| 268 webrtc::VideoContentTypeId output_content_type_; |
| 265 // Frame size in bytes fed to MediaCodec. | 269 // Frame size in bytes fed to MediaCodec. |
| 266 int yuv_size_; | 270 int yuv_size_; |
| 267 // True only when between a callback_->OnEncodedImage() call return a positive | 271 // True only when between a callback_->OnEncodedImage() call return a positive |
| 268 // value and the next Encode() call being ignored. | 272 // value and the next Encode() call being ignored. |
| 269 bool drop_next_input_frame_; | 273 bool drop_next_input_frame_; |
| 270 bool scale_; | 274 bool scale_; |
| 271 // Global references; must be deleted in Release(). | 275 // Global references; must be deleted in Release(). |
| 272 std::vector<jobject> input_buffers_; | 276 std::vector<jobject> input_buffers_; |
| 273 webrtc::H264BitstreamParser h264_bitstream_parser_; | 277 webrtc::H264BitstreamParser h264_bitstream_parser_; |
| 274 | 278 |
| (...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 702 } | 706 } |
| 703 frames_dropped_media_encoder_++; | 707 frames_dropped_media_encoder_++; |
| 704 return WEBRTC_VIDEO_CODEC_OK; | 708 return WEBRTC_VIDEO_CODEC_OK; |
| 705 } | 709 } |
| 706 consecutive_full_queue_frame_drops_ = 0; | 710 consecutive_full_queue_frame_drops_ = 0; |
| 707 | 711 |
| 708 rtc::scoped_refptr<webrtc::VideoFrameBuffer> input_buffer( | 712 rtc::scoped_refptr<webrtc::VideoFrameBuffer> input_buffer( |
| 709 frame.video_frame_buffer()); | 713 frame.video_frame_buffer()); |
| 710 | 714 |
| 711 VideoFrame input_frame(input_buffer, frame.timestamp(), | 715 VideoFrame input_frame(input_buffer, frame.timestamp(), |
| 712 frame.render_time_ms(), frame.rotation()); | 716 frame.render_time_ms(), frame.rotation(), |
| 717 frame.content_type()); |
| 713 | 718 |
| 714 if (!MaybeReconfigureEncoder(input_frame)) { | 719 if (!MaybeReconfigureEncoder(input_frame)) { |
| 715 ALOGE << "Failed to reconfigure encoder."; | 720 ALOGE << "Failed to reconfigure encoder."; |
| 716 return WEBRTC_VIDEO_CODEC_ERROR; | 721 return WEBRTC_VIDEO_CODEC_ERROR; |
| 717 } | 722 } |
| 718 | 723 |
| 719 const bool key_frame = | 724 const bool key_frame = |
| 720 frame_types->front() != webrtc::kVideoFrameDelta || send_key_frame; | 725 frame_types->front() != webrtc::kVideoFrameDelta || send_key_frame; |
| 721 bool encode_status = true; | 726 bool encode_status = true; |
| 722 if (!input_frame.video_frame_buffer()->native_handle()) { | 727 if (!input_frame.video_frame_buffer()->native_handle()) { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 749 } | 754 } |
| 750 | 755 |
| 751 if (!encode_status) { | 756 if (!encode_status) { |
| 752 ALOGE << "Failed encode frame with timestamp: " << input_frame.timestamp(); | 757 ALOGE << "Failed encode frame with timestamp: " << input_frame.timestamp(); |
| 753 return ProcessHWErrorOnEncode(); | 758 return ProcessHWErrorOnEncode(); |
| 754 } | 759 } |
| 755 | 760 |
| 756 // Save input image timestamps for later output. | 761 // Save input image timestamps for later output. |
| 757 input_frame_infos_.emplace_back(frame_input_time_ms, input_frame.timestamp(), | 762 input_frame_infos_.emplace_back(frame_input_time_ms, input_frame.timestamp(), |
| 758 input_frame.render_time_ms(), | 763 input_frame.render_time_ms(), |
| 759 input_frame.rotation()); | 764 input_frame.rotation(), |
| 765 input_frame.content_type()); |
| 760 | 766 |
| 761 last_input_timestamp_ms_ = | 767 last_input_timestamp_ms_ = |
| 762 current_timestamp_us_ / rtc::kNumMicrosecsPerMillisec; | 768 current_timestamp_us_ / rtc::kNumMicrosecsPerMillisec; |
| 763 | 769 |
| 764 current_timestamp_us_ += rtc::kNumMicrosecsPerSec / last_set_fps_; | 770 current_timestamp_us_ += rtc::kNumMicrosecsPerSec / last_set_fps_; |
| 765 | 771 |
| 766 // Start the polling loop if it is not started. | 772 // Start the polling loop if it is not started. |
| 767 if (encode_task_) { | 773 if (encode_task_) { |
| 768 rtc::TaskQueue::Current()->PostDelayedTask(std::move(encode_task_), | 774 rtc::TaskQueue::Current()->PostDelayedTask(std::move(encode_task_), |
| 769 kMediaCodecPollMs); | 775 kMediaCodecPollMs); |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1000 int64_t encoding_start_time_ms = 0; | 1006 int64_t encoding_start_time_ms = 0; |
| 1001 int64_t frame_encoding_time_ms = 0; | 1007 int64_t frame_encoding_time_ms = 0; |
| 1002 last_output_timestamp_ms_ = | 1008 last_output_timestamp_ms_ = |
| 1003 GetOutputBufferInfoPresentationTimestampUs(jni, j_output_buffer_info) / | 1009 GetOutputBufferInfoPresentationTimestampUs(jni, j_output_buffer_info) / |
| 1004 rtc::kNumMicrosecsPerMillisec; | 1010 rtc::kNumMicrosecsPerMillisec; |
| 1005 if (!input_frame_infos_.empty()) { | 1011 if (!input_frame_infos_.empty()) { |
| 1006 const InputFrameInfo& frame_info = input_frame_infos_.front(); | 1012 const InputFrameInfo& frame_info = input_frame_infos_.front(); |
| 1007 output_timestamp_ = frame_info.frame_timestamp; | 1013 output_timestamp_ = frame_info.frame_timestamp; |
| 1008 output_render_time_ms_ = frame_info.frame_render_time_ms; | 1014 output_render_time_ms_ = frame_info.frame_render_time_ms; |
| 1009 output_rotation_ = frame_info.rotation; | 1015 output_rotation_ = frame_info.rotation; |
| 1016 output_content_type_ = frame_info.content_type; |
| 1010 encoding_start_time_ms = frame_info.encode_start_time; | 1017 encoding_start_time_ms = frame_info.encode_start_time; |
| 1011 input_frame_infos_.pop_front(); | 1018 input_frame_infos_.pop_front(); |
| 1012 } | 1019 } |
| 1013 | 1020 |
| 1014 // Extract payload. | 1021 // Extract payload. |
| 1015 size_t payload_size = jni->GetDirectBufferCapacity(j_output_buffer); | 1022 size_t payload_size = jni->GetDirectBufferCapacity(j_output_buffer); |
| 1016 uint8_t* payload = reinterpret_cast<uint8_t*>( | 1023 uint8_t* payload = reinterpret_cast<uint8_t*>( |
| 1017 jni->GetDirectBufferAddress(j_output_buffer)); | 1024 jni->GetDirectBufferAddress(j_output_buffer)); |
| 1018 if (CheckException(jni)) { | 1025 if (CheckException(jni)) { |
| 1019 ALOGE << "Exception in get direct buffer address."; | 1026 ALOGE << "Exception in get direct buffer address."; |
| 1020 ProcessHWError(true /* reset_if_fallback_unavailable */); | 1027 ProcessHWError(true /* reset_if_fallback_unavailable */); |
| 1021 return WEBRTC_VIDEO_CODEC_ERROR; | 1028 return WEBRTC_VIDEO_CODEC_ERROR; |
| 1022 } | 1029 } |
| 1023 | 1030 |
| 1024 // Callback - return encoded frame. | 1031 // Callback - return encoded frame. |
| 1025 const VideoCodecType codec_type = | 1032 const VideoCodecType codec_type = |
| 1026 webrtc::PayloadNameToCodecType(codec_.name) | 1033 webrtc::PayloadNameToCodecType(codec_.name) |
| 1027 .value_or(webrtc::kVideoCodecUnknown); | 1034 .value_or(webrtc::kVideoCodecUnknown); |
| 1028 webrtc::EncodedImageCallback::Result callback_result( | 1035 webrtc::EncodedImageCallback::Result callback_result( |
| 1029 webrtc::EncodedImageCallback::Result::OK); | 1036 webrtc::EncodedImageCallback::Result::OK); |
| 1030 if (callback_) { | 1037 if (callback_) { |
| 1031 std::unique_ptr<webrtc::EncodedImage> image( | 1038 std::unique_ptr<webrtc::EncodedImage> image( |
| 1032 new webrtc::EncodedImage(payload, payload_size, payload_size)); | 1039 new webrtc::EncodedImage(payload, payload_size, payload_size)); |
| 1033 image->_encodedWidth = width_; | 1040 image->_encodedWidth = width_; |
| 1034 image->_encodedHeight = height_; | 1041 image->_encodedHeight = height_; |
| 1035 image->_timeStamp = output_timestamp_; | 1042 image->_timeStamp = output_timestamp_; |
| 1036 image->capture_time_ms_ = output_render_time_ms_; | 1043 image->capture_time_ms_ = output_render_time_ms_; |
| 1037 image->rotation_ = output_rotation_; | 1044 image->rotation_ = output_rotation_; |
| 1045 image->content_type_ = output_content_type_; |
| 1038 image->_frameType = | 1046 image->_frameType = |
| 1039 (key_frame ? webrtc::kVideoFrameKey : webrtc::kVideoFrameDelta); | 1047 (key_frame ? webrtc::kVideoFrameKey : webrtc::kVideoFrameDelta); |
| 1040 image->_completeFrame = true; | 1048 image->_completeFrame = true; |
| 1041 webrtc::CodecSpecificInfo info; | 1049 webrtc::CodecSpecificInfo info; |
| 1042 memset(&info, 0, sizeof(info)); | 1050 memset(&info, 0, sizeof(info)); |
| 1043 info.codecType = codec_type; | 1051 info.codecType = codec_type; |
| 1044 if (codec_type == kVideoCodecVP8) { | 1052 if (codec_type == kVideoCodecVP8) { |
| 1045 info.codecSpecific.VP8.pictureId = picture_id_; | 1053 info.codecSpecific.VP8.pictureId = picture_id_; |
| 1046 info.codecSpecific.VP8.nonReference = false; | 1054 info.codecSpecific.VP8.nonReference = false; |
| 1047 info.codecSpecific.VP8.simulcastIdx = 0; | 1055 info.codecSpecific.VP8.simulcastIdx = 0; |
| (...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1311 } | 1319 } |
| 1312 } | 1320 } |
| 1313 | 1321 |
| 1314 void MediaCodecVideoEncoderFactory::DestroyVideoEncoder( | 1322 void MediaCodecVideoEncoderFactory::DestroyVideoEncoder( |
| 1315 webrtc::VideoEncoder* encoder) { | 1323 webrtc::VideoEncoder* encoder) { |
| 1316 ALOGD << "Destroy video encoder."; | 1324 ALOGD << "Destroy video encoder."; |
| 1317 delete encoder; | 1325 delete encoder; |
| 1318 } | 1326 } |
| 1319 | 1327 |
| 1320 } // namespace webrtc_jni | 1328 } // namespace webrtc_jni |
| OLD | NEW |