OLD | NEW |
| (Empty) |
1 /* | |
2 * libjingle | |
3 * Copyright 2015 Google Inc. | |
4 * | |
5 * Redistribution and use in source and binary forms, with or without | |
6 * modification, are permitted provided that the following conditions are met: | |
7 * | |
8 * 1. Redistributions of source code must retain the above copyright notice, | |
9 * this list of conditions and the following disclaimer. | |
10 * 2. Redistributions in binary form must reproduce the above copyright notice, | |
11 * this list of conditions and the following disclaimer in the documentation | |
12 * and/or other materials provided with the distribution. | |
13 * 3. The name of the author may not be used to endorse or promote products | |
14 * derived from this software without specific prior written permission. | |
15 * | |
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED | |
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | |
19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; | |
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | |
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR | |
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF | |
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
26 * | |
27 */ | |
28 | |
29 #ifndef TALK_APP_WEBRTC_JAVA_JNI_ANDROIDMEDIACODECCOMMON_H_ | |
30 #define TALK_APP_WEBRTC_JAVA_JNI_ANDROIDMEDIACODECCOMMON_H_ | |
31 | |
32 #include <android/log.h> | |
33 #include <string> | |
34 | |
35 #include "talk/app/webrtc/java/jni/classreferenceholder.h" | |
36 #include "talk/app/webrtc/java/jni/jni_helpers.h" | |
37 #include "webrtc/base/thread.h" | |
38 #include "webrtc/base/logging.h" | |
39 #include "webrtc/base/thread.h" | |
40 #include "webrtc/system_wrappers/include/tick_util.h" | |
41 | |
42 namespace webrtc_jni { | |
43 | |
44 // Uncomment this define to enable verbose logging for every encoded/decoded | |
45 // video frame. | |
46 //#define TRACK_BUFFER_TIMING | |
47 | |
48 #define TAG_COMMON "MediaCodecVideo" | |
49 | |
50 // Color formats supported by encoder - should mirror supportedColorList | |
51 // from MediaCodecVideoEncoder.java | |
52 enum COLOR_FORMATTYPE { | |
53 COLOR_FormatYUV420Planar = 0x13, | |
54 COLOR_FormatYUV420SemiPlanar = 0x15, | |
55 COLOR_QCOM_FormatYUV420SemiPlanar = 0x7FA30C00, | |
56 // NV12 color format supported by QCOM codec, but not declared in MediaCodec - | |
57 // see /hardware/qcom/media/mm-core/inc/OMX_QCOMExtns.h | |
58 // This format is presumably similar to COLOR_FormatYUV420SemiPlanar, | |
59 // but requires some (16, 32?) byte alignment. | |
60 COLOR_QCOM_FORMATYUV420PackedSemiPlanar32m = 0x7FA30C04 | |
61 }; | |
62 | |
63 // Arbitrary interval to poll the codec for new outputs. | |
64 enum { kMediaCodecPollMs = 10 }; | |
65 // Media codec maximum output buffer ready timeout. | |
66 enum { kMediaCodecTimeoutMs = 1000 }; | |
67 // Interval to print codec statistics (bitrate, fps, encoding/decoding time). | |
68 enum { kMediaCodecStatisticsIntervalMs = 3000 }; | |
69 // Maximum amount of pending frames for VP8 decoder. | |
70 enum { kMaxPendingFramesVp8 = 1 }; | |
71 // Maximum amount of pending frames for VP9 decoder. | |
72 enum { kMaxPendingFramesVp9 = 1 }; | |
73 // Maximum amount of pending frames for H.264 decoder. | |
74 enum { kMaxPendingFramesH264 = 8 }; | |
75 // Maximum amount of decoded frames for which per-frame logging is enabled. | |
76 enum { kMaxDecodedLogFrames = 10 }; | |
77 // Maximum amount of encoded frames for which per-frame logging is enabled. | |
78 enum { kMaxEncodedLogFrames = 10 }; | |
79 | |
80 static inline int64_t GetCurrentTimeMs() { | |
81 return webrtc::TickTime::Now().Ticks() / 1000000LL; | |
82 } | |
83 | |
84 static inline void AllowBlockingCalls() { | |
85 rtc::Thread* current_thread = rtc::Thread::Current(); | |
86 if (current_thread != NULL) | |
87 current_thread->SetAllowBlockingCalls(true); | |
88 } | |
89 | |
90 // Return the (singleton) Java Enum object corresponding to |index|; | |
91 // |state_class_fragment| is something like "MediaSource$State". | |
92 static inline jobject JavaEnumFromIndexAndClassName( | |
93 JNIEnv* jni, const std::string& state_class_fragment, int index) { | |
94 const std::string state_class = "org/webrtc/" + state_class_fragment; | |
95 return JavaEnumFromIndex(jni, FindClass(jni, state_class.c_str()), | |
96 state_class, index); | |
97 } | |
98 | |
99 // Checks for any Java exception, prints stack backtrace and clears | |
100 // currently thrown exception. | |
101 static inline bool CheckException(JNIEnv* jni) { | |
102 if (jni->ExceptionCheck()) { | |
103 LOG_TAG(rtc::LS_ERROR, TAG_COMMON) << "Java JNI exception."; | |
104 jni->ExceptionDescribe(); | |
105 jni->ExceptionClear(); | |
106 return true; | |
107 } | |
108 return false; | |
109 } | |
110 | |
111 } // namespace webrtc_jni | |
112 | |
113 #endif // TALK_APP_WEBRTC_JAVA_JNI_ANDROIDMEDIACODECCOMMON_H_ | |
OLD | NEW |