| 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 #include "media/base/android/sdk_media_codec_bridge.h" | 5 #include "media/base/android/sdk_media_codec_bridge.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 default: | 78 default: |
| 79 return std::string(); | 79 return std::string(); |
| 80 } | 80 } |
| 81 } | 81 } |
| 82 | 82 |
| 83 SdkMediaCodecBridge::SdkMediaCodecBridge(const std::string& mime, | 83 SdkMediaCodecBridge::SdkMediaCodecBridge(const std::string& mime, |
| 84 bool is_secure, | 84 bool is_secure, |
| 85 MediaCodecDirection direction, | 85 MediaCodecDirection direction, |
| 86 bool require_software_codec) { | 86 bool require_software_codec) { |
| 87 JNIEnv* env = AttachCurrentThread(); | 87 JNIEnv* env = AttachCurrentThread(); |
| 88 CHECK(env); | |
| 89 DCHECK(!mime.empty()); | 88 DCHECK(!mime.empty()); |
| 90 ScopedJavaLocalRef<jstring> j_mime = ConvertUTF8ToJavaString(env, mime); | 89 ScopedJavaLocalRef<jstring> j_mime = ConvertUTF8ToJavaString(env, mime); |
| 91 j_media_codec_.Reset(Java_MediaCodecBridge_create( | 90 j_media_codec_.Reset(Java_MediaCodecBridge_create( |
| 92 env, j_mime, is_secure, direction, require_software_codec)); | 91 env, j_mime, is_secure, direction, require_software_codec)); |
| 93 } | 92 } |
| 94 | 93 |
| 95 SdkMediaCodecBridge::~SdkMediaCodecBridge() { | 94 SdkMediaCodecBridge::~SdkMediaCodecBridge() { |
| 96 JNIEnv* env = AttachCurrentThread(); | 95 JNIEnv* env = AttachCurrentThread(); |
| 97 CHECK(env); | |
| 98 if (j_media_codec_.obj()) | 96 if (j_media_codec_.obj()) |
| 99 Java_MediaCodecBridge_release(env, j_media_codec_); | 97 Java_MediaCodecBridge_release(env, j_media_codec_); |
| 100 } | 98 } |
| 101 | 99 |
| 102 bool SdkMediaCodecBridge::Start() { | 100 bool SdkMediaCodecBridge::Start() { |
| 103 JNIEnv* env = AttachCurrentThread(); | 101 JNIEnv* env = AttachCurrentThread(); |
| 104 return Java_MediaCodecBridge_start(env, j_media_codec_); | 102 return Java_MediaCodecBridge_start(env, j_media_codec_); |
| 105 } | 103 } |
| 106 | 104 |
| 107 void SdkMediaCodecBridge::Stop() { | 105 void SdkMediaCodecBridge::Stop() { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 if (status == MEDIA_CODEC_OK) | 148 if (status == MEDIA_CODEC_OK) |
| 151 *channel_count = Java_GetOutputFormatResult_channelCount(env, result); | 149 *channel_count = Java_GetOutputFormatResult_channelCount(env, result); |
| 152 return status; | 150 return status; |
| 153 } | 151 } |
| 154 | 152 |
| 155 MediaCodecStatus SdkMediaCodecBridge::QueueInputBuffer( | 153 MediaCodecStatus SdkMediaCodecBridge::QueueInputBuffer( |
| 156 int index, | 154 int index, |
| 157 const uint8_t* data, | 155 const uint8_t* data, |
| 158 size_t data_size, | 156 size_t data_size, |
| 159 base::TimeDelta presentation_time) { | 157 base::TimeDelta presentation_time) { |
| 160 DVLOG(3) << __PRETTY_FUNCTION__ << index << ": " << data_size; | 158 DVLOG(3) << __FUNCTION__ << index << ": " << data_size; |
| 161 if (data_size > | 159 if (data_size > |
| 162 base::checked_cast<size_t>(std::numeric_limits<int32_t>::max())) { | 160 base::checked_cast<size_t>(std::numeric_limits<int32_t>::max())) { |
| 163 return MEDIA_CODEC_ERROR; | 161 return MEDIA_CODEC_ERROR; |
| 164 } | 162 } |
| 165 if (data && !FillInputBuffer(index, data, data_size)) | 163 if (data && !FillInputBuffer(index, data, data_size)) |
| 166 return MEDIA_CODEC_ERROR; | 164 return MEDIA_CODEC_ERROR; |
| 167 JNIEnv* env = AttachCurrentThread(); | 165 JNIEnv* env = AttachCurrentThread(); |
| 168 return static_cast<MediaCodecStatus>(Java_MediaCodecBridge_queueInputBuffer( | 166 return static_cast<MediaCodecStatus>(Java_MediaCodecBridge_queueInputBuffer( |
| 169 env, j_media_codec_, index, 0, data_size, | 167 env, j_media_codec_, index, 0, data_size, |
| 170 presentation_time.InMicroseconds(), 0)); | 168 presentation_time.InMicroseconds(), 0)); |
| 171 } | 169 } |
| 172 | 170 |
| 173 // TODO(timav): Combine this and above methods together keeping only the first | 171 // TODO(timav): Combine this and above methods together keeping only the first |
| 174 // interface after we switch to Spitzer pipeline. | 172 // interface after we switch to Spitzer pipeline. |
| 175 MediaCodecStatus SdkMediaCodecBridge::QueueSecureInputBuffer( | 173 MediaCodecStatus SdkMediaCodecBridge::QueueSecureInputBuffer( |
| 176 int index, | 174 int index, |
| 177 const uint8_t* data, | 175 const uint8_t* data, |
| 178 size_t data_size, | 176 size_t data_size, |
| 179 const std::vector<char>& key_id, | 177 const std::vector<char>& key_id, |
| 180 const std::vector<char>& iv, | 178 const std::vector<char>& iv, |
| 181 const SubsampleEntry* subsamples, | 179 const SubsampleEntry* subsamples, |
| 182 int subsamples_size, | 180 int subsamples_size, |
| 183 base::TimeDelta presentation_time) { | 181 base::TimeDelta presentation_time) { |
| 184 DVLOG(3) << __PRETTY_FUNCTION__ << index << ": " << data_size; | 182 DVLOG(3) << __FUNCTION__ << index << ": " << data_size; |
| 185 if (data_size > | 183 if (data_size > |
| 186 base::checked_cast<size_t>(std::numeric_limits<int32_t>::max())) { | 184 base::checked_cast<size_t>(std::numeric_limits<int32_t>::max())) { |
| 187 return MEDIA_CODEC_ERROR; | 185 return MEDIA_CODEC_ERROR; |
| 188 } | 186 } |
| 189 if (data && !FillInputBuffer(index, data, data_size)) | 187 if (data && !FillInputBuffer(index, data, data_size)) |
| 190 return MEDIA_CODEC_ERROR; | 188 return MEDIA_CODEC_ERROR; |
| 191 | 189 |
| 192 JNIEnv* env = AttachCurrentThread(); | 190 JNIEnv* env = AttachCurrentThread(); |
| 193 ScopedJavaLocalRef<jbyteArray> j_key_id = base::android::ToJavaByteArray( | 191 ScopedJavaLocalRef<jbyteArray> j_key_id = base::android::ToJavaByteArray( |
| 194 env, reinterpret_cast<const uint8_t*>(key_id.data()), key_id.size()); | 192 env, reinterpret_cast<const uint8_t*>(key_id.data()), key_id.size()); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 229 ToJavaIntArray(env, std::move(native_cypher_array), new_subsamples_size); | 227 ToJavaIntArray(env, std::move(native_cypher_array), new_subsamples_size); |
| 230 | 228 |
| 231 return static_cast<MediaCodecStatus>( | 229 return static_cast<MediaCodecStatus>( |
| 232 Java_MediaCodecBridge_queueSecureInputBuffer( | 230 Java_MediaCodecBridge_queueSecureInputBuffer( |
| 233 env, j_media_codec_.obj(), index, 0, j_iv.obj(), j_key_id.obj(), | 231 env, j_media_codec_.obj(), index, 0, j_iv.obj(), j_key_id.obj(), |
| 234 clear_array, cypher_array, new_subsamples_size, | 232 clear_array, cypher_array, new_subsamples_size, |
| 235 presentation_time.InMicroseconds())); | 233 presentation_time.InMicroseconds())); |
| 236 } | 234 } |
| 237 | 235 |
| 238 void SdkMediaCodecBridge::QueueEOS(int input_buffer_index) { | 236 void SdkMediaCodecBridge::QueueEOS(int input_buffer_index) { |
| 239 DVLOG(3) << __PRETTY_FUNCTION__ << ": " << input_buffer_index; | 237 DVLOG(3) << __FUNCTION__ << ": " << input_buffer_index; |
| 240 JNIEnv* env = AttachCurrentThread(); | 238 JNIEnv* env = AttachCurrentThread(); |
| 241 Java_MediaCodecBridge_queueInputBuffer( | 239 Java_MediaCodecBridge_queueInputBuffer( |
| 242 env, j_media_codec_, input_buffer_index, 0, 0, 0, kBufferFlagEndOfStream); | 240 env, j_media_codec_, input_buffer_index, 0, 0, 0, kBufferFlagEndOfStream); |
| 243 } | 241 } |
| 244 | 242 |
| 245 MediaCodecStatus SdkMediaCodecBridge::DequeueInputBuffer( | 243 MediaCodecStatus SdkMediaCodecBridge::DequeueInputBuffer( |
| 246 base::TimeDelta timeout, | 244 base::TimeDelta timeout, |
| 247 int* index) { | 245 int* index) { |
| 248 JNIEnv* env = AttachCurrentThread(); | 246 JNIEnv* env = AttachCurrentThread(); |
| 249 ScopedJavaLocalRef<jobject> result = Java_MediaCodecBridge_dequeueInputBuffer( | 247 ScopedJavaLocalRef<jobject> result = Java_MediaCodecBridge_dequeueInputBuffer( |
| 250 env, j_media_codec_, timeout.InMicroseconds()); | 248 env, j_media_codec_, timeout.InMicroseconds()); |
| 251 *index = Java_DequeueInputResult_index(env, result); | 249 *index = Java_DequeueInputResult_index(env, result); |
| 252 MediaCodecStatus status = static_cast<MediaCodecStatus>( | 250 MediaCodecStatus status = static_cast<MediaCodecStatus>( |
| 253 Java_DequeueInputResult_status(env, result)); | 251 Java_DequeueInputResult_status(env, result)); |
| 254 DVLOG(3) << __PRETTY_FUNCTION__ << ": status: " << status | 252 DVLOG(3) << __FUNCTION__ << ": status: " << status << ", index: " << *index; |
| 255 << ", index: " << *index; | |
| 256 return status; | 253 return status; |
| 257 } | 254 } |
| 258 | 255 |
| 259 MediaCodecStatus SdkMediaCodecBridge::DequeueOutputBuffer( | 256 MediaCodecStatus SdkMediaCodecBridge::DequeueOutputBuffer( |
| 260 base::TimeDelta timeout, | 257 base::TimeDelta timeout, |
| 261 int* index, | 258 int* index, |
| 262 size_t* offset, | 259 size_t* offset, |
| 263 size_t* size, | 260 size_t* size, |
| 264 base::TimeDelta* presentation_time, | 261 base::TimeDelta* presentation_time, |
| 265 bool* end_of_stream, | 262 bool* end_of_stream, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 277 *presentation_time = base::TimeDelta::FromMicroseconds( | 274 *presentation_time = base::TimeDelta::FromMicroseconds( |
| 278 Java_DequeueOutputResult_presentationTimeMicroseconds(env, result)); | 275 Java_DequeueOutputResult_presentationTimeMicroseconds(env, result)); |
| 279 } | 276 } |
| 280 int flags = Java_DequeueOutputResult_flags(env, result); | 277 int flags = Java_DequeueOutputResult_flags(env, result); |
| 281 if (end_of_stream) | 278 if (end_of_stream) |
| 282 *end_of_stream = flags & kBufferFlagEndOfStream; | 279 *end_of_stream = flags & kBufferFlagEndOfStream; |
| 283 if (key_frame) | 280 if (key_frame) |
| 284 *key_frame = flags & kBufferFlagSyncFrame; | 281 *key_frame = flags & kBufferFlagSyncFrame; |
| 285 MediaCodecStatus status = static_cast<MediaCodecStatus>( | 282 MediaCodecStatus status = static_cast<MediaCodecStatus>( |
| 286 Java_DequeueOutputResult_status(env, result)); | 283 Java_DequeueOutputResult_status(env, result)); |
| 287 DVLOG(3) << __PRETTY_FUNCTION__ << ": status: " << status | 284 DVLOG(3) << __FUNCTION__ << ": status: " << status << ", index: " << *index |
| 288 << ", index: " << *index << ", offset: " << *offset | 285 << ", offset: " << *offset << ", size: " << *size |
| 289 << ", size: " << *size << ", flags: " << flags; | 286 << ", flags: " << flags; |
| 290 return status; | 287 return status; |
| 291 } | 288 } |
| 292 | 289 |
| 293 void SdkMediaCodecBridge::ReleaseOutputBuffer(int index, bool render) { | 290 void SdkMediaCodecBridge::ReleaseOutputBuffer(int index, bool render) { |
| 294 DVLOG(3) << __PRETTY_FUNCTION__ << ": " << index; | 291 DVLOG(3) << __FUNCTION__ << ": " << index; |
| 295 JNIEnv* env = AttachCurrentThread(); | 292 JNIEnv* env = AttachCurrentThread(); |
| 296 CHECK(env); | |
| 297 | |
| 298 Java_MediaCodecBridge_releaseOutputBuffer(env, j_media_codec_, index, render); | 293 Java_MediaCodecBridge_releaseOutputBuffer(env, j_media_codec_, index, render); |
| 299 } | 294 } |
| 300 | 295 |
| 301 MediaCodecStatus SdkMediaCodecBridge::GetInputBuffer(int input_buffer_index, | 296 MediaCodecStatus SdkMediaCodecBridge::GetInputBuffer(int input_buffer_index, |
| 302 uint8_t** data, | 297 uint8_t** data, |
| 303 size_t* capacity) { | 298 size_t* capacity) { |
| 304 JNIEnv* env = AttachCurrentThread(); | 299 JNIEnv* env = AttachCurrentThread(); |
| 305 ScopedJavaLocalRef<jobject> j_buffer(Java_MediaCodecBridge_getInputBuffer( | 300 ScopedJavaLocalRef<jobject> j_buffer(Java_MediaCodecBridge_getInputBuffer( |
| 306 env, j_media_codec_, input_buffer_index)); | 301 env, j_media_codec_, input_buffer_index)); |
| 307 if (j_buffer.is_null()) | 302 if (j_buffer.is_null()) |
| (...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 700 if (adaptive_playback_supported_for_testing_ == 0) | 695 if (adaptive_playback_supported_for_testing_ == 0) |
| 701 return false; | 696 return false; |
| 702 else if (adaptive_playback_supported_for_testing_ > 0) | 697 else if (adaptive_playback_supported_for_testing_ > 0) |
| 703 return true; | 698 return true; |
| 704 JNIEnv* env = AttachCurrentThread(); | 699 JNIEnv* env = AttachCurrentThread(); |
| 705 return Java_MediaCodecBridge_isAdaptivePlaybackSupported(env, media_codec(), | 700 return Java_MediaCodecBridge_isAdaptivePlaybackSupported(env, media_codec(), |
| 706 width, height); | 701 width, height); |
| 707 } | 702 } |
| 708 | 703 |
| 709 } // namespace media | 704 } // namespace media |
| OLD | NEW |