OLD | NEW |
1 /* | 1 /* |
2 * libjingle | 2 * libjingle |
3 * Copyright 2013 Google Inc. | 3 * Copyright 2013 Google Inc. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions are met: | 6 * modification, are permitted provided that the following conditions are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright notice, | 8 * 1. Redistributions of source code must retain the above copyright notice, |
9 * this list of conditions and the following disclaimer. | 9 * this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright notice, | 10 * 2. Redistributions in binary form must reproduce the above copyright notice, |
(...skipping 745 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
756 class JavaVideoRendererWrapper : public VideoRendererInterface { | 756 class JavaVideoRendererWrapper : public VideoRendererInterface { |
757 public: | 757 public: |
758 JavaVideoRendererWrapper(JNIEnv* jni, jobject j_callbacks) | 758 JavaVideoRendererWrapper(JNIEnv* jni, jobject j_callbacks) |
759 : j_callbacks_(jni, j_callbacks), | 759 : j_callbacks_(jni, j_callbacks), |
760 j_render_frame_id_(GetMethodID( | 760 j_render_frame_id_(GetMethodID( |
761 jni, GetObjectClass(jni, j_callbacks), "renderFrame", | 761 jni, GetObjectClass(jni, j_callbacks), "renderFrame", |
762 "(Lorg/webrtc/VideoRenderer$I420Frame;)V")), | 762 "(Lorg/webrtc/VideoRenderer$I420Frame;)V")), |
763 j_frame_class_(jni, | 763 j_frame_class_(jni, |
764 FindClass(jni, "org/webrtc/VideoRenderer$I420Frame")), | 764 FindClass(jni, "org/webrtc/VideoRenderer$I420Frame")), |
765 j_i420_frame_ctor_id_(GetMethodID( | 765 j_i420_frame_ctor_id_(GetMethodID( |
766 jni, *j_frame_class_, "<init>", "(III[I[Ljava/nio/ByteBuffer;)V")), | 766 jni, *j_frame_class_, "<init>", "(III[I[Ljava/nio/ByteBuffer;J)V")), |
767 j_texture_frame_ctor_id_(GetMethodID( | 767 j_texture_frame_ctor_id_(GetMethodID( |
768 jni, *j_frame_class_, "<init>", | 768 jni, *j_frame_class_, "<init>", |
769 "(IIILjava/lang/Object;I)V")), | 769 "(IIILjava/lang/Object;IJ)V")), |
770 j_byte_buffer_class_(jni, FindClass(jni, "java/nio/ByteBuffer")) { | 770 j_byte_buffer_class_(jni, FindClass(jni, "java/nio/ByteBuffer")) { |
771 CHECK_EXCEPTION(jni); | 771 CHECK_EXCEPTION(jni); |
772 } | 772 } |
773 | 773 |
774 virtual ~JavaVideoRendererWrapper() {} | 774 virtual ~JavaVideoRendererWrapper() {} |
775 | 775 |
776 void RenderFrame(const cricket::VideoFrame* video_frame) override { | 776 void RenderFrame(const cricket::VideoFrame* video_frame) override { |
777 ScopedLocalRefFrame local_ref_frame(jni()); | 777 ScopedLocalRefFrame local_ref_frame(jni()); |
| 778 // Make a shallow copy. |j_callbacks_| is responsible for releasing the |
| 779 // copy by calling VideoRenderer.renderFrameDone(). |
| 780 video_frame = video_frame->Copy(); |
778 jobject j_frame = (video_frame->GetNativeHandle() != nullptr) | 781 jobject j_frame = (video_frame->GetNativeHandle() != nullptr) |
779 ? CricketToJavaTextureFrame(video_frame) | 782 ? CricketToJavaTextureFrame(video_frame) |
780 : CricketToJavaI420Frame(video_frame); | 783 : CricketToJavaI420Frame(video_frame); |
781 jni()->CallVoidMethod(*j_callbacks_, j_render_frame_id_, j_frame); | 784 jni()->CallVoidMethod(*j_callbacks_, j_render_frame_id_, j_frame); |
782 CHECK_EXCEPTION(jni()); | 785 CHECK_EXCEPTION(jni()); |
783 } | 786 } |
784 | 787 |
785 // TODO(guoweis): Report that rotation is supported as RenderFrame calls | 788 // TODO(guoweis): Report that rotation is supported as RenderFrame calls |
786 // GetCopyWithRotationApplied. | 789 // GetCopyWithRotationApplied. |
787 virtual bool CanApplyRotation() override { return true; } | 790 virtual bool CanApplyRotation() override { return true; } |
(...skipping 15 matching lines...) Expand all Loading... |
803 const_cast<uint8*>(frame->GetUPlane()), frame->GetChromaSize()); | 806 const_cast<uint8*>(frame->GetUPlane()), frame->GetChromaSize()); |
804 jobject v_buffer = jni()->NewDirectByteBuffer( | 807 jobject v_buffer = jni()->NewDirectByteBuffer( |
805 const_cast<uint8*>(frame->GetVPlane()), frame->GetChromaSize()); | 808 const_cast<uint8*>(frame->GetVPlane()), frame->GetChromaSize()); |
806 jni()->SetObjectArrayElement(planes, 0, y_buffer); | 809 jni()->SetObjectArrayElement(planes, 0, y_buffer); |
807 jni()->SetObjectArrayElement(planes, 1, u_buffer); | 810 jni()->SetObjectArrayElement(planes, 1, u_buffer); |
808 jni()->SetObjectArrayElement(planes, 2, v_buffer); | 811 jni()->SetObjectArrayElement(planes, 2, v_buffer); |
809 return jni()->NewObject( | 812 return jni()->NewObject( |
810 *j_frame_class_, j_i420_frame_ctor_id_, | 813 *j_frame_class_, j_i420_frame_ctor_id_, |
811 frame->GetWidth(), frame->GetHeight(), | 814 frame->GetWidth(), frame->GetHeight(), |
812 static_cast<int>(frame->GetVideoRotation()), | 815 static_cast<int>(frame->GetVideoRotation()), |
813 strides, planes); | 816 strides, planes, frame); |
814 } | 817 } |
815 | 818 |
816 // Return a VideoRenderer.I420Frame referring texture object in |frame|. | 819 // Return a VideoRenderer.I420Frame referring texture object in |frame|. |
817 jobject CricketToJavaTextureFrame(const cricket::VideoFrame* frame) { | 820 jobject CricketToJavaTextureFrame(const cricket::VideoFrame* frame) { |
818 NativeHandleImpl* handle = | 821 NativeHandleImpl* handle = |
819 reinterpret_cast<NativeHandleImpl*>(frame->GetNativeHandle()); | 822 reinterpret_cast<NativeHandleImpl*>(frame->GetNativeHandle()); |
820 jobject texture_object = reinterpret_cast<jobject>(handle->GetHandle()); | 823 jobject texture_object = reinterpret_cast<jobject>(handle->GetHandle()); |
821 int texture_id = handle->GetTextureId(); | 824 int texture_id = handle->GetTextureId(); |
822 return jni()->NewObject( | 825 return jni()->NewObject( |
823 *j_frame_class_, j_texture_frame_ctor_id_, | 826 *j_frame_class_, j_texture_frame_ctor_id_, |
824 frame->GetWidth(), frame->GetHeight(), | 827 frame->GetWidth(), frame->GetHeight(), |
825 static_cast<int>(frame->GetVideoRotation()), | 828 static_cast<int>(frame->GetVideoRotation()), |
826 texture_object, texture_id); | 829 texture_object, texture_id, frame); |
827 } | 830 } |
828 | 831 |
829 JNIEnv* jni() { | 832 JNIEnv* jni() { |
830 return AttachCurrentThreadIfNeeded(); | 833 return AttachCurrentThreadIfNeeded(); |
831 } | 834 } |
832 | 835 |
833 ScopedGlobalRef<jobject> j_callbacks_; | 836 ScopedGlobalRef<jobject> j_callbacks_; |
834 jmethodID j_render_frame_id_; | 837 jmethodID j_render_frame_id_; |
835 ScopedGlobalRef<jclass> j_frame_class_; | 838 ScopedGlobalRef<jclass> j_frame_class_; |
836 jmethodID j_i420_frame_ctor_id_; | 839 jmethodID j_i420_frame_ctor_id_; |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
937 } | 940 } |
938 | 941 |
939 JOW(void, VideoRenderer_freeGuiVideoRenderer)(JNIEnv*, jclass, jlong j_p) { | 942 JOW(void, VideoRenderer_freeGuiVideoRenderer)(JNIEnv*, jclass, jlong j_p) { |
940 delete reinterpret_cast<VideoRendererWrapper*>(j_p); | 943 delete reinterpret_cast<VideoRendererWrapper*>(j_p); |
941 } | 944 } |
942 | 945 |
943 JOW(void, VideoRenderer_freeWrappedVideoRenderer)(JNIEnv*, jclass, jlong j_p) { | 946 JOW(void, VideoRenderer_freeWrappedVideoRenderer)(JNIEnv*, jclass, jlong j_p) { |
944 delete reinterpret_cast<JavaVideoRendererWrapper*>(j_p); | 947 delete reinterpret_cast<JavaVideoRendererWrapper*>(j_p); |
945 } | 948 } |
946 | 949 |
| 950 JOW(void, VideoRenderer_releaseNativeFrame)( |
| 951 JNIEnv* jni, jclass, jlong j_frame_ptr) { |
| 952 delete reinterpret_cast<const cricket::VideoFrame*>(j_frame_ptr); |
| 953 } |
| 954 |
947 JOW(void, MediaStreamTrack_free)(JNIEnv*, jclass, jlong j_p) { | 955 JOW(void, MediaStreamTrack_free)(JNIEnv*, jclass, jlong j_p) { |
948 CHECK_RELEASE(reinterpret_cast<MediaStreamTrackInterface*>(j_p)); | 956 CHECK_RELEASE(reinterpret_cast<MediaStreamTrackInterface*>(j_p)); |
949 } | 957 } |
950 | 958 |
951 JOW(jboolean, MediaStream_nativeAddAudioTrack)( | 959 JOW(jboolean, MediaStream_nativeAddAudioTrack)( |
952 JNIEnv* jni, jclass, jlong pointer, jlong j_audio_track_pointer) { | 960 JNIEnv* jni, jclass, jlong pointer, jlong j_audio_track_pointer) { |
953 return reinterpret_cast<MediaStreamInterface*>(pointer)->AddTrack( | 961 return reinterpret_cast<MediaStreamInterface*>(pointer)->AddTrack( |
954 reinterpret_cast<AudioTrackInterface*>(j_audio_track_pointer)); | 962 reinterpret_cast<AudioTrackInterface*>(j_audio_track_pointer)); |
955 } | 963 } |
956 | 964 |
(...skipping 740 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1697 } | 1705 } |
1698 | 1706 |
1699 JOW(void, VideoTrack_nativeRemoveRenderer)( | 1707 JOW(void, VideoTrack_nativeRemoveRenderer)( |
1700 JNIEnv* jni, jclass, | 1708 JNIEnv* jni, jclass, |
1701 jlong j_video_track_pointer, jlong j_renderer_pointer) { | 1709 jlong j_video_track_pointer, jlong j_renderer_pointer) { |
1702 reinterpret_cast<VideoTrackInterface*>(j_video_track_pointer)->RemoveRenderer( | 1710 reinterpret_cast<VideoTrackInterface*>(j_video_track_pointer)->RemoveRenderer( |
1703 reinterpret_cast<VideoRendererInterface*>(j_renderer_pointer)); | 1711 reinterpret_cast<VideoRendererInterface*>(j_renderer_pointer)); |
1704 } | 1712 } |
1705 | 1713 |
1706 } // namespace webrtc_jni | 1714 } // namespace webrtc_jni |
OLD | NEW |