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 |