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

Side by Side Diff: media/filters/ffmpeg_glue_unittest.cc

Issue 2819863003: Only run container name detection upon ffmpeg parse failure. (Closed)
Patch Set: Created 3 years, 8 months 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "media/filters/ffmpeg_glue.h" 5 #include "media/filters/ffmpeg_glue.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <memory> 9 #include <memory>
10 10
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/macros.h" 12 #include "base/macros.h"
13 #include "base/test/histogram_tester.h"
14 #include "media/base/container_names.h"
13 #include "media/base/mock_filters.h" 15 #include "media/base/mock_filters.h"
14 #include "media/base/test_data_util.h" 16 #include "media/base/test_data_util.h"
15 #include "media/ffmpeg/ffmpeg_common.h" 17 #include "media/ffmpeg/ffmpeg_common.h"
16 #include "media/ffmpeg/ffmpeg_deleters.h" 18 #include "media/ffmpeg/ffmpeg_deleters.h"
17 #include "media/filters/in_memory_url_protocol.h" 19 #include "media/filters/in_memory_url_protocol.h"
18 #include "testing/gtest/include/gtest/gtest.h" 20 #include "testing/gtest/include/gtest/gtest.h"
19 21
20 using ::testing::_; 22 using ::testing::_;
21 using ::testing::DoAll; 23 using ::testing::DoAll;
22 using ::testing::InSequence; 24 using ::testing::InSequence;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 ~FFmpegGlueTest() override { 56 ~FFmpegGlueTest() override {
55 // Ensure |glue_| and |protocol_| are still alive. 57 // Ensure |glue_| and |protocol_| are still alive.
56 CHECK(glue_.get()); 58 CHECK(glue_.get());
57 CHECK(protocol_.get()); 59 CHECK(protocol_.get());
58 60
59 // |protocol_| should outlive |glue_|, so ensure it's destructed first. 61 // |protocol_| should outlive |glue_|, so ensure it's destructed first.
60 glue_.reset(); 62 glue_.reset();
61 } 63 }
62 64
63 int ReadPacket(int size, uint8_t* data) { 65 int ReadPacket(int size, uint8_t* data) {
64 return glue_->format_context()->pb->read_packet( 66 return glue_->format_context()->pb->read_packet(protocol_.get(), data,
65 protocol_.get(), data, size); 67 size);
66 } 68 }
67 69
68 int64_t Seek(int64_t offset, int whence) { 70 int64_t Seek(int64_t offset, int whence) {
69 return glue_->format_context()->pb->seek(protocol_.get(), offset, whence); 71 return glue_->format_context()->pb->seek(protocol_.get(), offset, whence);
70 } 72 }
71 73
72 protected: 74 protected:
73 std::unique_ptr<FFmpegGlue> glue_; 75 std::unique_ptr<FFmpegGlue> glue_;
74 std::unique_ptr<StrictMock<MockProtocol>> protocol_; 76 std::unique_ptr<StrictMock<MockProtocol>> protocol_;
75 77
(...skipping 30 matching lines...) Expand all
106 protected: 108 protected:
107 std::unique_ptr<FFmpegGlue> glue_; 109 std::unique_ptr<FFmpegGlue> glue_;
108 110
109 private: 111 private:
110 std::unique_ptr<InMemoryUrlProtocol> protocol_; 112 std::unique_ptr<InMemoryUrlProtocol> protocol_;
111 scoped_refptr<DecoderBuffer> data_; 113 scoped_refptr<DecoderBuffer> data_;
112 114
113 DISALLOW_COPY_AND_ASSIGN(FFmpegGlueDestructionTest); 115 DISALLOW_COPY_AND_ASSIGN(FFmpegGlueDestructionTest);
114 }; 116 };
115 117
118 // Tests that ensure we are using the correct AVInputFormat name given by ffmpeg
119 // for supported containers.
120 class FFmpegGlueContainerTest : public FFmpegGlueDestructionTest {
121 public:
122 FFmpegGlueContainerTest() {}
123 ~FFmpegGlueContainerTest() override {}
124
125 protected:
126 void InitializeAndOpen(const char* filename) {
127 Initialize(filename);
128 ASSERT_TRUE(glue_->OpenContext());
129 }
130
131 void ExpectContainer(container_names::MediaContainerName container) {
132 histogram_tester_.ExpectUniqueSample("Media.DetectedContainer", container,
133 1);
134 }
135
136 private:
137 base::HistogramTester histogram_tester_;
138 DISALLOW_COPY_AND_ASSIGN(FFmpegGlueContainerTest);
139 };
140
116 // Ensure writing has been disabled. 141 // Ensure writing has been disabled.
117 TEST_F(FFmpegGlueTest, Write) { 142 TEST_F(FFmpegGlueTest, Write) {
118 ASSERT_FALSE(glue_->format_context()->pb->write_packet); 143 ASSERT_FALSE(glue_->format_context()->pb->write_packet);
119 ASSERT_FALSE(glue_->format_context()->pb->write_flag); 144 ASSERT_FALSE(glue_->format_context()->pb->write_flag);
120 } 145 }
121 146
122 // Test both successful and unsuccessful reads pass through correctly. 147 // Test both successful and unsuccessful reads pass through correctly.
123 TEST_F(FFmpegGlueTest, Read) { 148 TEST_F(FFmpegGlueTest, Read) {
124 const int kBufferSize = 16; 149 const int kBufferSize = 16;
125 uint8_t buffer[kBufferSize]; 150 uint8_t buffer[kBufferSize];
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
246 // and ordering to ensure |context| is destructed before |glue_|. 271 // and ordering to ensure |context| is destructed before |glue_|.
247 // Pick the audio stream (1) so this works when the ffmpeg video decoders are 272 // Pick the audio stream (1) so this works when the ffmpeg video decoders are
248 // disabled. 273 // disabled.
249 std::unique_ptr<AVCodecContext, ScopedPtrAVFreeContext> context( 274 std::unique_ptr<AVCodecContext, ScopedPtrAVFreeContext> context(
250 AVStreamToAVCodecContext(glue_->format_context()->streams[1])); 275 AVStreamToAVCodecContext(glue_->format_context()->streams[1]));
251 ASSERT_NE(nullptr, context.get()); 276 ASSERT_NE(nullptr, context.get());
252 ASSERT_EQ(0, avcodec_open2(context.get(), 277 ASSERT_EQ(0, avcodec_open2(context.get(),
253 avcodec_find_decoder(context->codec_id), nullptr)); 278 avcodec_find_decoder(context->codec_id), nullptr));
254 } 279 }
255 280
281 TEST_F(FFmpegGlueContainerTest, OGG) {
282 InitializeAndOpen("sfx.ogg");
283 ExpectContainer(container_names::CONTAINER_OGG);
284 }
285
286 TEST_F(FFmpegGlueContainerTest, WEBM) {
287 InitializeAndOpen("sfx-opus-441.webm");
288 ExpectContainer(container_names::CONTAINER_WEBM);
289 }
290
291 TEST_F(FFmpegGlueContainerTest, FLAC) {
292 InitializeAndOpen("sfx.flac");
293 ExpectContainer(container_names::CONTAINER_FLAC);
294 }
295
296 TEST_F(FFmpegGlueContainerTest, WAV) {
297 InitializeAndOpen("sfx_s16le.wav");
298 ExpectContainer(container_names::CONTAINER_WAV);
299 }
300
301 #if BUILDFLAG(USE_PROPRIETARY_CODECS)
302 TEST_F(FFmpegGlueContainerTest, MOV) {
303 InitializeAndOpen("sfx.m4a");
304 ExpectContainer(container_names::CONTAINER_MOV);
305 }
306
307 TEST_F(FFmpegGlueContainerTest, MP3) {
308 InitializeAndOpen("sfx.mp3");
309 ExpectContainer(container_names::CONTAINER_MP3);
310 }
311
312 TEST_F(FFmpegGlueContainerTest, AAC) {
313 InitializeAndOpen("sfx.adts");
314 ExpectContainer(container_names::CONTAINER_AAC);
315 }
316
317 #if defined(OS_CHROMEOS)
318 TEST_F(FFmpegGlueContainerTest, AVI) {
319 InitializeAndOpen("bear.avi");
320 ExpectContainer(container_names::CONTAINER_AVI);
321 }
322
323 TEST_F(FFmpegGlueContainerTest, AMR) {
324 InitializeAndOpen("bear.amr");
325 ExpectContainer(container_names::CONTAINER_AMR);
326 }
327 #endif // defined(OS_CHROMEOS)
328 #endif // BUILDFLAG(USE_PROPRIETARY_CODECS)
329
330 // Probe something unsupported to ensure we fall back to the our internal guess.
331 TEST_F(FFmpegGlueContainerTest, FLV) {
332 Initialize("bear.flv");
333 ASSERT_FALSE(glue_->OpenContext());
334 ExpectContainer(container_names::CONTAINER_FLV);
335 }
336
256 } // namespace media 337 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698