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 <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
327 bool AudioCodecBridge::IsKnownUnaccelerated(const AudioCodec& codec) { | 327 bool AudioCodecBridge::IsKnownUnaccelerated(const AudioCodec& codec) { |
328 return MediaCodecUtil::IsKnownUnaccelerated( | 328 return MediaCodecUtil::IsKnownUnaccelerated( |
329 AudioCodecToAndroidMimeType(codec), MEDIA_CODEC_DECODER); | 329 AudioCodecToAndroidMimeType(codec), MEDIA_CODEC_DECODER); |
330 } | 330 } |
331 | 331 |
332 AudioCodecBridge::AudioCodecBridge(const std::string& mime) | 332 AudioCodecBridge::AudioCodecBridge(const std::string& mime) |
333 // Audio codec doesn't care about security level and there is no need for | 333 // Audio codec doesn't care about security level and there is no need for |
334 // audio encoding yet. | 334 // audio encoding yet. |
335 : SdkMediaCodecBridge(mime, false, MEDIA_CODEC_DECODER) {} | 335 : SdkMediaCodecBridge(mime, false, MEDIA_CODEC_DECODER) {} |
336 | 336 |
| 337 bool AudioCodecBridge::ConfigureAndStart(const AudioDecoderConfig& config, |
| 338 bool play_audio, |
| 339 jobject media_crypto) { |
| 340 const int channel_count = |
| 341 ChannelLayoutToChannelCount(config.channel_layout()); |
| 342 const int64_t codec_delay_ns = base::Time::kNanosecondsPerSecond * |
| 343 config.codec_delay() / |
| 344 config.samples_per_second(); |
| 345 const int64_t seek_preroll_ns = |
| 346 1000LL * config.seek_preroll().InMicroseconds(); |
| 347 |
| 348 return ConfigureAndStart(config.codec(), config.samples_per_second(), |
| 349 channel_count, config.extra_data().data(), |
| 350 config.extra_data().size(), codec_delay_ns, |
| 351 seek_preroll_ns, play_audio, media_crypto); |
| 352 } |
| 353 |
337 bool AudioCodecBridge::ConfigureAndStart(const AudioCodec& codec, | 354 bool AudioCodecBridge::ConfigureAndStart(const AudioCodec& codec, |
338 int sample_rate, | 355 int sample_rate, |
339 int channel_count, | 356 int channel_count, |
340 const uint8_t* extra_data, | 357 const uint8_t* extra_data, |
341 size_t extra_data_size, | 358 size_t extra_data_size, |
342 int64_t codec_delay_ns, | 359 int64_t codec_delay_ns, |
343 int64_t seek_preroll_ns, | 360 int64_t seek_preroll_ns, |
344 bool play_audio, | 361 bool play_audio, |
345 jobject media_crypto) { | 362 jobject media_crypto) { |
346 JNIEnv* env = AttachCurrentThread(); | 363 DVLOG(2) << __FUNCTION__ << ": " |
| 364 << " codec:" << GetCodecName(codec) |
| 365 << " samples_per_second:" << sample_rate |
| 366 << " channel_count:" << channel_count |
| 367 << " codec_delay_ns:" << codec_delay_ns |
| 368 << " seek_preroll_ns:" << seek_preroll_ns |
| 369 << " extra data size:" << extra_data_size |
| 370 << " play audio:" << play_audio << " media_crypto:" << media_crypto; |
347 | 371 |
348 if (!media_codec()) | 372 if (!media_codec()) |
349 return false; | 373 return false; |
350 | 374 |
351 std::string codec_string = AudioCodecToAndroidMimeType(codec); | 375 std::string codec_string = AudioCodecToAndroidMimeType(codec); |
352 if (codec_string.empty()) | 376 if (codec_string.empty()) |
353 return false; | 377 return false; |
354 | 378 |
| 379 JNIEnv* env = AttachCurrentThread(); |
| 380 |
355 ScopedJavaLocalRef<jstring> j_mime = | 381 ScopedJavaLocalRef<jstring> j_mime = |
356 ConvertUTF8ToJavaString(env, codec_string); | 382 ConvertUTF8ToJavaString(env, codec_string); |
357 ScopedJavaLocalRef<jobject> j_format(Java_MediaCodecBridge_createAudioFormat( | 383 ScopedJavaLocalRef<jobject> j_format(Java_MediaCodecBridge_createAudioFormat( |
358 env, j_mime.obj(), sample_rate, channel_count)); | 384 env, j_mime.obj(), sample_rate, channel_count)); |
359 DCHECK(!j_format.is_null()); | 385 DCHECK(!j_format.is_null()); |
360 | 386 |
361 if (!ConfigureMediaFormat(j_format.obj(), codec, extra_data, extra_data_size, | 387 if (!ConfigureMediaFormat(j_format.obj(), codec, extra_data, extra_data_size, |
362 codec_delay_ns, seek_preroll_ns)) { | 388 codec_delay_ns, seek_preroll_ns)) { |
363 return false; | 389 return false; |
364 } | 390 } |
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
621 if (adaptive_playback_supported_for_testing_ == 0) | 647 if (adaptive_playback_supported_for_testing_ == 0) |
622 return false; | 648 return false; |
623 else if (adaptive_playback_supported_for_testing_ > 0) | 649 else if (adaptive_playback_supported_for_testing_ > 0) |
624 return true; | 650 return true; |
625 JNIEnv* env = AttachCurrentThread(); | 651 JNIEnv* env = AttachCurrentThread(); |
626 return Java_MediaCodecBridge_isAdaptivePlaybackSupported(env, media_codec(), | 652 return Java_MediaCodecBridge_isAdaptivePlaybackSupported(env, media_codec(), |
627 width, height); | 653 width, height); |
628 } | 654 } |
629 | 655 |
630 } // namespace media | 656 } // namespace media |
OLD | NEW |