15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/ffmpeg/ffmpeg_common.h" 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "media/filters/ffmpeg_glue.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FFmpegCommonTest : public testing::Test { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FFmpegCommonTest() { FFmpegGlue::InitializeFFmpeg(); } 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual ~FFmpegCommonTest() {}; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(FFmpegCommonTest, OpusAudioDecoderConfig) { 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AVCodecContext context = {0}; 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch context.codec_type = AVMEDIA_TYPE_AUDIO; 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch context.codec_id = AV_CODEC_ID_OPUS; 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch context.channel_layout = CHANNEL_LAYOUT_STEREO; 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch context.channels = 2; 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch context.sample_fmt = AV_SAMPLE_FMT_FLT; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // During conversion this sample rate should be changed to 48kHz. 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch context.sample_rate = 44100; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AudioDecoderConfig decoder_config; 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch AVCodecContextToAudioDecoderConfig(&context, false, &decoder_config, false); 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_EQ(48000, decoder_config.samples_per_second()); 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(FFmpegCommonTest, TimeBaseConversions) { 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const int64 test_data[][5] = { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {1, 2, 1, 500000, 1 }, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {1, 3, 1, 333333, 1 }, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {1, 3, 2, 666667, 2 }, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(test_data); ++i) { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE(i); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AVRational time_base; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_base.num = static_cast<int>(test_data[i][0]); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_base.den = static_cast<int>(test_data[i][1]); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::TimeDelta time_delta = 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ConvertFromTimeBase(time_base, test_data[i][2]); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(time_delta.InMicroseconds(), test_data[i][3]); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ConvertToTimeBase(time_base, time_delta), test_data[i][4]); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(FFmpegCommonTest, VerifyFormatSizes) { 573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) for (AVSampleFormat format = AV_SAMPLE_FMT_NONE; 583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) format < AV_SAMPLE_FMT_NB; 593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) format = static_cast<AVSampleFormat>(format + 1)) { 603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) SampleFormat sample_format = AVSampleFormatToSampleFormat(format); 613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (sample_format == kUnknownSampleFormat) { 623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // This format not supported, so skip it. 633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) continue; 643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Have FFMpeg compute the size of a buffer of 1 channel / 1 frame 673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // with 1 byte alignment to make sure the sizes match. 683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int single_buffer_size = av_samples_get_buffer_size(NULL, 1, 1, format, 1); 693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int bytes_per_channel = SampleFormatToBytesPerChannel(sample_format); 703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) EXPECT_EQ(bytes_per_channel, single_buffer_size); 713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 740529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(FFmpegCommonTest, UTCDateToTime_Valid) { 750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::Time result; 760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_TRUE(FFmpegUTCDateToTime("2012-11-10 12:34:56", &result)); 770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::Time::Exploded exploded; 790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch result.UTCExplode(&exploded); 800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_TRUE(exploded.HasValidValues()); 810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(2012, exploded.year); 820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(11, exploded.month); 830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(6, exploded.day_of_week); 840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(10, exploded.day_of_month); 850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(12, exploded.hour); 860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(34, exploded.minute); 870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(56, exploded.second); 880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(0, exploded.millisecond); 890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 910529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(FFmpegCommonTest, UTCDateToTime_Invalid) { 920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const char* invalid_date_strings[] = { 930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "", 940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "2012-11-10", 950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "12:34:56", 960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "-- ::", 970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "2012-11-10 12:34:", 980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "2012-11-10 12::56", 990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "2012-11-10 :34:56", 1000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "2012-11- 12:34:56", 1010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "2012--10 12:34:56", 1020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "-11-10 12:34:56", 1030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "2012-11 12:34:56", 1040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "2012-11-10-12 12:34:56", 1050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "2012-11-10 12:34", 1060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "2012-11-10 12:34:56:78", 1070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "ABCD-11-10 12:34:56", 1080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "2012-EF-10 12:34:56", 1090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "2012-11-GH 12:34:56", 1100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "2012-11-10 IJ:34:56", 1110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "2012-11-10 12:JL:56", 1120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "2012-11-10 12:34:MN", 1130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "2012-11-10 12:34:56.123", 1140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "2012-11-1012:34:56", 1150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "2012-11-10 12:34:56 UTC", 1160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch }; 1170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch for (size_t i = 0; i < arraysize(invalid_date_strings); ++i) { 1190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const char* date_string = invalid_date_strings[i]; 1200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch base::Time result; 1210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_FALSE(FFmpegUTCDateToTime(date_string, &result)) 1220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch << "date_string '" << date_string << "'"; 1230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_TRUE(result.is_null()); 1240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 1250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 1260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 128