// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/at_exit.h"
#include "base/files/memory_mapped_file.h"
#include "base/path_service.h"
#include "cobalt/media/base/test_data_util.h"
#include "cobalt/media/filters/jpeg_parser.h"
#include "starboard/types.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace cobalt {
namespace media {

TEST(JpegParserTest, Parsing) {
  base::FilePath data_dir;
  ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &data_dir));

  // This sample frame is captured from Chromebook Pixel
  base::FilePath file_path = data_dir.AppendASCII("media")
                                 .AppendASCII("test")
                                 .AppendASCII("data")
                                 .AppendASCII("pixel-1280x720.jpg");

  base::MemoryMappedFile stream;
  ASSERT_TRUE(stream.Initialize(file_path)) << "Couldn't open stream file: "
                                            << file_path.MaybeAsASCII();

  JpegParseResult result;
  ASSERT_TRUE(ParseJpegPicture(stream.data(), stream.length(), &result));

  // Verify selected fields

  // SOF fields
  EXPECT_EQ(1280, result.frame_header.visible_width);
  EXPECT_EQ(720, result.frame_header.visible_height);
  EXPECT_EQ(1280, result.frame_header.coded_width);
  EXPECT_EQ(720, result.frame_header.coded_height);
  EXPECT_EQ(3, result.frame_header.num_components);
  EXPECT_EQ(1, result.frame_header.components[0].id);
  EXPECT_EQ(2, result.frame_header.components[0].horizontal_sampling_factor);
  EXPECT_EQ(1, result.frame_header.components[0].vertical_sampling_factor);
  EXPECT_EQ(0, result.frame_header.components[0].quantization_table_selector);
  EXPECT_EQ(2, result.frame_header.components[1].id);
  EXPECT_EQ(1, result.frame_header.components[1].horizontal_sampling_factor);
  EXPECT_EQ(1, result.frame_header.components[1].vertical_sampling_factor);
  EXPECT_EQ(1, result.frame_header.components[1].quantization_table_selector);
  EXPECT_EQ(3, result.frame_header.components[2].id);
  EXPECT_EQ(1, result.frame_header.components[2].horizontal_sampling_factor);
  EXPECT_EQ(1, result.frame_header.components[2].vertical_sampling_factor);
  EXPECT_EQ(1, result.frame_header.components[2].quantization_table_selector);

  // DRI fields
  EXPECT_EQ(0, result.restart_interval);

  // DQT fields
  EXPECT_TRUE(result.q_table[0].valid);
  EXPECT_TRUE(result.q_table[1].valid);
  EXPECT_FALSE(result.q_table[2].valid);
  EXPECT_FALSE(result.q_table[3].valid);

  // DHT fields (no DHT marker)
  EXPECT_FALSE(result.dc_table[0].valid);
  EXPECT_FALSE(result.ac_table[0].valid);
  EXPECT_FALSE(result.dc_table[1].valid);
  EXPECT_FALSE(result.ac_table[1].valid);

  // SOS fields
  EXPECT_EQ(3, result.scan.num_components);
  EXPECT_EQ(1, result.scan.components[0].component_selector);
  EXPECT_EQ(0, result.scan.components[0].dc_selector);
  EXPECT_EQ(0, result.scan.components[0].ac_selector);
  EXPECT_EQ(2, result.scan.components[1].component_selector);
  EXPECT_EQ(1, result.scan.components[1].dc_selector);
  EXPECT_EQ(1, result.scan.components[1].ac_selector);
  EXPECT_EQ(3, result.scan.components[2].component_selector);
  EXPECT_EQ(1, result.scan.components[2].dc_selector);
  EXPECT_EQ(1, result.scan.components[2].ac_selector);
  EXPECT_EQ(121150u, result.data_size);
  EXPECT_EQ(121358u, result.image_size);
}

TEST(JpegParserTest, CodedSizeNotEqualVisibleSize) {
  base::FilePath data_dir;
  ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &data_dir));

  base::FilePath file_path = data_dir.AppendASCII("media")
                                 .AppendASCII("test")
                                 .AppendASCII("data")
                                 .AppendASCII("blank-1x1.jpg");

  base::MemoryMappedFile stream;
  ASSERT_TRUE(stream.Initialize(file_path)) << "Couldn't open stream file: "
                                            << file_path.MaybeAsASCII();

  JpegParseResult result;
  ASSERT_TRUE(ParseJpegPicture(stream.data(), stream.length(), &result));

  EXPECT_EQ(1, result.frame_header.visible_width);
  EXPECT_EQ(1, result.frame_header.visible_height);
  // The sampling factor of the given image is 2:2, so coded size is 16x16
  EXPECT_EQ(16, result.frame_header.coded_width);
  EXPECT_EQ(16, result.frame_header.coded_height);
  EXPECT_EQ(2, result.frame_header.components[0].horizontal_sampling_factor);
  EXPECT_EQ(2, result.frame_header.components[0].vertical_sampling_factor);
}

TEST(JpegParserTest, ParsingFail) {
  const uint8_t data[] = {0, 1, 2, 3};  // not jpeg
  JpegParseResult result;
  ASSERT_FALSE(ParseJpegPicture(data, sizeof(data), &result));
}

}  // namespace media
}  // namespace cobalt
