Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef MEDIA_BASE_ANDROID_MEDIA_CODEC_BRIDGE_H_ | 5 #ifndef MEDIA_BASE_ANDROID_MEDIA_CODEC_BRIDGE_H_ |
| 6 #define MEDIA_BASE_ANDROID_MEDIA_CODEC_BRIDGE_H_ | 6 #define MEDIA_BASE_ANDROID_MEDIA_CODEC_BRIDGE_H_ |
| 7 | 7 |
| 8 #include <jni.h> | 8 #include <jni.h> |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 37 // Android MediaCodec class. For more information on Android MediaCodec, check | 37 // Android MediaCodec class. For more information on Android MediaCodec, check |
| 38 // http://developer.android.com/reference/android/media/MediaCodec.html | 38 // http://developer.android.com/reference/android/media/MediaCodec.html |
| 39 // Note: MediaCodec is only available on JB and greater. | 39 // Note: MediaCodec is only available on JB and greater. |
| 40 // Use AudioCodecBridge or VideoCodecBridge to create an instance of this | 40 // Use AudioCodecBridge or VideoCodecBridge to create an instance of this |
| 41 // object. | 41 // object. |
| 42 class MEDIA_EXPORT MediaCodecBridge { | 42 class MEDIA_EXPORT MediaCodecBridge { |
| 43 public: | 43 public: |
| 44 // Returns true if MediaCodec is available on the device. | 44 // Returns true if MediaCodec is available on the device. |
| 45 static bool IsAvailable(); | 45 static bool IsAvailable(); |
| 46 | 46 |
| 47 // Returns true if MediaCodec.setParameters() is available on the device. | |
| 48 static bool SupportsSetParameters(); | |
| 49 | |
| 47 // Returns whether MediaCodecBridge has a decoder that |is_secure| and can | 50 // Returns whether MediaCodecBridge has a decoder that |is_secure| and can |
| 48 // decode |codec| type. | 51 // decode |codec| type. |
| 49 static bool CanDecode(const std::string& codec, bool is_secure); | 52 static bool CanDecode(const std::string& codec, bool is_secure); |
| 50 | 53 |
| 51 // Represents supported codecs on android. | 54 // Represents supported codecs on android. |
| 52 // TODO(qinmin): Curretly the codecs string only contains one codec, do we | 55 // TODO(qinmin): Curretly the codecs string only contains one codec, do we |
| 53 // need more specific codecs separated by comma. (e.g. "vp8" -> "vp8, vp8.0") | 56 // need more specific codecs separated by comma. (e.g. "vp8" -> "vp8, vp8.0") |
| 54 struct CodecsInfo { | 57 struct CodecsInfo { |
| 55 std::string codecs; | 58 std::string codecs; // E.g. "vp8" or "avc1". |
| 56 std::string name; | 59 std::string name; // E.g. "OMX.google.vp8.decoder". |
| 60 bool is_encoder; | |
| 57 }; | 61 }; |
| 58 | 62 |
| 59 // Get a list of supported codecs. | 63 // Get a list of supported codecs. |
| 60 static void GetCodecsInfo(std::vector<CodecsInfo>* codecs_info); | 64 static std::vector<CodecsInfo> GetCodecsInfo(); |
| 61 | 65 |
| 62 virtual ~MediaCodecBridge(); | 66 virtual ~MediaCodecBridge(); |
| 63 | 67 |
| 64 // Resets both input and output, all indices previously returned in calls to | 68 // Resets both input and output, all indices previously returned in calls to |
| 65 // DequeueInputBuffer() and DequeueOutputBuffer() become invalid. | 69 // DequeueInputBuffer() and DequeueOutputBuffer() become invalid. |
| 66 // Please note that this clears all the inputs in the media codec. In other | 70 // Please note that this clears all the inputs in the media codec. In other |
| 67 // words, there will be no outputs until new input is provided. | 71 // words, there will be no outputs until new input is provided. |
| 68 // Returns MEDIA_CODEC_ERROR if an unexpected error happens, or Media_CODEC_OK | 72 // Returns MEDIA_CODEC_ERROR if an unexpected error happens, or Media_CODEC_OK |
| 69 // otherwise. | 73 // otherwise. |
| 70 MediaCodecStatus Reset(); | 74 MediaCodecStatus Reset(); |
| 71 | 75 |
| 72 // Finishes the decode/encode session. The instance remains active | 76 // Finishes the decode/encode session. The instance remains active |
| 73 // and ready to be StartAudio/Video()ed again. HOWEVER, due to the buggy | 77 // and ready to be StartAudio/Video()ed again. HOWEVER, due to the buggy |
| 74 // vendor's implementation , b/8125974, Stop() -> StartAudio/Video() may not | 78 // vendor's implementation , b/8125974, Stop() -> StartAudio/Video() may not |
| 75 // work on some devices. For reliability, Stop() -> delete and recreate new | 79 // work on some devices. For reliability, Stop() -> delete and recreate new |
| 76 // instance -> StartAudio/Video() is recommended. | 80 // instance -> StartAudio/Video() is recommended. |
| 77 void Stop(); | 81 void Stop(); |
| 78 | 82 |
| 79 // Used for getting output format. This is valid after DequeueInputBuffer() | 83 // Used for getting output format. This is valid after DequeueInputBuffer() |
| 80 // returns a format change by returning INFO_OUTPUT_FORMAT_CHANGED | 84 // returns a format change by returning INFO_OUTPUT_FORMAT_CHANGED |
| 81 void GetOutputFormat(int* width, int* height); | 85 void GetOutputFormat(int* width, int* height); |
| 82 | 86 |
| 87 // Returns the number of input buffers used by the codec. | |
| 88 int GetInputBuffersCount(); | |
| 89 | |
| 83 // Submits a byte array to the given input buffer. Call this after getting an | 90 // Submits a byte array to the given input buffer. Call this after getting an |
| 84 // available buffer from DequeueInputBuffer(). | 91 // available buffer from DequeueInputBuffer(). If |data| is NULL, assume the |
| 92 // input buffer has already been populated (but still obey |size|). | |
| 85 MediaCodecStatus QueueInputBuffer(int index, | 93 MediaCodecStatus QueueInputBuffer(int index, |
| 86 const uint8* data, | 94 const uint8* data, |
| 87 int size, | 95 int size, |
| 88 const base::TimeDelta& presentation_time); | 96 const base::TimeDelta& presentation_time); |
| 89 | 97 |
| 90 // Similar to the above call, but submits a buffer that is encrypted. | 98 // Similar to the above call, but submits a buffer that is encrypted. |
| 91 // Note: NULL |subsamples| indicates the whole buffer is encrypted. | 99 // Note: NULL |subsamples| indicates the whole buffer is encrypted. If |data| |
| 100 // is NULL, assume the input buffer has already been populated (but still obey | |
| 101 // |data_size|). | |
| 92 MediaCodecStatus QueueSecureInputBuffer( | 102 MediaCodecStatus QueueSecureInputBuffer( |
| 93 int index, | 103 int index, |
| 94 const uint8* data, int data_size, | 104 const uint8* data, int data_size, |
| 95 const uint8* key_id, int key_id_size, | 105 const uint8* key_id, int key_id_size, |
| 96 const uint8* iv, int iv_size, | 106 const uint8* iv, int iv_size, |
| 97 const SubsampleEntry* subsamples, int subsamples_size, | 107 const SubsampleEntry* subsamples, int subsamples_size, |
| 98 const base::TimeDelta& presentation_time); | 108 const base::TimeDelta& presentation_time); |
| 99 | 109 |
| 100 // Submits an empty buffer with a EOS (END OF STREAM) flag. | 110 // Submits an empty buffer with a EOS (END OF STREAM) flag. |
| 101 void QueueEOS(int input_buffer_index); | 111 void QueueEOS(int input_buffer_index); |
| 102 | 112 |
| 103 // Returns: | 113 // Returns: |
| 104 // MEDIA_CODEC_OK if an input buffer is ready to be filled with valid data, | 114 // MEDIA_CODEC_OK if an input buffer is ready to be filled with valid data, |
| 105 // MEDIA_CODEC_ENQUEUE_INPUT_AGAIN_LATER if no such buffer is available, or | 115 // MEDIA_CODEC_ENQUEUE_INPUT_AGAIN_LATER if no such buffer is available, or |
| 106 // MEDIA_CODEC_ERROR if unexpected error happens. | 116 // MEDIA_CODEC_ERROR if unexpected error happens. |
| 107 // Note: Never use infinite timeout as this would block the decoder thread and | 117 // Note: Never use infinite timeout as this would block the decoder thread and |
| 108 // prevent the decoder job from being released. | 118 // prevent the decoder job from being released. |
| 109 MediaCodecStatus DequeueInputBuffer(const base::TimeDelta& timeout, | 119 MediaCodecStatus DequeueInputBuffer(const base::TimeDelta& timeout, |
| 110 int* index); | 120 int* index); |
| 111 | 121 |
| 112 // Dequeues an output buffer, block at most timeout_us microseconds. | 122 // Dequeues an output buffer, block at most timeout_us microseconds. |
| 113 // Returns the status of this operation. If OK is returned, the output | 123 // Returns the status of this operation. If OK is returned, the output |
| 114 // parameters should be populated. Otherwise, the values of output parameters | 124 // parameters should be populated. Otherwise, the values of output parameters |
| 115 // should not be used. | 125 // should not be used. Output parameters other than index/offset/size are |
| 126 // optional and only set if not NULL. | |
| 116 // Note: Never use infinite timeout as this would block the decoder thread and | 127 // Note: Never use infinite timeout as this would block the decoder thread and |
| 117 // prevent the decoder job from being released. | 128 // prevent the decoder job from being released. |
| 118 // TODO(xhwang): Can we drop |end_of_stream| and return | 129 // TODO(xhwang): Can we drop |end_of_stream| and return |
| 119 // MEDIA_CODEC_OUTPUT_END_OF_STREAM? | 130 // MEDIA_CODEC_OUTPUT_END_OF_STREAM? |
| 120 MediaCodecStatus DequeueOutputBuffer(const base::TimeDelta& timeout, | 131 MediaCodecStatus DequeueOutputBuffer(const base::TimeDelta& timeout, |
| 121 int* index, | 132 int* index, size_t* offset, size_t* size, |
| 122 size_t* offset, | |
| 123 size_t* size, | |
| 124 base::TimeDelta* presentation_time, | 133 base::TimeDelta* presentation_time, |
| 125 bool* end_of_stream); | 134 bool* end_of_stream, bool* key_frame); |
| 126 | 135 |
| 127 // Returns the buffer to the codec. If you previously specified a surface | 136 // Returns the buffer to the codec. If you previously specified a surface when |
| 128 // when configuring this video decoder you can optionally render the buffer. | 137 // configuring this video decoder you can |
| 138 // optionally render the buffer. | |
|
xhwang
2013/11/19 00:11:25
nit: merge with the previous line?
Ami GONE FROM CHROMIUM
2013/11/21 22:59:07
Done.
| |
| 129 void ReleaseOutputBuffer(int index, bool render); | 139 void ReleaseOutputBuffer(int index, bool render); |
| 130 | 140 |
| 141 // Returns the number of output buffers used by the codec. | |
| 142 int GetOutputBuffersCount(); | |
| 143 | |
| 144 // Returns the capacity of each output buffer used by the codec. | |
| 145 size_t GetOutputBuffersCapacity(); | |
| 146 | |
| 131 // Gets output buffers from media codec and keeps them inside the java class. | 147 // Gets output buffers from media codec and keeps them inside the java class. |
| 132 // To access them, use DequeueOutputBuffer(). Returns whether output buffers | 148 // To access them, use DequeueOutputBuffer(). Returns whether output buffers |
| 133 // were successfully obtained. | 149 // were successfully obtained. |
| 134 bool GetOutputBuffers() WARN_UNUSED_RESULT; | 150 bool GetOutputBuffers() WARN_UNUSED_RESULT; |
| 135 | 151 |
| 152 // Returns an input buffers' base pointer and capacity. | |
|
xhwang
2013/11/19 00:11:25
s/buffers'/buffer's
Ami GONE FROM CHROMIUM
2013/11/21 22:59:07
Done.
| |
| 153 void GetInputBuffer(int input_buffer_index, uint8** data, size_t* capacity); | |
| 154 | |
| 155 // Copy |dst_size| bytes from output buffer |index|'s |offset| onwards into | |
| 156 // |*dst|. | |
| 157 bool CopyFromOutputBuffer(int index, size_t offset, void* dst, int dst_size); | |
| 158 | |
| 136 static bool RegisterMediaCodecBridge(JNIEnv* env); | 159 static bool RegisterMediaCodecBridge(JNIEnv* env); |
| 137 | 160 |
| 138 protected: | 161 protected: |
| 139 // Returns true if |mime_type| is known to be unaccelerated (i.e. backed by a | 162 // Returns true if |mime_type| is known to be unaccelerated (i.e. backed by a |
| 140 // software codec instead of a hardware one). | 163 // software codec instead of a hardware one). |
| 141 static bool IsKnownUnaccelerated(const std::string& mime_type); | 164 static bool IsKnownUnaccelerated(const std::string& mime_type, |
| 165 bool is_encoder); | |
| 142 | 166 |
| 143 MediaCodecBridge(const std::string& mime, bool is_secure); | 167 MediaCodecBridge(const std::string& mime, bool is_secure, bool is_encoder); |
| 144 | 168 |
| 145 // Calls start() against the media codec instance. Used in StartXXX() after | 169 // Calls start() against the media codec instance. Used in StartXXX() after |
| 146 // configuring media codec. Returns whether media codec was successfully | 170 // configuring media codec. Returns whether media codec was successfully |
| 147 // started. | 171 // started. |
| 148 bool StartInternal() WARN_UNUSED_RESULT; | 172 bool StartInternal() WARN_UNUSED_RESULT; |
| 149 | 173 |
| 150 jobject media_codec() { return j_media_codec_.obj(); } | 174 jobject media_codec() { return j_media_codec_.obj(); } |
| 175 bool is_encoder_; | |
| 151 | 176 |
| 152 private: | 177 private: |
| 153 // Fills a particular input buffer; returns false if |data_size| exceeds the | 178 // Fills a particular input buffer; returns false if |data_size| exceeds the |
| 154 // input buffer's capacity (and doesn't touch the input buffer in that case). | 179 // input buffer's capacity (and doesn't touch the input buffer in that case). |
| 155 bool FillInputBuffer(int index, | 180 bool FillInputBuffer(int index, const uint8* data, |
| 156 const uint8* data, | 181 size_t data_size) WARN_UNUSED_RESULT; |
| 157 int data_size) WARN_UNUSED_RESULT; | |
| 158 | 182 |
| 159 // Java MediaCodec instance. | 183 // Java MediaCodec instance. |
| 160 base::android::ScopedJavaGlobalRef<jobject> j_media_codec_; | 184 base::android::ScopedJavaGlobalRef<jobject> j_media_codec_; |
| 161 | 185 |
| 162 DISALLOW_COPY_AND_ASSIGN(MediaCodecBridge); | 186 DISALLOW_COPY_AND_ASSIGN(MediaCodecBridge); |
| 163 }; | 187 }; |
| 164 | 188 |
| 165 class AudioCodecBridge : public MediaCodecBridge { | 189 class AudioCodecBridge : public MediaCodecBridge { |
| 166 public: | 190 public: |
| 167 // Returns an AudioCodecBridge instance if |codec| is supported, or a NULL | 191 // Returns an AudioCodecBridge instance if |codec| is supported, or a NULL |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 186 private: | 210 private: |
| 187 explicit AudioCodecBridge(const std::string& mime); | 211 explicit AudioCodecBridge(const std::string& mime); |
| 188 | 212 |
| 189 // Configure the java MediaFormat object with the extra codec data passed in. | 213 // Configure the java MediaFormat object with the extra codec data passed in. |
| 190 bool ConfigureMediaFormat(jobject j_format, const AudioCodec& codec, | 214 bool ConfigureMediaFormat(jobject j_format, const AudioCodec& codec, |
| 191 const uint8* extra_data, size_t extra_data_size); | 215 const uint8* extra_data, size_t extra_data_size); |
| 192 }; | 216 }; |
| 193 | 217 |
| 194 class MEDIA_EXPORT VideoCodecBridge : public MediaCodecBridge { | 218 class MEDIA_EXPORT VideoCodecBridge : public MediaCodecBridge { |
| 195 public: | 219 public: |
| 196 // Returns an VideoCodecBridge instance if |codec| is supported, or a NULL | 220 // See MediaCodecBridge::IsKnownUnaccelerated(). |
| 197 // pointer otherwise. | 221 static bool IsKnownUnaccelerated(const VideoCodec& codec, bool is_encoder); |
| 198 static VideoCodecBridge* Create(const VideoCodec& codec, bool is_secure); | |
| 199 | 222 |
| 200 // See MediaCodecBridge::IsKnownUnaccelerated(). | 223 // Create, start, and return a VideoCodecBridge decoder or NULL on failure. |
| 201 static bool IsKnownUnaccelerated(const VideoCodec& codec); | 224 static VideoCodecBridge* CreateDecoder( |
| 225 const VideoCodec& codec, // e.g. media::kCodecVP8 | |
| 226 bool is_secure, const gfx::Size& size, // Output frame size. | |
| 227 jobject surface, // Output surface, optional. | |
| 228 jobject media_crypto); // MediaCrypto object, optional. | |
| 202 | 229 |
| 203 // Start the video codec bridge. | 230 // Create, start, and return a VideoCodecBridge encoder or NULL on failure. |
| 204 // TODO(qinmin): Pass codec specific data if available. | 231 static VideoCodecBridge* CreateEncoder( |
| 205 bool Start(const VideoCodec& codec, const gfx::Size& size, jobject surface, | 232 const VideoCodec& codec, // e.g. media::kCodecVP8 |
| 206 jobject media_crypto); | 233 const gfx::Size& size, // input frame size |
| 234 int bit_rate, // bits/second | |
| 235 int frame_rate, // frames/second | |
| 236 int i_frame_interval, // count | |
| 237 int color_format); // MediaCodecInfo.CodecCapabilities. | |
| 238 | |
| 239 void SetVideoBitrate(int bps); | |
| 240 void RequestKeyFrameSoon(); | |
| 207 | 241 |
| 208 private: | 242 private: |
| 209 VideoCodecBridge(const std::string& mime, bool is_secure); | 243 VideoCodecBridge(const std::string& mime, bool is_secure, bool is_encoder); |
| 210 }; | 244 }; |
| 211 | 245 |
| 212 } // namespace media | 246 } // namespace media |
| 213 | 247 |
| 214 #endif // MEDIA_BASE_ANDROID_MEDIA_CODEC_BRIDGE_H_ | 248 #endif // MEDIA_BASE_ANDROID_MEDIA_CODEC_BRIDGE_H_ |
| OLD | NEW |