blob: a8769c7aea42be073101c628304b3d2fe220beb1 [file] [log] [blame]
// 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.
#ifndef MEDIA_FORMATS_COMMON_OPUS_CONSTANTS_H_
#define MEDIA_FORMATS_COMMON_OPUS_CONSTANTS_H_
#include <stdint.h>
namespace media {
// The Opus specification is part of IETF RFC 6716:
// http://tools.ietf.org/html/rfc6716
// Opus Extra Data contents:
// - "OpusHead" magic signature (64 bits)
// - version number (8 bits)
// - Channels C (8 bits)
// - Pre-skip (16 bits)
// - Sampling rate (32 bits)
// - Gain in dB (16 bits, S7.8)
// - Mapping (8 bits, 0=single stream (mono/stereo) 1=Vorbis mapping,
// 2..254: reserved, 255: multistream with no mapping)
//
// - if (mapping != 0)
// - N = total number of streams (8 bits)
// - M = number of paired streams (8 bits)
// - C times channel origin
// - if (C<2*M)
// - stream = byte/2
// - if (byte&0x1 == 0)
// - left
// else
// - right
// - else
// - stream = byte-M
enum {
// Default audio output channel layout. Used to initialize |stream_map| in
// OpusExtraData, and passed to opus_multistream_decoder_create() when the
// extra data does not contain mapping information. The values are valid only
// for mono and stereo output: Opus streams with more than 2 channels require
// a stream map.
OPUS_MAX_CHANNELS_WITH_DEFAULT_LAYOUT = 2,
// Opus uses Vorbis channel mapping, and Vorbis channel mapping specifies
// mappings for up to 8 channels. This information is part of the Vorbis I
// Specification:
// http://www.xiph.org/vorbis/doc/Vorbis_I_spec.html
OPUS_MAX_VORBIS_CHANNELS = 8,
// Size of the Opus extra data excluding optional mapping information.
OPUS_EXTRADATA_SIZE = 19,
// Offset for magic signature "OpusHead"
OPUS_EXTRADATA_LABEL_OFFSET = 0,
// Offset to the Opus version number
OPUS_EXTRADATA_VERSION_OFFSET = 8,
// Offset to the channel count byte in the Opus extra data
OPUS_EXTRADATA_CHANNELS_OFFSET = 9,
// Offset to the pre-skip value in the Opus extra data
OPUS_EXTRADATA_SKIP_SAMPLES_OFFSET = 10,
// Offset to the sampling rate value in the Opus extra data
OPUS_EXTRADATA_SAMPLE_RATE_OFFSET = 12,
// Offset to the gain value in the Opus extra data
OPUS_EXTRADATA_GAIN_OFFSET = 16,
// Offset to the channel mapping byte in the Opus extra data
OPUS_EXTRADATA_CHANNEL_MAPPING_OFFSET = 18,
// Extra Data contains a stream map, beyond the always present
// |OPUS_EXTRADATA_SIZE| bytes of data. The mapping data contains stream
// count, coupling information, and per channel mapping values:
// - Byte 0: Number of streams.
// - Byte 1: Number coupled.
// - Byte 2: Starting at byte 2 are |extra_data->channels| uint8_t mapping
// values.
OPUS_EXTRADATA_NUM_STREAMS_OFFSET = OPUS_EXTRADATA_SIZE,
OPUS_EXTRADATA_NUM_COUPLED_OFFSET = OPUS_EXTRADATA_NUM_STREAMS_OFFSET + 1,
OPUS_EXTRADATA_STREAM_MAP_OFFSET = OPUS_EXTRADATA_NUM_STREAMS_OFFSET + 2,
};
// Opus internal to Vorbis channel order mapping written in the header.
extern const uint8_t kOpusVorbisChannelMap[OPUS_MAX_VORBIS_CHANNELS]
[OPUS_MAX_VORBIS_CHANNELS];
} // namespace media
#endif // MEDIA_FORMATS_COMMON_OPUS_CONSTANTS_H_