Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(300)

Side by Side Diff: media/base/android/media_codec_bridge_unittest.cc

Issue 74563002: AndroidVideoEncodeAccelerator is born! (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « media/base/android/media_codec_bridge.cc ('k') | media/base/android/media_decoder_job.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <string> 5 #include <string>
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "media/base/android/media_codec_bridge.h" 10 #include "media/base/android/media_codec_bridge.h"
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 104
105 static const int kPresentationTimeBase = 100; 105 static const int kPresentationTimeBase = 100;
106 106
107 static inline const base::TimeDelta InfiniteTimeOut() { 107 static inline const base::TimeDelta InfiniteTimeOut() {
108 return base::TimeDelta::FromMicroseconds(-1); 108 return base::TimeDelta::FromMicroseconds(-1);
109 } 109 }
110 110
111 void DecodeMediaFrame( 111 void DecodeMediaFrame(
112 VideoCodecBridge* media_codec, const uint8* data, size_t data_size, 112 VideoCodecBridge* media_codec, const uint8* data, size_t data_size,
113 const base::TimeDelta input_presentation_timestamp, 113 const base::TimeDelta input_presentation_timestamp,
114 const base::TimeDelta initial_timestamp_lower_bound) { 114 const base::TimeDelta initial_timestamp_lower_bound,
115 bool expected_key_frame) {
115 base::TimeDelta input_pts = input_presentation_timestamp; 116 base::TimeDelta input_pts = input_presentation_timestamp;
116 base::TimeDelta timestamp = initial_timestamp_lower_bound; 117 base::TimeDelta timestamp = initial_timestamp_lower_bound;
117 base::TimeDelta new_timestamp; 118 base::TimeDelta new_timestamp;
118 for (int i = 0; i < 10; ++i) { 119 for (int i = 0; i < 10; ++i) {
119 int input_buf_index = -1; 120 int input_buf_index = -1;
120 MediaCodecStatus status = 121 MediaCodecStatus status =
121 media_codec->DequeueInputBuffer(InfiniteTimeOut(), &input_buf_index); 122 media_codec->DequeueInputBuffer(InfiniteTimeOut(), &input_buf_index);
122 ASSERT_EQ(MEDIA_CODEC_OK, status); 123 ASSERT_EQ(MEDIA_CODEC_OK, status);
123 124
124 media_codec->QueueInputBuffer( 125 media_codec->QueueInputBuffer(
125 input_buf_index, data, data_size, input_presentation_timestamp); 126 input_buf_index, data, data_size, input_presentation_timestamp);
126 127
127 size_t unused_offset = 0; 128 size_t unused_offset = 0;
128 size_t size = 0; 129 size_t size = 0;
129 bool eos = false; 130 bool eos = false;
130 int output_buf_index = -1; 131 int output_buf_index = -1;
132 bool key_frame = false;
131 status = media_codec->DequeueOutputBuffer(InfiniteTimeOut(), 133 status = media_codec->DequeueOutputBuffer(InfiniteTimeOut(),
132 &output_buf_index, &unused_offset, &size, &new_timestamp, &eos); 134 &output_buf_index,
135 &unused_offset,
136 &size,
137 &new_timestamp,
138 &eos,
139 &key_frame);
133 140
134 if (status == MEDIA_CODEC_OK && output_buf_index > 0) 141 if (status == MEDIA_CODEC_OK && output_buf_index > 0) {
135 media_codec->ReleaseOutputBuffer(output_buf_index, false); 142 media_codec->ReleaseOutputBuffer(output_buf_index, false);
143 ASSERT_EQ(expected_key_frame, key_frame);
144 }
136 // Output time stamp should not be smaller than old timestamp. 145 // Output time stamp should not be smaller than old timestamp.
137 ASSERT_TRUE(new_timestamp >= timestamp); 146 ASSERT_TRUE(new_timestamp >= timestamp);
138 input_pts += base::TimeDelta::FromMicroseconds(33000); 147 input_pts += base::TimeDelta::FromMicroseconds(33000);
139 timestamp = new_timestamp; 148 timestamp = new_timestamp;
140 } 149 }
141 } 150 }
142 151
143 TEST(MediaCodecBridgeTest, Initialize) { 152 TEST(MediaCodecBridgeTest, Initialize) {
144 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); 153 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
145 154
146 scoped_ptr<media::MediaCodecBridge> media_codec; 155 scoped_ptr<media::MediaCodecBridge> media_codec;
147 media_codec.reset(VideoCodecBridge::Create(kCodecH264, false)); 156 media_codec.reset(VideoCodecBridge::CreateDecoder(
157 kCodecH264, false, gfx::Size(640, 480), NULL, NULL));
148 } 158 }
149 159
150 TEST(MediaCodecBridgeTest, DoNormal) { 160 TEST(MediaCodecBridgeTest, DoNormal) {
151 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); 161 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
152 162
153 scoped_ptr<media::AudioCodecBridge> media_codec; 163 scoped_ptr<media::AudioCodecBridge> media_codec;
154 media_codec.reset(AudioCodecBridge::Create(kCodecMP3)); 164 media_codec.reset(AudioCodecBridge::Create(kCodecMP3));
155 165
156 ASSERT_TRUE(media_codec->Start(kCodecMP3, 44100, 2, NULL, 0, false, NULL)); 166 ASSERT_TRUE(media_codec->Start(kCodecMP3, 44100, 2, NULL, 0, false, NULL));
157 167
158 int input_buf_index = -1; 168 int input_buf_index = -1;
159 MediaCodecStatus status = 169 MediaCodecStatus status =
160 media_codec->DequeueInputBuffer(InfiniteTimeOut(), &input_buf_index); 170 media_codec->DequeueInputBuffer(InfiniteTimeOut(), &input_buf_index);
161 ASSERT_EQ(MEDIA_CODEC_OK, status); 171 ASSERT_EQ(MEDIA_CODEC_OK, status);
162 ASSERT_GE(input_buf_index, 0); 172 ASSERT_GE(input_buf_index, 0);
163 173
164 int64 input_pts = kPresentationTimeBase; 174 int64 input_pts = kPresentationTimeBase;
165 media_codec->QueueInputBuffer( 175 media_codec->QueueInputBuffer(input_buf_index,
166 input_buf_index, test_mp3, sizeof(test_mp3), 176 test_mp3,
167 base::TimeDelta::FromMicroseconds(++input_pts)); 177 sizeof(test_mp3),
178 base::TimeDelta::FromMicroseconds(++input_pts));
168 179
169 status = media_codec->DequeueInputBuffer(InfiniteTimeOut(), &input_buf_index); 180 status = media_codec->DequeueInputBuffer(InfiniteTimeOut(), &input_buf_index);
170 media_codec->QueueInputBuffer( 181 media_codec->QueueInputBuffer(
171 input_buf_index, test_mp3, sizeof(test_mp3), 182 input_buf_index, test_mp3, sizeof(test_mp3),
172 base::TimeDelta::FromMicroseconds(++input_pts)); 183 base::TimeDelta::FromMicroseconds(++input_pts));
173 184
174 status = media_codec->DequeueInputBuffer(InfiniteTimeOut(), &input_buf_index); 185 status = media_codec->DequeueInputBuffer(InfiniteTimeOut(), &input_buf_index);
175 media_codec->QueueEOS(input_buf_index); 186 media_codec->QueueEOS(input_buf_index);
176 187
177 input_pts = kPresentationTimeBase; 188 input_pts = kPresentationTimeBase;
178 bool eos = false; 189 bool eos = false;
179 while (!eos) { 190 while (!eos) {
180 size_t unused_offset = 0; 191 size_t unused_offset = 0;
181 size_t size = 0; 192 size_t size = 0;
182 base::TimeDelta timestamp; 193 base::TimeDelta timestamp;
183 int output_buf_index = -1; 194 int output_buf_index = -1;
184 status = media_codec->DequeueOutputBuffer(InfiniteTimeOut(), 195 status = media_codec->DequeueOutputBuffer(InfiniteTimeOut(),
185 &output_buf_index, &unused_offset, &size, &timestamp, &eos); 196 &output_buf_index,
197 &unused_offset,
198 &size,
199 &timestamp,
200 &eos,
201 NULL);
186 switch (status) { 202 switch (status) {
187 case MEDIA_CODEC_DEQUEUE_OUTPUT_AGAIN_LATER: 203 case MEDIA_CODEC_DEQUEUE_OUTPUT_AGAIN_LATER:
188 FAIL(); 204 FAIL();
189 return; 205 return;
190 206
191 case MEDIA_CODEC_OUTPUT_FORMAT_CHANGED: 207 case MEDIA_CODEC_OUTPUT_FORMAT_CHANGED:
192 continue; 208 continue;
193 209
194 case MEDIA_CODEC_OUTPUT_BUFFERS_CHANGED: 210 case MEDIA_CODEC_OUTPUT_BUFFERS_CHANGED:
195 ASSERT_TRUE(media_codec->GetOutputBuffers()); 211 ASSERT_TRUE(media_codec->GetOutputBuffers());
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 very_large_header[i] = 0xff; 248 very_large_header[i] = 0xff;
233 very_large_header[large_size - 1] = 0xfe; 249 very_large_header[large_size - 1] = 0xfe;
234 EXPECT_FALSE(media_codec->Start( 250 EXPECT_FALSE(media_codec->Start(
235 kCodecVorbis, 44100, 2, very_large_header, 0x80000000, false, NULL)); 251 kCodecVorbis, 44100, 2, very_large_header, 0x80000000, false, NULL));
236 delete[] very_large_header; 252 delete[] very_large_header;
237 } 253 }
238 254
239 TEST(MediaCodecBridgeTest, PresentationTimestampsDoNotDecrease) { 255 TEST(MediaCodecBridgeTest, PresentationTimestampsDoNotDecrease) {
240 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE(); 256 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
241 257
242 scoped_ptr<VideoCodecBridge> media_codec; 258 scoped_ptr<VideoCodecBridge> media_codec(VideoCodecBridge::CreateDecoder(
243 media_codec.reset(VideoCodecBridge::Create(kCodecVP8, false)); 259 kCodecVP8, false, gfx::Size(320, 240), NULL, NULL));
244 EXPECT_TRUE(media_codec->Start( 260 EXPECT_TRUE(media_codec.get());
245 kCodecVP8, gfx::Size(320, 240), NULL, NULL));
246 scoped_refptr<DecoderBuffer> buffer = 261 scoped_refptr<DecoderBuffer> buffer =
247 ReadTestDataFile("vp8-I-frame-320x240"); 262 ReadTestDataFile("vp8-I-frame-320x240");
248 DecodeMediaFrame( 263 DecodeMediaFrame(media_codec.get(),
249 media_codec.get(), buffer->data(), buffer->data_size(), 264 buffer->data(),
250 base::TimeDelta(), base::TimeDelta()); 265 buffer->data_size(),
266 base::TimeDelta(),
267 base::TimeDelta(),
268 true);
251 269
252 // Simulate a seek to 10 seconds, and each chunk has 2 I-frames. 270 // Simulate a seek to 10 seconds, and each chunk has 2 I-frames.
253 std::vector<uint8> chunk(buffer->data(), 271 std::vector<uint8> chunk(buffer->data(),
254 buffer->data() + buffer->data_size()); 272 buffer->data() + buffer->data_size());
255 chunk.insert(chunk.end(), buffer->data(), 273 chunk.insert(chunk.end(), buffer->data(),
256 buffer->data() + buffer->data_size()); 274 buffer->data() + buffer->data_size());
257 media_codec->Reset(); 275 media_codec->Reset();
258 DecodeMediaFrame(media_codec.get(), &chunk[0], chunk.size(), 276 DecodeMediaFrame(media_codec.get(),
277 &chunk[0],
278 chunk.size(),
259 base::TimeDelta::FromMicroseconds(10000000), 279 base::TimeDelta::FromMicroseconds(10000000),
260 base::TimeDelta::FromMicroseconds(9900000)); 280 base::TimeDelta::FromMicroseconds(9900000),
281 true);
261 282
262 // Simulate a seek to 5 seconds. 283 // Simulate a seek to 5 seconds.
263 media_codec->Reset(); 284 media_codec->Reset();
264 DecodeMediaFrame(media_codec.get(), &chunk[0], chunk.size(), 285 DecodeMediaFrame(media_codec.get(),
286 &chunk[0],
287 chunk.size(),
265 base::TimeDelta::FromMicroseconds(5000000), 288 base::TimeDelta::FromMicroseconds(5000000),
266 base::TimeDelta::FromMicroseconds(4900000)); 289 base::TimeDelta::FromMicroseconds(4900000),
290 true);
267 } 291 }
268 292
269 TEST(MediaCodecBridgeTest, CreateUnsupportedCodec) { 293 TEST(MediaCodecBridgeTest, CreateUnsupportedCodec) {
270 EXPECT_EQ(NULL, AudioCodecBridge::Create(kUnknownAudioCodec)); 294 EXPECT_EQ(NULL, AudioCodecBridge::Create(kUnknownAudioCodec));
271 EXPECT_EQ(NULL, VideoCodecBridge::Create(kUnknownVideoCodec, false)); 295 EXPECT_EQ(
296 NULL,
297 VideoCodecBridge::CreateDecoder(
298 kUnknownVideoCodec, false, gfx::Size(320, 240), NULL, NULL));
272 } 299 }
273 300
274 } // namespace media 301 } // namespace media
OLDNEW
« no previous file with comments | « media/base/android/media_codec_bridge.cc ('k') | media/base/android/media_decoder_job.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698