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 725 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
736 class JavaVideoRendererWrapper : public VideoRendererInterface { | 736 class JavaVideoRendererWrapper : public VideoRendererInterface { |
737 public: | 737 public: |
738 JavaVideoRendererWrapper(JNIEnv* jni, jobject j_callbacks) | 738 JavaVideoRendererWrapper(JNIEnv* jni, jobject j_callbacks) |
739 : j_callbacks_(jni, j_callbacks), | 739 : j_callbacks_(jni, j_callbacks), |
740 j_render_frame_id_(GetMethodID( | 740 j_render_frame_id_(GetMethodID( |
741 jni, GetObjectClass(jni, j_callbacks), "renderFrame", | 741 jni, GetObjectClass(jni, j_callbacks), "renderFrame", |
742 "(Lorg/webrtc/VideoRenderer$I420Frame;)V")), | 742 "(Lorg/webrtc/VideoRenderer$I420Frame;)V")), |
743 j_frame_class_(jni, | 743 j_frame_class_(jni, |
744 FindClass(jni, "org/webrtc/VideoRenderer$I420Frame")), | 744 FindClass(jni, "org/webrtc/VideoRenderer$I420Frame")), |
745 j_i420_frame_ctor_id_(GetMethodID( | 745 j_i420_frame_ctor_id_(GetMethodID( |
746 jni, *j_frame_class_, "<init>", "(III[I[Ljava/nio/ByteBuffer;)V")), | 746 jni, *j_frame_class_, "<init>", "(III[I[Ljava/nio/ByteBuffer;J)V")), |
747 j_texture_frame_ctor_id_(GetMethodID( | 747 j_texture_frame_ctor_id_(GetMethodID( |
748 jni, *j_frame_class_, "<init>", | 748 jni, *j_frame_class_, "<init>", |
749 "(IIILjava/lang/Object;I)V")), | 749 "(IIILjava/lang/Object;IJ)V")), |
750 j_byte_buffer_class_(jni, FindClass(jni, "java/nio/ByteBuffer")) { | 750 j_byte_buffer_class_(jni, FindClass(jni, "java/nio/ByteBuffer")) { |
751 CHECK_EXCEPTION(jni); | 751 CHECK_EXCEPTION(jni); |
752 } | 752 } |
753 | 753 |
754 virtual ~JavaVideoRendererWrapper() {} | 754 virtual ~JavaVideoRendererWrapper() {} |
755 | 755 |
756 void RenderFrame(const cricket::VideoFrame* video_frame) override { | 756 void RenderFrame(const cricket::VideoFrame* video_frame) override { |
757 ScopedLocalRefFrame local_ref_frame(jni()); | 757 ScopedLocalRefFrame local_ref_frame(jni()); |
| 758 // Make a shallow copy. |j_callbacks_| is responsible for releasing the |
| 759 // copy by calling VideoRenderer.renderFrameDone(). |
| 760 video_frame = video_frame->Copy(); |
758 jobject j_frame = (video_frame->GetNativeHandle() != nullptr) | 761 jobject j_frame = (video_frame->GetNativeHandle() != nullptr) |
759 ? CricketToJavaTextureFrame(video_frame) | 762 ? CricketToJavaTextureFrame(video_frame) |
760 : CricketToJavaI420Frame(video_frame); | 763 : CricketToJavaI420Frame(video_frame); |
761 jni()->CallVoidMethod(*j_callbacks_, j_render_frame_id_, j_frame); | 764 jni()->CallVoidMethod(*j_callbacks_, j_render_frame_id_, j_frame); |
762 CHECK_EXCEPTION(jni()); | 765 CHECK_EXCEPTION(jni()); |
763 } | 766 } |
764 | 767 |
765 // TODO(guoweis): Report that rotation is supported as RenderFrame calls | 768 // TODO(guoweis): Report that rotation is supported as RenderFrame calls |
766 // GetCopyWithRotationApplied. | 769 // GetCopyWithRotationApplied. |
767 virtual bool CanApplyRotation() override { return true; } | 770 virtual bool CanApplyRotation() override { return true; } |
(...skipping 15 matching lines...) Expand all Loading... |
783 const_cast<uint8*>(frame->GetUPlane()), frame->GetChromaSize()); | 786 const_cast<uint8*>(frame->GetUPlane()), frame->GetChromaSize()); |
784 jobject v_buffer = jni()->NewDirectByteBuffer( | 787 jobject v_buffer = jni()->NewDirectByteBuffer( |
785 const_cast<uint8*>(frame->GetVPlane()), frame->GetChromaSize()); | 788 const_cast<uint8*>(frame->GetVPlane()), frame->GetChromaSize()); |
786 jni()->SetObjectArrayElement(planes, 0, y_buffer); | 789 jni()->SetObjectArrayElement(planes, 0, y_buffer); |
787 jni()->SetObjectArrayElement(planes, 1, u_buffer); | 790 jni()->SetObjectArrayElement(planes, 1, u_buffer); |
788 jni()->SetObjectArrayElement(planes, 2, v_buffer); | 791 jni()->SetObjectArrayElement(planes, 2, v_buffer); |
789 return jni()->NewObject( | 792 return jni()->NewObject( |
790 *j_frame_class_, j_i420_frame_ctor_id_, | 793 *j_frame_class_, j_i420_frame_ctor_id_, |
791 frame->GetWidth(), frame->GetHeight(), | 794 frame->GetWidth(), frame->GetHeight(), |
792 static_cast<int>(frame->GetVideoRotation()), | 795 static_cast<int>(frame->GetVideoRotation()), |
793 strides, planes); | 796 strides, planes, frame); |
794 } | 797 } |
795 | 798 |
796 // Return a VideoRenderer.I420Frame referring texture object in |frame|. | 799 // Return a VideoRenderer.I420Frame referring texture object in |frame|. |
797 jobject CricketToJavaTextureFrame(const cricket::VideoFrame* frame) { | 800 jobject CricketToJavaTextureFrame(const cricket::VideoFrame* frame) { |
798 NativeHandleImpl* handle = | 801 NativeHandleImpl* handle = |
799 reinterpret_cast<NativeHandleImpl*>(frame->GetNativeHandle()); | 802 reinterpret_cast<NativeHandleImpl*>(frame->GetNativeHandle()); |
800 jobject texture_object = reinterpret_cast<jobject>(handle->GetHandle()); | 803 jobject texture_object = reinterpret_cast<jobject>(handle->GetHandle()); |
801 int texture_id = handle->GetTextureId(); | 804 int texture_id = handle->GetTextureId(); |
802 return jni()->NewObject( | 805 return jni()->NewObject( |
803 *j_frame_class_, j_texture_frame_ctor_id_, | 806 *j_frame_class_, j_texture_frame_ctor_id_, |
804 frame->GetWidth(), frame->GetHeight(), | 807 frame->GetWidth(), frame->GetHeight(), |
805 static_cast<int>(frame->GetVideoRotation()), | 808 static_cast<int>(frame->GetVideoRotation()), |
806 texture_object, texture_id); | 809 texture_object, texture_id, frame); |
807 } | 810 } |
808 | 811 |
809 JNIEnv* jni() { | 812 JNIEnv* jni() { |
810 return AttachCurrentThreadIfNeeded(); | 813 return AttachCurrentThreadIfNeeded(); |
811 } | 814 } |
812 | 815 |
813 ScopedGlobalRef<jobject> j_callbacks_; | 816 ScopedGlobalRef<jobject> j_callbacks_; |
814 jmethodID j_render_frame_id_; | 817 jmethodID j_render_frame_id_; |
815 ScopedGlobalRef<jclass> j_frame_class_; | 818 ScopedGlobalRef<jclass> j_frame_class_; |
816 jmethodID j_i420_frame_ctor_id_; | 819 jmethodID j_i420_frame_ctor_id_; |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
917 } | 920 } |
918 | 921 |
919 JOW(void, VideoRenderer_freeGuiVideoRenderer)(JNIEnv*, jclass, jlong j_p) { | 922 JOW(void, VideoRenderer_freeGuiVideoRenderer)(JNIEnv*, jclass, jlong j_p) { |
920 delete reinterpret_cast<VideoRendererWrapper*>(j_p); | 923 delete reinterpret_cast<VideoRendererWrapper*>(j_p); |
921 } | 924 } |
922 | 925 |
923 JOW(void, VideoRenderer_freeWrappedVideoRenderer)(JNIEnv*, jclass, jlong j_p) { | 926 JOW(void, VideoRenderer_freeWrappedVideoRenderer)(JNIEnv*, jclass, jlong j_p) { |
924 delete reinterpret_cast<JavaVideoRendererWrapper*>(j_p); | 927 delete reinterpret_cast<JavaVideoRendererWrapper*>(j_p); |
925 } | 928 } |
926 | 929 |
| 930 JOW(void, VideoRenderer_releaseNativeFrame)( |
| 931 JNIEnv* jni, jclass, jlong j_frame_ptr) { |
| 932 delete reinterpret_cast<const cricket::VideoFrame*>(j_frame_ptr); |
| 933 } |
| 934 |
927 JOW(void, MediaStreamTrack_free)(JNIEnv*, jclass, jlong j_p) { | 935 JOW(void, MediaStreamTrack_free)(JNIEnv*, jclass, jlong j_p) { |
928 CHECK_RELEASE(reinterpret_cast<MediaStreamTrackInterface*>(j_p)); | 936 CHECK_RELEASE(reinterpret_cast<MediaStreamTrackInterface*>(j_p)); |
929 } | 937 } |
930 | 938 |
931 JOW(jboolean, MediaStream_nativeAddAudioTrack)( | 939 JOW(jboolean, MediaStream_nativeAddAudioTrack)( |
932 JNIEnv* jni, jclass, jlong pointer, jlong j_audio_track_pointer) { | 940 JNIEnv* jni, jclass, jlong pointer, jlong j_audio_track_pointer) { |
933 return reinterpret_cast<MediaStreamInterface*>(pointer)->AddTrack( | 941 return reinterpret_cast<MediaStreamInterface*>(pointer)->AddTrack( |
934 reinterpret_cast<AudioTrackInterface*>(j_audio_track_pointer)); | 942 reinterpret_cast<AudioTrackInterface*>(j_audio_track_pointer)); |
935 } | 943 } |
936 | 944 |
(...skipping 740 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1677 } | 1685 } |
1678 | 1686 |
1679 JOW(void, VideoTrack_nativeRemoveRenderer)( | 1687 JOW(void, VideoTrack_nativeRemoveRenderer)( |
1680 JNIEnv* jni, jclass, | 1688 JNIEnv* jni, jclass, |
1681 jlong j_video_track_pointer, jlong j_renderer_pointer) { | 1689 jlong j_video_track_pointer, jlong j_renderer_pointer) { |
1682 reinterpret_cast<VideoTrackInterface*>(j_video_track_pointer)->RemoveRenderer( | 1690 reinterpret_cast<VideoTrackInterface*>(j_video_track_pointer)->RemoveRenderer( |
1683 reinterpret_cast<VideoRendererInterface*>(j_renderer_pointer)); | 1691 reinterpret_cast<VideoRendererInterface*>(j_renderer_pointer)); |
1684 } | 1692 } |
1685 | 1693 |
1686 } // namespace webrtc_jni | 1694 } // namespace webrtc_jni |
OLD | NEW |