diff options
author | watk <watk@chromium.org> | 2015-07-20 13:16:15 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-07-20 20:16:50 +0000 |
commit | 45c3063debd193f953d5c4aa55902d185469f4bc (patch) | |
tree | 52ba383323f4e2eb465a6187d71881f3fff5f212 /media | |
parent | 808535c6118fcbecdf8caf6309ab5a7b99d02bd3 (diff) | |
download | chromium_src-45c3063debd193f953d5c4aa55902d185469f4bc.zip chromium_src-45c3063debd193f953d5c4aa55902d185469f4bc.tar.gz chromium_src-45c3063debd193f953d5c4aa55902d185469f4bc.tar.bz2 |
Initial support for the desktop media pipeline on Android.
Add experimental support for the desktop src= media pipeline on Android
behind a compile-time variable. To compile with it
enabled, set the gyp variable media_use_ffmpeg=1.
Currently only H/W accelerated VP8 is supported because that is all that
the existing AndroidVideoDecodeAccelerator supports.
BUG=507834
Review URL: https://codereview.chromium.org/1230793009
Cr-Commit-Position: refs/heads/master@{#339498}
Diffstat (limited to 'media')
-rw-r--r-- | media/blink/media_blink.gyp | 5 | ||||
-rw-r--r-- | media/ffmpeg/ffmpeg_common.cc | 9 | ||||
-rw-r--r-- | media/filters/audio_decoder_unittest.cc | 8 | ||||
-rw-r--r-- | media/filters/ffmpeg_glue_unittest.cc | 8 | ||||
-rw-r--r-- | media/media.gyp | 65 | ||||
-rw-r--r-- | media/media_cdm.gypi | 22 | ||||
-rw-r--r-- | media/media_variables.gypi | 21 | ||||
-rw-r--r-- | media/renderers/default_renderer_factory.cc | 8 |
8 files changed, 105 insertions, 41 deletions
diff --git a/media/blink/media_blink.gyp b/media/blink/media_blink.gyp index 3462a38..254705b 100644 --- a/media/blink/media_blink.gyp +++ b/media/blink/media_blink.gyp @@ -3,6 +3,9 @@ # found in the LICENSE file. { + 'includes': [ + '../media_variables.gypi' + ], 'targets': [ { # GN version: //media/blink @@ -76,7 +79,7 @@ 'websourcebuffer_impl.h', ], 'conditions': [ - ['OS=="android"', { + ['OS=="android" and media_use_ffmpeg==0', { 'sources!': [ 'encrypted_media_player_support.cc', 'encrypted_media_player_support.h', diff --git a/media/ffmpeg/ffmpeg_common.cc b/media/ffmpeg/ffmpeg_common.cc index cfd9e9a..5b6ef7f 100644 --- a/media/ffmpeg/ffmpeg_common.cc +++ b/media/ffmpeg/ffmpeg_common.cc @@ -408,6 +408,15 @@ void AVStreamToVideoDecoderConfig( VideoPixelFormat format = PixelFormatToVideoPixelFormat(stream->codec->pix_fmt); + // The format and coded size may be unknown if FFmpeg is compiled without + // video decoders. +#if defined(DISABLE_FFMPEG_VIDEO_DECODERS) + if (format == PIXEL_FORMAT_UNKNOWN) + format = PIXEL_FORMAT_YV12; + if (coded_size == gfx::Size(0, 0)) + coded_size = visible_rect.size(); +#endif + if (codec == kCodecVP9) { // TODO(tomfinegan): libavcodec doesn't know about VP9. format = PIXEL_FORMAT_YV12; diff --git a/media/filters/audio_decoder_unittest.cc b/media/filters/audio_decoder_unittest.cc index 3664eee..d428107 100644 --- a/media/filters/audio_decoder_unittest.cc +++ b/media/filters/audio_decoder_unittest.cc @@ -417,11 +417,19 @@ TEST_P(FFmpegAudioDecoderBehavioralTest, InitializeWithBadConfig) { InitializeDecoderWithResult(decoder_config, false); } +#if defined(OPUS_FIXED_POINT) +const DecodedBufferExpectations kSfxOpusExpectations[] = { + {0, 13500, "-2.70,-1.41,-0.78,-1.27,-2.56,-3.73,"}, + {13500, 20000, "5.48,5.93,6.05,5.83,5.54,5.46,"}, + {33500, 20000, "-3.44,-3.34,-3.57,-4.11,-4.74,-5.13,"}, +}; +#else const DecodedBufferExpectations kSfxOpusExpectations[] = { {0, 13500, "-2.70,-1.41,-0.78,-1.27,-2.56,-3.73,"}, {13500, 20000, "5.48,5.93,6.04,5.83,5.54,5.45,"}, {33500, 20000, "-3.45,-3.35,-3.57,-4.12,-4.74,-5.14,"}, }; +#endif const DecodedBufferExpectations kBearOpusExpectations[] = { {500, 3500, "-0.26,0.87,1.36,0.84,-0.30,-1.22,"}, diff --git a/media/filters/ffmpeg_glue_unittest.cc b/media/filters/ffmpeg_glue_unittest.cc index f9cfda5..5b97f36 100644 --- a/media/filters/ffmpeg_glue_unittest.cc +++ b/media/filters/ffmpeg_glue_unittest.cc @@ -235,9 +235,11 @@ TEST_F(FFmpegGlueDestructionTest, WithOpenWithOpenStreams) { ASSERT_TRUE(glue_->OpenContext()); ASSERT_GT(glue_->format_context()->nb_streams, 0u); - AVCodecContext* context = glue_->format_context()->streams[0]->codec; - ASSERT_EQ(avcodec_open2( - context, avcodec_find_decoder(context->codec_id), NULL), 0); + // Pick the audio stream (1) so this works when the ffmpeg video decoders are + // disabled. + AVCodecContext* context = glue_->format_context()->streams[1]->codec; + ASSERT_EQ(0, avcodec_open2( + context, avcodec_find_decoder(context->codec_id), NULL)); } } // namespace media diff --git a/media/media.gyp b/media/media.gyp index e3cadc1..d73d584 100644 --- a/media/media.gyp +++ b/media/media.gyp @@ -12,14 +12,6 @@ # detection of ABI mismatches and prevents silent errors. 'linux_link_pulseaudio%': 0, 'conditions': [ - ['OS=="android" or OS=="ios"', { - # Android and iOS don't use ffmpeg or libvpx. - 'media_use_ffmpeg%': 0, - 'media_use_libvpx%': 0, - }, { # 'OS!="android" and OS!="ios"' - 'media_use_ffmpeg%': 1, - 'media_use_libvpx%': 1, - }], # Enable ALSA and Pulse for runtime selection. ['(OS=="linux" or OS=="freebsd" or OS=="solaris") and (embedded!=1 or (chromecast==1 and target_arch!="arm"))', { # ALSA is always needed for Web MIDI even if the cras is enabled. @@ -45,6 +37,7 @@ }, 'includes': [ 'media_cdm.gypi', + 'media_variables.gypi', ], 'targets': [ { @@ -66,6 +59,9 @@ '../url/url.gyp:url_lib', 'shared_memory_support', ], + 'export_dependent_settings': [ + '../third_party/opus/opus.gyp:opus', + ], 'defines': [ 'MEDIA_IMPLEMENTATION', ], @@ -260,7 +256,7 @@ 'base/cdm_factory.cc', 'base/cdm_factory.h', 'base/cdm_initialized_promise.cc', - 'base/cdm_initialized_promise.h', + 'base/cdm_initialized_promise.h', 'base/cdm_key_information.cc', 'base/cdm_key_information.h', 'base/cdm_promise.cc', @@ -706,17 +702,38 @@ 'player_android', 'video_capture_android_jni_headers', ], - 'sources': [ - 'base/media.cc', - 'base/media.h', - ], 'sources!': [ - 'filters/opus_audio_decoder.cc', - 'filters/opus_audio_decoder.h', + 'base/audio_video_metadata_extractor.cc', + 'base/audio_video_metadata_extractor.h', + 'base/media_file_checker.cc', + 'base/media_file_checker.h', + 'filters/ffmpeg_video_decoder.cc', + 'filters/ffmpeg_video_decoder.h', ], 'defines': [ 'DISABLE_USER_INPUT_MONITOR', ], + 'conditions': [ + ['media_use_ffmpeg == 1', { + 'defines': [ + # On Android, FFmpeg is built without video decoders. We only + # support hardware video decoding. + 'ENABLE_MEDIA_PIPELINE_ON_ANDROID', + 'DISABLE_FFMPEG_VIDEO_DECODERS', + ], + 'direct_dependent_settings': { + 'defines': [ + 'ENABLE_MEDIA_PIPELINE_ON_ANDROID', + 'DISABLE_FFMPEG_VIDEO_DECODERS', + ], + }, + }, { # media_use_ffmpeg == 0 + 'sources!': [ + 'filters/opus_audio_decoder.cc', + 'filters/opus_audio_decoder.h', + ], + }], + ], }], # For VaapiVideoEncodeAccelerator. ['target_arch != "arm" and chromeos == 1', { @@ -1264,19 +1281,25 @@ 'dependencies': [ '../third_party/ffmpeg/ffmpeg.gyp:ffmpeg', ], - }, { # media_use_ffmpeg== 0 + }, { # media_use_ffmpeg==0 'sources!': [ - 'base/audio_video_metadata_extractor_unittest.cc', - 'base/container_names_unittest.cc', - 'base/media_file_checker_unittest.cc', 'ffmpeg/ffmpeg_common_unittest.cc', 'filters/audio_decoder_unittest.cc', - 'filters/audio_file_reader_unittest.cc', - 'filters/blocking_url_protocol_unittest.cc', 'filters/ffmpeg_aac_bitstream_converter_unittest.cc', 'filters/ffmpeg_demuxer_unittest.cc', 'filters/ffmpeg_glue_unittest.cc', 'filters/ffmpeg_h264_to_annex_b_bitstream_converter_unittest.cc', + ], + }], + # Even if FFmpeg is enabled on Android we don't want these. + # TODO(watk): Refactor tests that could be made to run on Android. + ['media_use_ffmpeg==0 or OS=="android"', { + 'sources!': [ + 'base/audio_video_metadata_extractor_unittest.cc', + 'base/container_names_unittest.cc', + 'base/media_file_checker_unittest.cc', + 'filters/audio_file_reader_unittest.cc', + 'filters/blocking_url_protocol_unittest.cc', 'filters/ffmpeg_video_decoder_unittest.cc', 'filters/in_memory_url_protocol_unittest.cc', 'test/pipeline_integration_test.cc', diff --git a/media/media_cdm.gypi b/media/media_cdm.gypi index 1068aa1..53abddd 100644 --- a/media/media_cdm.gypi +++ b/media/media_cdm.gypi @@ -3,20 +3,16 @@ # found in the LICENSE file. { + 'includes': [ + 'media_variables.gypi', + ], 'variables': { - 'conditions': [ - ['OS == "android"', { - # Android doesn't use ffmpeg. - 'use_ffmpeg%': 0, - }, { # 'OS != "android"' - 'use_ffmpeg%': 1, - }], - ], # Set |use_fake_video_decoder| to 1 to ignore input frames in |clearkeycdm|, # and produce video frames filled with a solid color instead. 'use_fake_video_decoder%': 0, - # Set |use_libvpx| to 1 to use libvpx for VP8 decoding in |clearkeycdm|. - 'use_libvpx%': 0, + # Set |use_libvpx_in_clear_key_cdm| to 1 to use libvpx for VP8 decoding in + # |clearkeycdm|. + 'use_libvpx_in_clear_key_cdm%': 0, }, 'conditions': [ ['enable_pepper_cdms==1', { @@ -39,7 +35,7 @@ 'cdm/ppapi/external_clear_key/fake_cdm_video_decoder.h', ], }], - ['use_ffmpeg == 1' , { + ['media_use_ffmpeg == 1' , { 'defines': ['CLEAR_KEY_CDM_USE_FFMPEG_DECODER'], 'dependencies': [ '<(DEPTH)/third_party/ffmpeg/ffmpeg.gyp:ffmpeg', @@ -49,13 +45,13 @@ 'cdm/ppapi/external_clear_key/ffmpeg_cdm_audio_decoder.h', ], }], - ['use_ffmpeg == 1 and use_fake_video_decoder == 0' , { + ['media_use_ffmpeg == 1 and use_fake_video_decoder == 0' , { 'sources': [ 'cdm/ppapi/external_clear_key/ffmpeg_cdm_video_decoder.cc', 'cdm/ppapi/external_clear_key/ffmpeg_cdm_video_decoder.h', ], }], - ['use_libvpx == 1 and use_fake_video_decoder == 0' , { + ['use_libvpx_in_clear_key_cdm == 1 and use_fake_video_decoder == 0' , { 'defines': ['CLEAR_KEY_CDM_USE_LIBVPX_DECODER'], 'dependencies': [ '<(DEPTH)/third_party/libvpx/libvpx.gyp:libvpx', diff --git a/media/media_variables.gypi b/media/media_variables.gypi new file mode 100644 index 0000000..f359e36 --- /dev/null +++ b/media/media_variables.gypi @@ -0,0 +1,21 @@ +# Copyright 2015 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# Common media variables. +{ + 'variables': { + 'conditions': [ + ['OS == "android" or OS == "ios"', { + # Android and iOS don't use FFmpeg or libvpx by default. + # Set media_use_ffmpeg=1 for Android builds to compile experimental + # support for FFmpeg and the desktop media pipeline. + 'media_use_ffmpeg%': 0, + 'media_use_libvpx%': 0, + }, { + 'media_use_ffmpeg%': 1, + 'media_use_libvpx%': 1, + }], + ], + }, +} diff --git a/media/renderers/default_renderer_factory.cc b/media/renderers/default_renderer_factory.cc index c7c8340..5bd5012 100644 --- a/media/renderers/default_renderer_factory.cc +++ b/media/renderers/default_renderer_factory.cc @@ -16,10 +16,12 @@ #if !defined(MEDIA_DISABLE_FFMPEG) #include "media/filters/ffmpeg_audio_decoder.h" +#if !defined(DISABLE_FFMPEG_VIDEO_DECODERS) #include "media/filters/ffmpeg_video_decoder.h" #endif +#endif -#if !defined(OS_ANDROID) +#if !defined(OS_ANDROID) || defined(ENABLE_MEDIA_PIPELINE_ON_ANDROID) #include "media/filters/opus_audio_decoder.h" #endif @@ -55,7 +57,7 @@ scoped_ptr<Renderer> DefaultRendererFactory::CreateRenderer( new FFmpegAudioDecoder(media_task_runner, media_log_)); #endif -#if !defined(OS_ANDROID) +#if !defined(OS_ANDROID) || defined(ENABLE_MEDIA_PIPELINE_ON_ANDROID) audio_decoders.push_back(new OpusAudioDecoder(media_task_runner)); #endif @@ -79,7 +81,7 @@ scoped_ptr<Renderer> DefaultRendererFactory::CreateRenderer( video_decoders.push_back(new VpxVideoDecoder(media_task_runner)); #endif -#if !defined(MEDIA_DISABLE_FFMPEG) +#if !defined(MEDIA_DISABLE_FFMPEG) && !defined(DISABLE_FFMPEG_VIDEO_DECODERS) video_decoders.push_back(new FFmpegVideoDecoder(media_task_runner)); #endif |