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

library fuchsia.media;

// Describes the type of an elementary stream.
struct StreamType {
    // Medium-specific type information.
    MediumSpecificStreamType medium_specific;

    // Encoding (see constants below).
    string encoding;

    // Encoding-specific parameters.
    vector<uint8>? encoding_parameters;
};

// A union of all medium-specific stream type structs.
union MediumSpecificStreamType {
    AudioStreamType audio;
    VideoStreamType video;
    TextStreamType text;
    SubpictureStreamType subpicture;
};

const string MEDIA_ENCODING_UNSUPPORTED = "fuchsia.media.unsupported";

const string AUDIO_ENCODING_AAC = "fuchsia.media.aac";
const string AUDIO_ENCODING_AMRNB = "fuchsia.media.amrnb";
const string AUDIO_ENCODING_AMRWB = "fuchsia.media.amrwb";
const string AUDIO_ENCODING_APTX = "fuchsia.media.aptx";
const string AUDIO_ENCODING_FLAC = "fuchsia.media.flac";
const string AUDIO_ENCODING_GSMMS = "fuchsia.media.gsmms";
const string AUDIO_ENCODING_LPCM = "fuchsia.media.lpcm";
const string AUDIO_ENCODING_MP3 = "fuchsia.media.mp3";
const string AUDIO_ENCODING_PCMALAW = "fuchsia.media.pcmalaw";
const string AUDIO_ENCODING_PCMMULAW = "fuchsia.media.pcmmulaw";
const string AUDIO_ENCODING_SBC = "fuchsia.media.sbc";
const string AUDIO_ENCODING_VORBIS = "fuchsia.media.vorbis";

const string VIDEO_ENCODING_H263 = "fuchsia.media.h263";
const string VIDEO_ENCODING_H264 = "fuchsia.media.h264";
const string VIDEO_ENCODING_MPEG4 = "fuchsia.media.mpeg4";
const string VIDEO_ENCODING_THEORA = "fuchsia.media.theora";
const string VIDEO_ENCODING_UNCOMPRESSED = "fuchsia.media.uncompressed_video";
const string VIDEO_ENCODING_VP3 = "fuchsia.media.vp3";
const string VIDEO_ENCODING_VP8 = "fuchsia.media.vp8";
const string VIDEO_ENCODING_VP9 = "fuchsia.media.vp9";

///////////////////////////////////////////////////////////////////////////////
// Audio

// Describes the type of an audio elementary stream.
struct AudioStreamType {
    AudioSampleFormat sample_format;
    uint32 channels;
    uint32 frames_per_second;
    // TODO(mpuryear): Add channel config.
};

enum AudioSampleFormat {
    // 8-bit unsigned samples, sample size 1 byte.
    UNSIGNED_8 = 1;

    // 16-bit signed samples, host-endian, sample size 2 bytes.
    SIGNED_16 = 2;

    // 24-bit signed samples in 32 bits, host-endian, sample size 4 bytes.
    SIGNED_24_IN_32 = 3;

    // 32-bit floating-point samples, sample size 4 bytes.
    FLOAT = 4;
};

///////////////////////////////////////////////////////////////////////////////
// Video

// Describes the type of a video elementary stream.
struct VideoStreamType {
    VideoProfile profile;
    // TODO(dalesat): Use fuchsia.images.PixelFormat.
    PixelFormat pixel_format;
    // TODO(dalesat): Use fuchsia.images.ColorSpace.
    ColorSpace color_space;
    uint32 width;
    uint32 height;
    uint32 coded_width;
    uint32 coded_height;
    uint32 pixel_aspect_ratio_width;
    uint32 pixel_aspect_ratio_height;
    // TODO(dalesat): Change to single line_stride value for all planes.
    vector<uint32> line_stride;
    // TODO(dalesat): Remove.
    vector<uint32> plane_offset;
};

// TODO(dalesat): Blindly copied from Chromium, revisit.
enum VideoProfile {
    UNKNOWN = 0;
    NOT_APPLICABLE = 1;
    H264_BASELINE = 2;
    H264_MAIN = 3;
    H264_EXTENDED = 4;
    H264_HIGH = 5;
    H264_HIGH10 = 6;
    H264_HIGH422 = 7;
    H264_HIGH444_PREDICTIVE = 8;
    H264_SCALABLE_BASELINE = 9;
    H264_SCALABLE_HIGH = 10;
    H264_STEREO_HIGH = 11;
    H264_MULTIVIEW_HIGH = 12;
};

// TODO(dalesat): Replace with fuchsia.images.PixelFormat.
enum PixelFormat {
    UNKNOWN = 0;
    I420 = 1; // 12bpp YUV planar 1x1 Y, 2x2 UV samples, a.k.a. YU12.
    YV12 = 2; // 12bpp YVU planar 1x1 Y, 2x2 VU samples.
    YV16 = 3; // 16bpp YVU planar 1x1 Y, 2x1 VU samples.
    YV12A = 4; // 20bpp YUVA planar 1x1 Y, 2x2 VU, 1x1 A samples.
    YV24 = 5; // 24bpp YUV planar, no subsampling.
    NV12 = 6; // 12bpp with Y plane followed by a 2x2 interleaved UV plane.
    NV21 = 7; // 12bpp with Y plane followed by a 2x2 interleaved VU plane.
    UYVY = 8; // 16bpp interleaved 2x1 U, 1x1 Y, 2x1 V, 1x1 Y samples.
    YUY2 = 9; // 16bpp interleaved 1x1 Y, 2x1 U, 1x1 Y, 2x1 V samples.
    ARGB = 10; // 32bpp ARGB, 1 plane.
    XRGB = 11; // 24bpp XRGB, 1 plane.
    RGB24 = 12; // 24bpp BGR, 1 plane.
    RGB32 = 13; // 32bpp BGRA, 1 plane.
    MJPEG = 14; // MJPEG compressed.
    MT21 = 15;
};

// TODO(dalesat): Replace with fuchsia.images.ColorSpace.
enum ColorSpace {
    UNKNOWN = 0;
    NOT_APPLICABLE = 1;
    JPEG = 2;
    HD_REC709 = 3;
    SD_REC601 = 4;
};

///////////////////////////////////////////////////////////////////////////////
// Text

struct TextStreamType {
    // TODO(dalesat): Define.
    uint8 dummy;
};

///////////////////////////////////////////////////////////////////////////////
// Subpicture

struct SubpictureStreamType {
    // TODO(dalesat): Define.
    uint8 dummy;
};
