// Copyright (c) 2013 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.

#ifndef COBALT_MEDIA_BASE_CONTAINER_NAMES_H_
#define COBALT_MEDIA_BASE_CONTAINER_NAMES_H_

#include <stdint.h>

#include "cobalt/media/base/media_export.h"

namespace media {

namespace container_names {

// This is the set of input container formats detected for logging purposes. Not
// all of these are enabled (and it varies by product). Any additions need to be
// done at the end of the list (before CONTAINER_MAX). This list must be kept in
// sync with the enum definition "MediaContainers" in
// tools/metrics/histograms/histograms.xml.
enum MediaContainerName {
  CONTAINER_UNKNOWN,          // Unknown
  CONTAINER_AAC,              // AAC (Advanced Audio Coding)
  CONTAINER_AC3,              // AC-3
  CONTAINER_AIFF,             // AIFF (Audio Interchange File Format)
  CONTAINER_AMR,              // AMR (Adaptive Multi-Rate Audio)
  CONTAINER_APE,              // APE (Monkey's Audio)
  CONTAINER_ASF,              // ASF (Advanced / Active Streaming Format)
  CONTAINER_ASS,              // SSA (SubStation Alpha) subtitle
  CONTAINER_AVI,              // AVI (Audio Video Interleaved)
  CONTAINER_BINK,             // Bink
  CONTAINER_CAF,              // CAF (Apple Core Audio Format)
  CONTAINER_DTS,              // DTS
  CONTAINER_DTSHD,            // DTS-HD
  CONTAINER_DV,               // DV (Digital Video)
  CONTAINER_DXA,              // DXA
  CONTAINER_EAC3,             // Enhanced AC-3
  CONTAINER_FLAC,             // FLAC (Free Lossless Audio Codec)
  CONTAINER_FLV,              // FLV (Flash Video)
  CONTAINER_GSM,              // GSM (Global System for Mobile Audio)
  CONTAINER_H261,             // H.261
  CONTAINER_H263,             // H.263
  CONTAINER_H264,             // H.264
  CONTAINER_HLS,              // HLS (Apple HTTP Live Streaming PlayList)
  CONTAINER_IRCAM,            // Berkeley/IRCAM/CARL Sound Format
  CONTAINER_MJPEG,            // MJPEG video
  CONTAINER_MOV,              // QuickTime / MOV / MPEG4
  CONTAINER_MP3,              // MP3 (MPEG audio layer 2/3)
  CONTAINER_MPEG2PS,          // MPEG-2 Program Stream
  CONTAINER_MPEG2TS,          // MPEG-2 Transport Stream
  CONTAINER_MPEG4BS,          // MPEG-4 Bitstream
  CONTAINER_OGG,              // Ogg
  CONTAINER_RM,               // RM (RealMedia)
  CONTAINER_SRT,              // SRT (SubRip subtitle)
  CONTAINER_SWF,              // SWF (ShockWave Flash)
  CONTAINER_VC1,              // VC-1
  CONTAINER_WAV,              // WAV / WAVE (Waveform Audio)
  CONTAINER_WEBM,             // Matroska / WebM
  CONTAINER_WTV,              // WTV (Windows Television)
  CONTAINER_DASH,             // DASH (MPEG-DASH)
  CONTAINER_SMOOTHSTREAM,     // SmoothStreaming
  CONTAINER_MAX               // Must be last
};

// Determine the container type.
MEDIA_EXPORT MediaContainerName DetermineContainer(const uint8_t* buffer,
                                                   int buffer_size);

}  // namespace container_names

}  // namespace media

#endif  // COBALT_MEDIA_BASE_CONTAINER_NAMES_H_
