Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(418)

Side by Side Diff: talk/app/webrtc/java/jni/peerconnection_jni.cc

Issue 1313563002: Java VideoRenderer.Callbacks: Make renderFrame() interface asynchronous (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Rebase and rerun tests Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698