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 728 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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_can_apply_rotation_id_(GetMethodID( | 743 j_can_apply_rotation_id_(GetMethodID( |
744 jni, GetObjectClass(jni, j_callbacks), | 744 jni, GetObjectClass(jni, j_callbacks), |
745 "canApplyRotation", "()Z")), | 745 "canApplyRotation", "()Z")), |
746 j_frame_class_(jni, | 746 j_frame_class_(jni, |
747 FindClass(jni, "org/webrtc/VideoRenderer$I420Frame")), | 747 FindClass(jni, "org/webrtc/VideoRenderer$I420Frame")), |
748 j_i420_frame_ctor_id_(GetMethodID( | 748 j_i420_frame_ctor_id_(GetMethodID( |
749 jni, *j_frame_class_, "<init>", "(III[I[Ljava/nio/ByteBuffer;)V")), | 749 jni, *j_frame_class_, "<init>", "(III[I[Ljava/nio/ByteBuffer;J)V")), |
750 j_texture_frame_ctor_id_(GetMethodID( | 750 j_texture_frame_ctor_id_(GetMethodID( |
751 jni, *j_frame_class_, "<init>", | 751 jni, *j_frame_class_, "<init>", |
752 "(IIILjava/lang/Object;I)V")), | 752 "(IIILjava/lang/Object;IJ)V")), |
753 j_byte_buffer_class_(jni, FindClass(jni, "java/nio/ByteBuffer")), | 753 j_byte_buffer_class_(jni, FindClass(jni, "java/nio/ByteBuffer")), |
754 can_apply_rotation_set_(false), | 754 can_apply_rotation_set_(false), |
755 can_apply_rotation_(false) { | 755 can_apply_rotation_(false) { |
756 CHECK_EXCEPTION(jni); | 756 CHECK_EXCEPTION(jni); |
757 } | 757 } |
758 | 758 |
759 virtual ~JavaVideoRendererWrapper() {} | 759 virtual ~JavaVideoRendererWrapper() {} |
760 | 760 |
761 void RenderFrame(const cricket::VideoFrame* video_frame) override { | 761 void RenderFrame(const cricket::VideoFrame* video_frame) override { |
762 ScopedLocalRefFrame local_ref_frame(jni()); | 762 ScopedLocalRefFrame local_ref_frame(jni()); |
763 | 763 |
764 // Calling CanApplyRotation here to ensure can_apply_rotation_ is set. | 764 // Calling CanApplyRotation here to ensure can_apply_rotation_ is set. |
765 CanApplyRotation(); | 765 CanApplyRotation(); |
766 | 766 |
767 const cricket::VideoFrame* frame = | 767 const cricket::VideoFrame* frame = |
768 can_apply_rotation_ ? video_frame | 768 can_apply_rotation_ ? video_frame |
769 : video_frame->GetCopyWithRotationApplied(); | 769 : video_frame->GetCopyWithRotationApplied(); |
| 770 // Make a shallow copy. |j_callbacks_| is responsible for releasing the |
| 771 // copy by calling VideoRenderer.renderFrameDone(). |
| 772 frame = frame->Copy(); |
770 if (frame->GetNativeHandle() != NULL) { | 773 if (frame->GetNativeHandle() != NULL) { |
771 jobject j_frame = CricketToJavaTextureFrame(frame); | 774 jobject j_frame = CricketToJavaTextureFrame(frame); |
772 jni()->CallVoidMethod(*j_callbacks_, j_render_frame_id_, j_frame); | 775 jni()->CallVoidMethod(*j_callbacks_, j_render_frame_id_, j_frame); |
773 CHECK_EXCEPTION(jni()); | 776 CHECK_EXCEPTION(jni()); |
774 } else { | 777 } else { |
775 jobject j_frame = CricketToJavaI420Frame(frame); | 778 jobject j_frame = CricketToJavaI420Frame(frame); |
776 jni()->CallVoidMethod(*j_callbacks_, j_render_frame_id_, j_frame); | 779 jni()->CallVoidMethod(*j_callbacks_, j_render_frame_id_, j_frame); |
777 CHECK_EXCEPTION(jni()); | 780 CHECK_EXCEPTION(jni()); |
778 } | 781 } |
779 } | 782 } |
(...skipping 30 matching lines...) Expand all Loading... |
810 const_cast<uint8*>(frame->GetUPlane()), frame->GetChromaSize()); | 813 const_cast<uint8*>(frame->GetUPlane()), frame->GetChromaSize()); |
811 jobject v_buffer = jni()->NewDirectByteBuffer( | 814 jobject v_buffer = jni()->NewDirectByteBuffer( |
812 const_cast<uint8*>(frame->GetVPlane()), frame->GetChromaSize()); | 815 const_cast<uint8*>(frame->GetVPlane()), frame->GetChromaSize()); |
813 jni()->SetObjectArrayElement(planes, 0, y_buffer); | 816 jni()->SetObjectArrayElement(planes, 0, y_buffer); |
814 jni()->SetObjectArrayElement(planes, 1, u_buffer); | 817 jni()->SetObjectArrayElement(planes, 1, u_buffer); |
815 jni()->SetObjectArrayElement(planes, 2, v_buffer); | 818 jni()->SetObjectArrayElement(planes, 2, v_buffer); |
816 return jni()->NewObject( | 819 return jni()->NewObject( |
817 *j_frame_class_, j_i420_frame_ctor_id_, | 820 *j_frame_class_, j_i420_frame_ctor_id_, |
818 frame->GetWidth(), frame->GetHeight(), | 821 frame->GetWidth(), frame->GetHeight(), |
819 static_cast<int>(frame->GetVideoRotation()), | 822 static_cast<int>(frame->GetVideoRotation()), |
820 strides, planes); | 823 strides, planes, frame); |
821 } | 824 } |
822 | 825 |
823 // Return a VideoRenderer.I420Frame referring texture object in |frame|. | 826 // Return a VideoRenderer.I420Frame referring texture object in |frame|. |
824 jobject CricketToJavaTextureFrame(const cricket::VideoFrame* frame) { | 827 jobject CricketToJavaTextureFrame(const cricket::VideoFrame* frame) { |
825 NativeHandleImpl* handle = | 828 NativeHandleImpl* handle = |
826 reinterpret_cast<NativeHandleImpl*>(frame->GetNativeHandle()); | 829 reinterpret_cast<NativeHandleImpl*>(frame->GetNativeHandle()); |
827 jobject texture_object = reinterpret_cast<jobject>(handle->GetHandle()); | 830 jobject texture_object = reinterpret_cast<jobject>(handle->GetHandle()); |
828 int texture_id = handle->GetTextureId(); | 831 int texture_id = handle->GetTextureId(); |
829 return jni()->NewObject( | 832 return jni()->NewObject( |
830 *j_frame_class_, j_texture_frame_ctor_id_, | 833 *j_frame_class_, j_texture_frame_ctor_id_, |
831 frame->GetWidth(), frame->GetHeight(), | 834 frame->GetWidth(), frame->GetHeight(), |
832 static_cast<int>(frame->GetVideoRotation()), | 835 static_cast<int>(frame->GetVideoRotation()), |
833 texture_object, texture_id); | 836 texture_object, texture_id, frame); |
834 } | 837 } |
835 | 838 |
836 JNIEnv* jni() { | 839 JNIEnv* jni() { |
837 return AttachCurrentThreadIfNeeded(); | 840 return AttachCurrentThreadIfNeeded(); |
838 } | 841 } |
839 | 842 |
840 ScopedGlobalRef<jobject> j_callbacks_; | 843 ScopedGlobalRef<jobject> j_callbacks_; |
841 jmethodID j_render_frame_id_; | 844 jmethodID j_render_frame_id_; |
842 jmethodID j_can_apply_rotation_id_; | 845 jmethodID j_can_apply_rotation_id_; |
843 ScopedGlobalRef<jclass> j_frame_class_; | 846 ScopedGlobalRef<jclass> j_frame_class_; |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
947 } | 950 } |
948 | 951 |
949 JOW(void, VideoRenderer_freeGuiVideoRenderer)(JNIEnv*, jclass, jlong j_p) { | 952 JOW(void, VideoRenderer_freeGuiVideoRenderer)(JNIEnv*, jclass, jlong j_p) { |
950 delete reinterpret_cast<VideoRendererWrapper*>(j_p); | 953 delete reinterpret_cast<VideoRendererWrapper*>(j_p); |
951 } | 954 } |
952 | 955 |
953 JOW(void, VideoRenderer_freeWrappedVideoRenderer)(JNIEnv*, jclass, jlong j_p) { | 956 JOW(void, VideoRenderer_freeWrappedVideoRenderer)(JNIEnv*, jclass, jlong j_p) { |
954 delete reinterpret_cast<JavaVideoRendererWrapper*>(j_p); | 957 delete reinterpret_cast<JavaVideoRendererWrapper*>(j_p); |
955 } | 958 } |
956 | 959 |
| 960 JOW(void, VideoRenderer_releaseNativeFrame)( |
| 961 JNIEnv* jni, jclass, jlong j_frame_ptr) { |
| 962 delete reinterpret_cast<const cricket::VideoFrame*>(j_frame_ptr); |
| 963 } |
| 964 |
957 JOW(void, MediaStreamTrack_free)(JNIEnv*, jclass, jlong j_p) { | 965 JOW(void, MediaStreamTrack_free)(JNIEnv*, jclass, jlong j_p) { |
958 CHECK_RELEASE(reinterpret_cast<MediaStreamTrackInterface*>(j_p)); | 966 CHECK_RELEASE(reinterpret_cast<MediaStreamTrackInterface*>(j_p)); |
959 } | 967 } |
960 | 968 |
961 JOW(jboolean, MediaStream_nativeAddAudioTrack)( | 969 JOW(jboolean, MediaStream_nativeAddAudioTrack)( |
962 JNIEnv* jni, jclass, jlong pointer, jlong j_audio_track_pointer) { | 970 JNIEnv* jni, jclass, jlong pointer, jlong j_audio_track_pointer) { |
963 return reinterpret_cast<MediaStreamInterface*>(pointer)->AddTrack( | 971 return reinterpret_cast<MediaStreamInterface*>(pointer)->AddTrack( |
964 reinterpret_cast<AudioTrackInterface*>(j_audio_track_pointer)); | 972 reinterpret_cast<AudioTrackInterface*>(j_audio_track_pointer)); |
965 } | 973 } |
966 | 974 |
(...skipping 740 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1707 } | 1715 } |
1708 | 1716 |
1709 JOW(void, VideoTrack_nativeRemoveRenderer)( | 1717 JOW(void, VideoTrack_nativeRemoveRenderer)( |
1710 JNIEnv* jni, jclass, | 1718 JNIEnv* jni, jclass, |
1711 jlong j_video_track_pointer, jlong j_renderer_pointer) { | 1719 jlong j_video_track_pointer, jlong j_renderer_pointer) { |
1712 reinterpret_cast<VideoTrackInterface*>(j_video_track_pointer)->RemoveRenderer( | 1720 reinterpret_cast<VideoTrackInterface*>(j_video_track_pointer)->RemoveRenderer( |
1713 reinterpret_cast<VideoRendererInterface*>(j_renderer_pointer)); | 1721 reinterpret_cast<VideoRendererInterface*>(j_renderer_pointer)); |
1714 } | 1722 } |
1715 | 1723 |
1716 } // namespace webrtc_jni | 1724 } // namespace webrtc_jni |
OLD | NEW |