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