blob: d72019323224a3a858466e461b972b1a2d1b66dd [file] [log] [blame]
// Copyright 2014 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_FORMATS_MPEG_MPEG1_AUDIO_STREAM_PARSER_H_
#define COBALT_MEDIA_FORMATS_MPEG_MPEG1_AUDIO_STREAM_PARSER_H_
#include <vector>
#include "base/basictypes.h"
#include "cobalt/media/base/decoder_buffer.h"
#include "cobalt/media/base/media_export.h"
#include "cobalt/media/formats/mpeg/mpeg_audio_stream_parser_base.h"
#include "starboard/types.h"
namespace cobalt {
namespace media {
// MPEG1AudioStreamParser handles MPEG-1 audio streams (ISO/IEC 11172-3)
// as well as the following extensions:
// - MPEG-2 audio (ISO/IEC 13818-3),
// - and MPEG2.5 (not an ISO standard).
class MEDIA_EXPORT MPEG1AudioStreamParser : public MPEGAudioStreamParserBase {
public:
// Size of an MPEG-1 frame header in bytes.
enum {
kHeaderSize = 4,
};
// Versions and layers as defined in ISO/IEC 11172-3.
enum Version {
kVersion1 = 3,
kVersion2 = 2,
kVersionReserved = 1,
kVersion2_5 = 0,
};
enum Layer {
kLayer1 = 3,
kLayer2 = 2,
kLayer3 = 1,
kLayerReserved = 0,
};
struct Header {
Version version;
// Layer as defined in ISO/IEC 11172-3 bitstream specification.
Layer layer;
// Frame size in bytes.
int frame_size;
// Sample frequency.
int sample_rate;
// Channel mode as defined in ISO/IEC 11172-3 bitstream specification.
int channel_mode;
// Channel layout.
ChannelLayout channel_layout;
// Number of samples per frame.
int sample_count;
};
// Parses the header starting at |data|.
// Assumption: size of array |data| should be at least |kHeaderSize|.
// Returns false if the header is not valid.
static bool ParseHeader(const scoped_refptr<MediaLog>& media_log,
const uint8_t* data, Header* header);
explicit MPEG1AudioStreamParser(DecoderBuffer::Allocator* buffer_allocator);
~MPEG1AudioStreamParser() override;
private:
// MPEGAudioStreamParserBase overrides.
int ParseFrameHeader(const uint8_t* data, int size, int* frame_size,
int* sample_rate, ChannelLayout* channel_layout,
int* sample_count, bool* metadata_frame,
std::vector<uint8_t>* extra_data) const override;
DISALLOW_COPY_AND_ASSIGN(MPEG1AudioStreamParser);
};
} // namespace media
} // namespace cobalt
#endif // COBALT_MEDIA_FORMATS_MPEG_MPEG1_AUDIO_STREAM_PARSER_H_