diff options
author | Ben Murdoch <benm@google.com> | 2014-04-10 11:22:14 +0100 |
---|---|---|
committer | Ben Murdoch <benm@google.com> | 2014-04-10 11:22:14 +0100 |
commit | c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c (patch) | |
tree | e9edd581ad60ab80aa5ab423a2a80df652a75792 /media | |
parent | 54cd42278ccf1d52996034848086a09b23065a40 (diff) | |
download | chromium_org-c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c.tar.gz |
Merge from Chromium at DEPS revision 262940
This commit was generated by merge_to_master.py.
Change-Id: I9a3fddbb29857fa8f68a18c6a0115862b65f84d1
Diffstat (limited to 'media')
196 files changed, 3095 insertions, 3090 deletions
diff --git a/media/audio/audio_output_controller.cc b/media/audio/audio_output_controller.cc index 381452e2db..6d30f4b1fb 100644 --- a/media/audio/audio_output_controller.cc +++ b/media/audio/audio_output_controller.cc @@ -41,7 +41,6 @@ AudioOutputController::AudioOutputController( diverting_to_stream_(NULL), volume_(1.0), state_(kEmpty), - not_currently_in_on_more_io_data_(1), sync_reader_(sync_reader), message_loop_(audio_manager->GetTaskRunner()), #if defined(AUDIO_POWER_MONITORING) @@ -58,8 +57,6 @@ AudioOutputController::AudioOutputController( AudioOutputController::~AudioOutputController() { DCHECK_EQ(kClosed, state_); - // TODO(dalecurtis): Remove debugging for http://crbug.com/349651 - CHECK(!base::AtomicRefCountDec(¬_currently_in_on_more_io_data_)); } // static @@ -304,7 +301,6 @@ int AudioOutputController::OnMoreData(AudioBus* dest, int AudioOutputController::OnMoreIOData(AudioBus* source, AudioBus* dest, AudioBuffersState buffers_state) { - CHECK(!base::AtomicRefCountDec(¬_currently_in_on_more_io_data_)); TRACE_EVENT0("audio", "AudioOutputController::OnMoreIOData"); // Indicate that we haven't wedged (at least not indefinitely, WedgeCheck() @@ -324,7 +320,6 @@ int AudioOutputController::OnMoreIOData(AudioBus* source, power_monitor_.Scan(*dest, frames); #endif - base::AtomicRefCountInc(¬_currently_in_on_more_io_data_); return frames; } diff --git a/media/audio/audio_output_controller.h b/media/audio/audio_output_controller.h index 1a64d63aef..c8d2cd99cc 100644 --- a/media/audio/audio_output_controller.h +++ b/media/audio/audio_output_controller.h @@ -237,11 +237,6 @@ class MEDIA_EXPORT AudioOutputController // is not required for reading on the audio manager thread. State state_; - // Atomic ref count indicating when when we're in the middle of handling an - // OnMoreIOData() callback. Will be CHECK'd to find crashes. - // TODO(dalecurtis): Remove debug helpers for http://crbug.com/349651 - base::AtomicRefCount not_currently_in_on_more_io_data_; - // SyncReader is used only in low latency mode for synchronous reading. SyncReader* const sync_reader_; diff --git a/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java b/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java index 3f15061138..cfcebb0151 100644 --- a/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java +++ b/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java @@ -233,8 +233,13 @@ class MediaCodecBridge { @CalledByNative private void release() { - mMediaCodec.stop(); - mMediaCodec.release(); + try { + mMediaCodec.release(); + } catch(IllegalStateException e) { + // The MediaCodec is stuck in a wrong state, possibly due to losing + // the surface. + Log.e(TAG, "Cannot release media codec", e); + } mMediaCodec = null; if (mAudioTrack != null) { mAudioTrack.release(); diff --git a/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java b/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java index 2099ddec76..31e505560e 100644 --- a/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java +++ b/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java @@ -254,7 +254,6 @@ class MediaDrmBridge { * Check whether the crypto scheme is supported for the given container. * If |containerMimeType| is an empty string, we just return whether * the crypto scheme is supported. - * TODO(xhwang): Implement container check. See: http://crbug.com/350481 * * @return true if the container and the crypto scheme is supported, or * false otherwise. @@ -262,7 +261,12 @@ class MediaDrmBridge { @CalledByNative private static boolean isCryptoSchemeSupported(byte[] schemeUUID, String containerMimeType) { UUID cryptoScheme = getUUIDFromBytes(schemeUUID); - return MediaDrm.isCryptoSchemeSupported(cryptoScheme); + + if (containerMimeType.isEmpty()) { + return MediaDrm.isCryptoSchemeSupported(cryptoScheme); + } + + return MediaDrm.isCryptoSchemeSupported(cryptoScheme, containerMimeType); } /** diff --git a/media/base/android/media_decoder_job.cc b/media/base/android/media_decoder_job.cc index b7eef0cdfb..8b8c9b2e31 100644 --- a/media/base/android/media_decoder_job.cc +++ b/media/base/android/media_decoder_job.cc @@ -72,13 +72,19 @@ void MediaDecoderJob::OnDataReceived(const DemuxerData& data) { is_requesting_demuxer_data_ = false; base::Closure done_cb = base::ResetAndReturn(&on_data_received_cb_); + + // If this data request is for the inactive chunk, or |on_data_received_cb_| + // was set to null by ClearData() or Release(), do nothing. + if (done_cb.is_null()) + return; + if (stop_decode_pending_) { + DCHECK(is_decoding()); OnDecodeCompleted(MEDIA_CODEC_STOPPED, kNoTimestamp(), 0); return; } - if (!done_cb.is_null()) - done_cb.Run(); + done_cb.Run(); } void MediaDecoderJob::Prefetch(const base::Closure& prefetch_cb) { diff --git a/media/base/android/media_drm_bridge.cc b/media/base/android/media_drm_bridge.cc index 38584fb382..dbcd1871b8 100644 --- a/media/base/android/media_drm_bridge.cc +++ b/media/base/android/media_drm_bridge.cc @@ -4,6 +4,8 @@ #include "media/base/android/media_drm_bridge.h" +#include <algorithm> + #include "base/android/build_info.h" #include "base/android/jni_array.h" #include "base/android/jni_string.h" @@ -180,6 +182,30 @@ static std::string GetSecurityLevelString( return ""; } +// Checks whether |key_system| is supported with |container_mime_type|. Only +// checks |key_system| support if |container_mime_type| is empty. +// TODO(xhwang): The |container_mime_type| is not the same as contentType in +// the EME spec. Revisit this once the spec issue with initData type is +// resolved. +static bool IsKeySystemSupportedWithTypeImpl( + const std::string& key_system, + const std::string& container_mime_type) { + if (!MediaDrmBridge::IsAvailable()) + return false; + + std::vector<uint8> scheme_uuid = GetUUID(key_system); + if (scheme_uuid.empty()) + return false; + + JNIEnv* env = AttachCurrentThread(); + ScopedJavaLocalRef<jbyteArray> j_scheme_uuid = + base::android::ToJavaByteArray(env, &scheme_uuid[0], scheme_uuid.size()); + ScopedJavaLocalRef<jstring> j_container_mime_type = + ConvertUTF8ToJavaString(env, container_mime_type); + return Java_MediaDrmBridge_isCryptoSchemeSupported( + env, j_scheme_uuid.obj(), j_container_mime_type.obj()); +} + // static bool MediaDrmBridge::IsAvailable() { return base::android::BuildInfo::GetInstance()->sdk_int() >= 19; @@ -208,23 +234,17 @@ bool MediaDrmBridge::IsSecurityLevelSupported(const std::string& key_system, } // static +bool MediaDrmBridge::IsKeySystemSupported(const std::string& key_system) { + DCHECK(!key_system.empty()); + return IsKeySystemSupportedWithTypeImpl(key_system, ""); +} + +// static bool MediaDrmBridge::IsKeySystemSupportedWithType( const std::string& key_system, const std::string& container_mime_type) { - if (!IsAvailable()) - return false; - - std::vector<uint8> scheme_uuid = GetUUID(key_system); - if (scheme_uuid.empty()) - return false; - - JNIEnv* env = AttachCurrentThread(); - ScopedJavaLocalRef<jbyteArray> j_scheme_uuid = - base::android::ToJavaByteArray(env, &scheme_uuid[0], scheme_uuid.size()); - ScopedJavaLocalRef<jstring> j_container_mime_type = - ConvertUTF8ToJavaString(env, container_mime_type); - return Java_MediaDrmBridge_isCryptoSchemeSupported( - env, j_scheme_uuid.obj(), j_container_mime_type.obj()); + DCHECK(!key_system.empty() && !container_mime_type.empty()); + return IsKeySystemSupportedWithTypeImpl(key_system, container_mime_type); } bool MediaDrmBridge::RegisterMediaDrmBridge(JNIEnv* env) { @@ -292,17 +312,29 @@ bool MediaDrmBridge::CreateSession(uint32 session_id, const std::string& content_type, const uint8* init_data, int init_data_length) { - std::vector<uint8> pssh_data; - if (!GetPsshData(init_data, init_data_length, scheme_uuid_, &pssh_data)) - return false; - JNIEnv* env = AttachCurrentThread(); - ScopedJavaLocalRef<jbyteArray> j_pssh_data = - base::android::ToJavaByteArray(env, &pssh_data[0], pssh_data.size()); + ScopedJavaLocalRef<jbyteArray> j_init_data; + // Caller should always use "video/*" content types. + DCHECK_EQ(0u, content_type.find("video/")); + + // Widevine MediaDrm plugin only accepts the "data" part of the PSSH box as + // the init data when using MP4 container. + if (std::equal(scheme_uuid_.begin(), scheme_uuid_.end(), kWidevineUuid) && + content_type == "video/mp4") { + std::vector<uint8> pssh_data; + if (!GetPsshData(init_data, init_data_length, scheme_uuid_, &pssh_data)) + return false; + j_init_data = + base::android::ToJavaByteArray(env, &pssh_data[0], pssh_data.size()); + } else { + j_init_data = + base::android::ToJavaByteArray(env, init_data, init_data_length); + } + ScopedJavaLocalRef<jstring> j_mime = ConvertUTF8ToJavaString(env, content_type); Java_MediaDrmBridge_createSession( - env, j_media_drm_.obj(), session_id, j_pssh_data.obj(), j_mime.obj()); + env, j_media_drm_.obj(), session_id, j_init_data.obj(), j_mime.obj()); return true; } diff --git a/media/base/android/media_drm_bridge.h b/media/base/android/media_drm_bridge.h index 07e6b612c4..f34bbc43b2 100644 --- a/media/base/android/media_drm_bridge.h +++ b/media/base/android/media_drm_bridge.h @@ -44,9 +44,11 @@ class MEDIA_EXPORT MediaDrmBridge : public MediaKeys { static bool IsSecurityLevelSupported(const std::string& key_system, SecurityLevel security_level); - // TODO(xhwang): The |container_mime_type| is not the same as contentType in - // the EME spec. Revisit this once the spec issue with initData type is - // resolved. + // Checks whether |key_system| is supported. + static bool IsKeySystemSupported(const std::string& key_system); + + // Checks whether |key_system| is supported with |container_mime_type|. + // |container_mime_type| must not be empty. static bool IsKeySystemSupportedWithType( const std::string& key_system, const std::string& container_mime_type); diff --git a/media/base/android/media_drm_bridge_unittest.cc b/media/base/android/media_drm_bridge_unittest.cc index fdf5350ed3..a838203304 100644 --- a/media/base/android/media_drm_bridge_unittest.cc +++ b/media/base/android/media_drm_bridge_unittest.cc @@ -31,6 +31,12 @@ const MediaDrmBridge::SecurityLevel kLNone = const MediaDrmBridge::SecurityLevel kL1 = MediaDrmBridge::SECURITY_LEVEL_1; const MediaDrmBridge::SecurityLevel kL3 = MediaDrmBridge::SECURITY_LEVEL_3; +// Helper functions to avoid typing "MediaDrmBridge::" in tests. + +static bool IsKeySystemSupported(const std::string& key_system) { + return MediaDrmBridge::IsKeySystemSupported(key_system); +} + static bool IsKeySystemSupportedWithType( const std::string& key_system, const std::string& container_mime_type) { @@ -59,26 +65,32 @@ TEST(MediaDrmBridgeTest, IsSecurityLevelSupported_InvalidKeySystem) { EXPECT_FALSE(IsSecurityLevelSupported(kInvalidKeySystem, kL3)); } -TEST(MediaDrmBridgeTest, IsTypeSupported_Widevine) { - EXPECT_TRUE_IF_AVAILABLE( - IsKeySystemSupportedWithType(kWidevineKeySystem, kAudioMp4)); +TEST(MediaDrmBridgeTest, IsKeySystemSupported_Widevine) { + EXPECT_TRUE_IF_AVAILABLE(IsKeySystemSupported(kWidevineKeySystem)); + + // TODO(xhwang): Enable when b/13564917 is fixed. + // EXPECT_TRUE_IF_AVAILABLE( + // IsKeySystemSupportedWithType(kWidevineKeySystem, kAudioMp4)); EXPECT_TRUE_IF_AVAILABLE( IsKeySystemSupportedWithType(kWidevineKeySystem, kVideoMp4)); - // TODO(xhwang): MediaDrmBridge.IsKeySystemSupportedWithType() doesn't check - // the container type. Fix IsKeySystemSupportedWithType() and update this test - // as necessary. See: http://crbug.com/350481 - EXPECT_TRUE_IF_AVAILABLE( - IsKeySystemSupportedWithType(kWidevineKeySystem, kAudioWebM)); - EXPECT_TRUE_IF_AVAILABLE( - IsKeySystemSupportedWithType(kWidevineKeySystem, kVideoWebM)); + EXPECT_FALSE(IsKeySystemSupportedWithType(kWidevineKeySystem, kAudioWebM)); + EXPECT_FALSE(IsKeySystemSupportedWithType(kWidevineKeySystem, kVideoWebM)); + EXPECT_FALSE(IsKeySystemSupportedWithType(kWidevineKeySystem, "unknown")); + EXPECT_FALSE(IsKeySystemSupportedWithType(kWidevineKeySystem, "video/avi")); + EXPECT_FALSE(IsKeySystemSupportedWithType(kWidevineKeySystem, "audio/mp3")); } // Invalid keysytem is NOT supported regardless whether MediaDrm is available. -TEST(MediaDrmBridgeTest, IsTypeSupported_InvalidKeySystem) { - EXPECT_FALSE(IsKeySystemSupportedWithType(kInvalidKeySystem, "")); +TEST(MediaDrmBridgeTest, IsKeySystemSupported_InvalidKeySystem) { + EXPECT_FALSE(IsKeySystemSupported(kInvalidKeySystem)); + EXPECT_FALSE(IsKeySystemSupportedWithType(kInvalidKeySystem, kAudioMp4)); EXPECT_FALSE(IsKeySystemSupportedWithType(kInvalidKeySystem, kVideoMp4)); + EXPECT_FALSE(IsKeySystemSupportedWithType(kInvalidKeySystem, kAudioWebM)); EXPECT_FALSE(IsKeySystemSupportedWithType(kInvalidKeySystem, kVideoWebM)); + EXPECT_FALSE(IsKeySystemSupportedWithType(kInvalidKeySystem, "unknown")); + EXPECT_FALSE(IsKeySystemSupportedWithType(kInvalidKeySystem, "video/avi")); + EXPECT_FALSE(IsKeySystemSupportedWithType(kInvalidKeySystem, "audio/mp3")); } } // namespace media diff --git a/media/base/android/media_source_player_unittest.cc b/media/base/android/media_source_player_unittest.cc index a3e69e5bd3..9c6a0627d1 100644 --- a/media/base/android/media_source_player_unittest.cc +++ b/media/base/android/media_source_player_unittest.cc @@ -1861,7 +1861,8 @@ TEST_F(MediaSourcePlayerTest, SeekToThenReleaseThenDemuxerSeekAndDone) { EXPECT_EQ(1, demuxer_->num_seek_requests()); } -TEST_F(MediaSourcePlayerTest, SeekToThenReleaseThenDemuxerSeekThenStart) { +TEST_F(MediaSourcePlayerTest, + DISABLED_SeekToThenReleaseThenDemuxerSeekThenStart) { SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); // Test if Release() occurs after SeekTo(), but the DemuxerSeek IPC request @@ -1889,7 +1890,8 @@ TEST_F(MediaSourcePlayerTest, SeekToThenReleaseThenDemuxerSeekThenStart) { EXPECT_EQ(1, demuxer_->num_seek_requests()); } -TEST_F(MediaSourcePlayerTest, SeekToThenDemuxerSeekThenReleaseThenSeekDone) { +TEST_F(MediaSourcePlayerTest, + DISABLED_SeekToThenDemuxerSeekThenReleaseThenSeekDone) { SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); // Test if Release() occurs after a SeekTo()'s subsequent DemuxerSeek IPC @@ -1916,7 +1918,8 @@ TEST_F(MediaSourcePlayerTest, SeekToThenDemuxerSeekThenReleaseThenSeekDone) { EXPECT_EQ(1, demuxer_->num_seek_requests()); } -TEST_F(MediaSourcePlayerTest, SeekToThenReleaseThenStart) { +// Flaky. See http://crbug.com/361359. +TEST_F(MediaSourcePlayerTest, DISABLED_SeekToThenReleaseThenStart) { SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); // Test if Release() occurs after a SeekTo()'s subsequent DemuxerSeeK IPC diff --git a/media/base/audio_video_metadata_extractor.cc b/media/base/audio_video_metadata_extractor.cc index 121f900341..47ecc7c810 100644 --- a/media/base/audio_video_metadata_extractor.cc +++ b/media/base/audio_video_metadata_extractor.cc @@ -195,12 +195,21 @@ int AudioVideoMetadataExtractor::track() const { return track_; } +const std::map<std::string, std::string>& +AudioVideoMetadataExtractor::raw_tags() const { + DCHECK(extracted_); + return raw_tags_; +} + void AudioVideoMetadataExtractor::ExtractDictionary(AVDictionary* metadata) { if (!metadata) return; AVDictionaryEntry* tag = NULL; while ((tag = av_dict_get(metadata, "", tag, AV_DICT_IGNORE_SUFFIX))) { + if (raw_tags_.find(tag->key) == raw_tags_.end()) + raw_tags_[tag->key] = tag->value; + if (ExtractInt(tag, "rotate", &rotation_)) continue; if (ExtractString(tag, "album", &album_)) continue; if (ExtractString(tag, "artist", &artist_)) continue; diff --git a/media/base/audio_video_metadata_extractor.h b/media/base/audio_video_metadata_extractor.h index 7ea73e20ab..afea412f48 100644 --- a/media/base/audio_video_metadata_extractor.h +++ b/media/base/audio_video_metadata_extractor.h @@ -5,6 +5,7 @@ #ifndef MEDIA_BASE_AUDIO_VIDEO_METADATA_EXTRACTOR_H_ #define MEDIA_BASE_AUDIO_VIDEO_METADATA_EXTRACTOR_H_ +#include <map> #include <string> #include "base/basictypes.h" @@ -51,6 +52,8 @@ class MEDIA_EXPORT AudioVideoMetadataExtractor { const std::string& title() const; int track() const; + const std::map<std::string, std::string>& raw_tags() const; + private: void ExtractDictionary(AVDictionary* metadata); @@ -74,6 +77,8 @@ class MEDIA_EXPORT AudioVideoMetadataExtractor { std::string title_; int track_; + std::map<std::string, std::string> raw_tags_; + DISALLOW_COPY_AND_ASSIGN(AudioVideoMetadataExtractor); }; diff --git a/media/base/audio_video_metadata_extractor_unittest.cc b/media/base/audio_video_metadata_extractor_unittest.cc index 52aeca74db..1aba4efa83 100644 --- a/media/base/audio_video_metadata_extractor_unittest.cc +++ b/media/base/audio_video_metadata_extractor_unittest.cc @@ -45,6 +45,9 @@ TEST(AudioVideoMetadataExtractorTest, AudioOGG) { scoped_ptr<AudioVideoMetadataExtractor> extractor = GetExtractor("9ch.ogg", true, 0, -1, -1); EXPECT_EQ("Processed by SoX", extractor->comment()); + + EXPECT_EQ(1u, extractor->raw_tags().size()); + EXPECT_EQ("Processed by SoX", extractor->raw_tags().find("COMMENT")->second); } TEST(AudioVideoMetadataExtractorTest, AudioWAV) { @@ -52,12 +55,19 @@ TEST(AudioVideoMetadataExtractorTest, AudioWAV) { GetExtractor("sfx_u8.wav", true, 0, -1, -1); EXPECT_EQ("Lavf54.37.100", extractor->encoder()); EXPECT_EQ("Amadeus Pro", extractor->encoded_by()); + + EXPECT_EQ(2u, extractor->raw_tags().size()); + EXPECT_EQ("Lavf54.37.100", extractor->raw_tags().find("encoder")->second); + EXPECT_EQ("Amadeus Pro", extractor->raw_tags().find("encoded_by")->second); } TEST(AudioVideoMetadataExtractorTest, VideoWebM) { scoped_ptr<AudioVideoMetadataExtractor> extractor = GetExtractor("bear-320x240-multitrack.webm", true, 2, 320, 240); EXPECT_EQ("Lavf53.9.0", extractor->encoder()); + + EXPECT_EQ(1u, extractor->raw_tags().size()); + EXPECT_EQ("Lavf53.9.0", extractor->raw_tags().find("ENCODER")->second); } #if defined(USE_PROPRIETARY_CODECS) @@ -66,6 +76,17 @@ TEST(AudioVideoMetadataExtractorTest, AndroidRotatedMP4Video) { GetExtractor("90rotation.mp4", true, 0, 1920, 1080); EXPECT_EQ(90, extractor->rotation()); + + EXPECT_EQ(7u, extractor->raw_tags().size()); + EXPECT_EQ("isom3gp4", + extractor->raw_tags().find("compatible_brands")->second); + EXPECT_EQ("2014-02-11 00:39:25", + extractor->raw_tags().find("creation_time")->second); + EXPECT_EQ("VideoHandle", extractor->raw_tags().find("handler_name")->second); + EXPECT_EQ("eng", extractor->raw_tags().find("language")->second); + EXPECT_EQ("isom", extractor->raw_tags().find("major_brand")->second); + EXPECT_EQ("0", extractor->raw_tags().find("minor_version")->second); + EXPECT_EQ("90", extractor->raw_tags().find("rotate")->second); } TEST(AudioVideoMetadataExtractorTest, AudioMP3) { @@ -79,6 +100,15 @@ TEST(AudioVideoMetadataExtractorTest, AudioMP3) { EXPECT_EQ("Alternative", extractor->genre()); EXPECT_EQ("1997", extractor->date()); EXPECT_EQ("Lavf54.4.100", extractor->encoder()); + + EXPECT_EQ(7u, extractor->raw_tags().size()); + EXPECT_EQ("OK Computer", extractor->raw_tags().find("album")->second); + EXPECT_EQ("Radiohead", extractor->raw_tags().find("artist")->second); + EXPECT_EQ("1997", extractor->raw_tags().find("date")->second); + EXPECT_EQ("Lavf54.4.100", extractor->raw_tags().find("encoder")->second); + EXPECT_EQ("Alternative", extractor->raw_tags().find("genre")->second); + EXPECT_EQ("Airbag", extractor->raw_tags().find("title")->second); + EXPECT_EQ("1", extractor->raw_tags().find("track")->second); } #endif diff --git a/media/base/data_source.cc b/media/base/data_source.cc index 91f5260860..c8ab4461b5 100644 --- a/media/base/data_source.cc +++ b/media/base/data_source.cc @@ -11,18 +11,8 @@ namespace media { // static const int DataSource::kReadError = -1; -DataSourceHost::~DataSourceHost() {} - -DataSource::DataSource() : host_(NULL) {} +DataSource::DataSource() {} DataSource::~DataSource() {} -void DataSource::set_host(DataSourceHost* host) { - DCHECK(host); - DCHECK(!host_); - host_ = host; -} - -DataSourceHost* DataSource::host() { return host_; } - } // namespace media diff --git a/media/base/data_source.h b/media/base/data_source.h index 9176c8e845..dca1dd30da 100644 --- a/media/base/data_source.h +++ b/media/base/data_source.h @@ -11,24 +11,6 @@ namespace media { -class MEDIA_EXPORT DataSourceHost { - public: - // Set the total size of the media file. - virtual void SetTotalBytes(int64 total_bytes) = 0; - - // Notify the host that byte range [start,end] has been buffered. - // TODO(fischman): remove this method when demuxing is push-based instead of - // pull-based. http://crbug.com/131444 - virtual void AddBufferedByteRange(int64 start, int64 end) = 0; - - // Notify the host that time range [start,end] has been buffered. - virtual void AddBufferedTimeRange(base::TimeDelta start, - base::TimeDelta end) = 0; - - protected: - virtual ~DataSourceHost(); -}; - class MEDIA_EXPORT DataSource { public: typedef base::Callback<void(int64, int64)> StatusCallback; @@ -38,8 +20,6 @@ class MEDIA_EXPORT DataSource { DataSource(); virtual ~DataSource(); - virtual void set_host(DataSourceHost* host); - // Reads |size| bytes from |position| into |data|. And when the read is done // or failed, |read_cb| is called with the number of bytes read or // kReadError in case of error. @@ -62,12 +42,7 @@ class MEDIA_EXPORT DataSource { // Values of |bitrate| <= 0 are invalid and should be ignored. virtual void SetBitrate(int bitrate) = 0; - protected: - DataSourceHost* host(); - private: - DataSourceHost* host_; - DISALLOW_COPY_AND_ASSIGN(DataSource); }; diff --git a/media/base/demuxer.h b/media/base/demuxer.h index 9b671f007c..31c9e29de5 100644 --- a/media/base/demuxer.h +++ b/media/base/demuxer.h @@ -17,8 +17,12 @@ namespace media { class TextTrackConfig; -class MEDIA_EXPORT DemuxerHost : public DataSourceHost { +class MEDIA_EXPORT DemuxerHost { public: + // Notify the host that time range [start,end] has been buffered. + virtual void AddBufferedTimeRange(base::TimeDelta start, + base::TimeDelta end) = 0; + // Sets the duration of the media in microseconds. // Duration may be kInfiniteDuration() if the duration is not known. virtual void SetDuration(base::TimeDelta duration) = 0; diff --git a/media/base/demuxer_perftest.cc b/media/base/demuxer_perftest.cc index f63e6e4b3e..73a051b39d 100644 --- a/media/base/demuxer_perftest.cc +++ b/media/base/demuxer_perftest.cc @@ -24,13 +24,9 @@ class DemuxerHostImpl : public media::DemuxerHost { DemuxerHostImpl() {} virtual ~DemuxerHostImpl() {} - // DataSourceHost implementation. - virtual void SetTotalBytes(int64 total_bytes) OVERRIDE {} - virtual void AddBufferedByteRange(int64 start, int64 end) OVERRIDE {} + // DemuxerHost implementation. virtual void AddBufferedTimeRange(base::TimeDelta start, base::TimeDelta end) OVERRIDE {} - - // DemuxerHost implementation. virtual void SetDuration(base::TimeDelta duration) OVERRIDE {} virtual void OnDemuxerError(media::PipelineStatus error) OVERRIDE {} virtual void AddTextStream(media::DemuxerStream* text_stream, diff --git a/media/base/mock_data_source_host.cc b/media/base/mock_data_source_host.cc deleted file mode 100644 index eff0b78f16..0000000000 --- a/media/base/mock_data_source_host.cc +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) 2011 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. - -#include "media/base/mock_data_source_host.h" - -namespace media { - -MockDataSourceHost::MockDataSourceHost() {} - -MockDataSourceHost::~MockDataSourceHost() {} - -} // namespace media diff --git a/media/base/mock_data_source_host.h b/media/base/mock_data_source_host.h deleted file mode 100644 index 914d055613..0000000000 --- a/media/base/mock_data_source_host.h +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) 2012 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. -// -#ifndef MEDIA_BASE_MOCK_DATA_SOURCE_HOST_H_ -#define MEDIA_BASE_MOCK_DATA_SOURCE_HOST_H_ - -#include <string> - -#include "media/base/data_source.h" -#include "testing/gmock/include/gmock/gmock.h" - -namespace media { - -class MockDataSourceHost : public DataSourceHost { - public: - MockDataSourceHost(); - virtual ~MockDataSourceHost(); - - // DataSourceHost implementation. - MOCK_METHOD1(SetTotalBytes, void(int64 total_bytes)); - MOCK_METHOD2(AddBufferedByteRange, void(int64 start, int64 end)); - MOCK_METHOD2(AddBufferedTimeRange, void(base::TimeDelta start, - base::TimeDelta end)); - - private: - DISALLOW_COPY_AND_ASSIGN(MockDataSourceHost); -}; - -} // namespace media - -#endif // MEDIA_BASE_MOCK_DATA_SOURCE_HOST_H_ diff --git a/media/base/mock_demuxer_host.h b/media/base/mock_demuxer_host.h index 61761a84b9..f9e8e4398a 100644 --- a/media/base/mock_demuxer_host.h +++ b/media/base/mock_demuxer_host.h @@ -16,15 +16,10 @@ class MockDemuxerHost : public DemuxerHost { MockDemuxerHost(); virtual ~MockDemuxerHost(); - // DataSourceHost implementation. - MOCK_METHOD1(SetTotalBytes, void(int64 total_bytes)); - MOCK_METHOD2(AddBufferedByteRange, void(int64 start, int64 end)); MOCK_METHOD2(AddBufferedTimeRange, void(base::TimeDelta start, base::TimeDelta end)); - - // DemuxerHost implementation. - MOCK_METHOD1(OnDemuxerError, void(PipelineStatus error)); MOCK_METHOD1(SetDuration, void(base::TimeDelta duration)); + MOCK_METHOD1(OnDemuxerError, void(PipelineStatus error)); MOCK_METHOD2(AddTextStream, void(DemuxerStream*, const TextTrackConfig&)); MOCK_METHOD1(RemoveTextStream, void(DemuxerStream*)); diff --git a/media/base/pipeline.cc b/media/base/pipeline.cc index 8c0ca54431..94fa2b561a 100644 --- a/media/base/pipeline.cc +++ b/media/base/pipeline.cc @@ -39,7 +39,6 @@ Pipeline::Pipeline( media_log_(media_log), running_(false), did_loading_progress_(false), - total_bytes_(0), volume_(1.0f), playback_rate_(0.0f), clock_(new Clock(&default_tick_clock_)), @@ -161,22 +160,7 @@ TimeDelta Pipeline::GetMediaTime() const { Ranges<TimeDelta> Pipeline::GetBufferedTimeRanges() { base::AutoLock auto_lock(lock_); - Ranges<TimeDelta> time_ranges; - for (size_t i = 0; i < buffered_time_ranges_.size(); ++i) { - time_ranges.Add(buffered_time_ranges_.start(i), - buffered_time_ranges_.end(i)); - } - if (clock_->Duration() == TimeDelta() || total_bytes_ == 0) - return time_ranges; - for (size_t i = 0; i < buffered_byte_ranges_.size(); ++i) { - TimeDelta start = TimeForByteOffset_Locked(buffered_byte_ranges_.start(i)); - TimeDelta end = TimeForByteOffset_Locked(buffered_byte_ranges_.end(i)); - // Cap approximated buffered time at the length of the video. - end = std::min(end, clock_->Duration()); - time_ranges.Add(start, end); - } - - return time_ranges; + return buffered_time_ranges_; } TimeDelta Pipeline::GetMediaDuration() const { @@ -184,11 +168,6 @@ TimeDelta Pipeline::GetMediaDuration() const { return clock_->Duration(); } -int64 Pipeline::GetTotalBytes() const { - base::AutoLock auto_lock(lock_); - return total_bytes_; -} - bool Pipeline::DidLoadingProgress() const { base::AutoLock auto_lock(lock_); bool ret = did_loading_progress_; @@ -373,39 +352,6 @@ void Pipeline::SetDuration(TimeDelta duration) { duration_change_cb_.Run(); } -void Pipeline::SetTotalBytes(int64 total_bytes) { - DCHECK(IsRunning()); - media_log_->AddEvent( - media_log_->CreateStringEvent( - MediaLogEvent::TOTAL_BYTES_SET, "total_bytes", - base::Int64ToString(total_bytes))); - int64 total_mbytes = total_bytes >> 20; - if (total_mbytes > kint32max) - total_mbytes = kint32max; - UMA_HISTOGRAM_CUSTOM_COUNTS( - "Media.TotalMBytes", static_cast<int32>(total_mbytes), 1, kint32max, 50); - - base::AutoLock auto_lock(lock_); - total_bytes_ = total_bytes; -} - -TimeDelta Pipeline::TimeForByteOffset_Locked(int64 byte_offset) const { - lock_.AssertAcquired(); - // Use floating point to avoid potential overflow when using 64 bit integers. - double time_offset_in_ms = clock_->Duration().InMilliseconds() * - (static_cast<double>(byte_offset) / total_bytes_); - TimeDelta time_offset(TimeDelta::FromMilliseconds( - static_cast<int64>(time_offset_in_ms))); - // Since the byte->time calculation is approximate, fudge the beginning & - // ending areas to look better. - TimeDelta epsilon = clock_->Duration() / 100; - if (time_offset < epsilon) - return TimeDelta(); - if (time_offset + epsilon > clock_->Duration()) - return clock_->Duration(); - return time_offset; -} - void Pipeline::OnStateTransition(PipelineStatus status) { // Force post to process state transitions after current execution frame. task_runner_->PostTask(FROM_HERE, base::Bind( @@ -684,13 +630,6 @@ void Pipeline::OnStopCompleted(PipelineStatus status) { } } -void Pipeline::AddBufferedByteRange(int64 start, int64 end) { - DCHECK(IsRunning()); - base::AutoLock auto_lock(lock_); - buffered_byte_ranges_.Add(start, end); - did_loading_progress_ = true; -} - void Pipeline::AddBufferedTimeRange(base::TimeDelta start, base::TimeDelta end) { DCHECK(IsRunning()); diff --git a/media/base/pipeline.h b/media/base/pipeline.h index 4b78eb7ece..7241587693 100644 --- a/media/base/pipeline.h +++ b/media/base/pipeline.h @@ -169,10 +169,6 @@ class MEDIA_EXPORT Pipeline : public DemuxerHost { // been determined yet, then returns 0. base::TimeDelta GetMediaDuration() const; - // Get the total size of the media file. If the size has not yet been - // determined or can not be determined, this value is 0. - int64 GetTotalBytes() const; - // Return true if loading progress has been made since the last time this // method was called. bool DidLoadingProgress() const; @@ -215,13 +211,9 @@ class MEDIA_EXPORT Pipeline : public DemuxerHost { // and |seek_pending_|. void FinishSeek(); - // DataSourceHost (by way of DemuxerHost) implementation. - virtual void SetTotalBytes(int64 total_bytes) OVERRIDE; - virtual void AddBufferedByteRange(int64 start, int64 end) OVERRIDE; + // DemuxerHost implementaion. virtual void AddBufferedTimeRange(base::TimeDelta start, base::TimeDelta end) OVERRIDE; - - // DemuxerHost implementaion. virtual void SetDuration(base::TimeDelta duration) OVERRIDE; virtual void OnDemuxerError(PipelineStatus error) OVERRIDE; virtual void AddTextStream(DemuxerStream* text_stream, @@ -345,17 +337,13 @@ class MEDIA_EXPORT Pipeline : public DemuxerHost { // Whether or not the pipeline is running. bool running_; - // Amount of available buffered data. Set by filters. - Ranges<int64> buffered_byte_ranges_; + // Amount of available buffered data as reported by |demuxer_|. Ranges<base::TimeDelta> buffered_time_ranges_; - // True when AddBufferedByteRange() has been called more recently than + // True when AddBufferedTimeRange() has been called more recently than // DidLoadingProgress(). mutable bool did_loading_progress_; - // Total size of the media. Set by filters. - int64 total_bytes_; - // Current volume level (from 0.0f to 1.0f). This value is set immediately // via SetVolume() and a task is dispatched on the task runner to notify the // filters. diff --git a/media/base/pipeline_unittest.cc b/media/base/pipeline_unittest.cc index 6e5180222c..b402a6bbb1 100644 --- a/media/base/pipeline_unittest.cc +++ b/media/base/pipeline_unittest.cc @@ -38,11 +38,7 @@ using ::testing::WithArg; namespace media { -// Demuxer properties. -const int kTotalBytes = 1024; - ACTION_P(SetDemuxerProperties, duration) { - arg0->SetTotalBytes(kTotalBytes); arg0->SetDuration(duration); } @@ -372,8 +368,6 @@ TEST_F(PipelineTest, NotStarted) { EXPECT_TRUE(kZero == pipeline_->GetMediaTime()); EXPECT_EQ(0u, pipeline_->GetBufferedTimeRanges().size()); EXPECT_TRUE(kZero == pipeline_->GetMediaDuration()); - - EXPECT_EQ(0, pipeline_->GetTotalBytes()); } TEST_F(PipelineTest, NeverInitializes) { @@ -553,7 +547,6 @@ TEST_F(PipelineTest, Properties) { InitializePipeline(PIPELINE_OK); EXPECT_EQ(kDuration.ToInternalValue(), pipeline_->GetMediaDuration().ToInternalValue()); - EXPECT_EQ(kTotalBytes, pipeline_->GetTotalBytes()); EXPECT_FALSE(pipeline_->DidLoadingProgress()); } @@ -571,41 +564,18 @@ TEST_F(PipelineTest, GetBufferedTimeRanges) { EXPECT_EQ(0u, pipeline_->GetBufferedTimeRanges().size()); EXPECT_FALSE(pipeline_->DidLoadingProgress()); - pipeline_->AddBufferedByteRange(0, kTotalBytes / 8); + pipeline_->AddBufferedTimeRange(base::TimeDelta(), kDuration / 8); EXPECT_TRUE(pipeline_->DidLoadingProgress()); EXPECT_FALSE(pipeline_->DidLoadingProgress()); EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); EXPECT_EQ(base::TimeDelta(), pipeline_->GetBufferedTimeRanges().start(0)); EXPECT_EQ(kDuration / 8, pipeline_->GetBufferedTimeRanges().end(0)); - pipeline_->AddBufferedTimeRange(base::TimeDelta(), kDuration / 8); - EXPECT_EQ(base::TimeDelta(), pipeline_->GetBufferedTimeRanges().start(0)); - EXPECT_EQ(kDuration / 8, pipeline_->GetBufferedTimeRanges().end(0)); base::TimeDelta kSeekTime = kDuration / 2; ExpectSeek(kSeekTime); DoSeek(kSeekTime); - EXPECT_TRUE(pipeline_->DidLoadingProgress()); EXPECT_FALSE(pipeline_->DidLoadingProgress()); - pipeline_->AddBufferedByteRange(kTotalBytes / 2, - kTotalBytes / 2 + kTotalBytes / 8); - EXPECT_TRUE(pipeline_->DidLoadingProgress()); - EXPECT_FALSE(pipeline_->DidLoadingProgress()); - EXPECT_EQ(2u, pipeline_->GetBufferedTimeRanges().size()); - EXPECT_EQ(base::TimeDelta(), pipeline_->GetBufferedTimeRanges().start(0)); - EXPECT_EQ(kDuration / 8, pipeline_->GetBufferedTimeRanges().end(0)); - EXPECT_EQ(kDuration / 2, pipeline_->GetBufferedTimeRanges().start(1)); - EXPECT_EQ(kDuration / 2 + kDuration / 8, - pipeline_->GetBufferedTimeRanges().end(1)); - - pipeline_->AddBufferedTimeRange(kDuration / 4, 3 * kDuration / 8); - EXPECT_EQ(base::TimeDelta(), pipeline_->GetBufferedTimeRanges().start(0)); - EXPECT_EQ(kDuration / 8, pipeline_->GetBufferedTimeRanges().end(0)); - EXPECT_EQ(kDuration / 4, pipeline_->GetBufferedTimeRanges().start(1)); - EXPECT_EQ(3* kDuration / 8, pipeline_->GetBufferedTimeRanges().end(1)); - EXPECT_EQ(kDuration / 2, pipeline_->GetBufferedTimeRanges().start(2)); - EXPECT_EQ(kDuration / 2 + kDuration / 8, - pipeline_->GetBufferedTimeRanges().end(2)); } TEST_F(PipelineTest, DisableAudioRenderer) { diff --git a/media/base/sinc_resampler.cc b/media/base/sinc_resampler.cc index 1c527afe9e..d3d494dca1 100644 --- a/media/base/sinc_resampler.cc +++ b/media/base/sinc_resampler.cc @@ -153,8 +153,7 @@ SincResampler::SincResampler(double io_sample_rate_ratio, input_buffer_(static_cast<float*>( base::AlignedAlloc(sizeof(float) * input_buffer_size_, 16))), r1_(input_buffer_.get()), - r2_(input_buffer_.get() + kKernelSize / 2), - not_currently_resampling_(1) { + r2_(input_buffer_.get() + kKernelSize / 2) { CHECK_GT(request_frames_, 0); Flush(); CHECK_GT(block_size_, kKernelSize) @@ -170,10 +169,7 @@ SincResampler::SincResampler(double io_sample_rate_ratio, InitializeKernel(); } -SincResampler::~SincResampler() { - // TODO(dalecurtis): Remove debugging for http://crbug.com/295278 - CHECK(!base::AtomicRefCountDec(¬_currently_resampling_)); -} +SincResampler::~SincResampler() {} void SincResampler::UpdateRegions(bool second_load) { // Setup various region pointers in the buffer (see diagram above). If we're @@ -256,8 +252,6 @@ void SincResampler::SetRatio(double io_sample_rate_ratio) { } void SincResampler::Resample(int frames, float* destination) { - CHECK(!base::AtomicRefCountDec(¬_currently_resampling_)); - int remaining_frames = frames; // Step (1) -- Prime the input buffer at the start of the input stream. @@ -306,10 +300,8 @@ void SincResampler::Resample(int frames, float* destination) { virtual_source_idx_ += current_io_ratio; source_idx = virtual_source_idx_; - if (!--remaining_frames) { - base::AtomicRefCountInc(¬_currently_resampling_); + if (!--remaining_frames) return; - } } // Wrap back around to the start. @@ -327,8 +319,6 @@ void SincResampler::Resample(int frames, float* destination) { // Step (5) -- Refresh the buffer with more input. read_cb_.Run(request_frames_, r0_); } - - base::AtomicRefCountInc(¬_currently_resampling_); } #undef CONVOLVE_FUNC @@ -338,7 +328,6 @@ int SincResampler::ChunkSize() const { } void SincResampler::Flush() { - CHECK(base::AtomicRefCountIsOne(¬_currently_resampling_)); virtual_source_idx_ = 0; buffer_primed_ = false; memset(input_buffer_.get(), 0, diff --git a/media/base/sinc_resampler.h b/media/base/sinc_resampler.h index 2d0cdea7a6..af9a302338 100644 --- a/media/base/sinc_resampler.h +++ b/media/base/sinc_resampler.h @@ -5,7 +5,6 @@ #ifndef MEDIA_BASE_SINC_RESAMPLER_H_ #define MEDIA_BASE_SINC_RESAMPLER_H_ -#include "base/atomic_ref_count.h" #include "base/callback.h" #include "base/gtest_prod_util.h" #include "base/memory/aligned_memory.h" @@ -136,11 +135,6 @@ class MEDIA_EXPORT SincResampler { float* r3_; float* r4_; - // Atomic ref count indicating when when we're not currently resampling. Will - // be CHECK'd to find crashes... - // TODO(dalecurtis): Remove debug helpers for http://crbug.com/295278 - base::AtomicRefCount not_currently_resampling_; - DISALLOW_COPY_AND_ASSIGN(SincResampler); }; diff --git a/media/base/video_frame.cc b/media/base/video_frame.cc index 874e23a9c1..1e33fbef24 100644 --- a/media/base/video_frame.cc +++ b/media/base/video_frame.cc @@ -234,7 +234,7 @@ scoped_refptr<VideoFrame> VideoFrame::WrapVideoFrame( DCHECK(frame->visible_rect().Contains(visible_rect)); scoped_refptr<VideoFrame> wrapped_frame(new VideoFrame( frame->format(), frame->coded_size(), visible_rect, natural_size, - frame->GetTimestamp(), frame->end_of_stream())); + frame->timestamp(), frame->end_of_stream())); for (size_t i = 0; i < NumPlanes(frame->format()); ++i) { wrapped_frame->strides_[i] = frame->stride(i); diff --git a/media/base/video_frame.h b/media/base/video_frame.h index aa9c07810e..8106a2707f 100644 --- a/media/base/video_frame.h +++ b/media/base/video_frame.h @@ -212,10 +212,10 @@ class MEDIA_EXPORT VideoFrame : public base::RefCountedThreadSafe<VideoFrame> { // Returns true if this VideoFrame represents the end of the stream. bool end_of_stream() const { return end_of_stream_; } - base::TimeDelta GetTimestamp() const { + base::TimeDelta timestamp() const { return timestamp_; } - void SetTimestamp(const base::TimeDelta& timestamp) { + void set_timestamp(const base::TimeDelta& timestamp) { timestamp_ = timestamp; } diff --git a/media/base/video_frame_pool.cc b/media/base/video_frame_pool.cc index a0f8682287..800d0470f3 100644 --- a/media/base/video_frame_pool.cc +++ b/media/base/video_frame_pool.cc @@ -75,7 +75,7 @@ scoped_refptr<VideoFrame> VideoFramePool::PoolImpl::CreateFrame( pool_frame->visible_rect() == visible_rect && pool_frame->natural_size() == natural_size) { frame = pool_frame; - frame->SetTimestamp(timestamp); + frame->set_timestamp(timestamp); break; } } diff --git a/media/base/video_frame_pool_unittest.cc b/media/base/video_frame_pool_unittest.cc index 7850e04c4b..7f3694b9f6 100644 --- a/media/base/video_frame_pool_unittest.cc +++ b/media/base/video_frame_pool_unittest.cc @@ -23,7 +23,7 @@ class VideoFramePoolTest : public ::testing::Test { base::TimeDelta::FromMilliseconds(timestamp_ms)); EXPECT_EQ(format, frame->format()); EXPECT_EQ(base::TimeDelta::FromMilliseconds(timestamp_ms), - frame->GetTimestamp()); + frame->timestamp()); EXPECT_EQ(coded_size, frame->coded_size()); EXPECT_EQ(visible_rect, frame->visible_rect()); EXPECT_EQ(natural_size, frame->natural_size()); diff --git a/media/base/video_frame_unittest.cc b/media/base/video_frame_unittest.cc index 9229b6a4d1..8e7ce8f4a1 100644 --- a/media/base/video_frame_unittest.cc +++ b/media/base/video_frame_unittest.cc @@ -170,7 +170,7 @@ TEST(VideoFrame, CreateBlackFrame) { ASSERT_TRUE(frame.get()); // Test basic properties. - EXPECT_EQ(0, frame->GetTimestamp().InMicroseconds()); + EXPECT_EQ(0, frame->timestamp().InMicroseconds()); EXPECT_FALSE(frame->end_of_stream()); // Test |frame| properties. diff --git a/media/cast/OWNERS b/media/cast/OWNERS index 49f41be49c..f8e61c33cc 100644 --- a/media/cast/OWNERS +++ b/media/cast/OWNERS @@ -1,4 +1,5 @@ hclam@chromium.org hubbe@chromium.org mikhal@chromium.org +miu@chromium.org pwestin@google.com diff --git a/media/cast/audio_receiver/audio_receiver.cc b/media/cast/audio_receiver/audio_receiver.cc index b214c52c6d..5cb080205a 100644 --- a/media/cast/audio_receiver/audio_receiver.cc +++ b/media/cast/audio_receiver/audio_receiver.cc @@ -4,6 +4,8 @@ #include "media/cast/audio_receiver/audio_receiver.h" +#include <algorithm> + #include "base/bind.h" #include "base/logging.h" #include "base/message_loop/message_loop.h" @@ -11,8 +13,9 @@ #include "media/cast/transport/cast_transport_defines.h" namespace { -const int kTypicalAudioFrameDurationMs = 10; const int kMinSchedulingDelayMs = 1; +// TODO(miu): This should go in AudioReceiverConfig. +const int kTypicalAudioFrameDurationMs = 10; } // namespace namespace media { @@ -27,11 +30,13 @@ AudioReceiver::AudioReceiver(scoped_refptr<CastEnvironment> cast_environment, ReceiverRtcpEventSubscriber::kAudioEventSubscriber), codec_(audio_config.codec), frequency_(audio_config.frequency), + target_delay_delta_( + base::TimeDelta::FromMilliseconds(audio_config.rtp_max_delay_ms)), framer_(cast_environment->Clock(), - this, - audio_config.incoming_ssrc, - true, - 0), + this, + audio_config.incoming_ssrc, + true, + audio_config.rtp_max_delay_ms / kTypicalAudioFrameDurationMs), rtcp_(cast_environment, NULL, NULL, @@ -44,8 +49,6 @@ AudioReceiver::AudioReceiver(scoped_refptr<CastEnvironment> cast_environment, audio_config.rtcp_c_name), is_waiting_for_consecutive_frame_(false), weak_factory_(this) { - target_delay_delta_ = - base::TimeDelta::FromMilliseconds(audio_config.rtp_max_delay_ms); if (!audio_config.use_external_decoder) audio_decoder_.reset(new AudioDecoder(cast_environment, audio_config)); decryptor_.Initialize(audio_config.aes_key, audio_config.aes_iv_mask); @@ -56,16 +59,6 @@ AudioReceiver::AudioReceiver(scoped_refptr<CastEnvironment> cast_environment, AudioReceiver::~AudioReceiver() { DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); - - // If any callbacks for encoded audio frames are queued, flush them out now. - // This is critical because some Closures in |frame_request_queue_| may have - // Unretained references to |this|. - while (!frame_request_queue_.empty()) { - frame_request_queue_.front().Run( - make_scoped_ptr<transport::EncodedAudioFrame>(NULL), base::TimeTicks()); - frame_request_queue_.pop_front(); - } - cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber_); } @@ -81,13 +74,6 @@ void AudioReceiver::OnReceivedPayloadData(const uint8* payload_data, DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); base::TimeTicks now = cast_environment_->Clock()->NowTicks(); - frame_id_to_rtp_timestamp_[rtp_header.frame_id & 0xff] = - rtp_header.webrtc.header.timestamp; - cast_environment_->Logging()->InsertPacketEvent( - now, kAudioPacketReceived, rtp_header.webrtc.header.timestamp, - rtp_header.frame_id, rtp_header.packet_id, rtp_header.max_packet_id, - payload_size); - // TODO(pwestin): update this as video to refresh over time. if (time_first_incoming_packet_.is_null()) { InitializeTimers(); @@ -95,13 +81,24 @@ void AudioReceiver::OnReceivedPayloadData(const uint8* payload_data, time_first_incoming_packet_ = now; } + frame_id_to_rtp_timestamp_[rtp_header.frame_id & 0xff] = + rtp_header.webrtc.header.timestamp; + cast_environment_->Logging()->InsertPacketEvent( + now, kAudioPacketReceived, rtp_header.webrtc.header.timestamp, + rtp_header.frame_id, rtp_header.packet_id, rtp_header.max_packet_id, + payload_size); + bool duplicate = false; const bool complete = framer_.InsertPacket(payload_data, payload_size, rtp_header, &duplicate); if (duplicate) { cast_environment_->Logging()->InsertPacketEvent( - now, kDuplicateAudioPacketReceived, rtp_header.webrtc.header.timestamp, - rtp_header.frame_id, rtp_header.packet_id, rtp_header.max_packet_id, + now, + kDuplicateAudioPacketReceived, + rtp_header.webrtc.header.timestamp, + rtp_header.frame_id, + rtp_header.packet_id, + rtp_header.max_packet_id, payload_size); // Duplicate packets are ignored. return; @@ -197,6 +194,7 @@ void AudioReceiver::EmitAvailableEncodedFrames() { const base::TimeTicks playout_time = GetPlayoutTime(now, encoded_frame->rtp_timestamp); if (!is_consecutively_next_frame) { + // TODO(miu): Also account for expected decode time here? const base::TimeTicks earliest_possible_end_time_of_missing_frame = now + base::TimeDelta::FromMilliseconds(kTypicalAudioFrameDurationMs); if (earliest_possible_end_time_of_missing_frame < playout_time) { @@ -249,11 +247,10 @@ void AudioReceiver::EmitAvailableEncodedFramesAfterWaiting() { void AudioReceiver::IncomingPacket(scoped_ptr<Packet> packet) { DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); - bool rtcp_packet = Rtcp::IsRtcpPacket(&packet->front(), packet->size()); - if (!rtcp_packet) { - ReceivedPacket(&packet->front(), packet->size()); - } else { + if (Rtcp::IsRtcpPacket(&packet->front(), packet->size())) { rtcp_.IncomingRtcpPacket(&packet->front(), packet->size()); + } else { + ReceivedPacket(&packet->front(), packet->size()); } } @@ -271,7 +268,9 @@ void AudioReceiver::CastFeedback(const RtcpCastMessage& cast_message) { cast_environment_->Logging()->InsertFrameEvent( now, kAudioAckSent, rtp_timestamp, cast_message.ack_frame_id_); - rtcp_.SendRtcpFromRtpReceiver(&cast_message, &event_subscriber_); + ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; + event_subscriber_.GetRtcpEventsAndReset(&rtcp_events); + rtcp_.SendRtcpFromRtpReceiver(&cast_message, &rtcp_events); } base::TimeTicks AudioReceiver::GetPlayoutTime(base::TimeTicks now, @@ -341,7 +340,8 @@ void AudioReceiver::ScheduleNextRtcpReport() { time_to_send, base::TimeDelta::FromMilliseconds(kMinSchedulingDelayMs)); cast_environment_->PostDelayedTask( - CastEnvironment::MAIN, FROM_HERE, + CastEnvironment::MAIN, + FROM_HERE, base::Bind(&AudioReceiver::SendNextRtcpReport, weak_factory_.GetWeakPtr()), time_to_send); @@ -365,7 +365,8 @@ void AudioReceiver::ScheduleNextCastMessage() { time_to_send = std::max( time_to_send, base::TimeDelta::FromMilliseconds(kMinSchedulingDelayMs)); cast_environment_->PostDelayedTask( - CastEnvironment::MAIN, FROM_HERE, + CastEnvironment::MAIN, + FROM_HERE, base::Bind(&AudioReceiver::SendNextCastMessage, weak_factory_.GetWeakPtr()), time_to_send); @@ -373,8 +374,7 @@ void AudioReceiver::ScheduleNextCastMessage() { void AudioReceiver::SendNextCastMessage() { DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); - // Will only send a message if it is time. - framer_.SendCastMessage(); + framer_.SendCastMessage(); // Will only send a message if it is time. ScheduleNextCastMessage(); } diff --git a/media/cast/audio_receiver/audio_receiver.h b/media/cast/audio_receiver/audio_receiver.h index feed5e98ca..6aae1361af 100644 --- a/media/cast/audio_receiver/audio_receiver.h +++ b/media/cast/audio_receiver/audio_receiver.h @@ -31,16 +31,25 @@ class AudioDecoder; // AudioReceiver receives packets out-of-order while clients make requests for // complete frames in-order. (A frame consists of one or more packets.) -// AudioReceiver also includes logic for mapping RTP timestamps to the local -// base::TimeTicks clock for each frame. +// +// AudioReceiver also includes logic for computing the playout time for each +// frame, accounting for a constant targeted playout delay. The purpose of the +// playout delay is to provide a fixed window of time between the capture event +// on the sender and the playout on the receiver. This is important because +// each step of the pipeline (i.e., encode frame, then transmit/retransmit from +// the sender, then receive and re-order packets on the receiver, then decode +// frame) can vary in duration and is typically very hard to predict. +// Heuristics will determine when the targeted playout delay is insufficient in +// the current environment; and the receiver can then increase the playout +// delay, notifying the sender, to account for the extra variance. +// TODO(miu): Make the last sentence true. http://crbug.com/360111 // // Two types of frames can be requested: 1) A frame of decoded audio data; or 2) // a frame of still-encoded audio data, to be passed into an external audio // decoder. Each request for a frame includes a callback which AudioReceiver -// guarantees will be called at some point in the future. Clients should -// generally limit the number of outstanding requests (perhaps to just one or -// two). When AudioReceiver is destroyed, any outstanding requests will be -// immediately invoked with a NULL frame. +// guarantees will be called at some point in the future unless the +// AudioReceiver is destroyed. Clients should generally limit the number of +// outstanding requests (perhaps to just one or two). // // This class is not thread safe. Should only be called from the Main cast // thread. @@ -63,7 +72,7 @@ class AudioReceiver : public RtpReceiver, // even if to respond with NULL at shutdown time. void GetRawAudioFrame(const AudioFrameDecodedCallback& callback); - // Extract an encoded audio frame from the cast receiver. + // Request an encoded audio frame. // // The given |callback| is guaranteed to be run at some point in the future, // even if to respond with NULL at shutdown time. diff --git a/media/cast/audio_receiver/audio_receiver_unittest.cc b/media/cast/audio_receiver/audio_receiver_unittest.cc index bf2c39c5d7..c9f3ebac92 100644 --- a/media/cast/audio_receiver/audio_receiver_unittest.cc +++ b/media/cast/audio_receiver/audio_receiver_unittest.cc @@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include <stdint.h> - #include "base/bind.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" @@ -20,15 +18,19 @@ namespace media { namespace cast { -static const int64 kStartMillisecond = INT64_C(12345678900000); +using ::testing::_; namespace { + +const int64 kStartMillisecond = INT64_C(12345678900000); +const uint32 kFirstFrameId = 1234; + class FakeAudioClient { public: FakeAudioClient() : num_called_(0) {} virtual ~FakeAudioClient() {} - void SetNextExpectedResult(uint8 expected_frame_id, + void SetNextExpectedResult(uint32 expected_frame_id, const base::TimeTicks& expected_playout_time) { expected_frame_id_ = expected_frame_id; expected_playout_time_ = expected_playout_time; @@ -49,11 +51,12 @@ class FakeAudioClient { private: int num_called_; - uint8 expected_frame_id_; + uint32 expected_frame_id_; base::TimeTicks expected_playout_time_; DISALLOW_COPY_AND_ASSIGN(FakeAudioClient); }; + } // namespace class AudioReceiverTest : public ::testing::Test { @@ -64,7 +67,7 @@ class AudioReceiverTest : public ::testing::Test { audio_config_.frequency = 16000; audio_config_.channels = 1; audio_config_.codec = transport::kPcm16; - audio_config_.use_external_decoder = false; + audio_config_.use_external_decoder = true; audio_config_.feedback_ssrc = 1234; testing_clock_ = new base::SimpleTestTickClock(); testing_clock_->Advance( @@ -76,10 +79,7 @@ class AudioReceiverTest : public ::testing::Test { task_runner_, task_runner_, task_runner_); - } - void Configure(bool use_external_decoder) { - audio_config_.use_external_decoder = use_external_decoder; receiver_.reset(new AudioReceiver(cast_environment_, audio_config_, &mock_transport_)); } @@ -89,7 +89,7 @@ class AudioReceiverTest : public ::testing::Test { virtual void SetUp() { payload_.assign(kMaxIpPacketSize, 0); rtp_header_.is_key_frame = true; - rtp_header_.frame_id = 0; + rtp_header_.frame_id = kFirstFrameId; rtp_header_.packet_id = 0; rtp_header_.max_packet_id = 0; rtp_header_.is_reference = false; @@ -116,12 +116,11 @@ class AudioReceiverTest : public ::testing::Test { scoped_ptr<AudioReceiver> receiver_; }; -TEST_F(AudioReceiverTest, GetOnePacketEncodedframe) { +TEST_F(AudioReceiverTest, GetOnePacketEncodedFrame) { SimpleEventSubscriber event_subscriber; cast_environment_->Logging()->AddRawEventSubscriber(&event_subscriber); - Configure(true); - EXPECT_CALL(mock_transport_, SendRtcpPacket(testing::_)).Times(1); + EXPECT_CALL(mock_transport_, SendRtcpPacket(_)).Times(1); // Enqueue a request for an audio frame. receiver_->GetEncodedAudioFrame( @@ -133,7 +132,8 @@ TEST_F(AudioReceiverTest, GetOnePacketEncodedframe) { EXPECT_EQ(0, fake_audio_client_.number_times_called()); // Deliver one audio frame to the receiver and expect to get one frame back. - fake_audio_client_.SetNextExpectedResult(0, testing_clock_->NowTicks()); + fake_audio_client_.SetNextExpectedResult(kFirstFrameId, + testing_clock_->NowTicks()); FeedOneFrameIntoReceiver(); task_runner_->RunTasks(); EXPECT_EQ(1, fake_audio_client_.number_times_called()); @@ -151,8 +151,7 @@ TEST_F(AudioReceiverTest, GetOnePacketEncodedframe) { } TEST_F(AudioReceiverTest, MultiplePendingGetCalls) { - Configure(true); - EXPECT_CALL(mock_transport_, SendRtcpPacket(testing::_)) + EXPECT_CALL(mock_transport_, SendRtcpPacket(_)) .WillRepeatedly(testing::Return(true)); // Enqueue a request for an audio frame. @@ -164,7 +163,8 @@ TEST_F(AudioReceiverTest, MultiplePendingGetCalls) { EXPECT_EQ(0, fake_audio_client_.number_times_called()); // Receive one audio frame and expect to see the first request satisfied. - fake_audio_client_.SetNextExpectedResult(0, testing_clock_->NowTicks()); + fake_audio_client_.SetNextExpectedResult(kFirstFrameId, + testing_clock_->NowTicks()); FeedOneFrameIntoReceiver(); task_runner_->RunTasks(); EXPECT_EQ(1, fake_audio_client_.number_times_called()); @@ -190,12 +190,13 @@ TEST_F(AudioReceiverTest, MultiplePendingGetCalls) { // Receive one audio frame out-of-order: Make sure that we are not continuous // and that the RTP timestamp represents a time in the future. rtp_header_.is_key_frame = false; - rtp_header_.frame_id = 2; + rtp_header_.frame_id = kFirstFrameId + 2; rtp_header_.is_reference = true; rtp_header_.reference_frame_id = 0; rtp_header_.webrtc.header.timestamp = 960; fake_audio_client_.SetNextExpectedResult( - 2, testing_clock_->NowTicks() + base::TimeDelta::FromMilliseconds(100)); + kFirstFrameId + 2, + testing_clock_->NowTicks() + base::TimeDelta::FromMilliseconds(100)); FeedOneFrameIntoReceiver(); // Frame 2 should not come out at this point in time. @@ -214,11 +215,12 @@ TEST_F(AudioReceiverTest, MultiplePendingGetCalls) { EXPECT_EQ(2, fake_audio_client_.number_times_called()); // Receive Frame 3 and expect it to fulfill the third request immediately. - rtp_header_.frame_id = 3; + rtp_header_.frame_id = kFirstFrameId + 3; rtp_header_.is_reference = false; rtp_header_.reference_frame_id = 0; rtp_header_.webrtc.header.timestamp = 1280; - fake_audio_client_.SetNextExpectedResult(3, testing_clock_->NowTicks()); + fake_audio_client_.SetNextExpectedResult(kFirstFrameId + 3, + testing_clock_->NowTicks()); FeedOneFrameIntoReceiver(); task_runner_->RunTasks(); EXPECT_EQ(3, fake_audio_client_.number_times_called()); diff --git a/media/cast/cast.gyp b/media/cast/cast.gyp index b8ef6cdcbf..401dbea345 100644 --- a/media/cast/cast.gyp +++ b/media/cast/cast.gyp @@ -65,7 +65,6 @@ 'rtp_receiver/receiver_stats_unittest.cc', 'rtp_receiver/rtp_parser/test/rtp_packet_builder.cc', 'rtp_receiver/rtp_parser/rtp_parser_unittest.cc', - 'test/encode_decode_test.cc', 'test/end2end_unittest.cc', 'test/fake_single_thread_task_runner.cc', 'test/fake_single_thread_task_runner.h', diff --git a/media/cast/cast_config.cc b/media/cast/cast_config.cc index 85231407ad..14e3795248 100644 --- a/media/cast/cast_config.cc +++ b/media/cast/cast_config.cc @@ -7,6 +7,20 @@ namespace media { namespace cast { +// TODO(miu): Revisit code factoring of these structs. There are a number of +// common elements between them all, so it might be reasonable to only have one +// or two structs; or, at least a common base class. + +// TODO(miu): Make sure all POD members are initialized by ctors. Policy +// decision: Reasonable defaults or use invalid placeholder values to expose +// unset members? + +// TODO(miu): Provide IsValidConfig() functions? + +// TODO(miu): Throughout the code, there is a lot of copy-and-paste of the same +// calculations based on these config values. So, why don't we add methods to +// these classes to centralize the logic? + VideoSenderConfig::VideoSenderConfig() : sender_ssrc(0), incoming_feedback_ssrc(0), @@ -16,10 +30,15 @@ VideoSenderConfig::VideoSenderConfig() width(0), height(0), congestion_control_back_off(kDefaultCongestionControlBackOff), + max_bitrate(5000000), + min_bitrate(1000000), + start_bitrate(5000000), max_qp(kDefaultMaxQp), min_qp(kDefaultMinQp), max_frame_rate(kDefaultMaxFrameRate), - max_number_of_video_buffers_used(kDefaultNumberOfVideoBuffers) {} + max_number_of_video_buffers_used(kDefaultNumberOfVideoBuffers), + codec(transport::kVp8), + number_of_encode_threads(1) {} AudioSenderConfig::AudioSenderConfig() : sender_ssrc(0), @@ -51,10 +70,8 @@ VideoReceiverConfig::VideoReceiverConfig() rtp_payload_type(0), use_external_decoder(false), max_frame_rate(kDefaultMaxFrameRate), - decoder_faster_than_max_frame_rate(true) {} - -PcmAudioFrame::PcmAudioFrame() {} -PcmAudioFrame::~PcmAudioFrame() {} + decoder_faster_than_max_frame_rate(true), + codec(transport::kVp8) {} } // namespace cast } // namespace media diff --git a/media/cast/cast_config.h b/media/cast/cast_config.h index 88bbdbca38..22f5a6432e 100644 --- a/media/cast/cast_config.h +++ b/media/cast/cast_config.h @@ -71,7 +71,7 @@ struct VideoSenderConfig { int max_frame_rate; int max_number_of_video_buffers_used; // Max value depend on codec. transport::VideoCodec codec; - int number_of_cores; + int number_of_encode_threads; }; struct AudioReceiverConfig { @@ -123,17 +123,6 @@ struct VideoReceiverConfig { std::string aes_iv_mask; // Binary string of size kAesKeySize. }; -// DEPRECATED: Do not use in new code. Please migrate existing code to use -// media::AudioBus. -struct PcmAudioFrame { - PcmAudioFrame(); - ~PcmAudioFrame(); - - int channels; // Samples in interleaved stereo format. L0, R0, L1 ,R1 ,... - int frequency; - std::vector<int16> samples; -}; - // import from media::cast::transport typedef transport::Packet Packet; typedef transport::PacketList PacketList; diff --git a/media/cast/cast_defines.h b/media/cast/cast_defines.h index 802df18515..b0f9370186 100644 --- a/media/cast/cast_defines.h +++ b/media/cast/cast_defines.h @@ -40,6 +40,7 @@ enum CastInitializationStatus { STATUS_INVALID_CAST_ENVIRONMENT, STATUS_INVALID_CRYPTO_CONFIGURATION, STATUS_UNSUPPORTED_AUDIO_CODEC, + STATUS_UNSUPPORTED_VIDEO_CODEC, STATUS_INVALID_AUDIO_CONFIGURATION, STATUS_INVALID_VIDEO_CONFIGURATION, STATUS_GPU_ACCELERATION_NOT_SUPPORTED, diff --git a/media/cast/cast_environment.h b/media/cast/cast_environment.h index e9d1eb4bc9..1549747ee2 100644 --- a/media/cast/cast_environment.h +++ b/media/cast/cast_environment.h @@ -79,13 +79,12 @@ class CastEnvironment : public base::RefCountedThreadSafe<CastEnvironment> { scoped_refptr<base::SingleThreadTaskRunner> main_thread_proxy_; scoped_refptr<base::SingleThreadTaskRunner> audio_thread_proxy_; scoped_refptr<base::SingleThreadTaskRunner> video_thread_proxy_; + scoped_ptr<base::TickClock> clock_; + scoped_ptr<LoggingImpl> logging_; private: friend class base::RefCountedThreadSafe<CastEnvironment>; - scoped_ptr<base::TickClock> clock_; - scoped_ptr<LoggingImpl> logging_; - DISALLOW_COPY_AND_ASSIGN(CastEnvironment); }; diff --git a/media/cast/cast_receiver.h b/media/cast/cast_receiver.h index b88827cb7a..fa6adace98 100644 --- a/media/cast/cast_receiver.h +++ b/media/cast/cast_receiver.h @@ -26,30 +26,27 @@ namespace transport { class PacketSender; } -// Callback in which the raw audio frame, play-out time, and a continuity flag -// will be returned. |is_continuous| will be false to indicate the loss of -// audio data due to a loss of frames (or decoding errors). This allows the -// client to take steps to smooth discontinuities for playback. Note: A NULL -// AudioBus can be returned when data is not available (e.g., bad packet or when -// flushing callbacks during shutdown). +// The following callbacks are used to deliver decoded audio/video frame data, +// the frame's corresponding play-out time, and a continuity flag. +// |is_continuous| will be false to indicate the loss of data due to a loss of +// frames (or decoding errors). This allows the client to take steps to smooth +// discontinuities for playback. Note: A NULL pointer can be returned when data +// is not available (e.g., bad/missing packet). typedef base::Callback<void(scoped_ptr<AudioBus> audio_bus, const base::TimeTicks& playout_time, bool is_continuous)> AudioFrameDecodedCallback; +// TODO(miu): |video_frame| includes a timestamp, so use that instead. +typedef base::Callback<void(const scoped_refptr<media::VideoFrame>& video_frame, + const base::TimeTicks& playout_time, + bool is_continuous)> VideoFrameDecodedCallback; -// Callback in which the encoded audio frame and play-out time will be -// returned. The client should examine the EncodedAudioFrame::frame_id field to -// determine whether any frames have been dropped (i.e., frame_id should be -// incrementing by one each time). Note: A NULL EncodedAudioFrame can be -// returned on error/shutdown. +// The following callbacks deliver still-encoded audio/video frame data, along +// with the frame's corresponding play-out time. The client should examine the +// EncodedXXXFrame::frame_id field to determine whether any frames have been +// dropped (i.e., frame_id should be incrementing by one each time). Note: A +// NULL pointer can be returned on error. typedef base::Callback<void(scoped_ptr<transport::EncodedAudioFrame>, const base::TimeTicks&)> AudioFrameEncodedCallback; - -// Callback in which the raw frame and render time will be returned once -// decoding is complete. -typedef base::Callback<void(const scoped_refptr<media::VideoFrame>& video_frame, - const base::TimeTicks&)> VideoFrameDecodedCallback; - -// Callback in which the encoded video frame and render time will be returned. typedef base::Callback<void(scoped_ptr<transport::EncodedVideoFrame>, const base::TimeTicks&)> VideoFrameEncodedCallback; diff --git a/media/cast/cast_receiver_impl.cc b/media/cast/cast_receiver_impl.cc index 2712d7a1d1..b38cd99667 100644 --- a/media/cast/cast_receiver_impl.cc +++ b/media/cast/cast_receiver_impl.cc @@ -92,9 +92,7 @@ CastReceiverImpl::CastReceiverImpl( audio_receiver_(cast_environment, audio_config, &pacer_), video_receiver_(cast_environment, video_config, - &pacer_, - base::Bind(&CastReceiverImpl::UpdateTargetDelay, - base::Unretained(this))), + &pacer_), frame_receiver_(new LocalFrameReceiver(cast_environment, &audio_receiver_, &video_receiver_)), @@ -140,10 +138,6 @@ void CastReceiverImpl::ReceivedPacket(scoped_ptr<Packet> packet) { } } -void CastReceiverImpl::UpdateTargetDelay(base::TimeDelta target_delay_ms) { - audio_receiver_.SetTargetDelay(target_delay_ms); -} - transport::PacketReceiverCallback CastReceiverImpl::packet_receiver() { return base::Bind(&CastReceiverImpl::ReceivedPacket, base::Unretained(this)); } diff --git a/media/cast/cast_receiver_impl.h b/media/cast/cast_receiver_impl.h index 231aa78f12..1fcb355f52 100644 --- a/media/cast/cast_receiver_impl.h +++ b/media/cast/cast_receiver_impl.h @@ -37,7 +37,6 @@ class CastReceiverImpl : public CastReceiver { private: void ReceivedPacket(scoped_ptr<Packet> packet); - void UpdateTargetDelay(base::TimeDelta target_delay_ms); transport::PacedSender pacer_; AudioReceiver audio_receiver_; diff --git a/media/cast/cast_sender_impl.cc b/media/cast/cast_sender_impl.cc index 0b5a2ac1e6..2bcad36cce 100644 --- a/media/cast/cast_sender_impl.cc +++ b/media/cast/cast_sender_impl.cc @@ -118,6 +118,7 @@ void CastSenderImpl::InitializeVideo( DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); CHECK(video_config.use_external_encoder || cast_environment_->HasVideoThread()); + VLOG(1) << "CastSender::ctor"; video_sender_.reset(new VideoSender(cast_environment_, video_config, @@ -131,7 +132,9 @@ void CastSenderImpl::InitializeVideo( new LocalVideoFrameInput(cast_environment_, video_sender_->AsWeakPtr()); } -CastSenderImpl::~CastSenderImpl() {} +CastSenderImpl::~CastSenderImpl() { + VLOG(1) << "CastSender::dtor"; +} // ReceivedPacket handle the incoming packets to the cast sender // it's only expected to receive RTCP feedback packets from the remote cast diff --git a/media/cast/logging/logging_defines.h b/media/cast/logging/logging_defines.h index 02eeec7828..348034558b 100644 --- a/media/cast/logging/logging_defines.h +++ b/media/cast/logging/logging_defines.h @@ -35,8 +35,8 @@ enum CastLoggingEvent { kAudioFrameCaptured, kAudioFrameEncoded, // Audio receiver. - kAudioPlayoutDelay, kAudioFrameDecoded, + kAudioPlayoutDelay, // Video sender. kVideoFrameCaptured, kVideoFrameReceived, diff --git a/media/cast/rtcp/receiver_rtcp_event_subscriber.cc b/media/cast/rtcp/receiver_rtcp_event_subscriber.cc index e23783c6b7..d16aacd47d 100644 --- a/media/cast/rtcp/receiver_rtcp_event_subscriber.cc +++ b/media/cast/rtcp/receiver_rtcp_event_subscriber.cc @@ -79,6 +79,14 @@ void ReceiverRtcpEventSubscriber::OnReceiveGenericEvent( // Do nothing as RTP receiver is not interested in generic events for RTCP. } +void ReceiverRtcpEventSubscriber::GetRtcpEventsAndReset( + RtcpEventMultiMap* rtcp_events) { + DCHECK(thread_checker_.CalledOnValidThread()); + DCHECK(rtcp_events); + rtcp_events->swap(rtcp_events_); + rtcp_events_.clear(); +} + void ReceiverRtcpEventSubscriber::TruncateMapIfNeeded() { // If map size has exceeded |max_size_to_retain_|, remove entry with // the smallest RTP timestamp. diff --git a/media/cast/rtcp/receiver_rtcp_event_subscriber.h b/media/cast/rtcp/receiver_rtcp_event_subscriber.h index 4a98735146..665ffcfd0d 100644 --- a/media/cast/rtcp/receiver_rtcp_event_subscriber.h +++ b/media/cast/rtcp/receiver_rtcp_event_subscriber.h @@ -55,7 +55,9 @@ class ReceiverRtcpEventSubscriber : public RawEventSubscriber { virtual void OnReceiveGenericEvent(const GenericEvent& generic_event) OVERRIDE; - const RtcpEventMultiMap& get_rtcp_events() const { return rtcp_events_; } + // Assigns events collected to |rtcp_events| and clears them from this + // object. + void GetRtcpEventsAndReset(RtcpEventMultiMap* rtcp_events); private: // If |rtcp_events_.size()| exceeds |max_size_to_retain_|, remove an oldest diff --git a/media/cast/rtcp/receiver_rtcp_event_subscriber_unittest.cc b/media/cast/rtcp/receiver_rtcp_event_subscriber_unittest.cc index 41411c3586..5b86879643 100644 --- a/media/cast/rtcp/receiver_rtcp_event_subscriber_unittest.cc +++ b/media/cast/rtcp/receiver_rtcp_event_subscriber_unittest.cc @@ -95,14 +95,18 @@ TEST_F(ReceiverRtcpEventSubscriberTest, LogVideoEvents) { Init(ReceiverRtcpEventSubscriber::kVideoEventSubscriber); InsertEvents(); - EXPECT_EQ(3u, event_subscriber_->get_rtcp_events().size()); + ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; + event_subscriber_->GetRtcpEventsAndReset(&rtcp_events); + EXPECT_EQ(3u, rtcp_events.size()); } TEST_F(ReceiverRtcpEventSubscriberTest, LogAudioEvents) { Init(ReceiverRtcpEventSubscriber::kAudioEventSubscriber); InsertEvents(); - EXPECT_EQ(3u, event_subscriber_->get_rtcp_events().size()); + ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; + event_subscriber_->GetRtcpEventsAndReset(&rtcp_events); + EXPECT_EQ(3u, rtcp_events.size()); } TEST_F(ReceiverRtcpEventSubscriberTest, DropEventsWhenSizeExceeded) { @@ -113,7 +117,10 @@ TEST_F(ReceiverRtcpEventSubscriberTest, DropEventsWhenSizeExceeded) { testing_clock_->NowTicks(), kVideoFrameDecoded, /*rtp_timestamp*/ i * 10, /*frame_id*/ i); } - EXPECT_EQ(10u, event_subscriber_->get_rtcp_events().size()); + + ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; + event_subscriber_->GetRtcpEventsAndReset(&rtcp_events); + EXPECT_EQ(10u, rtcp_events.size()); } } // namespace cast diff --git a/media/cast/rtcp/rtcp.cc b/media/cast/rtcp/rtcp.cc index c5fbbadc42..a8842f100d 100644 --- a/media/cast/rtcp/rtcp.cc +++ b/media/cast/rtcp/rtcp.cc @@ -230,7 +230,7 @@ void Rtcp::IncomingRtcpPacket(const uint8* rtcp_buffer, size_t length) { void Rtcp::SendRtcpFromRtpReceiver( const RtcpCastMessage* cast_message, - const ReceiverRtcpEventSubscriber* event_subscriber) { + const ReceiverRtcpEventSubscriber::RtcpEventMultiMap* rtcp_events) { DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); uint32 packet_type_flags = 0; @@ -247,7 +247,7 @@ void Rtcp::SendRtcpFromRtpReceiver( if (cast_message) { packet_type_flags |= transport::kRtcpCast; } - if (event_subscriber) { + if (rtcp_events) { packet_type_flags |= transport::kRtcpReceiverLog; } if (rtcp_mode_ == kRtcpCompound || now >= next_time_to_send_rtcp_) { @@ -279,9 +279,12 @@ void Rtcp::SendRtcpFromRtpReceiver( } UpdateNextTimeToSendRtcp(); } - rtcp_sender_->SendRtcpFromRtpReceiver( - packet_type_flags, &report_block, &rrtr, cast_message, event_subscriber, - target_delay_ms_); + rtcp_sender_->SendRtcpFromRtpReceiver(packet_type_flags, + &report_block, + &rrtr, + cast_message, + rtcp_events, + target_delay_ms_); } void Rtcp::SendRtcpFromRtpSender( diff --git a/media/cast/rtcp/rtcp.h b/media/cast/rtcp/rtcp.h index 30a155dbd2..15bbe1138c 100644 --- a/media/cast/rtcp/rtcp.h +++ b/media/cast/rtcp/rtcp.h @@ -18,6 +18,7 @@ #include "media/cast/cast_config.h" #include "media/cast/cast_defines.h" #include "media/cast/cast_environment.h" +#include "media/cast/rtcp/receiver_rtcp_event_subscriber.h" #include "media/cast/rtcp/rtcp_defines.h" #include "media/cast/transport/cast_transport_defines.h" #include "media/cast/transport/cast_transport_sender.h" @@ -29,7 +30,6 @@ namespace cast { class LocalRtcpReceiverFeedback; class LocalRtcpRttFeedback; class PacedPacketSender; -class ReceiverRtcpEventSubscriber; class RtcpReceiver; class RtcpSender; @@ -87,13 +87,13 @@ class Rtcp { const transport::RtcpSenderLogMessage& sender_log_message, transport::RtcpSenderInfo sender_info); - // |cast_message| and |event_subscriber| is optional; if |cast_message| is + // |cast_message| and |rtcp_events| is optional; if |cast_message| is // provided the RTCP receiver report will append a Cast message containing - // Acks and Nacks; if |event_subscriber| is provided the RTCP receiver report - // will append the log messages from the subscriber. + // Acks and Nacks; if |rtcp_events| is provided the RTCP receiver report + // will append the log messages. void SendRtcpFromRtpReceiver( const RtcpCastMessage* cast_message, - const ReceiverRtcpEventSubscriber* event_subscriber); + const ReceiverRtcpEventSubscriber::RtcpEventMultiMap* rtcp_events); void IncomingRtcpPacket(const uint8* rtcp_buffer, size_t length); bool Rtt(base::TimeDelta* rtt, diff --git a/media/cast/rtcp/rtcp_receiver.cc b/media/cast/rtcp/rtcp_receiver.cc index 14873d7463..7a76139ed9 100644 --- a/media/cast/rtcp/rtcp_receiver.cc +++ b/media/cast/rtcp/rtcp_receiver.cc @@ -529,8 +529,9 @@ void RtcpReceiver::HandleApplicationSpecificCastReceiverEventLog( event_log.type = event_type; event_log.event_timestamp = event_timestamp; event_log.delay_delta = base::TimeDelta::FromMilliseconds( - rtcp_field.cast_receiver_log.delay_delta_or_packet_id); - event_log.packet_id = rtcp_field.cast_receiver_log.delay_delta_or_packet_id; + rtcp_field.cast_receiver_log.delay_delta_or_packet_id.delay_delta); + event_log.packet_id = + rtcp_field.cast_receiver_log.delay_delta_or_packet_id.packet_id; event_log_messages->push_back(event_log); } diff --git a/media/cast/rtcp/rtcp_sender.cc b/media/cast/rtcp/rtcp_sender.cc index 11759457b5..d723f72d6d 100644 --- a/media/cast/rtcp/rtcp_sender.cc +++ b/media/cast/rtcp/rtcp_sender.cc @@ -77,88 +77,31 @@ bool EventTimestampLessThan(const RtcpReceiverEventLogMessage& lhs, return lhs.event_timestamp < rhs.event_timestamp; } -bool BuildRtcpReceiverLogMessage( - const ReceiverRtcpEventSubscriber::RtcpEventMultiMap& rtcp_events, - size_t start_size, +void AddReceiverLog( + const RtcpReceiverLogMessage& redundancy_receiver_log_message, RtcpReceiverLogMessage* receiver_log_message, + size_t* remaining_space, size_t* number_of_frames, - size_t* total_number_of_messages_to_send, - size_t* rtcp_log_size) { - size_t remaining_space = - std::min(kMaxReceiverLogBytes, kMaxIpPacketSize - start_size); - if (remaining_space < kRtcpCastLogHeaderSize + kRtcpReceiverFrameLogSize + - kRtcpReceiverEventLogSize) { - return false; - } - - // We use this to do event timestamp sorting and truncating for events of - // a single frame. - std::vector<RtcpReceiverEventLogMessage> sorted_log_messages; - - // Account for the RTCP header for an application-defined packet. - remaining_space -= kRtcpCastLogHeaderSize; - - ReceiverRtcpEventSubscriber::RtcpEventMultiMap::const_reverse_iterator rit = - rtcp_events.rbegin(); - - while (rit != rtcp_events.rend() && - remaining_space >= + size_t* total_number_of_messages_to_send) { + RtcpReceiverLogMessage::const_iterator it = + redundancy_receiver_log_message.begin(); + while (it != redundancy_receiver_log_message.end() && + *remaining_space >= kRtcpReceiverFrameLogSize + kRtcpReceiverEventLogSize) { - const RtpTimestamp rtp_timestamp = rit->first; - RtcpReceiverFrameLogMessage frame_log(rtp_timestamp); - remaining_space -= kRtcpReceiverFrameLogSize; + receiver_log_message->push_front(*it); + size_t num_event_logs = (*remaining_space - kRtcpReceiverFrameLogSize) / + kRtcpReceiverEventLogSize; + RtcpReceiverEventLogMessages& event_log_messages = + receiver_log_message->front().event_log_messages_; + if (num_event_logs < event_log_messages.size()) + event_log_messages.resize(num_event_logs); + + *remaining_space -= kRtcpReceiverFrameLogSize + + event_log_messages.size() * kRtcpReceiverEventLogSize; ++*number_of_frames; - - // Get all events of a single frame. - sorted_log_messages.clear(); - do { - RtcpReceiverEventLogMessage event_log_message; - event_log_message.type = rit->second.type; - event_log_message.event_timestamp = rit->second.timestamp; - event_log_message.delay_delta = rit->second.delay_delta; - event_log_message.packet_id = rit->second.packet_id; - sorted_log_messages.push_back(event_log_message); - ++rit; - } while (rit != rtcp_events.rend() && rit->first == rtp_timestamp); - - std::sort(sorted_log_messages.begin(), - sorted_log_messages.end(), - &EventTimestampLessThan); - - // From |sorted_log_messages|, only take events that are no greater than - // |kMaxWireFormatTimeDeltaMs| seconds away from the latest event. Events - // older than that cannot be encoded over the wire. - std::vector<RtcpReceiverEventLogMessage>::reverse_iterator sorted_rit = - sorted_log_messages.rbegin(); - base::TimeTicks first_event_timestamp = sorted_rit->event_timestamp; - size_t events_in_frame = 0; - while (sorted_rit != sorted_log_messages.rend() && - events_in_frame < kRtcpMaxReceiverLogMessages && - remaining_space >= kRtcpReceiverEventLogSize) { - base::TimeDelta delta(first_event_timestamp - - sorted_rit->event_timestamp); - if (delta.InMilliseconds() > kMaxWireFormatTimeDeltaMs) - break; - frame_log.event_log_messages_.push_front(*sorted_rit); - ++events_in_frame; - ++*total_number_of_messages_to_send; - remaining_space -= kRtcpReceiverEventLogSize; - ++sorted_rit; - } - - receiver_log_message->push_front(frame_log); + *total_number_of_messages_to_send += event_log_messages.size(); + ++it; } - - *rtcp_log_size = - kRtcpCastLogHeaderSize + *number_of_frames * kRtcpReceiverFrameLogSize + - *total_number_of_messages_to_send * kRtcpReceiverEventLogSize; - DCHECK_GE(kMaxIpPacketSize, start_size + *rtcp_log_size) - << "Not enough buffer space."; - - VLOG(3) << "number of frames: " << *number_of_frames; - VLOG(3) << "total messages to send: " << *total_number_of_messages_to_send; - VLOG(3) << "rtcp log size: " << *rtcp_log_size; - return *number_of_frames > 0; } // A class to build a string representing the NACK list in Cast message. @@ -247,17 +190,12 @@ RtcpSender::RtcpSender(scoped_refptr<CastEnvironment> cast_environment, RtcpSender::~RtcpSender() {} -// static -bool RtcpSender::IsReceiverEvent(const CastLoggingEvent& event) { - return ConvertEventTypeToWireFormat(event) != 0; -} - void RtcpSender::SendRtcpFromRtpReceiver( uint32 packet_type_flags, const transport::RtcpReportBlock* report_block, const RtcpReceiverReferenceTimeReport* rrtr, const RtcpCastMessage* cast_message, - const ReceiverRtcpEventSubscriber* event_subscriber, + const ReceiverRtcpEventSubscriber::RtcpEventMultiMap* rtcp_events, uint16 target_delay_ms) { if (packet_type_flags & transport::kRtcpSr || packet_type_flags & transport::kRtcpDlrr || @@ -292,8 +230,8 @@ void RtcpSender::SendRtcpFromRtpReceiver( BuildCast(cast_message, target_delay_ms, &packet); } if (packet_type_flags & transport::kRtcpReceiverLog) { - DCHECK(event_subscriber) << "Invalid argument"; - BuildReceiverLog(event_subscriber->get_rtcp_events(), &packet); + DCHECK(rtcp_events) << "Invalid argument"; + BuildReceiverLog(*rtcp_events, &packet); } if (packet.empty()) @@ -716,7 +654,7 @@ void RtcpSender::BuildCast(const RtcpCastMessage* cast, void RtcpSender::BuildReceiverLog( const ReceiverRtcpEventSubscriber::RtcpEventMultiMap& rtcp_events, - Packet* packet) const { + Packet* packet) { const size_t packet_start_size = packet->size(); size_t number_of_frames = 0; size_t total_number_of_messages_to_send = 0; @@ -808,5 +746,119 @@ void RtcpSender::BuildReceiverLog( DCHECK_EQ(total_number_of_messages_to_send, 0u); } +bool RtcpSender::BuildRtcpReceiverLogMessage( + const ReceiverRtcpEventSubscriber::RtcpEventMultiMap& rtcp_events, + size_t start_size, + RtcpReceiverLogMessage* receiver_log_message, + size_t* number_of_frames, + size_t* total_number_of_messages_to_send, + size_t* rtcp_log_size) { + size_t remaining_space = + std::min(kMaxReceiverLogBytes, kMaxIpPacketSize - start_size); + if (remaining_space < kRtcpCastLogHeaderSize + kRtcpReceiverFrameLogSize + + kRtcpReceiverEventLogSize) { + return false; + } + + // We use this to do event timestamp sorting and truncating for events of + // a single frame. + std::vector<RtcpReceiverEventLogMessage> sorted_log_messages; + + // Account for the RTCP header for an application-defined packet. + remaining_space -= kRtcpCastLogHeaderSize; + + ReceiverRtcpEventSubscriber::RtcpEventMultiMap::const_reverse_iterator rit = + rtcp_events.rbegin(); + + while (rit != rtcp_events.rend() && + remaining_space >= + kRtcpReceiverFrameLogSize + kRtcpReceiverEventLogSize) { + const RtpTimestamp rtp_timestamp = rit->first; + RtcpReceiverFrameLogMessage frame_log(rtp_timestamp); + remaining_space -= kRtcpReceiverFrameLogSize; + ++*number_of_frames; + + // Get all events of a single frame. + sorted_log_messages.clear(); + do { + RtcpReceiverEventLogMessage event_log_message; + event_log_message.type = rit->second.type; + event_log_message.event_timestamp = rit->second.timestamp; + event_log_message.delay_delta = rit->second.delay_delta; + event_log_message.packet_id = rit->second.packet_id; + sorted_log_messages.push_back(event_log_message); + ++rit; + } while (rit != rtcp_events.rend() && rit->first == rtp_timestamp); + + std::sort(sorted_log_messages.begin(), + sorted_log_messages.end(), + &EventTimestampLessThan); + + // From |sorted_log_messages|, only take events that are no greater than + // |kMaxWireFormatTimeDeltaMs| seconds away from the latest event. Events + // older than that cannot be encoded over the wire. + std::vector<RtcpReceiverEventLogMessage>::reverse_iterator sorted_rit = + sorted_log_messages.rbegin(); + base::TimeTicks first_event_timestamp = sorted_rit->event_timestamp; + size_t events_in_frame = 0; + while (sorted_rit != sorted_log_messages.rend() && + events_in_frame < kRtcpMaxReceiverLogMessages && + remaining_space >= kRtcpReceiverEventLogSize) { + base::TimeDelta delta(first_event_timestamp - + sorted_rit->event_timestamp); + if (delta.InMilliseconds() > kMaxWireFormatTimeDeltaMs) + break; + frame_log.event_log_messages_.push_front(*sorted_rit); + ++events_in_frame; + ++*total_number_of_messages_to_send; + remaining_space -= kRtcpReceiverEventLogSize; + ++sorted_rit; + } + + receiver_log_message->push_front(frame_log); + } + + rtcp_events_history_.push_front(*receiver_log_message); + + // We don't try to match RTP timestamps of redundancy frame logs with those + // from the newest set (which would save the space of an extra RTP timestamp + // over the wire). Unless the redundancy frame logs are very recent, it's + // unlikely there will be a match anyway. + if (rtcp_events_history_.size() > kFirstRedundancyOffset) { + // Add first redundnacy messages, if enough space remaining + AddReceiverLog(rtcp_events_history_[kFirstRedundancyOffset], + receiver_log_message, + &remaining_space, + number_of_frames, + total_number_of_messages_to_send); + } + + if (rtcp_events_history_.size() > kSecondRedundancyOffset) { + // Add second redundancy messages, if enough space remaining + AddReceiverLog(rtcp_events_history_[kSecondRedundancyOffset], + receiver_log_message, + &remaining_space, + number_of_frames, + total_number_of_messages_to_send); + } + + if (rtcp_events_history_.size() > kReceiveLogMessageHistorySize) { + rtcp_events_history_.pop_back(); + } + + DCHECK_LE(rtcp_events_history_.size(), kReceiveLogMessageHistorySize); + + *rtcp_log_size = + kRtcpCastLogHeaderSize + *number_of_frames * kRtcpReceiverFrameLogSize + + *total_number_of_messages_to_send * kRtcpReceiverEventLogSize; + DCHECK_GE(kMaxIpPacketSize, start_size + *rtcp_log_size) + << "Not enough buffer space."; + + VLOG(3) << "number of frames: " << *number_of_frames; + VLOG(3) << "total messages to send: " << *total_number_of_messages_to_send; + VLOG(3) << "rtcp log size: " << *rtcp_log_size; + return *number_of_frames > 0; +} + } // namespace cast } // namespace media diff --git a/media/cast/rtcp/rtcp_sender.h b/media/cast/rtcp/rtcp_sender.h index dbc93a840b..f09a4fb0e5 100644 --- a/media/cast/rtcp/rtcp_sender.h +++ b/media/cast/rtcp/rtcp_sender.h @@ -5,6 +5,7 @@ #ifndef MEDIA_CAST_RTCP_RTCP_SENDER_H_ #define MEDIA_CAST_RTCP_RTCP_SENDER_H_ +#include <deque> #include <list> #include <string> @@ -19,13 +20,25 @@ namespace media { namespace cast { -// We limit the size of receiver logs to avoid queuing up packets. We also -// do not need the amount of redundancy that results from filling up every -// RTCP packet with log messages. This number should give a redundancy of -// about 2-3 per log message. +// We limit the size of receiver logs to avoid queuing up packets. const size_t kMaxReceiverLogBytes = 200; -class ReceiverRtcpEventSubscriber; +// The determines how long to hold receiver log events, based on how +// many "receiver log message reports" ago the events were sent. +const size_t kReceiveLogMessageHistorySize = 20; + +// This determines when to send events the second time. +const size_t kFirstRedundancyOffset = 10; +COMPILE_ASSERT(kFirstRedundancyOffset > 0 && + kFirstRedundancyOffset <= kReceiveLogMessageHistorySize, + redundancy_offset_out_of_range); + +// When to send events the third time. +const size_t kSecondRedundancyOffset = 20; +COMPILE_ASSERT(kSecondRedundancyOffset > + kFirstRedundancyOffset && kSecondRedundancyOffset <= + kReceiveLogMessageHistorySize, + redundancy_offset_out_of_range); // TODO(mikhal): Resolve duplication between this and RtcpBuilder. class RtcpSender { @@ -37,16 +50,12 @@ class RtcpSender { virtual ~RtcpSender(); - // Returns true if |event| is an interesting receiver event. - // Such an event should be sent via RTCP. - static bool IsReceiverEvent(const media::cast::CastLoggingEvent& event); - void SendRtcpFromRtpReceiver( uint32 packet_type_flags, const transport::RtcpReportBlock* report_block, const RtcpReceiverReferenceTimeReport* rrtr, const RtcpCastMessage* cast_message, - const ReceiverRtcpEventSubscriber* event_subscriber, + const ReceiverRtcpEventSubscriber::RtcpEventMultiMap* rtcp_events, uint16 target_delay_ms); private: @@ -77,7 +86,15 @@ class RtcpSender { void BuildReceiverLog( const ReceiverRtcpEventSubscriber::RtcpEventMultiMap& rtcp_events, - Packet* packet) const; + Packet* packet); + + bool BuildRtcpReceiverLogMessage( + const ReceiverRtcpEventSubscriber::RtcpEventMultiMap& rtcp_events, + size_t start_size, + RtcpReceiverLogMessage* receiver_log_message, + size_t* number_of_frames, + size_t* total_number_of_messages_to_send, + size_t* rtcp_log_size); inline void BitrateToRembExponentBitrate(uint32 bitrate, uint8* exponent, @@ -100,6 +117,8 @@ class RtcpSender { transport::PacedPacketSender* const transport_; scoped_refptr<CastEnvironment> cast_environment_; + std::deque<RtcpReceiverLogMessage> rtcp_events_history_; + DISALLOW_COPY_AND_ASSIGN(RtcpSender); }; diff --git a/media/cast/rtcp/rtcp_sender_unittest.cc b/media/cast/rtcp/rtcp_sender_unittest.cc index 8e6ceb2263..cd8ca720bf 100644 --- a/media/cast/rtcp/rtcp_sender_unittest.cc +++ b/media/cast/rtcp/rtcp_sender_unittest.cc @@ -251,6 +251,7 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtrCastMessageAndLog) { ReceiverRtcpEventSubscriber event_subscriber( 500, ReceiverRtcpEventSubscriber::kVideoEventSubscriber); + ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; rtcp_sender_->SendRtcpFromRtpReceiver( transport::kRtcpRr | transport::kRtcpRrtr | transport::kRtcpCast | @@ -258,7 +259,7 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtrCastMessageAndLog) { &report_block, &rrtr, &cast_message, - &event_subscriber, + &rtcp_events, kDefaultDelay); base::SimpleTestTickClock testing_clock; @@ -284,7 +285,8 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtrCastMessageAndLog) { packet_event.timestamp = testing_clock.NowTicks(); packet_event.packet_id = kLostPacketId1; event_subscriber.OnReceivePacketEvent(packet_event); - EXPECT_EQ(2u, event_subscriber.get_rtcp_events().size()); + event_subscriber.GetRtcpEventsAndReset(&rtcp_events); + EXPECT_EQ(2u, rtcp_events.size()); rtcp_sender_->SendRtcpFromRtpReceiver( transport::kRtcpRr | transport::kRtcpRrtr | transport::kRtcpCast | @@ -292,22 +294,10 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithRrtrCastMessageAndLog) { &report_block, &rrtr, &cast_message, - &event_subscriber, + &rtcp_events, kDefaultDelay); EXPECT_EQ(2, test_transport_.packet_count()); - - // We expect to see the same packet because we send redundant events. - rtcp_sender_->SendRtcpFromRtpReceiver( - transport::kRtcpRr | transport::kRtcpRrtr | transport::kRtcpCast | - transport::kRtcpReceiverLog, - &report_block, - &rrtr, - &cast_message, - &event_subscriber, - kDefaultDelay); - - EXPECT_EQ(3, test_transport_.packet_count()); } TEST_F(RtcpSenderTest, RtcpReceiverReportWithOversizedFrameLog) { @@ -362,12 +352,15 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithOversizedFrameLog) { testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); } + ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; + event_subscriber.GetRtcpEventsAndReset(&rtcp_events); + rtcp_sender_->SendRtcpFromRtpReceiver( transport::kRtcpRr | transport::kRtcpReceiverLog, &report_block, NULL, NULL, - &event_subscriber, + &rtcp_events, kDefaultDelay); EXPECT_EQ(1, test_transport_.packet_count()); @@ -416,12 +409,15 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithTooManyLogFrames) { testing_clock.Advance(base::TimeDelta::FromMilliseconds(kTimeDelayMs)); } + ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; + event_subscriber.GetRtcpEventsAndReset(&rtcp_events); + rtcp_sender_->SendRtcpFromRtpReceiver( transport::kRtcpRr | transport::kRtcpReceiverLog, &report_block, NULL, NULL, - &event_subscriber, + &rtcp_events, kDefaultDelay); EXPECT_EQ(1, test_transport_.packet_count()); @@ -464,16 +460,83 @@ TEST_F(RtcpSenderTest, RtcpReceiverReportWithOldLogFrames) { base::TimeDelta::FromMilliseconds(kTimeBetweenEventsMs)); } + ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; + event_subscriber.GetRtcpEventsAndReset(&rtcp_events); + rtcp_sender_->SendRtcpFromRtpReceiver( transport::kRtcpRr | transport::kRtcpReceiverLog, &report_block, NULL, NULL, - &event_subscriber, + &rtcp_events, kDefaultDelay); EXPECT_EQ(1, test_transport_.packet_count()); } +TEST_F(RtcpSenderTest, RtcpReceiverReportRedundancy) { + uint32 time_base_ms = 12345678; + int kTimeBetweenEventsMs = 10; + + transport::RtcpReportBlock report_block = GetReportBlock(); + + base::SimpleTestTickClock testing_clock; + testing_clock.Advance(base::TimeDelta::FromMilliseconds(time_base_ms)); + + ReceiverRtcpEventSubscriber event_subscriber( + 500, ReceiverRtcpEventSubscriber::kVideoEventSubscriber); + size_t packet_count = kReceiveLogMessageHistorySize + 10; + for (size_t i = 0; i < packet_count; i++) { + TestRtcpPacketBuilder p; + p.AddRr(kSendingSsrc, 1); + p.AddRb(kMediaSsrc); + p.AddSdesCname(kSendingSsrc, kCName); + + p.AddReceiverLog(kSendingSsrc); + + if (i >= kSecondRedundancyOffset) { + p.AddReceiverFrameLog( + kRtpTimestamp, + 1, + time_base_ms - kSecondRedundancyOffset * kTimeBetweenEventsMs); + p.AddReceiverEventLog(0, 5, 0); + } + if (i >= kFirstRedundancyOffset) { + p.AddReceiverFrameLog( + kRtpTimestamp, + 1, + time_base_ms - kFirstRedundancyOffset * kTimeBetweenEventsMs); + p.AddReceiverEventLog(0, 5, 0); + } + p.AddReceiverFrameLog(kRtpTimestamp, 1, time_base_ms); + p.AddReceiverEventLog(0, 5, 0); + + test_transport_.SetExpectedRtcpPacket(p.GetPacket().Pass()); + + FrameEvent frame_event; + frame_event.rtp_timestamp = kRtpTimestamp; + frame_event.type = media::cast::kVideoAckSent; + frame_event.timestamp = testing_clock.NowTicks(); + event_subscriber.OnReceiveFrameEvent(frame_event); + + ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; + event_subscriber.GetRtcpEventsAndReset(&rtcp_events); + + rtcp_sender_->SendRtcpFromRtpReceiver( + transport::kRtcpRr | transport::kRtcpReceiverLog, + &report_block, + NULL, + NULL, + &rtcp_events, + kDefaultDelay); + + testing_clock.Advance( + base::TimeDelta::FromMilliseconds(kTimeBetweenEventsMs)); + time_base_ms += kTimeBetweenEventsMs; + } + + EXPECT_EQ(static_cast<int>(packet_count), test_transport_.packet_count()); +} + } // namespace cast } // namespace media diff --git a/media/cast/rtcp/rtcp_utility.cc b/media/cast/rtcp/rtcp_utility.cc index 61e5d74a43..fd86e8e9e1 100644 --- a/media/cast/rtcp/rtcp_utility.cc +++ b/media/cast/rtcp/rtcp_utility.cc @@ -613,7 +613,9 @@ bool RtcpParser::ParseCastReceiverLogEventItem() { field_.cast_receiver_log.event = static_cast<uint8>(event_type_and_timestamp_delta >> 12); - field_.cast_receiver_log.delay_delta_or_packet_id = delay_delta_or_packet_id; + // delay_delta is in union'ed with packet_id. + field_.cast_receiver_log.delay_delta_or_packet_id.packet_id = + delay_delta_or_packet_id; field_.cast_receiver_log.event_timestamp_delta = event_type_and_timestamp_delta & 0xfff; diff --git a/media/cast/rtcp/rtcp_utility.h b/media/cast/rtcp/rtcp_utility.h index e314a1a8b8..8d6d00ef82 100644 --- a/media/cast/rtcp/rtcp_utility.h +++ b/media/cast/rtcp/rtcp_utility.h @@ -152,7 +152,10 @@ struct RtcpFieldApplicationSpecificCastReceiverLogItem { uint32 rtp_timestamp; uint32 event_timestamp_base; uint8 event; - uint16 delay_delta_or_packet_id; + union { + uint16 packet_id; + int16 delay_delta; + } delay_delta_or_packet_id; uint16 event_timestamp_delta; }; diff --git a/media/cast/test/encode_decode_test.cc b/media/cast/test/encode_decode_test.cc index 20b1348cb0..67edbc89d0 100644 --- a/media/cast/test/encode_decode_test.cc +++ b/media/cast/test/encode_decode_test.cc @@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2014 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. @@ -84,7 +84,6 @@ class EncodeDecodeTest : public ::testing::Test { testing_clock_->Advance( base::TimeDelta::FromMilliseconds(kStartMillisecond)); encoder_config_.max_number_of_video_buffers_used = 1; - encoder_config_.number_of_cores = 1; encoder_config_.width = kWidth; encoder_config_.height = kHeight; encoder_config_.start_bitrate = kStartbitrate; diff --git a/media/cast/test/end2end_unittest.cc b/media/cast/test/end2end_unittest.cc index 7299501257..b41f2ef868 100644 --- a/media/cast/test/end2end_unittest.cc +++ b/media/cast/test/end2end_unittest.cc @@ -249,6 +249,7 @@ class TestReceiverAudioCallback bool is_continuous) { ++num_called_; + ASSERT_TRUE(!!audio_bus); ASSERT_FALSE(expected_frames_.empty()); const scoped_ptr<ExpectedAudioFrame> expected_audio_frame( expected_frames_.front()); @@ -281,6 +282,7 @@ class TestReceiverAudioCallback void CheckCodedAudioFrame( scoped_ptr<transport::EncodedAudioFrame> audio_frame, const base::TimeTicks& playout_time) { + ASSERT_TRUE(!!audio_frame); ASSERT_FALSE(expected_frames_.empty()); const ExpectedAudioFrame& expected_audio_frame = *(expected_frames_.front()); @@ -330,6 +332,7 @@ class TestReceiverVideoCallback int width; int height; base::TimeTicks capture_time; + bool should_be_continuous; }; TestReceiverVideoCallback() : num_called_(0) {} @@ -337,20 +340,24 @@ class TestReceiverVideoCallback void AddExpectedResult(int start_value, int width, int height, - const base::TimeTicks& capture_time) { + const base::TimeTicks& capture_time, + bool should_be_continuous) { ExpectedVideoFrame expected_video_frame; expected_video_frame.start_value = start_value; - expected_video_frame.capture_time = capture_time; expected_video_frame.width = width; expected_video_frame.height = height; + expected_video_frame.capture_time = capture_time; + expected_video_frame.should_be_continuous = should_be_continuous; expected_frame_.push_back(expected_video_frame); } void CheckVideoFrame(const scoped_refptr<media::VideoFrame>& video_frame, - const base::TimeTicks& render_time) { + const base::TimeTicks& render_time, + bool is_continuous) { ++num_called_; - EXPECT_FALSE(expected_frame_.empty()); // Test for bug in test code. + ASSERT_TRUE(!!video_frame); + ASSERT_FALSE(expected_frame_.empty()); ExpectedVideoFrame expected_video_frame = expected_frame_.front(); expected_frame_.pop_front(); @@ -364,7 +371,11 @@ class TestReceiverVideoCallback EXPECT_GE(upper_bound, time_since_capture) << "time_since_capture - upper_bound == " << (time_since_capture - upper_bound).InMicroseconds() << " usec"; - EXPECT_LE(expected_video_frame.capture_time, render_time); + // TODO(miu): I broke the concept of 100 ms target delay timing on the + // receiver side, but the logic for computing playout time really isn't any + // more broken than it was. This only affects the receiver, and is to be + // rectified in an soon-upcoming change. http://crbug.com/356942 + // EXPECT_LE(expected_video_frame.capture_time, render_time); EXPECT_EQ(expected_video_frame.width, video_frame->visible_rect().width()); EXPECT_EQ(expected_video_frame.height, video_frame->visible_rect().height()); @@ -376,6 +387,8 @@ class TestReceiverVideoCallback PopulateVideoFrame(expected_I420_frame, expected_video_frame.start_value); EXPECT_GE(I420PSNR(expected_I420_frame, video_frame), kVideoAcceptedPSNR); + + EXPECT_EQ(expected_video_frame.should_be_continuous, is_continuous); } int number_times_called() const { return num_called_; } @@ -463,7 +476,6 @@ class End2EndTest : public ::testing::Test { video_sender_config_.max_number_of_video_buffers_used = max_number_of_video_buffers_used; video_sender_config_.codec = transport::kVp8; - video_sender_config_.number_of_cores = 1; video_receiver_config_.feedback_ssrc = video_sender_config_.incoming_feedback_ssrc; @@ -673,7 +685,8 @@ TEST_F(End2EndTest, LoopNoLossPcm16) { video_start, video_sender_config_.width, video_sender_config_.height, - testing_clock_sender_->NowTicks()); + testing_clock_sender_->NowTicks(), + true); SendVideoFrame(video_start, testing_clock_sender_->NowTicks()); if (num_audio_frames > 0) @@ -775,7 +788,8 @@ TEST_F(End2EndTest, DISABLED_StartSenderBeforeReceiver) { video_start, video_sender_config_.width, video_sender_config_.height, - initial_send_time + expected_delay); + initial_send_time + expected_delay, + true); SendVideoFrame(video_start, testing_clock_sender_->NowTicks()); if (num_audio_frames > 0) @@ -803,7 +817,8 @@ TEST_F(End2EndTest, DISABLED_StartSenderBeforeReceiver) { video_start, video_sender_config_.width, video_sender_config_.height, - testing_clock_sender_->NowTicks()); + testing_clock_sender_->NowTicks(), + true); SendVideoFrame(video_start, testing_clock_sender_->NowTicks()); if (num_audio_frames > 0) @@ -848,7 +863,8 @@ TEST_F(End2EndTest, DISABLED_GlitchWith3Buffers) { video_start, video_sender_config_.width, video_sender_config_.height, - send_time); + send_time, + true); frame_receiver_->GetRawVideoFrame( base::Bind(&TestReceiverVideoCallback::CheckVideoFrame, test_receiver_video_callback_)); @@ -878,7 +894,8 @@ TEST_F(End2EndTest, DISABLED_GlitchWith3Buffers) { test_receiver_video_callback_->AddExpectedResult(video_start, video_sender_config_.width, video_sender_config_.height, - send_time); + send_time, + true); frame_receiver_->GetRawVideoFrame( base::Bind(&TestReceiverVideoCallback::CheckVideoFrame, @@ -889,7 +906,8 @@ TEST_F(End2EndTest, DISABLED_GlitchWith3Buffers) { test_receiver_video_callback_->number_times_called()); } -TEST_F(End2EndTest, DropEveryOtherFrame3Buffers) { +// Disabled due to flakiness and crashiness. http://crbug.com/360951 +TEST_F(End2EndTest, DISABLED_DropEveryOtherFrame3Buffers) { Configure(transport::kOpus, kDefaultAudioSamplingRate, false, 3); video_sender_config_.rtp_config.max_delay_ms = 67; video_receiver_config_.rtp_max_delay_ms = 67; @@ -909,7 +927,8 @@ TEST_F(End2EndTest, DropEveryOtherFrame3Buffers) { video_start, video_sender_config_.width, video_sender_config_.height, - send_time); + send_time, + i == 0); // GetRawVideoFrame will not return the frame until we are close in // time before we should render the frame. @@ -941,7 +960,8 @@ TEST_F(End2EndTest, ResetReferenceFrameId) { frames_counter, video_sender_config_.width, video_sender_config_.height, - send_time); + send_time, + true); // GetRawVideoFrame will not return the frame until we are close to the // time in which we should render the frame. @@ -971,21 +991,20 @@ TEST_F(End2EndTest, CryptoVideo) { int frames_counter = 0; for (; frames_counter < 3; ++frames_counter) { const base::TimeTicks send_time = testing_clock_sender_->NowTicks(); - SendVideoFrame(frames_counter, send_time); test_receiver_video_callback_->AddExpectedResult( frames_counter, video_sender_config_.width, video_sender_config_.height, - send_time); + send_time, + true); + + RunTasks(kFrameTimerMs); - // GetRawVideoFrame will not return the frame until we are close to the - // time in which we should render the frame. frame_receiver_->GetRawVideoFrame( base::Bind(&TestReceiverVideoCallback::CheckVideoFrame, test_receiver_video_callback_)); - RunTasks(kFrameTimerMs); } RunTasks(2 * kFrameTimerMs + 1); // Empty the pipeline. EXPECT_EQ(frames_counter, @@ -1031,7 +1050,8 @@ TEST_F(End2EndTest, VideoLogging) { video_start, video_sender_config_.width, video_sender_config_.height, - send_time); + send_time, + true); SendVideoFrame(video_start, send_time); RunTasks(kFrameTimerMs); @@ -1076,6 +1096,10 @@ TEST_F(End2EndTest, VideoLogging) { int expected_event_count_for_frame = 0; + EXPECT_EQ(1, map_it->second.counter[kVideoFrameCaptured]); + expected_event_count_for_frame += + map_it->second.counter[kVideoFrameCaptured]; + EXPECT_EQ(1, map_it->second.counter[kVideoFrameSentToEncoder]); expected_event_count_for_frame += map_it->second.counter[kVideoFrameSentToEncoder]; diff --git a/media/cast/test/fake_video_encode_accelerator.cc b/media/cast/test/fake_video_encode_accelerator.cc index 298ad1e20f..d1bfab339d 100644 --- a/media/cast/test/fake_video_encode_accelerator.cc +++ b/media/cast/test/fake_video_encode_accelerator.cc @@ -4,7 +4,10 @@ #include "media/cast/test/fake_video_encode_accelerator.h" +#include "base/bind.h" +#include "base/location.h" #include "base/logging.h" +#include "base/single_thread_task_runner.h" namespace media { namespace cast { @@ -13,12 +16,18 @@ namespace test { static const unsigned int kMinimumInputCount = 1; static const size_t kMinimumOutputBufferSize = 123456; -FakeVideoEncodeAccelerator::FakeVideoEncodeAccelerator() - : client_(NULL), first_(true) {} +FakeVideoEncodeAccelerator::FakeVideoEncodeAccelerator( + const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) + : task_runner_(task_runner), + client_(NULL), + first_(true), + weak_this_factory_(this) {} -FakeVideoEncodeAccelerator::~FakeVideoEncodeAccelerator() {} +FakeVideoEncodeAccelerator::~FakeVideoEncodeAccelerator() { + weak_this_factory_.InvalidateWeakPtrs(); +} -void FakeVideoEncodeAccelerator::Initialize( +bool FakeVideoEncodeAccelerator::Initialize( media::VideoFrame::Format input_format, const gfx::Size& input_visible_size, VideoCodecProfile output_profile, @@ -27,12 +36,16 @@ void FakeVideoEncodeAccelerator::Initialize( client_ = client; if (output_profile != media::VP8PROFILE_MAIN && output_profile != media::H264PROFILE_MAIN) { - client_->NotifyError(kInvalidArgumentError); - return; + return false; } - client_->NotifyInitializeDone(); - client_->RequireBitstreamBuffers( - kMinimumInputCount, input_visible_size, kMinimumOutputBufferSize); + task_runner_->PostTask( + FROM_HERE, + base::Bind(&FakeVideoEncodeAccelerator::DoRequireBitstreamBuffers, + weak_this_factory_.GetWeakPtr(), + kMinimumInputCount, + input_visible_size, + kMinimumOutputBufferSize)); + return true; } void FakeVideoEncodeAccelerator::Encode(const scoped_refptr<VideoFrame>& frame, @@ -50,7 +63,13 @@ void FakeVideoEncodeAccelerator::Encode(const scoped_refptr<VideoFrame>& frame, is_key_fame = true; first_ = false; } - client_->BitstreamBufferReady(id, kMinimumOutputBufferSize, is_key_fame); + task_runner_->PostTask( + FROM_HERE, + base::Bind(&FakeVideoEncodeAccelerator::DoBitstreamBufferReady, + weak_this_factory_.GetWeakPtr(), + id, + kMinimumOutputBufferSize, + is_key_fame)); } void FakeVideoEncodeAccelerator::UseOutputBitstreamBuffer( @@ -66,6 +85,25 @@ void FakeVideoEncodeAccelerator::RequestEncodingParametersChange( void FakeVideoEncodeAccelerator::Destroy() { delete this; } +void FakeVideoEncodeAccelerator::SendDummyFrameForTesting(bool key_frame) { + DoBitstreamBufferReady(0, 23, key_frame); +} + +void FakeVideoEncodeAccelerator::DoRequireBitstreamBuffers( + unsigned int input_count, + const gfx::Size& input_coded_size, + size_t output_buffer_size) const { + client_->RequireBitstreamBuffers( + input_count, input_coded_size, output_buffer_size); +} + +void FakeVideoEncodeAccelerator::DoBitstreamBufferReady( + int32 bitstream_buffer_id, + size_t payload_size, + bool key_frame) const { + client_->BitstreamBufferReady(bitstream_buffer_id, payload_size, key_frame); +} + } // namespace test } // namespace cast } // namespace media diff --git a/media/cast/test/fake_video_encode_accelerator.h b/media/cast/test/fake_video_encode_accelerator.h index 2e0c93aec5..a4f834faeb 100644 --- a/media/cast/test/fake_video_encode_accelerator.h +++ b/media/cast/test/fake_video_encode_accelerator.h @@ -9,18 +9,24 @@ #include <list> +#include "base/memory/weak_ptr.h" #include "media/base/bitstream_buffer.h" +namespace base { +class SingleThreadTaskRunner; +} // namespace base + namespace media { namespace cast { namespace test { class FakeVideoEncodeAccelerator : public VideoEncodeAccelerator { public: - FakeVideoEncodeAccelerator(); + explicit FakeVideoEncodeAccelerator( + const scoped_refptr<base::SingleThreadTaskRunner>& task_runner); virtual ~FakeVideoEncodeAccelerator(); - virtual void Initialize(media::VideoFrame::Format input_format, + virtual bool Initialize(media::VideoFrame::Format input_format, const gfx::Size& input_visible_size, VideoCodecProfile output_profile, uint32 initial_bitrate, @@ -36,12 +42,25 @@ class FakeVideoEncodeAccelerator : public VideoEncodeAccelerator { virtual void Destroy() OVERRIDE; + void SendDummyFrameForTesting(bool key_frame); + private: + void DoRequireBitstreamBuffers(unsigned int input_count, + const gfx::Size& input_coded_size, + size_t output_buffer_size) const; + void DoBitstreamBufferReady(int32 bitstream_buffer_id, + size_t payload_size, + bool key_frame) const; + + scoped_refptr<base::SingleThreadTaskRunner> task_runner_; + VideoEncodeAccelerator::Client* client_; bool first_; std::list<int32> available_buffer_ids_; + base::WeakPtrFactory<FakeVideoEncodeAccelerator> weak_this_factory_; + DISALLOW_COPY_AND_ASSIGN(FakeVideoEncodeAccelerator); }; diff --git a/media/cast/test/receiver.cc b/media/cast/test/receiver.cc index 77abee8578..5aaf64309d 100644 --- a/media/cast/test/receiver.cc +++ b/media/cast/test/receiver.cc @@ -6,7 +6,9 @@ #include <climits> #include <cstdarg> #include <cstdio> +#include <deque> #include <string> +#include <utility> #include "base/at_exit.h" #include "base/command_line.h" @@ -14,8 +16,17 @@ #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "base/message_loop/message_loop.h" +#include "base/synchronization/lock.h" +#include "base/synchronization/waitable_event.h" #include "base/threading/thread.h" #include "base/time/default_tick_clock.h" +#include "base/timer/timer.h" +#include "media/audio/audio_io.h" +#include "media/audio/audio_manager.h" +#include "media/audio/audio_parameters.h" +#include "media/audio/fake_audio_log_factory.h" +#include "media/base/audio_bus.h" +#include "media/base/channel_layout.h" #include "media/base/video_frame.h" #include "media/cast/cast_config.h" #include "media/cast/cast_environment.h" @@ -39,20 +50,16 @@ namespace cast { #define DEFAULT_SEND_PORT "0" #define DEFAULT_RECEIVE_PORT "2344" #define DEFAULT_SEND_IP "0.0.0.0" -#define DEFAULT_RESTART "0" #define DEFAULT_AUDIO_FEEDBACK_SSRC "2" #define DEFAULT_AUDIO_INCOMING_SSRC "1" #define DEFAULT_AUDIO_PAYLOAD_TYPE "127" #define DEFAULT_VIDEO_FEEDBACK_SSRC "12" #define DEFAULT_VIDEO_INCOMING_SSRC "11" #define DEFAULT_VIDEO_PAYLOAD_TYPE "96" -#define DEFAULT_VIDEO_CODEC_WIDTH "640" -#define DEFAULT_VIDEO_CODEC_HEIGHT "480" -#define DEFAULT_VIDEO_CODEC_BITRATE "2000" #if defined(OS_LINUX) -const int kVideoWindowWidth = 1280; -const int kVideoWindowHeight = 720; +const char* kVideoWindowWidth = "1280"; +const char* kVideoWindowHeight = "720"; #endif // OS_LINUX void GetPorts(int* tx_port, int* rx_port) { @@ -96,6 +103,19 @@ void GetSsrcs(VideoReceiverConfig* video_config) { video_config->incoming_ssrc = input_rx.GetIntInput(); } +#if defined(OS_LINUX) +void GetWindowSize(int* width, int* height) { + // Resolution values based on sender settings + test::InputBuilder input_w( + "Choose window width.", kVideoWindowWidth, 144, 1920); + *width = input_w.GetIntInput(); + + test::InputBuilder input_h( + "Choose window height.", kVideoWindowHeight, 176, 1080); + *height = input_h.GetIntInput(); +} +#endif // OS_LINUX + void GetPayloadtype(AudioReceiverConfig* audio_config) { test::InputBuilder input("Choose audio receiver payload type.", DEFAULT_AUDIO_PAYLOAD_TYPE, @@ -126,60 +146,319 @@ VideoReceiverConfig GetVideoReceiverConfig() { return video_config; } -// An InProcessReceiver that renders video frames to a LinuxOutputWindow. While -// it does receive audio frames, it does not play them. -class ReceiverDisplay : public InProcessReceiver { +AudioParameters ToAudioParameters(const AudioReceiverConfig& config) { + const int samples_in_10ms = config.frequency / 100; + return AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY, + GuessChannelLayout(config.channels), + config.frequency, 32, samples_in_10ms); +} + +// An InProcessReceiver that renders video frames to a LinuxOutputWindow and +// audio frames via Chromium's audio stack. +// +// InProcessReceiver pushes audio and video frames to this subclass, and these +// frames are pushed into a queue. Then, for audio, the Chromium audio stack +// will make polling calls on a separate, unknown thread whereby audio frames +// are pulled out of the audio queue as needed. For video, however, NaivePlayer +// is responsible for scheduling updates to the screen itself. For both, the +// queues are pruned (i.e., received frames are skipped) when the system is not +// able to play back as fast as frames are entering the queue. +// +// This is NOT a good reference implementation for a Cast receiver player since: +// 1. It only skips frames to handle slower-than-expected playout, or halts +// playback to handle frame underruns. +// 2. It makes no attempt to synchronize the timing of playout of the video +// frames with the audio frames. +// 3. It does nothing to smooth or hide discontinuities in playback due to +// timing issues or missing frames. +class NaivePlayer : public InProcessReceiver, + public AudioOutputStream::AudioSourceCallback { public: - ReceiverDisplay(const scoped_refptr<CastEnvironment>& cast_environment, - const net::IPEndPoint& local_end_point, - const net::IPEndPoint& remote_end_point, - const AudioReceiverConfig& audio_config, - const VideoReceiverConfig& video_config) + NaivePlayer(const scoped_refptr<CastEnvironment>& cast_environment, + const net::IPEndPoint& local_end_point, + const net::IPEndPoint& remote_end_point, + const AudioReceiverConfig& audio_config, + const VideoReceiverConfig& video_config, + int window_width, + int window_height) : InProcessReceiver(cast_environment, local_end_point, remote_end_point, audio_config, video_config), + // Maximum age is the duration of 3 video frames. 3 was chosen + // arbitrarily, but seems to work well. + max_frame_age_(base::TimeDelta::FromSeconds(1) * 3 / + video_config.max_frame_rate), #if defined(OS_LINUX) - render_(0, 0, kVideoWindowWidth, kVideoWindowHeight, "Cast_receiver"), + render_(0, 0, window_width, window_height, "Cast_receiver"), #endif // OS_LINUX - last_playout_time_(), - last_render_time_() { + num_video_frames_processed_(0), + num_audio_frames_processed_(0), + currently_playing_audio_frame_start_(-1) {} + + virtual ~NaivePlayer() {} + + virtual void Start() OVERRIDE { + AudioManager::Get()->GetTaskRunner()->PostTask( + FROM_HERE, + base::Bind(&NaivePlayer::StartAudioOutputOnAudioManagerThread, + base::Unretained(this))); + // Note: No need to wait for audio polling to start since the push-and-pull + // mechanism is synchronized via the |audio_playout_queue_|. + InProcessReceiver::Start(); + } + + virtual void Stop() OVERRIDE { + // First, stop audio output to the Chromium audio stack. + base::WaitableEvent done(false, false); + DCHECK(!AudioManager::Get()->GetTaskRunner()->BelongsToCurrentThread()); + AudioManager::Get()->GetTaskRunner()->PostTask( + FROM_HERE, + base::Bind(&NaivePlayer::StopAudioOutputOnAudioManagerThread, + base::Unretained(this), + &done)); + done.Wait(); + + // Now, stop receiving new frames. + InProcessReceiver::Stop(); + + // Finally, clear out any frames remaining in the queues. + while (!audio_playout_queue_.empty()) { + const scoped_ptr<AudioBus> to_be_deleted( + audio_playout_queue_.front().second); + audio_playout_queue_.pop_front(); + } + video_playout_queue_.clear(); + } + + private: + void StartAudioOutputOnAudioManagerThread() { + DCHECK(AudioManager::Get()->GetTaskRunner()->BelongsToCurrentThread()); + DCHECK(!audio_output_stream_); + audio_output_stream_.reset(AudioManager::Get()->MakeAudioOutputStreamProxy( + ToAudioParameters(audio_config()), "")); + if (audio_output_stream_.get() && audio_output_stream_->Open()) { + audio_output_stream_->Start(this); + } else { + LOG(ERROR) << "Failed to open an audio output stream. " + << "Audio playback disabled."; + audio_output_stream_.reset(); + } + } + + void StopAudioOutputOnAudioManagerThread(base::WaitableEvent* done) { + DCHECK(AudioManager::Get()->GetTaskRunner()->BelongsToCurrentThread()); + if (audio_output_stream_.get()) { + audio_output_stream_->Stop(); + audio_output_stream_->Close(); + audio_output_stream_.reset(); + } + done->Signal(); + } + + //////////////////////////////////////////////////////////////////// + // InProcessReceiver overrides. + + virtual void OnVideoFrame(const scoped_refptr<VideoFrame>& video_frame, + const base::TimeTicks& playout_time, + bool is_continuous) OVERRIDE { + DCHECK(cast_env()->CurrentlyOn(CastEnvironment::MAIN)); + LOG_IF(WARNING, !is_continuous) + << "Video: Discontinuity in received frames."; + video_playout_queue_.push_back(std::make_pair(playout_time, video_frame)); + ScheduleVideoPlayout(); + } + + virtual void OnAudioFrame(scoped_ptr<AudioBus> audio_frame, + const base::TimeTicks& playout_time, + bool is_continuous) OVERRIDE { + DCHECK(cast_env()->CurrentlyOn(CastEnvironment::MAIN)); + LOG_IF(WARNING, !is_continuous) + << "Audio: Discontinuity in received frames."; + base::AutoLock auto_lock(audio_lock_); + audio_playout_queue_.push_back( + std::make_pair(playout_time, audio_frame.release())); + } + + // End of InProcessReceiver overrides. + //////////////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////////////// + // AudioSourceCallback implementation. + + virtual int OnMoreData(AudioBus* dest, AudioBuffersState buffers_state) + OVERRIDE { + // Note: This method is being invoked by a separate thread unknown to us + // (i.e., outside of CastEnvironment). + + int samples_remaining = dest->frames(); + + while (samples_remaining > 0) { + // Get next audio frame ready for playout. + if (!currently_playing_audio_frame_.get()) { + base::AutoLock auto_lock(audio_lock_); + + // Prune the queue, skipping entries that are too old. + // TODO(miu): Use |buffers_state| to account for audio buffering delays + // upstream. + const base::TimeTicks earliest_time_to_play = + cast_env()->Clock()->NowTicks() - max_frame_age_; + while (!audio_playout_queue_.empty() && + audio_playout_queue_.front().first < earliest_time_to_play) { + PopOneAudioFrame(true); + } + if (audio_playout_queue_.empty()) + break; + + currently_playing_audio_frame_ = PopOneAudioFrame(false).Pass(); + currently_playing_audio_frame_start_ = 0; + } + + // Copy some or all of the samples in |currently_playing_audio_frame_| to + // |dest|. Once all samples in |currently_playing_audio_frame_| have been + // consumed, release it. + const int num_samples_to_copy = + std::min(samples_remaining, + currently_playing_audio_frame_->frames() - + currently_playing_audio_frame_start_); + currently_playing_audio_frame_->CopyPartialFramesTo( + currently_playing_audio_frame_start_, + num_samples_to_copy, + 0, + dest); + samples_remaining -= num_samples_to_copy; + currently_playing_audio_frame_start_ += num_samples_to_copy; + if (currently_playing_audio_frame_start_ == + currently_playing_audio_frame_->frames()) { + currently_playing_audio_frame_.reset(); + } + } + + // If |dest| has not been fully filled, then an underrun has occurred; and + // fill the remainder of |dest| with zeros. + if (samples_remaining > 0) { + // Note: Only logging underruns after the first frame has been received. + LOG_IF(WARNING, currently_playing_audio_frame_start_ != -1) + << "Audio: Playback underrun of " << samples_remaining << " samples!"; + dest->ZeroFramesPartial(dest->frames() - samples_remaining, + samples_remaining); + } + + return dest->frames(); + } + + virtual int OnMoreIOData(AudioBus* source, + AudioBus* dest, + AudioBuffersState buffers_state) OVERRIDE { + return OnMoreData(dest, buffers_state); } - virtual ~ReceiverDisplay() {} + virtual void OnError(AudioOutputStream* stream) OVERRIDE { + LOG(ERROR) << "AudioOutputStream reports an error. " + << "Playback is unlikely to continue."; + } + + // End of AudioSourceCallback implementation. + //////////////////////////////////////////////////////////////////// + + void ScheduleVideoPlayout() { + DCHECK(cast_env()->CurrentlyOn(CastEnvironment::MAIN)); + + // Prune the queue, skipping entries that are too old. + const base::TimeTicks now = cast_env()->Clock()->NowTicks(); + const base::TimeTicks earliest_time_to_play = now - max_frame_age_; + while (!video_playout_queue_.empty() && + video_playout_queue_.front().first < earliest_time_to_play) { + PopOneVideoFrame(true); + } + + // If the queue is not empty, schedule playout of its first frame. + if (video_playout_queue_.empty()) { + video_playout_timer_.Stop(); + } else { + video_playout_timer_.Start( + FROM_HERE, + video_playout_queue_.front().first - now, + base::Bind(&NaivePlayer::PlayNextVideoFrame, + base::Unretained(this))); + } + } - protected: - virtual void OnVideoFrame(const scoped_refptr<media::VideoFrame>& video_frame, - const base::TimeTicks& render_time) OVERRIDE { + void PlayNextVideoFrame() { + DCHECK(cast_env()->CurrentlyOn(CastEnvironment::MAIN)); + if (!video_playout_queue_.empty()) { + const scoped_refptr<VideoFrame> video_frame = PopOneVideoFrame(false); #ifdef OS_LINUX - render_.RenderFrame(video_frame); + render_.RenderFrame(video_frame); #endif // OS_LINUX - // Print out the delta between frames. - if (!last_render_time_.is_null()) { - base::TimeDelta time_diff = render_time - last_render_time_; - VLOG(2) << "Size = " << video_frame->coded_size().ToString() - << "; RenderDelay[mS] = " << time_diff.InMilliseconds(); } - last_render_time_ = render_time; + ScheduleVideoPlayout(); } - virtual void OnAudioFrame(scoped_ptr<PcmAudioFrame> audio_frame, - const base::TimeTicks& playout_time) OVERRIDE { - // For audio just print the playout delta between audio frames. - if (!last_playout_time_.is_null()) { - base::TimeDelta time_diff = playout_time - last_playout_time_; - VLOG(2) << "SampleRate = " << audio_frame->frequency - << "; PlayoutDelay[mS] = " << time_diff.InMilliseconds(); + scoped_refptr<VideoFrame> PopOneVideoFrame(bool is_being_skipped) { + DCHECK(cast_env()->CurrentlyOn(CastEnvironment::MAIN)); + + if (is_being_skipped) { + VLOG(1) << "VideoFrame[" << num_video_frames_processed_ << "]: Skipped."; + } else { + VLOG(1) << "VideoFrame[" << num_video_frames_processed_ << "]: Playing " + << (cast_env()->Clock()->NowTicks() - + video_playout_queue_.front().first).InMicroseconds() + << " usec later than intended."; } - last_playout_time_ = playout_time; + + const scoped_refptr<VideoFrame> ret = video_playout_queue_.front().second; + video_playout_queue_.pop_front(); + ++num_video_frames_processed_; + return ret; } + scoped_ptr<AudioBus> PopOneAudioFrame(bool was_skipped) { + audio_lock_.AssertAcquired(); + + if (was_skipped) { + VLOG(1) << "AudioFrame[" << num_audio_frames_processed_ << "]: Skipped"; + } else { + VLOG(1) << "AudioFrame[" << num_audio_frames_processed_ << "]: Playing " + << (cast_env()->Clock()->NowTicks() - + audio_playout_queue_.front().first).InMicroseconds() + << " usec later than intended."; + } + + scoped_ptr<AudioBus> ret(audio_playout_queue_.front().second); + audio_playout_queue_.pop_front(); + ++num_audio_frames_processed_; + return ret.Pass(); + } + + // Frames in the queue older than this (relative to NowTicks()) will be + // dropped (i.e., playback is falling behind). + const base::TimeDelta max_frame_age_; + + // Outputs created, started, and destroyed by this NaivePlayer. #ifdef OS_LINUX test::LinuxOutputWindow render_; #endif // OS_LINUX - base::TimeTicks last_playout_time_; - base::TimeTicks last_render_time_; + scoped_ptr<AudioOutputStream> audio_output_stream_; + + // Video playout queue. + typedef std::pair<base::TimeTicks, scoped_refptr<VideoFrame> > + VideoQueueEntry; + std::deque<VideoQueueEntry> video_playout_queue_; + int64 num_video_frames_processed_; + + base::OneShotTimer<NaivePlayer> video_playout_timer_; + + // Audio playout queue, synchronized by |audio_lock_|. + base::Lock audio_lock_; + typedef std::pair<base::TimeTicks, AudioBus*> AudioQueueEntry; + std::deque<AudioQueueEntry> audio_playout_queue_; + int64 num_audio_frames_processed_; + + // These must only be used on the audio thread calling OnMoreData(). + scoped_ptr<AudioBus> currently_playing_audio_frame_; + int currently_playing_audio_frame_start_; }; } // namespace cast @@ -193,43 +472,53 @@ int main(int argc, char** argv) { scoped_refptr<media::cast::CastEnvironment> cast_environment( new media::cast::StandaloneCastEnvironment); + // Start up Chromium audio system. + media::FakeAudioLogFactory fake_audio_log_factory_; + const scoped_ptr<media::AudioManager> audio_manager( + media::AudioManager::Create(&fake_audio_log_factory_)); + CHECK(media::AudioManager::Get()); + media::cast::AudioReceiverConfig audio_config = media::cast::GetAudioReceiverConfig(); media::cast::VideoReceiverConfig video_config = media::cast::GetVideoReceiverConfig(); + // Determine local and remote endpoints. int remote_port, local_port; media::cast::GetPorts(&remote_port, &local_port); if (!local_port) { LOG(ERROR) << "Invalid local port."; return 1; } - std::string remote_ip_address = media::cast::GetIpAddress("Enter remote IP."); std::string local_ip_address = media::cast::GetIpAddress("Enter local IP."); net::IPAddressNumber remote_ip_number; net::IPAddressNumber local_ip_number; - if (!net::ParseIPLiteralToNumber(remote_ip_address, &remote_ip_number)) { LOG(ERROR) << "Invalid remote IP address."; return 1; } - if (!net::ParseIPLiteralToNumber(local_ip_address, &local_ip_number)) { LOG(ERROR) << "Invalid local IP address."; return 1; } - net::IPEndPoint remote_end_point(remote_ip_number, remote_port); net::IPEndPoint local_end_point(local_ip_number, local_port); - media::cast::ReceiverDisplay* const receiver_display = - new media::cast::ReceiverDisplay(cast_environment, - local_end_point, - remote_end_point, - audio_config, - video_config); - receiver_display->Start(); + // Create and start the player. + int window_width = 0; + int window_height = 0; +#if defined(OS_LINUX) + media::cast::GetWindowSize(&window_width, &window_height); +#endif // OS_LINUX + media::cast::NaivePlayer player(cast_environment, + local_end_point, + remote_end_point, + audio_config, + video_config, + window_width, + window_height); + player.Start(); base::MessageLoop().Run(); // Run forever (i.e., until SIGTERM). NOTREACHED(); diff --git a/media/cast/test/sender.cc b/media/cast/test/sender.cc index 8c2681ba3a..fa2120e138 100644 --- a/media/cast/test/sender.cc +++ b/media/cast/test/sender.cc @@ -216,7 +216,6 @@ VideoSenderConfig GetVideoSenderConfig() { video_config.max_frame_rate = 30; video_config.codec = transport::kVp8; video_config.max_number_of_video_buffers_used = 1; - video_config.number_of_cores = 1; return video_config; } @@ -371,17 +370,11 @@ net::IPEndPoint CreateUDPAddress(std::string ip_str, int port) { return net::IPEndPoint(ip_number, port); } -void DumpLoggingData( - scoped_ptr<media::cast::EncodingEventSubscriber> event_subscriber, - base::ScopedFILE log_file, - bool compress) { - media::cast::FrameEventMap frame_events; - media::cast::PacketEventMap packet_events; - media::cast::proto::LogMetadata log_metadata; - - event_subscriber->GetEventsAndReset( - &log_metadata, &frame_events, &packet_events); - +void DumpLoggingData(const media::cast::proto::LogMetadata& log_metadata, + const media::cast::FrameEventMap& frame_events, + const media::cast::PacketEventMap& packet_events, + bool compress, + base::ScopedFILE log_file) { VLOG(0) << "Frame map size: " << frame_events.size(); VLOG(0) << "Packet map size: " << packet_events.size(); @@ -412,19 +405,33 @@ void WriteLogsToFileAndStopSubscribing( base::ScopedFILE video_log_file, base::ScopedFILE audio_log_file, bool compress) { - // Serialize video events. cast_environment->Logging()->RemoveRawEventSubscriber( video_event_subscriber.get()); cast_environment->Logging()->RemoveRawEventSubscriber( audio_event_subscriber.get()); VLOG(0) << "Dumping logging data for video stream."; - DumpLoggingData( - video_event_subscriber.Pass(), video_log_file.Pass(), compress); + media::cast::proto::LogMetadata log_metadata; + media::cast::FrameEventMap frame_events; + media::cast::PacketEventMap packet_events; + video_event_subscriber->GetEventsAndReset( + &log_metadata, &frame_events, &packet_events); + + DumpLoggingData(log_metadata, + frame_events, + packet_events, + compress, + video_log_file.Pass()); VLOG(0) << "Dumping logging data for audio stream."; - DumpLoggingData( - audio_event_subscriber.Pass(), audio_log_file.Pass(), compress); + audio_event_subscriber->GetEventsAndReset( + &log_metadata, &frame_events, &packet_events); + + DumpLoggingData(log_metadata, + frame_events, + packet_events, + compress, + audio_log_file.Pass()); } } // namespace @@ -460,6 +467,7 @@ int main(int argc, char** argv) { net::IPEndPoint remote_endpoint = CreateUDPAddress(remote_ip_address, remote_port); transport_audio_config.base.ssrc = audio_config.sender_ssrc; + VLOG(0) << "Audio ssrc: " << transport_audio_config.base.ssrc; transport_audio_config.base.rtp_config = audio_config.rtp_config; transport_video_config.base.ssrc = video_config.sender_ssrc; transport_video_config.base.rtp_config = video_config.rtp_config; diff --git a/media/cast/test/utility/audio_utility.cc b/media/cast/test/utility/audio_utility.cc index e3a913d1dd..8dde4dd9f8 100644 --- a/media/cast/test/utility/audio_utility.cc +++ b/media/cast/test/utility/audio_utility.cc @@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include <math.h> - -#include "media/cast/test/utility/audio_utility.h" +#include <cmath> +#include "base/basictypes.h" +#include "base/logging.h" #include "base/time/time.h" #include "media/base/audio_bus.h" -#include "media/cast/cast_config.h" +#include "media/cast/test/utility/audio_utility.h" namespace media { namespace cast { @@ -41,19 +41,7 @@ scoped_ptr<AudioBus> TestAudioBusFactory::NextAudioBus( return bus.Pass(); } -scoped_ptr<PcmAudioFrame> ToPcmAudioFrame(const AudioBus& audio_bus, - int sample_rate) { - scoped_ptr<PcmAudioFrame> audio_frame(new PcmAudioFrame()); - audio_frame->channels = audio_bus.channels(); - audio_frame->frequency = sample_rate; - audio_frame->samples.resize(audio_bus.channels() * audio_bus.frames()); - audio_bus.ToInterleaved(audio_bus.frames(), - sizeof(audio_frame->samples.front()), - &audio_frame->samples.front()); - return audio_frame.Pass(); -} - -int CountZeroCrossings(const float* samples, int len) { +int CountZeroCrossings(const float* samples, int length) { // The sample values must pass beyond |kAmplitudeThreshold| on the opposite // side of zero before a crossing will be counted. const float kAmplitudeThreshold = 0.03f; // 3% of max amplitude. @@ -61,9 +49,9 @@ int CountZeroCrossings(const float* samples, int len) { int count = 0; int i = 0; float last = 0.0f; - for (; i < len && fabsf(last) < kAmplitudeThreshold; ++i) + for (; i < length && fabsf(last) < kAmplitudeThreshold; ++i) last = samples[i]; - for (; i < len; ++i) { + for (; i < length; ++i) { if (fabsf(samples[i]) >= kAmplitudeThreshold && (last < 0) != (samples[i] < 0)) { ++count; @@ -73,25 +61,6 @@ int CountZeroCrossings(const float* samples, int len) { return count; } -int CountZeroCrossings(const std::vector<int16>& samples) { - // The sample values must pass beyond |kAmplitudeThreshold| on the opposite - // side of zero before a crossing will be counted. - const int kAmplitudeThreshold = 1000; // Approx. 3% of max amplitude. - - int count = 0; - std::vector<int16>::const_iterator i = samples.begin(); - int16 last = 0; - for (; i != samples.end() && abs(last) < kAmplitudeThreshold; ++i) - last = *i; - for (; i != samples.end(); ++i) { - if (abs(*i) >= kAmplitudeThreshold && (last < 0) != (*i < 0)) { - ++count; - last = *i; - } - } - return count; -} - // EncodeTimestamp stores a 16-bit number as frequencies in a sample. // Our internal code tends to work on 10ms chunks of data, and to // make sure the decoding always work, I wanted to make sure that the @@ -122,12 +91,13 @@ const int kSamplingFrequency = 48000; const size_t kNumBits = 16; const size_t kSamplesToAnalyze = kSamplingFrequency / kBaseFrequency; const double kSenseFrequency = kBaseFrequency * (kNumBits + 1); -const double kMinSense = 50000.0; +const double kMinSense = 1.5; bool EncodeTimestamp(uint16 timestamp, size_t sample_offset, - std::vector<int16>* samples) { - if (samples->size() < kSamplesToAnalyze) { + size_t length, + float* samples) { + if (length < kSamplesToAnalyze) { return false; } // gray-code the number @@ -140,13 +110,15 @@ bool EncodeTimestamp(uint16 timestamp, } // Carrier sense frequency frequencies.push_back(kSenseFrequency); - for (size_t i = 0; i < samples->size(); i++) { - double ret = 0.0; + for (size_t i = 0; i < length; i++) { + double mix_of_components = 0.0; for (size_t f = 0; f < frequencies.size(); f++) { - ret += sin((i + sample_offset) * Pi * 2.0 * frequencies[f] / - kSamplingFrequency); + mix_of_components += sin((i + sample_offset) * Pi * 2.0 * frequencies[f] / + kSamplingFrequency); } - (*samples)[i] = ret * 32766 / (kNumBits + 1); + mix_of_components /= kNumBits + 1; + DCHECK_LE(fabs(mix_of_components), 1.0); + samples[i] = mix_of_components; } return true; } @@ -158,7 +130,7 @@ namespace { // With an FFT we would verify that none of the higher frequencies // contain a lot of energy, which would be useful in detecting // bogus data. -double DecodeOneFrequency(const int16* samples, +double DecodeOneFrequency(const float* samples, size_t length, double frequency) { double sin_sum = 0.0; @@ -175,9 +147,9 @@ double DecodeOneFrequency(const int16* samples, // each of the bits. Each frequency must have a strength that is similar to // the sense frequency or to zero, or the decoding fails. If it fails, we // move head by 60 samples and try again until we run out of samples. -bool DecodeTimestamp(const std::vector<int16>& samples, uint16* timestamp) { +bool DecodeTimestamp(const float* samples, size_t length, uint16* timestamp) { for (size_t start = 0; - start + kSamplesToAnalyze <= samples.size(); + start + kSamplesToAnalyze <= length; start += kSamplesToAnalyze / 4) { double sense = DecodeOneFrequency(&samples[start], kSamplesToAnalyze, diff --git a/media/cast/test/utility/audio_utility.h b/media/cast/test/utility/audio_utility.h index 1cb0585df0..36ef858da1 100644 --- a/media/cast/test/utility/audio_utility.h +++ b/media/cast/test/utility/audio_utility.h @@ -18,8 +18,6 @@ class AudioBus; namespace media { namespace cast { -struct PcmAudioFrame; - // Produces AudioBuses of varying duration where each successive output contains // the continuation of a single sine wave. class TestAudioBusFactory { @@ -46,35 +44,37 @@ class TestAudioBusFactory { DISALLOW_COPY_AND_ASSIGN(TestAudioBusFactory); }; -// Convenience function to convert an |audio_bus| to its equivalent -// PcmAudioFrame. -// TODO(miu): Remove this once all code has migrated to use AudioBus. See -// comment in media/cast/cast_config.h. -scoped_ptr<PcmAudioFrame> ToPcmAudioFrame(const AudioBus& audio_bus, - int sample_rate); - // Assuming |samples| contains a single-frequency sine wave (and maybe some // low-amplitude noise), count the number of times the sine wave crosses // zero. -int CountZeroCrossings(const float* samples, int len); -// DEPRECATED: -int CountZeroCrossings(const std::vector<int16>& samples); +// +// Example use case: When expecting a 440 Hz tone, this can be checked using the +// following expression: +// +// abs((CountZeroCrossings(...) / seconds_per_frame / 2) - 440) <= 1 +// +// ...where seconds_per_frame is the number of samples divided by the sampling +// rate. The divide by two accounts for the fact that a sine wave crosses zero +// twice per cycle (first downwards, then upwards). The absolute maximum +// difference of 1 accounts for the sine wave being out of perfect phase. +int CountZeroCrossings(const float* samples, int length); // Encode |timestamp| into the samples pointed to by 'samples' in a way // that should be decodable even after compressing/decompressing the audio. // Assumes 48Khz sampling rate and needs at least 240 samples. Returns -// false if |samples| is too small. If more than 240 samples are available, -// then the timestamp will be repeated. |sample_offset| should contain how -// many samples has been encoded so far, so that we can make smooth +// false if |length| of |samples| is too small. If more than 240 samples are +// available, then the timestamp will be repeated. |sample_offset| should +// contain how many samples has been encoded so far, so that we can make smooth // transitions between encoded chunks. // See audio_utility.cc for details on how the encoding is done. bool EncodeTimestamp(uint16 timestamp, size_t sample_offset, - std::vector<int16>* samples); + size_t length, + float* samples); // Decode a timestamp encoded with EncodeTimestamp. Returns true if a // timestamp was found in |samples|. -bool DecodeTimestamp(const std::vector<int16>& samples, uint16* timestamp); +bool DecodeTimestamp(const float* samples, size_t length, uint16* timestamp); } // namespace cast } // namespace media diff --git a/media/cast/test/utility/audio_utility_unittest.cc b/media/cast/test/utility/audio_utility_unittest.cc index 3e6ea893b7..951d676514 100644 --- a/media/cast/test/utility/audio_utility_unittest.cc +++ b/media/cast/test/utility/audio_utility_unittest.cc @@ -12,27 +12,30 @@ namespace test { namespace { TEST(AudioTimestampTest, Small) { - std::vector<int16> samples(480); + std::vector<float> samples(480); for (int32 in_timestamp = 0; in_timestamp < 65536; in_timestamp += 177) { - EncodeTimestamp(in_timestamp, 0, &samples); + EncodeTimestamp(in_timestamp, 0, samples.size(), &samples.front()); uint16 out_timestamp; - EXPECT_TRUE(DecodeTimestamp(samples, &out_timestamp)); + EXPECT_TRUE( + DecodeTimestamp(&samples.front(), samples.size(), &out_timestamp)); ASSERT_EQ(in_timestamp, out_timestamp); } } TEST(AudioTimestampTest, Negative) { - std::vector<int16> samples(480); + std::vector<float> samples(480); uint16 out_timestamp; - EXPECT_FALSE(DecodeTimestamp(samples, &out_timestamp)); + EXPECT_FALSE( + DecodeTimestamp(&samples.front(), samples.size(), &out_timestamp)); } TEST(AudioTimestampTest, CheckPhase) { - std::vector<int16> samples(4800); - EncodeTimestamp(4711, 0, &samples); + std::vector<float> samples(4800); + EncodeTimestamp(4711, 0, samples.size(), &samples.front()); while (samples.size() > 240) { uint16 out_timestamp; - EXPECT_TRUE(DecodeTimestamp(samples, &out_timestamp)); + EXPECT_TRUE( + DecodeTimestamp(&samples.front(), samples.size(), &out_timestamp)); ASSERT_EQ(4711, out_timestamp); samples.erase(samples.begin(), samples.begin() + 73); diff --git a/media/cast/test/utility/generate_timecode_audio.cc b/media/cast/test/utility/generate_timecode_audio.cc index 27d9a32d8c..2681a53ceb 100644 --- a/media/cast/test/utility/generate_timecode_audio.cc +++ b/media/cast/test/utility/generate_timecode_audio.cc @@ -2,10 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include <stdio.h> -#include <stdlib.h> +#include <algorithm> +#include <cstdio> +#include <cstdlib> #include <vector> +#include "base/basictypes.h" #include "media/cast/test/utility/audio_utility.h" const size_t kSamplingFrequency = 48000; @@ -16,17 +18,19 @@ int main(int argc, char **argv) { exit(1); } int fps = atoi(argv[1]); - int frames = atoi(argv[2]); - std::vector<int16> samples(kSamplingFrequency / fps); + const uint32 frames = static_cast<uint32>(std::max(0, atoi(argv[2]))); + std::vector<float> samples(kSamplingFrequency / fps); size_t num_samples = 0; for (uint32 frame_id = 1; frame_id <= frames; frame_id++) { - CHECK(media::cast::EncodeTimestamp(frame_id, num_samples, &samples)); + CHECK(media::cast::EncodeTimestamp( + frame_id, num_samples, samples.size(), &samples.front())); num_samples += samples.size(); - for (size_t sample = 0; sample < samples.size(); sample++) { - putchar(samples[sample] & 0xff); - putchar(samples[sample] >> 8); - putchar(samples[sample] & 0xff); - putchar(samples[sample] >> 8); + for (size_t i = 0; i < samples.size(); ++i) { + const int16 sample_s16 = static_cast<int16>(samples[i] * kint16max); + putchar(sample_s16 & 0xff); + putchar(sample_s16 >> 8); + putchar(sample_s16 & 0xff); + putchar(sample_s16 >> 8); } } } diff --git a/media/cast/test/utility/in_process_receiver.cc b/media/cast/test/utility/in_process_receiver.cc index 2b67666e73..ada4da4774 100644 --- a/media/cast/test/utility/in_process_receiver.cc +++ b/media/cast/test/utility/in_process_receiver.cc @@ -66,13 +66,6 @@ void InProcessReceiver::StopOnMainThread(base::WaitableEvent* event) { event->Signal(); } -void InProcessReceiver::DestroySoon() { - cast_environment_->PostTask( - CastEnvironment::MAIN, - FROM_HERE, - base::Bind(&InProcessReceiver::WillDestroyReceiver, base::Owned(this))); -} - void InProcessReceiver::UpdateCastTransportStatus(CastTransportStatus status) { LOG_IF(ERROR, status == media::cast::transport::TRANSPORT_SOCKET_ERROR) << "Transport socket error occurred. InProcessReceiver is likely dead."; @@ -104,25 +97,18 @@ void InProcessReceiver::GotAudioFrame(scoped_ptr<AudioBus> audio_frame, const base::TimeTicks& playout_time, bool is_continuous) { DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); - if (audio_frame.get()) { - // TODO(miu): Remove use of deprecated PcmAudioFrame and also pass - // |is_continuous| flag. - scoped_ptr<PcmAudioFrame> pcm_frame(new PcmAudioFrame()); - pcm_frame->channels = audio_frame->channels(); - pcm_frame->frequency = audio_config_.frequency; - pcm_frame->samples.resize(audio_frame->channels() * audio_frame->frames()); - audio_frame->ToInterleaved( - audio_frame->frames(), sizeof(int16), &pcm_frame->samples.front()); - OnAudioFrame(pcm_frame.Pass(), playout_time); - } + if (audio_frame.get()) + OnAudioFrame(audio_frame.Pass(), playout_time, is_continuous); PullNextAudioFrame(); } void InProcessReceiver::GotVideoFrame( const scoped_refptr<VideoFrame>& video_frame, - const base::TimeTicks& render_time) { + const base::TimeTicks& playout_time, + bool is_continuous) { DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); - OnVideoFrame(video_frame, render_time); + if (video_frame) + OnVideoFrame(video_frame, playout_time, is_continuous); PullNextVideoFrame(); } @@ -139,10 +125,5 @@ void InProcessReceiver::PullNextVideoFrame() { &InProcessReceiver::GotVideoFrame, weak_factory_.GetWeakPtr())); } -// static -void InProcessReceiver::WillDestroyReceiver(InProcessReceiver* receiver) { - DCHECK(receiver->cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); -} - } // namespace cast } // namespace media diff --git a/media/cast/test/utility/in_process_receiver.h b/media/cast/test/utility/in_process_receiver.h index a5a2addd5c..06a798eb4c 100644 --- a/media/cast/test/utility/in_process_receiver.h +++ b/media/cast/test/utility/in_process_receiver.h @@ -49,33 +49,30 @@ class InProcessReceiver { const AudioReceiverConfig& audio_config, const VideoReceiverConfig& video_config); - // Must be destroyed on the cast MAIN thread. See DestroySoon(). virtual ~InProcessReceiver(); - // Convenience accessor to CastEnvironment. + // Convenience accessors. scoped_refptr<CastEnvironment> cast_env() const { return cast_environment_; } + const AudioReceiverConfig& audio_config() const { return audio_config_; } + const VideoReceiverConfig& video_config() const { return video_config_; } // Begin delivering any received audio/video frames to the OnXXXFrame() // methods. - void Start(); - - // Schedules destruction on the cast MAIN thread. Any external references to - // the InProcessReceiver instance become invalid. - // Deprecated: Use Stop instead. - // TODO(hubbe): Remove this function and change callers to use Stop. - void DestroySoon(); + virtual void Start(); // Destroy the sub-compontents of this class. // After this call, it is safe to destroy this object on any thread. - void Stop(); + virtual void Stop(); protected: // To be implemented by subclasses. These are called on the Cast MAIN thread // as each frame is received. - virtual void OnAudioFrame(scoped_ptr<PcmAudioFrame> audio_frame, - const base::TimeTicks& playout_time) = 0; + virtual void OnAudioFrame(scoped_ptr<AudioBus> audio_frame, + const base::TimeTicks& playout_time, + bool is_continuous) = 0; virtual void OnVideoFrame(const scoped_refptr<VideoFrame>& video_frame, - const base::TimeTicks& render_time) = 0; + const base::TimeTicks& playout_time, + bool is_continuous) = 0; // Helper method that creates |transport_| and |cast_receiver_|, starts // |transport_| receiving, and requests the first audio/video frame. @@ -93,18 +90,18 @@ class InProcessReceiver { private: friend class base::RefCountedThreadSafe<InProcessReceiver>; - // CastReceiver callbacks that receive a frame and then request another. + // CastReceiver callbacks that receive a frame and then request another. See + // comments for the callbacks defined in src/media/cast/cast_receiver.h for + // argument description and semantics. void GotAudioFrame(scoped_ptr<AudioBus> audio_frame, const base::TimeTicks& playout_time, bool is_continuous); void GotVideoFrame(const scoped_refptr<VideoFrame>& video_frame, - const base::TimeTicks& render_time); + const base::TimeTicks& playout_time, + bool is_continuous); void PullNextAudioFrame(); void PullNextVideoFrame(); - // Invoked just before the destruction of |receiver| on the cast MAIN thread. - static void WillDestroyReceiver(InProcessReceiver* receiver); - const scoped_refptr<CastEnvironment> cast_environment_; const net::IPEndPoint local_end_point_; const net::IPEndPoint remote_end_point_; diff --git a/media/cast/test/utility/standalone_cast_environment.cc b/media/cast/test/utility/standalone_cast_environment.cc index 790b283fad..562079e796 100644 --- a/media/cast/test/utility/standalone_cast_environment.cc +++ b/media/cast/test/utility/standalone_cast_environment.cc @@ -26,7 +26,6 @@ StandaloneCastEnvironment::StandaloneCastEnvironment() base::Thread::Options(base::MessageLoop::TYPE_IO, 0)); CREATE_TASK_RUNNER(audio, base::Thread::Options()); CREATE_TASK_RUNNER(video, base::Thread::Options()); - #undef CREATE_TASK_RUNNER } diff --git a/media/cast/test/utility/standalone_cast_environment.h b/media/cast/test/utility/standalone_cast_environment.h index cf2674e61e..262f7d6e57 100644 --- a/media/cast/test/utility/standalone_cast_environment.h +++ b/media/cast/test/utility/standalone_cast_environment.h @@ -23,7 +23,7 @@ class StandaloneCastEnvironment : public CastEnvironment, // complete. void Shutdown(); - private: + protected: virtual ~StandaloneCastEnvironment(); base::Thread main_thread_; diff --git a/media/cast/test/utility/udp_proxy.cc b/media/cast/test/utility/udp_proxy.cc index 62c64b1b7b..5936ef5fe3 100644 --- a/media/cast/test/utility/udp_proxy.cc +++ b/media/cast/test/utility/udp_proxy.cc @@ -5,6 +5,7 @@ #include "media/cast/test/utility/udp_proxy.h" #include "base/logging.h" +#include "base/memory/linked_ptr.h" #include "base/rand_util.h" #include "base/synchronization/waitable_event.h" #include "base/threading/thread.h" @@ -18,12 +19,10 @@ namespace test { const size_t kMaxPacketSize = 65536; -Packet::Packet(size_t size) : data(size) {} -Packet::~Packet() {} - PacketPipe::PacketPipe() {} PacketPipe::~PacketPipe() {} void PacketPipe::InitOnIOThread() { + task_runner_ = base::MessageLoopProxy::current(); if (pipe_) { pipe_->InitOnIOThread(); } @@ -41,18 +40,16 @@ void PacketPipe::AppendToPipe(scoped_ptr<PacketPipe> pipe) { // Packets are output at a maximum bandwidth. class Buffer : public PacketPipe { public: - Buffer(size_t buffer_size, - double max_megabits_per_second) : - buffer_size_(0), - max_buffer_size_(buffer_size), - max_megabits_per_second_(max_megabits_per_second), - weak_factory_(this) { - } - - virtual void Send(scoped_refptr<Packet> packet) OVERRIDE { - if (packet->data.size() + buffer_size_ <= max_buffer_size_) { - buffer_.push_back(packet); - buffer_size_ += packet->data.size(); + Buffer(size_t buffer_size, double max_megabits_per_second) + : buffer_size_(0), + max_buffer_size_(buffer_size), + max_megabits_per_second_(max_megabits_per_second), + weak_factory_(this) {} + + virtual void Send(scoped_ptr<transport::Packet> packet) OVERRIDE { + if (packet->size() + buffer_size_ <= max_buffer_size_) { + buffer_size_ += packet->size(); + buffer_.push_back(linked_ptr<transport::Packet>(packet.release())); if (buffer_.size() == 1) { Schedule(); } @@ -61,10 +58,10 @@ class Buffer : public PacketPipe { private: void Schedule() { - double megabits = buffer_.front()->data.size() * 8 / 1000000.0; + double megabits = buffer_.front()->size() * 8 / 1000000.0; double seconds = megabits / max_megabits_per_second_; int64 microseconds = static_cast<int64>(seconds * 1E6); - base::MessageLoop::current()->PostDelayedTask( + task_runner_->PostDelayedTask( FROM_HERE, base::Bind(&Buffer::ProcessBuffer, weak_factory_.GetWeakPtr()), base::TimeDelta::FromMicroseconds(microseconds)); @@ -72,15 +69,16 @@ class Buffer : public PacketPipe { void ProcessBuffer() { CHECK(!buffer_.empty()); - pipe_->Send(buffer_.front()); - buffer_size_ -= buffer_.front()->data.size(); + scoped_ptr<transport::Packet> packet(buffer_.front().release()); + buffer_size_ -= packet->size(); buffer_.pop_front(); + pipe_->Send(packet.Pass()); if (!buffer_.empty()) { Schedule(); } } - std::deque<scoped_refptr<Packet> > buffer_; + std::deque<linked_ptr<transport::Packet> > buffer_; size_t buffer_size_; size_t max_buffer_size_; double max_megabits_per_second_; // megabits per second @@ -96,9 +94,9 @@ class RandomDrop : public PacketPipe { RandomDrop(double drop_fraction) : drop_fraction_(drop_fraction) { } - virtual void Send(scoped_refptr<Packet> packet) OVERRIDE { + virtual void Send(scoped_ptr<transport::Packet> packet) OVERRIDE { if (base::RandDouble() >= drop_fraction_) { - pipe_->Send(packet); + pipe_->Send(packet.Pass()); } } @@ -112,26 +110,24 @@ scoped_ptr<PacketPipe> NewRandomDrop(double drop_fraction) { class SimpleDelayBase : public PacketPipe { public: - SimpleDelayBase() : weak_factory_(this) { - } + SimpleDelayBase() : weak_factory_(this) {} virtual ~SimpleDelayBase() {} - virtual void Send(scoped_refptr<Packet> packet) OVERRIDE { + virtual void Send(scoped_ptr<transport::Packet> packet) OVERRIDE { double seconds = GetDelay(); - base::MessageLoop::current()->PostDelayedTask( + task_runner_->PostDelayedTask( FROM_HERE, base::Bind(&SimpleDelayBase::SendInternal, weak_factory_.GetWeakPtr(), - packet), - base::TimeDelta::FromMicroseconds( - static_cast<int64>(seconds * 1E6))); + base::Passed(&packet)), + base::TimeDelta::FromMicroseconds(static_cast<int64>(seconds * 1E6))); } protected: virtual double GetDelay() = 0; private: - virtual void SendInternal(scoped_refptr<Packet> packet) { - pipe_->Send(packet); + virtual void SendInternal(scoped_ptr<transport::Packet> packet) { + pipe_->Send(packet.Pass()); } base::WeakPtrFactory<SimpleDelayBase> weak_factory_; @@ -139,8 +135,7 @@ class SimpleDelayBase : public PacketPipe { class ConstantDelay : public SimpleDelayBase { public: - ConstantDelay(double delay_seconds) : delay_seconds_(delay_seconds) { - } + ConstantDelay(double delay_seconds) : delay_seconds_(delay_seconds) {} virtual double GetDelay() OVERRIDE { return delay_seconds_; } @@ -150,15 +145,12 @@ class ConstantDelay : public SimpleDelayBase { }; scoped_ptr<PacketPipe> NewConstantDelay(double delay_seconds) { - return scoped_ptr<PacketPipe>( - new ConstantDelay(delay_seconds)).Pass(); + return scoped_ptr<PacketPipe>(new ConstantDelay(delay_seconds)).Pass(); } class RandomUnsortedDelay : public SimpleDelayBase { public: - RandomUnsortedDelay(double random_delay) : - random_delay_(random_delay) { - } + RandomUnsortedDelay(double random_delay) : random_delay_(random_delay) {} virtual double GetDelay() OVERRIDE { return random_delay_ * base::RandDouble(); @@ -169,8 +161,7 @@ class RandomUnsortedDelay : public SimpleDelayBase { }; scoped_ptr<PacketPipe> NewRandomUnsortedDelay(double random_delay) { - return scoped_ptr<PacketPipe>( - new RandomUnsortedDelay(random_delay)).Pass(); + return scoped_ptr<PacketPipe>(new RandomUnsortedDelay(random_delay)).Pass(); } @@ -178,15 +169,14 @@ class RandomSortedDelay : public PacketPipe { public: RandomSortedDelay(double random_delay, double extra_delay, - double seconds_between_extra_delay) : - random_delay_(random_delay), - extra_delay_(extra_delay), - seconds_between_extra_delay_(seconds_between_extra_delay), - weak_factory_(this) { - } - - virtual void Send(scoped_refptr<Packet> packet) OVERRIDE { - buffer_.push_back(packet); + double seconds_between_extra_delay) + : random_delay_(random_delay), + extra_delay_(extra_delay), + seconds_between_extra_delay_(seconds_between_extra_delay), + weak_factory_(this) {} + + virtual void Send(scoped_ptr<transport::Packet> packet) OVERRIDE { + buffer_.push_back(linked_ptr<transport::Packet>(packet.release())); if (buffer_.size() == 1) { Schedule(); } @@ -202,7 +192,7 @@ class RandomSortedDelay : public PacketPipe { void ScheduleExtraDelay(double mult) { double seconds = seconds_between_extra_delay_ * mult * base::RandDouble(); int64 microseconds = static_cast<int64>(seconds * 1E6); - base::MessageLoop::current()->PostDelayedTask( + task_runner_->PostDelayedTask( FROM_HERE, base::Bind(&RandomSortedDelay::CauseExtraDelay, weak_factory_.GetWeakPtr()), @@ -229,16 +219,16 @@ class RandomSortedDelay : public PacketPipe { block_time = delay_time; } - base::MessageLoop::current()->PostDelayedTask( - FROM_HERE, - base::Bind(&RandomSortedDelay::ProcessBuffer, - weak_factory_.GetWeakPtr()), - delay_time); + task_runner_->PostDelayedTask(FROM_HERE, + base::Bind(&RandomSortedDelay::ProcessBuffer, + weak_factory_.GetWeakPtr()), + delay_time); } void ProcessBuffer() { CHECK(!buffer_.empty()); - pipe_->Send(buffer_.front()); + scoped_ptr<transport::Packet> packet(buffer_.front().release()); + pipe_->Send(packet.Pass()); buffer_.pop_front(); if (!buffer_.empty()) { Schedule(); @@ -246,7 +236,7 @@ class RandomSortedDelay : public PacketPipe { } base::TimeTicks block_until_; - std::deque<scoped_refptr<Packet> > buffer_; + std::deque<linked_ptr<transport::Packet> > buffer_; double random_delay_; double extra_delay_; double seconds_between_extra_delay_; @@ -258,29 +248,27 @@ scoped_ptr<PacketPipe> NewRandomSortedDelay( double extra_delay, double seconds_between_extra_delay) { return scoped_ptr<PacketPipe>( - new RandomSortedDelay(random_delay, - extra_delay, - seconds_between_extra_delay)).Pass(); + new RandomSortedDelay( + random_delay, extra_delay, seconds_between_extra_delay)) + .Pass(); } class NetworkGlitchPipe : public PacketPipe { public: - NetworkGlitchPipe(double average_work_time, - double average_outage_time) : - works_(false), - max_work_time_(average_work_time * 2), - max_outage_time_(average_outage_time * 2), - weak_factory_(this) { - } + NetworkGlitchPipe(double average_work_time, double average_outage_time) + : works_(false), + max_work_time_(average_work_time * 2), + max_outage_time_(average_outage_time * 2), + weak_factory_(this) {} virtual void InitOnIOThread() OVERRIDE { PacketPipe::InitOnIOThread(); Flip(); } - virtual void Send(scoped_refptr<Packet> packet) OVERRIDE { + virtual void Send(scoped_ptr<transport::Packet> packet) OVERRIDE { if (works_) { - pipe_->Send(packet); + pipe_->Send(packet.Pass()); } } @@ -290,10 +278,9 @@ class NetworkGlitchPipe : public PacketPipe { double seconds = base::RandDouble() * (works_ ? max_work_time_ : max_outage_time_); int64 microseconds = static_cast<int64>(seconds * 1E6); - base::MessageLoop::current()->PostDelayedTask( + task_runner_->PostDelayedTask( FROM_HERE, - base::Bind(&NetworkGlitchPipe::Flip, - weak_factory_.GetWeakPtr()), + base::Bind(&NetworkGlitchPipe::Flip, weak_factory_.GetWeakPtr()), base::TimeDelta::FromMicroseconds(microseconds)); } @@ -306,7 +293,8 @@ class NetworkGlitchPipe : public PacketPipe { scoped_ptr<PacketPipe> NewNetworkGlitchPipe(double average_work_time, double average_outage_time) { return scoped_ptr<PacketPipe>( - new NetworkGlitchPipe(average_work_time, average_outage_time)).Pass(); + new NetworkGlitchPipe(average_work_time, average_outage_time)) + .Pass(); } class PacketSender : public PacketPipe { @@ -318,17 +306,18 @@ class PacketSender : public PacketPipe { destination_(destination), weak_factory_(this) { } - virtual void Send(scoped_refptr<Packet> packet) OVERRIDE { + virtual void Send(scoped_ptr<transport::Packet> packet) OVERRIDE { if (blocked_) { LOG(ERROR) << "Cannot write packet right now: blocked"; return; } - VLOG(1) << "Sending packet, len = " << packet->data.size(); + VLOG(1) << "Sending packet, len = " << packet->size(); // We ignore all problems, callbacks and errors. // If it didn't work we just drop the packet at and call it a day. - scoped_refptr<net::IOBuffer> buf = new net::WrappedIOBuffer( - reinterpret_cast<char*>(&packet->data.front())); + scoped_refptr<net::IOBuffer> buf = + new net::WrappedIOBuffer(reinterpret_cast<char*>(&packet->front())); + size_t buf_size = packet->size(); int result; if (destination_->address().empty()) { VLOG(1) << "Destination has not been set yet."; @@ -336,12 +325,12 @@ class PacketSender : public PacketPipe { } else { VLOG(1) << "Destination:" << destination_->ToString(); result = udp_socket_->SendTo(buf, - static_cast<int>(packet->data.size()), + static_cast<int>(buf_size), *destination_, base::Bind(&PacketSender::AllowWrite, weak_factory_.GetWeakPtr(), buf, - packet)); + base::Passed(&packet))); } if (result == net::ERR_IO_PENDING) { blocked_ = true; @@ -355,7 +344,7 @@ class PacketSender : public PacketPipe { private: void AllowWrite(scoped_refptr<net::IOBuffer> buf, - scoped_refptr<Packet> packet, + scoped_ptr<transport::Packet> packet, int unused_len) { DCHECK(blocked_); blocked_ = false; @@ -421,19 +410,33 @@ class UDPProxyImpl : public UDPProxy { destination_(destination), proxy_thread_("media::cast::test::UdpProxy Thread"), to_dest_pipe_(to_dest_pipe.Pass()), - from_dest_pipe_(to_dest_pipe.Pass()), - start_event_(false, false) { + from_dest_pipe_(to_dest_pipe.Pass()) { proxy_thread_.StartWithOptions( base::Thread::Options(base::MessageLoop::TYPE_IO, 0)); + base::WaitableEvent start_event(false, false); proxy_thread_.message_loop_proxy()->PostTask( FROM_HERE, base::Bind(&UDPProxyImpl::Start, base::Unretained(this), + base::Unretained(&start_event), net_log)); - start_event_.Wait(); + start_event.Wait(); } - void Start(net::NetLog* net_log) { + virtual ~UDPProxyImpl() { + base::WaitableEvent stop_event(false, false); + proxy_thread_.message_loop_proxy()->PostTask( + FROM_HERE, + base::Bind(&UDPProxyImpl::Stop, + base::Unretained(this), + base::Unretained(&stop_event))); + stop_event.Wait(); + proxy_thread_.Stop(); + } + + private: + void Start(base::WaitableEvent* start_event, + net::NetLog* net_log) { socket_.reset(new net::UDPSocket(net::DatagramSocket::DEFAULT_BIND, net::RandIntCallback(), net_log, @@ -449,17 +452,18 @@ class UDPProxyImpl : public UDPProxy { CHECK_GE(socket_->Bind(local_port_), 0); - start_event_.Signal(); + start_event->Signal(); PollRead(); } - virtual ~UDPProxyImpl() { - proxy_thread_.Stop(); + void Stop(base::WaitableEvent* stop_event) { + to_dest_pipe_.reset(NULL); + from_dest_pipe_.reset(NULL); + socket_.reset(NULL); + stop_event->Signal(); } - - void ProcessPacket(scoped_refptr<Packet> packet, - scoped_refptr<net::IOBuffer> recv_buf, + void ProcessPacket(scoped_refptr<net::IOBuffer> recv_buf, int len) { DCHECK_NE(len, net::ERR_IO_PENDING); VLOG(1) << "Got packet, len = " << len; @@ -467,43 +471,41 @@ class UDPProxyImpl : public UDPProxy { LOG(WARNING) << "Socket read error: " << len; return; } - packet->data.resize(len); + packet_->resize(len); if (recv_address_ == destination_) { - from_dest_pipe_->Send(packet); + from_dest_pipe_->Send(packet_.Pass()); } else { VLOG(1) << "Return address = " << recv_address_.ToString(); return_address_ = recv_address_; - to_dest_pipe_->Send(packet); + to_dest_pipe_->Send(packet_.Pass()); } } - void ReadCallback(scoped_refptr<Packet> packet, - scoped_refptr<net::IOBuffer> recv_buf, + void ReadCallback(scoped_refptr<net::IOBuffer> recv_buf, int len) { - ProcessPacket(packet, recv_buf, len); + ProcessPacket(recv_buf, len); PollRead(); } void PollRead() { while (true) { - scoped_refptr<Packet> packet(new Packet(kMaxPacketSize)); - scoped_refptr<net::IOBuffer> recv_buf = new net::WrappedIOBuffer( - reinterpret_cast<char*>(&packet->data.front())); + packet_.reset(new transport::Packet(kMaxPacketSize)); + scoped_refptr<net::IOBuffer> recv_buf = + new net::WrappedIOBuffer(reinterpret_cast<char*>(&packet_->front())); int len = socket_->RecvFrom( recv_buf, kMaxPacketSize, &recv_address_, base::Bind(&UDPProxyImpl::ReadCallback, base::Unretained(this), - packet, recv_buf)); if (len == net::ERR_IO_PENDING) break; - ProcessPacket(packet, recv_buf, len); + ProcessPacket(recv_buf, len); } } - private: + net::IPEndPoint local_port_; net::IPEndPoint destination_; net::IPEndPoint recv_address_; @@ -512,7 +514,7 @@ class UDPProxyImpl : public UDPProxy { scoped_ptr<net::UDPSocket> socket_; scoped_ptr<PacketPipe> to_dest_pipe_; scoped_ptr<PacketPipe> from_dest_pipe_; - base::WaitableEvent start_event_; + scoped_ptr<transport::Packet> packet_; }; scoped_ptr<UDPProxy> UDPProxy::Create( diff --git a/media/cast/test/utility/udp_proxy.h b/media/cast/test/utility/udp_proxy.h index c66f2e1bbb..322572a8fe 100644 --- a/media/cast/test/utility/udp_proxy.h +++ b/media/cast/test/utility/udp_proxy.h @@ -10,6 +10,8 @@ #include "base/basictypes.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" +#include "base/single_thread_task_runner.h" +#include "media/cast/transport/cast_transport_config.h" #include "net/base/ip_endpoint.h" namespace net { @@ -20,29 +22,17 @@ namespace media { namespace cast { namespace test { -// A single UDP packet. -// Technically, our UDP proxy should really chop UDP packets -// into MTU-sized chunks and then do all the horribly things it -// does to those chunks, but since cast *should* normally only -// send packets that are sized below the MTU limit, we should -// be able to ignore that. -struct Packet : public base::RefCountedThreadSafe<Packet> { - explicit Packet(size_t size); - std::vector<unsigned char> data; - private: - friend class base::RefCountedThreadSafe<Packet>; - ~Packet(); -}; - class PacketPipe { public: PacketPipe(); virtual ~PacketPipe(); - virtual void Send(scoped_refptr<Packet> packet) = 0; + virtual void Send(scoped_ptr<transport::Packet> packet) = 0; virtual void InitOnIOThread(); virtual void AppendToPipe(scoped_ptr<PacketPipe> pipe); protected: scoped_ptr<PacketPipe> pipe_; + // Allows injection of fake task runner for testing. + scoped_refptr<base::SingleThreadTaskRunner> task_runner_; }; // A UDPProxy will set up a UDP socket and bind to |local_port|. @@ -87,16 +77,17 @@ scoped_ptr<PacketPipe> NewRandomUnsortedDelay(double delay); // packet is asically |min_delay| + random( |random_delay| ) // However, every now and then a delay of |big_delay| will be // inserted (roughly every |seconds_between_big_delay| seconds). -scoped_ptr<PacketPipe> NewRandomSortedDelay(double random_delay, - double big_delay, - double seconds_between_big_delay); +scoped_ptr<PacketPipe> NewRandomSortedDelay( + double random_delay, + double big_delay, + double seconds_between_big_delay); // This PacketPipe emulates network outages. It basically waits // for 0-2*|average_work_time| seconds, then kills the network for // 0-|2*average_outage_time| seconds. Then it starts over again. -scoped_ptr<PacketPipe> NewNetworkGlitchPipe(double average_work_time, - double average_outage_time); - +scoped_ptr<PacketPipe> NewNetworkGlitchPipe( + double average_work_time, + double average_outage_time); // This method builds a stack of PacketPipes to emulate a reasonably // good wifi network. ~5mbit, 1% packet loss, ~3ms latency. @@ -106,7 +97,6 @@ scoped_ptr<PacketPipe> WifiNetwork(); // ~1mbit, 20% packet loss, ~40ms latency and packets can get reordered. scoped_ptr<PacketPipe> EvilNetwork(); - } // namespace test } // namespace cast } // namespace media diff --git a/media/cast/video_receiver/codecs/vp8/vp8_decoder.cc b/media/cast/video_receiver/codecs/vp8/vp8_decoder.cc deleted file mode 100644 index f25a5186e4..0000000000 --- a/media/cast/video_receiver/codecs/vp8/vp8_decoder.cc +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright 2013 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. - -#include "media/cast/video_receiver/codecs/vp8/vp8_decoder.h" - -#include "base/bind.h" -#include "base/debug/trace_event.h" -#include "base/logging.h" -#include "base/message_loop/message_loop.h" -#include "media/base/video_frame.h" -#include "media/base/video_util.h" -#include "media/cast/logging/logging_defines.h" -#include "third_party/libvpx/source/libvpx/vpx/vp8dx.h" -#include "ui/gfx/size.h" - -namespace { - -void LogFrameDecodedEvent( - const scoped_refptr<media::cast::CastEnvironment>& cast_environment, - base::TimeTicks event_time, - media::cast::RtpTimestamp rtp_timestamp, - uint32 frame_id) { - cast_environment->Logging()->InsertFrameEvent( - event_time, media::cast::kVideoFrameDecoded, rtp_timestamp, frame_id); -} - -} // namespace - -namespace media { -namespace cast { - -Vp8Decoder::Vp8Decoder(scoped_refptr<CastEnvironment> cast_environment) - : cast_environment_(cast_environment) { - // Make sure that we initialize the decoder from the correct thread. - cast_environment_->PostTask( - CastEnvironment::VIDEO, - FROM_HERE, - base::Bind(&Vp8Decoder::InitDecoder, base::Unretained(this))); -} - -Vp8Decoder::~Vp8Decoder() { - if (decoder_) { - vpx_codec_err_t ret = vpx_codec_destroy(decoder_.get()); - CHECK_EQ(VPX_CODEC_OK, ret) << "vpx_codec_destroy() failed."; - } -} - -void Vp8Decoder::InitDecoder() { - vpx_codec_dec_cfg_t cfg; - // Initializing to use one core. - cfg.threads = 1; - vpx_codec_flags_t flags = VPX_CODEC_USE_POSTPROC; - - DCHECK(!decoder_); - decoder_.reset(new vpx_dec_ctx_t()); - vpx_codec_err_t ret = - vpx_codec_dec_init(decoder_.get(), vpx_codec_vp8_dx(), &cfg, flags); - if (ret != VPX_CODEC_OK) { - DCHECK(false) << "vpx_codec_dec_init() failed."; - decoder_.reset(); - } -} - -bool Vp8Decoder::Decode(const transport::EncodedVideoFrame* encoded_frame, - const base::TimeTicks render_time, - const VideoFrameDecodedCallback& frame_decoded_cb) { - DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::VIDEO)); - const int frame_id_int = static_cast<int>(encoded_frame->frame_id); - VLOG(2) << "VP8 decode frame:" << frame_id_int - << " sized:" << encoded_frame->data.size(); - - if (encoded_frame->data.empty()) - return false; - - vpx_codec_iter_t iter = NULL; - vpx_image_t* img; - const int real_time_decoding = 1; - if (vpx_codec_decode( - decoder_.get(), - reinterpret_cast<const uint8*>(encoded_frame->data.data()), - static_cast<unsigned int>(encoded_frame->data.size()), - 0, - real_time_decoding)) { - VLOG(1) << "Failed to decode VP8 frame:" << frame_id_int; - return false; - } - - img = vpx_codec_get_frame(decoder_.get(), &iter); - if (img == NULL) { - VLOG(1) << "Skip rendering VP8 frame:" << frame_id_int; - return false; - } - - gfx::Size visible_size(img->d_w, img->d_h); - gfx::Size full_size(img->stride[VPX_PLANE_Y], img->d_h); - DCHECK(VideoFrame::IsValidConfig( - VideoFrame::I420, visible_size, gfx::Rect(visible_size), full_size)); - // Temp timing setting - will sort out timing in a follow up cl. - scoped_refptr<VideoFrame> decoded_frame = - VideoFrame::CreateFrame(VideoFrame::I420, - visible_size, - gfx::Rect(visible_size), - full_size, - base::TimeDelta()); - - // Copy each plane individually (need to account for stride). - // TODO(mikhal): Eliminate copy once http://crbug.com/321856 is resolved. - CopyPlane(VideoFrame::kYPlane, - img->planes[VPX_PLANE_Y], - img->stride[VPX_PLANE_Y], - img->d_h, - decoded_frame.get()); - CopyPlane(VideoFrame::kUPlane, - img->planes[VPX_PLANE_U], - img->stride[VPX_PLANE_U], - (img->d_h + 1) / 2, - decoded_frame.get()); - CopyPlane(VideoFrame::kVPlane, - img->planes[VPX_PLANE_V], - img->stride[VPX_PLANE_V], - (img->d_h + 1) / 2, - decoded_frame.get()); - - VLOG(2) << "Decoded frame " << frame_id_int; - - // Update logging from the main thread. - cast_environment_->PostTask(CastEnvironment::MAIN, - FROM_HERE, - base::Bind(&LogFrameDecodedEvent, - cast_environment_, - cast_environment_->Clock()->NowTicks(), - encoded_frame->rtp_timestamp, - encoded_frame->frame_id)); - - // Used by chrome/browser/extension/api/cast_streaming/performance_test.cc - TRACE_EVENT_INSTANT1( - "cast_perf_test", "FrameDecoded", - TRACE_EVENT_SCOPE_THREAD, - "rtp_timestamp", encoded_frame->rtp_timestamp); - - // Frame decoded - return frame to the user via callback. - cast_environment_->PostTask( - CastEnvironment::MAIN, - FROM_HERE, - base::Bind(frame_decoded_cb, decoded_frame, render_time)); - - return true; -} - -} // namespace cast -} // namespace media diff --git a/media/cast/video_receiver/codecs/vp8/vp8_decoder.gyp b/media/cast/video_receiver/codecs/vp8/vp8_decoder.gyp deleted file mode 100644 index c1209ff741..0000000000 --- a/media/cast/video_receiver/codecs/vp8/vp8_decoder.gyp +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright 2013 The Chromium Authors. All rights reserved. -# Use of the source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -{ - 'variables': { - 'chromium_code': 1, - }, - 'targets': [ - { - 'target_name': 'cast_vp8_decoder', - 'type': 'static_library', - 'include_dirs': [ - '<(DEPTH)/', - '<(DEPTH)/third_party/', - '<(DEPTH)/third_party/libvpx/', - ], - 'sources': [ - 'vp8_decoder.cc', - 'vp8_decoder.h', - ], # source - 'dependencies': [ - '<(DEPTH)/base/base.gyp:base', - '<(DEPTH)/third_party/libvpx/libvpx.gyp:libvpx', - ], - }, - ], -} diff --git a/media/cast/video_receiver/codecs/vp8/vp8_decoder.h b/media/cast/video_receiver/codecs/vp8/vp8_decoder.h deleted file mode 100644 index ef53a7ea83..0000000000 --- a/media/cast/video_receiver/codecs/vp8/vp8_decoder.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2013 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. - -#ifndef MEDIA_CAST_RTP_RECEVIER_CODECS_VP8_VP8_DECODER_H_ -#define MEDIA_CAST_RTP_RECEVIER_CODECS_VP8_VP8_DECODER_H_ - -#include "base/memory/scoped_ptr.h" -#include "base/threading/non_thread_safe.h" -#include "media/cast/cast_config.h" -#include "media/cast/cast_environment.h" -#include "media/cast/cast_receiver.h" -#include "third_party/libvpx/source/libvpx/vpx/vpx_decoder.h" - -typedef struct vpx_codec_ctx vpx_dec_ctx_t; - -// TODO(mikhal): Look into reusing VpxVideoDecoder. -namespace media { -namespace cast { - -// This class is not thread safe; it's only called from the cast video decoder -// thread. -class Vp8Decoder : public base::NonThreadSafe { - public: - explicit Vp8Decoder(scoped_refptr<CastEnvironment> cast_environment); - ~Vp8Decoder(); - - // Decode frame - The decoded frame will be passed via the callback. - // Will return false in case of error, and then it's up to the caller to - // release the memory. - // Ownership of the encoded_frame does not pass to the Vp8Decoder. - bool Decode(const transport::EncodedVideoFrame* encoded_frame, - const base::TimeTicks render_time, - const VideoFrameDecodedCallback& frame_decoded_cb); - - private: - // Initialize the decoder. - void InitDecoder(); - scoped_ptr<vpx_dec_ctx_t> decoder_; - scoped_refptr<CastEnvironment> cast_environment_; - - DISALLOW_COPY_AND_ASSIGN(Vp8Decoder); -}; - -} // namespace cast -} // namespace media - -#endif // MEDIA_CAST_RTP_RECEVIER_CODECS_VP8_VP8_DECODER_H_ diff --git a/media/cast/video_receiver/video_decoder.cc b/media/cast/video_receiver/video_decoder.cc index f85e117232..0964c07ede 100644 --- a/media/cast/video_receiver/video_decoder.cc +++ b/media/cast/video_receiver/video_decoder.cc @@ -4,38 +4,218 @@ #include "media/cast/video_receiver/video_decoder.h" -#include <stdint.h> - #include "base/bind.h" +#include "base/bind_helpers.h" +#include "base/location.h" #include "base/logging.h" -#include "base/message_loop/message_loop.h" -#include "media/cast/video_receiver/codecs/vp8/vp8_decoder.h" +#include "base/stl_util.h" +#include "media/base/video_util.h" +#include "media/cast/cast_defines.h" +#include "media/cast/cast_environment.h" +// VPX_CODEC_DISABLE_COMPAT excludes parts of the libvpx API that provide +// backwards compatibility for legacy applications using the library. +#define VPX_CODEC_DISABLE_COMPAT 1 +#include "third_party/libvpx/source/libvpx/vpx/vp8dx.h" +#include "third_party/libvpx/source/libvpx/vpx/vpx_decoder.h" +#include "ui/gfx/size.h" namespace media { namespace cast { -VideoDecoder::VideoDecoder(const VideoReceiverConfig& video_config, - scoped_refptr<CastEnvironment> cast_environment) - : codec_(video_config.codec), vp8_decoder_() { +// Base class that handles the common problem of detecting dropped frames, and +// then invoking the Decode() method implemented by the subclasses to convert +// the encoded payload data into a usable video frame. +class VideoDecoder::ImplBase + : public base::RefCountedThreadSafe<VideoDecoder::ImplBase> { + public: + ImplBase(const scoped_refptr<CastEnvironment>& cast_environment, + transport::VideoCodec codec) + : cast_environment_(cast_environment), + codec_(codec), + cast_initialization_status_(STATUS_VIDEO_UNINITIALIZED), + seen_first_frame_(false) {} + + CastInitializationStatus InitializationResult() const { + return cast_initialization_status_; + } + + void DecodeFrame(scoped_ptr<transport::EncodedVideoFrame> encoded_frame, + const DecodeFrameCallback& callback) { + DCHECK_EQ(cast_initialization_status_, STATUS_VIDEO_INITIALIZED); + + if (encoded_frame->codec != codec_) { + NOTREACHED(); + cast_environment_->PostTask( + CastEnvironment::MAIN, + FROM_HERE, + base::Bind(callback, scoped_refptr<VideoFrame>(NULL), false)); + } + + COMPILE_ASSERT(sizeof(encoded_frame->frame_id) == sizeof(last_frame_id_), + size_of_frame_id_types_do_not_match); + bool is_continuous = true; + if (seen_first_frame_) { + const uint32 frames_ahead = encoded_frame->frame_id - last_frame_id_; + if (frames_ahead > 1) { + RecoverBecauseFramesWereDropped(); + is_continuous = false; + } + } else { + seen_first_frame_ = true; + } + last_frame_id_ = encoded_frame->frame_id; + + const scoped_refptr<VideoFrame> decoded_frame = Decode( + reinterpret_cast<uint8*>(string_as_array(&encoded_frame->data)), + static_cast<int>(encoded_frame->data.size())); + cast_environment_->PostTask( + CastEnvironment::MAIN, + FROM_HERE, + base::Bind(callback, decoded_frame, is_continuous)); + } + + protected: + friend class base::RefCountedThreadSafe<ImplBase>; + virtual ~ImplBase() {} + + virtual void RecoverBecauseFramesWereDropped() {} + + // Note: Implementation of Decode() is allowed to mutate |data|. + virtual scoped_refptr<VideoFrame> Decode(uint8* data, int len) = 0; + + const scoped_refptr<CastEnvironment> cast_environment_; + const transport::VideoCodec codec_; + + // Subclass' ctor is expected to set this to STATUS_VIDEO_INITIALIZED. + CastInitializationStatus cast_initialization_status_; + + private: + bool seen_first_frame_; + uint32 last_frame_id_; + + DISALLOW_COPY_AND_ASSIGN(ImplBase); +}; + +class VideoDecoder::Vp8Impl : public VideoDecoder::ImplBase { + public: + explicit Vp8Impl(const scoped_refptr<CastEnvironment>& cast_environment) + : ImplBase(cast_environment, transport::kVp8) { + if (ImplBase::cast_initialization_status_ != STATUS_VIDEO_UNINITIALIZED) + return; + + vpx_codec_dec_cfg_t cfg = {0}; + // TODO(miu): Revisit this for typical multi-core desktop use case. This + // feels like it should be 4 or 8. + cfg.threads = 1; + + DCHECK(vpx_codec_get_caps(vpx_codec_vp8_dx()) & VPX_CODEC_CAP_POSTPROC); + if (vpx_codec_dec_init(&context_, + vpx_codec_vp8_dx(), + &cfg, + VPX_CODEC_USE_POSTPROC) != VPX_CODEC_OK) { + ImplBase::cast_initialization_status_ = + STATUS_INVALID_VIDEO_CONFIGURATION; + return; + } + ImplBase::cast_initialization_status_ = STATUS_VIDEO_INITIALIZED; + } + + private: + virtual ~Vp8Impl() { + if (ImplBase::cast_initialization_status_ == STATUS_VIDEO_INITIALIZED) + CHECK_EQ(VPX_CODEC_OK, vpx_codec_destroy(&context_)); + } + + virtual scoped_refptr<VideoFrame> Decode(uint8* data, int len) OVERRIDE { + if (len <= 0 || vpx_codec_decode(&context_, + data, + static_cast<unsigned int>(len), + NULL, + 0) != VPX_CODEC_OK) { + return NULL; + } + + vpx_codec_iter_t iter = NULL; + vpx_image_t* const image = vpx_codec_get_frame(&context_, &iter); + if (!image) + return NULL; + if (image->fmt != VPX_IMG_FMT_I420 && image->fmt != VPX_IMG_FMT_YV12) { + NOTREACHED(); + return NULL; + } + DCHECK(vpx_codec_get_frame(&context_, &iter) == NULL) + << "Should have only decoded exactly one frame."; + + const gfx::Size frame_size(image->d_w, image->d_h); + // Note: Timestamp for the VideoFrame will be set in VideoReceiver. + const scoped_refptr<VideoFrame> decoded_frame = + VideoFrame::CreateFrame(VideoFrame::YV12, + frame_size, + gfx::Rect(frame_size), + frame_size, + base::TimeDelta()); + CopyYPlane(image->planes[VPX_PLANE_Y], + image->stride[VPX_PLANE_Y], + image->d_h, + decoded_frame); + CopyUPlane(image->planes[VPX_PLANE_U], + image->stride[VPX_PLANE_U], + (image->d_h + 1) / 2, + decoded_frame); + CopyVPlane(image->planes[VPX_PLANE_V], + image->stride[VPX_PLANE_V], + (image->d_h + 1) / 2, + decoded_frame); + return decoded_frame; + } + + // VPX decoder context (i.e., an instantiation). + vpx_codec_ctx_t context_; + + DISALLOW_COPY_AND_ASSIGN(Vp8Impl); +}; + +VideoDecoder::VideoDecoder( + const scoped_refptr<CastEnvironment>& cast_environment, + const VideoReceiverConfig& video_config) + : cast_environment_(cast_environment) { switch (video_config.codec) { case transport::kVp8: - vp8_decoder_.reset(new Vp8Decoder(cast_environment)); + impl_ = new Vp8Impl(cast_environment); break; case transport::kH264: + // TODO(miu): Need implementation. NOTIMPLEMENTED(); break; + default: + NOTREACHED() << "Unknown or unspecified codec."; + break; } } VideoDecoder::~VideoDecoder() {} -bool VideoDecoder::DecodeVideoFrame( - const transport::EncodedVideoFrame* encoded_frame, - const base::TimeTicks render_time, - const VideoFrameDecodedCallback& frame_decoded_cb) { - DCHECK(encoded_frame->codec == codec_) << "Invalid codec"; - DCHECK_GT(encoded_frame->data.size(), UINT64_C(0)) << "Empty video frame"; - return vp8_decoder_->Decode(encoded_frame, render_time, frame_decoded_cb); +CastInitializationStatus VideoDecoder::InitializationResult() const { + if (impl_) + return impl_->InitializationResult(); + return STATUS_UNSUPPORTED_VIDEO_CODEC; +} + +void VideoDecoder::DecodeFrame( + scoped_ptr<transport::EncodedVideoFrame> encoded_frame, + const DecodeFrameCallback& callback) { + DCHECK(encoded_frame.get()); + DCHECK(!callback.is_null()); + if (!impl_ || impl_->InitializationResult() != STATUS_VIDEO_INITIALIZED) { + callback.Run(make_scoped_refptr<VideoFrame>(NULL), false); + return; + } + cast_environment_->PostTask(CastEnvironment::VIDEO, + FROM_HERE, + base::Bind(&VideoDecoder::ImplBase::DecodeFrame, + impl_, + base::Passed(&encoded_frame), + callback)); } } // namespace cast diff --git a/media/cast/video_receiver/video_decoder.h b/media/cast/video_receiver/video_decoder.h index f1146ae870..e6bd91bf3c 100644 --- a/media/cast/video_receiver/video_decoder.h +++ b/media/cast/video_receiver/video_decoder.h @@ -5,34 +5,53 @@ #ifndef MEDIA_CAST_VIDEO_RECEIVER_VIDEO_DECODER_H_ #define MEDIA_CAST_VIDEO_RECEIVER_VIDEO_DECODER_H_ +#include "base/callback.h" +#include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" -#include "base/threading/non_thread_safe.h" +#include "media/base/video_frame.h" #include "media/cast/cast_config.h" -#include "media/cast/cast_receiver.h" +#include "media/cast/transport/cast_transport_config.h" namespace media { namespace cast { -class Vp8Decoder; -class VideoFrame; +class CastEnvironment; -// This class is not thread safe; it's only called from the cast video decoder -// thread. -class VideoDecoder : public base::NonThreadSafe { +class VideoDecoder { public: - VideoDecoder(const VideoReceiverConfig& video_config, - scoped_refptr<CastEnvironment> cast_environment); + // Callback passed to DecodeFrame, to deliver a decoded video frame from the + // decoder. |frame| can be NULL when errors occur. |is_continuous| is + // normally true, but will be false if the decoder has detected a frame skip + // since the last decode operation; and the client might choose to take steps + // to smooth/interpolate video discontinuities in this case. + typedef base::Callback<void(const scoped_refptr<VideoFrame>& frame, + bool is_continuous)> DecodeFrameCallback; + + VideoDecoder(const scoped_refptr<CastEnvironment>& cast_environment, + const VideoReceiverConfig& video_config); virtual ~VideoDecoder(); - // Decode a video frame. Decoded (raw) frame will be returned via the - // provided callback - bool DecodeVideoFrame(const transport::EncodedVideoFrame* encoded_frame, - const base::TimeTicks render_time, - const VideoFrameDecodedCallback& frame_decoded_cb); + // Returns STATUS_VIDEO_INITIALIZED if the decoder was successfully + // constructed from the given VideoReceiverConfig. If this method returns any + // other value, calls to DecodeFrame() will not succeed. + CastInitializationStatus InitializationResult() const; + + // Decode the payload in |encoded_frame| asynchronously. |callback| will be + // invoked on the CastEnvironment::MAIN thread with the result. + // + // In the normal case, |encoded_frame->frame_id| will be + // monotonically-increasing by 1 for each successive call to this method. + // When it is not, the decoder will assume one or more frames have been + // dropped (e.g., due to packet loss), and will perform recovery actions. + void DecodeFrame(scoped_ptr<transport::EncodedVideoFrame> encoded_frame, + const DecodeFrameCallback& callback); private: - transport::VideoCodec codec_; - scoped_ptr<Vp8Decoder> vp8_decoder_; + class ImplBase; + class Vp8Impl; + + const scoped_refptr<CastEnvironment> cast_environment_; + scoped_refptr<ImplBase> impl_; DISALLOW_COPY_AND_ASSIGN(VideoDecoder); }; diff --git a/media/cast/video_receiver/video_decoder_unittest.cc b/media/cast/video_receiver/video_decoder_unittest.cc index 44de8809f8..aa6b7ac058 100644 --- a/media/cast/video_receiver/video_decoder_unittest.cc +++ b/media/cast/video_receiver/video_decoder_unittest.cc @@ -2,92 +2,186 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include <stdint.h> +#include <cstdlib> #include "base/bind.h" -#include "base/memory/scoped_ptr.h" -#include "base/test/simple_test_tick_clock.h" -#include "base/time/tick_clock.h" +#include "base/bind_helpers.h" +#include "base/synchronization/condition_variable.h" +#include "base/synchronization/lock.h" +#include "base/time/time.h" #include "media/cast/cast_config.h" -#include "media/cast/cast_defines.h" -#include "media/cast/cast_environment.h" -#include "media/cast/cast_receiver.h" -#include "media/cast/test/fake_single_thread_task_runner.h" +#include "media/cast/test/utility/standalone_cast_environment.h" +#include "media/cast/test/utility/video_utility.h" #include "media/cast/video_receiver/video_decoder.h" -#include "testing/gmock/include/gmock/gmock.h" +#include "media/cast/video_sender/codecs/vp8/vp8_encoder.h" +#include "testing/gtest/include/gtest/gtest.h" namespace media { namespace cast { -using testing::_; +namespace { -// Random frame size for testing. -static const int64 kStartMillisecond = INT64_C(1245); +const int kWidth = 360; +const int kHeight = 240; +const int kFrameRate = 10; -namespace { -class DecodeTestFrameCallback - : public base::RefCountedThreadSafe<DecodeTestFrameCallback> { - public: - DecodeTestFrameCallback() {} +VideoSenderConfig GetVideoSenderConfigForTest() { + VideoSenderConfig config; + config.width = kWidth; + config.height = kHeight; + config.max_frame_rate = kFrameRate; + return config; +} - void DecodeComplete(const scoped_refptr<media::VideoFrame>& decoded_frame, - const base::TimeTicks& render_time) {} +} // namespace + +class VideoDecoderTest + : public ::testing::TestWithParam<transport::VideoCodec> { + public: + VideoDecoderTest() + : cast_environment_(new StandaloneCastEnvironment()), + vp8_encoder_(GetVideoSenderConfigForTest(), 0), + cond_(&lock_) { + vp8_encoder_.Initialize(); + } protected: - virtual ~DecodeTestFrameCallback() {} + virtual void SetUp() OVERRIDE { + VideoReceiverConfig decoder_config; + decoder_config.use_external_decoder = false; + decoder_config.codec = GetParam(); + video_decoder_.reset(new VideoDecoder(cast_environment_, decoder_config)); + CHECK_EQ(STATUS_VIDEO_INITIALIZED, video_decoder_->InitializationResult()); + + next_frame_timestamp_ = base::TimeDelta(); + last_frame_id_ = 0; + seen_a_decoded_frame_ = false; + + total_video_frames_feed_in_ = 0; + total_video_frames_decoded_ = 0; + } - private: - friend class base::RefCountedThreadSafe<DecodeTestFrameCallback>; + // Called from the unit test thread to create another EncodedVideoFrame and + // push it into the decoding pipeline. + void FeedMoreVideo(int num_dropped_frames) { + // Prepare a simulated EncodedVideoFrame to feed into the VideoDecoder. + + const gfx::Size frame_size(kWidth, kHeight); + const scoped_refptr<VideoFrame> video_frame = + VideoFrame::CreateFrame(VideoFrame::YV12, + frame_size, + gfx::Rect(frame_size), + frame_size, + next_frame_timestamp_); + next_frame_timestamp_ += base::TimeDelta::FromSeconds(1) / kFrameRate; + PopulateVideoFrame(video_frame, 0); + + // Encode |frame| into |encoded_frame->data|. + scoped_ptr<transport::EncodedVideoFrame> encoded_frame( + new transport::EncodedVideoFrame()); + CHECK_EQ(transport::kVp8, GetParam()); // Only support VP8 test currently. + vp8_encoder_.Encode(video_frame, encoded_frame.get()); + encoded_frame->codec = GetParam(); + encoded_frame->frame_id = last_frame_id_ + 1 + num_dropped_frames; + last_frame_id_ = encoded_frame->frame_id; + + { + base::AutoLock auto_lock(lock_); + ++total_video_frames_feed_in_; + } + + cast_environment_->PostTask( + CastEnvironment::MAIN, + FROM_HERE, + base::Bind(&VideoDecoder::DecodeFrame, + base::Unretained(video_decoder_.get()), + base::Passed(&encoded_frame), + base::Bind(&VideoDecoderTest::OnDecodedFrame, + base::Unretained(this), + video_frame, + num_dropped_frames == 0))); + } - DISALLOW_COPY_AND_ASSIGN(DecodeTestFrameCallback); -}; -} // namespace + // Blocks the caller until all video that has been feed in has been decoded. + void WaitForAllVideoToBeDecoded() { + DCHECK(!cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); + base::AutoLock auto_lock(lock_); + while (total_video_frames_decoded_ < total_video_frames_feed_in_) + cond_.Wait(); + EXPECT_EQ(total_video_frames_feed_in_, total_video_frames_decoded_); + } -class VideoDecoderTest : public ::testing::Test { - protected: - VideoDecoderTest() - : testing_clock_(new base::SimpleTestTickClock()), - task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)), - cast_environment_( - new CastEnvironment(scoped_ptr<base::TickClock>(testing_clock_), - task_runner_, - task_runner_, - task_runner_)), - test_callback_(new DecodeTestFrameCallback()) { - // Configure to vp8. - config_.codec = transport::kVp8; - config_.use_external_decoder = false; - decoder_.reset(new VideoDecoder(config_, cast_environment_)); - testing_clock_->Advance( - base::TimeDelta::FromMilliseconds(kStartMillisecond)); + private: + // Called by |vp8_decoder_| to deliver each frame of decoded video. + void OnDecodedFrame(const scoped_refptr<VideoFrame>& expected_video_frame, + bool should_be_continuous, + const scoped_refptr<VideoFrame>& video_frame, + bool is_continuous) { + DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); + + // A NULL |video_frame| indicates a decode error, which we don't expect. + ASSERT_FALSE(!video_frame); + + // Did the decoder detect whether frames were dropped? + EXPECT_EQ(should_be_continuous, is_continuous); + + // Does the video data seem to be intact? + EXPECT_EQ(expected_video_frame->coded_size().width(), + video_frame->coded_size().width()); + EXPECT_EQ(expected_video_frame->coded_size().height(), + video_frame->coded_size().height()); + EXPECT_LT(40.0, I420PSNR(expected_video_frame, video_frame)); + // TODO(miu): Once we start using VideoFrame::timestamp_, check that here. + + // Signal the main test thread that more video was decoded. + base::AutoLock auto_lock(lock_); + ++total_video_frames_decoded_; + cond_.Signal(); } - virtual ~VideoDecoderTest() {} + const scoped_refptr<StandaloneCastEnvironment> cast_environment_; + scoped_ptr<VideoDecoder> video_decoder_; + base::TimeDelta next_frame_timestamp_; + uint32 last_frame_id_; + bool seen_a_decoded_frame_; + + Vp8Encoder vp8_encoder_; - scoped_ptr<VideoDecoder> decoder_; - VideoReceiverConfig config_; - base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. - scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; - scoped_refptr<CastEnvironment> cast_environment_; - scoped_refptr<DecodeTestFrameCallback> test_callback_; + base::Lock lock_; + base::ConditionVariable cond_; + int total_video_frames_feed_in_; + int total_video_frames_decoded_; DISALLOW_COPY_AND_ASSIGN(VideoDecoderTest); }; -// TODO(pwestin): EXPECT_DEATH tests can not pass valgrind. -TEST_F(VideoDecoderTest, DISABLED_SizeZero) { - transport::EncodedVideoFrame encoded_frame; - base::TimeTicks render_time; - encoded_frame.codec = transport::kVp8; - EXPECT_DEATH( - decoder_->DecodeVideoFrame( - &encoded_frame, - render_time, - base::Bind(&DecodeTestFrameCallback::DecodeComplete, test_callback_)), - "Empty frame"); +TEST_P(VideoDecoderTest, DecodesFrames) { + const int kNumFrames = 10; + for (int i = 0; i < kNumFrames; ++i) + FeedMoreVideo(0); + WaitForAllVideoToBeDecoded(); +} + +TEST_P(VideoDecoderTest, RecoversFromDroppedFrames) { + const int kNumFrames = 100; + int next_drop_at = 3; + int next_num_dropped = 1; + for (int i = 0; i < kNumFrames; ++i) { + if (i == next_drop_at) { + const int num_dropped = next_num_dropped++; + next_drop_at *= 2; + i += num_dropped; + FeedMoreVideo(num_dropped); + } else { + FeedMoreVideo(0); + } + } + WaitForAllVideoToBeDecoded(); } -// TODO(pwestin): Test decoding a real frame. +INSTANTIATE_TEST_CASE_P(VideoDecoderTestScenarios, + VideoDecoderTest, + ::testing::Values(transport::kVp8)); } // namespace cast } // namespace media diff --git a/media/cast/video_receiver/video_receiver.cc b/media/cast/video_receiver/video_receiver.cc index 95b1d5127a..10ca3fc673 100644 --- a/media/cast/video_receiver/video_receiver.cc +++ b/media/cast/video_receiver/video_receiver.cc @@ -10,45 +10,23 @@ #include "base/debug/trace_event.h" #include "base/logging.h" #include "base/message_loop/message_loop.h" -#include "media/cast/cast_defines.h" -#include "media/cast/framer/framer.h" -#include "media/cast/rtcp/receiver_rtcp_event_subscriber.h" -#include "media/cast/rtcp/rtcp_sender.h" +#include "media/base/video_frame.h" +#include "media/cast/logging/logging_defines.h" +#include "media/cast/transport/cast_transport_defines.h" #include "media/cast/video_receiver/video_decoder.h" namespace { - -static const int64 kMinSchedulingDelayMs = 1; -static const int64 kMinTimeBetweenOffsetUpdatesMs = 1000; -static const int kTimeOffsetMaxCounter = 10; - +const int kMinSchedulingDelayMs = 1; +const int kMinTimeBetweenOffsetUpdatesMs = 1000; +const int kTimeOffsetMaxCounter = 10; } // namespace namespace media { namespace cast { -// Local implementation of RtpPayloadFeedback (defined in rtp_defines.h) -// Used to convey cast-specific feedback from receiver to sender. -// Callback triggered by the Framer (cast message builder). -class LocalRtpVideoFeedback : public RtpPayloadFeedback { - public: - explicit LocalRtpVideoFeedback(VideoReceiver* video_receiver) - : video_receiver_(video_receiver) {} - - virtual void CastFeedback(const RtcpCastMessage& cast_message) OVERRIDE { - video_receiver_->CastFeedback(cast_message); - } - - private: - VideoReceiver* video_receiver_; - - DISALLOW_IMPLICIT_CONSTRUCTORS(LocalRtpVideoFeedback); -}; - VideoReceiver::VideoReceiver(scoped_refptr<CastEnvironment> cast_environment, const VideoReceiverConfig& video_config, - transport::PacedPacketSender* const packet_sender, - const SetTargetDelayCallback& target_delay_cb) + transport::PacedPacketSender* const packet_sender) : RtpReceiver(cast_environment->Clock(), NULL, &video_config), cast_environment_(cast_environment), event_subscriber_(kReceiverRtcpEventHistorySize, @@ -56,48 +34,42 @@ VideoReceiver::VideoReceiver(scoped_refptr<CastEnvironment> cast_environment, codec_(video_config.codec), target_delay_delta_( base::TimeDelta::FromMilliseconds(video_config.rtp_max_delay_ms)), - frame_delay_(base::TimeDelta::FromMilliseconds( - 1000 / video_config.max_frame_rate)), - incoming_payload_feedback_(new LocalRtpVideoFeedback(this)), + expected_frame_duration_( + base::TimeDelta::FromSeconds(1) / video_config.max_frame_rate), + framer_(cast_environment->Clock(), + this, + video_config.incoming_ssrc, + video_config.decoder_faster_than_max_frame_rate, + video_config.rtp_max_delay_ms * video_config.max_frame_rate / + 1000), + rtcp_(cast_environment_, + NULL, + NULL, + packet_sender, + GetStatistics(), + video_config.rtcp_mode, + base::TimeDelta::FromMilliseconds(video_config.rtcp_interval), + video_config.feedback_ssrc, + video_config.incoming_ssrc, + video_config.rtcp_c_name), time_offset_counter_(0), - decryptor_(), time_incoming_packet_updated_(false), incoming_rtp_timestamp_(0), - target_delay_cb_(target_delay_cb), + is_waiting_for_consecutive_frame_(false), weak_factory_(this) { - int max_unacked_frames = - video_config.rtp_max_delay_ms * video_config.max_frame_rate / 1000; - DCHECK(max_unacked_frames) << "Invalid argument"; - - decryptor_.Initialize(video_config.aes_key, video_config.aes_iv_mask); - framer_.reset(new Framer(cast_environment->Clock(), - incoming_payload_feedback_.get(), - video_config.incoming_ssrc, - video_config.decoder_faster_than_max_frame_rate, - max_unacked_frames)); - + DCHECK_GT(video_config.rtp_max_delay_ms, 0); + DCHECK_GT(video_config.max_frame_rate, 0); if (!video_config.use_external_decoder) { - video_decoder_.reset(new VideoDecoder(video_config, cast_environment)); + video_decoder_.reset(new VideoDecoder(cast_environment, video_config)); } - - rtcp_.reset( - new Rtcp(cast_environment_, - NULL, - NULL, - packet_sender, - GetStatistics(), - video_config.rtcp_mode, - base::TimeDelta::FromMilliseconds(video_config.rtcp_interval), - video_config.feedback_ssrc, - video_config.incoming_ssrc, - video_config.rtcp_c_name)); - // Set the target delay that will be conveyed to the sender. - rtcp_->SetTargetDelay(target_delay_delta_); + decryptor_.Initialize(video_config.aes_key, video_config.aes_iv_mask); + rtcp_.SetTargetDelay(target_delay_delta_); cast_environment_->Logging()->AddRawEventSubscriber(&event_subscriber_); memset(frame_id_to_rtp_timestamp_, 0, sizeof(frame_id_to_rtp_timestamp_)); } VideoReceiver::~VideoReceiver() { + DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber_); } @@ -110,209 +82,155 @@ void VideoReceiver::InitializeTimers() { void VideoReceiver::GetRawVideoFrame( const VideoFrameDecodedCallback& callback) { DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); + DCHECK(!callback.is_null()); + DCHECK(video_decoder_.get()); GetEncodedVideoFrame(base::Bind( - &VideoReceiver::DecodeVideoFrame, base::Unretained(this), callback)); + &VideoReceiver::DecodeEncodedVideoFrame, + // Note: Use of Unretained is safe since this Closure is guaranteed to be + // invoked before destruction of |this|. + base::Unretained(this), + callback)); } -// Called when we have a frame to decode. -void VideoReceiver::DecodeVideoFrame( +void VideoReceiver::DecodeEncodedVideoFrame( const VideoFrameDecodedCallback& callback, scoped_ptr<transport::EncodedVideoFrame> encoded_frame, - const base::TimeTicks& render_time) { + const base::TimeTicks& playout_time) { DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); - - // Hand the ownership of the encoded frame to the decode thread. - cast_environment_->PostTask(CastEnvironment::VIDEO, - FROM_HERE, - base::Bind(&VideoReceiver::DecodeVideoFrameThread, - base::Unretained(this), - base::Passed(&encoded_frame), - render_time, - callback)); -} - -// Utility function to run the decoder on a designated decoding thread. -void VideoReceiver::DecodeVideoFrameThread( - scoped_ptr<transport::EncodedVideoFrame> encoded_frame, - const base::TimeTicks render_time, - const VideoFrameDecodedCallback& frame_decoded_callback) { - DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::VIDEO)); - DCHECK(video_decoder_); - - if (!(video_decoder_->DecodeVideoFrame( - encoded_frame.get(), render_time, frame_decoded_callback))) { - // This will happen if we decide to decode but not show a frame. - cast_environment_->PostTask(CastEnvironment::MAIN, - FROM_HERE, - base::Bind(&VideoReceiver::GetRawVideoFrame, - base::Unretained(this), - frame_decoded_callback)); + if (!encoded_frame) { + callback.Run(make_scoped_refptr<VideoFrame>(NULL), playout_time, false); + return; } + const uint32 frame_id = encoded_frame->frame_id; + const uint32 rtp_timestamp = encoded_frame->rtp_timestamp; + video_decoder_->DecodeFrame(encoded_frame.Pass(), + base::Bind(&VideoReceiver::EmitRawVideoFrame, + cast_environment_, + callback, + frame_id, + rtp_timestamp, + playout_time)); } -bool VideoReceiver::DecryptVideoFrame( - scoped_ptr<transport::EncodedVideoFrame>* video_frame) { - DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); - - if (!decryptor_.initialized()) - return false; - - std::string decrypted_video_data; - if (!decryptor_.Decrypt((*video_frame)->frame_id, - (*video_frame)->data, - &decrypted_video_data)) { - // Give up on this frame, release it from jitter buffer. - framer_->ReleaseFrame((*video_frame)->frame_id); - return false; +// static +void VideoReceiver::EmitRawVideoFrame( + const scoped_refptr<CastEnvironment>& cast_environment, + const VideoFrameDecodedCallback& callback, + uint32 frame_id, + uint32 rtp_timestamp, + const base::TimeTicks& playout_time, + const scoped_refptr<VideoFrame>& video_frame, + bool is_continuous) { + DCHECK(cast_environment->CurrentlyOn(CastEnvironment::MAIN)); + if (video_frame) { + const base::TimeTicks now = cast_environment->Clock()->NowTicks(); + cast_environment->Logging()->InsertFrameEvent( + now, kVideoFrameDecoded, rtp_timestamp, frame_id); + cast_environment->Logging()->InsertFrameEventWithDelay( + now, kVideoRenderDelay, rtp_timestamp, frame_id, + playout_time - now); + // Used by chrome/browser/extension/api/cast_streaming/performance_test.cc + TRACE_EVENT_INSTANT1( + "cast_perf_test", "FrameDecoded", + TRACE_EVENT_SCOPE_THREAD, + "rtp_timestamp", rtp_timestamp); } - (*video_frame)->data.swap(decrypted_video_data); - return true; + callback.Run(video_frame, playout_time, is_continuous); } -// Called from the main cast thread. void VideoReceiver::GetEncodedVideoFrame( const VideoFrameEncodedCallback& callback) { DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); - scoped_ptr<transport::EncodedVideoFrame> encoded_frame( - new transport::EncodedVideoFrame()); - bool next_frame = false; - - if (!framer_->GetEncodedVideoFrame(encoded_frame.get(), &next_frame)) { - // We have no video frames. Wait for new packet(s). - queued_encoded_callbacks_.push_back(callback); - return; - } - - if (decryptor_.initialized() && !DecryptVideoFrame(&encoded_frame)) { - // Logging already done. - queued_encoded_callbacks_.push_back(callback); - return; - } - - base::TimeTicks render_time; - if (PullEncodedVideoFrame(next_frame, &encoded_frame, &render_time)) { - cast_environment_->PostTask( - CastEnvironment::MAIN, - FROM_HERE, - base::Bind(callback, base::Passed(&encoded_frame), render_time)); - } else { - // We have a video frame; however we are missing packets and we have time - // to wait for new packet(s). - queued_encoded_callbacks_.push_back(callback); - } + frame_request_queue_.push_back(callback); + EmitAvailableEncodedFrames(); } -// Should we pull the encoded video frame from the framer? decided by if this is -// the next frame or we are running out of time and have to pull the following -// frame. -// If the frame is too old to be rendered we set the don't show flag in the -// video bitstream where possible. -bool VideoReceiver::PullEncodedVideoFrame( - bool next_frame, - scoped_ptr<transport::EncodedVideoFrame>* encoded_frame, - base::TimeTicks* render_time) { +void VideoReceiver::EmitAvailableEncodedFrames() { DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); - base::TimeTicks now = cast_environment_->Clock()->NowTicks(); - *render_time = GetRenderTime(now, (*encoded_frame)->rtp_timestamp); - - // TODO(mikhal): Store actual render time and not diff. - cast_environment_->Logging()->InsertFrameEventWithDelay( - now, - kVideoRenderDelay, - (*encoded_frame)->rtp_timestamp, - (*encoded_frame)->frame_id, - now - *render_time); - - // Minimum time before a frame is due to be rendered before we pull it for - // decode. - base::TimeDelta min_wait_delta = frame_delay_; - base::TimeDelta time_until_render = *render_time - now; - if (!next_frame && (time_until_render > min_wait_delta)) { - // Example: - // We have decoded frame 1 and we have received the complete frame 3, but - // not frame 2. If we still have time before frame 3 should be rendered we - // will wait for 2 to arrive, however if 2 never show up this timer will hit - // and we will pull out frame 3 for decoding and rendering. - base::TimeDelta time_until_release = time_until_render - min_wait_delta; - cast_environment_->PostDelayedTask( - CastEnvironment::MAIN, - FROM_HERE, - base::Bind(&VideoReceiver::PlayoutTimeout, weak_factory_.GetWeakPtr()), - time_until_release); - VLOG(1) << "Wait before releasing frame " - << static_cast<int>((*encoded_frame)->frame_id) << " time " - << time_until_release.InMilliseconds(); - return false; - } - - base::TimeDelta dont_show_timeout_delta = - base::TimeDelta::FromMilliseconds(-kDontShowTimeoutMs); - if (codec_ == transport::kVp8 && - time_until_render < dont_show_timeout_delta) { - (*encoded_frame)->data[0] &= 0xef; - VLOG(1) << "Don't show frame " - << static_cast<int>((*encoded_frame)->frame_id) - << " time_until_render:" << time_until_render.InMilliseconds(); - } else { - VLOG(2) << "Show frame " << static_cast<int>((*encoded_frame)->frame_id) - << " time_until_render:" << time_until_render.InMilliseconds(); - } - // We have a copy of the frame, release this one. - framer_->ReleaseFrame((*encoded_frame)->frame_id); - (*encoded_frame)->codec = codec_; - - // Used by chrome/browser/extension/api/cast_streaming/performance_test.cc - TRACE_EVENT_INSTANT2( - "cast_perf_test", "PullEncodedVideoFrame", - TRACE_EVENT_SCOPE_THREAD, - "rtp_timestamp", (*encoded_frame)->rtp_timestamp, - "render_time", render_time->ToInternalValue()); - - return true; -} -void VideoReceiver::PlayoutTimeout() { - DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); - if (queued_encoded_callbacks_.empty()) - return; + while (!frame_request_queue_.empty()) { + // Attempt to peek at the next completed frame from the |framer_|. + // TODO(miu): We should only be peeking at the metadata, and not copying the + // payload yet! Or, at least, peek using a StringPiece instead of a copy. + scoped_ptr<transport::EncodedVideoFrame> encoded_frame( + new transport::EncodedVideoFrame()); + bool is_consecutively_next_frame = false; + if (!framer_.GetEncodedVideoFrame(encoded_frame.get(), + &is_consecutively_next_frame)) { + VLOG(1) << "Wait for more video packets to produce a completed frame."; + return; // OnReceivedPayloadData() will invoke this method in the future. + } - bool next_frame = false; - scoped_ptr<transport::EncodedVideoFrame> encoded_frame( - new transport::EncodedVideoFrame()); + // If |framer_| has a frame ready that is out of sequence, examine the + // playout time to determine whether it's acceptable to continue, thereby + // skipping one or more frames. Skip if the missing frame wouldn't complete + // playing before the start of playback of the available frame. + const base::TimeTicks now = cast_environment_->Clock()->NowTicks(); + const base::TimeTicks playout_time = + GetPlayoutTime(now, encoded_frame->rtp_timestamp); + if (!is_consecutively_next_frame) { + // TODO(miu): Also account for expected decode time here? + const base::TimeTicks earliest_possible_end_time_of_missing_frame = + now + expected_frame_duration_; + if (earliest_possible_end_time_of_missing_frame < playout_time) { + VLOG(1) << "Wait for next consecutive frame instead of skipping."; + if (!is_waiting_for_consecutive_frame_) { + is_waiting_for_consecutive_frame_ = true; + cast_environment_->PostDelayedTask( + CastEnvironment::MAIN, + FROM_HERE, + base::Bind(&VideoReceiver::EmitAvailableEncodedFramesAfterWaiting, + weak_factory_.GetWeakPtr()), + playout_time - now); + } + return; + } + } - if (!framer_->GetEncodedVideoFrame(encoded_frame.get(), &next_frame)) { - // We have no video frames. Wait for new packet(s). - // Since the application can post multiple VideoFrameEncodedCallback and - // we only check the next frame to play out we might have multiple timeout - // events firing after each other; however this should be a rare event. - VLOG(1) << "Failed to retrieved a complete frame at this point in time"; - return; - } - VLOG(2) << "PlayoutTimeout retrieved frame " - << static_cast<int>(encoded_frame->frame_id); + // Decrypt the payload data in the frame, if crypto is being used. + if (decryptor_.initialized()) { + std::string decrypted_video_data; + if (!decryptor_.Decrypt(encoded_frame->frame_id, + encoded_frame->data, + &decrypted_video_data)) { + // Decryption failed. Give up on this frame, releasing it from the + // jitter buffer. + framer_.ReleaseFrame(encoded_frame->frame_id); + continue; + } + encoded_frame->data.swap(decrypted_video_data); + } - if (decryptor_.initialized() && !DecryptVideoFrame(&encoded_frame)) { - // Logging already done. - return; + // At this point, we have a decrypted EncodedVideoFrame ready to be emitted. + encoded_frame->codec = codec_; + framer_.ReleaseFrame(encoded_frame->frame_id); + // Used by chrome/browser/extension/api/cast_streaming/performance_test.cc + TRACE_EVENT_INSTANT2( + "cast_perf_test", "PullEncodedVideoFrame", + TRACE_EVENT_SCOPE_THREAD, + "rtp_timestamp", encoded_frame->rtp_timestamp, + // TODO(miu): Need to find an alternative to using ToInternalValue(): + "render_time", playout_time.ToInternalValue()); + cast_environment_->PostTask(CastEnvironment::MAIN, + FROM_HERE, + base::Bind(frame_request_queue_.front(), + base::Passed(&encoded_frame), + playout_time)); + frame_request_queue_.pop_front(); } +} - base::TimeTicks render_time; - if (PullEncodedVideoFrame(next_frame, &encoded_frame, &render_time)) { - if (!queued_encoded_callbacks_.empty()) { - VideoFrameEncodedCallback callback = queued_encoded_callbacks_.front(); - queued_encoded_callbacks_.pop_front(); - cast_environment_->PostTask( - CastEnvironment::MAIN, - FROM_HERE, - base::Bind(callback, base::Passed(&encoded_frame), render_time)); - } - } - // Else we have a video frame; however we are missing packets and we have time - // to wait for new packet(s). +void VideoReceiver::EmitAvailableEncodedFramesAfterWaiting() { + DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); + DCHECK(is_waiting_for_consecutive_frame_); + is_waiting_for_consecutive_frame_ = false; + EmitAvailableEncodedFrames(); } -base::TimeTicks VideoReceiver::GetRenderTime(base::TimeTicks now, - uint32 rtp_timestamp) { +base::TimeTicks VideoReceiver::GetPlayoutTime(base::TimeTicks now, + uint32 rtp_timestamp) { + // TODO(miu): This and AudioReceiver::GetPlayoutTime() need to be reconciled! + DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); // Senders time in ms when this frame was captured. // Note: the senders clock and our local clock might not be synced. @@ -321,17 +239,15 @@ base::TimeTicks VideoReceiver::GetRenderTime(base::TimeTicks now, // Compute the time offset_in_ticks based on the incoming_rtp_timestamp_. if (time_offset_counter_ == 0) { // Check for received RTCP to sync the stream play it out asap. - if (rtcp_->RtpTimestampInSenderTime(kVideoFrequency, - incoming_rtp_timestamp_, - &rtp_timestamp_in_ticks)) { - + if (rtcp_.RtpTimestampInSenderTime(kVideoFrequency, + incoming_rtp_timestamp_, + &rtp_timestamp_in_ticks)) { ++time_offset_counter_; } - return now; } else if (time_incoming_packet_updated_) { - if (rtcp_->RtpTimestampInSenderTime(kVideoFrequency, - incoming_rtp_timestamp_, - &rtp_timestamp_in_ticks)) { + if (rtcp_.RtpTimestampInSenderTime(kVideoFrequency, + incoming_rtp_timestamp_, + &rtp_timestamp_in_ticks)) { // Time to update the time_offset. base::TimeDelta time_offset = time_incoming_packet_ - rtp_timestamp_in_ticks; @@ -342,33 +258,47 @@ base::TimeTicks VideoReceiver::GetRenderTime(base::TimeTicks now, // very slow, and negligible for this use case. if (time_offset_counter_ == 1) time_offset_ = time_offset; - else if (time_offset_counter_ < kTimeOffsetMaxCounter) { + else if (time_offset_counter_ < kTimeOffsetMaxCounter) { time_offset_ = std::min(time_offset_, time_offset); } - ++time_offset_counter_; + if (time_offset_counter_ < kTimeOffsetMaxCounter) + ++time_offset_counter_; } } // Reset |time_incoming_packet_updated_| to enable a future measurement. time_incoming_packet_updated_ = false; // Compute the actual rtp_timestamp_in_ticks based on the current timestamp. - if (!rtcp_->RtpTimestampInSenderTime( + if (!rtcp_.RtpTimestampInSenderTime( kVideoFrequency, rtp_timestamp, &rtp_timestamp_in_ticks)) { // This can fail if we have not received any RTCP packets in a long time. - return now; + // BUG: These calculations are a placeholder, and to be revisited in a + // soon-upcoming change. http://crbug.com/356942 + const int frequency_khz = kVideoFrequency / 1000; + const base::TimeDelta delta_based_on_rtp_timestamps = + base::TimeDelta::FromMilliseconds( + static_cast<int32>(rtp_timestamp - incoming_rtp_timestamp_) / + frequency_khz); + return time_incoming_packet_ + delta_based_on_rtp_timestamps; } base::TimeTicks render_time = rtp_timestamp_in_ticks + time_offset_ + target_delay_delta_; + // TODO(miu): This is broken since this "getter" method may be called on + // frames received out-of-order, which means the playout times for earlier + // frames will be computed incorrectly. +#if 0 if (last_render_time_ > render_time) render_time = last_render_time_; last_render_time_ = render_time; +#endif + return render_time; } void VideoReceiver::IncomingPacket(scoped_ptr<Packet> packet) { DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); if (Rtcp::IsRtcpPacket(&packet->front(), packet->size())) { - rtcp_->IncomingRtcpPacket(&packet->front(), packet->size()); + rtcp_.IncomingRtcpPacket(&packet->front(), packet->size()); } else { ReceivedPacket(&packet->front(), packet->size()); } @@ -407,9 +337,8 @@ void VideoReceiver::OnReceivedPayloadData(const uint8* payload_data, payload_size); bool duplicate = false; - bool complete = - framer_->InsertPacket(payload_data, payload_size, rtp_header, &duplicate); - + const bool complete = + framer_.InsertPacket(payload_data, payload_size, rtp_header, &duplicate); if (duplicate) { cast_environment_->Logging()->InsertPacketEvent( now, @@ -424,16 +353,8 @@ void VideoReceiver::OnReceivedPayloadData(const uint8* payload_data, } if (!complete) return; // Video frame not complete; wait for more packets. - if (queued_encoded_callbacks_.empty()) - return; // No pending callback. - - VideoFrameEncodedCallback callback = queued_encoded_callbacks_.front(); - queued_encoded_callbacks_.pop_front(); - cast_environment_->PostTask(CastEnvironment::MAIN, - FROM_HERE, - base::Bind(&VideoReceiver::GetEncodedVideoFrame, - weak_factory_.GetWeakPtr(), - callback)); + + EmitAvailableEncodedFrames(); } // Send a cast feedback message. Actual message created in the framer (cast @@ -447,7 +368,9 @@ void VideoReceiver::CastFeedback(const RtcpCastMessage& cast_message) { cast_environment_->Logging()->InsertFrameEvent( now, kVideoAckSent, rtp_timestamp, cast_message.ack_frame_id_); - rtcp_->SendRtcpFromRtpReceiver(&cast_message, &event_subscriber_); + ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; + event_subscriber_.GetRtcpEventsAndReset(&rtcp_events); + rtcp_.SendRtcpFromRtpReceiver(&cast_message, &rtcp_events); } // Cast messages should be sent within a maximum interval. Schedule a call @@ -455,8 +378,7 @@ void VideoReceiver::CastFeedback(const RtcpCastMessage& cast_message) { void VideoReceiver::ScheduleNextCastMessage() { DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); base::TimeTicks send_time; - framer_->TimeToSendNextCastMessage(&send_time); - + framer_.TimeToSendNextCastMessage(&send_time); base::TimeDelta time_to_send = send_time - cast_environment_->Clock()->NowTicks(); time_to_send = std::max( @@ -471,14 +393,13 @@ void VideoReceiver::ScheduleNextCastMessage() { void VideoReceiver::SendNextCastMessage() { DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); - framer_->SendCastMessage(); // Will only send a message if it is time. + framer_.SendCastMessage(); // Will only send a message if it is time. ScheduleNextCastMessage(); } -// Schedule the next RTCP report to be sent back to the sender. void VideoReceiver::ScheduleNextRtcpReport() { DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); - base::TimeDelta time_to_next = rtcp_->TimeToSendNextRtcpReport() - + base::TimeDelta time_to_next = rtcp_.TimeToSendNextRtcpReport() - cast_environment_->Clock()->NowTicks(); time_to_next = std::max( @@ -494,15 +415,9 @@ void VideoReceiver::ScheduleNextRtcpReport() { void VideoReceiver::SendNextRtcpReport() { DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); - rtcp_->SendRtcpFromRtpReceiver(NULL, NULL); + rtcp_.SendRtcpFromRtpReceiver(NULL, NULL); ScheduleNextRtcpReport(); } -void VideoReceiver::UpdateTargetDelay() { - NOTIMPLEMENTED(); - rtcp_->SetTargetDelay(target_delay_delta_); - target_delay_cb_.Run(target_delay_delta_); -} - } // namespace cast } // namespace media diff --git a/media/cast/video_receiver/video_receiver.gypi b/media/cast/video_receiver/video_receiver.gypi index 1f7d1ee806..e741719393 100644 --- a/media/cast/video_receiver/video_receiver.gypi +++ b/media/cast/video_receiver/video_receiver.gypi @@ -19,10 +19,11 @@ 'video_receiver.cc', ], # source 'dependencies': [ + '<(DEPTH)/base/base.gyp:base', + '<(DEPTH)/media/cast/framer/framer.gyp:cast_framer', + '<(DEPTH)/media/cast/rtp_receiver/rtp_receiver.gyp:cast_rtp_receiver', '<(DEPTH)/media/cast/transport/utility/utility.gyp:transport_utility', - 'framer/framer.gyp:cast_framer', - 'video_receiver/codecs/vp8/vp8_decoder.gyp:cast_vp8_decoder', - 'rtp_receiver/rtp_receiver.gyp:cast_rtp_receiver', + '<(DEPTH)/third_party/libvpx/libvpx.gyp:libvpx', ], }, ], diff --git a/media/cast/video_receiver/video_receiver.h b/media/cast/video_receiver/video_receiver.h index b0c636faab..4852794b90 100644 --- a/media/cast/video_receiver/video_receiver.h +++ b/media/cast/video_receiver/video_receiver.h @@ -16,6 +16,7 @@ #include "media/cast/cast_config.h" #include "media/cast/cast_environment.h" #include "media/cast/cast_receiver.h" +#include "media/cast/framer/framer.h" #include "media/cast/rtcp/receiver_rtcp_event_subscriber.h" #include "media/cast/rtcp/rtcp.h" #include "media/cast/rtp_receiver/rtp_receiver.h" @@ -23,70 +24,93 @@ #include "media/cast/transport/utility/transport_encryption_handler.h" namespace media { + +class VideoFrame; + namespace cast { -class Framer; -class LocalRtpVideoFeedback; -class PeerVideoReceiver; -class Rtcp; -class RtpReceiverStatistics; class VideoDecoder; -// Callback used by the video receiver to inform the audio receiver of the new -// delay used to compute the playout and render times. -typedef base::Callback<void(base::TimeDelta)> SetTargetDelayCallback; - -// Should only be called from the Main cast thread. -class VideoReceiver : public base::NonThreadSafe, - public base::SupportsWeakPtr<VideoReceiver>, - public RtpReceiver { +// VideoReceiver receives packets out-of-order while clients make requests for +// complete frames in-order. (A frame consists of one or more packets.) +// +// VideoReceiver also includes logic for computing the playout time for each +// frame, accounting for a constant targeted playout delay. The purpose of the +// playout delay is to provide a fixed window of time between the capture event +// on the sender and the playout on the receiver. This is important because +// each step of the pipeline (i.e., encode frame, then transmit/retransmit from +// the sender, then receive and re-order packets on the receiver, then decode +// frame) can vary in duration and is typically very hard to predict. +// Heuristics will determine when the targeted playout delay is insufficient in +// the current environment; and the receiver can then increase the playout +// delay, notifying the sender, to account for the extra variance. +// TODO(miu): Make the last sentence true. http://crbug.com/360111 +// +// Two types of frames can be requested: 1) A frame of decoded video data; or 2) +// a frame of still-encoded video data, to be passed into an external video +// decoder. Each request for a frame includes a callback which VideoReceiver +// guarantees will be called at some point in the future unless the +// VideoReceiver is destroyed. Clients should generally limit the number of +// outstanding requests (perhaps to just one or two). +// +// This class is not thread safe. Should only be called from the Main cast +// thread. +class VideoReceiver : public RtpReceiver, + public RtpPayloadFeedback, + public base::NonThreadSafe, + public base::SupportsWeakPtr<VideoReceiver> { public: VideoReceiver(scoped_refptr<CastEnvironment> cast_environment, const VideoReceiverConfig& video_config, - transport::PacedPacketSender* const packet_sender, - const SetTargetDelayCallback& target_delay_cb); + transport::PacedPacketSender* const packet_sender); virtual ~VideoReceiver(); - // Request a raw frame. Will return frame via callback when available. + // Request a decoded video frame. + // + // The given |callback| is guaranteed to be run at some point in the future, + // even if to respond with NULL at shutdown time. void GetRawVideoFrame(const VideoFrameDecodedCallback& callback); - // Request an encoded frame. Will return frame via callback when available. + // Request an encoded video frame. + // + // The given |callback| is guaranteed to be run at some point in the future, + // even if to respond with NULL at shutdown time. void GetEncodedVideoFrame(const VideoFrameEncodedCallback& callback); - // Insert a RTP packet to the video receiver. + // Deliver another packet, possibly a duplicate, and possibly out-of-order. void IncomingPacket(scoped_ptr<Packet> packet); + protected: + friend class VideoReceiverTest; // Invoked OnReceivedPayloadData(). + virtual void OnReceivedPayloadData(const uint8* payload_data, size_t payload_size, const RtpCastHeader& rtp_header) OVERRIDE; - protected: - void DecodeVideoFrameThread( - scoped_ptr<transport::EncodedVideoFrame> encoded_frame, - const base::TimeTicks render_time, - const VideoFrameDecodedCallback& frame_decoded_callback); + // RtpPayloadFeedback implementation. + virtual void CastFeedback(const RtcpCastMessage& cast_message) OVERRIDE; private: - friend class LocalRtpVideoFeedback; - - void CastFeedback(const RtcpCastMessage& cast_message); - - void DecodeVideoFrame(const VideoFrameDecodedCallback& callback, - scoped_ptr<transport::EncodedVideoFrame> encoded_frame, - const base::TimeTicks& render_time); - - bool DecryptVideoFrame(scoped_ptr<transport::EncodedVideoFrame>* video_frame); - - bool PullEncodedVideoFrame( - bool next_frame, - scoped_ptr<transport::EncodedVideoFrame>* encoded_frame, - base::TimeTicks* render_time); - - void PlayoutTimeout(); + // Processes ready-to-consume packets from |framer_|, decrypting each packet's + // payload data, and then running the enqueued callbacks in order (one for + // each packet). This method may post a delayed task to re-invoke itself in + // the future to wait for missing/incomplete frames. + void EmitAvailableEncodedFrames(); + + // Clears the |is_waiting_for_consecutive_frame_| flag and invokes + // EmitAvailableEncodedFrames(). + void EmitAvailableEncodedFramesAfterWaiting(); + + // Feeds an EncodedVideoFrame into |video_decoder_|. GetRawVideoFrame() uses + // this as a callback for GetEncodedVideoFrame(). + void DecodeEncodedVideoFrame( + const VideoFrameDecodedCallback& callback, + scoped_ptr<transport::EncodedVideoFrame> encoded_frame, + const base::TimeTicks& playout_time); - // Returns Render time based on current time and the rtp timestamp. - base::TimeTicks GetRenderTime(base::TimeTicks now, uint32 rtp_timestamp); + // Return the playout time based on the current time and rtp timestamp. + base::TimeTicks GetPlayoutTime(base::TimeTicks now, uint32 rtp_timestamp); void InitializeTimers(); @@ -102,32 +126,45 @@ class VideoReceiver : public base::NonThreadSafe, // Actually send the next RTCP report. void SendNextRtcpReport(); - // Update the target delay based on past information. Will also update the - // rtcp module and the audio receiver. - void UpdateTargetDelay(); - - scoped_ptr<VideoDecoder> video_decoder_; - scoped_refptr<CastEnvironment> cast_environment_; + // Receives a VideoFrame from |video_decoder_|, logs the event, and passes the + // data on by running the given |callback|. This method is static to ensure + // it can be called after a VideoReceiver instance is destroyed. + // DecodeEncodedVideoFrame() uses this as a callback for + // VideoDecoder::DecodeFrame(). + static void EmitRawVideoFrame( + const scoped_refptr<CastEnvironment>& cast_environment, + const VideoFrameDecodedCallback& callback, + uint32 frame_id, + uint32 rtp_timestamp, + const base::TimeTicks& playout_time, + const scoped_refptr<VideoFrame>& video_frame, + bool is_continuous); + + const scoped_refptr<CastEnvironment> cast_environment_; // Subscribes to raw events. // Processes raw audio events to be sent over to the cast sender via RTCP. ReceiverRtcpEventSubscriber event_subscriber_; - scoped_ptr<Framer> framer_; const transport::VideoCodec codec_; - base::TimeDelta target_delay_delta_; - base::TimeDelta frame_delay_; - scoped_ptr<LocalRtpVideoFeedback> incoming_payload_feedback_; - scoped_ptr<Rtcp> rtcp_; + const base::TimeDelta target_delay_delta_; + const base::TimeDelta expected_frame_duration_; + Framer framer_; + scoped_ptr<VideoDecoder> video_decoder_; + Rtcp rtcp_; base::TimeDelta time_offset_; // Sender-receiver offset estimation. int time_offset_counter_; - transport::TransportEncryptionHandler decryptor_; - std::list<VideoFrameEncodedCallback> queued_encoded_callbacks_; bool time_incoming_packet_updated_; base::TimeTicks time_incoming_packet_; uint32 incoming_rtp_timestamp_; - base::TimeTicks last_render_time_; - SetTargetDelayCallback target_delay_cb_; + transport::TransportEncryptionHandler decryptor_; + + // Outstanding callbacks to run to deliver on client requests for frames. + std::list<VideoFrameEncodedCallback> frame_request_queue_; + + // True while there's an outstanding task to re-invoke + // EmitAvailableEncodedFrames(). + bool is_waiting_for_consecutive_frame_; // This mapping allows us to log kVideoAckSent as a frame event. In addition // it allows the event to be transmitted via RTCP. diff --git a/media/cast/video_receiver/video_receiver_unittest.cc b/media/cast/video_receiver/video_receiver_unittest.cc index 7bea501320..4fe834ce88 100644 --- a/media/cast/video_receiver/video_receiver_unittest.cc +++ b/media/cast/video_receiver/video_receiver_unittest.cc @@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include <stdint.h> - #include "base/bind.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" @@ -16,45 +14,47 @@ #include "media/cast/video_receiver/video_receiver.h" #include "testing/gmock/include/gmock/gmock.h" -static const int kPacketSize = 1500; -static const int64 kStartMillisecond = INT64_C(12345678900000); - namespace media { namespace cast { -using testing::_; +using ::testing::_; namespace { -// Was thread counted thread safe. -class TestVideoReceiverCallback - : public base::RefCountedThreadSafe<TestVideoReceiverCallback> { + +const int kPacketSize = 1500; +const int64 kStartMillisecond = INT64_C(12345678900000); +const uint32 kFirstFrameId = 1234; + +class FakeVideoClient { public: - TestVideoReceiverCallback() : num_called_(0) {} + FakeVideoClient() : num_called_(0) {} + virtual ~FakeVideoClient() {} - // TODO(mikhal): Set and check expectations. - void DecodeComplete(const scoped_refptr<media::VideoFrame>& video_frame, - const base::TimeTicks& render_time) { - ++num_called_; + void SetNextExpectedResult(uint32 expected_frame_id, + const base::TimeTicks& expected_playout_time) { + expected_frame_id_ = expected_frame_id; + expected_playout_time_ = expected_playout_time; } - void FrameToDecode(scoped_ptr<transport::EncodedVideoFrame> video_frame, - const base::TimeTicks& render_time) { - EXPECT_TRUE(video_frame->key_frame); + void DeliverEncodedVideoFrame( + scoped_ptr<transport::EncodedVideoFrame> video_frame, + const base::TimeTicks& playout_time) { + ASSERT_FALSE(!video_frame) + << "If at shutdown: There were unsatisfied requests enqueued."; + EXPECT_EQ(expected_frame_id_, video_frame->frame_id); EXPECT_EQ(transport::kVp8, video_frame->codec); + EXPECT_EQ(expected_playout_time_, playout_time); ++num_called_; } int number_times_called() const { return num_called_; } - protected: - virtual ~TestVideoReceiverCallback() {} - private: - friend class base::RefCountedThreadSafe<TestVideoReceiverCallback>; - int num_called_; + uint32 expected_frame_id_; + base::TimeTicks expected_playout_time_; - DISALLOW_COPY_AND_ASSIGN(TestVideoReceiverCallback); + DISALLOW_COPY_AND_ASSIGN(FakeVideoClient); }; } // namespace @@ -62,88 +62,85 @@ class VideoReceiverTest : public ::testing::Test { protected: VideoReceiverTest() { // Configure to use vp8 software implementation. - config_.codec = transport::kVp8; + config_.rtp_max_delay_ms = 100; config_.use_external_decoder = false; + // Note: Frame rate must divide 1000 without remainder so the test code + // doesn't have to account for rounding errors. + config_.max_frame_rate = 25; + config_.codec = transport::kVp8; testing_clock_ = new base::SimpleTestTickClock(); + testing_clock_->Advance( + base::TimeDelta::FromMilliseconds(kStartMillisecond)); task_runner_ = new test::FakeSingleThreadTaskRunner(testing_clock_); + cast_environment_ = new CastEnvironment(scoped_ptr<base::TickClock>(testing_clock_).Pass(), task_runner_, task_runner_, task_runner_); + receiver_.reset(new VideoReceiver( - cast_environment_, config_, &mock_transport_, target_delay_cb_)); - testing_clock_->Advance( - base::TimeDelta::FromMilliseconds(kStartMillisecond)); - video_receiver_callback_ = new TestVideoReceiverCallback(); + cast_environment_, config_, &mock_transport_)); + } + virtual ~VideoReceiverTest() {} + + virtual void SetUp() { payload_.assign(kPacketSize, 0); // Always start with a key frame. rtp_header_.is_key_frame = true; - rtp_header_.frame_id = 1234; + rtp_header_.frame_id = kFirstFrameId; rtp_header_.packet_id = 0; rtp_header_.max_packet_id = 0; rtp_header_.is_reference = false; rtp_header_.reference_frame_id = 0; - rtp_header_.webrtc.header.timestamp = 9000; + rtp_header_.webrtc.header.timestamp = 0; } - virtual ~VideoReceiverTest() {} + void FeedOneFrameIntoReceiver() { + receiver_->OnReceivedPayloadData( + payload_.data(), payload_.size(), rtp_header_); + } - transport::MockPacedPacketSender mock_transport_; VideoReceiverConfig config_; - scoped_ptr<VideoReceiver> receiver_; std::vector<uint8> payload_; RtpCastHeader rtp_header_; base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. - + transport::MockPacedPacketSender mock_transport_; scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; scoped_refptr<CastEnvironment> cast_environment_; - scoped_refptr<TestVideoReceiverCallback> video_receiver_callback_; - SetTargetDelayCallback target_delay_cb_; + FakeVideoClient fake_video_client_; + + // Important for the VideoReceiver to be declared last, since its dependencies + // must remain alive until after its destruction. + scoped_ptr<VideoReceiver> receiver_; DISALLOW_COPY_AND_ASSIGN(VideoReceiverTest); }; -TEST_F(VideoReceiverTest, GetOnePacketEncodedframe) { - EXPECT_CALL(mock_transport_, SendRtcpPacket(_)) - .WillRepeatedly(testing::Return(true)); - receiver_->OnReceivedPayloadData( - payload_.data(), payload_.size(), rtp_header_); - - VideoFrameEncodedCallback frame_to_decode_callback = base::Bind( - &TestVideoReceiverCallback::FrameToDecode, video_receiver_callback_); - - receiver_->GetEncodedVideoFrame(frame_to_decode_callback); - task_runner_->RunTasks(); - EXPECT_EQ(video_receiver_callback_->number_times_called(), 1); -} - -TEST_F(VideoReceiverTest, MultiplePackets) { +TEST_F(VideoReceiverTest, GetOnePacketEncodedFrame) { SimpleEventSubscriber event_subscriber; cast_environment_->Logging()->AddRawEventSubscriber(&event_subscriber); EXPECT_CALL(mock_transport_, SendRtcpPacket(_)) .WillRepeatedly(testing::Return(true)); - rtp_header_.max_packet_id = 2; - receiver_->OnReceivedPayloadData( - payload_.data(), payload_.size(), rtp_header_); - ++rtp_header_.packet_id; - ++rtp_header_.webrtc.header.sequenceNumber; - receiver_->OnReceivedPayloadData( - payload_.data(), payload_.size(), rtp_header_); - ++rtp_header_.packet_id; - receiver_->OnReceivedPayloadData( - payload_.data(), payload_.size(), rtp_header_); - - VideoFrameEncodedCallback frame_to_decode_callback = base::Bind( - &TestVideoReceiverCallback::FrameToDecode, video_receiver_callback_); - - receiver_->GetEncodedVideoFrame(frame_to_decode_callback); + // Enqueue a request for a video frame. + receiver_->GetEncodedVideoFrame( + base::Bind(&FakeVideoClient::DeliverEncodedVideoFrame, + base::Unretained(&fake_video_client_))); + + // The request should not be satisfied since no packets have been received. + task_runner_->RunTasks(); + EXPECT_EQ(0, fake_video_client_.number_times_called()); + + // Deliver one video frame to the receiver and expect to get one frame back. + fake_video_client_.SetNextExpectedResult(kFirstFrameId, + testing_clock_->NowTicks()); + FeedOneFrameIntoReceiver(); task_runner_->RunTasks(); - EXPECT_EQ(video_receiver_callback_->number_times_called(), 1); + EXPECT_EQ(1, fake_video_client_.number_times_called()); std::vector<FrameEvent> frame_events; event_subscriber.GetFrameEventsAndReset(&frame_events); @@ -153,23 +150,89 @@ TEST_F(VideoReceiverTest, MultiplePackets) { EXPECT_EQ(rtp_header_.frame_id, frame_events.begin()->frame_id); EXPECT_EQ(rtp_header_.webrtc.header.timestamp, frame_events.begin()->rtp_timestamp); + cast_environment_->Logging()->RemoveRawEventSubscriber(&event_subscriber); } -TEST_F(VideoReceiverTest, GetOnePacketRawframe) { +TEST_F(VideoReceiverTest, MultiplePendingGetCalls) { EXPECT_CALL(mock_transport_, SendRtcpPacket(_)) .WillRepeatedly(testing::Return(true)); - receiver_->OnReceivedPayloadData( - payload_.data(), payload_.size(), rtp_header_); - // Decode error - requires legal input. - VideoFrameDecodedCallback frame_decoded_callback = base::Bind( - &TestVideoReceiverCallback::DecodeComplete, video_receiver_callback_); - receiver_->GetRawVideoFrame(frame_decoded_callback); + + // Enqueue a request for an video frame. + const VideoFrameEncodedCallback frame_encoded_callback = + base::Bind(&FakeVideoClient::DeliverEncodedVideoFrame, + base::Unretained(&fake_video_client_)); + receiver_->GetEncodedVideoFrame(frame_encoded_callback); task_runner_->RunTasks(); - EXPECT_EQ(video_receiver_callback_->number_times_called(), 0); -} + EXPECT_EQ(0, fake_video_client_.number_times_called()); -// TODO(pwestin): add encoded frames. + // Receive one video frame and expect to see the first request satisfied. + fake_video_client_.SetNextExpectedResult(kFirstFrameId, + testing_clock_->NowTicks()); + const base::TimeTicks time_at_first_frame_feed = testing_clock_->NowTicks(); + FeedOneFrameIntoReceiver(); + task_runner_->RunTasks(); + EXPECT_EQ(1, fake_video_client_.number_times_called()); + + testing_clock_->Advance( + base::TimeDelta::FromSeconds(1) / config_.max_frame_rate); + + // Enqueue a second request for an video frame, but it should not be + // fulfilled yet. + receiver_->GetEncodedVideoFrame(frame_encoded_callback); + task_runner_->RunTasks(); + EXPECT_EQ(1, fake_video_client_.number_times_called()); + + // Receive one video frame out-of-order: Make sure that we are not continuous + // and that the RTP timestamp represents a time in the future. + rtp_header_.is_key_frame = false; + rtp_header_.frame_id = kFirstFrameId + 2; + rtp_header_.is_reference = true; + rtp_header_.reference_frame_id = 0; + rtp_header_.webrtc.header.timestamp += + config_.rtp_max_delay_ms * kVideoFrequency / 1000; + fake_video_client_.SetNextExpectedResult( + kFirstFrameId + 2, + time_at_first_frame_feed + + base::TimeDelta::FromMilliseconds(config_.rtp_max_delay_ms)); + FeedOneFrameIntoReceiver(); + + // Frame 2 should not come out at this point in time. + task_runner_->RunTasks(); + EXPECT_EQ(1, fake_video_client_.number_times_called()); + + // Enqueue a third request for an video frame. + receiver_->GetEncodedVideoFrame(frame_encoded_callback); + task_runner_->RunTasks(); + EXPECT_EQ(1, fake_video_client_.number_times_called()); + + // After |rtp_max_delay_ms| has elapsed, Frame 2 is emitted (to satisfy the + // second request) because a decision was made to skip over the no-show Frame + // 1. + testing_clock_->Advance( + base::TimeDelta::FromMilliseconds(config_.rtp_max_delay_ms)); + task_runner_->RunTasks(); + EXPECT_EQ(2, fake_video_client_.number_times_called()); + + // Receive Frame 3 and expect it to fulfill the third request immediately. + rtp_header_.frame_id = kFirstFrameId + 3; + rtp_header_.is_reference = false; + rtp_header_.reference_frame_id = 0; + rtp_header_.webrtc.header.timestamp += + kVideoFrequency / config_.max_frame_rate; + fake_video_client_.SetNextExpectedResult(kFirstFrameId + 3, + testing_clock_->NowTicks()); + FeedOneFrameIntoReceiver(); + task_runner_->RunTasks(); + EXPECT_EQ(3, fake_video_client_.number_times_called()); + + // Move forward another |rtp_max_delay_ms| and run any pending tasks (there + // should be none). Expect no additional frames where emitted. + testing_clock_->Advance( + base::TimeDelta::FromMilliseconds(config_.rtp_max_delay_ms)); + task_runner_->RunTasks(); + EXPECT_EQ(3, fake_video_client_.number_times_called()); +} } // namespace cast } // namespace media diff --git a/media/cast/video_sender/codecs/vp8/vp8_encoder.cc b/media/cast/video_sender/codecs/vp8/vp8_encoder.cc index a822dc91f1..c2f06c5886 100644 --- a/media/cast/video_sender/codecs/vp8/vp8_encoder.cc +++ b/media/cast/video_sender/codecs/vp8/vp8_encoder.cc @@ -79,10 +79,10 @@ void Vp8Encoder::Initialize() { acked_frame_buffers_[i] = true; used_buffers_frame_id_[i] = kStartFrameId; } - InitEncode(cast_config_.number_of_cores); + InitEncode(cast_config_.number_of_encode_threads); } -void Vp8Encoder::InitEncode(int number_of_cores) { +void Vp8Encoder::InitEncode(int number_of_encode_threads) { DCHECK(thread_checker_.CalledOnValidThread()); // Populate encoder configuration with default values. if (vpx_codec_enc_config_default(vpx_codec_vp8_cx(), config_.get(), 0)) { @@ -102,13 +102,7 @@ void Vp8Encoder::InitEncode(int number_of_cores) { // codec requirements. config_->g_error_resilient = 1; } - - if (cast_config_.width * cast_config_.height > 640 * 480 && - number_of_cores >= 2) { - config_->g_threads = 2; // 2 threads for qHD/HD. - } else { - config_->g_threads = 1; // 1 thread for VGA or less. - } + config_->g_threads = number_of_encode_threads; // Rate control settings. // TODO(pwestin): revisit these constants. Currently identical to webrtc. @@ -177,6 +171,9 @@ bool Vp8Encoder::Encode(const scoped_refptr<media::VideoFrame>& video_frame, // Note: The duration does not reflect the real time between frames. This is // done to keep the encoder happy. + // + // TODO(miu): This is a semi-hack. We should consider using + // |video_frame->timestamp()| instead. uint32 duration = kVideoFrequency / cast_config_.max_frame_rate; if (vpx_codec_encode(encoder_.get(), raw_image_, diff --git a/media/cast/video_sender/external_video_encoder.cc b/media/cast/video_sender/external_video_encoder.cc index b051c1b5e0..acae1a41f4 100644 --- a/media/cast/video_sender/external_video_encoder.cc +++ b/media/cast/video_sender/external_video_encoder.cc @@ -86,7 +86,8 @@ class LocalVideoEncodeAcceleratorClient video_encode_accelerator_(vea.Pass()), create_video_encode_memory_cb_(create_video_encode_mem_cb), weak_owner_(weak_owner), - last_encoded_frame_id_(kStartFrameId) { + last_encoded_frame_id_(kStartFrameId), + key_frame_encountered_(false) { DCHECK(encoder_task_runner_); } @@ -107,14 +108,18 @@ class LocalVideoEncodeAcceleratorClient codec_ = video_config.codec; max_frame_rate_ = video_config.max_frame_rate; - // Asynchronous initialization call; NotifyInitializeDone or NotifyError - // will be called once the HW is initialized. - video_encode_accelerator_->Initialize( - media::VideoFrame::I420, - gfx::Size(video_config.width, video_config.height), - output_profile, - video_config.start_bitrate, - this); + if (!video_encode_accelerator_->Initialize( + media::VideoFrame::I420, + gfx::Size(video_config.width, video_config.height), + output_profile, + video_config.start_bitrate, + this)) { + NotifyError(VideoEncodeAccelerator::kInvalidArgumentError); + return; + } + + // Wait until shared memory is allocated to indicate that encoder is + // initialized. } // Free the HW. @@ -151,14 +156,6 @@ class LocalVideoEncodeAcceleratorClient } protected: - virtual void NotifyInitializeDone() OVERRIDE { - DCHECK(encoder_task_runner_); - DCHECK(encoder_task_runner_->RunsTasksOnCurrentThread()); - - // Wait until shared memory is allocated to indicate that encoder is - // initialized. - } - virtual void NotifyError(VideoEncodeAccelerator::Error error) OVERRIDE { DCHECK(encoder_task_runner_); DCHECK(encoder_task_runner_->RunsTasksOnCurrentThread()); @@ -212,7 +209,15 @@ class LocalVideoEncodeAcceleratorClient NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError); return; } - if (!encoded_frame_data_storage_.empty()) { + if (key_frame) + key_frame_encountered_ = true; + if (!key_frame_encountered_) { + // Do not send video until we have encountered the first key frame. + // Save the bitstream buffer in |stream_header_| to be sent later along + // with the first key frame. + stream_header_.append(static_cast<const char*>(output_buffer->memory()), + payload_size); + } else if (!encoded_frame_data_storage_.empty()) { scoped_ptr<transport::EncodedVideoFrame> encoded_frame( new transport::EncodedVideoFrame()); @@ -228,8 +233,12 @@ class LocalVideoEncodeAcceleratorClient encoded_frame->last_referenced_frame_id = encoded_frame->frame_id; } - encoded_frame->data.insert( - 0, static_cast<const char*>(output_buffer->memory()), payload_size); + if (!stream_header_.empty()) { + encoded_frame->data = stream_header_; + stream_header_.clear(); + } + encoded_frame->data.append( + static_cast<const char*>(output_buffer->memory()), payload_size); cast_environment_->PostTask( CastEnvironment::MAIN, @@ -306,6 +315,8 @@ class LocalVideoEncodeAcceleratorClient int max_frame_rate_; transport::VideoCodec codec_; uint32 last_encoded_frame_id_; + bool key_frame_encountered_; + std::string stream_header_; // Shared memory buffers for output with the VideoAccelerator. ScopedVector<base::SharedMemory> output_buffers_; @@ -385,7 +396,6 @@ bool ExternalVideoEncoder::EncodeVideoFrame( if (skip_next_frame_) { VLOG(1) << "Skip encoding frame"; ++skip_count_; - skip_next_frame_ = false; return false; } base::TimeTicks now = cast_environment_->Clock()->NowTicks(); diff --git a/media/cast/video_sender/external_video_encoder_unittest.cc b/media/cast/video_sender/external_video_encoder_unittest.cc index c550fba067..98e3d3d200 100644 --- a/media/cast/video_sender/external_video_encoder_unittest.cc +++ b/media/cast/video_sender/external_video_encoder_unittest.cc @@ -110,8 +110,9 @@ class ExternalVideoEncoderTest : public ::testing::Test { task_runner_, task_runner_, task_runner_); - scoped_ptr<VideoEncodeAccelerator> fake_vea( - new test::FakeVideoEncodeAccelerator()); + + fake_vea_ = new test::FakeVideoEncodeAccelerator(task_runner_); + scoped_ptr<VideoEncodeAccelerator> fake_vea(fake_vea_); video_encoder_.reset( new ExternalVideoEncoder(cast_environment_, video_config_, @@ -124,6 +125,7 @@ class ExternalVideoEncoderTest : public ::testing::Test { virtual ~ExternalVideoEncoderTest() {} base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. + test::FakeVideoEncodeAccelerator* fake_vea_; // Owned by video_encoder_. scoped_refptr<TestVideoEncoderCallback> test_video_encoder_callback_; VideoSenderConfig video_config_; scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; @@ -161,5 +163,64 @@ TEST_F(ExternalVideoEncoderTest, EncodePattern30fpsRunningOutOfAck) { task_runner_->RunTasks(); } +TEST_F(ExternalVideoEncoderTest, SkipNextFrame) { + task_runner_->RunTasks(); // Run the initializer on the correct thread. + + VideoEncoder::FrameEncodedCallback frame_encoded_callback = + base::Bind(&TestVideoEncoderCallback::DeliverEncodedVideoFrame, + test_video_encoder_callback_.get()); + + base::TimeTicks capture_time; + capture_time += base::TimeDelta::FromMilliseconds(33); + test_video_encoder_callback_->SetExpectedResult(true, 0, 0, capture_time); + EXPECT_TRUE(video_encoder_->EncodeVideoFrame( + video_frame_, capture_time, frame_encoded_callback)); + task_runner_->RunTasks(); + + video_encoder_->SkipNextFrame(true); + for (int i = 0; i < 2; ++i) { + capture_time += base::TimeDelta::FromMilliseconds(33); + EXPECT_FALSE(video_encoder_->EncodeVideoFrame( + video_frame_, capture_time, frame_encoded_callback)); + task_runner_->RunTasks(); + } + + video_encoder_->SkipNextFrame(false); + for (int i = 0; i < 2; ++i) { + capture_time += base::TimeDelta::FromMilliseconds(33); + test_video_encoder_callback_->SetExpectedResult( + false, i + 1, i, capture_time); + EXPECT_TRUE(video_encoder_->EncodeVideoFrame( + video_frame_, capture_time, frame_encoded_callback)); + task_runner_->RunTasks(); + } + // We need to run the task to cleanup the GPU instance. + video_encoder_.reset(NULL); + task_runner_->RunTasks(); +} + +TEST_F(ExternalVideoEncoderTest, StreamHeader) { + task_runner_->RunTasks(); // Run the initializer on the correct thread. + + VideoEncoder::FrameEncodedCallback frame_encoded_callback = + base::Bind(&TestVideoEncoderCallback::DeliverEncodedVideoFrame, + test_video_encoder_callback_.get()); + + // Force the FakeVideoEncodeAccelerator to return a dummy non-key frame first. + fake_vea_->SendDummyFrameForTesting(false); + + // Verify the first returned bitstream buffer is still a key frame. + base::TimeTicks capture_time; + capture_time += base::TimeDelta::FromMilliseconds(33); + test_video_encoder_callback_->SetExpectedResult(true, 0, 0, capture_time); + EXPECT_TRUE(video_encoder_->EncodeVideoFrame( + video_frame_, capture_time, frame_encoded_callback)); + task_runner_->RunTasks(); + + // We need to run the task to cleanup the GPU instance. + video_encoder_.reset(NULL); + task_runner_->RunTasks(); +} + } // namespace cast } // namespace media diff --git a/media/cast/video_sender/video_sender.cc b/media/cast/video_sender/video_sender.cc index b35ce55671..6bb56274a3 100644 --- a/media/cast/video_sender/video_sender.cc +++ b/media/cast/video_sender/video_sender.cc @@ -133,11 +133,13 @@ void VideoSender::InsertRawVideoFrame( DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); DCHECK(video_encoder_.get()) << "Invalid state"; - base::TimeTicks now = cast_environment_->Clock()->NowTicks(); + RtpTimestamp rtp_timestamp = GetVideoRtpTimestamp(capture_time); + cast_environment_->Logging()->InsertFrameEvent( + capture_time, kVideoFrameCaptured, rtp_timestamp, kFrameIdUnknown); cast_environment_->Logging()->InsertFrameEvent( - now, + cast_environment_->Clock()->NowTicks(), kVideoFrameReceived, - GetVideoRtpTimestamp(capture_time), + rtp_timestamp, kFrameIdUnknown); // Used by chrome/browser/extension/api/cast_streaming/performance_test.cc @@ -405,6 +407,11 @@ void VideoSender::OnReceivedCastFeedback(const RtcpCastMessage& cast_feedback) { void VideoSender::ReceivedAck(uint32 acked_frame_id) { DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); + if (acked_frame_id == UINT32_C(0xFFFFFFFF)) { + // Receiver is sending a status message before any frames are ready to + // be acked. Ignore. + return; + } // Start sending RTCP packets only after receiving the first ACK, i.e. only // after establishing that the receiver is active. if (last_acked_frame_id_ == -1) { @@ -419,8 +426,8 @@ void VideoSender::ReceivedAck(uint32 acked_frame_id) { now, kVideoAckReceived, rtp_timestamp, acked_frame_id); VLOG(2) << "ReceivedAck:" << static_cast<int>(acked_frame_id); - last_acked_frame_id_ = acked_frame_id; active_session_ = true; + DCHECK_NE(-1, last_acked_frame_id_); UpdateFramesInFlight(); } diff --git a/media/cast/video_sender/video_sender_unittest.cc b/media/cast/video_sender/video_sender_unittest.cc index 56d38c0c72..f4484b5e06 100644 --- a/media/cast/video_sender/video_sender_unittest.cc +++ b/media/cast/video_sender/video_sender_unittest.cc @@ -153,7 +153,7 @@ class VideoSenderTest : public ::testing::Test { if (external) { scoped_ptr<VideoEncodeAccelerator> fake_vea( - new test::FakeVideoEncodeAccelerator()); + new test::FakeVideoEncodeAccelerator(task_runner_)); video_sender_.reset( new PeerVideoSender(cast_environment_, video_config, diff --git a/media/cdm/ppapi/cdm_adapter.cc b/media/cdm/ppapi/cdm_adapter.cc index 4524bbc1fd..bfa4795bef 100644 --- a/media/cdm/ppapi/cdm_adapter.cc +++ b/media/cdm/ppapi/cdm_adapter.cc @@ -307,20 +307,11 @@ void CdmAdapter::LoadSession(uint32_t session_id, return; } - if (!cdm_->LoadSession( - session_id, web_session_id.data(), web_session_id.size())) - OnSessionError(session_id, cdm::kUnknownError, 0); + cdm_->LoadSession(session_id, web_session_id.data(), web_session_id.size()); } void CdmAdapter::UpdateSession(uint32_t session_id, pp::VarArrayBuffer response) { - // TODO(jrummell): In EME WD, AddKey() can only be called on valid sessions. - // We should be able to DCHECK(cdm_) when addressing http://crbug.com/249976. - if (!cdm_) { - OnSessionError(session_id, cdm::kUnknownError, 0); - return; - } - const uint8_t* response_ptr = static_cast<const uint8_t*>(response.Map()); const uint32_t response_size = response.ByteLength(); @@ -328,39 +319,11 @@ void CdmAdapter::UpdateSession(uint32_t session_id, OnSessionError(session_id, cdm::kUnknownError, 0); return; } - CdmWrapper::Result result = - cdm_->UpdateSession(session_id, response_ptr, response_size); - switch (result) { - case CdmWrapper::NO_ACTION: - break; - case CdmWrapper::CALL_KEY_ADDED: - OnSessionReady(session_id); - break; - case CdmWrapper::CALL_KEY_ERROR: - OnSessionError(session_id, cdm::kUnknownError, 0); - break; - } + cdm_->UpdateSession(session_id, response_ptr, response_size); } void CdmAdapter::ReleaseSession(uint32_t session_id) { - // TODO(jrummell): In EME WD, AddKey() can only be called on valid sessions. - // We should be able to DCHECK(cdm_) when addressing http://crbug.com/249976. - if (!cdm_) { - OnSessionError(session_id, cdm::kUnknownError, 0); - return; - } - - CdmWrapper::Result result = cdm_->ReleaseSession(session_id); - switch (result) { - case CdmWrapper::NO_ACTION: - break; - case CdmWrapper::CALL_KEY_ADDED: - PP_NOTREACHED(); - break; - case CdmWrapper::CALL_KEY_ERROR: - OnSessionError(session_id, cdm::kUnknownError, 0); - break; - } + cdm_->ReleaseSession(session_id); } // Note: In the following decryption/decoding related functions, errors are NOT @@ -561,37 +524,6 @@ double CdmAdapter::GetCurrentWallTimeInSeconds() { return pp::Module::Get()->core()->GetTime(); } -void CdmAdapter::SendKeyMessage( - const char* session_id, uint32_t session_id_length, - const char* message, uint32_t message_length, - const char* default_url, uint32_t default_url_length) { - PP_DCHECK(!key_system_.empty()); - - std::string session_id_str(session_id, session_id_length); - PP_DCHECK(!session_id_str.empty()); - uint32_t session_reference_id = cdm_->LookupSessionId(session_id_str); - - OnSessionCreated(session_reference_id, session_id, session_id_length); - OnSessionMessage(session_reference_id, - message, message_length, - default_url, default_url_length); -} - -void CdmAdapter::SendKeyError(const char* session_id, - uint32_t session_id_length, - cdm::MediaKeyError error_code, - uint32_t system_code) { - std::string session_id_str(session_id, session_id_length); - uint32_t session_reference_id = cdm_->LookupSessionId(session_id_str); - OnSessionError(session_reference_id, error_code, system_code); -} - -void CdmAdapter::GetPrivateData(int32_t* instance, - GetPrivateInterface* get_interface) { - *instance = pp_instance(); - *get_interface = pp::Module::Get()->get_browser_interface(); -} - void CdmAdapter::OnSessionCreated(uint32_t session_id, const char* web_session_id, uint32_t web_session_id_length) { @@ -999,24 +931,24 @@ void* GetCdmHost(int host_interface_version, void* user_data) { if (!host_interface_version || !user_data) return NULL; - COMPILE_ASSERT(cdm::ContentDecryptionModule::Host::kVersion == - cdm::ContentDecryptionModule_4::Host::kVersion, - update_code_below); + COMPILE_ASSERT( + cdm::ContentDecryptionModule::Host::kVersion == cdm::Host_4::kVersion, + update_code_below); // Ensure IsSupportedCdmHostVersion matches implementation of this function. // Always update this DCHECK when updating this function. // If this check fails, update this function and DCHECK or update // IsSupportedCdmHostVersion. + PP_DCHECK( // Future version is not supported. - !IsSupportedCdmHostVersion( - cdm::ContentDecryptionModule::Host::kVersion + 1) && + !IsSupportedCdmHostVersion(cdm::Host_4::kVersion + 1) && // Current version is supported. - IsSupportedCdmHostVersion(cdm::ContentDecryptionModule::Host::kVersion) && - // Include all previous supported versions here. - IsSupportedCdmHostVersion(cdm::Host_1::kVersion) && + IsSupportedCdmHostVersion(cdm::Host_4::kVersion) && + // Include all previous supported versions (if any) here. + // No supported previous versions. // One older than the oldest supported version is not supported. - !IsSupportedCdmHostVersion(cdm::Host_1::kVersion - 1)); + !IsSupportedCdmHostVersion(cdm::Host_4::kVersion - 1)); PP_DCHECK(IsSupportedCdmHostVersion(host_interface_version)); CdmAdapter* cdm_adapter = static_cast<CdmAdapter*>(user_data); @@ -1024,10 +956,6 @@ void* GetCdmHost(int host_interface_version, void* user_data) { switch (host_interface_version) { case cdm::Host_4::kVersion: return static_cast<cdm::Host_4*>(cdm_adapter); - case cdm::Host_2::kVersion: - return static_cast<cdm::Host_2*>(cdm_adapter); - case cdm::Host_1::kVersion: - return static_cast<cdm::Host_1*>(cdm_adapter); default: PP_NOTREACHED(); return NULL; diff --git a/media/cdm/ppapi/cdm_adapter.h b/media/cdm/ppapi/cdm_adapter.h index 56bee27315..1a05ada780 100644 --- a/media/cdm/ppapi/cdm_adapter.h +++ b/media/cdm/ppapi/cdm_adapter.h @@ -37,8 +37,6 @@ void* GetCdmHost(int host_interface_version, void* user_data); // Content Decryption Module (CDM). class CdmAdapter : public pp::Instance, public pp::ContentDecryptor_Private, - public cdm::Host_1, - public cdm::Host_2, public cdm::Host_4 { public: CdmAdapter(PP_Instance instance, pp::Module* module); @@ -83,29 +81,6 @@ class CdmAdapter : public pp::Instance, virtual cdm::Buffer* Allocate(uint32_t capacity) OVERRIDE; virtual void SetTimer(int64_t delay_ms, void* context) OVERRIDE; virtual double GetCurrentWallTimeInSeconds() OVERRIDE; - virtual void SendKeyMessage( - const char* session_id, uint32_t session_id_length, - const char* message, uint32_t message_length, - const char* default_url, uint32_t default_url_length) OVERRIDE; - virtual void SendKeyError(const char* session_id, - uint32_t session_id_length, - cdm::MediaKeyError error_code, - uint32_t system_code) OVERRIDE; - virtual void GetPrivateData(int32_t* instance, - GetPrivateInterface* get_interface) OVERRIDE; - - // cdm::Host_2 implementation. - virtual void SendPlatformChallenge( - const char* service_id, uint32_t service_id_length, - const char* challenge, uint32_t challenge_length) OVERRIDE; - virtual void EnableOutputProtection( - uint32_t desired_protection_mask) OVERRIDE; - virtual void QueryOutputProtectionStatus() OVERRIDE; - virtual void OnDeferredInitializationDone( - cdm::StreamType stream_type, - cdm::Status decoder_status) OVERRIDE; - - // cdm::Host_4 implementation. virtual void OnSessionCreated(uint32_t session_id, const char* web_session_id, uint32_t web_session_id_length) OVERRIDE; @@ -119,6 +94,15 @@ class CdmAdapter : public pp::Instance, virtual void OnSessionError(uint32_t session_id, cdm::MediaKeyError error_code, uint32_t system_code) OVERRIDE; + virtual void SendPlatformChallenge( + const char* service_id, uint32_t service_id_length, + const char* challenge, uint32_t challenge_length) OVERRIDE; + virtual void EnableOutputProtection( + uint32_t desired_protection_mask) OVERRIDE; + virtual void QueryOutputProtectionStatus() OVERRIDE; + virtual void OnDeferredInitializationDone( + cdm::StreamType stream_type, + cdm::Status decoder_status) OVERRIDE; virtual cdm::FileIO* CreateFileIO(cdm::FileIOClient* client) OVERRIDE; private: diff --git a/media/cdm/ppapi/cdm_helpers.h b/media/cdm/ppapi/cdm_helpers.h index cb9203e105..e033dd79bf 100644 --- a/media/cdm/ppapi/cdm_helpers.h +++ b/media/cdm/ppapi/cdm_helpers.h @@ -189,8 +189,7 @@ class VideoFrameImpl : public cdm::VideoFrame { DISALLOW_COPY_AND_ASSIGN(VideoFrameImpl); }; -class AudioFramesImpl : public cdm::AudioFrames_1, - public cdm::AudioFrames_2 { +class AudioFramesImpl : public cdm::AudioFrames_2 { public: AudioFramesImpl() : buffer_(NULL), format_(cdm::kUnknownAudioFormat) {} virtual ~AudioFramesImpl() { diff --git a/media/cdm/ppapi/cdm_wrapper.h b/media/cdm/ppapi/cdm_wrapper.h index 818f0e14f8..cf8e88b2ad 100644 --- a/media/cdm/ppapi/cdm_wrapper.h +++ b/media/cdm/ppapi/cdm_wrapper.h @@ -35,16 +35,6 @@ namespace media { // (just a shim layer in most cases), everything is done in this header file. class CdmWrapper { public: - // CDM_1 and CDM_2 methods AddKey() and CancelKeyRequest() may require - // callbacks to fire. Use this enum to indicate the additional calls required. - // TODO(jrummell): Remove return value once CDM_1 and CDM_2 are no longer - // supported. - enum Result { - NO_ACTION, - CALL_KEY_ADDED, - CALL_KEY_ERROR - }; - static CdmWrapper* Create(const char* key_system, uint32_t key_system_size, GetCdmHostFunc get_cdm_host_func, @@ -57,15 +47,13 @@ class CdmWrapper { uint32_t content_type_size, const uint8_t* init_data, uint32_t init_data_size) = 0; - // Returns whether LoadSesson() is supported by the CDM. - // TODO(xhwang): Remove the return value when CDM_1 and CDM_2 are deprecated. - virtual bool LoadSession(uint32_t session_id, + virtual void LoadSession(uint32_t session_id, const char* web_session_id, uint32_t web_session_id_size) = 0; - virtual Result UpdateSession(uint32_t session_id, - const uint8_t* response, - uint32_t response_size) = 0; - virtual Result ReleaseSession(uint32_t session_id) = 0; + virtual void UpdateSession(uint32_t session_id, + const uint8_t* response, + uint32_t response_size) = 0; + virtual void ReleaseSession(uint32_t session_id) = 0; virtual void TimerExpired(void* context) = 0; virtual cdm::Status Decrypt(const cdm::InputBuffer& encrypted_buffer, cdm::DecryptedBlock* decrypted_buffer) = 0; @@ -87,42 +75,8 @@ class CdmWrapper { uint32_t link_mask, uint32_t output_protection_mask) = 0; - // ContentDecryptionModule_1 and ContentDecryptionModule_2 interface methods - // AddKey() and CancelKeyRequest() (older versions of UpdateSession() and - // ReleaseSession(), respectively) pass in the web_session_id rather than the - // session_id. As well, Host_1 and Host_2 callbacks SendKeyMessage() and - // SendKeyError() include the web_session_id, but the actual callbacks need - // session_id. - // - // The following functions maintain the session_id <-> web_session_id mapping. - // These can be removed once _1 and _2 interfaces are no longer supported. - - // Determine the corresponding session_id for |web_session_id|. - virtual uint32_t LookupSessionId(const std::string& web_session_id) = 0; - - // Determine the corresponding session_id for |session_id|. - virtual const std::string LookupWebSessionId(uint32_t session_id) = 0; - - // Map between session_id and web_session_id. - // TODO(jrummell): The following can be removed once CDM_1 and CDM_2 are - // no longer supported. - typedef std::map<uint32_t, std::string> SessionMap; - SessionMap session_map_; - - static const uint32_t kInvalidSessionId = 0; - - // As the response from PrefixedGenerateKeyRequest() may be synchronous or - // asynchronous, keep track of the current request during the call to handle - // synchronous responses or errors. If no response received, add this request - // to a queue and assume that the subsequent responses come back in the order - // issued. - // TODO(jrummell): Remove once all supported CDM host interfaces support - // session_id. - uint32_t current_key_request_session_id_; - std::queue<uint32_t> pending_key_request_session_ids_; - protected: - CdmWrapper() : current_key_request_session_id_(kInvalidSessionId) {} + CdmWrapper() {} private: DISALLOW_COPY_AND_ASSIGN(CdmWrapper); @@ -161,23 +115,20 @@ class CdmWrapperImpl : public CdmWrapper { session_id, content_type, content_type_size, init_data, init_data_size); } - virtual bool LoadSession(uint32_t session_id, + virtual void LoadSession(uint32_t session_id, const char* web_session_id, uint32_t web_session_id_size) OVERRIDE { cdm_->LoadSession(session_id, web_session_id, web_session_id_size); - return true; } - virtual Result UpdateSession(uint32_t session_id, - const uint8_t* response, - uint32_t response_size) OVERRIDE { + virtual void UpdateSession(uint32_t session_id, + const uint8_t* response, + uint32_t response_size) OVERRIDE { cdm_->UpdateSession(session_id, response, response_size); - return NO_ACTION; } - virtual Result ReleaseSession(uint32_t session_id) OVERRIDE { + virtual void ReleaseSession(uint32_t session_id) OVERRIDE { cdm_->ReleaseSession(session_id); - return NO_ACTION; } virtual void TimerExpired(void* context) OVERRIDE { @@ -230,46 +181,6 @@ class CdmWrapperImpl : public CdmWrapper { cdm_->OnQueryOutputProtectionStatus(link_mask, output_protection_mask); } - uint32_t LookupSessionId(const std::string& web_session_id) { - for (SessionMap::iterator it = session_map_.begin(); - it != session_map_.end(); - ++it) { - if (it->second == web_session_id) - return it->first; - } - - // There is no entry in the map; assume it came from the current - // PrefixedGenerateKeyRequest() call (if possible). If no current request, - // assume it came from the oldest PrefixedGenerateKeyRequest() call. - uint32_t session_id = current_key_request_session_id_; - if (current_key_request_session_id_) { - // Only 1 response is allowed for the current - // PrefixedGenerateKeyRequest(). - current_key_request_session_id_ = kInvalidSessionId; - } else { - PP_DCHECK(!pending_key_request_session_ids_.empty()); - session_id = pending_key_request_session_ids_.front(); - pending_key_request_session_ids_.pop(); - } - - // If this is a valid |session_id|, add it to the list. Otherwise, avoid - // adding empty string as a mapping to prevent future calls with an empty - // string from using the wrong session_id. - if (!web_session_id.empty()) { - PP_DCHECK(session_map_.find(session_id) == session_map_.end()); - session_map_[session_id] = web_session_id; - } - - return session_id; - } - - const std::string LookupWebSessionId(uint32_t session_id) { - // Session may not exist if error happens during CreateSession() or - // LoadSession(). - SessionMap::iterator it = session_map_.find(session_id); - return (it != session_map_.end()) ? it->second : std::string(); - } - private: CdmWrapperImpl(CdmInterface* cdm) : cdm_(cdm) { PP_DCHECK(cdm_); @@ -280,202 +191,6 @@ class CdmWrapperImpl : public CdmWrapper { DISALLOW_COPY_AND_ASSIGN(CdmWrapperImpl); }; -// For ContentDecryptionModule_1 and ContentDecryptionModule_2, -// CreateSession(), LoadSession(), UpdateSession(), and ReleaseSession() call -// methods are incompatible with ContentDecryptionModule_4. Use the following -// templated functions to handle this. - -template <class CdmInterface> -void PrefixedGenerateKeyRequest(CdmWrapper* wrapper, - CdmInterface* cdm, - uint32_t session_id, - const char* content_type, - uint32_t content_type_size, - const uint8_t* init_data, - uint32_t init_data_size) { - // As it is possible for CDMs to reply synchronously during the call to - // GenerateKeyRequest(), keep track of |session_id|. - wrapper->current_key_request_session_id_ = session_id; - - cdm::Status status = cdm->GenerateKeyRequest( - content_type, content_type_size, init_data, init_data_size); - PP_DCHECK(status == cdm::kSuccess || status == cdm::kSessionError); - if (status != cdm::kSuccess) { - // If GenerateKeyRequest() failed, no subsequent asynchronous replies - // will be sent. Verify that a response was sent synchronously. - PP_DCHECK(wrapper->current_key_request_session_id_ == - CdmWrapper::kInvalidSessionId); - wrapper->current_key_request_session_id_ = CdmWrapper::kInvalidSessionId; - return; - } - - if (wrapper->current_key_request_session_id_) { - // If this request is still pending (SendKeyMessage() or SendKeyError() - // not called synchronously), add |session_id| to the end of the queue. - // Without CDM support, it is impossible to match SendKeyMessage() - // (or SendKeyError()) responses to the |session_id|. Doing the best - // we can by keeping track of this in a queue, and assuming the responses - // come back in order. - wrapper->pending_key_request_session_ids_.push(session_id); - wrapper->current_key_request_session_id_ = CdmWrapper::kInvalidSessionId; - } -} - -template <class CdmInterface> -CdmWrapper::Result PrefixedAddKey(CdmWrapper* wrapper, - CdmInterface* cdm, - uint32_t session_id, - const uint8_t* response, - uint32_t response_size) { - const std::string web_session_id = wrapper->LookupWebSessionId(session_id); - if (web_session_id.empty()) { - // Possible if UpdateSession() called before CreateSession(). - return CdmWrapper::CALL_KEY_ERROR; - } - - // CDM_1 and CDM_2 accept initdata, which is no longer needed. - // In it's place pass in NULL. - cdm::Status status = cdm->AddKey(web_session_id.data(), web_session_id.size(), - response, response_size, - NULL, 0); - PP_DCHECK(status == cdm::kSuccess || status == cdm::kSessionError); - if (status != cdm::kSuccess) { - // Some CDMs using Host_1/2 don't call keyerror, so send one. - return CdmWrapper::CALL_KEY_ERROR; - } - - return CdmWrapper::CALL_KEY_ADDED; -} - -template <class CdmInterface> -CdmWrapper::Result PrefixedCancelKeyRequest(CdmWrapper* wrapper, - CdmInterface* cdm, - uint32_t session_id) { - const std::string web_session_id = wrapper->LookupWebSessionId(session_id); - if (web_session_id.empty()) { - // Possible if ReleaseSession() called before CreateSession(). - return CdmWrapper::CALL_KEY_ERROR; - } - - wrapper->session_map_.erase(session_id); - cdm::Status status = - cdm->CancelKeyRequest(web_session_id.data(), web_session_id.size()); - - PP_DCHECK(status == cdm::kSuccess || status == cdm::kSessionError); - if (status != cdm::kSuccess) { - // Some CDMs using Host_1/2 don't call keyerror, so send one. - return CdmWrapper::CALL_KEY_ERROR; - } - - return CdmWrapper::NO_ACTION; -} - -// Specializations for ContentDecryptionModule_1. - -template <> -void CdmWrapperImpl<cdm::ContentDecryptionModule_1>::CreateSession( - uint32_t session_id, - const char* content_type, - uint32_t content_type_size, - const uint8_t* init_data, - uint32_t init_data_size) { - PrefixedGenerateKeyRequest(this, - cdm_, - session_id, - content_type, - content_type_size, - init_data, - init_data_size); -} - -template <> -bool CdmWrapperImpl<cdm::ContentDecryptionModule_1>::LoadSession( - uint32_t session_id, - const char* web_session_id, - uint32_t web_session_id_size) { - return false; -} - -template <> -CdmWrapper::Result CdmWrapperImpl< - cdm::ContentDecryptionModule_1>::UpdateSession(uint32_t session_id, - const uint8_t* response, - uint32_t response_size) { - return PrefixedAddKey(this, cdm_, session_id, response, response_size); -} - -template <> -CdmWrapper::Result CdmWrapperImpl< - cdm::ContentDecryptionModule_1>::ReleaseSession(uint32_t session_id) { - return PrefixedCancelKeyRequest(this, cdm_, session_id); -} - -template <> void CdmWrapperImpl<cdm::ContentDecryptionModule_1>:: - OnPlatformChallengeResponse( - const cdm::PlatformChallengeResponse& response) { - PP_NOTREACHED(); -} - -template <> void CdmWrapperImpl<cdm::ContentDecryptionModule_1>:: - OnQueryOutputProtectionStatus(uint32_t link_mask, - uint32_t output_protection_mask) { - PP_NOTREACHED(); -} - -template <> cdm::Status CdmWrapperImpl<cdm::ContentDecryptionModule_1>:: - DecryptAndDecodeSamples(const cdm::InputBuffer& encrypted_buffer, - cdm::AudioFrames* audio_frames) { - AudioFramesImpl audio_frames_1; - cdm::Status status = - cdm_->DecryptAndDecodeSamples(encrypted_buffer, &audio_frames_1); - if (status != cdm::kSuccess) - return status; - - audio_frames->SetFrameBuffer(audio_frames_1.PassFrameBuffer()); - audio_frames->SetFormat(cdm::kAudioFormatS16); - return cdm::kSuccess; -} - -// Specializations for ContentDecryptionModule_2. - -template <> -void CdmWrapperImpl<cdm::ContentDecryptionModule_2>::CreateSession( - uint32_t session_id, - const char* content_type, - uint32_t content_type_size, - const uint8_t* init_data, - uint32_t init_data_size) { - PrefixedGenerateKeyRequest(this, - cdm_, - session_id, - content_type, - content_type_size, - init_data, - init_data_size); -} - -template <> -bool CdmWrapperImpl<cdm::ContentDecryptionModule_2>::LoadSession( - uint32_t session_id, - const char* web_session_id, - uint32_t web_session_id_size) { - return false; -} - -template <> -CdmWrapper::Result CdmWrapperImpl< - cdm::ContentDecryptionModule_2>::UpdateSession(uint32_t session_id, - const uint8_t* response, - uint32_t response_size) { - return PrefixedAddKey(this, cdm_, session_id, response, response_size); -} - -template <> -CdmWrapper::Result CdmWrapperImpl< - cdm::ContentDecryptionModule_2>::ReleaseSession(uint32_t session_id) { - return PrefixedCancelKeyRequest(this, cdm_, session_id); -} - CdmWrapper* CdmWrapper::Create(const char* key_system, uint32_t key_system_size, GetCdmHostFunc get_cdm_host_func, @@ -489,31 +204,21 @@ CdmWrapper* CdmWrapper::Create(const char* key_system, // If this check fails, update this function and DCHECK or update // IsSupportedCdmInterfaceVersion(). PP_DCHECK( - !IsSupportedCdmInterfaceVersion( - cdm::ContentDecryptionModule::kVersion + 1) && + !IsSupportedCdmInterfaceVersion(cdm::ContentDecryptionModule::kVersion + + 1) && IsSupportedCdmInterfaceVersion(cdm::ContentDecryptionModule::kVersion) && - IsSupportedCdmInterfaceVersion( - cdm::ContentDecryptionModule_2::kVersion) && - IsSupportedCdmInterfaceVersion( - cdm::ContentDecryptionModule_1::kVersion) && - !IsSupportedCdmInterfaceVersion( - cdm::ContentDecryptionModule_1::kVersion - 1)); + !IsSupportedCdmInterfaceVersion(cdm::ContentDecryptionModule::kVersion - + 1)); // Try to create the CDM using the latest CDM interface version. CdmWrapper* cdm_wrapper = CdmWrapperImpl<cdm::ContentDecryptionModule>::Create( key_system, key_system_size, get_cdm_host_func, user_data); - if (cdm_wrapper) - return cdm_wrapper; - // Try to see if the CDM supports older version(s) of the CDM interface. - cdm_wrapper = CdmWrapperImpl<cdm::ContentDecryptionModule_2>::Create( - key_system, key_system_size, get_cdm_host_func, user_data); - if (cdm_wrapper) - return cdm_wrapper; + // If |cdm_wrapper| is NULL, try to create the CDM using older supported + // versions of the CDM interface. + // No older versions of CDM interface supported. - cdm_wrapper = CdmWrapperImpl<cdm::ContentDecryptionModule_1>::Create( - key_system, key_system_size, get_cdm_host_func, user_data); return cdm_wrapper; } diff --git a/media/cdm/ppapi/supported_cdm_versions.h b/media/cdm/ppapi/supported_cdm_versions.h index c94d99bf18..d2ae5b3629 100644 --- a/media/cdm/ppapi/supported_cdm_versions.h +++ b/media/cdm/ppapi/supported_cdm_versions.h @@ -26,8 +26,6 @@ bool IsSupportedCdmInterfaceVersion(int version) { switch(version) { // Supported versions in decreasing order. case cdm::ContentDecryptionModule_4::kVersion: - case cdm::ContentDecryptionModule_2::kVersion: - case cdm::ContentDecryptionModule_1::kVersion: return true; default: return false; @@ -41,8 +39,6 @@ bool IsSupportedCdmHostVersion(int version) { switch(version) { // Supported versions in decreasing order. case cdm::Host_4::kVersion: - case cdm::Host_2::kVersion: - case cdm::Host_1::kVersion: return true; default: return false; diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc index caf15ba9b2..49a04f61c7 100644 --- a/media/filters/chunk_demuxer.cc +++ b/media/filters/chunk_demuxer.cc @@ -138,7 +138,7 @@ class SourceState { void SetSequenceMode(bool sequence_mode); // Returns the range of buffered data in this source, capped at |duration|. - // |ended| - Set to true if end of stream has been signalled and the special + // |ended| - Set to true if end of stream has been signaled and the special // end of stream range logic needs to be executed. Ranges<TimeDelta> GetBufferedRanges(TimeDelta duration, bool ended) const; @@ -1106,9 +1106,11 @@ void ChunkDemuxer::CancelPendingSeek(TimeDelta seek_time) { base::ResetAndReturn(&seek_cb_).Run(PIPELINE_OK); } -ChunkDemuxer::Status ChunkDemuxer::AddId(const std::string& id, - const std::string& type, - std::vector<std::string>& codecs) { +ChunkDemuxer::Status ChunkDemuxer::AddId( + const std::string& id, + const std::string& type, + std::vector<std::string>& codecs, + const bool use_legacy_frame_processor) { base::AutoLock auto_lock(lock_); if ((state_ != WAITING_FOR_INIT && state_ != INITIALIZING) || IsValidId(id)) @@ -1133,6 +1135,10 @@ ChunkDemuxer::Status ChunkDemuxer::AddId(const std::string& id, if (has_video) source_id_video_ = id; + if (!use_legacy_frame_processor) { + DLOG(WARNING) << "New frame processor is not yet supported. Using legacy."; + } + scoped_ptr<FrameProcessorBase> frame_processor(new LegacyFrameProcessor( base::Bind(&ChunkDemuxer::IncreaseDurationIfNecessary, base::Unretained(this)))); diff --git a/media/filters/chunk_demuxer.h b/media/filters/chunk_demuxer.h index fd38aee810..685e0b4a7a 100644 --- a/media/filters/chunk_demuxer.h +++ b/media/filters/chunk_demuxer.h @@ -186,13 +186,19 @@ class MEDIA_EXPORT ChunkDemuxer : public Demuxer { // Registers a new |id| to use for AppendData() calls. |type| indicates // the MIME type for the data that we intend to append for this ID. + // |use_legacy_frame_processor| determines which of LegacyFrameProcessor or + // a (not yet implemented) more compliant frame processor to use to process + // parsed frames from AppendData() calls. + // TODO(wolenetz): Enable usage of new frame processor based on this flag. + // See http://crbug.com/249422. // kOk is returned if the demuxer has enough resources to support another ID // and supports the format indicated by |type|. // kNotSupported is returned if |type| is not a supported format. // kReachedIdLimit is returned if the demuxer cannot handle another ID right // now. Status AddId(const std::string& id, const std::string& type, - std::vector<std::string>& codecs); + std::vector<std::string>& codecs, + const bool use_legacy_frame_processor); // Removed an ID & associated resources that were previously added with // AddId(). @@ -289,8 +295,6 @@ class MEDIA_EXPORT ChunkDemuxer : public Demuxer { void OnNewTextTrack(ChunkDemuxerStream* text_stream, const TextTrackConfig& config); - void OnNewMediaSegment(const std::string& source_id, - base::TimeDelta start_timestamp); // Returns true if |source_id| is valid, false otherwise. bool IsValidId(const std::string& source_id) const; diff --git a/media/filters/chunk_demuxer_unittest.cc b/media/filters/chunk_demuxer_unittest.cc index a8fdc4b4a8..9df51084b1 100644 --- a/media/filters/chunk_demuxer_unittest.cc +++ b/media/filters/chunk_demuxer_unittest.cc @@ -28,6 +28,7 @@ using ::testing::NotNull; using ::testing::Return; using ::testing::SaveArg; using ::testing::SetArgumentPointee; +using ::testing::Values; using ::testing::_; namespace media { @@ -84,7 +85,7 @@ base::TimeDelta kDefaultDuration() { // The data pointed by |buffer| should be at least 8 bytes long. // |number| should be in the range 0 <= number < 0x00FFFFFFFFFFFFFF. static void WriteInt64(uint8* buffer, int64 number) { - DCHECK(number >= 0 && number < GG_LONGLONG(0x00FFFFFFFFFFFFFF)); + DCHECK(number >= 0 && number < 0x00FFFFFFFFFFFFFFLL); buffer[0] = 0x01; int64 tmp = number; for (int i = 7; i > 0; i--) { @@ -132,7 +133,12 @@ static void OnSeekDone_OKExpected(bool* called, PipelineStatus status) { static void LogFunc(const std::string& str) { DVLOG(1) << str; } -class ChunkDemuxerTest : public testing::Test { +// Test parameter determines which coded frame processor is used to process +// appended data. If true, LegacyFrameProcessor is used. Otherwise, (not yet +// supported), a more compliant frame processor is used. +// TODO(wolenetz): Enable usage of new frame processor based on this flag. +// See http://crbug.com/249422. +class ChunkDemuxerTest : public ::testing::TestWithParam<bool> { protected: enum CodecsIndex { AUDIO, @@ -156,6 +162,7 @@ class ChunkDemuxerTest : public testing::Test { ChunkDemuxerTest() : append_window_end_for_next_append_(kInfiniteDuration()) { + use_legacy_frame_processor_ = GetParam(); CreateNewDemuxer(); } @@ -313,7 +320,8 @@ class ChunkDemuxerTest : public testing::Test { return AddId(kSourceId, HAS_AUDIO | HAS_VIDEO); } - return demuxer_->AddId(source_id, type, codecs); + return demuxer_->AddId(source_id, type, codecs, + use_legacy_frame_processor_); } void AppendData(const uint8* data, size_t length) { @@ -968,6 +976,7 @@ class ChunkDemuxerTest : public testing::Test { MockDemuxerHost host_; scoped_ptr<ChunkDemuxer> demuxer_; + bool use_legacy_frame_processor_; base::TimeDelta append_window_start_for_next_append_; base::TimeDelta append_window_end_for_next_append_; @@ -980,7 +989,7 @@ class ChunkDemuxerTest : public testing::Test { DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest); }; -TEST_F(ChunkDemuxerTest, Init) { +TEST_P(ChunkDemuxerTest, Init) { // Test no streams, audio-only, video-only, and audio & video scenarios. // Audio and video streams can be encrypted or not encrypted. for (int i = 0; i < 16; i++) { @@ -1049,7 +1058,7 @@ TEST_F(ChunkDemuxerTest, Init) { // TODO(acolwell): Fold this test into Init tests since the tests are // almost identical. -TEST_F(ChunkDemuxerTest, InitText) { +TEST_P(ChunkDemuxerTest, InitText) { // Test with 1 video stream and 1 text streams, and 0 or 1 audio streams. // No encryption cases handled here. bool has_video = true; @@ -1113,7 +1122,7 @@ TEST_F(ChunkDemuxerTest, InitText) { // Make sure that the demuxer reports an error if Shutdown() // is called before all the initialization segments are appended. -TEST_F(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppended) { +TEST_P(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppended) { EXPECT_CALL(*this, DemuxerOpened()); demuxer_->Initialize( &host_, CreateInitDoneCB( @@ -1127,7 +1136,7 @@ TEST_F(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppended) { ShutdownDemuxer(); } -TEST_F(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppendedText) { +TEST_P(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppendedText) { EXPECT_CALL(*this, DemuxerOpened()); demuxer_->Initialize( &host_, CreateInitDoneCB( @@ -1146,7 +1155,7 @@ TEST_F(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppendedText) { // Verifies that all streams waiting for data receive an end of stream // buffer when Shutdown() is called. -TEST_F(ChunkDemuxerTest, Shutdown_EndOfStreamWhileWaitingForData) { +TEST_P(ChunkDemuxerTest, Shutdown_EndOfStreamWhileWaitingForData) { DemuxerStream* text_stream = NULL; EXPECT_CALL(host_, AddTextStream(_, _)) .WillOnce(SaveArg<0>(&text_stream)); @@ -1176,7 +1185,7 @@ TEST_F(ChunkDemuxerTest, Shutdown_EndOfStreamWhileWaitingForData) { // Test that Seek() completes successfully when the first cluster // arrives. -TEST_F(ChunkDemuxerTest, AppendDataAfterSeek) { +TEST_P(ChunkDemuxerTest, AppendDataAfterSeek) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); AppendCluster(kDefaultFirstCluster()); @@ -1198,7 +1207,7 @@ TEST_F(ChunkDemuxerTest, AppendDataAfterSeek) { } // Test that parsing errors are handled for clusters appended after init. -TEST_F(ChunkDemuxerTest, ErrorWhileParsingClusterAfterInit) { +TEST_P(ChunkDemuxerTest, ErrorWhileParsingClusterAfterInit) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); AppendCluster(kDefaultFirstCluster()); @@ -1209,7 +1218,7 @@ TEST_F(ChunkDemuxerTest, ErrorWhileParsingClusterAfterInit) { // Test the case where a Seek() is requested while the parser // is in the middle of cluster. This is to verify that the parser // does not reset itself on a seek. -TEST_F(ChunkDemuxerTest, SeekWhileParsingCluster) { +TEST_P(ChunkDemuxerTest, SeekWhileParsingCluster) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); InSequence s; @@ -1243,7 +1252,7 @@ TEST_F(ChunkDemuxerTest, SeekWhileParsingCluster) { } // Test the case where AppendData() is called before Init(). -TEST_F(ChunkDemuxerTest, AppendDataBeforeInit) { +TEST_P(ChunkDemuxerTest, AppendDataBeforeInit) { scoped_ptr<uint8[]> info_tracks; int info_tracks_size = 0; CreateInitSegment(HAS_AUDIO | HAS_VIDEO, @@ -1255,7 +1264,7 @@ TEST_F(ChunkDemuxerTest, AppendDataBeforeInit) { } // Make sure Read() callbacks are dispatched with the proper data. -TEST_F(ChunkDemuxerTest, Read) { +TEST_P(ChunkDemuxerTest, Read) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); AppendCluster(kDefaultFirstCluster()); @@ -1273,7 +1282,7 @@ TEST_F(ChunkDemuxerTest, Read) { EXPECT_TRUE(video_read_done); } -TEST_F(ChunkDemuxerTest, OutOfOrderClusters) { +TEST_P(ChunkDemuxerTest, OutOfOrderClusters) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); AppendCluster(kDefaultFirstCluster()); AppendCluster(GenerateCluster(10, 4)); @@ -1290,7 +1299,7 @@ TEST_F(ChunkDemuxerTest, OutOfOrderClusters) { ×tamp_offset_map_[kSourceId]); } -TEST_F(ChunkDemuxerTest, NonMonotonicButAboveClusterTimecode) { +TEST_P(ChunkDemuxerTest, NonMonotonicButAboveClusterTimecode) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); AppendCluster(kDefaultFirstCluster()); @@ -1315,7 +1324,7 @@ TEST_F(ChunkDemuxerTest, NonMonotonicButAboveClusterTimecode) { ×tamp_offset_map_[kSourceId]); } -TEST_F(ChunkDemuxerTest, BackwardsAndBeforeClusterTimecode) { +TEST_P(ChunkDemuxerTest, BackwardsAndBeforeClusterTimecode) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); AppendCluster(kDefaultFirstCluster()); @@ -1341,7 +1350,7 @@ TEST_F(ChunkDemuxerTest, BackwardsAndBeforeClusterTimecode) { } -TEST_F(ChunkDemuxerTest, PerStreamMonotonicallyIncreasingTimestamps) { +TEST_P(ChunkDemuxerTest, PerStreamMonotonicallyIncreasingTimestamps) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); AppendCluster(kDefaultFirstCluster()); @@ -1361,7 +1370,7 @@ TEST_F(ChunkDemuxerTest, PerStreamMonotonicallyIncreasingTimestamps) { // Test the case where a cluster is passed to AppendCluster() before // INFO & TRACKS data. -TEST_F(ChunkDemuxerTest, ClusterBeforeInitSegment) { +TEST_P(ChunkDemuxerTest, ClusterBeforeInitSegment) { EXPECT_CALL(*this, DemuxerOpened()); demuxer_->Initialize( &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN), true); @@ -1372,14 +1381,14 @@ TEST_F(ChunkDemuxerTest, ClusterBeforeInitSegment) { } // Test cases where we get an MarkEndOfStream() call during initialization. -TEST_F(ChunkDemuxerTest, EOSDuringInit) { +TEST_P(ChunkDemuxerTest, EOSDuringInit) { EXPECT_CALL(*this, DemuxerOpened()); demuxer_->Initialize( &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN), true); MarkEndOfStream(PIPELINE_OK); } -TEST_F(ChunkDemuxerTest, EndOfStreamWithNoAppend) { +TEST_P(ChunkDemuxerTest, EndOfStreamWithNoAppend) { EXPECT_CALL(*this, DemuxerOpened()); demuxer_->Initialize( &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN), true); @@ -1394,7 +1403,7 @@ TEST_F(ChunkDemuxerTest, EndOfStreamWithNoAppend) { demuxer_.reset(); } -TEST_F(ChunkDemuxerTest, EndOfStreamWithNoMediaAppend) { +TEST_P(ChunkDemuxerTest, EndOfStreamWithNoMediaAppend) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); CheckExpectedRanges("{ }"); @@ -1402,7 +1411,7 @@ TEST_F(ChunkDemuxerTest, EndOfStreamWithNoMediaAppend) { CheckExpectedRanges("{ }"); } -TEST_F(ChunkDemuxerTest, DecodeErrorEndOfStream) { +TEST_P(ChunkDemuxerTest, DecodeErrorEndOfStream) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); AppendCluster(kDefaultFirstCluster()); @@ -1413,7 +1422,7 @@ TEST_F(ChunkDemuxerTest, DecodeErrorEndOfStream) { CheckExpectedRanges(kDefaultFirstClusterRange); } -TEST_F(ChunkDemuxerTest, NetworkErrorEndOfStream) { +TEST_P(ChunkDemuxerTest, NetworkErrorEndOfStream) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); AppendCluster(kDefaultFirstCluster()); @@ -1473,7 +1482,7 @@ class EndOfStreamHelper { // Make sure that all pending reads that we don't have media data for get an // "end of stream" buffer when MarkEndOfStream() is called. -TEST_F(ChunkDemuxerTest, EndOfStreamWithPendingReads) { +TEST_P(ChunkDemuxerTest, EndOfStreamWithPendingReads) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); AppendCluster(GenerateCluster(0, 2)); @@ -1508,7 +1517,7 @@ TEST_F(ChunkDemuxerTest, EndOfStreamWithPendingReads) { // Make sure that all Read() calls after we get an MarkEndOfStream() // call return an "end of stream" buffer. -TEST_F(ChunkDemuxerTest, ReadsAfterEndOfStream) { +TEST_P(ChunkDemuxerTest, ReadsAfterEndOfStream) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); AppendCluster(GenerateCluster(0, 2)); @@ -1547,7 +1556,7 @@ TEST_F(ChunkDemuxerTest, ReadsAfterEndOfStream) { end_of_stream_helper_3.CheckIfReadDonesWereCalled(true); } -TEST_F(ChunkDemuxerTest, EndOfStreamDuringCanceledSeek) { +TEST_P(ChunkDemuxerTest, EndOfStreamDuringCanceledSeek) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); AppendCluster(0, 10); @@ -1578,7 +1587,7 @@ TEST_F(ChunkDemuxerTest, EndOfStreamDuringCanceledSeek) { } // Verify buffered range change behavior for audio/video/text tracks. -TEST_F(ChunkDemuxerTest, EndOfStreamRangeChanges) { +TEST_P(ChunkDemuxerTest, EndOfStreamRangeChanges) { DemuxerStream* text_stream = NULL; EXPECT_CALL(host_, AddTextStream(_, _)) @@ -1617,7 +1626,7 @@ TEST_F(ChunkDemuxerTest, EndOfStreamRangeChanges) { } // Make sure AppendData() will accept elements that span multiple calls. -TEST_F(ChunkDemuxerTest, AppendingInPieces) { +TEST_P(ChunkDemuxerTest, AppendingInPieces) { EXPECT_CALL(*this, DemuxerOpened()); demuxer_->Initialize( &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true); @@ -1649,7 +1658,7 @@ TEST_F(ChunkDemuxerTest, AppendingInPieces) { GenerateExpectedReads(0, 9); } -TEST_F(ChunkDemuxerTest, WebMFile_AudioAndVideo) { +TEST_P(ChunkDemuxerTest, WebMFile_AudioAndVideo) { struct BufferTimestamps buffer_timestamps[] = { {0, 0}, {33, 3}, @@ -1668,7 +1677,7 @@ TEST_F(ChunkDemuxerTest, WebMFile_AudioAndVideo) { base::TimeDelta::FromMilliseconds(2744))); } -TEST_F(ChunkDemuxerTest, WebMFile_LiveAudioAndVideo) { +TEST_P(ChunkDemuxerTest, WebMFile_LiveAudioAndVideo) { struct BufferTimestamps buffer_timestamps[] = { {0, 0}, {33, 3}, @@ -1682,7 +1691,7 @@ TEST_F(ChunkDemuxerTest, WebMFile_LiveAudioAndVideo) { kInfiniteDuration())); } -TEST_F(ChunkDemuxerTest, WebMFile_AudioOnly) { +TEST_P(ChunkDemuxerTest, WebMFile_AudioOnly) { struct BufferTimestamps buffer_timestamps[] = { {kSkip, 0}, {kSkip, 3}, @@ -1702,7 +1711,7 @@ TEST_F(ChunkDemuxerTest, WebMFile_AudioOnly) { HAS_AUDIO)); } -TEST_F(ChunkDemuxerTest, WebMFile_VideoOnly) { +TEST_P(ChunkDemuxerTest, WebMFile_VideoOnly) { struct BufferTimestamps buffer_timestamps[] = { {0, kSkip}, {33, kSkip}, @@ -1722,7 +1731,7 @@ TEST_F(ChunkDemuxerTest, WebMFile_VideoOnly) { HAS_VIDEO)); } -TEST_F(ChunkDemuxerTest, WebMFile_AltRefFrames) { +TEST_P(ChunkDemuxerTest, WebMFile_AltRefFrames) { struct BufferTimestamps buffer_timestamps[] = { {0, 0}, {33, 3}, @@ -1742,7 +1751,7 @@ TEST_F(ChunkDemuxerTest, WebMFile_AltRefFrames) { } // Verify that we output buffers before the entire cluster has been parsed. -TEST_F(ChunkDemuxerTest, IncrementalClusterParsing) { +TEST_P(ChunkDemuxerTest, IncrementalClusterParsing) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); AppendEmptyCluster(0); @@ -1805,7 +1814,7 @@ TEST_F(ChunkDemuxerTest, IncrementalClusterParsing) { EXPECT_TRUE(video_read_done); } -TEST_F(ChunkDemuxerTest, ParseErrorDuringInit) { +TEST_P(ChunkDemuxerTest, ParseErrorDuringInit) { EXPECT_CALL(*this, DemuxerOpened()); demuxer_->Initialize( &host_, CreateInitDoneCB( @@ -1820,7 +1829,7 @@ TEST_F(ChunkDemuxerTest, ParseErrorDuringInit) { ×tamp_offset_map_[kSourceId]); } -TEST_F(ChunkDemuxerTest, AVHeadersWithAudioOnlyType) { +TEST_P(ChunkDemuxerTest, AVHeadersWithAudioOnlyType) { EXPECT_CALL(*this, DemuxerOpened()); demuxer_->Initialize( &host_, CreateInitDoneCB(kNoTimestamp(), @@ -1828,13 +1837,14 @@ TEST_F(ChunkDemuxerTest, AVHeadersWithAudioOnlyType) { std::vector<std::string> codecs(1); codecs[0] = "vorbis"; - ASSERT_EQ(demuxer_->AddId(kSourceId, "audio/webm", codecs), + ASSERT_EQ(demuxer_->AddId(kSourceId, "audio/webm", codecs, + use_legacy_frame_processor_), ChunkDemuxer::kOk); AppendInitSegment(HAS_AUDIO | HAS_VIDEO); } -TEST_F(ChunkDemuxerTest, AVHeadersWithVideoOnlyType) { +TEST_P(ChunkDemuxerTest, AVHeadersWithVideoOnlyType) { EXPECT_CALL(*this, DemuxerOpened()); demuxer_->Initialize( &host_, CreateInitDoneCB(kNoTimestamp(), @@ -1842,13 +1852,14 @@ TEST_F(ChunkDemuxerTest, AVHeadersWithVideoOnlyType) { std::vector<std::string> codecs(1); codecs[0] = "vp8"; - ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs), + ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs, + use_legacy_frame_processor_), ChunkDemuxer::kOk); AppendInitSegment(HAS_AUDIO | HAS_VIDEO); } -TEST_F(ChunkDemuxerTest, MultipleHeaders) { +TEST_P(ChunkDemuxerTest, MultipleHeaders) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); AppendCluster(kDefaultFirstCluster()); @@ -1861,7 +1872,7 @@ TEST_F(ChunkDemuxerTest, MultipleHeaders) { GenerateExpectedReads(0, 9); } -TEST_F(ChunkDemuxerTest, AddSeparateSourcesForAudioAndVideo) { +TEST_P(ChunkDemuxerTest, AddSeparateSourcesForAudioAndVideo) { std::string audio_id = "audio1"; std::string video_id = "video1"; ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); @@ -1875,7 +1886,7 @@ TEST_F(ChunkDemuxerTest, AddSeparateSourcesForAudioAndVideo) { GenerateVideoStreamExpectedReads(0, 4); } -TEST_F(ChunkDemuxerTest, AddSeparateSourcesForAudioAndVideoText) { +TEST_P(ChunkDemuxerTest, AddSeparateSourcesForAudioAndVideoText) { // TODO(matthewjheaney): Here and elsewhere, we need more tests // for inband text tracks (http://crbug/321455). @@ -1895,7 +1906,7 @@ TEST_F(ChunkDemuxerTest, AddSeparateSourcesForAudioAndVideoText) { GenerateVideoStreamExpectedReads(0, 4); } -TEST_F(ChunkDemuxerTest, AddIdFailures) { +TEST_P(ChunkDemuxerTest, AddIdFailures) { EXPECT_CALL(*this, DemuxerOpened()); demuxer_->Initialize( &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true); @@ -1915,7 +1926,7 @@ TEST_F(ChunkDemuxerTest, AddIdFailures) { } // Test that Read() calls after a RemoveId() return "end of stream" buffers. -TEST_F(ChunkDemuxerTest, RemoveId) { +TEST_P(ChunkDemuxerTest, RemoveId) { std::string audio_id = "audio1"; std::string video_id = "video1"; ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); @@ -1944,7 +1955,7 @@ TEST_F(ChunkDemuxerTest, RemoveId) { // Test that removing an ID immediately after adding it does not interfere with // quota for new IDs in the future. -TEST_F(ChunkDemuxerTest, RemoveAndAddId) { +TEST_P(ChunkDemuxerTest, RemoveAndAddId) { std::string audio_id_1 = "audio1"; ASSERT_TRUE(AddId(audio_id_1, HAS_AUDIO) == ChunkDemuxer::kOk); demuxer_->RemoveId(audio_id_1); @@ -1953,7 +1964,7 @@ TEST_F(ChunkDemuxerTest, RemoveAndAddId) { ASSERT_TRUE(AddId(audio_id_2, HAS_AUDIO) == ChunkDemuxer::kOk); } -TEST_F(ChunkDemuxerTest, SeekCanceled) { +TEST_P(ChunkDemuxerTest, SeekCanceled) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); // Append cluster at the beginning of the stream. @@ -1983,7 +1994,7 @@ TEST_F(ChunkDemuxerTest, SeekCanceled) { GenerateExpectedReads(0, 4); } -TEST_F(ChunkDemuxerTest, SeekCanceledWhileWaitingForSeek) { +TEST_P(ChunkDemuxerTest, SeekCanceledWhileWaitingForSeek) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); // Append cluster at the beginning of the stream. @@ -2012,7 +2023,7 @@ TEST_F(ChunkDemuxerTest, SeekCanceledWhileWaitingForSeek) { } // Test that Seek() successfully seeks to all source IDs. -TEST_F(ChunkDemuxerTest, SeekAudioAndVideoSources) { +TEST_P(ChunkDemuxerTest, SeekAudioAndVideoSources) { std::string audio_id = "audio1"; std::string video_id = "video1"; ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); @@ -2069,7 +2080,7 @@ TEST_F(ChunkDemuxerTest, SeekAudioAndVideoSources) { // is called before data is available for that seek point. // This scenario might be useful if seeking past the end of stream // of either audio or video (or both). -TEST_F(ChunkDemuxerTest, EndOfStreamAfterPastEosSeek) { +TEST_P(ChunkDemuxerTest, EndOfStreamAfterPastEosSeek) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); AppendCluster(GenerateSingleStreamCluster(0, 120, kAudioTrackNum, 10)); @@ -2098,7 +2109,7 @@ TEST_F(ChunkDemuxerTest, EndOfStreamAfterPastEosSeek) { // Test that EndOfStream is ignored if coming during a pending seek // whose seek time is before some existing ranges. -TEST_F(ChunkDemuxerTest, EndOfStreamDuringPendingSeek) { +TEST_P(ChunkDemuxerTest, EndOfStreamDuringPendingSeek) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); AppendCluster(GenerateSingleStreamCluster(0, 120, kAudioTrackNum, 10)); @@ -2134,7 +2145,7 @@ TEST_F(ChunkDemuxerTest, EndOfStreamDuringPendingSeek) { } // Test ranges in an audio-only stream. -TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioIdOnly) { +TEST_P(ChunkDemuxerTest, GetBufferedRanges_AudioIdOnly) { EXPECT_CALL(*this, DemuxerOpened()); demuxer_->Initialize( &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true); @@ -2156,7 +2167,7 @@ TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioIdOnly) { } // Test ranges in a video-only stream. -TEST_F(ChunkDemuxerTest, GetBufferedRanges_VideoIdOnly) { +TEST_P(ChunkDemuxerTest, GetBufferedRanges_VideoIdOnly) { EXPECT_CALL(*this, DemuxerOpened()); demuxer_->Initialize( &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true); @@ -2177,7 +2188,7 @@ TEST_F(ChunkDemuxerTest, GetBufferedRanges_VideoIdOnly) { CheckExpectedRanges("{ [0,132) [200,299) }"); } -TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideo) { +TEST_P(ChunkDemuxerTest, GetBufferedRanges_AudioVideo) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); // Audio: 0 -> 23 @@ -2234,7 +2245,7 @@ TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideo) { CheckExpectedRanges("{ [0,23) [320,400) [520,570) [720,750) [920,950) }"); } -TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideoText) { +TEST_P(ChunkDemuxerTest, GetBufferedRanges_AudioVideoText) { EXPECT_CALL(host_, AddTextStream(_, _)); ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO | HAS_TEXT)); @@ -2261,7 +2272,7 @@ TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideoText) { // Once MarkEndOfStream() is called, GetBufferedRanges should not cut off any // over-hanging tails at the end of the ranges as this is likely due to block // duration differences. -TEST_F(ChunkDemuxerTest, GetBufferedRanges_EndOfStream) { +TEST_P(ChunkDemuxerTest, GetBufferedRanges_EndOfStream) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); AppendSingleStreamCluster(kSourceId, kAudioTrackNum, "0K 23K"); @@ -2319,7 +2330,7 @@ TEST_F(ChunkDemuxerTest, GetBufferedRanges_EndOfStream) { CheckExpectedRanges("{ [0,46) [200,266) [300,366) }"); } -TEST_F(ChunkDemuxerTest, DifferentStreamTimecodes) { +TEST_P(ChunkDemuxerTest, DifferentStreamTimecodes) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); // Create a cluster where the video timecode begins 25ms after the audio. @@ -2337,7 +2348,7 @@ TEST_F(ChunkDemuxerTest, DifferentStreamTimecodes) { GenerateExpectedReads(5025, 5000, 8); } -TEST_F(ChunkDemuxerTest, DifferentStreamTimecodesSeparateSources) { +TEST_P(ChunkDemuxerTest, DifferentStreamTimecodesSeparateSources) { std::string audio_id = "audio1"; std::string video_id = "video1"; ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); @@ -2355,7 +2366,7 @@ TEST_F(ChunkDemuxerTest, DifferentStreamTimecodesSeparateSources) { GenerateVideoStreamExpectedReads(30, 4); } -TEST_F(ChunkDemuxerTest, DifferentStreamTimecodesOutOfRange) { +TEST_P(ChunkDemuxerTest, DifferentStreamTimecodesOutOfRange) { std::string audio_id = "audio1"; std::string video_id = "video1"; ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); @@ -2376,7 +2387,7 @@ TEST_F(ChunkDemuxerTest, DifferentStreamTimecodesOutOfRange) { ExpectEndOfStream(DemuxerStream::VIDEO); } -TEST_F(ChunkDemuxerTest, ClusterWithNoBuffers) { +TEST_P(ChunkDemuxerTest, ClusterWithNoBuffers) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); // Generate and append an empty cluster beginning at 0. @@ -2388,7 +2399,7 @@ TEST_F(ChunkDemuxerTest, ClusterWithNoBuffers) { ExpectRead(DemuxerStream::VIDEO, 0); } -TEST_F(ChunkDemuxerTest, CodecPrefixMatching) { +TEST_P(ChunkDemuxerTest, CodecPrefixMatching) { ChunkDemuxer::Status expected = ChunkDemuxer::kNotSupported; #if defined(USE_PROPRIETARY_CODECS) @@ -2398,12 +2409,14 @@ TEST_F(ChunkDemuxerTest, CodecPrefixMatching) { std::vector<std::string> codecs; codecs.push_back("avc1.4D4041"); - EXPECT_EQ(demuxer_->AddId("source_id", "video/mp4", codecs), expected); + EXPECT_EQ(demuxer_->AddId("source_id", "video/mp4", codecs, + use_legacy_frame_processor_), + expected); } // Test codec ID's that are not compliant with RFC6381, but have been // seen in the wild. -TEST_F(ChunkDemuxerTest, CodecIDsThatAreNotRFC6381Compliant) { +TEST_P(ChunkDemuxerTest, CodecIDsThatAreNotRFC6381Compliant) { ChunkDemuxer::Status expected = ChunkDemuxer::kNotSupported; #if defined(USE_PROPRIETARY_CODECS) @@ -2420,7 +2433,8 @@ TEST_F(ChunkDemuxerTest, CodecIDsThatAreNotRFC6381Compliant) { codecs.push_back(codec_ids[i]); ChunkDemuxer::Status result = - demuxer_->AddId("source_id", "audio/mp4", codecs); + demuxer_->AddId("source_id", "audio/mp4", codecs, + use_legacy_frame_processor_); EXPECT_EQ(result, expected) << "Fail to add codec_id '" << codec_ids[i] << "'"; @@ -2430,7 +2444,7 @@ TEST_F(ChunkDemuxerTest, CodecIDsThatAreNotRFC6381Compliant) { } } -TEST_F(ChunkDemuxerTest, EndOfStreamStillSetAfterSeek) { +TEST_P(ChunkDemuxerTest, EndOfStreamStillSetAfterSeek) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); EXPECT_CALL(host_, SetDuration(_)) @@ -2467,7 +2481,7 @@ TEST_F(ChunkDemuxerTest, EndOfStreamStillSetAfterSeek) { EXPECT_EQ(kLastVideoTimestamp, last_timestamp); } -TEST_F(ChunkDemuxerTest, GetBufferedRangesBeforeInitSegment) { +TEST_P(ChunkDemuxerTest, GetBufferedRangesBeforeInitSegment) { EXPECT_CALL(*this, DemuxerOpened()); demuxer_->Initialize(&host_, CreateInitDoneCB(PIPELINE_OK), true); ASSERT_EQ(AddId("audio", HAS_AUDIO), ChunkDemuxer::kOk); @@ -2479,7 +2493,7 @@ TEST_F(ChunkDemuxerTest, GetBufferedRangesBeforeInitSegment) { // Test that Seek() completes successfully when the first cluster // arrives. -TEST_F(ChunkDemuxerTest, EndOfStreamDuringSeek) { +TEST_P(ChunkDemuxerTest, EndOfStreamDuringSeek) { InSequence s; ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); @@ -2504,7 +2518,7 @@ TEST_F(ChunkDemuxerTest, EndOfStreamDuringSeek) { end_of_stream_helper.CheckIfReadDonesWereCalled(true); } -TEST_F(ChunkDemuxerTest, ConfigChange_Video) { +TEST_P(ChunkDemuxerTest, ConfigChange_Video) { InSequence s; ASSERT_TRUE(InitDemuxerWithConfigChangeData()); @@ -2551,7 +2565,7 @@ TEST_F(ChunkDemuxerTest, ConfigChange_Video) { ASSERT_EQ(status, DemuxerStream::kOk); } -TEST_F(ChunkDemuxerTest, ConfigChange_Audio) { +TEST_P(ChunkDemuxerTest, ConfigChange_Audio) { InSequence s; ASSERT_TRUE(InitDemuxerWithConfigChangeData()); @@ -2598,7 +2612,7 @@ TEST_F(ChunkDemuxerTest, ConfigChange_Audio) { ASSERT_EQ(status, DemuxerStream::kOk); } -TEST_F(ChunkDemuxerTest, ConfigChange_Seek) { +TEST_P(ChunkDemuxerTest, ConfigChange_Seek) { InSequence s; ASSERT_TRUE(InitDemuxerWithConfigChangeData()); @@ -2645,7 +2659,7 @@ TEST_F(ChunkDemuxerTest, ConfigChange_Seek) { ASSERT_TRUE(video_config_1.Matches(video->video_decoder_config())); } -TEST_F(ChunkDemuxerTest, TimestampPositiveOffset) { +TEST_P(ChunkDemuxerTest, TimestampPositiveOffset) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); ASSERT_TRUE(SetTimestampOffset(kSourceId, base::TimeDelta::FromSeconds(30))); @@ -2656,7 +2670,7 @@ TEST_F(ChunkDemuxerTest, TimestampPositiveOffset) { GenerateExpectedReads(30000, 2); } -TEST_F(ChunkDemuxerTest, TimestampNegativeOffset) { +TEST_P(ChunkDemuxerTest, TimestampNegativeOffset) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); ASSERT_TRUE(SetTimestampOffset(kSourceId, base::TimeDelta::FromSeconds(-1))); @@ -2665,7 +2679,7 @@ TEST_F(ChunkDemuxerTest, TimestampNegativeOffset) { GenerateExpectedReads(0, 2); } -TEST_F(ChunkDemuxerTest, TimestampOffsetSeparateStreams) { +TEST_P(ChunkDemuxerTest, TimestampOffsetSeparateStreams) { std::string audio_id = "audio1"; std::string video_id = "video1"; ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); @@ -2695,7 +2709,7 @@ TEST_F(ChunkDemuxerTest, TimestampOffsetSeparateStreams) { GenerateAudioStreamExpectedReads(27300, 4); } -TEST_F(ChunkDemuxerTest, IsParsingMediaSegmentMidMediaSegment) { +TEST_P(ChunkDemuxerTest, IsParsingMediaSegmentMidMediaSegment) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); scoped_ptr<Cluster> cluster = GenerateCluster(0, 2); @@ -2711,7 +2725,7 @@ TEST_F(ChunkDemuxerTest, IsParsingMediaSegmentMidMediaSegment) { ASSERT_FALSE(demuxer_->IsParsingMediaSegment(kSourceId)); } -TEST_F(ChunkDemuxerTest, WebMIsParsingMediaSegmentDetection) { +TEST_P(ChunkDemuxerTest, WebMIsParsingMediaSegmentDetection) { // TODO(wolenetz): Also test 'unknown' sized clusters. // See http://crbug.com/335676. const uint8 kBuffer[] = { @@ -2741,7 +2755,7 @@ TEST_F(ChunkDemuxerTest, WebMIsParsingMediaSegmentDetection) { } } -TEST_F(ChunkDemuxerTest, DurationChange) { +TEST_P(ChunkDemuxerTest, DurationChange) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); const int kStreamDuration = kDefaultDuration().InMilliseconds(); @@ -2782,7 +2796,7 @@ TEST_F(ChunkDemuxerTest, DurationChange) { CheckExpectedRanges(kSourceId, "{ [201191,201290) }"); } -TEST_F(ChunkDemuxerTest, DurationChangeTimestampOffset) { +TEST_P(ChunkDemuxerTest, DurationChangeTimestampOffset) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); ASSERT_TRUE(SetTimestampOffset(kSourceId, kDefaultDuration())); @@ -2799,7 +2813,7 @@ TEST_F(ChunkDemuxerTest, DurationChangeTimestampOffset) { AppendCluster(GenerateCluster(0, 4)); } -TEST_F(ChunkDemuxerTest, EndOfStreamTruncateDuration) { +TEST_P(ChunkDemuxerTest, EndOfStreamTruncateDuration) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); AppendCluster(kDefaultFirstCluster()); @@ -2810,12 +2824,12 @@ TEST_F(ChunkDemuxerTest, EndOfStreamTruncateDuration) { } -TEST_F(ChunkDemuxerTest, ZeroLengthAppend) { +TEST_P(ChunkDemuxerTest, ZeroLengthAppend) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); AppendData(NULL, 0); } -TEST_F(ChunkDemuxerTest, AppendAfterEndOfStream) { +TEST_P(ChunkDemuxerTest, AppendAfterEndOfStream) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); EXPECT_CALL(host_, SetDuration(_)) @@ -2833,14 +2847,14 @@ TEST_F(ChunkDemuxerTest, AppendAfterEndOfStream) { // Test receiving a Shutdown() call before we get an Initialize() // call. This can happen if video element gets destroyed before // the pipeline has a chance to initialize the demuxer. -TEST_F(ChunkDemuxerTest, Shutdown_BeforeInitialize) { +TEST_P(ChunkDemuxerTest, Shutdown_BeforeInitialize) { demuxer_->Shutdown(); demuxer_->Initialize( &host_, CreateInitDoneCB(DEMUXER_ERROR_COULD_NOT_OPEN), true); message_loop_.RunUntilIdle(); } -TEST_F(ChunkDemuxerTest, ReadAfterAudioDisabled) { +TEST_P(ChunkDemuxerTest, ReadAfterAudioDisabled) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); AppendCluster(kDefaultFirstCluster()); @@ -2862,7 +2876,7 @@ TEST_F(ChunkDemuxerTest, ReadAfterAudioDisabled) { // Verifies that signaling end of stream while stalled at a gap // boundary does not trigger end of stream buffers to be returned. -TEST_F(ChunkDemuxerTest, EndOfStreamWhileWaitingForGapToBeFilled) { +TEST_P(ChunkDemuxerTest, EndOfStreamWhileWaitingForGapToBeFilled) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); AppendCluster(0, 10); @@ -2925,7 +2939,7 @@ TEST_F(ChunkDemuxerTest, EndOfStreamWhileWaitingForGapToBeFilled) { EXPECT_TRUE(video_read_done); } -TEST_F(ChunkDemuxerTest, CanceledSeekDuringInitialPreroll) { +TEST_P(ChunkDemuxerTest, CanceledSeekDuringInitialPreroll) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); // Cancel preroll. @@ -2939,7 +2953,7 @@ TEST_F(ChunkDemuxerTest, CanceledSeekDuringInitialPreroll) { AppendCluster(seek_time.InMilliseconds(), 10); } -TEST_F(ChunkDemuxerTest, GCDuringSeek) { +TEST_P(ChunkDemuxerTest, GCDuringSeek) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO)); demuxer_->SetMemoryLimitsForTesting(5 * kBlockSize); @@ -2982,7 +2996,7 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek) { CheckExpectedRanges(kSourceId, "{ [500,592) [792,815) }"); } -TEST_F(ChunkDemuxerTest, RemoveBeforeInitSegment) { +TEST_P(ChunkDemuxerTest, RemoveBeforeInitSegment) { EXPECT_CALL(*this, DemuxerOpened()); demuxer_->Initialize( &host_, CreateInitDoneCB(kNoTimestamp(), PIPELINE_OK), true); @@ -2993,7 +3007,7 @@ TEST_F(ChunkDemuxerTest, RemoveBeforeInitSegment) { base::TimeDelta::FromMilliseconds(1)); } -TEST_F(ChunkDemuxerTest, AppendWindow_Video) { +TEST_P(ChunkDemuxerTest, AppendWindow_Video) { ASSERT_TRUE(InitDemuxer(HAS_VIDEO)); DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); @@ -3021,7 +3035,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Video) { CheckExpectedRanges(kSourceId, "{ [120,270) [420,630) }"); } -TEST_F(ChunkDemuxerTest, AppendWindow_Audio) { +TEST_P(ChunkDemuxerTest, AppendWindow_Audio) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO)); DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO); @@ -3050,7 +3064,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Audio) { CheckExpectedRanges(kSourceId, "{ [30,270) [360,630) }"); } -TEST_F(ChunkDemuxerTest, AppendWindow_Text) { +TEST_P(ChunkDemuxerTest, AppendWindow_Text) { DemuxerStream* text_stream = NULL; EXPECT_CALL(host_, AddTextStream(_, _)) .WillOnce(SaveArg<0>(&text_stream)); @@ -3089,7 +3103,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Text) { CheckExpectedBuffers(text_stream, "400 500"); } -TEST_F(ChunkDemuxerTest, StartWaitingForSeekAfterParseError) { +TEST_P(ChunkDemuxerTest, StartWaitingForSeekAfterParseError) { ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); AppendGarbage(); @@ -3097,7 +3111,7 @@ TEST_F(ChunkDemuxerTest, StartWaitingForSeekAfterParseError) { demuxer_->StartWaitingForSeek(seek_time); } -TEST_F(ChunkDemuxerTest, Remove_AudioVideoText) { +TEST_P(ChunkDemuxerTest, Remove_AudioVideoText) { DemuxerStream* text_stream = NULL; EXPECT_CALL(host_, AddTextStream(_, _)) .WillOnce(SaveArg<0>(&text_stream)); @@ -3140,7 +3154,7 @@ TEST_F(ChunkDemuxerTest, Remove_AudioVideoText) { // Verifies that a Seek() will complete without text cues for // the seek point and will return cues after the seek position // when they are eventually appended. -TEST_F(ChunkDemuxerTest, SeekCompletesWithoutTextCues) { +TEST_P(ChunkDemuxerTest, SeekCompletesWithoutTextCues) { DemuxerStream* text_stream = NULL; EXPECT_CALL(host_, AddTextStream(_, _)) .WillOnce(SaveArg<0>(&text_stream)); @@ -3195,4 +3209,8 @@ TEST_F(ChunkDemuxerTest, SeekCompletesWithoutTextCues) { CheckExpectedBuffers(video_stream, "180 210"); } +// TODO(wolenetz): Enable testing of new frame processor based on this flag, +// once the new processor has landed. See http://crbug.com/249422. +INSTANTIATE_TEST_CASE_P(LegacyFrameProcessor, ChunkDemuxerTest, Values(true)); + } // namespace media diff --git a/media/filters/decrypting_audio_decoder.cc b/media/filters/decrypting_audio_decoder.cc index 8f9b4794d9..91ee63b932 100644 --- a/media/filters/decrypting_audio_decoder.cc +++ b/media/filters/decrypting_audio_decoder.cc @@ -207,18 +207,6 @@ void DecryptingAudioDecoder::SetDecryptor(Decryptor* decryptor) { } void DecryptingAudioDecoder::InitializeDecoder() { - // Force to use S16 due to limitations of the CDM. See b/13548512 - config_.Initialize(config_.codec(), - kSampleFormatS16, - config_.channel_layout(), - config_.samples_per_second(), - config_.extra_data(), - config_.extra_data_size(), - config_.is_encrypted(), - false, - base::TimeDelta(), - base::TimeDelta()); - state_ = kPendingDecoderInit; decryptor_->InitializeAudioDecoder( config_, diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc index d2267f3227..de1968afc4 100644 --- a/media/filters/ffmpeg_demuxer.cc +++ b/media/filters/ffmpeg_demuxer.cc @@ -444,10 +444,6 @@ void FFmpegDemuxer::Initialize(DemuxerHost* host, host_ = host; text_enabled_ = enable_text_tracks; - // TODO(scherkus): DataSource should have a host by this point, - // see http://crbug.com/122071 - data_source_->set_host(host); - url_protocol_.reset(new BlockingUrlProtocol(data_source_, BindToCurrentLoop( base::Bind(&FFmpegDemuxer::OnDataSourceError, base::Unretained(this))))); glue_.reset(new FFmpegGlue(url_protocol_.get())); diff --git a/media/filters/ffmpeg_demuxer_unittest.cc b/media/filters/ffmpeg_demuxer_unittest.cc index c168f92792..9b684ff4e5 100644 --- a/media/filters/ffmpeg_demuxer_unittest.cc +++ b/media/filters/ffmpeg_demuxer_unittest.cc @@ -75,8 +75,6 @@ class FFmpegDemuxerTest : public testing::Test { void CreateDemuxer(const std::string& name) { CHECK(!demuxer_); - EXPECT_CALL(host_, SetTotalBytes(_)).Times(AnyNumber()); - EXPECT_CALL(host_, AddBufferedByteRange(_, _)).Times(AnyNumber()); EXPECT_CALL(host_, AddBufferedTimeRange(_, _)).Times(AnyNumber()); CreateDataSource(name); diff --git a/media/filters/ffmpeg_video_decoder.cc b/media/filters/ffmpeg_video_decoder.cc index 53ee43786d..5e1a8ecada 100644 --- a/media/filters/ffmpeg_video_decoder.cc +++ b/media/filters/ffmpeg_video_decoder.cc @@ -321,7 +321,7 @@ bool FFmpegVideoDecoder::FFmpegDecode( } *video_frame = static_cast<VideoFrame*>(av_frame_->opaque); - (*video_frame)->SetTimestamp( + (*video_frame)->set_timestamp( base::TimeDelta::FromMicroseconds(av_frame_->reordered_opaque)); return true; diff --git a/media/filters/file_data_source.cc b/media/filters/file_data_source.cc index 8fb3100917..e8b3292898 100644 --- a/media/filters/file_data_source.cc +++ b/media/filters/file_data_source.cc @@ -18,25 +18,12 @@ FileDataSource::FileDataSource() FileDataSource::FileDataSource(base::File file) : force_read_errors_(false), force_streaming_(false) { - if (!file_.Initialize(file.Pass())) - return; - - UpdateHostBytes(); + file_.Initialize(file.Pass()); } bool FileDataSource::Initialize(const base::FilePath& file_path) { DCHECK(!file_.IsValid()); - - if (!file_.Initialize(file_path)) - return false; - - UpdateHostBytes(); - return true; -} - -void FileDataSource::set_host(DataSourceHost* host) { - DataSource::set_host(host); - UpdateHostBytes(); + return file_.Initialize(file_path); } void FileDataSource::Stop(const base::Closure& callback) { @@ -77,11 +64,4 @@ void FileDataSource::SetBitrate(int bitrate) {} FileDataSource::~FileDataSource() {} -void FileDataSource::UpdateHostBytes() { - if (host() && file_.IsValid()) { - host()->SetTotalBytes(file_.length()); - host()->AddBufferedByteRange(0, file_.length()); - } -} - } // namespace media diff --git a/media/filters/file_data_source.h b/media/filters/file_data_source.h index 817e2b9be6..739bc2ec3e 100644 --- a/media/filters/file_data_source.h +++ b/media/filters/file_data_source.h @@ -25,7 +25,6 @@ class MEDIA_EXPORT FileDataSource : public DataSource { bool Initialize(const base::FilePath& file_path); // Implementation of DataSource. - virtual void set_host(DataSourceHost* host) OVERRIDE; virtual void Stop(const base::Closure& callback) OVERRIDE; virtual void Read(int64 position, int size, uint8* data, const DataSource::ReadCB& read_cb) OVERRIDE; @@ -38,9 +37,6 @@ class MEDIA_EXPORT FileDataSource : public DataSource { void force_streaming_for_testing() { force_streaming_ = true; } private: - // Informs the host of changes in total and buffered bytes. - void UpdateHostBytes(); - base::MemoryMappedFile file_; bool force_read_errors_; diff --git a/media/filters/file_data_source_unittest.cc b/media/filters/file_data_source_unittest.cc index f6c9b89885..5eb94ca9e3 100644 --- a/media/filters/file_data_source_unittest.cc +++ b/media/filters/file_data_source_unittest.cc @@ -9,7 +9,6 @@ #include "base/files/file_path.h" #include "base/path_service.h" #include "base/strings/utf_string_conversions.h" -#include "media/base/mock_data_source_host.h" #include "media/base/test_helpers.h" #include "media/filters/file_data_source.h" @@ -44,31 +43,15 @@ base::FilePath TestFileURL() { return data_dir; } -// Test that FileDataSource call the appropriate methods on its filter host. -TEST(FileDataSourceTest, OpenFile) { - StrictMock<MockDataSourceHost> host; - EXPECT_CALL(host, SetTotalBytes(10)); - EXPECT_CALL(host, AddBufferedByteRange(0, 10)); - - FileDataSource data_source; - data_source.set_host(&host); - EXPECT_TRUE(data_source.Initialize(TestFileURL())); - - data_source.Stop(NewExpectedClosure()); -} - // Use the mock filter host to directly call the Read and GetPosition methods. TEST(FileDataSourceTest, ReadData) { int64 size; uint8 ten_bytes[10]; // Create our mock filter host and initialize the data source. - NiceMock<MockDataSourceHost> host; FileDataSource data_source; - data_source.set_host(&host); EXPECT_TRUE(data_source.Initialize(TestFileURL())); - EXPECT_TRUE(data_source.GetSize(&size)); EXPECT_EQ(10, size); diff --git a/media/filters/gpu_video_accelerator_factories.h b/media/filters/gpu_video_accelerator_factories.h index 36fa75d6bf..a6859c78f2 100644 --- a/media/filters/gpu_video_accelerator_factories.h +++ b/media/filters/gpu_video_accelerator_factories.h @@ -10,14 +10,19 @@ #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "gpu/command_buffer/common/mailbox.h" -#include "media/base/video_decoder_config.h" +#include "media/base/media_export.h" + +class SkBitmap; namespace base { class SingleThreadTaskRunner; class SharedMemory; } -class SkBitmap; +namespace gfx { +class Rect; +class Size; +} namespace media { @@ -38,8 +43,7 @@ class MEDIA_EXPORT GpuVideoAcceleratorFactories // Caller owns returned pointer, but should call Destroy() on it (instead of // directly deleting) for proper destruction, as per the // VideoDecodeAccelerator interface. - virtual scoped_ptr<VideoDecodeAccelerator> CreateVideoDecodeAccelerator( - VideoCodecProfile profile) = 0; + virtual scoped_ptr<VideoDecodeAccelerator> CreateVideoDecodeAccelerator() = 0; // Caller owns returned pointer, but should call Destroy() on it (instead of // directly deleting) for proper destruction, as per the diff --git a/media/filters/gpu_video_decoder.cc b/media/filters/gpu_video_decoder.cc index 1ce5ba0fba..d796a96a2d 100644 --- a/media/filters/gpu_video_decoder.cc +++ b/media/filters/gpu_video_decoder.cc @@ -180,7 +180,7 @@ void GpuVideoDecoder::Initialize(const VideoDecoderConfig& config, return; } - vda_ = factories_->CreateVideoDecodeAccelerator(config.profile()).Pass(); + vda_ = factories_->CreateVideoDecodeAccelerator().Pass(); if (!vda_ || !vda_->Initialize(config.profile(), this)) { status_cb.Run(DECODER_ERROR_NOT_SUPPORTED); return; @@ -345,10 +345,6 @@ bool GpuVideoDecoder::CanReadWithoutStalling() const { available_pictures_ > 0 || !ready_video_frames_.empty(); } -void GpuVideoDecoder::NotifyInitializeDone() { - NOTREACHED() << "GpuVideoDecodeAcceleratorHost::Initialize is synchronous!"; -} - void GpuVideoDecoder::ProvidePictureBuffers(uint32 count, const gfx::Size& size, uint32 texture_target) { diff --git a/media/filters/gpu_video_decoder.h b/media/filters/gpu_video_decoder.h index 41742e91b4..166cd339d6 100644 --- a/media/filters/gpu_video_decoder.h +++ b/media/filters/gpu_video_decoder.h @@ -53,7 +53,6 @@ class MEDIA_EXPORT GpuVideoDecoder virtual bool CanReadWithoutStalling() const OVERRIDE; // VideoDecodeAccelerator::Client implementation. - virtual void NotifyInitializeDone() OVERRIDE; virtual void ProvidePictureBuffers(uint32 count, const gfx::Size& size, uint32 texture_target) OVERRIDE; diff --git a/media/filters/mock_gpu_video_accelerator_factories.cc b/media/filters/mock_gpu_video_accelerator_factories.cc index 4c58d4303d..eeb3ba6dce 100644 --- a/media/filters/mock_gpu_video_accelerator_factories.cc +++ b/media/filters/mock_gpu_video_accelerator_factories.cc @@ -11,10 +11,8 @@ MockGpuVideoAcceleratorFactories::MockGpuVideoAcceleratorFactories() {} MockGpuVideoAcceleratorFactories::~MockGpuVideoAcceleratorFactories() {} scoped_ptr<VideoDecodeAccelerator> -MockGpuVideoAcceleratorFactories::CreateVideoDecodeAccelerator( - VideoCodecProfile profile) { - return scoped_ptr<VideoDecodeAccelerator>( - DoCreateVideoDecodeAccelerator(profile)); +MockGpuVideoAcceleratorFactories::CreateVideoDecodeAccelerator() { + return scoped_ptr<VideoDecodeAccelerator>(DoCreateVideoDecodeAccelerator()); } scoped_ptr<VideoEncodeAccelerator> diff --git a/media/filters/mock_gpu_video_accelerator_factories.h b/media/filters/mock_gpu_video_accelerator_factories.h index 86b9a16522..fde3b08fea 100644 --- a/media/filters/mock_gpu_video_accelerator_factories.h +++ b/media/filters/mock_gpu_video_accelerator_factories.h @@ -28,8 +28,7 @@ class MockGpuVideoAcceleratorFactories : public GpuVideoAcceleratorFactories { // CreateVideo{Decode,Encode}Accelerator returns scoped_ptr, which the mocking // framework does not want. Trampoline them. - MOCK_METHOD1(DoCreateVideoDecodeAccelerator, - VideoDecodeAccelerator*(VideoCodecProfile)); + MOCK_METHOD0(DoCreateVideoDecodeAccelerator, VideoDecodeAccelerator*()); MOCK_METHOD0(DoCreateVideoEncodeAccelerator, VideoEncodeAccelerator*()); MOCK_METHOD5(CreateTextures, @@ -47,8 +46,8 @@ class MockGpuVideoAcceleratorFactories : public GpuVideoAcceleratorFactories { MOCK_METHOD1(CreateSharedMemory, base::SharedMemory*(size_t size)); MOCK_METHOD0(GetTaskRunner, scoped_refptr<base::SingleThreadTaskRunner>()); - virtual scoped_ptr<VideoDecodeAccelerator> CreateVideoDecodeAccelerator( - VideoCodecProfile profile) OVERRIDE; + virtual scoped_ptr<VideoDecodeAccelerator> CreateVideoDecodeAccelerator() + OVERRIDE; virtual scoped_ptr<VideoEncodeAccelerator> CreateVideoEncodeAccelerator() OVERRIDE; diff --git a/media/filters/pipeline_integration_test.cc b/media/filters/pipeline_integration_test.cc index ecb0872da5..dfea318086 100644 --- a/media/filters/pipeline_integration_test.cc +++ b/media/filters/pipeline_integration_test.cc @@ -20,6 +20,7 @@ using testing::_; using testing::AnyNumber; using testing::AtMost; +using testing::Values; namespace media { @@ -254,7 +255,8 @@ class MockMediaSource { public: MockMediaSource(const std::string& filename, const std::string& mimetype, - int initial_append_size) + int initial_append_size, + const bool use_legacy_frame_processor) : file_path_(GetTestDataFilePath(filename)), current_position_(0), initial_append_size_(initial_append_size), @@ -265,7 +267,8 @@ class MockMediaSource { base::Unretained(this)), LogCB(), false)), - owned_chunk_demuxer_(chunk_demuxer_) { + owned_chunk_demuxer_(chunk_demuxer_), + use_legacy_frame_processor_(use_legacy_frame_processor) { file_data_ = ReadTestDataFile(filename); @@ -363,7 +366,10 @@ class MockMediaSource { Tokenize(codecs_param, ",", &codecs); } - CHECK_EQ(chunk_demuxer_->AddId(kSourceId, type, codecs), ChunkDemuxer::kOk); + CHECK_EQ(chunk_demuxer_->AddId(kSourceId, type, codecs, + use_legacy_frame_processor_), + ChunkDemuxer::kOk); + AppendData(initial_append_size_); } @@ -388,10 +394,18 @@ class MockMediaSource { scoped_ptr<Demuxer> owned_chunk_demuxer_; Demuxer::NeedKeyCB need_key_cb_; base::TimeDelta last_timestamp_offset_; + bool use_legacy_frame_processor_; }; +// Test parameter determines which coded frame processor is used to process +// appended data, and is only applicable in tests where the pipeline is using a +// (Mock)MediaSource (which are TEST_P, not TEST_F). If true, +// LegacyFrameProcessor is used. Otherwise, (not yet supported), a more +// compliant frame processor is used. +// TODO(wolenetz): Enable usage of new frame processor based on this flag. +// See http://crbug.com/249422. class PipelineIntegrationTest - : public testing::Test, + : public testing::TestWithParam<bool>, public PipelineIntegrationTestBase { public: void StartPipelineWithMediaSource(MockMediaSource* source) { @@ -449,7 +463,8 @@ class PipelineIntegrationTest base::TimeDelta seek_time, int seek_file_position, int seek_append_size) { - MockMediaSource source(filename, mimetype, initial_append_size); + MockMediaSource source(filename, mimetype, initial_append_size, + GetParam()); StartPipelineWithMediaSource(&source); if (pipeline_status_ != PIPELINE_OK) @@ -514,8 +529,8 @@ TEST_F(PipelineIntegrationTest, BasicPlaybackEncrypted) { Stop(); } -TEST_F(PipelineIntegrationTest, BasicPlayback_MediaSource) { - MockMediaSource source("bear-320x240.webm", kWebM, 219229); +TEST_P(PipelineIntegrationTest, BasicPlayback_MediaSource) { + MockMediaSource source("bear-320x240.webm", kWebM, 219229, GetParam()); StartPipelineWithMediaSource(&source); source.EndOfStream(); @@ -531,8 +546,8 @@ TEST_F(PipelineIntegrationTest, BasicPlayback_MediaSource) { Stop(); } -TEST_F(PipelineIntegrationTest, BasicPlayback_MediaSource_VP9_WebM) { - MockMediaSource source("bear-vp9.webm", kWebMVP9, 67504); +TEST_P(PipelineIntegrationTest, BasicPlayback_MediaSource_VP9_WebM) { + MockMediaSource source("bear-vp9.webm", kWebMVP9, 67504, GetParam()); StartPipelineWithMediaSource(&source); source.EndOfStream(); @@ -548,9 +563,10 @@ TEST_F(PipelineIntegrationTest, BasicPlayback_MediaSource_VP9_WebM) { Stop(); } -TEST_F(PipelineIntegrationTest, BasicPlayback_MediaSource_VP8A_WebM) { +TEST_P(PipelineIntegrationTest, BasicPlayback_MediaSource_VP8A_WebM) { EXPECT_CALL(*this, OnSetOpaque(false)).Times(AnyNumber()); - MockMediaSource source("bear-vp8a.webm", kVideoOnlyWebM, kAppendWholeFile); + MockMediaSource source("bear-vp8a.webm", kVideoOnlyWebM, kAppendWholeFile, + GetParam()); StartPipelineWithMediaSource(&source); source.EndOfStream(); @@ -566,10 +582,10 @@ TEST_F(PipelineIntegrationTest, BasicPlayback_MediaSource_VP8A_WebM) { Stop(); } -TEST_F(PipelineIntegrationTest, BasicPlayback_MediaSource_Opus_WebM) { +TEST_P(PipelineIntegrationTest, BasicPlayback_MediaSource_Opus_WebM) { EXPECT_CALL(*this, OnSetOpaque(false)).Times(AnyNumber()); MockMediaSource source("bear-opus-end-trimming.webm", kOpusAudioOnlyWebM, - kAppendWholeFile); + kAppendWholeFile, GetParam()); StartPipelineWithMediaSource(&source); source.EndOfStream(); @@ -589,13 +605,12 @@ TEST_F(PipelineIntegrationTest, BasicPlayback_MediaSource_Opus_WebM) { } // Flaky. http://crbug.com/304776 -TEST_F(PipelineIntegrationTest, DISABLED_MediaSource_Opus_Seeking_WebM) { +TEST_P(PipelineIntegrationTest, DISABLED_MediaSource_Opus_Seeking_WebM) { EXPECT_CALL(*this, OnSetOpaque(false)).Times(AnyNumber()); MockMediaSource source("bear-opus-end-trimming.webm", kOpusAudioOnlyWebM, - kAppendWholeFile); + kAppendWholeFile, GetParam()); StartHashedPipelineWithMediaSource(&source); - EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); // TODO(acolwell/wolenetz): Drop the "+ 1" once WebM stream parser always @@ -622,9 +637,9 @@ TEST_F(PipelineIntegrationTest, DISABLED_MediaSource_Opus_Seeking_WebM) { Stop(); } -TEST_F(PipelineIntegrationTest, MediaSource_ConfigChange_WebM) { +TEST_P(PipelineIntegrationTest, MediaSource_ConfigChange_WebM) { MockMediaSource source("bear-320x240-16x9-aspect.webm", kWebM, - kAppendWholeFile); + kAppendWholeFile, GetParam()); StartPipelineWithMediaSource(&source); scoped_refptr<DecoderBuffer> second_file = @@ -647,9 +662,9 @@ TEST_F(PipelineIntegrationTest, MediaSource_ConfigChange_WebM) { Stop(); } -TEST_F(PipelineIntegrationTest, MediaSource_ConfigChange_Encrypted_WebM) { +TEST_P(PipelineIntegrationTest, MediaSource_ConfigChange_Encrypted_WebM) { MockMediaSource source("bear-320x240-16x9-aspect-av_enc-av.webm", kWebM, - kAppendWholeFile); + kAppendWholeFile, GetParam()); FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); StartPipelineWithEncryptedMedia(&source, &encrypted_media); @@ -677,10 +692,10 @@ TEST_F(PipelineIntegrationTest, MediaSource_ConfigChange_Encrypted_WebM) { } // Config changes from encrypted to clear are not currently supported. -TEST_F(PipelineIntegrationTest, +TEST_P(PipelineIntegrationTest, MediaSource_ConfigChange_ClearThenEncrypted_WebM) { MockMediaSource source("bear-320x240-16x9-aspect.webm", kWebM, - kAppendWholeFile); + kAppendWholeFile, GetParam()); FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); StartPipelineWithEncryptedMedia(&source, &encrypted_media); @@ -708,10 +723,10 @@ TEST_F(PipelineIntegrationTest, } // Config changes from clear to encrypted are not currently supported. -TEST_F(PipelineIntegrationTest, +TEST_P(PipelineIntegrationTest, MediaSource_ConfigChange_EncryptedThenClear_WebM) { MockMediaSource source("bear-320x240-16x9-aspect-av_enc-av.webm", kWebM, - kAppendWholeFile); + kAppendWholeFile, GetParam()); FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); StartPipelineWithEncryptedMedia(&source, &encrypted_media); @@ -739,8 +754,8 @@ TEST_F(PipelineIntegrationTest, } #if defined(USE_PROPRIETARY_CODECS) -TEST_F(PipelineIntegrationTest, MediaSource_ADTS) { - MockMediaSource source("sfx.adts", kADTS, kAppendWholeFile); +TEST_P(PipelineIntegrationTest, MediaSource_ADTS) { + MockMediaSource source("sfx.adts", kADTS, kAppendWholeFile, GetParam()); StartPipelineWithMediaSource(&source); source.EndOfStream(); @@ -753,8 +768,8 @@ TEST_F(PipelineIntegrationTest, MediaSource_ADTS) { EXPECT_TRUE(WaitUntilOnEnded()); } -TEST_F(PipelineIntegrationTest, MediaSource_ADTS_TimestampOffset) { - MockMediaSource source("sfx.adts", kADTS, kAppendWholeFile); +TEST_P(PipelineIntegrationTest, MediaSource_ADTS_TimestampOffset) { + MockMediaSource source("sfx.adts", kADTS, kAppendWholeFile, GetParam()); StartPipelineWithMediaSource(&source); EXPECT_EQ(325, source.last_timestamp_offset().InMilliseconds()); @@ -775,8 +790,8 @@ TEST_F(PipelineIntegrationTest, MediaSource_ADTS_TimestampOffset) { EXPECT_TRUE(WaitUntilOnEnded()); } -TEST_F(PipelineIntegrationTest, MediaSource_MP3) { - MockMediaSource source("sfx.mp3", kMP3, kAppendWholeFile); +TEST_P(PipelineIntegrationTest, MediaSource_MP3) { + MockMediaSource source("sfx.mp3", kMP3, kAppendWholeFile, GetParam()); StartPipelineWithMediaSource(&source); source.EndOfStream(); @@ -789,8 +804,8 @@ TEST_F(PipelineIntegrationTest, MediaSource_MP3) { EXPECT_TRUE(WaitUntilOnEnded()); } -TEST_F(PipelineIntegrationTest, MediaSource_MP3_TimestampOffset) { - MockMediaSource source("sfx.mp3", kMP3, kAppendWholeFile); +TEST_P(PipelineIntegrationTest, MediaSource_MP3_TimestampOffset) { + MockMediaSource source("sfx.mp3", kMP3, kAppendWholeFile, GetParam()); StartPipelineWithMediaSource(&source); EXPECT_EQ(339, source.last_timestamp_offset().InMilliseconds()); @@ -811,8 +826,8 @@ TEST_F(PipelineIntegrationTest, MediaSource_MP3_TimestampOffset) { EXPECT_TRUE(WaitUntilOnEnded()); } -TEST_F(PipelineIntegrationTest, MediaSource_MP3_Icecast) { - MockMediaSource source("icy_sfx.mp3", kMP3, kAppendWholeFile); +TEST_P(PipelineIntegrationTest, MediaSource_MP3_Icecast) { + MockMediaSource source("icy_sfx.mp3", kMP3, kAppendWholeFile, GetParam()); StartPipelineWithMediaSource(&source); source.EndOfStream(); @@ -821,8 +836,9 @@ TEST_F(PipelineIntegrationTest, MediaSource_MP3_Icecast) { EXPECT_TRUE(WaitUntilOnEnded()); } -TEST_F(PipelineIntegrationTest, MediaSource_ConfigChange_MP4) { - MockMediaSource source("bear-640x360-av_frag.mp4", kMP4, kAppendWholeFile); +TEST_P(PipelineIntegrationTest, MediaSource_ConfigChange_MP4) { + MockMediaSource source("bear-640x360-av_frag.mp4", kMP4, kAppendWholeFile, + GetParam()); StartPipelineWithMediaSource(&source); scoped_refptr<DecoderBuffer> second_file = @@ -845,10 +861,10 @@ TEST_F(PipelineIntegrationTest, MediaSource_ConfigChange_MP4) { Stop(); } -TEST_F(PipelineIntegrationTest, +TEST_P(PipelineIntegrationTest, MediaSource_ConfigChange_Encrypted_MP4_CENC_VideoOnly) { MockMediaSource source("bear-640x360-v_frag-cenc.mp4", - kMP4Video, kAppendWholeFile); + kMP4Video, kAppendWholeFile, GetParam()); FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); StartPipelineWithEncryptedMedia(&source, &encrypted_media); @@ -874,10 +890,10 @@ TEST_F(PipelineIntegrationTest, // Config changes from clear to encrypted are not currently supported. // TODO(ddorwin): Figure out why this CHECKs in AppendAtTime(). -TEST_F(PipelineIntegrationTest, +TEST_P(PipelineIntegrationTest, DISABLED_MediaSource_ConfigChange_ClearThenEncrypted_MP4_CENC) { MockMediaSource source("bear-640x360-av_frag.mp4", kMP4Video, - kAppendWholeFile); + kAppendWholeFile, GetParam()); FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); StartPipelineWithEncryptedMedia(&source, &encrypted_media); @@ -905,10 +921,10 @@ TEST_F(PipelineIntegrationTest, } // Config changes from encrypted to clear are not currently supported. -TEST_F(PipelineIntegrationTest, +TEST_P(PipelineIntegrationTest, MediaSource_ConfigChange_EncryptedThenClear_MP4_CENC) { MockMediaSource source("bear-640x360-v_frag-cenc.mp4", - kMP4Video, kAppendWholeFile); + kMP4Video, kAppendWholeFile, GetParam()); FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); StartPipelineWithEncryptedMedia(&source, &encrypted_media); @@ -949,8 +965,9 @@ TEST_F(PipelineIntegrationTest, BasicPlayback_16x9AspectRatio) { ASSERT_TRUE(WaitUntilOnEnded()); } -TEST_F(PipelineIntegrationTest, EncryptedPlayback_WebM) { - MockMediaSource source("bear-320x240-av_enc-av.webm", kWebM, 219816); +TEST_P(PipelineIntegrationTest, EncryptedPlayback_WebM) { + MockMediaSource source("bear-320x240-av_enc-av.webm", kWebM, 219816, + GetParam()); FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); StartPipelineWithEncryptedMedia(&source, &encrypted_media); @@ -964,9 +981,9 @@ TEST_F(PipelineIntegrationTest, EncryptedPlayback_WebM) { Stop(); } -TEST_F(PipelineIntegrationTest, EncryptedPlayback_ClearStart_WebM) { +TEST_P(PipelineIntegrationTest, EncryptedPlayback_ClearStart_WebM) { MockMediaSource source("bear-320x240-av_enc-av_clear-1s.webm", - kWebM, kAppendWholeFile); + kWebM, kAppendWholeFile, GetParam()); FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); StartPipelineWithEncryptedMedia(&source, &encrypted_media); @@ -980,9 +997,9 @@ TEST_F(PipelineIntegrationTest, EncryptedPlayback_ClearStart_WebM) { Stop(); } -TEST_F(PipelineIntegrationTest, EncryptedPlayback_NoEncryptedFrames_WebM) { +TEST_P(PipelineIntegrationTest, EncryptedPlayback_NoEncryptedFrames_WebM) { MockMediaSource source("bear-320x240-av_enc-av_clear-all.webm", - kWebM, kAppendWholeFile); + kWebM, kAppendWholeFile, GetParam()); FakeEncryptedMedia encrypted_media(new NoResponseApp()); StartPipelineWithEncryptedMedia(&source, &encrypted_media); @@ -997,9 +1014,9 @@ TEST_F(PipelineIntegrationTest, EncryptedPlayback_NoEncryptedFrames_WebM) { } #if defined(USE_PROPRIETARY_CODECS) -TEST_F(PipelineIntegrationTest, EncryptedPlayback_MP4_CENC_VideoOnly) { +TEST_P(PipelineIntegrationTest, EncryptedPlayback_MP4_CENC_VideoOnly) { MockMediaSource source("bear-1280x720-v_frag-cenc.mp4", - kMP4Video, kAppendWholeFile); + kMP4Video, kAppendWholeFile, GetParam()); FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); StartPipelineWithEncryptedMedia(&source, &encrypted_media); @@ -1013,9 +1030,9 @@ TEST_F(PipelineIntegrationTest, EncryptedPlayback_MP4_CENC_VideoOnly) { Stop(); } -TEST_F(PipelineIntegrationTest, EncryptedPlayback_MP4_CENC_AudioOnly) { +TEST_P(PipelineIntegrationTest, EncryptedPlayback_MP4_CENC_AudioOnly) { MockMediaSource source("bear-1280x720-a_frag-cenc.mp4", - kMP4Audio, kAppendWholeFile); + kMP4Audio, kAppendWholeFile, GetParam()); FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); StartPipelineWithEncryptedMedia(&source, &encrypted_media); @@ -1029,10 +1046,10 @@ TEST_F(PipelineIntegrationTest, EncryptedPlayback_MP4_CENC_AudioOnly) { Stop(); } -TEST_F(PipelineIntegrationTest, +TEST_P(PipelineIntegrationTest, EncryptedPlayback_NoEncryptedFrames_MP4_CENC_VideoOnly) { MockMediaSource source("bear-1280x720-v_frag-cenc_clear-all.mp4", - kMP4Video, kAppendWholeFile); + kMP4Video, kAppendWholeFile, GetParam()); FakeEncryptedMedia encrypted_media(new NoResponseApp()); StartPipelineWithEncryptedMedia(&source, &encrypted_media); @@ -1046,10 +1063,10 @@ TEST_F(PipelineIntegrationTest, Stop(); } -TEST_F(PipelineIntegrationTest, +TEST_P(PipelineIntegrationTest, EncryptedPlayback_NoEncryptedFrames_MP4_CENC_AudioOnly) { MockMediaSource source("bear-1280x720-a_frag-cenc_clear-all.mp4", - kMP4Audio, kAppendWholeFile); + kMP4Audio, kAppendWholeFile, GetParam()); FakeEncryptedMedia encrypted_media(new NoResponseApp()); StartPipelineWithEncryptedMedia(&source, &encrypted_media); @@ -1063,9 +1080,9 @@ TEST_F(PipelineIntegrationTest, Stop(); } -TEST_F(PipelineIntegrationTest, BasicPlayback_MediaSource_VideoOnly_MP4_AVC3) { +TEST_P(PipelineIntegrationTest, BasicPlayback_MediaSource_VideoOnly_MP4_AVC3) { MockMediaSource source("bear-1280x720-v_frag-avc3.mp4", kMP4VideoAVC3, - kAppendWholeFile); + kAppendWholeFile, GetParam()); StartPipelineWithMediaSource(&source); source.EndOfStream(); @@ -1128,7 +1145,7 @@ TEST_F(PipelineIntegrationTest, DISABLED_SeekWhilePlaying) { } // Verify audio decoder & renderer can handle aborted demuxer reads. -TEST_F(PipelineIntegrationTest, ChunkDemuxerAbortRead_AudioOnly) { +TEST_P(PipelineIntegrationTest, ChunkDemuxerAbortRead_AudioOnly) { ASSERT_TRUE(TestSeekDuringRead("bear-320x240-audio-only.webm", kAudioOnlyWebM, 8192, base::TimeDelta::FromMilliseconds(464), @@ -1137,7 +1154,7 @@ TEST_F(PipelineIntegrationTest, ChunkDemuxerAbortRead_AudioOnly) { } // Verify video decoder & renderer can handle aborted demuxer reads. -TEST_F(PipelineIntegrationTest, ChunkDemuxerAbortRead_VideoOnly) { +TEST_P(PipelineIntegrationTest, ChunkDemuxerAbortRead_VideoOnly) { ASSERT_TRUE(TestSeekDuringRead("bear-320x240-video-only.webm", kVideoOnlyWebM, 32768, base::TimeDelta::FromMilliseconds(167), @@ -1149,10 +1166,6 @@ TEST_F(PipelineIntegrationTest, ChunkDemuxerAbortRead_VideoOnly) { TEST_F(PipelineIntegrationTest, BasicPlayback_AudioOnly_Opus_WebM) { ASSERT_TRUE(Start(GetTestDataFilePath("bear-opus-end-trimming.webm"), PIPELINE_OK)); - EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); - EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); - EXPECT_EQ(kOpusEndTrimmingWebMFileDurationMs, - pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); Play(); ASSERT_TRUE(WaitUntilOnEnded()); } @@ -1203,4 +1216,9 @@ TEST_F(PipelineIntegrationTest, ASSERT_TRUE(WaitUntilOnEnded()); } +// TODO(wolenetz): Enable MSE testing of new frame processor based on this flag, +// once the new processor has landed. See http://crbug.com/249422. +INSTANTIATE_TEST_CASE_P(LegacyFrameProcessor, PipelineIntegrationTest, + Values(true)); + } // namespace media diff --git a/media/filters/skcanvas_video_renderer.cc b/media/filters/skcanvas_video_renderer.cc index ec3e92fe75..9781b4c497 100644 --- a/media/filters/skcanvas_video_renderer.cc +++ b/media/filters/skcanvas_video_renderer.cc @@ -12,26 +12,23 @@ namespace media { -static bool IsEitherYV12OrYV16(media::VideoFrame::Format format) { +static bool IsYUV(media::VideoFrame::Format format) { return format == media::VideoFrame::YV12 || + format == media::VideoFrame::I420 || format == media::VideoFrame::YV16 || format == media::VideoFrame::YV12J; } -static bool IsEitherYV12OrYV16OrNative(media::VideoFrame::Format format) { - return IsEitherYV12OrYV16(format) || - format == media::VideoFrame::NATIVE_TEXTURE; +static bool IsEitherYUVOrNative(media::VideoFrame::Format format) { + return IsYUV(format) || format == media::VideoFrame::NATIVE_TEXTURE; } -static bool IsEitherYV12OrYV12AOrYV16(media::VideoFrame::Format format) { - return IsEitherYV12OrYV16(format) || - format == media::VideoFrame::YV12A; +static bool IsEitherYUVOrYUVA(media::VideoFrame::Format format) { + return IsYUV(format) || format == media::VideoFrame::YV12A; } -static bool IsEitherYV12OrYV12AOrYV16OrNative( - media::VideoFrame::Format format) { - return IsEitherYV12OrYV16OrNative(format) || - format == media::VideoFrame::YV12A; +static bool IsEitherYUVOrYUVAOrNative(media::VideoFrame::Format format) { + return IsEitherYUVOrNative(format) || format == media::VideoFrame::YV12A; } // CanFastPaint is a helper method to determine the conditions for fast @@ -40,13 +37,13 @@ static bool IsEitherYV12OrYV12AOrYV16OrNative( // 2. No flipping nor mirroring. // 3. Canvas has pixel format ARGB8888. // 4. Canvas is opaque. -// 5. Frame format is YV12 or YV16. +// 5. Frame format is YV12, I420 or YV16. // // TODO(hclam): The fast paint method should support flipping and mirroring. // Disable the flipping and mirroring checks once we have it. static bool CanFastPaint(SkCanvas* canvas, uint8 alpha, media::VideoFrame::Format format) { - if (alpha != 0xFF || !IsEitherYV12OrYV16(format)) + if (alpha != 0xFF || !IsYUV(format)) return false; const SkMatrix& total_matrix = canvas->getTotalMatrix(); @@ -76,7 +73,7 @@ static void FastPaint( const scoped_refptr<media::VideoFrame>& video_frame, SkCanvas* canvas, const SkRect& dest_rect) { - DCHECK(IsEitherYV12OrYV16(video_frame->format())) << video_frame->format(); + DCHECK(IsYUV(video_frame->format())) << video_frame->format(); DCHECK_EQ(video_frame->stride(media::VideoFrame::kUPlane), video_frame->stride(media::VideoFrame::kVPlane)); @@ -84,6 +81,7 @@ static void FastPaint( media::YUVType yuv_type = media::YV16; int y_shift = 0; if (video_frame->format() == media::VideoFrame::YV12 || + video_frame->format() == media::VideoFrame::I420 || video_frame->format() == media::VideoFrame::YV12A) { yuv_type = media::YV12; y_shift = 1; @@ -108,7 +106,10 @@ static void FastPaint( // No point painting if the destination rect doesn't intersect with the // clip rect. - if (!local_dest_irect.intersect(canvas->getTotalClip().getBounds())) + SkIRect device_bounds; + if (!canvas->getClipDeviceBounds(&device_bounds)) + return; + if (!local_dest_irect.intersect(device_bounds)) return; // At this point |local_dest_irect| contains the rect that we should draw @@ -189,9 +190,9 @@ static void FastPaint( static void ConvertVideoFrameToBitmap( const scoped_refptr<media::VideoFrame>& video_frame, SkBitmap* bitmap) { - DCHECK(IsEitherYV12OrYV12AOrYV16OrNative(video_frame->format())) + DCHECK(IsEitherYUVOrYUVAOrNative(video_frame->format())) << video_frame->format(); - if (IsEitherYV12OrYV12AOrYV16(video_frame->format())) { + if (IsEitherYUVOrYUVA(video_frame->format())) { DCHECK_EQ(video_frame->stride(media::VideoFrame::kUPlane), video_frame->stride(media::VideoFrame::kVPlane)); } @@ -211,7 +212,7 @@ static void ConvertVideoFrameToBitmap( size_t y_offset = 0; size_t uv_offset = 0; - if (IsEitherYV12OrYV12AOrYV16(video_frame->format())) { + if (IsEitherYUVOrYUVA(video_frame->format())) { int y_shift = (video_frame->format() == media::VideoFrame::YV16) ? 0 : 1; // Use the "left" and "top" of the destination rect to locate the offset // in Y, U and V planes. @@ -227,6 +228,7 @@ static void ConvertVideoFrameToBitmap( switch (video_frame->format()) { case media::VideoFrame::YV12: + case media::VideoFrame::I420: case media::VideoFrame::YV12J: media::ConvertYUVToRGB32( video_frame->data(media::VideoFrame::kYPlane) + y_offset, @@ -306,8 +308,7 @@ void SkCanvasVideoRenderer::Paint(media::VideoFrame* video_frame, // Paint black rectangle if there isn't a frame available or the // frame has an unexpected format. - if (!video_frame || - !IsEitherYV12OrYV12AOrYV16OrNative(video_frame->format())) { + if (!video_frame || !IsEitherYUVOrYUVAOrNative(video_frame->format())) { canvas->drawRect(dest, paint); return; } @@ -320,9 +321,9 @@ void SkCanvasVideoRenderer::Paint(media::VideoFrame* video_frame, // Check if we should convert and update |last_frame_|. if (last_frame_.isNull() || - video_frame->GetTimestamp() != last_frame_timestamp_) { + video_frame->timestamp() != last_frame_timestamp_) { ConvertVideoFrameToBitmap(video_frame, &last_frame_); - last_frame_timestamp_ = video_frame->GetTimestamp(); + last_frame_timestamp_ = video_frame->timestamp(); } // Do a slower paint using |last_frame_|. diff --git a/media/filters/skcanvas_video_renderer_unittest.cc b/media/filters/skcanvas_video_renderer_unittest.cc index 842a8f7003..73d850137c 100644 --- a/media/filters/skcanvas_video_renderer_unittest.cc +++ b/media/filters/skcanvas_video_renderer_unittest.cc @@ -103,9 +103,9 @@ SkCanvasVideoRendererTest::SkCanvasVideoRendererTest() fast_path_canvas_(AllocBitmap(kWidth, kHeight, true)), slow_path_canvas_(AllocBitmap(kWidth, kHeight, false)) { // Give each frame a unique timestamp. - natural_frame_->SetTimestamp(base::TimeDelta::FromMilliseconds(1)); - larger_frame_->SetTimestamp(base::TimeDelta::FromMilliseconds(2)); - smaller_frame_->SetTimestamp(base::TimeDelta::FromMilliseconds(3)); + natural_frame_->set_timestamp(base::TimeDelta::FromMilliseconds(1)); + larger_frame_->set_timestamp(base::TimeDelta::FromMilliseconds(2)); + smaller_frame_->set_timestamp(base::TimeDelta::FromMilliseconds(3)); // Make sure the cropped video frame's aspect ratio matches the output device. // Update cropped_frame_'s crop dimensions if this is not the case. @@ -271,14 +271,14 @@ TEST_F(SkCanvasVideoRendererTest, SlowPaint_Smaller) { TEST_F(SkCanvasVideoRendererTest, FastPaint_NoTimestamp) { VideoFrame* video_frame = natural_frame(); - video_frame->SetTimestamp(media::kNoTimestamp()); + video_frame->set_timestamp(media::kNoTimestamp()); Paint(video_frame, fast_path_canvas(), kRed); EXPECT_EQ(SK_ColorRED, GetColor(fast_path_canvas())); } TEST_F(SkCanvasVideoRendererTest, SlowPaint_NoTimestamp) { VideoFrame* video_frame = natural_frame(); - video_frame->SetTimestamp(media::kNoTimestamp()); + video_frame->set_timestamp(media::kNoTimestamp()); Paint(video_frame, slow_path_canvas(), kRed); EXPECT_EQ(SK_ColorRED, GetColor(slow_path_canvas())); } diff --git a/media/filters/video_renderer_impl.cc b/media/filters/video_renderer_impl.cc index 3b9851ff6f..93deb573de 100644 --- a/media/filters/video_renderer_impl.cc +++ b/media/filters/video_renderer_impl.cc @@ -294,8 +294,8 @@ void VideoRendererImpl::ThreadMain() { // the accuracy of our frame timing code. http://crbug.com/149829 if (drop_frames_ && last_timestamp_ != kNoTimestamp()) { base::TimeDelta now = get_time_cb_.Run(); - base::TimeDelta deadline = ready_frames_.front()->GetTimestamp() + - (ready_frames_.front()->GetTimestamp() - last_timestamp_) / 2; + base::TimeDelta deadline = ready_frames_.front()->timestamp() + + (ready_frames_.front()->timestamp() - last_timestamp_) / 2; if (now > deadline) { DropNextReadyFrame_Locked(); @@ -318,7 +318,7 @@ void VideoRendererImpl::PaintNextReadyFrame_Locked() { ready_frames_.pop_front(); frames_decoded_++; - last_timestamp_ = next_frame->GetTimestamp(); + last_timestamp_ = next_frame->timestamp(); paint_cb_.Run(next_frame); @@ -332,7 +332,7 @@ void VideoRendererImpl::DropNextReadyFrame_Locked() { lock_.AssertAcquired(); - last_timestamp_ = ready_frames_.front()->GetTimestamp(); + last_timestamp_ = ready_frames_.front()->timestamp(); ready_frames_.pop_front(); frames_decoded_++; frames_dropped_++; @@ -396,7 +396,7 @@ void VideoRendererImpl::FrameReady(VideoFrameStream::Status status, // Maintain the latest frame decoded so the correct frame is displayed after // prerolling has completed. if (state_ == kPrerolling && preroll_timestamp_ != kNoTimestamp() && - frame->GetTimestamp() <= preroll_timestamp_) { + frame->timestamp() <= preroll_timestamp_) { ready_frames_.clear(); } @@ -429,15 +429,15 @@ void VideoRendererImpl::AddReadyFrame_Locked( // frame rate. Another way for this to happen is for the container to state // a smaller duration than the largest packet timestamp. base::TimeDelta duration = get_duration_cb_.Run(); - if (frame->GetTimestamp() > duration) { - frame->SetTimestamp(duration); + if (frame->timestamp() > duration) { + frame->set_timestamp(duration); } ready_frames_.push_back(frame); DCHECK_LE(ready_frames_.size(), static_cast<size_t>(limits::kMaxVideoFrames)); - max_time_cb_.Run(frame->GetTimestamp()); + max_time_cb_.Run(frame->timestamp()); // Avoid needlessly waking up |thread_| unless playing. if (state_ == kPlaying) @@ -499,7 +499,7 @@ base::TimeDelta VideoRendererImpl::CalculateSleepDuration( float playback_rate) { // Determine the current and next presentation timestamps. base::TimeDelta now = get_time_cb_.Run(); - base::TimeDelta next_pts = next_frame->GetTimestamp(); + base::TimeDelta next_pts = next_frame->timestamp(); // Scale our sleep based on the playback rate. base::TimeDelta sleep = next_pts - now; diff --git a/media/filters/video_renderer_impl_unittest.cc b/media/filters/video_renderer_impl_unittest.cc index 86fb17e188..f4cc46fd5e 100644 --- a/media/filters/video_renderer_impl_unittest.cc +++ b/media/filters/video_renderer_impl_unittest.cc @@ -235,7 +235,7 @@ class VideoRendererImplTest : public ::testing::Test { scoped_refptr<VideoFrame> frame = GetCurrentFrame(); if (!frame.get()) return -1; - return frame->GetTimestamp().InMilliseconds(); + return frame->timestamp().InMilliseconds(); } void WaitForError(PipelineStatus expected) { diff --git a/media/filters/vpx_video_decoder.cc b/media/filters/vpx_video_decoder.cc index 69d137b94e..286629d822 100644 --- a/media/filters/vpx_video_decoder.cc +++ b/media/filters/vpx_video_decoder.cc @@ -444,7 +444,7 @@ bool VpxVideoDecoder::VpxDecode(const scoped_refptr<DecoderBuffer>& buffer, } CopyVpxImageTo(vpx_image, vpx_image_alpha, video_frame); - (*video_frame)->SetTimestamp(base::TimeDelta::FromMicroseconds(timestamp)); + (*video_frame)->set_timestamp(base::TimeDelta::FromMicroseconds(timestamp)); return true; } diff --git a/media/formats/mp2t/es_parser_adts.cc b/media/formats/mp2t/es_parser_adts.cc index 2154c9e24a..84ddf785ae 100644 --- a/media/formats/mp2t/es_parser_adts.cc +++ b/media/formats/mp2t/es_parser_adts.cc @@ -227,12 +227,26 @@ bool EsParserAdts::UpdateAudioConfiguration(const uint8* adts_header) { ? std::min(2 * samples_per_second, 48000) : samples_per_second; + // The following code is written according to ISO 14496 Part 3 Table 1.13 - + // Syntax of AudioSpecificConfig. + uint16 extra_data_int = + // Note: adts_profile is in the range [0,3], since the ADTS header only + // allows two bits for its value. + ((adts_profile + 1) << 11) + + (frequency_index << 7) + + (channel_configuration << 3); + uint8 extra_data[2] = { + static_cast<uint8>(extra_data_int >> 8), + static_cast<uint8>(extra_data_int & 0xff) + }; + AudioDecoderConfig audio_decoder_config( kCodecAAC, kSampleFormatS16, kADTSChannelLayoutTable[channel_configuration], extended_samples_per_second, - NULL, 0, + extra_data, + arraysize(extra_data), false); if (!audio_decoder_config.Matches(last_audio_decoder_config_)) { diff --git a/media/formats/webm/webm_constants.h b/media/formats/webm/webm_constants.h index 6803bf7e0a..8a0b8a7185 100644 --- a/media/formats/webm/webm_constants.h +++ b/media/formats/webm/webm_constants.h @@ -201,7 +201,7 @@ const int kWebMIdVoid = 0xEC; const int kWebMIdWritingApp = 0x5741; const int64 kWebMReservedId = 0x1FFFFFFF; -const int64 kWebMUnknownSize = GG_LONGLONG(0x00FFFFFFFFFFFFFF); +const int64 kWebMUnknownSize = 0x00FFFFFFFFFFFFFFLL; const uint8 kWebMFlagKeyframe = 0x80; diff --git a/media/media.gyp b/media/media.gyp index 856c751705..3b0366473a 100644 --- a/media/media.gyp +++ b/media/media.gyp @@ -52,6 +52,7 @@ 'type': '<(component)', 'dependencies': [ '../base/base.gyp:base', + '../base/base.gyp:base_i18n', '../base/third_party/dynamic_annotations/dynamic_annotations.gyp:dynamic_annotations', '../crypto/crypto.gyp:crypto', '../gpu/gpu.gyp:command_buffer_common', @@ -1250,8 +1251,6 @@ 'base/gmock_callback_support.h', 'base/mock_audio_renderer_sink.cc', 'base/mock_audio_renderer_sink.h', - 'base/mock_data_source_host.cc', - 'base/mock_data_source_host.h', 'base/mock_demuxer_host.cc', 'base/mock_demuxer_host.h', 'base/mock_filters.cc', diff --git a/media/media.target.darwin-arm.mk b/media/media.target.darwin-arm.mk index c3fe009461..e041db4e37 100644 --- a/media/media.target.darwin-arm.mk +++ b/media/media.target.darwin-arm.mk @@ -6,15 +6,16 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_media_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := \ - $(call intermediates-dir-for,GYP,skia_skia_gyp)/skia.stamp \ - $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp)/skia_skia_library_gyp.a \ - $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp)/media_android_jni_headers.stamp \ - $(call intermediates-dir-for,GYP,media_video_capture_android_jni_headers_gyp)/video_capture_android_jni_headers.stamp + $(call intermediates-dir-for,GYP,skia_skia_gyp,,,$(GYP_VAR_PREFIX))/skia.stamp \ + $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp,,,$(GYP_VAR_PREFIX))/skia_skia_library_gyp.a \ + $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp,,,$(GYP_VAR_PREFIX))/media_android_jni_headers.stamp \ + $(call intermediates-dir-for,GYP,media_video_capture_android_jni_headers_gyp,,,$(GYP_VAR_PREFIX))/video_capture_android_jni_headers.stamp GYP_GENERATED_OUTPUTS := @@ -267,15 +268,14 @@ MY_DEFS_Debug := \ '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_SUPPORT_LEGACY_LAYERRASTERIZER_API=1' \ '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETCLIPTYPE' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ + '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -293,8 +293,8 @@ MY_DEFS_Debug := \ # Include paths placed before CFLAGS/CPPFLAGS LOCAL_C_INCLUDES_Debug := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ + $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ $(LOCAL_PATH) \ $(LOCAL_PATH)/third_party/khronos \ @@ -391,15 +391,14 @@ MY_DEFS_Release := \ '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_SUPPORT_LEGACY_LAYERRASTERIZER_API=1' \ '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETCLIPTYPE' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ + '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -418,8 +417,8 @@ MY_DEFS_Release := \ # Include paths placed before CFLAGS/CPPFLAGS LOCAL_C_INCLUDES_Release := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ + $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ $(LOCAL_PATH) \ $(LOCAL_PATH)/third_party/khronos \ @@ -463,9 +462,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -Wl,-z,relro \ @@ -482,9 +481,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -Wl,-z,relro \ diff --git a/media/media.target.darwin-mips.mk b/media/media.target.darwin-mips.mk index 85c3162f1b..2f5c7d4d0f 100644 --- a/media/media.target.darwin-mips.mk +++ b/media/media.target.darwin-mips.mk @@ -6,15 +6,16 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_media_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := \ - $(call intermediates-dir-for,GYP,skia_skia_gyp)/skia.stamp \ - $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp)/skia_skia_library_gyp.a \ - $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp)/media_android_jni_headers.stamp \ - $(call intermediates-dir-for,GYP,media_video_capture_android_jni_headers_gyp)/video_capture_android_jni_headers.stamp + $(call intermediates-dir-for,GYP,skia_skia_gyp,,,$(GYP_VAR_PREFIX))/skia.stamp \ + $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp,,,$(GYP_VAR_PREFIX))/skia_skia_library_gyp.a \ + $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp,,,$(GYP_VAR_PREFIX))/media_android_jni_headers.stamp \ + $(call intermediates-dir-for,GYP,media_video_capture_android_jni_headers_gyp,,,$(GYP_VAR_PREFIX))/video_capture_android_jni_headers.stamp GYP_GENERATED_OUTPUTS := @@ -266,15 +267,14 @@ MY_DEFS_Debug := \ '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_SUPPORT_LEGACY_LAYERRASTERIZER_API=1' \ '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETCLIPTYPE' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ + '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -292,8 +292,8 @@ MY_DEFS_Debug := \ # Include paths placed before CFLAGS/CPPFLAGS LOCAL_C_INCLUDES_Debug := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ + $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ $(LOCAL_PATH) \ $(LOCAL_PATH)/third_party/khronos \ @@ -389,15 +389,14 @@ MY_DEFS_Release := \ '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_SUPPORT_LEGACY_LAYERRASTERIZER_API=1' \ '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETCLIPTYPE' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ + '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -416,8 +415,8 @@ MY_DEFS_Release := \ # Include paths placed before CFLAGS/CPPFLAGS LOCAL_C_INCLUDES_Release := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ + $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ $(LOCAL_PATH) \ $(LOCAL_PATH)/third_party/khronos \ @@ -461,9 +460,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -EL \ @@ -478,9 +477,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -EL \ diff --git a/media/media.target.darwin-x86.mk b/media/media.target.darwin-x86.mk index 165fd57b8d..265ba6456c 100644 --- a/media/media.target.darwin-x86.mk +++ b/media/media.target.darwin-x86.mk @@ -6,15 +6,16 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_media_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := \ - $(call intermediates-dir-for,GYP,skia_skia_gyp)/skia.stamp \ - $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp)/skia_skia_library_gyp.a \ - $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp)/media_android_jni_headers.stamp \ - $(call intermediates-dir-for,GYP,media_video_capture_android_jni_headers_gyp)/video_capture_android_jni_headers.stamp + $(call intermediates-dir-for,GYP,skia_skia_gyp,,,$(GYP_VAR_PREFIX))/skia.stamp \ + $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp,,,$(GYP_VAR_PREFIX))/skia_skia_library_gyp.a \ + $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp,,,$(GYP_VAR_PREFIX))/media_android_jni_headers.stamp \ + $(call intermediates-dir-for,GYP,media_video_capture_android_jni_headers_gyp,,,$(GYP_VAR_PREFIX))/video_capture_android_jni_headers.stamp GYP_GENERATED_OUTPUTS := @@ -269,15 +270,14 @@ MY_DEFS_Debug := \ '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_SUPPORT_LEGACY_LAYERRASTERIZER_API=1' \ '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETCLIPTYPE' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ + '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -295,8 +295,8 @@ MY_DEFS_Debug := \ # Include paths placed before CFLAGS/CPPFLAGS LOCAL_C_INCLUDES_Debug := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ + $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ $(LOCAL_PATH) \ $(LOCAL_PATH)/third_party/khronos \ @@ -393,15 +393,14 @@ MY_DEFS_Release := \ '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_SUPPORT_LEGACY_LAYERRASTERIZER_API=1' \ '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETCLIPTYPE' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ + '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -420,8 +419,8 @@ MY_DEFS_Release := \ # Include paths placed before CFLAGS/CPPFLAGS LOCAL_C_INCLUDES_Release := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ + $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ $(LOCAL_PATH) \ $(LOCAL_PATH)/third_party/khronos \ @@ -464,9 +463,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ @@ -481,9 +480,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ diff --git a/media/media.target.darwin-x86_64.mk b/media/media.target.darwin-x86_64.mk index b092bb2801..ca8a98b265 100644 --- a/media/media.target.darwin-x86_64.mk +++ b/media/media.target.darwin-x86_64.mk @@ -6,15 +6,16 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_media_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := \ - $(call intermediates-dir-for,GYP,skia_skia_gyp)/skia.stamp \ - $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp)/skia_skia_library_gyp.a \ - $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp)/media_android_jni_headers.stamp \ - $(call intermediates-dir-for,GYP,media_video_capture_android_jni_headers_gyp)/video_capture_android_jni_headers.stamp + $(call intermediates-dir-for,GYP,skia_skia_gyp,,,$(GYP_VAR_PREFIX))/skia.stamp \ + $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp,,,$(GYP_VAR_PREFIX))/skia_skia_library_gyp.a \ + $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp,,,$(GYP_VAR_PREFIX))/media_android_jni_headers.stamp \ + $(call intermediates-dir-for,GYP,media_video_capture_android_jni_headers_gyp,,,$(GYP_VAR_PREFIX))/video_capture_android_jni_headers.stamp GYP_GENERATED_OUTPUTS := @@ -269,15 +270,14 @@ MY_DEFS_Debug := \ '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_SUPPORT_LEGACY_LAYERRASTERIZER_API=1' \ '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETCLIPTYPE' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ + '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -295,8 +295,8 @@ MY_DEFS_Debug := \ # Include paths placed before CFLAGS/CPPFLAGS LOCAL_C_INCLUDES_Debug := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ + $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ $(LOCAL_PATH) \ $(LOCAL_PATH)/third_party/khronos \ @@ -393,15 +393,14 @@ MY_DEFS_Release := \ '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_SUPPORT_LEGACY_LAYERRASTERIZER_API=1' \ '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETCLIPTYPE' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ + '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -420,8 +419,8 @@ MY_DEFS_Release := \ # Include paths placed before CFLAGS/CPPFLAGS LOCAL_C_INCLUDES_Release := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ + $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ $(LOCAL_PATH) \ $(LOCAL_PATH)/third_party/khronos \ @@ -464,9 +463,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ @@ -481,9 +480,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ diff --git a/media/media.target.linux-arm.mk b/media/media.target.linux-arm.mk index c3fe009461..e041db4e37 100644 --- a/media/media.target.linux-arm.mk +++ b/media/media.target.linux-arm.mk @@ -6,15 +6,16 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_media_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := \ - $(call intermediates-dir-for,GYP,skia_skia_gyp)/skia.stamp \ - $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp)/skia_skia_library_gyp.a \ - $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp)/media_android_jni_headers.stamp \ - $(call intermediates-dir-for,GYP,media_video_capture_android_jni_headers_gyp)/video_capture_android_jni_headers.stamp + $(call intermediates-dir-for,GYP,skia_skia_gyp,,,$(GYP_VAR_PREFIX))/skia.stamp \ + $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp,,,$(GYP_VAR_PREFIX))/skia_skia_library_gyp.a \ + $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp,,,$(GYP_VAR_PREFIX))/media_android_jni_headers.stamp \ + $(call intermediates-dir-for,GYP,media_video_capture_android_jni_headers_gyp,,,$(GYP_VAR_PREFIX))/video_capture_android_jni_headers.stamp GYP_GENERATED_OUTPUTS := @@ -267,15 +268,14 @@ MY_DEFS_Debug := \ '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_SUPPORT_LEGACY_LAYERRASTERIZER_API=1' \ '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETCLIPTYPE' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ + '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -293,8 +293,8 @@ MY_DEFS_Debug := \ # Include paths placed before CFLAGS/CPPFLAGS LOCAL_C_INCLUDES_Debug := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ + $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ $(LOCAL_PATH) \ $(LOCAL_PATH)/third_party/khronos \ @@ -391,15 +391,14 @@ MY_DEFS_Release := \ '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_SUPPORT_LEGACY_LAYERRASTERIZER_API=1' \ '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETCLIPTYPE' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ + '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -418,8 +417,8 @@ MY_DEFS_Release := \ # Include paths placed before CFLAGS/CPPFLAGS LOCAL_C_INCLUDES_Release := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ + $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ $(LOCAL_PATH) \ $(LOCAL_PATH)/third_party/khronos \ @@ -463,9 +462,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -Wl,-z,relro \ @@ -482,9 +481,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -Wl,-z,relro \ diff --git a/media/media.target.linux-mips.mk b/media/media.target.linux-mips.mk index 85c3162f1b..2f5c7d4d0f 100644 --- a/media/media.target.linux-mips.mk +++ b/media/media.target.linux-mips.mk @@ -6,15 +6,16 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_media_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := \ - $(call intermediates-dir-for,GYP,skia_skia_gyp)/skia.stamp \ - $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp)/skia_skia_library_gyp.a \ - $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp)/media_android_jni_headers.stamp \ - $(call intermediates-dir-for,GYP,media_video_capture_android_jni_headers_gyp)/video_capture_android_jni_headers.stamp + $(call intermediates-dir-for,GYP,skia_skia_gyp,,,$(GYP_VAR_PREFIX))/skia.stamp \ + $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp,,,$(GYP_VAR_PREFIX))/skia_skia_library_gyp.a \ + $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp,,,$(GYP_VAR_PREFIX))/media_android_jni_headers.stamp \ + $(call intermediates-dir-for,GYP,media_video_capture_android_jni_headers_gyp,,,$(GYP_VAR_PREFIX))/video_capture_android_jni_headers.stamp GYP_GENERATED_OUTPUTS := @@ -266,15 +267,14 @@ MY_DEFS_Debug := \ '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_SUPPORT_LEGACY_LAYERRASTERIZER_API=1' \ '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETCLIPTYPE' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ + '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -292,8 +292,8 @@ MY_DEFS_Debug := \ # Include paths placed before CFLAGS/CPPFLAGS LOCAL_C_INCLUDES_Debug := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ + $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ $(LOCAL_PATH) \ $(LOCAL_PATH)/third_party/khronos \ @@ -389,15 +389,14 @@ MY_DEFS_Release := \ '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_SUPPORT_LEGACY_LAYERRASTERIZER_API=1' \ '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETCLIPTYPE' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ + '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -416,8 +415,8 @@ MY_DEFS_Release := \ # Include paths placed before CFLAGS/CPPFLAGS LOCAL_C_INCLUDES_Release := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ + $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ $(LOCAL_PATH) \ $(LOCAL_PATH)/third_party/khronos \ @@ -461,9 +460,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -EL \ @@ -478,9 +477,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -EL \ diff --git a/media/media.target.linux-x86.mk b/media/media.target.linux-x86.mk index 165fd57b8d..265ba6456c 100644 --- a/media/media.target.linux-x86.mk +++ b/media/media.target.linux-x86.mk @@ -6,15 +6,16 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_media_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := \ - $(call intermediates-dir-for,GYP,skia_skia_gyp)/skia.stamp \ - $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp)/skia_skia_library_gyp.a \ - $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp)/media_android_jni_headers.stamp \ - $(call intermediates-dir-for,GYP,media_video_capture_android_jni_headers_gyp)/video_capture_android_jni_headers.stamp + $(call intermediates-dir-for,GYP,skia_skia_gyp,,,$(GYP_VAR_PREFIX))/skia.stamp \ + $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp,,,$(GYP_VAR_PREFIX))/skia_skia_library_gyp.a \ + $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp,,,$(GYP_VAR_PREFIX))/media_android_jni_headers.stamp \ + $(call intermediates-dir-for,GYP,media_video_capture_android_jni_headers_gyp,,,$(GYP_VAR_PREFIX))/video_capture_android_jni_headers.stamp GYP_GENERATED_OUTPUTS := @@ -269,15 +270,14 @@ MY_DEFS_Debug := \ '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_SUPPORT_LEGACY_LAYERRASTERIZER_API=1' \ '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETCLIPTYPE' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ + '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -295,8 +295,8 @@ MY_DEFS_Debug := \ # Include paths placed before CFLAGS/CPPFLAGS LOCAL_C_INCLUDES_Debug := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ + $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ $(LOCAL_PATH) \ $(LOCAL_PATH)/third_party/khronos \ @@ -393,15 +393,14 @@ MY_DEFS_Release := \ '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_SUPPORT_LEGACY_LAYERRASTERIZER_API=1' \ '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETCLIPTYPE' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ + '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -420,8 +419,8 @@ MY_DEFS_Release := \ # Include paths placed before CFLAGS/CPPFLAGS LOCAL_C_INCLUDES_Release := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ + $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ $(LOCAL_PATH) \ $(LOCAL_PATH)/third_party/khronos \ @@ -464,9 +463,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ @@ -481,9 +480,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ diff --git a/media/media.target.linux-x86_64.mk b/media/media.target.linux-x86_64.mk index b092bb2801..ca8a98b265 100644 --- a/media/media.target.linux-x86_64.mk +++ b/media/media.target.linux-x86_64.mk @@ -6,15 +6,16 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_media_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := \ - $(call intermediates-dir-for,GYP,skia_skia_gyp)/skia.stamp \ - $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp)/skia_skia_library_gyp.a \ - $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp)/media_android_jni_headers.stamp \ - $(call intermediates-dir-for,GYP,media_video_capture_android_jni_headers_gyp)/video_capture_android_jni_headers.stamp + $(call intermediates-dir-for,GYP,skia_skia_gyp,,,$(GYP_VAR_PREFIX))/skia.stamp \ + $(call intermediates-dir-for,STATIC_LIBRARIES,skia_skia_library_gyp,,,$(GYP_VAR_PREFIX))/skia_skia_library_gyp.a \ + $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp,,,$(GYP_VAR_PREFIX))/media_android_jni_headers.stamp \ + $(call intermediates-dir-for,GYP,media_video_capture_android_jni_headers_gyp,,,$(GYP_VAR_PREFIX))/video_capture_android_jni_headers.stamp GYP_GENERATED_OUTPUTS := @@ -269,15 +270,14 @@ MY_DEFS_Debug := \ '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_SUPPORT_LEGACY_LAYERRASTERIZER_API=1' \ '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETCLIPTYPE' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ + '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -295,8 +295,8 @@ MY_DEFS_Debug := \ # Include paths placed before CFLAGS/CPPFLAGS LOCAL_C_INCLUDES_Debug := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ + $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ $(LOCAL_PATH) \ $(LOCAL_PATH)/third_party/khronos \ @@ -393,15 +393,14 @@ MY_DEFS_Release := \ '-DSK_ENABLE_LEGACY_API_ALIASING=1' \ '-DSK_ATTR_DEPRECATED=SK_NOTHING_ARG1' \ '-DGR_GL_IGNORE_ES3_MSAA=0' \ - '-DSK_SUPPORT_LEGACY_LAYERRASTERIZER_API=1' \ '-DSK_WILL_NEVER_DRAW_PERSPECTIVE_TEXT' \ '-DSK_SUPPORT_LEGACY_PUBLICEFFECTCONSTRUCTORS=1' \ - '-DSK_SUPPORT_LEGACY_GETCLIPTYPE' \ '-DSK_SUPPORT_LEGACY_GETTOTALCLIP' \ '-DSK_SUPPORT_LEGACY_GETTOPDEVICE' \ '-DSK_BUILD_FOR_ANDROID' \ '-DSK_USE_POSIX_THREADS' \ '-DSK_DEFERRED_CANVAS_USES_FACTORIES=1' \ + '-DSK_IGNORE_FREETYPE_ROTATION_FIX' \ '-DU_USING_ICU_NAMESPACE=0' \ '-DUSE_OPENSSL=1' \ '-DUSE_OPENSSL_CERTS=1' \ @@ -420,8 +419,8 @@ MY_DEFS_Release := \ # Include paths placed before CFLAGS/CPPFLAGS LOCAL_C_INCLUDES_Release := \ - $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/icuuc/target \ + $(gyp_shared_intermediate_dir)/shim_headers/icui18n/target \ $(gyp_shared_intermediate_dir)/shim_headers/ashmem/target \ $(LOCAL_PATH) \ $(LOCAL_PATH)/third_party/khronos \ @@ -464,9 +463,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ @@ -481,9 +480,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ diff --git a/media/media_android_imageformat_list.target.darwin-arm.mk b/media/media_android_imageformat_list.target.darwin-arm.mk index 5c53380b4c..f3f98c837b 100644 --- a/media/media_android_imageformat_list.target.darwin-arm.mk +++ b/media/media_android_imageformat_list.target.darwin-arm.mk @@ -7,8 +7,9 @@ LOCAL_MODULE := media_media_android_imageformat_list_gyp LOCAL_MODULE_STEM := media_android_imageformat_list LOCAL_MODULE_SUFFIX := .stamp LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -23,10 +24,7 @@ $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java: ex $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/ImageFormat.template $(LOCAL_PATH)/build/android/gyp/util/build_utils.py $(LOCAL_PATH)/build/android/gyp/gcc_preprocess.py $(LOCAL_PATH)/media/video/capture/android/imageformat_list.h $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/templates/org/chromium/media; cd $(gyp_local_path)/media; python ../build/android/gyp/gcc_preprocess.py "--include-path=.." "--output=$(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java" "--template=base/android/java/src/org/chromium/media/ImageFormat.template" -.PHONY: media_media_android_imageformat_list_gyp_rule_trigger -media_media_android_imageformat_list_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java -### Finished generating for all rules GYP_GENERATED_OUTPUTS := \ $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java @@ -34,8 +32,7 @@ GYP_GENERATED_OUTPUTS := \ # Make sure our deps and generated files are built first. LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS) -LOCAL_GENERATED_SOURCES := \ - media_media_android_imageformat_list_gyp_rule_trigger +LOCAL_GENERATED_SOURCES := GYP_COPIED_SOURCE_ORIGIN_DIRS := @@ -226,6 +223,7 @@ media_android_imageformat_list: media_media_android_imageformat_list_gyp LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp LOCAL_UNINSTALLABLE_MODULE := true +LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_VAR_PREFIX) include $(BUILD_SYSTEM)/base_rules.mk @@ -233,3 +231,5 @@ $(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES) $(hide) echo "Gyp timestamp: $@" $(hide) mkdir -p $(dir $@) $(hide) touch $@ + +LOCAL_2ND_ARCH_VAR_PREFIX := diff --git a/media/media_android_imageformat_list.target.darwin-mips.mk b/media/media_android_imageformat_list.target.darwin-mips.mk index 07860c96cc..80bca0a22b 100644 --- a/media/media_android_imageformat_list.target.darwin-mips.mk +++ b/media/media_android_imageformat_list.target.darwin-mips.mk @@ -7,8 +7,9 @@ LOCAL_MODULE := media_media_android_imageformat_list_gyp LOCAL_MODULE_STEM := media_android_imageformat_list LOCAL_MODULE_SUFFIX := .stamp LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -23,10 +24,7 @@ $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java: ex $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/ImageFormat.template $(LOCAL_PATH)/build/android/gyp/util/build_utils.py $(LOCAL_PATH)/build/android/gyp/gcc_preprocess.py $(LOCAL_PATH)/media/video/capture/android/imageformat_list.h $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/templates/org/chromium/media; cd $(gyp_local_path)/media; python ../build/android/gyp/gcc_preprocess.py "--include-path=.." "--output=$(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java" "--template=base/android/java/src/org/chromium/media/ImageFormat.template" -.PHONY: media_media_android_imageformat_list_gyp_rule_trigger -media_media_android_imageformat_list_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java -### Finished generating for all rules GYP_GENERATED_OUTPUTS := \ $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java @@ -34,8 +32,7 @@ GYP_GENERATED_OUTPUTS := \ # Make sure our deps and generated files are built first. LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS) -LOCAL_GENERATED_SOURCES := \ - media_media_android_imageformat_list_gyp_rule_trigger +LOCAL_GENERATED_SOURCES := GYP_COPIED_SOURCE_ORIGIN_DIRS := @@ -224,6 +221,7 @@ media_android_imageformat_list: media_media_android_imageformat_list_gyp LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp LOCAL_UNINSTALLABLE_MODULE := true +LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_VAR_PREFIX) include $(BUILD_SYSTEM)/base_rules.mk @@ -231,3 +229,5 @@ $(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES) $(hide) echo "Gyp timestamp: $@" $(hide) mkdir -p $(dir $@) $(hide) touch $@ + +LOCAL_2ND_ARCH_VAR_PREFIX := diff --git a/media/media_android_imageformat_list.target.darwin-x86.mk b/media/media_android_imageformat_list.target.darwin-x86.mk index 9a058139a7..16ad927ccc 100644 --- a/media/media_android_imageformat_list.target.darwin-x86.mk +++ b/media/media_android_imageformat_list.target.darwin-x86.mk @@ -7,8 +7,9 @@ LOCAL_MODULE := media_media_android_imageformat_list_gyp LOCAL_MODULE_STEM := media_android_imageformat_list LOCAL_MODULE_SUFFIX := .stamp LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -23,10 +24,7 @@ $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java: ex $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/ImageFormat.template $(LOCAL_PATH)/build/android/gyp/util/build_utils.py $(LOCAL_PATH)/build/android/gyp/gcc_preprocess.py $(LOCAL_PATH)/media/video/capture/android/imageformat_list.h $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/templates/org/chromium/media; cd $(gyp_local_path)/media; python ../build/android/gyp/gcc_preprocess.py "--include-path=.." "--output=$(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java" "--template=base/android/java/src/org/chromium/media/ImageFormat.template" -.PHONY: media_media_android_imageformat_list_gyp_rule_trigger -media_media_android_imageformat_list_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java -### Finished generating for all rules GYP_GENERATED_OUTPUTS := \ $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java @@ -34,8 +32,7 @@ GYP_GENERATED_OUTPUTS := \ # Make sure our deps and generated files are built first. LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS) -LOCAL_GENERATED_SOURCES := \ - media_media_android_imageformat_list_gyp_rule_trigger +LOCAL_GENERATED_SOURCES := GYP_COPIED_SOURCE_ORIGIN_DIRS := @@ -226,6 +223,7 @@ media_android_imageformat_list: media_media_android_imageformat_list_gyp LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp LOCAL_UNINSTALLABLE_MODULE := true +LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_VAR_PREFIX) include $(BUILD_SYSTEM)/base_rules.mk @@ -233,3 +231,5 @@ $(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES) $(hide) echo "Gyp timestamp: $@" $(hide) mkdir -p $(dir $@) $(hide) touch $@ + +LOCAL_2ND_ARCH_VAR_PREFIX := diff --git a/media/media_android_imageformat_list.target.darwin-x86_64.mk b/media/media_android_imageformat_list.target.darwin-x86_64.mk index d2150180fa..d0dd777b2e 100644 --- a/media/media_android_imageformat_list.target.darwin-x86_64.mk +++ b/media/media_android_imageformat_list.target.darwin-x86_64.mk @@ -7,8 +7,9 @@ LOCAL_MODULE := media_media_android_imageformat_list_gyp LOCAL_MODULE_STEM := media_android_imageformat_list LOCAL_MODULE_SUFFIX := .stamp LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -23,10 +24,7 @@ $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java: ex $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/ImageFormat.template $(LOCAL_PATH)/build/android/gyp/util/build_utils.py $(LOCAL_PATH)/build/android/gyp/gcc_preprocess.py $(LOCAL_PATH)/media/video/capture/android/imageformat_list.h $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/templates/org/chromium/media; cd $(gyp_local_path)/media; python ../build/android/gyp/gcc_preprocess.py "--include-path=.." "--output=$(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java" "--template=base/android/java/src/org/chromium/media/ImageFormat.template" -.PHONY: media_media_android_imageformat_list_gyp_rule_trigger -media_media_android_imageformat_list_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java -### Finished generating for all rules GYP_GENERATED_OUTPUTS := \ $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java @@ -34,8 +32,7 @@ GYP_GENERATED_OUTPUTS := \ # Make sure our deps and generated files are built first. LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS) -LOCAL_GENERATED_SOURCES := \ - media_media_android_imageformat_list_gyp_rule_trigger +LOCAL_GENERATED_SOURCES := GYP_COPIED_SOURCE_ORIGIN_DIRS := @@ -226,6 +223,7 @@ media_android_imageformat_list: media_media_android_imageformat_list_gyp LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp LOCAL_UNINSTALLABLE_MODULE := true +LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_VAR_PREFIX) include $(BUILD_SYSTEM)/base_rules.mk @@ -233,3 +231,5 @@ $(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES) $(hide) echo "Gyp timestamp: $@" $(hide) mkdir -p $(dir $@) $(hide) touch $@ + +LOCAL_2ND_ARCH_VAR_PREFIX := diff --git a/media/media_android_imageformat_list.target.linux-arm.mk b/media/media_android_imageformat_list.target.linux-arm.mk index 5c53380b4c..f3f98c837b 100644 --- a/media/media_android_imageformat_list.target.linux-arm.mk +++ b/media/media_android_imageformat_list.target.linux-arm.mk @@ -7,8 +7,9 @@ LOCAL_MODULE := media_media_android_imageformat_list_gyp LOCAL_MODULE_STEM := media_android_imageformat_list LOCAL_MODULE_SUFFIX := .stamp LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -23,10 +24,7 @@ $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java: ex $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/ImageFormat.template $(LOCAL_PATH)/build/android/gyp/util/build_utils.py $(LOCAL_PATH)/build/android/gyp/gcc_preprocess.py $(LOCAL_PATH)/media/video/capture/android/imageformat_list.h $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/templates/org/chromium/media; cd $(gyp_local_path)/media; python ../build/android/gyp/gcc_preprocess.py "--include-path=.." "--output=$(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java" "--template=base/android/java/src/org/chromium/media/ImageFormat.template" -.PHONY: media_media_android_imageformat_list_gyp_rule_trigger -media_media_android_imageformat_list_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java -### Finished generating for all rules GYP_GENERATED_OUTPUTS := \ $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java @@ -34,8 +32,7 @@ GYP_GENERATED_OUTPUTS := \ # Make sure our deps and generated files are built first. LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS) -LOCAL_GENERATED_SOURCES := \ - media_media_android_imageformat_list_gyp_rule_trigger +LOCAL_GENERATED_SOURCES := GYP_COPIED_SOURCE_ORIGIN_DIRS := @@ -226,6 +223,7 @@ media_android_imageformat_list: media_media_android_imageformat_list_gyp LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp LOCAL_UNINSTALLABLE_MODULE := true +LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_VAR_PREFIX) include $(BUILD_SYSTEM)/base_rules.mk @@ -233,3 +231,5 @@ $(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES) $(hide) echo "Gyp timestamp: $@" $(hide) mkdir -p $(dir $@) $(hide) touch $@ + +LOCAL_2ND_ARCH_VAR_PREFIX := diff --git a/media/media_android_imageformat_list.target.linux-mips.mk b/media/media_android_imageformat_list.target.linux-mips.mk index 07860c96cc..80bca0a22b 100644 --- a/media/media_android_imageformat_list.target.linux-mips.mk +++ b/media/media_android_imageformat_list.target.linux-mips.mk @@ -7,8 +7,9 @@ LOCAL_MODULE := media_media_android_imageformat_list_gyp LOCAL_MODULE_STEM := media_android_imageformat_list LOCAL_MODULE_SUFFIX := .stamp LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -23,10 +24,7 @@ $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java: ex $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/ImageFormat.template $(LOCAL_PATH)/build/android/gyp/util/build_utils.py $(LOCAL_PATH)/build/android/gyp/gcc_preprocess.py $(LOCAL_PATH)/media/video/capture/android/imageformat_list.h $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/templates/org/chromium/media; cd $(gyp_local_path)/media; python ../build/android/gyp/gcc_preprocess.py "--include-path=.." "--output=$(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java" "--template=base/android/java/src/org/chromium/media/ImageFormat.template" -.PHONY: media_media_android_imageformat_list_gyp_rule_trigger -media_media_android_imageformat_list_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java -### Finished generating for all rules GYP_GENERATED_OUTPUTS := \ $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java @@ -34,8 +32,7 @@ GYP_GENERATED_OUTPUTS := \ # Make sure our deps and generated files are built first. LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS) -LOCAL_GENERATED_SOURCES := \ - media_media_android_imageformat_list_gyp_rule_trigger +LOCAL_GENERATED_SOURCES := GYP_COPIED_SOURCE_ORIGIN_DIRS := @@ -224,6 +221,7 @@ media_android_imageformat_list: media_media_android_imageformat_list_gyp LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp LOCAL_UNINSTALLABLE_MODULE := true +LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_VAR_PREFIX) include $(BUILD_SYSTEM)/base_rules.mk @@ -231,3 +229,5 @@ $(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES) $(hide) echo "Gyp timestamp: $@" $(hide) mkdir -p $(dir $@) $(hide) touch $@ + +LOCAL_2ND_ARCH_VAR_PREFIX := diff --git a/media/media_android_imageformat_list.target.linux-x86.mk b/media/media_android_imageformat_list.target.linux-x86.mk index 9a058139a7..16ad927ccc 100644 --- a/media/media_android_imageformat_list.target.linux-x86.mk +++ b/media/media_android_imageformat_list.target.linux-x86.mk @@ -7,8 +7,9 @@ LOCAL_MODULE := media_media_android_imageformat_list_gyp LOCAL_MODULE_STEM := media_android_imageformat_list LOCAL_MODULE_SUFFIX := .stamp LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -23,10 +24,7 @@ $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java: ex $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/ImageFormat.template $(LOCAL_PATH)/build/android/gyp/util/build_utils.py $(LOCAL_PATH)/build/android/gyp/gcc_preprocess.py $(LOCAL_PATH)/media/video/capture/android/imageformat_list.h $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/templates/org/chromium/media; cd $(gyp_local_path)/media; python ../build/android/gyp/gcc_preprocess.py "--include-path=.." "--output=$(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java" "--template=base/android/java/src/org/chromium/media/ImageFormat.template" -.PHONY: media_media_android_imageformat_list_gyp_rule_trigger -media_media_android_imageformat_list_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java -### Finished generating for all rules GYP_GENERATED_OUTPUTS := \ $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java @@ -34,8 +32,7 @@ GYP_GENERATED_OUTPUTS := \ # Make sure our deps and generated files are built first. LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS) -LOCAL_GENERATED_SOURCES := \ - media_media_android_imageformat_list_gyp_rule_trigger +LOCAL_GENERATED_SOURCES := GYP_COPIED_SOURCE_ORIGIN_DIRS := @@ -226,6 +223,7 @@ media_android_imageformat_list: media_media_android_imageformat_list_gyp LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp LOCAL_UNINSTALLABLE_MODULE := true +LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_VAR_PREFIX) include $(BUILD_SYSTEM)/base_rules.mk @@ -233,3 +231,5 @@ $(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES) $(hide) echo "Gyp timestamp: $@" $(hide) mkdir -p $(dir $@) $(hide) touch $@ + +LOCAL_2ND_ARCH_VAR_PREFIX := diff --git a/media/media_android_imageformat_list.target.linux-x86_64.mk b/media/media_android_imageformat_list.target.linux-x86_64.mk index d2150180fa..d0dd777b2e 100644 --- a/media/media_android_imageformat_list.target.linux-x86_64.mk +++ b/media/media_android_imageformat_list.target.linux-x86_64.mk @@ -7,8 +7,9 @@ LOCAL_MODULE := media_media_android_imageformat_list_gyp LOCAL_MODULE_STEM := media_android_imageformat_list LOCAL_MODULE_SUFFIX := .stamp LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -23,10 +24,7 @@ $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java: ex $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/ImageFormat.template $(LOCAL_PATH)/build/android/gyp/util/build_utils.py $(LOCAL_PATH)/build/android/gyp/gcc_preprocess.py $(LOCAL_PATH)/media/video/capture/android/imageformat_list.h $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/templates/org/chromium/media; cd $(gyp_local_path)/media; python ../build/android/gyp/gcc_preprocess.py "--include-path=.." "--output=$(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java" "--template=base/android/java/src/org/chromium/media/ImageFormat.template" -.PHONY: media_media_android_imageformat_list_gyp_rule_trigger -media_media_android_imageformat_list_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java -### Finished generating for all rules GYP_GENERATED_OUTPUTS := \ $(gyp_shared_intermediate_dir)/templates/org/chromium/media/ImageFormat.java @@ -34,8 +32,7 @@ GYP_GENERATED_OUTPUTS := \ # Make sure our deps and generated files are built first. LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS) -LOCAL_GENERATED_SOURCES := \ - media_media_android_imageformat_list_gyp_rule_trigger +LOCAL_GENERATED_SOURCES := GYP_COPIED_SOURCE_ORIGIN_DIRS := @@ -226,6 +223,7 @@ media_android_imageformat_list: media_media_android_imageformat_list_gyp LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp LOCAL_UNINSTALLABLE_MODULE := true +LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_VAR_PREFIX) include $(BUILD_SYSTEM)/base_rules.mk @@ -233,3 +231,5 @@ $(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES) $(hide) echo "Gyp timestamp: $@" $(hide) mkdir -p $(dir $@) $(hide) touch $@ + +LOCAL_2ND_ARCH_VAR_PREFIX := diff --git a/media/media_android_jni_headers.target.darwin-arm.mk b/media/media_android_jni_headers.target.darwin-arm.mk index cd7b6f7c39..bda76a5822 100644 --- a/media/media_android_jni_headers.target.darwin-arm.mk +++ b/media/media_android_jni_headers.target.darwin-arm.mk @@ -7,8 +7,9 @@ LOCAL_MODULE := media_media_android_jni_headers_gyp LOCAL_MODULE_STEM := media_android_jni_headers LOCAL_MODULE_SUFFIX := .stamp LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -23,8 +24,6 @@ $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/AudioManagerAndroid.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -33,8 +32,6 @@ $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: export PATH := $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/AudioRecordInput.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/AudioRecordInput.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -43,8 +40,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: export PATH := $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaCodecBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -53,8 +48,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: export PATH := $( $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaDrmBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -63,8 +56,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: export PATH := $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaPlayerBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaPlayerBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -73,8 +64,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaPlayerListener.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaPlayerListener.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -83,8 +72,6 @@ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/UsbMidiDeviceAndroid.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/UsbMidiDeviceAndroid.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -93,8 +80,6 @@ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: expo $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/UsbMidiDeviceFactoryAndroid.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/UsbMidiDeviceFactoryAndroid.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -103,10 +88,7 @@ $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: export $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/WebAudioMediaCodecBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/WebAudioMediaCodecBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h -### Finished generating for all rules GYP_GENERATED_OUTPUTS := \ $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h \ @@ -131,8 +113,7 @@ LOCAL_GENERATED_SOURCES := \ $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h \ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h \ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h \ - $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h \ - media_media_android_jni_headers_gyp_rule_trigger + $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h GYP_COPIED_SOURCE_ORIGIN_DIRS := @@ -323,6 +304,7 @@ media_android_jni_headers: media_media_android_jni_headers_gyp LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp LOCAL_UNINSTALLABLE_MODULE := true +LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_VAR_PREFIX) include $(BUILD_SYSTEM)/base_rules.mk @@ -330,3 +312,5 @@ $(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES) $(hide) echo "Gyp timestamp: $@" $(hide) mkdir -p $(dir $@) $(hide) touch $@ + +LOCAL_2ND_ARCH_VAR_PREFIX := diff --git a/media/media_android_jni_headers.target.darwin-mips.mk b/media/media_android_jni_headers.target.darwin-mips.mk index a304ed9e94..60b2080866 100644 --- a/media/media_android_jni_headers.target.darwin-mips.mk +++ b/media/media_android_jni_headers.target.darwin-mips.mk @@ -7,8 +7,9 @@ LOCAL_MODULE := media_media_android_jni_headers_gyp LOCAL_MODULE_STEM := media_android_jni_headers LOCAL_MODULE_SUFFIX := .stamp LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -23,8 +24,6 @@ $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/AudioManagerAndroid.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -33,8 +32,6 @@ $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: export PATH := $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/AudioRecordInput.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/AudioRecordInput.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -43,8 +40,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: export PATH := $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaCodecBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -53,8 +48,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: export PATH := $( $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaDrmBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -63,8 +56,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: export PATH := $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaPlayerBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaPlayerBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -73,8 +64,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaPlayerListener.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaPlayerListener.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -83,8 +72,6 @@ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/UsbMidiDeviceAndroid.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/UsbMidiDeviceAndroid.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -93,8 +80,6 @@ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: expo $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/UsbMidiDeviceFactoryAndroid.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/UsbMidiDeviceFactoryAndroid.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -103,10 +88,7 @@ $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: export $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/WebAudioMediaCodecBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/WebAudioMediaCodecBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h -### Finished generating for all rules GYP_GENERATED_OUTPUTS := \ $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h \ @@ -131,8 +113,7 @@ LOCAL_GENERATED_SOURCES := \ $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h \ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h \ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h \ - $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h \ - media_media_android_jni_headers_gyp_rule_trigger + $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h GYP_COPIED_SOURCE_ORIGIN_DIRS := @@ -321,6 +302,7 @@ media_android_jni_headers: media_media_android_jni_headers_gyp LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp LOCAL_UNINSTALLABLE_MODULE := true +LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_VAR_PREFIX) include $(BUILD_SYSTEM)/base_rules.mk @@ -328,3 +310,5 @@ $(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES) $(hide) echo "Gyp timestamp: $@" $(hide) mkdir -p $(dir $@) $(hide) touch $@ + +LOCAL_2ND_ARCH_VAR_PREFIX := diff --git a/media/media_android_jni_headers.target.darwin-x86.mk b/media/media_android_jni_headers.target.darwin-x86.mk index 9700e9a88c..f5df59e8dc 100644 --- a/media/media_android_jni_headers.target.darwin-x86.mk +++ b/media/media_android_jni_headers.target.darwin-x86.mk @@ -7,8 +7,9 @@ LOCAL_MODULE := media_media_android_jni_headers_gyp LOCAL_MODULE_STEM := media_android_jni_headers LOCAL_MODULE_SUFFIX := .stamp LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -23,8 +24,6 @@ $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/AudioManagerAndroid.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -33,8 +32,6 @@ $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: export PATH := $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/AudioRecordInput.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/AudioRecordInput.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -43,8 +40,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: export PATH := $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaCodecBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -53,8 +48,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: export PATH := $( $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaDrmBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -63,8 +56,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: export PATH := $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaPlayerBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaPlayerBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -73,8 +64,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaPlayerListener.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaPlayerListener.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -83,8 +72,6 @@ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/UsbMidiDeviceAndroid.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/UsbMidiDeviceAndroid.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -93,8 +80,6 @@ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: expo $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/UsbMidiDeviceFactoryAndroid.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/UsbMidiDeviceFactoryAndroid.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -103,10 +88,7 @@ $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: export $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/WebAudioMediaCodecBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/WebAudioMediaCodecBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h -### Finished generating for all rules GYP_GENERATED_OUTPUTS := \ $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h \ @@ -131,8 +113,7 @@ LOCAL_GENERATED_SOURCES := \ $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h \ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h \ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h \ - $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h \ - media_media_android_jni_headers_gyp_rule_trigger + $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h GYP_COPIED_SOURCE_ORIGIN_DIRS := @@ -323,6 +304,7 @@ media_android_jni_headers: media_media_android_jni_headers_gyp LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp LOCAL_UNINSTALLABLE_MODULE := true +LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_VAR_PREFIX) include $(BUILD_SYSTEM)/base_rules.mk @@ -330,3 +312,5 @@ $(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES) $(hide) echo "Gyp timestamp: $@" $(hide) mkdir -p $(dir $@) $(hide) touch $@ + +LOCAL_2ND_ARCH_VAR_PREFIX := diff --git a/media/media_android_jni_headers.target.darwin-x86_64.mk b/media/media_android_jni_headers.target.darwin-x86_64.mk index e8df99f7d6..c7f3373fcf 100644 --- a/media/media_android_jni_headers.target.darwin-x86_64.mk +++ b/media/media_android_jni_headers.target.darwin-x86_64.mk @@ -7,8 +7,9 @@ LOCAL_MODULE := media_media_android_jni_headers_gyp LOCAL_MODULE_STEM := media_android_jni_headers LOCAL_MODULE_SUFFIX := .stamp LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -23,8 +24,6 @@ $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/AudioManagerAndroid.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -33,8 +32,6 @@ $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: export PATH := $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/AudioRecordInput.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/AudioRecordInput.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -43,8 +40,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: export PATH := $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaCodecBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -53,8 +48,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: export PATH := $( $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaDrmBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -63,8 +56,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: export PATH := $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaPlayerBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaPlayerBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -73,8 +64,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaPlayerListener.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaPlayerListener.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -83,8 +72,6 @@ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/UsbMidiDeviceAndroid.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/UsbMidiDeviceAndroid.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -93,8 +80,6 @@ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: expo $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/UsbMidiDeviceFactoryAndroid.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/UsbMidiDeviceFactoryAndroid.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -103,10 +88,7 @@ $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: export $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/WebAudioMediaCodecBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/WebAudioMediaCodecBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h -### Finished generating for all rules GYP_GENERATED_OUTPUTS := \ $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h \ @@ -131,8 +113,7 @@ LOCAL_GENERATED_SOURCES := \ $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h \ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h \ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h \ - $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h \ - media_media_android_jni_headers_gyp_rule_trigger + $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h GYP_COPIED_SOURCE_ORIGIN_DIRS := @@ -323,6 +304,7 @@ media_android_jni_headers: media_media_android_jni_headers_gyp LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp LOCAL_UNINSTALLABLE_MODULE := true +LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_VAR_PREFIX) include $(BUILD_SYSTEM)/base_rules.mk @@ -330,3 +312,5 @@ $(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES) $(hide) echo "Gyp timestamp: $@" $(hide) mkdir -p $(dir $@) $(hide) touch $@ + +LOCAL_2ND_ARCH_VAR_PREFIX := diff --git a/media/media_android_jni_headers.target.linux-arm.mk b/media/media_android_jni_headers.target.linux-arm.mk index cd7b6f7c39..bda76a5822 100644 --- a/media/media_android_jni_headers.target.linux-arm.mk +++ b/media/media_android_jni_headers.target.linux-arm.mk @@ -7,8 +7,9 @@ LOCAL_MODULE := media_media_android_jni_headers_gyp LOCAL_MODULE_STEM := media_android_jni_headers LOCAL_MODULE_SUFFIX := .stamp LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -23,8 +24,6 @@ $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/AudioManagerAndroid.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -33,8 +32,6 @@ $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: export PATH := $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/AudioRecordInput.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/AudioRecordInput.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -43,8 +40,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: export PATH := $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaCodecBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -53,8 +48,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: export PATH := $( $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaDrmBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -63,8 +56,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: export PATH := $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaPlayerBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaPlayerBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -73,8 +64,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaPlayerListener.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaPlayerListener.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -83,8 +72,6 @@ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/UsbMidiDeviceAndroid.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/UsbMidiDeviceAndroid.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -93,8 +80,6 @@ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: expo $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/UsbMidiDeviceFactoryAndroid.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/UsbMidiDeviceFactoryAndroid.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -103,10 +88,7 @@ $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: export $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/WebAudioMediaCodecBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/WebAudioMediaCodecBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h -### Finished generating for all rules GYP_GENERATED_OUTPUTS := \ $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h \ @@ -131,8 +113,7 @@ LOCAL_GENERATED_SOURCES := \ $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h \ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h \ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h \ - $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h \ - media_media_android_jni_headers_gyp_rule_trigger + $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h GYP_COPIED_SOURCE_ORIGIN_DIRS := @@ -323,6 +304,7 @@ media_android_jni_headers: media_media_android_jni_headers_gyp LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp LOCAL_UNINSTALLABLE_MODULE := true +LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_VAR_PREFIX) include $(BUILD_SYSTEM)/base_rules.mk @@ -330,3 +312,5 @@ $(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES) $(hide) echo "Gyp timestamp: $@" $(hide) mkdir -p $(dir $@) $(hide) touch $@ + +LOCAL_2ND_ARCH_VAR_PREFIX := diff --git a/media/media_android_jni_headers.target.linux-mips.mk b/media/media_android_jni_headers.target.linux-mips.mk index a304ed9e94..60b2080866 100644 --- a/media/media_android_jni_headers.target.linux-mips.mk +++ b/media/media_android_jni_headers.target.linux-mips.mk @@ -7,8 +7,9 @@ LOCAL_MODULE := media_media_android_jni_headers_gyp LOCAL_MODULE_STEM := media_android_jni_headers LOCAL_MODULE_SUFFIX := .stamp LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -23,8 +24,6 @@ $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/AudioManagerAndroid.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -33,8 +32,6 @@ $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: export PATH := $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/AudioRecordInput.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/AudioRecordInput.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -43,8 +40,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: export PATH := $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaCodecBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -53,8 +48,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: export PATH := $( $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaDrmBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -63,8 +56,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: export PATH := $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaPlayerBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaPlayerBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -73,8 +64,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaPlayerListener.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaPlayerListener.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -83,8 +72,6 @@ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/UsbMidiDeviceAndroid.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/UsbMidiDeviceAndroid.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -93,8 +80,6 @@ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: expo $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/UsbMidiDeviceFactoryAndroid.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/UsbMidiDeviceFactoryAndroid.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -103,10 +88,7 @@ $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: export $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/WebAudioMediaCodecBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/WebAudioMediaCodecBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h -### Finished generating for all rules GYP_GENERATED_OUTPUTS := \ $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h \ @@ -131,8 +113,7 @@ LOCAL_GENERATED_SOURCES := \ $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h \ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h \ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h \ - $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h \ - media_media_android_jni_headers_gyp_rule_trigger + $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h GYP_COPIED_SOURCE_ORIGIN_DIRS := @@ -321,6 +302,7 @@ media_android_jni_headers: media_media_android_jni_headers_gyp LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp LOCAL_UNINSTALLABLE_MODULE := true +LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_VAR_PREFIX) include $(BUILD_SYSTEM)/base_rules.mk @@ -328,3 +310,5 @@ $(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES) $(hide) echo "Gyp timestamp: $@" $(hide) mkdir -p $(dir $@) $(hide) touch $@ + +LOCAL_2ND_ARCH_VAR_PREFIX := diff --git a/media/media_android_jni_headers.target.linux-x86.mk b/media/media_android_jni_headers.target.linux-x86.mk index 9700e9a88c..f5df59e8dc 100644 --- a/media/media_android_jni_headers.target.linux-x86.mk +++ b/media/media_android_jni_headers.target.linux-x86.mk @@ -7,8 +7,9 @@ LOCAL_MODULE := media_media_android_jni_headers_gyp LOCAL_MODULE_STEM := media_android_jni_headers LOCAL_MODULE_SUFFIX := .stamp LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -23,8 +24,6 @@ $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/AudioManagerAndroid.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -33,8 +32,6 @@ $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: export PATH := $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/AudioRecordInput.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/AudioRecordInput.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -43,8 +40,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: export PATH := $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaCodecBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -53,8 +48,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: export PATH := $( $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaDrmBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -63,8 +56,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: export PATH := $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaPlayerBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaPlayerBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -73,8 +64,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaPlayerListener.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaPlayerListener.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -83,8 +72,6 @@ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/UsbMidiDeviceAndroid.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/UsbMidiDeviceAndroid.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -93,8 +80,6 @@ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: expo $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/UsbMidiDeviceFactoryAndroid.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/UsbMidiDeviceFactoryAndroid.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -103,10 +88,7 @@ $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: export $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/WebAudioMediaCodecBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/WebAudioMediaCodecBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h -### Finished generating for all rules GYP_GENERATED_OUTPUTS := \ $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h \ @@ -131,8 +113,7 @@ LOCAL_GENERATED_SOURCES := \ $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h \ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h \ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h \ - $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h \ - media_media_android_jni_headers_gyp_rule_trigger + $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h GYP_COPIED_SOURCE_ORIGIN_DIRS := @@ -323,6 +304,7 @@ media_android_jni_headers: media_media_android_jni_headers_gyp LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp LOCAL_UNINSTALLABLE_MODULE := true +LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_VAR_PREFIX) include $(BUILD_SYSTEM)/base_rules.mk @@ -330,3 +312,5 @@ $(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES) $(hide) echo "Gyp timestamp: $@" $(hide) mkdir -p $(dir $@) $(hide) touch $@ + +LOCAL_2ND_ARCH_VAR_PREFIX := diff --git a/media/media_android_jni_headers.target.linux-x86_64.mk b/media/media_android_jni_headers.target.linux-x86_64.mk index e8df99f7d6..c7f3373fcf 100644 --- a/media/media_android_jni_headers.target.linux-x86_64.mk +++ b/media/media_android_jni_headers.target.linux-x86_64.mk @@ -7,8 +7,9 @@ LOCAL_MODULE := media_media_android_jni_headers_gyp LOCAL_MODULE_STEM := media_android_jni_headers LOCAL_MODULE_SUFFIX := .stamp LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -23,8 +24,6 @@ $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/AudioManagerAndroid.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -33,8 +32,6 @@ $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: export PATH := $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/AudioRecordInput.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/AudioRecordInput.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/AudioRecordInput_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -43,8 +40,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: export PATH := $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaCodecBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaCodecBridge_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -53,8 +48,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: export PATH := $( $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaDrmBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaDrmBridge_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -63,8 +56,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: export PATH := $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaPlayerBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaPlayerBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerBridge_jni.h $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -73,8 +64,6 @@ $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/MediaPlayerListener.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/MediaPlayerListener.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -83,8 +72,6 @@ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/UsbMidiDeviceAndroid.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/UsbMidiDeviceAndroid.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -93,8 +80,6 @@ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: expo $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/UsbMidiDeviceFactoryAndroid.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/UsbMidiDeviceFactoryAndroid.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -103,10 +88,7 @@ $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: export $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/WebAudioMediaCodecBridge.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/WebAudioMediaCodecBridge.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_media_android_jni_headers_gyp_rule_trigger -media_media_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h -### Finished generating for all rules GYP_GENERATED_OUTPUTS := \ $(gyp_shared_intermediate_dir)/media/jni/AudioManagerAndroid_jni.h \ @@ -131,8 +113,7 @@ LOCAL_GENERATED_SOURCES := \ $(gyp_shared_intermediate_dir)/media/jni/MediaPlayerListener_jni.h \ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceAndroid_jni.h \ $(gyp_shared_intermediate_dir)/media/jni/UsbMidiDeviceFactoryAndroid_jni.h \ - $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h \ - media_media_android_jni_headers_gyp_rule_trigger + $(gyp_shared_intermediate_dir)/media/jni/WebAudioMediaCodecBridge_jni.h GYP_COPIED_SOURCE_ORIGIN_DIRS := @@ -323,6 +304,7 @@ media_android_jni_headers: media_media_android_jni_headers_gyp LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp LOCAL_UNINSTALLABLE_MODULE := true +LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_VAR_PREFIX) include $(BUILD_SYSTEM)/base_rules.mk @@ -330,3 +312,5 @@ $(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES) $(hide) echo "Gyp timestamp: $@" $(hide) mkdir -p $(dir $@) $(hide) touch $@ + +LOCAL_2ND_ARCH_VAR_PREFIX := diff --git a/media/media_asm.target.darwin-x86.mk b/media/media_asm.target.darwin-x86.mk index f2ab8c76de..3f14a3dd91 100644 --- a/media/media_asm.target.darwin-x86.mk +++ b/media/media_asm.target.darwin-x86.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_media_asm_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := \ @@ -23,8 +24,6 @@ $(gyp_shared_intermediate_dir)/media/convert_rgb_to_yuv_ssse3.o: export PATH := $(gyp_shared_intermediate_dir)/media/convert_rgb_to_yuv_ssse3.o: $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -felf32 -m x86 -DARCH_X86_32 -DELF -o "$(gyp_shared_intermediate_dir)/media/convert_rgb_to_yuv_ssse3.o" base/simd/convert_rgb_to_yuv_ssse3.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/convert_rgb_to_yuv_ssse3.o $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_mmx.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_mmx.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -33,8 +32,6 @@ $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_mmx.o: export PATH := $( $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_mmx.o: $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -felf32 -m x86 -DARCH_X86_32 -DELF -o "$(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_mmx.o" base/simd/convert_yuv_to_rgb_mmx.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_mmx.o $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_sse.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_sse.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -43,8 +40,6 @@ $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_sse.o: export PATH := $( $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_sse.o: $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_sse.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -felf32 -m x86 -DARCH_X86_32 -DELF -o "$(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_sse.o" base/simd/convert_yuv_to_rgb_sse.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_sse.o $(gyp_shared_intermediate_dir)/media/convert_yuva_to_argb_mmx.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/convert_yuva_to_argb_mmx.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -53,8 +48,6 @@ $(gyp_shared_intermediate_dir)/media/convert_yuva_to_argb_mmx.o: export PATH := $(gyp_shared_intermediate_dir)/media/convert_yuva_to_argb_mmx.o: $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -felf32 -m x86 -DARCH_X86_32 -DELF -o "$(gyp_shared_intermediate_dir)/media/convert_yuva_to_argb_mmx.o" base/simd/convert_yuva_to_argb_mmx.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/convert_yuva_to_argb_mmx.o $(gyp_shared_intermediate_dir)/media/empty_register_state_mmx.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/empty_register_state_mmx.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -63,8 +56,6 @@ $(gyp_shared_intermediate_dir)/media/empty_register_state_mmx.o: export PATH := $(gyp_shared_intermediate_dir)/media/empty_register_state_mmx.o: $(LOCAL_PATH)/media/base/simd/empty_register_state_mmx.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -felf32 -m x86 -DARCH_X86_32 -DELF -o "$(gyp_shared_intermediate_dir)/media/empty_register_state_mmx.o" base/simd/empty_register_state_mmx.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/empty_register_state_mmx.o $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -73,8 +64,6 @@ $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx.o: export PATH $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx.o: $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -felf32 -m x86 -DARCH_X86_32 -DELF -o "$(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx.o" base/simd/linear_scale_yuv_to_rgb_mmx.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx.o $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_sse.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_sse.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -83,8 +72,6 @@ $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_sse.o: export PATH $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_sse.o: $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_sse.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -felf32 -m x86 -DARCH_X86_32 -DELF -o "$(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_sse.o" base/simd/linear_scale_yuv_to_rgb_sse.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_sse.o $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_mmx.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_mmx.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -93,8 +80,6 @@ $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_mmx.o: export PATH := $(su $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_mmx.o: $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -felf32 -m x86 -DARCH_X86_32 -DELF -o "$(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_mmx.o" base/simd/scale_yuv_to_rgb_mmx.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_mmx.o $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -103,10 +88,7 @@ $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o: export PATH := $(su $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o: $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_sse.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -felf32 -m x86 -DARCH_X86_32 -DELF -o "$(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o" base/simd/scale_yuv_to_rgb_sse.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o -### Finished generating for all rules GYP_GENERATED_OUTPUTS := \ $(gyp_shared_intermediate_dir)/media/convert_rgb_to_yuv_ssse3.o \ @@ -131,8 +113,7 @@ LOCAL_GENERATED_SOURCES := \ $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx.o \ $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_sse.o \ $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_mmx.o \ - $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o \ - media_media_asm_gyp_rule_trigger + $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o GYP_COPIED_SOURCE_ORIGIN_DIRS := @@ -315,9 +296,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ @@ -332,9 +313,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ diff --git a/media/media_asm.target.darwin-x86_64.mk b/media/media_asm.target.darwin-x86_64.mk index c6e92cc69c..1b8dc596a1 100644 --- a/media/media_asm.target.darwin-x86_64.mk +++ b/media/media_asm.target.darwin-x86_64.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_media_asm_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := \ @@ -23,8 +24,6 @@ $(gyp_shared_intermediate_dir)/media/convert_rgb_to_yuv_ssse3.o: export PATH := $(gyp_shared_intermediate_dir)/media/convert_rgb_to_yuv_ssse3.o: $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -DPIC -felf64 -m amd64 -DARCH_X86_64 -DARCH_X86_64 -DELF -DPIC -o "$(gyp_shared_intermediate_dir)/media/convert_rgb_to_yuv_ssse3.o" base/simd/convert_rgb_to_yuv_ssse3.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/convert_rgb_to_yuv_ssse3.o $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_mmx.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_mmx.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -33,8 +32,6 @@ $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_mmx.o: export PATH := $( $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_mmx.o: $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -DPIC -felf64 -m amd64 -DARCH_X86_64 -DARCH_X86_64 -DELF -DPIC -o "$(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_mmx.o" base/simd/convert_yuv_to_rgb_mmx.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_mmx.o $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_sse.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_sse.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -43,8 +40,6 @@ $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_sse.o: export PATH := $( $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_sse.o: $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_sse.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -DPIC -felf64 -m amd64 -DARCH_X86_64 -DARCH_X86_64 -DELF -DPIC -o "$(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_sse.o" base/simd/convert_yuv_to_rgb_sse.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_sse.o $(gyp_shared_intermediate_dir)/media/convert_yuva_to_argb_mmx.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/convert_yuva_to_argb_mmx.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -53,8 +48,6 @@ $(gyp_shared_intermediate_dir)/media/convert_yuva_to_argb_mmx.o: export PATH := $(gyp_shared_intermediate_dir)/media/convert_yuva_to_argb_mmx.o: $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -DPIC -felf64 -m amd64 -DARCH_X86_64 -DARCH_X86_64 -DELF -DPIC -o "$(gyp_shared_intermediate_dir)/media/convert_yuva_to_argb_mmx.o" base/simd/convert_yuva_to_argb_mmx.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/convert_yuva_to_argb_mmx.o $(gyp_shared_intermediate_dir)/media/empty_register_state_mmx.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/empty_register_state_mmx.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -63,8 +56,6 @@ $(gyp_shared_intermediate_dir)/media/empty_register_state_mmx.o: export PATH := $(gyp_shared_intermediate_dir)/media/empty_register_state_mmx.o: $(LOCAL_PATH)/media/base/simd/empty_register_state_mmx.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -DPIC -felf64 -m amd64 -DARCH_X86_64 -DARCH_X86_64 -DELF -DPIC -o "$(gyp_shared_intermediate_dir)/media/empty_register_state_mmx.o" base/simd/empty_register_state_mmx.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/empty_register_state_mmx.o $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -73,8 +64,6 @@ $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx.o: export PATH $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx.o: $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -DPIC -felf64 -m amd64 -DARCH_X86_64 -DARCH_X86_64 -DELF -DPIC -o "$(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx.o" base/simd/linear_scale_yuv_to_rgb_mmx.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx.o $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_sse.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_sse.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -83,8 +72,6 @@ $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_sse.o: export PATH $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_sse.o: $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_sse.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -DPIC -felf64 -m amd64 -DARCH_X86_64 -DARCH_X86_64 -DELF -DPIC -o "$(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_sse.o" base/simd/linear_scale_yuv_to_rgb_sse.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_sse.o $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_mmx.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_mmx.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -93,8 +80,6 @@ $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_mmx.o: export PATH := $(su $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_mmx.o: $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -DPIC -felf64 -m amd64 -DARCH_X86_64 -DARCH_X86_64 -DELF -DPIC -o "$(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_mmx.o" base/simd/scale_yuv_to_rgb_mmx.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_mmx.o $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -103,8 +88,6 @@ $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o: export PATH := $(su $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o: $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_sse.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -DPIC -felf64 -m amd64 -DARCH_X86_64 -DARCH_X86_64 -DELF -DPIC -o "$(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o" base/simd/scale_yuv_to_rgb_sse.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx_x64.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx_x64.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -113,8 +96,6 @@ $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx_x64.o: export P $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx_x64.o: $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx_x64.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -DPIC -felf64 -m amd64 -DARCH_X86_64 -DARCH_X86_64 -DELF -DPIC -o "$(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx_x64.o" base/simd/linear_scale_yuv_to_rgb_mmx_x64.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx_x64.o $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse2_x64.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse2_x64.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -123,10 +104,7 @@ $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse2_x64.o: export PATH := $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse2_x64.o: $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_sse2_x64.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -DPIC -felf64 -m amd64 -DARCH_X86_64 -DARCH_X86_64 -DELF -DPIC -o "$(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse2_x64.o" base/simd/scale_yuv_to_rgb_sse2_x64.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse2_x64.o -### Finished generating for all rules GYP_GENERATED_OUTPUTS := \ $(gyp_shared_intermediate_dir)/media/convert_rgb_to_yuv_ssse3.o \ @@ -155,8 +133,7 @@ LOCAL_GENERATED_SOURCES := \ $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_mmx.o \ $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o \ $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx_x64.o \ - $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse2_x64.o \ - media_media_asm_gyp_rule_trigger + $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse2_x64.o GYP_COPIED_SOURCE_ORIGIN_DIRS := @@ -339,9 +316,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ @@ -356,9 +333,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ diff --git a/media/media_asm.target.linux-x86.mk b/media/media_asm.target.linux-x86.mk index f2ab8c76de..3f14a3dd91 100644 --- a/media/media_asm.target.linux-x86.mk +++ b/media/media_asm.target.linux-x86.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_media_asm_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := \ @@ -23,8 +24,6 @@ $(gyp_shared_intermediate_dir)/media/convert_rgb_to_yuv_ssse3.o: export PATH := $(gyp_shared_intermediate_dir)/media/convert_rgb_to_yuv_ssse3.o: $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -felf32 -m x86 -DARCH_X86_32 -DELF -o "$(gyp_shared_intermediate_dir)/media/convert_rgb_to_yuv_ssse3.o" base/simd/convert_rgb_to_yuv_ssse3.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/convert_rgb_to_yuv_ssse3.o $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_mmx.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_mmx.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -33,8 +32,6 @@ $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_mmx.o: export PATH := $( $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_mmx.o: $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -felf32 -m x86 -DARCH_X86_32 -DELF -o "$(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_mmx.o" base/simd/convert_yuv_to_rgb_mmx.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_mmx.o $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_sse.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_sse.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -43,8 +40,6 @@ $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_sse.o: export PATH := $( $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_sse.o: $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_sse.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -felf32 -m x86 -DARCH_X86_32 -DELF -o "$(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_sse.o" base/simd/convert_yuv_to_rgb_sse.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_sse.o $(gyp_shared_intermediate_dir)/media/convert_yuva_to_argb_mmx.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/convert_yuva_to_argb_mmx.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -53,8 +48,6 @@ $(gyp_shared_intermediate_dir)/media/convert_yuva_to_argb_mmx.o: export PATH := $(gyp_shared_intermediate_dir)/media/convert_yuva_to_argb_mmx.o: $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -felf32 -m x86 -DARCH_X86_32 -DELF -o "$(gyp_shared_intermediate_dir)/media/convert_yuva_to_argb_mmx.o" base/simd/convert_yuva_to_argb_mmx.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/convert_yuva_to_argb_mmx.o $(gyp_shared_intermediate_dir)/media/empty_register_state_mmx.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/empty_register_state_mmx.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -63,8 +56,6 @@ $(gyp_shared_intermediate_dir)/media/empty_register_state_mmx.o: export PATH := $(gyp_shared_intermediate_dir)/media/empty_register_state_mmx.o: $(LOCAL_PATH)/media/base/simd/empty_register_state_mmx.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -felf32 -m x86 -DARCH_X86_32 -DELF -o "$(gyp_shared_intermediate_dir)/media/empty_register_state_mmx.o" base/simd/empty_register_state_mmx.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/empty_register_state_mmx.o $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -73,8 +64,6 @@ $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx.o: export PATH $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx.o: $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -felf32 -m x86 -DARCH_X86_32 -DELF -o "$(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx.o" base/simd/linear_scale_yuv_to_rgb_mmx.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx.o $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_sse.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_sse.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -83,8 +72,6 @@ $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_sse.o: export PATH $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_sse.o: $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_sse.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -felf32 -m x86 -DARCH_X86_32 -DELF -o "$(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_sse.o" base/simd/linear_scale_yuv_to_rgb_sse.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_sse.o $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_mmx.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_mmx.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -93,8 +80,6 @@ $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_mmx.o: export PATH := $(su $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_mmx.o: $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -felf32 -m x86 -DARCH_X86_32 -DELF -o "$(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_mmx.o" base/simd/scale_yuv_to_rgb_mmx.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_mmx.o $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -103,10 +88,7 @@ $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o: export PATH := $(su $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o: $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_sse.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -felf32 -m x86 -DARCH_X86_32 -DELF -o "$(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o" base/simd/scale_yuv_to_rgb_sse.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o -### Finished generating for all rules GYP_GENERATED_OUTPUTS := \ $(gyp_shared_intermediate_dir)/media/convert_rgb_to_yuv_ssse3.o \ @@ -131,8 +113,7 @@ LOCAL_GENERATED_SOURCES := \ $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx.o \ $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_sse.o \ $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_mmx.o \ - $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o \ - media_media_asm_gyp_rule_trigger + $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o GYP_COPIED_SOURCE_ORIGIN_DIRS := @@ -315,9 +296,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ @@ -332,9 +313,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ diff --git a/media/media_asm.target.linux-x86_64.mk b/media/media_asm.target.linux-x86_64.mk index c6e92cc69c..1b8dc596a1 100644 --- a/media/media_asm.target.linux-x86_64.mk +++ b/media/media_asm.target.linux-x86_64.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_media_asm_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := \ @@ -23,8 +24,6 @@ $(gyp_shared_intermediate_dir)/media/convert_rgb_to_yuv_ssse3.o: export PATH := $(gyp_shared_intermediate_dir)/media/convert_rgb_to_yuv_ssse3.o: $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -DPIC -felf64 -m amd64 -DARCH_X86_64 -DARCH_X86_64 -DELF -DPIC -o "$(gyp_shared_intermediate_dir)/media/convert_rgb_to_yuv_ssse3.o" base/simd/convert_rgb_to_yuv_ssse3.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/convert_rgb_to_yuv_ssse3.o $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_mmx.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_mmx.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -33,8 +32,6 @@ $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_mmx.o: export PATH := $( $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_mmx.o: $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -DPIC -felf64 -m amd64 -DARCH_X86_64 -DARCH_X86_64 -DELF -DPIC -o "$(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_mmx.o" base/simd/convert_yuv_to_rgb_mmx.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_mmx.o $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_sse.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_sse.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -43,8 +40,6 @@ $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_sse.o: export PATH := $( $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_sse.o: $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_sse.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -DPIC -felf64 -m amd64 -DARCH_X86_64 -DARCH_X86_64 -DELF -DPIC -o "$(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_sse.o" base/simd/convert_yuv_to_rgb_sse.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/convert_yuv_to_rgb_sse.o $(gyp_shared_intermediate_dir)/media/convert_yuva_to_argb_mmx.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/convert_yuva_to_argb_mmx.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -53,8 +48,6 @@ $(gyp_shared_intermediate_dir)/media/convert_yuva_to_argb_mmx.o: export PATH := $(gyp_shared_intermediate_dir)/media/convert_yuva_to_argb_mmx.o: $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -DPIC -felf64 -m amd64 -DARCH_X86_64 -DARCH_X86_64 -DELF -DPIC -o "$(gyp_shared_intermediate_dir)/media/convert_yuva_to_argb_mmx.o" base/simd/convert_yuva_to_argb_mmx.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/convert_yuva_to_argb_mmx.o $(gyp_shared_intermediate_dir)/media/empty_register_state_mmx.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/empty_register_state_mmx.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -63,8 +56,6 @@ $(gyp_shared_intermediate_dir)/media/empty_register_state_mmx.o: export PATH := $(gyp_shared_intermediate_dir)/media/empty_register_state_mmx.o: $(LOCAL_PATH)/media/base/simd/empty_register_state_mmx.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -DPIC -felf64 -m amd64 -DARCH_X86_64 -DARCH_X86_64 -DELF -DPIC -o "$(gyp_shared_intermediate_dir)/media/empty_register_state_mmx.o" base/simd/empty_register_state_mmx.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/empty_register_state_mmx.o $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -73,8 +64,6 @@ $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx.o: export PATH $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx.o: $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -DPIC -felf64 -m amd64 -DARCH_X86_64 -DARCH_X86_64 -DELF -DPIC -o "$(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx.o" base/simd/linear_scale_yuv_to_rgb_mmx.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx.o $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_sse.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_sse.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -83,8 +72,6 @@ $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_sse.o: export PATH $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_sse.o: $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_sse.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -DPIC -felf64 -m amd64 -DARCH_X86_64 -DARCH_X86_64 -DELF -DPIC -o "$(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_sse.o" base/simd/linear_scale_yuv_to_rgb_sse.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_sse.o $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_mmx.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_mmx.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -93,8 +80,6 @@ $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_mmx.o: export PATH := $(su $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_mmx.o: $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -DPIC -felf64 -m amd64 -DARCH_X86_64 -DARCH_X86_64 -DELF -DPIC -o "$(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_mmx.o" base/simd/scale_yuv_to_rgb_mmx.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_mmx.o $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -103,8 +88,6 @@ $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o: export PATH := $(su $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o: $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_sse.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -DPIC -felf64 -m amd64 -DARCH_X86_64 -DARCH_X86_64 -DELF -DPIC -o "$(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o" base/simd/scale_yuv_to_rgb_sse.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx_x64.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx_x64.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -113,8 +96,6 @@ $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx_x64.o: export P $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx_x64.o: $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx_x64.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -DPIC -felf64 -m amd64 -DARCH_X86_64 -DARCH_X86_64 -DELF -DPIC -o "$(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx_x64.o" base/simd/linear_scale_yuv_to_rgb_mmx_x64.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx_x64.o $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse2_x64.o: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse2_x64.o: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -123,10 +104,7 @@ $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse2_x64.o: export PATH := $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse2_x64.o: $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_sse2_x64.asm $(gyp_shared_intermediate_dir)/yasm $(LOCAL_PATH)/third_party/x86inc/x86inc.asm $(LOCAL_PATH)/media/base/simd/convert_rgb_to_yuv_ssse3.inc $(LOCAL_PATH)/media/base/simd/convert_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/convert_yuva_to_argb_mmx.inc $(LOCAL_PATH)/media/base/simd/linear_scale_yuv_to_rgb_mmx.inc $(LOCAL_PATH)/media/base/simd/media_export.asm $(LOCAL_PATH)/media/base/simd/scale_yuv_to_rgb_mmx.inc $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media; cd $(gyp_local_path)/media; "$(gyp_shared_intermediate_dir)/yasm" -DCHROMIUM -I.. -DPIC -felf64 -m amd64 -DARCH_X86_64 -DARCH_X86_64 -DELF -DPIC -o "$(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse2_x64.o" base/simd/scale_yuv_to_rgb_sse2_x64.asm -.PHONY: media_media_asm_gyp_rule_trigger -media_media_asm_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse2_x64.o -### Finished generating for all rules GYP_GENERATED_OUTPUTS := \ $(gyp_shared_intermediate_dir)/media/convert_rgb_to_yuv_ssse3.o \ @@ -155,8 +133,7 @@ LOCAL_GENERATED_SOURCES := \ $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_mmx.o \ $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse.o \ $(gyp_shared_intermediate_dir)/media/linear_scale_yuv_to_rgb_mmx_x64.o \ - $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse2_x64.o \ - media_media_asm_gyp_rule_trigger + $(gyp_shared_intermediate_dir)/media/scale_yuv_to_rgb_sse2_x64.o GYP_COPIED_SOURCE_ORIGIN_DIRS := @@ -339,9 +316,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ @@ -356,9 +333,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ diff --git a/media/media_mmx.target.darwin-x86.mk b/media/media_mmx.target.darwin-x86.mk index 89d963e595..19ceeff882 100644 --- a/media/media_mmx.target.darwin-x86.mk +++ b/media/media_mmx.target.darwin-x86.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_media_mmx_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -208,9 +209,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ @@ -225,9 +226,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ diff --git a/media/media_mmx.target.darwin-x86_64.mk b/media/media_mmx.target.darwin-x86_64.mk index 15a13b76f9..cc9806e8de 100644 --- a/media/media_mmx.target.darwin-x86_64.mk +++ b/media/media_mmx.target.darwin-x86_64.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_media_mmx_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -208,9 +209,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ @@ -225,9 +226,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ diff --git a/media/media_mmx.target.linux-x86.mk b/media/media_mmx.target.linux-x86.mk index 89d963e595..19ceeff882 100644 --- a/media/media_mmx.target.linux-x86.mk +++ b/media/media_mmx.target.linux-x86.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_media_mmx_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -208,9 +209,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ @@ -225,9 +226,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ diff --git a/media/media_mmx.target.linux-x86_64.mk b/media/media_mmx.target.linux-x86_64.mk index 15a13b76f9..cc9806e8de 100644 --- a/media/media_mmx.target.linux-x86_64.mk +++ b/media/media_mmx.target.linux-x86_64.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_media_mmx_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -208,9 +209,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ @@ -225,9 +226,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ diff --git a/media/media_sse.target.darwin-x86.mk b/media/media_sse.target.darwin-x86.mk index eb3dd1565a..7358de1e1f 100644 --- a/media/media_sse.target.darwin-x86.mk +++ b/media/media_sse.target.darwin-x86.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_media_sse_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -208,9 +209,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ @@ -225,9 +226,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ diff --git a/media/media_sse.target.darwin-x86_64.mk b/media/media_sse.target.darwin-x86_64.mk index 989767dcdd..b20a835221 100644 --- a/media/media_sse.target.darwin-x86_64.mk +++ b/media/media_sse.target.darwin-x86_64.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_media_sse_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -208,9 +209,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ @@ -225,9 +226,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ diff --git a/media/media_sse.target.linux-x86.mk b/media/media_sse.target.linux-x86.mk index eb3dd1565a..7358de1e1f 100644 --- a/media/media_sse.target.linux-x86.mk +++ b/media/media_sse.target.linux-x86.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_media_sse_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -208,9 +209,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ @@ -225,9 +226,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ diff --git a/media/media_sse.target.linux-x86_64.mk b/media/media_sse.target.linux-x86_64.mk index 989767dcdd..b20a835221 100644 --- a/media/media_sse.target.linux-x86_64.mk +++ b/media/media_sse.target.linux-x86_64.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_media_sse_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -208,9 +209,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ @@ -225,9 +226,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ diff --git a/media/media_sse2.target.darwin-x86.mk b/media/media_sse2.target.darwin-x86.mk index 8f63c7817c..80bbea4f2b 100644 --- a/media/media_sse2.target.darwin-x86.mk +++ b/media/media_sse2.target.darwin-x86.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_media_sse2_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -210,9 +211,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ @@ -227,9 +228,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ diff --git a/media/media_sse2.target.darwin-x86_64.mk b/media/media_sse2.target.darwin-x86_64.mk index 0769588e06..1930b57c9d 100644 --- a/media/media_sse2.target.darwin-x86_64.mk +++ b/media/media_sse2.target.darwin-x86_64.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_media_sse2_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -210,9 +211,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ @@ -227,9 +228,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ diff --git a/media/media_sse2.target.linux-x86.mk b/media/media_sse2.target.linux-x86.mk index 8f63c7817c..80bbea4f2b 100644 --- a/media/media_sse2.target.linux-x86.mk +++ b/media/media_sse2.target.linux-x86.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_media_sse2_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -210,9 +211,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ @@ -227,9 +228,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ diff --git a/media/media_sse2.target.linux-x86_64.mk b/media/media_sse2.target.linux-x86_64.mk index 0769588e06..1930b57c9d 100644 --- a/media/media_sse2.target.linux-x86_64.mk +++ b/media/media_sse2.target.linux-x86_64.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_media_sse2_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -210,9 +211,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ @@ -227,9 +228,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ diff --git a/media/player_android.target.darwin-arm.mk b/media/player_android.target.darwin-arm.mk index ece7ad98d0..7713a92927 100644 --- a/media/player_android.target.darwin-arm.mk +++ b/media/player_android.target.darwin-arm.mk @@ -6,14 +6,15 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_player_android_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := \ - $(call intermediates-dir-for,GYP,third_party_widevine_cdm_widevine_cdm_version_h_gyp)/widevine_cdm_version_h.stamp \ - $(call intermediates-dir-for,STATIC_LIBRARIES,ui_gl_gl_gyp)/ui_gl_gl_gyp.a \ - $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp)/media_android_jni_headers.stamp + $(call intermediates-dir-for,GYP,third_party_widevine_cdm_widevine_cdm_version_h_gyp,,,$(GYP_VAR_PREFIX))/widevine_cdm_version_h.stamp \ + $(call intermediates-dir-for,STATIC_LIBRARIES,ui_gl_gl_gyp,,,$(GYP_VAR_PREFIX))/ui_gl_gl_gyp.a \ + $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp,,,$(GYP_VAR_PREFIX))/media_android_jni_headers.stamp GYP_GENERATED_OUTPUTS := @@ -243,9 +244,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -Wl,-z,relro \ @@ -262,9 +263,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -Wl,-z,relro \ diff --git a/media/player_android.target.darwin-mips.mk b/media/player_android.target.darwin-mips.mk index 29e6caa167..a3aa36dd6f 100644 --- a/media/player_android.target.darwin-mips.mk +++ b/media/player_android.target.darwin-mips.mk @@ -6,14 +6,15 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_player_android_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := \ - $(call intermediates-dir-for,GYP,third_party_widevine_cdm_widevine_cdm_version_h_gyp)/widevine_cdm_version_h.stamp \ - $(call intermediates-dir-for,STATIC_LIBRARIES,ui_gl_gl_gyp)/ui_gl_gl_gyp.a \ - $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp)/media_android_jni_headers.stamp + $(call intermediates-dir-for,GYP,third_party_widevine_cdm_widevine_cdm_version_h_gyp,,,$(GYP_VAR_PREFIX))/widevine_cdm_version_h.stamp \ + $(call intermediates-dir-for,STATIC_LIBRARIES,ui_gl_gl_gyp,,,$(GYP_VAR_PREFIX))/ui_gl_gl_gyp.a \ + $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp,,,$(GYP_VAR_PREFIX))/media_android_jni_headers.stamp GYP_GENERATED_OUTPUTS := @@ -241,9 +242,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -EL \ @@ -258,9 +259,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -EL \ diff --git a/media/player_android.target.darwin-x86.mk b/media/player_android.target.darwin-x86.mk index 24605c8aed..45d1433b3f 100644 --- a/media/player_android.target.darwin-x86.mk +++ b/media/player_android.target.darwin-x86.mk @@ -6,14 +6,15 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_player_android_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := \ - $(call intermediates-dir-for,GYP,third_party_widevine_cdm_widevine_cdm_version_h_gyp)/widevine_cdm_version_h.stamp \ - $(call intermediates-dir-for,STATIC_LIBRARIES,ui_gl_gl_gyp)/ui_gl_gl_gyp.a \ - $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp)/media_android_jni_headers.stamp + $(call intermediates-dir-for,GYP,third_party_widevine_cdm_widevine_cdm_version_h_gyp,,,$(GYP_VAR_PREFIX))/widevine_cdm_version_h.stamp \ + $(call intermediates-dir-for,STATIC_LIBRARIES,ui_gl_gl_gyp,,,$(GYP_VAR_PREFIX))/ui_gl_gl_gyp.a \ + $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp,,,$(GYP_VAR_PREFIX))/media_android_jni_headers.stamp GYP_GENERATED_OUTPUTS := @@ -243,9 +244,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ @@ -260,9 +261,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ diff --git a/media/player_android.target.darwin-x86_64.mk b/media/player_android.target.darwin-x86_64.mk index 70f45df9f7..19d827ccee 100644 --- a/media/player_android.target.darwin-x86_64.mk +++ b/media/player_android.target.darwin-x86_64.mk @@ -6,14 +6,15 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_player_android_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := \ - $(call intermediates-dir-for,GYP,third_party_widevine_cdm_widevine_cdm_version_h_gyp)/widevine_cdm_version_h.stamp \ - $(call intermediates-dir-for,STATIC_LIBRARIES,ui_gl_gl_gyp)/ui_gl_gl_gyp.a \ - $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp)/media_android_jni_headers.stamp + $(call intermediates-dir-for,GYP,third_party_widevine_cdm_widevine_cdm_version_h_gyp,,,$(GYP_VAR_PREFIX))/widevine_cdm_version_h.stamp \ + $(call intermediates-dir-for,STATIC_LIBRARIES,ui_gl_gl_gyp,,,$(GYP_VAR_PREFIX))/ui_gl_gl_gyp.a \ + $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp,,,$(GYP_VAR_PREFIX))/media_android_jni_headers.stamp GYP_GENERATED_OUTPUTS := @@ -243,9 +244,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ @@ -260,9 +261,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ diff --git a/media/player_android.target.linux-arm.mk b/media/player_android.target.linux-arm.mk index ece7ad98d0..7713a92927 100644 --- a/media/player_android.target.linux-arm.mk +++ b/media/player_android.target.linux-arm.mk @@ -6,14 +6,15 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_player_android_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := \ - $(call intermediates-dir-for,GYP,third_party_widevine_cdm_widevine_cdm_version_h_gyp)/widevine_cdm_version_h.stamp \ - $(call intermediates-dir-for,STATIC_LIBRARIES,ui_gl_gl_gyp)/ui_gl_gl_gyp.a \ - $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp)/media_android_jni_headers.stamp + $(call intermediates-dir-for,GYP,third_party_widevine_cdm_widevine_cdm_version_h_gyp,,,$(GYP_VAR_PREFIX))/widevine_cdm_version_h.stamp \ + $(call intermediates-dir-for,STATIC_LIBRARIES,ui_gl_gl_gyp,,,$(GYP_VAR_PREFIX))/ui_gl_gl_gyp.a \ + $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp,,,$(GYP_VAR_PREFIX))/media_android_jni_headers.stamp GYP_GENERATED_OUTPUTS := @@ -243,9 +244,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -Wl,-z,relro \ @@ -262,9 +263,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -Wl,-z,relro \ diff --git a/media/player_android.target.linux-mips.mk b/media/player_android.target.linux-mips.mk index 29e6caa167..a3aa36dd6f 100644 --- a/media/player_android.target.linux-mips.mk +++ b/media/player_android.target.linux-mips.mk @@ -6,14 +6,15 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_player_android_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := \ - $(call intermediates-dir-for,GYP,third_party_widevine_cdm_widevine_cdm_version_h_gyp)/widevine_cdm_version_h.stamp \ - $(call intermediates-dir-for,STATIC_LIBRARIES,ui_gl_gl_gyp)/ui_gl_gl_gyp.a \ - $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp)/media_android_jni_headers.stamp + $(call intermediates-dir-for,GYP,third_party_widevine_cdm_widevine_cdm_version_h_gyp,,,$(GYP_VAR_PREFIX))/widevine_cdm_version_h.stamp \ + $(call intermediates-dir-for,STATIC_LIBRARIES,ui_gl_gl_gyp,,,$(GYP_VAR_PREFIX))/ui_gl_gl_gyp.a \ + $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp,,,$(GYP_VAR_PREFIX))/media_android_jni_headers.stamp GYP_GENERATED_OUTPUTS := @@ -241,9 +242,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -EL \ @@ -258,9 +259,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -EL \ diff --git a/media/player_android.target.linux-x86.mk b/media/player_android.target.linux-x86.mk index 24605c8aed..45d1433b3f 100644 --- a/media/player_android.target.linux-x86.mk +++ b/media/player_android.target.linux-x86.mk @@ -6,14 +6,15 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_player_android_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := \ - $(call intermediates-dir-for,GYP,third_party_widevine_cdm_widevine_cdm_version_h_gyp)/widevine_cdm_version_h.stamp \ - $(call intermediates-dir-for,STATIC_LIBRARIES,ui_gl_gl_gyp)/ui_gl_gl_gyp.a \ - $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp)/media_android_jni_headers.stamp + $(call intermediates-dir-for,GYP,third_party_widevine_cdm_widevine_cdm_version_h_gyp,,,$(GYP_VAR_PREFIX))/widevine_cdm_version_h.stamp \ + $(call intermediates-dir-for,STATIC_LIBRARIES,ui_gl_gl_gyp,,,$(GYP_VAR_PREFIX))/ui_gl_gl_gyp.a \ + $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp,,,$(GYP_VAR_PREFIX))/media_android_jni_headers.stamp GYP_GENERATED_OUTPUTS := @@ -243,9 +244,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ @@ -260,9 +261,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ diff --git a/media/player_android.target.linux-x86_64.mk b/media/player_android.target.linux-x86_64.mk index 70f45df9f7..19d827ccee 100644 --- a/media/player_android.target.linux-x86_64.mk +++ b/media/player_android.target.linux-x86_64.mk @@ -6,14 +6,15 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_player_android_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := \ - $(call intermediates-dir-for,GYP,third_party_widevine_cdm_widevine_cdm_version_h_gyp)/widevine_cdm_version_h.stamp \ - $(call intermediates-dir-for,STATIC_LIBRARIES,ui_gl_gl_gyp)/ui_gl_gl_gyp.a \ - $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp)/media_android_jni_headers.stamp + $(call intermediates-dir-for,GYP,third_party_widevine_cdm_widevine_cdm_version_h_gyp,,,$(GYP_VAR_PREFIX))/widevine_cdm_version_h.stamp \ + $(call intermediates-dir-for,STATIC_LIBRARIES,ui_gl_gl_gyp,,,$(GYP_VAR_PREFIX))/ui_gl_gl_gyp.a \ + $(call intermediates-dir-for,GYP,media_media_android_jni_headers_gyp,,,$(GYP_VAR_PREFIX))/media_android_jni_headers.stamp GYP_GENERATED_OUTPUTS := @@ -243,9 +244,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ @@ -260,9 +261,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ diff --git a/media/shared_memory_support.target.darwin-arm.mk b/media/shared_memory_support.target.darwin-arm.mk index fa10462320..13978d24a6 100644 --- a/media/shared_memory_support.target.darwin-arm.mk +++ b/media/shared_memory_support.target.darwin-arm.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_shared_memory_support_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -211,9 +212,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -Wl,-z,relro \ @@ -230,9 +231,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -Wl,-z,relro \ diff --git a/media/shared_memory_support.target.darwin-mips.mk b/media/shared_memory_support.target.darwin-mips.mk index 953eadd542..db27e5a503 100644 --- a/media/shared_memory_support.target.darwin-mips.mk +++ b/media/shared_memory_support.target.darwin-mips.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_shared_memory_support_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -209,9 +210,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -EL \ @@ -226,9 +227,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -EL \ diff --git a/media/shared_memory_support.target.darwin-x86.mk b/media/shared_memory_support.target.darwin-x86.mk index ec96dcecf5..affc2767b8 100644 --- a/media/shared_memory_support.target.darwin-x86.mk +++ b/media/shared_memory_support.target.darwin-x86.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_shared_memory_support_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -211,9 +212,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ @@ -228,9 +229,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ diff --git a/media/shared_memory_support.target.darwin-x86_64.mk b/media/shared_memory_support.target.darwin-x86_64.mk index 7ba0e19dc0..0653fce14a 100644 --- a/media/shared_memory_support.target.darwin-x86_64.mk +++ b/media/shared_memory_support.target.darwin-x86_64.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_shared_memory_support_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -211,9 +212,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ @@ -228,9 +229,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ diff --git a/media/shared_memory_support.target.linux-arm.mk b/media/shared_memory_support.target.linux-arm.mk index fa10462320..13978d24a6 100644 --- a/media/shared_memory_support.target.linux-arm.mk +++ b/media/shared_memory_support.target.linux-arm.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_shared_memory_support_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -211,9 +212,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -Wl,-z,relro \ @@ -230,9 +231,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -Wl,-z,relro \ diff --git a/media/shared_memory_support.target.linux-mips.mk b/media/shared_memory_support.target.linux-mips.mk index 953eadd542..db27e5a503 100644 --- a/media/shared_memory_support.target.linux-mips.mk +++ b/media/shared_memory_support.target.linux-mips.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_shared_memory_support_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -209,9 +210,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -EL \ @@ -226,9 +227,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -EL \ diff --git a/media/shared_memory_support.target.linux-x86.mk b/media/shared_memory_support.target.linux-x86.mk index ec96dcecf5..affc2767b8 100644 --- a/media/shared_memory_support.target.linux-x86.mk +++ b/media/shared_memory_support.target.linux-x86.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_shared_memory_support_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -211,9 +212,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ @@ -228,9 +229,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ diff --git a/media/shared_memory_support.target.linux-x86_64.mk b/media/shared_memory_support.target.linux-x86_64.mk index 7ba0e19dc0..0653fce14a 100644 --- a/media/shared_memory_support.target.linux-x86_64.mk +++ b/media/shared_memory_support.target.linux-x86_64.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_shared_memory_support_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -211,9 +212,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ @@ -228,9 +229,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ diff --git a/media/shared_memory_support_sse.target.darwin-x86.mk b/media/shared_memory_support_sse.target.darwin-x86.mk index f164540bb1..e06ee376bf 100644 --- a/media/shared_memory_support_sse.target.darwin-x86.mk +++ b/media/shared_memory_support_sse.target.darwin-x86.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_shared_memory_support_sse_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -208,9 +209,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ @@ -225,9 +226,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ diff --git a/media/shared_memory_support_sse.target.darwin-x86_64.mk b/media/shared_memory_support_sse.target.darwin-x86_64.mk index 531cf7bfe5..75b6504ac8 100644 --- a/media/shared_memory_support_sse.target.darwin-x86_64.mk +++ b/media/shared_memory_support_sse.target.darwin-x86_64.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_shared_memory_support_sse_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -208,9 +209,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ @@ -225,9 +226,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ diff --git a/media/shared_memory_support_sse.target.linux-x86.mk b/media/shared_memory_support_sse.target.linux-x86.mk index f164540bb1..e06ee376bf 100644 --- a/media/shared_memory_support_sse.target.linux-x86.mk +++ b/media/shared_memory_support_sse.target.linux-x86.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_shared_memory_support_sse_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -208,9 +209,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ @@ -225,9 +226,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m32 \ diff --git a/media/shared_memory_support_sse.target.linux-x86_64.mk b/media/shared_memory_support_sse.target.linux-x86_64.mk index 531cf7bfe5..75b6504ac8 100644 --- a/media/shared_memory_support_sse.target.linux-x86_64.mk +++ b/media/shared_memory_support_sse.target.linux-x86_64.mk @@ -6,8 +6,9 @@ LOCAL_MODULE_CLASS := STATIC_LIBRARIES LOCAL_MODULE := media_shared_memory_support_sse_gyp LOCAL_MODULE_SUFFIX := .a LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -208,9 +209,9 @@ LOCAL_ASFLAGS := $(LOCAL_CFLAGS) ### Rules for final target. LOCAL_LDFLAGS_Debug := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ @@ -225,9 +226,9 @@ LOCAL_LDFLAGS_Debug := \ LOCAL_LDFLAGS_Release := \ - -Wl,--fatal-warnings \ -Wl,-z,now \ -Wl,-z,relro \ + -Wl,--fatal-warnings \ -Wl,-z,noexecstack \ -fPIC \ -m64 \ diff --git a/media/tools/player_x11/data_source_logger.cc b/media/tools/player_x11/data_source_logger.cc index 0bc5ded977..204d8b30b2 100644 --- a/media/tools/player_x11/data_source_logger.cc +++ b/media/tools/player_x11/data_source_logger.cc @@ -25,11 +25,6 @@ DataSourceLogger::DataSourceLogger( streaming_(streaming) { } -void DataSourceLogger::set_host(media::DataSourceHost* host) { - VLOG(1) << "set_host(" << host << ")"; - data_source_->set_host(host); -} - void DataSourceLogger::Stop(const base::Closure& closure) { VLOG(1) << "Stop() started"; data_source_->Stop(base::Bind(&LogAndRunStopClosure, closure)); diff --git a/media/tools/player_x11/data_source_logger.h b/media/tools/player_x11/data_source_logger.h index c48d413d5e..5fdd9d4116 100644 --- a/media/tools/player_x11/data_source_logger.h +++ b/media/tools/player_x11/data_source_logger.h @@ -22,7 +22,6 @@ class DataSourceLogger : public media::DataSource { virtual ~DataSourceLogger(); // media::DataSource implementation. - virtual void set_host(media::DataSourceHost* host) OVERRIDE; virtual void Stop(const base::Closure& closure) OVERRIDE; virtual void Read( int64 position, int size, uint8* data, diff --git a/media/tools/player_x11/gl_video_renderer.cc b/media/tools/player_x11/gl_video_renderer.cc index e32a63ce3d..460bca6fac 100644 --- a/media/tools/player_x11/gl_video_renderer.cc +++ b/media/tools/player_x11/gl_video_renderer.cc @@ -117,6 +117,7 @@ void GlVideoRenderer::Paint(media::VideoFrame* video_frame) { // Convert YUV frame to RGB. DCHECK(video_frame->format() == media::VideoFrame::YV12 || + video_frame->format() == media::VideoFrame::I420 || video_frame->format() == media::VideoFrame::YV16); DCHECK(video_frame->stride(media::VideoFrame::kUPlane) == video_frame->stride(media::VideoFrame::kVPlane)); diff --git a/media/tools/player_x11/x11_video_renderer.cc b/media/tools/player_x11/x11_video_renderer.cc index 907e1abb5f..5c886e7eed 100644 --- a/media/tools/player_x11/x11_video_renderer.cc +++ b/media/tools/player_x11/x11_video_renderer.cc @@ -100,14 +100,16 @@ void X11VideoRenderer::Paint(media::VideoFrame* video_frame) { // Convert YUV frame to RGB. DCHECK(video_frame->format() == media::VideoFrame::YV12 || + video_frame->format() == media::VideoFrame::I420 || video_frame->format() == media::VideoFrame::YV16); DCHECK(video_frame->stride(media::VideoFrame::kUPlane) == video_frame->stride(media::VideoFrame::kVPlane)); DCHECK(image_->data); - media::YUVType yuv_type = - (video_frame->format() == media::VideoFrame::YV12) ? - media::YV12 : media::YV16; + media::YUVType yuv_type = (video_frame->format() == media::VideoFrame::YV12 || + video_frame->format() == media::VideoFrame::I420) + ? media::YV12 + : media::YV16; media::ConvertYUVToRGB32(video_frame->data(media::VideoFrame::kYPlane), video_frame->data(media::VideoFrame::kUPlane), video_frame->data(media::VideoFrame::kVPlane), diff --git a/media/video/capture/linux/video_capture_device_linux.cc b/media/video/capture/linux/video_capture_device_linux.cc index 7a9ed69f75..6893743d51 100644 --- a/media/video/capture/linux/video_capture_device_linux.cc +++ b/media/video/capture/linux/video_capture_device_linux.cc @@ -401,6 +401,19 @@ void VideoCaptureDeviceLinux::OnAllocateAndStart(int width, // TODO(mcasas): what should be done if the camera driver does not allow // framerate configuration, or the actual one is different from the desired? + // Set anti-banding/anti-flicker to 50/60Hz. May fail due to not supported + // operation (|errno| == EINVAL in this case) or plain failure. + const int power_line_frequency = GetPowerLineFrequencyForLocation(); + if ((power_line_frequency == kPowerLine50Hz) || + (power_line_frequency == kPowerLine60Hz)) { + struct v4l2_control control = {}; + control.id = V4L2_CID_POWER_LINE_FREQUENCY; + control.value = (power_line_frequency == kPowerLine50Hz) ? + V4L2_CID_POWER_LINE_FREQUENCY_50HZ : + V4L2_CID_POWER_LINE_FREQUENCY_60HZ; + HANDLE_EINTR(ioctl(device_fd_.get(), VIDIOC_S_CTRL, &control)); + } + // Store our current width and height. capture_format_.frame_size.SetSize(video_fmt.fmt.pix.width, video_fmt.fmt.pix.height); diff --git a/media/video/capture/mac/avfoundation_glue.h b/media/video/capture/mac/avfoundation_glue.h index de46127179..12262fa86e 100644 --- a/media/video/capture/mac/avfoundation_glue.h +++ b/media/video/capture/mac/avfoundation_glue.h @@ -47,7 +47,7 @@ class MEDIA_EXPORT AVFoundationGlue { // Originally from AVVideoSettings.h but in global namespace. static NSString* AVVideoScalingModeKey(); - static NSString* AVVideoScalingModeResizeAspect(); + static NSString* AVVideoScalingModeResizeAspectFill(); static Class AVCaptureSessionClass(); static Class AVCaptureVideoDataOutputClass(); diff --git a/media/video/capture/mac/avfoundation_glue.mm b/media/video/capture/mac/avfoundation_glue.mm index 6d968f3401..ae53f5d054 100644 --- a/media/video/capture/mac/avfoundation_glue.mm +++ b/media/video/capture/mac/avfoundation_glue.mm @@ -49,7 +49,8 @@ class AVFoundationInternal { {&AVCaptureSessionPreset640x480_, "AVCaptureSessionPreset640x480"}, {&AVCaptureSessionPreset1280x720_, "AVCaptureSessionPreset1280x720"}, {&AVVideoScalingModeKey_, "AVVideoScalingModeKey"}, - {&AVVideoScalingModeResizeAspect_, "AVVideoScalingModeResizeAspect"}, + {&AVVideoScalingModeResizeAspectFill_, + "AVVideoScalingModeResizeAspectFill"}, }; for (size_t i = 0; i < arraysize(av_strings); ++i) { *av_strings[i].loaded_string = *reinterpret_cast<NSString**>( @@ -89,8 +90,8 @@ class AVFoundationInternal { return AVCaptureSessionPreset1280x720_; } NSString* AVVideoScalingModeKey() const { return AVVideoScalingModeKey_; } - NSString* AVVideoScalingModeResizeAspect() const { - return AVVideoScalingModeResizeAspect_; + NSString* AVVideoScalingModeResizeAspectFill() const { + return AVVideoScalingModeResizeAspectFill_; } private: @@ -109,7 +110,7 @@ class AVFoundationInternal { NSString* AVCaptureSessionPreset640x480_; NSString* AVCaptureSessionPreset1280x720_; NSString* AVVideoScalingModeKey_; - NSString* AVVideoScalingModeResizeAspect_; + NSString* AVVideoScalingModeResizeAspectFill_; DISALLOW_COPY_AND_ASSIGN(AVFoundationInternal); }; @@ -188,8 +189,8 @@ NSString* AVFoundationGlue::AVVideoScalingModeKey() { return g_avfoundation_handle.Get().AVVideoScalingModeKey(); } -NSString* AVFoundationGlue::AVVideoScalingModeResizeAspect() { - return g_avfoundation_handle.Get().AVVideoScalingModeResizeAspect(); +NSString* AVFoundationGlue::AVVideoScalingModeResizeAspectFill() { + return g_avfoundation_handle.Get().AVVideoScalingModeResizeAspectFill(); } Class AVFoundationGlue::AVCaptureSessionClass() { diff --git a/media/video/capture/mac/video_capture_device_avfoundation_mac.mm b/media/video/capture/mac/video_capture_device_avfoundation_mac.mm index dee6bc05e8..1fb3b5ce17 100644 --- a/media/video/capture/mac/video_capture_device_avfoundation_mac.mm +++ b/media/video/capture/mac/video_capture_device_avfoundation_mac.mm @@ -207,13 +207,13 @@ // The reason for this mismatch is probably because most of the AVFoundation // docs are written for iOS and not for MacOsX. // AVVideoScalingModeKey() refers to letterboxing yes/no and preserve aspect - // ratio yes/no when scaling. Currently we set letterbox and preservation. + // ratio yes/no when scaling. Currently we set cropping and preservation. NSDictionary* videoSettingsDictionary = @{ (id)kCVPixelBufferWidthKey : @(width), (id)kCVPixelBufferHeightKey : @(height), (id)kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_422YpCbCr8), AVFoundationGlue::AVVideoScalingModeKey() : - AVFoundationGlue::AVVideoScalingModeResizeAspect() + AVFoundationGlue::AVVideoScalingModeResizeAspectFill() }; [captureVideoDataOutput_ setVideoSettings:videoSettingsDictionary]; @@ -297,9 +297,14 @@ - (void)onVideoError:(NSNotification*)errorNotification { NSError* error = base::mac::ObjCCast<NSError>([[errorNotification userInfo] objectForKey:AVFoundationGlue::AVCaptureSessionErrorKey()]); + NSString* str_error = + [NSString stringWithFormat:@"%@: %@", + [error localizedDescription], + [error localizedFailureReason]]; + base::AutoLock lock(lock_); if (frameReceiver_) - frameReceiver_->ReceiveError([[error localizedDescription] UTF8String]); + frameReceiver_->ReceiveError([str_error UTF8String]); } @end diff --git a/media/video/capture/mac/video_capture_device_mac.mm b/media/video/capture/mac/video_capture_device_mac.mm index 7b880377e5..75f3937e89 100644 --- a/media/video/capture/mac/video_capture_device_mac.mm +++ b/media/video/capture/mac/video_capture_device_mac.mm @@ -298,10 +298,16 @@ void VideoCaptureDeviceMac::ReceiveFrame( } } - DCHECK_EQ(capture_format_.frame_size.width(), - frame_format.frame_size.width()); - DCHECK_EQ(capture_format_.frame_size.height(), - frame_format.frame_size.height()); + // QTKit capture source can change resolution if someone else reconfigures the + // camera, and that is fine: http://crbug.com/353620. In AVFoundation, this + // should not happen, it should resize internally. + if (!AVFoundationGlue::IsAVFoundationSupported()) { + capture_format_.frame_size = frame_format.frame_size; + } else if (capture_format_.frame_size != frame_format.frame_size) { + ReceiveError("Captured resolution " + frame_format.frame_size.ToString() + + ", and expected " + capture_format_.frame_size.ToString()); + return; + } client_->OnIncomingCapturedData(video_frame, video_frame_length, diff --git a/media/video/capture/mac/video_capture_device_qtkit_mac.mm b/media/video/capture/mac/video_capture_device_qtkit_mac.mm index a4bf71d0a7..0b62867811 100644 --- a/media/video/capture/mac/video_capture_device_qtkit_mac.mm +++ b/media/video/capture/mac/video_capture_device_qtkit_mac.mm @@ -309,7 +309,12 @@ - (void)handleNotification:(NSNotification*)errorNotification { NSError * error = (NSError*)[[errorNotification userInfo] objectForKey:QTCaptureSessionErrorKey]; - frameReceiver_->ReceiveError([[error localizedDescription] UTF8String]); + NSString* str_error = + [NSString stringWithFormat:@"%@: %@", + [error localizedDescription], + [error localizedFailureReason]]; + + frameReceiver_->ReceiveError([str_error UTF8String]); } @end diff --git a/media/video/capture/video_capture_device.cc b/media/video/capture/video_capture_device.cc index c370d092c9..2efff7de02 100644 --- a/media/video/capture/video_capture_device.cc +++ b/media/video/capture/video_capture_device.cc @@ -3,6 +3,8 @@ // found in the LICENSE file. #include "media/video/capture/video_capture_device.h" + +#include "base/i18n/timezone.h" #include "base/strings/string_util.h" namespace media { @@ -19,4 +21,24 @@ const std::string VideoCaptureDevice::Name::GetNameAndModel() const { VideoCaptureDevice::~VideoCaptureDevice() {} +int VideoCaptureDevice::GetPowerLineFrequencyForLocation() const { + std::string current_country = base::CountryCodeForCurrentTimezone(); + if (current_country.empty()) + return 0; + // Sorted out list of countries with 60Hz power line frequency, from + // http://en.wikipedia.org/wiki/Mains_electricity_by_country + const char* countries_using_60Hz[] = { + "AI", "AO", "AS", "AW", "AZ", "BM", "BR", "BS", "BZ", "CA", "CO", + "CR", "CU", "DO", "EC", "FM", "GT", "GU", "GY", "HN", "HT", "JP", + "KN", "KR", "KY", "MS", "MX", "NI", "PA", "PE", "PF", "PH", "PR", + "PW", "SA", "SR", "SV", "TT", "TW", "UM", "US", "VG", "VI", "VE"}; + const char** countries_using_60Hz_end = + countries_using_60Hz + arraysize(countries_using_60Hz); + if (std::find(countries_using_60Hz, countries_using_60Hz_end, + current_country) == countries_using_60Hz_end) { + return kPowerLine50Hz; + } + return kPowerLine60Hz; +} + } // namespace media diff --git a/media/video/capture/video_capture_device.h b/media/video/capture/video_capture_device.h index 11c73442bb..4e060a1dcb 100644 --- a/media/video/capture/video_capture_device.h +++ b/media/video/capture/video_capture_device.h @@ -212,6 +212,14 @@ class MEDIA_EXPORT VideoCaptureDevice { // would be sequenced through the same task runner, so that deallocation // happens first. virtual void StopAndDeAllocate() = 0; + + // Gets the power line frequency from the current system time zone if this is + // defined, otherwise returns 0. + int GetPowerLineFrequencyForLocation() const; + + protected: + static const int kPowerLine50Hz = 50; + static const int kPowerLine60Hz = 60; }; } // namespace media diff --git a/media/video/video_decode_accelerator.h b/media/video/video_decode_accelerator.h index b7bc511526..950ac8d143 100644 --- a/media/video/video_decode_accelerator.h +++ b/media/video/video_decode_accelerator.h @@ -8,7 +8,6 @@ #include <vector> #include "base/basictypes.h" -#include "base/memory/weak_ptr.h" #include "media/base/bitstream_buffer.h" #include "media/base/video_decoder_config.h" #include "media/video/picture.h" @@ -19,8 +18,7 @@ namespace media { // Video decoder interface. // This interface is extended by the various components that ultimately // implement the backend of PPB_VideoDecode_Dev. -class MEDIA_EXPORT VideoDecodeAccelerator - : public base::SupportsWeakPtr<VideoDecodeAccelerator> { +class MEDIA_EXPORT VideoDecodeAccelerator { public: virtual ~VideoDecodeAccelerator(); @@ -44,15 +42,13 @@ class MEDIA_EXPORT VideoDecodeAccelerator }; // Interface for collaborating with picture interface to provide memory for - // output picture and blitting them. + // output picture and blitting them. These callbacks will not be made unless + // Initialize() has returned successfully. // This interface is extended by the various layers that relay messages back // to the plugin, through the PPP_VideoDecode_Dev interface the plugin // implements. class MEDIA_EXPORT Client { public: - // Callback to notify client that decoder has been initialized. - virtual void NotifyInitializeDone() = 0; - // Callback to tell client how many and what size of buffers to provide. virtual void ProvidePictureBuffers(uint32 requested_num_of_buffers, const gfx::Size& dimensions, @@ -74,7 +70,9 @@ class MEDIA_EXPORT VideoDecodeAccelerator // Reset completion callback. virtual void NotifyResetDone() = 0; - // Callback to notify about decoding errors. + // Callback to notify about decoding errors. Note that errors in + // Initialize() will not be reported here, but will instead be indicated by + // a false return value there. virtual void NotifyError(Error error) = 0; protected: @@ -83,16 +81,16 @@ class MEDIA_EXPORT VideoDecodeAccelerator // Video decoder functions. - // Initializes the video decoder with specific configuration. + // Initializes the video decoder with specific configuration. Called once per + // decoder construction. This call is synchronous and returns true iff + // initialization is successful. // Parameters: // |profile| is the video stream's format profile. // |client| is the client of this video decoder. The provided pointer must // be valid until Destroy() is called. - // - // Returns true when command successfully accepted. Otherwise false. virtual bool Initialize(VideoCodecProfile profile, Client* client) = 0; - // Decodes given bitstream buffer that contains at most one frame. Once + // Decodes given bitstream buffer that contains at most one frame. Once // decoder is done with processing |bitstream_buffer| it will call // NotifyEndOfBitstreamBuffer() with the bitstream buffer id. // Parameters: diff --git a/media/video/video_encode_accelerator.h b/media/video/video_encode_accelerator.h index 169d124486..fd934dde44 100644 --- a/media/video/video_encode_accelerator.h +++ b/media/video/video_encode_accelerator.h @@ -48,12 +48,10 @@ class MEDIA_EXPORT VideoEncodeAccelerator { kErrorMax = kPlatformFailureError }; - // Interface for clients that use VideoEncodeAccelerator. + // Interface for clients that use VideoEncodeAccelerator. These callbacks will + // not be made unless Initialize() has returned successfully. class MEDIA_EXPORT Client { public: - // Callback to notify client that encoder has been successfully initialized. - virtual void NotifyInitializeDone() = 0; - // Callback to tell the client what size of frames and buffers to provide // for input and output. The VEA disclaims use or ownership of all // previously provided buffers once this callback is made. @@ -83,7 +81,9 @@ class MEDIA_EXPORT VideoEncodeAccelerator { size_t payload_size, bool key_frame) = 0; - // Error notification callback. + // Error notification callback. Note that errors in Initialize() will not be + // reported here, but will instead be indicated by a false return value + // there. virtual void NotifyError(Error error) = 0; protected: @@ -94,8 +94,9 @@ class MEDIA_EXPORT VideoEncodeAccelerator { // Video encoder functions. - // Initialize the video encoder with a specific configuration. Called once - // per encoder construction. + // Initializes the video encoder with specific configuration. Called once per + // encoder construction. This call is synchronous and returns true iff + // initialization is successful. // Parameters: // |input_format| is the frame format of the input stream (as would be // reported by VideoFrame::format() for frames passed to Encode()). @@ -108,7 +109,7 @@ class MEDIA_EXPORT VideoEncodeAccelerator { // |client| is the client of this video encoder. The provided pointer must // be valid until Destroy() is called. // TODO(sheu): handle resolution changes. http://crbug.com/249944 - virtual void Initialize(VideoFrame::Format input_format, + virtual bool Initialize(VideoFrame::Format input_format, const gfx::Size& input_visible_size, VideoCodecProfile output_profile, uint32 initial_bitrate, diff --git a/media/video_capture_android_jni_headers.target.darwin-arm.mk b/media/video_capture_android_jni_headers.target.darwin-arm.mk index ecd56568c8..0d058de2f9 100644 --- a/media/video_capture_android_jni_headers.target.darwin-arm.mk +++ b/media/video_capture_android_jni_headers.target.darwin-arm.mk @@ -7,8 +7,9 @@ LOCAL_MODULE := media_video_capture_android_jni_headers_gyp LOCAL_MODULE_STEM := video_capture_android_jni_headers LOCAL_MODULE_SUFFIX := .stamp LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -23,8 +24,6 @@ $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h: export PATH := $(su $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/VideoCapture.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/VideoCapture.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_video_capture_android_jni_headers_gyp_rule_trigger -media_video_capture_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -33,10 +32,7 @@ $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/VideoCaptureFactory.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/VideoCaptureFactory.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_video_capture_android_jni_headers_gyp_rule_trigger -media_video_capture_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h -### Finished generating for all rules GYP_GENERATED_OUTPUTS := \ $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h \ @@ -47,8 +43,7 @@ LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTP LOCAL_GENERATED_SOURCES := \ $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h \ - $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h \ - media_video_capture_android_jni_headers_gyp_rule_trigger + $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h GYP_COPIED_SOURCE_ORIGIN_DIRS := @@ -239,6 +234,7 @@ video_capture_android_jni_headers: media_video_capture_android_jni_headers_gyp LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp LOCAL_UNINSTALLABLE_MODULE := true +LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_VAR_PREFIX) include $(BUILD_SYSTEM)/base_rules.mk @@ -246,3 +242,5 @@ $(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES) $(hide) echo "Gyp timestamp: $@" $(hide) mkdir -p $(dir $@) $(hide) touch $@ + +LOCAL_2ND_ARCH_VAR_PREFIX := diff --git a/media/video_capture_android_jni_headers.target.darwin-mips.mk b/media/video_capture_android_jni_headers.target.darwin-mips.mk index 9c0a492121..8f398df54a 100644 --- a/media/video_capture_android_jni_headers.target.darwin-mips.mk +++ b/media/video_capture_android_jni_headers.target.darwin-mips.mk @@ -7,8 +7,9 @@ LOCAL_MODULE := media_video_capture_android_jni_headers_gyp LOCAL_MODULE_STEM := video_capture_android_jni_headers LOCAL_MODULE_SUFFIX := .stamp LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -23,8 +24,6 @@ $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h: export PATH := $(su $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/VideoCapture.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/VideoCapture.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_video_capture_android_jni_headers_gyp_rule_trigger -media_video_capture_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -33,10 +32,7 @@ $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/VideoCaptureFactory.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/VideoCaptureFactory.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_video_capture_android_jni_headers_gyp_rule_trigger -media_video_capture_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h -### Finished generating for all rules GYP_GENERATED_OUTPUTS := \ $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h \ @@ -47,8 +43,7 @@ LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTP LOCAL_GENERATED_SOURCES := \ $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h \ - $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h \ - media_video_capture_android_jni_headers_gyp_rule_trigger + $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h GYP_COPIED_SOURCE_ORIGIN_DIRS := @@ -237,6 +232,7 @@ video_capture_android_jni_headers: media_video_capture_android_jni_headers_gyp LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp LOCAL_UNINSTALLABLE_MODULE := true +LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_VAR_PREFIX) include $(BUILD_SYSTEM)/base_rules.mk @@ -244,3 +240,5 @@ $(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES) $(hide) echo "Gyp timestamp: $@" $(hide) mkdir -p $(dir $@) $(hide) touch $@ + +LOCAL_2ND_ARCH_VAR_PREFIX := diff --git a/media/video_capture_android_jni_headers.target.darwin-x86.mk b/media/video_capture_android_jni_headers.target.darwin-x86.mk index 10a2117179..610d53930a 100644 --- a/media/video_capture_android_jni_headers.target.darwin-x86.mk +++ b/media/video_capture_android_jni_headers.target.darwin-x86.mk @@ -7,8 +7,9 @@ LOCAL_MODULE := media_video_capture_android_jni_headers_gyp LOCAL_MODULE_STEM := video_capture_android_jni_headers LOCAL_MODULE_SUFFIX := .stamp LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -23,8 +24,6 @@ $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h: export PATH := $(su $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/VideoCapture.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/VideoCapture.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_video_capture_android_jni_headers_gyp_rule_trigger -media_video_capture_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -33,10 +32,7 @@ $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/VideoCaptureFactory.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/VideoCaptureFactory.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_video_capture_android_jni_headers_gyp_rule_trigger -media_video_capture_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h -### Finished generating for all rules GYP_GENERATED_OUTPUTS := \ $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h \ @@ -47,8 +43,7 @@ LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTP LOCAL_GENERATED_SOURCES := \ $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h \ - $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h \ - media_video_capture_android_jni_headers_gyp_rule_trigger + $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h GYP_COPIED_SOURCE_ORIGIN_DIRS := @@ -239,6 +234,7 @@ video_capture_android_jni_headers: media_video_capture_android_jni_headers_gyp LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp LOCAL_UNINSTALLABLE_MODULE := true +LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_VAR_PREFIX) include $(BUILD_SYSTEM)/base_rules.mk @@ -246,3 +242,5 @@ $(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES) $(hide) echo "Gyp timestamp: $@" $(hide) mkdir -p $(dir $@) $(hide) touch $@ + +LOCAL_2ND_ARCH_VAR_PREFIX := diff --git a/media/video_capture_android_jni_headers.target.darwin-x86_64.mk b/media/video_capture_android_jni_headers.target.darwin-x86_64.mk index f4d2d27b53..16887bc8f9 100644 --- a/media/video_capture_android_jni_headers.target.darwin-x86_64.mk +++ b/media/video_capture_android_jni_headers.target.darwin-x86_64.mk @@ -7,8 +7,9 @@ LOCAL_MODULE := media_video_capture_android_jni_headers_gyp LOCAL_MODULE_STEM := video_capture_android_jni_headers LOCAL_MODULE_SUFFIX := .stamp LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -23,8 +24,6 @@ $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h: export PATH := $(su $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/VideoCapture.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/VideoCapture.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_video_capture_android_jni_headers_gyp_rule_trigger -media_video_capture_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -33,10 +32,7 @@ $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/VideoCaptureFactory.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/VideoCaptureFactory.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_video_capture_android_jni_headers_gyp_rule_trigger -media_video_capture_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h -### Finished generating for all rules GYP_GENERATED_OUTPUTS := \ $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h \ @@ -47,8 +43,7 @@ LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTP LOCAL_GENERATED_SOURCES := \ $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h \ - $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h \ - media_video_capture_android_jni_headers_gyp_rule_trigger + $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h GYP_COPIED_SOURCE_ORIGIN_DIRS := @@ -239,6 +234,7 @@ video_capture_android_jni_headers: media_video_capture_android_jni_headers_gyp LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp LOCAL_UNINSTALLABLE_MODULE := true +LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_VAR_PREFIX) include $(BUILD_SYSTEM)/base_rules.mk @@ -246,3 +242,5 @@ $(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES) $(hide) echo "Gyp timestamp: $@" $(hide) mkdir -p $(dir $@) $(hide) touch $@ + +LOCAL_2ND_ARCH_VAR_PREFIX := diff --git a/media/video_capture_android_jni_headers.target.linux-arm.mk b/media/video_capture_android_jni_headers.target.linux-arm.mk index ecd56568c8..0d058de2f9 100644 --- a/media/video_capture_android_jni_headers.target.linux-arm.mk +++ b/media/video_capture_android_jni_headers.target.linux-arm.mk @@ -7,8 +7,9 @@ LOCAL_MODULE := media_video_capture_android_jni_headers_gyp LOCAL_MODULE_STEM := video_capture_android_jni_headers LOCAL_MODULE_SUFFIX := .stamp LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -23,8 +24,6 @@ $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h: export PATH := $(su $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/VideoCapture.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/VideoCapture.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_video_capture_android_jni_headers_gyp_rule_trigger -media_video_capture_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -33,10 +32,7 @@ $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/VideoCaptureFactory.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/VideoCaptureFactory.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_video_capture_android_jni_headers_gyp_rule_trigger -media_video_capture_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h -### Finished generating for all rules GYP_GENERATED_OUTPUTS := \ $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h \ @@ -47,8 +43,7 @@ LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTP LOCAL_GENERATED_SOURCES := \ $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h \ - $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h \ - media_video_capture_android_jni_headers_gyp_rule_trigger + $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h GYP_COPIED_SOURCE_ORIGIN_DIRS := @@ -239,6 +234,7 @@ video_capture_android_jni_headers: media_video_capture_android_jni_headers_gyp LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp LOCAL_UNINSTALLABLE_MODULE := true +LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_VAR_PREFIX) include $(BUILD_SYSTEM)/base_rules.mk @@ -246,3 +242,5 @@ $(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES) $(hide) echo "Gyp timestamp: $@" $(hide) mkdir -p $(dir $@) $(hide) touch $@ + +LOCAL_2ND_ARCH_VAR_PREFIX := diff --git a/media/video_capture_android_jni_headers.target.linux-mips.mk b/media/video_capture_android_jni_headers.target.linux-mips.mk index 9c0a492121..8f398df54a 100644 --- a/media/video_capture_android_jni_headers.target.linux-mips.mk +++ b/media/video_capture_android_jni_headers.target.linux-mips.mk @@ -7,8 +7,9 @@ LOCAL_MODULE := media_video_capture_android_jni_headers_gyp LOCAL_MODULE_STEM := video_capture_android_jni_headers LOCAL_MODULE_SUFFIX := .stamp LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -23,8 +24,6 @@ $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h: export PATH := $(su $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/VideoCapture.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/VideoCapture.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_video_capture_android_jni_headers_gyp_rule_trigger -media_video_capture_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -33,10 +32,7 @@ $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/VideoCaptureFactory.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/VideoCaptureFactory.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_video_capture_android_jni_headers_gyp_rule_trigger -media_video_capture_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h -### Finished generating for all rules GYP_GENERATED_OUTPUTS := \ $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h \ @@ -47,8 +43,7 @@ LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTP LOCAL_GENERATED_SOURCES := \ $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h \ - $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h \ - media_video_capture_android_jni_headers_gyp_rule_trigger + $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h GYP_COPIED_SOURCE_ORIGIN_DIRS := @@ -237,6 +232,7 @@ video_capture_android_jni_headers: media_video_capture_android_jni_headers_gyp LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp LOCAL_UNINSTALLABLE_MODULE := true +LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_VAR_PREFIX) include $(BUILD_SYSTEM)/base_rules.mk @@ -244,3 +240,5 @@ $(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES) $(hide) echo "Gyp timestamp: $@" $(hide) mkdir -p $(dir $@) $(hide) touch $@ + +LOCAL_2ND_ARCH_VAR_PREFIX := diff --git a/media/video_capture_android_jni_headers.target.linux-x86.mk b/media/video_capture_android_jni_headers.target.linux-x86.mk index 10a2117179..610d53930a 100644 --- a/media/video_capture_android_jni_headers.target.linux-x86.mk +++ b/media/video_capture_android_jni_headers.target.linux-x86.mk @@ -7,8 +7,9 @@ LOCAL_MODULE := media_video_capture_android_jni_headers_gyp LOCAL_MODULE_STEM := video_capture_android_jni_headers LOCAL_MODULE_SUFFIX := .stamp LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -23,8 +24,6 @@ $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h: export PATH := $(su $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/VideoCapture.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/VideoCapture.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_video_capture_android_jni_headers_gyp_rule_trigger -media_video_capture_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -33,10 +32,7 @@ $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/VideoCaptureFactory.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/VideoCaptureFactory.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_video_capture_android_jni_headers_gyp_rule_trigger -media_video_capture_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h -### Finished generating for all rules GYP_GENERATED_OUTPUTS := \ $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h \ @@ -47,8 +43,7 @@ LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTP LOCAL_GENERATED_SOURCES := \ $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h \ - $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h \ - media_video_capture_android_jni_headers_gyp_rule_trigger + $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h GYP_COPIED_SOURCE_ORIGIN_DIRS := @@ -239,6 +234,7 @@ video_capture_android_jni_headers: media_video_capture_android_jni_headers_gyp LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp LOCAL_UNINSTALLABLE_MODULE := true +LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_VAR_PREFIX) include $(BUILD_SYSTEM)/base_rules.mk @@ -246,3 +242,5 @@ $(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES) $(hide) echo "Gyp timestamp: $@" $(hide) mkdir -p $(dir $@) $(hide) touch $@ + +LOCAL_2ND_ARCH_VAR_PREFIX := diff --git a/media/video_capture_android_jni_headers.target.linux-x86_64.mk b/media/video_capture_android_jni_headers.target.linux-x86_64.mk index f4d2d27b53..16887bc8f9 100644 --- a/media/video_capture_android_jni_headers.target.linux-x86_64.mk +++ b/media/video_capture_android_jni_headers.target.linux-x86_64.mk @@ -7,8 +7,9 @@ LOCAL_MODULE := media_video_capture_android_jni_headers_gyp LOCAL_MODULE_STEM := video_capture_android_jni_headers LOCAL_MODULE_SUFFIX := .stamp LOCAL_MODULE_TAGS := optional -gyp_intermediate_dir := $(call local-intermediates-dir) -gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared) +LOCAL_MODULE_TARGET_ARCH := $(TARGET_$(GYP_VAR_PREFIX)ARCH) +gyp_intermediate_dir := $(call local-intermediates-dir,,$(GYP_VAR_PREFIX)) +gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared,,,$(GYP_VAR_PREFIX)) # Make sure our deps are built first. GYP_TARGET_DEPENDENCIES := @@ -23,8 +24,6 @@ $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h: export PATH := $(su $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/VideoCapture.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/VideoCapture.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_video_capture_android_jni_headers_gyp_rule_trigger -media_video_capture_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: gyp_local_path := $(LOCAL_PATH) $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: gyp_intermediate_dir := $(abspath $(gyp_intermediate_dir)) @@ -33,10 +32,7 @@ $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: export PATH $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h: $(LOCAL_PATH)/media/base/android/java/src/org/chromium/media/VideoCaptureFactory.java $(LOCAL_PATH)/base/android/jni_generator/jni_generator.py $(LOCAL_PATH)/android_webview/build/jarjar-rules.txt $(GYP_TARGET_DEPENDENCIES) mkdir -p $(gyp_shared_intermediate_dir)/media/jni; cd $(gyp_local_path)/media; ../base/android/jni_generator/jni_generator.py --input_file base/android/java/src/org/chromium/media/VideoCaptureFactory.java --output_dir "$(gyp_shared_intermediate_dir)/media/jni" --includes base/android/jni_generator/jni_generator_helper.h --optimize_generation 0 --jarjar ../android_webview/build/jarjar-rules.txt --ptr_type long -.PHONY: media_video_capture_android_jni_headers_gyp_rule_trigger -media_video_capture_android_jni_headers_gyp_rule_trigger: $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h -### Finished generating for all rules GYP_GENERATED_OUTPUTS := \ $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h \ @@ -47,8 +43,7 @@ LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTP LOCAL_GENERATED_SOURCES := \ $(gyp_shared_intermediate_dir)/media/jni/VideoCapture_jni.h \ - $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h \ - media_video_capture_android_jni_headers_gyp_rule_trigger + $(gyp_shared_intermediate_dir)/media/jni/VideoCaptureFactory_jni.h GYP_COPIED_SOURCE_ORIGIN_DIRS := @@ -239,6 +234,7 @@ video_capture_android_jni_headers: media_video_capture_android_jni_headers_gyp LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp LOCAL_UNINSTALLABLE_MODULE := true +LOCAL_2ND_ARCH_VAR_PREFIX := $(GYP_VAR_PREFIX) include $(BUILD_SYSTEM)/base_rules.mk @@ -246,3 +242,5 @@ $(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES) $(hide) echo "Gyp timestamp: $@" $(hide) mkdir -p $(dir $@) $(hide) touch $@ + +LOCAL_2ND_ARCH_VAR_PREFIX := |