1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/logging.h" 6 #include "media/ffmpeg/ffmpeg_common.h" 7 #include "media/filters/ffmpeg_glue.h" 8 #include "testing/gtest/include/gtest/gtest.h" 9 10 namespace media { 11 12 class FFmpegCommonTest : public testing::Test { 13 public: 14 FFmpegCommonTest() { FFmpegGlue::InitializeFFmpeg(); } 15 virtual ~FFmpegCommonTest() {}; 16 }; 17 18 TEST_F(FFmpegCommonTest, OpusAudioDecoderConfig) { 19 AVCodecContext context = {0}; 20 context.codec_type = AVMEDIA_TYPE_AUDIO; 21 context.codec_id = AV_CODEC_ID_OPUS; 22 context.channel_layout = CHANNEL_LAYOUT_STEREO; 23 context.channels = 2; 24 context.sample_fmt = AV_SAMPLE_FMT_FLT; 25 26 // During conversion this sample rate should be changed to 48kHz. 27 context.sample_rate = 44100; 28 29 AudioDecoderConfig decoder_config; 30 AVCodecContextToAudioDecoderConfig(&context, false, &decoder_config, false); 31 EXPECT_EQ(48000, decoder_config.samples_per_second()); 32 } 33 34 TEST_F(FFmpegCommonTest, TimeBaseConversions) { 35 const int64 test_data[][5] = { 36 {1, 2, 1, 500000, 1 }, 37 {1, 3, 1, 333333, 1 }, 38 {1, 3, 2, 666667, 2 }, 39 }; 40 41 for (size_t i = 0; i < arraysize(test_data); ++i) { 42 SCOPED_TRACE(i); 43 44 AVRational time_base; 45 time_base.num = static_cast<int>(test_data[i][0]); 46 time_base.den = static_cast<int>(test_data[i][1]); 47 48 base::TimeDelta time_delta = 49 ConvertFromTimeBase(time_base, test_data[i][2]); 50 51 EXPECT_EQ(time_delta.InMicroseconds(), test_data[i][3]); 52 EXPECT_EQ(ConvertToTimeBase(time_base, time_delta), test_data[i][4]); 53 } 54 } 55 56 TEST_F(FFmpegCommonTest, VerifyFormatSizes) { 57 for (AVSampleFormat format = AV_SAMPLE_FMT_NONE; 58 format < AV_SAMPLE_FMT_NB; 59 format = static_cast<AVSampleFormat>(format + 1)) { 60 SampleFormat sample_format = AVSampleFormatToSampleFormat(format); 61 if (sample_format == kUnknownSampleFormat) { 62 // This format not supported, so skip it. 63 continue; 64 } 65 66 // Have FFMpeg compute the size of a buffer of 1 channel / 1 frame 67 // with 1 byte alignment to make sure the sizes match. 68 int single_buffer_size = av_samples_get_buffer_size(NULL, 1, 1, format, 1); 69 int bytes_per_channel = SampleFormatToBytesPerChannel(sample_format); 70 EXPECT_EQ(bytes_per_channel, single_buffer_size); 71 } 72 } 73 74 TEST_F(FFmpegCommonTest, UTCDateToTime_Valid) { 75 base::Time result; 76 EXPECT_TRUE(FFmpegUTCDateToTime("2012-11-10 12:34:56", &result)); 77 78 base::Time::Exploded exploded; 79 result.UTCExplode(&exploded); 80 EXPECT_TRUE(exploded.HasValidValues()); 81 EXPECT_EQ(2012, exploded.year); 82 EXPECT_EQ(11, exploded.month); 83 EXPECT_EQ(6, exploded.day_of_week); 84 EXPECT_EQ(10, exploded.day_of_month); 85 EXPECT_EQ(12, exploded.hour); 86 EXPECT_EQ(34, exploded.minute); 87 EXPECT_EQ(56, exploded.second); 88 EXPECT_EQ(0, exploded.millisecond); 89 } 90 91 TEST_F(FFmpegCommonTest, UTCDateToTime_Invalid) { 92 const char* invalid_date_strings[] = { 93 "", 94 "2012-11-10", 95 "12:34:56", 96 "-- ::", 97 "2012-11-10 12:34:", 98 "2012-11-10 12::56", 99 "2012-11-10 :34:56", 100 "2012-11- 12:34:56", 101 "2012--10 12:34:56", 102 "-11-10 12:34:56", 103 "2012-11 12:34:56", 104 "2012-11-10-12 12:34:56", 105 "2012-11-10 12:34", 106 "2012-11-10 12:34:56:78", 107 "ABCD-11-10 12:34:56", 108 "2012-EF-10 12:34:56", 109 "2012-11-GH 12:34:56", 110 "2012-11-10 IJ:34:56", 111 "2012-11-10 12:JL:56", 112 "2012-11-10 12:34:MN", 113 "2012-11-10 12:34:56.123", 114 "2012-11-1012:34:56", 115 "2012-11-10 12:34:56 UTC", 116 }; 117 118 for (size_t i = 0; i < arraysize(invalid_date_strings); ++i) { 119 const char* date_string = invalid_date_strings[i]; 120 base::Time result; 121 EXPECT_FALSE(FFmpegUTCDateToTime(date_string, &result)) 122 << "date_string '" << date_string << "'"; 123 EXPECT_TRUE(result.is_null()); 124 } 125 } 126 127 } // namespace media 128