Index: webrtc/sdk/android/src/jni/videoencoderwrapper.h |
diff --git a/webrtc/sdk/android/src/jni/videoencoderwrapper.h b/webrtc/sdk/android/src/jni/videoencoderwrapper.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..afda8d2731610886c7b261b6319b918f0c14665b |
--- /dev/null |
+++ b/webrtc/sdk/android/src/jni/videoencoderwrapper.h |
@@ -0,0 +1,148 @@ |
+/* |
+ * Copyright 2017 The WebRTC project authors. All Rights Reserved. |
+ * |
+ * Use of this source code is governed by a BSD-style license |
+ * that can be found in the LICENSE file in the root of the source |
+ * tree. An additional intellectual property rights grant can be found |
+ * in the file PATENTS. All contributing project authors may |
+ * be found in the AUTHORS file in the root of the source tree. |
+ */ |
+ |
+#ifndef WEBRTC_SDK_ANDROID_SRC_JNI_VIDEOENCODERWRAPPER_H_ |
+#define WEBRTC_SDK_ANDROID_SRC_JNI_VIDEOENCODERWRAPPER_H_ |
+ |
+#include <jni.h> |
+#include <deque> |
+#include <string> |
+#include <vector> |
+ |
+#include "webrtc/api/video_codecs/video_encoder.h" |
+#include "webrtc/common_video/h264/h264_bitstream_parser.h" |
+#include "webrtc/modules/video_coding/codecs/vp9/include/vp9_globals.h" |
+#include "webrtc/rtc_base/task_queue.h" |
+#include "webrtc/sdk/android/src/jni/jni_helpers.h" |
+#include "webrtc/sdk/android/src/jni/native_handle_impl.h" |
+ |
+namespace webrtc { |
+namespace jni { |
+ |
+// Wraps a Java decoder and delegates all calls to it. Passes |
+// VideoEncoderWrapperCallback to the decoder on InitDecode. Wraps the received |
+// frames to AndroidVideoBuffer. |
+class VideoEncoderWrapper : public VideoEncoder { |
+ public: |
+ VideoEncoderWrapper(JNIEnv* jni, jobject j_encoder); |
+ |
+ int32_t InitEncode(const VideoCodec* codec_settings, |
+ int32_t number_of_cores, |
+ size_t max_payload_size) override; |
+ |
+ int32_t RegisterEncodeCompleteCallback( |
+ EncodedImageCallback* callback) override; |
+ |
+ int32_t Release() override; |
+ |
+ int32_t Encode(const VideoFrame& frame, |
+ const CodecSpecificInfo* codec_specific_info, |
+ const std::vector<FrameType>* frame_types) override; |
+ |
+ int32_t SetChannelParameters(uint32_t packet_loss, int64_t rtt) override; |
+ |
+ int32_t SetRateAllocation(const BitrateAllocation& allocation, |
+ uint32_t framerate) override; |
+ |
+ ScalingSettings GetScalingSettings() const override; |
+ |
+ bool SupportsNativeHandle() const override { return true; } |
+ |
+ // Should only be called by JNI. |
+ void OnEncodedFrame(JNIEnv* jni, |
+ jobject j_buffer, |
+ jint encoded_width, |
+ jint encoded_height, |
+ jlong capture_time_ms, |
+ jint frame_type, |
+ jint rotation, |
+ jboolean complete_frame, |
+ jobject j_qp); |
+ |
+ const char* ImplementationName() const override; |
+ |
+ private: |
+ struct FrameExtraInfo { |
+ uint64_t capture_time_ns; // Used as an identifier of the frame. |
+ |
+ uint32_t timestamp_rtp; |
+ }; |
+ |
+ int32_t InitEncodeInternal(JNIEnv* jni); |
+ |
+ // Takes Java VideoCodecStatus, handles it and returns WEBRTC_VIDEO_CODEC_* |
+ // status code. |
+ int32_t HandleReturnCode(JNIEnv* jni, jobject code); |
+ |
+ RTPFragmentationHeader ParseFragmentationHeader( |
+ const std::vector<uint8_t>& buffer); |
+ int ParseQp(const std::vector<uint8_t>& buffer); |
+ CodecSpecificInfo ParseCodecSpecificInfo(const EncodedImage& frame); |
+ jobject ToJavaBitrateAllocation(JNIEnv* jni, |
+ const BitrateAllocation& allocation); |
+ std::string GetImplementationName(JNIEnv* jni) const; |
+ |
+ const ScopedGlobalRef<jobject> encoder_; |
+ const ScopedGlobalRef<jclass> settings_class_; |
+ const ScopedGlobalRef<jclass> encode_info_class_; |
+ const ScopedGlobalRef<jclass> frame_type_class_; |
+ const ScopedGlobalRef<jclass> bitrate_allocation_class_; |
+ const ScopedGlobalRef<jclass> int_array_class_; |
+ |
+ jmethodID init_encode_method_; |
+ jmethodID release_method_; |
+ jmethodID encode_method_; |
+ jmethodID set_channel_parameters_method_; |
+ jmethodID set_rate_allocation_method_; |
+ jmethodID get_scaling_settings_method_; |
+ jmethodID get_implementation_name_method_; |
+ |
+ jmethodID settings_constructor_; |
+ |
+ jmethodID encode_info_constructor_; |
+ |
+ jmethodID frame_type_from_native_method_; |
+ |
+ jmethodID bitrate_allocation_constructor_; |
+ |
+ jfieldID scaling_settings_on_field_; |
+ jfieldID scaling_settings_low_field_; |
+ jfieldID scaling_settings_high_field_; |
+ |
+ jmethodID get_number_method_; |
+ |
+ jmethodID int_value_method_; |
+ |
+ std::string implementation_name_; |
+ |
+ rtc::TaskQueue* encoder_queue_; |
+ JavaVideoFrameFactory video_frame_factory_; |
+ std::deque<FrameExtraInfo> frame_extra_infos_; |
+ EncodedImageCallback* callback_; |
+ bool initialized_; |
+ int num_resets_; |
+ int number_of_cores_; |
+ VideoCodec codec_settings_; |
+ H264BitstreamParser h264_bitstream_parser_; |
+ |
+ // RTP state. |
+ uint16_t picture_id_; |
+ uint8_t tl0_pic_idx_; |
+ |
+ // VP9 variables to populate codec specific structure. |
+ GofInfoVP9 gof_; // Contains each frame's temporal information for |
+ // non-flexible VP9 mode. |
+ size_t gof_idx_; |
+}; |
+ |
+} // namespace jni |
+} // namespace webrtc |
+ |
+#endif // WEBRTC_SDK_ANDROID_SRC_JNI_VIDEOENCODERWRAPPER_H_ |