| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/bind.h" | 5 #include "base/bind.h" |
| 6 #include "base/logging.h" | 6 #include "base/logging.h" |
| 7 #include "base/thread_task_runner_handle.h" | 7 #include "base/thread_task_runner_handle.h" |
| 8 #include "base/timer/timer.h" | 8 #include "base/timer/timer.h" |
| 9 #include "media/base/android/media_codec_audio_decoder.h" | 9 #include "media/base/android/media_codec_audio_decoder.h" |
| 10 #include "media/base/android/media_codec_bridge.h" | 10 #include "media/base/android/media_codec_bridge.h" |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 | 26 |
| 27 namespace { | 27 namespace { |
| 28 | 28 |
| 29 const base::TimeDelta kDefaultTimeout = base::TimeDelta::FromMilliseconds(200); | 29 const base::TimeDelta kDefaultTimeout = base::TimeDelta::FromMilliseconds(200); |
| 30 const base::TimeDelta kAudioFramePeriod = base::TimeDelta::FromMilliseconds(20); | 30 const base::TimeDelta kAudioFramePeriod = base::TimeDelta::FromMilliseconds(20); |
| 31 const base::TimeDelta kVideoFramePeriod = base::TimeDelta::FromMilliseconds(20); | 31 const base::TimeDelta kVideoFramePeriod = base::TimeDelta::FromMilliseconds(20); |
| 32 | 32 |
| 33 class AudioFactory : public TestDataFactory { | 33 class AudioFactory : public TestDataFactory { |
| 34 public: | 34 public: |
| 35 AudioFactory(const base::TimeDelta& duration); | 35 AudioFactory(const base::TimeDelta& duration); |
| 36 DemuxerConfigs GetConfigs() override; | 36 DemuxerConfigs GetConfigs() const override; |
| 37 | 37 |
| 38 protected: | 38 protected: |
| 39 void ModifyAccessUnit(int index_in_chunk, AccessUnit* unit) override; | 39 void ModifyAccessUnit(int index_in_chunk, AccessUnit* unit) override; |
| 40 }; | 40 }; |
| 41 | 41 |
| 42 class VideoFactory : public TestDataFactory { | 42 class VideoFactory : public TestDataFactory { |
| 43 public: | 43 public: |
| 44 VideoFactory(const base::TimeDelta& duration); | 44 VideoFactory(const base::TimeDelta& duration); |
| 45 DemuxerConfigs GetConfigs() override; | 45 DemuxerConfigs GetConfigs() const override; |
| 46 | 46 |
| 47 protected: | 47 protected: |
| 48 void ModifyAccessUnit(int index_in_chunk, AccessUnit* unit) override; | 48 void ModifyAccessUnit(int index_in_chunk, AccessUnit* unit) override; |
| 49 }; | 49 }; |
| 50 | 50 |
| 51 AudioFactory::AudioFactory(const base::TimeDelta& duration) | 51 AudioFactory::AudioFactory(const base::TimeDelta& duration) |
| 52 : TestDataFactory("vorbis-packet-%d", duration, kAudioFramePeriod) { | 52 : TestDataFactory("vorbis-packet-%d", duration, kAudioFramePeriod) { |
| 53 } | 53 } |
| 54 | 54 |
| 55 DemuxerConfigs AudioFactory::GetConfigs() { | 55 DemuxerConfigs AudioFactory::GetConfigs() const { |
| 56 return TestDataFactory::CreateAudioConfigs(kCodecVorbis, duration_); | 56 return TestDataFactory::CreateAudioConfigs(kCodecVorbis, duration_); |
| 57 } | 57 } |
| 58 | 58 |
| 59 void AudioFactory::ModifyAccessUnit(int index_in_chunk, AccessUnit* unit) { | 59 void AudioFactory::ModifyAccessUnit(int index_in_chunk, AccessUnit* unit) { |
| 60 // Vorbis needs 4 extra bytes padding on Android to decode properly. Check | 60 // Vorbis needs 4 extra bytes padding on Android to decode properly. Check |
| 61 // NuMediaExtractor.cpp in Android source code. | 61 // NuMediaExtractor.cpp in Android source code. |
| 62 uint8 padding[4] = {0xff, 0xff, 0xff, 0xff}; | 62 uint8 padding[4] = {0xff, 0xff, 0xff, 0xff}; |
| 63 unit->data.insert(unit->data.end(), padding, padding + 4); | 63 unit->data.insert(unit->data.end(), padding, padding + 4); |
| 64 } | 64 } |
| 65 | 65 |
| 66 VideoFactory::VideoFactory(const base::TimeDelta& duration) | 66 VideoFactory::VideoFactory(const base::TimeDelta& duration) |
| 67 : TestDataFactory("h264-320x180-frame-%d", duration, kVideoFramePeriod) { | 67 : TestDataFactory("h264-320x180-frame-%d", duration, kVideoFramePeriod) { |
| 68 } | 68 } |
| 69 | 69 |
| 70 DemuxerConfigs VideoFactory::GetConfigs() { | 70 DemuxerConfigs VideoFactory::GetConfigs() const { |
| 71 return TestDataFactory::CreateVideoConfigs(kCodecH264, duration_, | 71 return TestDataFactory::CreateVideoConfigs(kCodecH264, duration_, |
| 72 gfx::Size(320, 180)); | 72 gfx::Size(320, 180)); |
| 73 } | 73 } |
| 74 | 74 |
| 75 void VideoFactory::ModifyAccessUnit(int index_in_chunk, AccessUnit* unit) { | 75 void VideoFactory::ModifyAccessUnit(int index_in_chunk, AccessUnit* unit) { |
| 76 // The frames are taken from High profile and some are B-frames. | 76 // The frames are taken from High profile and some are B-frames. |
| 77 // The first 4 frames appear in the file in the following order: | 77 // The first 4 frames appear in the file in the following order: |
| 78 // | 78 // |
| 79 // Frames: I P B P | 79 // Frames: I P B P |
| 80 // Decoding order: 0 1 2 3 | 80 // Decoding order: 0 1 2 3 |
| (...skipping 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 513 timeout)); | 513 timeout)); |
| 514 | 514 |
| 515 EXPECT_TRUE(decoder_->IsStopped()); | 515 EXPECT_TRUE(decoder_->IsStopped()); |
| 516 EXPECT_TRUE(decoder_->IsCompleted()); | 516 EXPECT_TRUE(decoder_->IsCompleted()); |
| 517 | 517 |
| 518 EXPECT_EQ(26, pts_stat_.num_values()); | 518 EXPECT_EQ(26, pts_stat_.num_values()); |
| 519 EXPECT_EQ(data_factory_->last_pts(), pts_stat_.max()); | 519 EXPECT_EQ(data_factory_->last_pts(), pts_stat_.max()); |
| 520 } | 520 } |
| 521 | 521 |
| 522 } // namespace media | 522 } // namespace media |
| OLD | NEW |