// Copyright (c) 2012 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_BASE_STREAM_PARSER_BUFFER_H_
#define MEDIA_BASE_STREAM_PARSER_BUFFER_H_
#include <deque>
#include "media/base/decoder_buffer.h"
#include "media/base/demuxer_stream.h"
#include "media/base/media_export.h"
#include "media/base/stream_parser.h"
namespace media {
class MEDIA_EXPORT StreamParserBuffer : public DecoderBuffer {
public:
// Value used to signal an invalid decoder config ID.
enum { kInvalidConfigId = -1 };
typedef DemuxerStream::Type Type;
typedef StreamParser::TrackId TrackId;
static scoped_refptr<StreamParserBuffer> CreateEOSBuffer();
static scoped_refptr<StreamParserBuffer> CopyFrom(
const uint8* data, int data_size, bool is_keyframe, Type type,
TrackId track_id);
static scoped_refptr<StreamParserBuffer> CopyFrom(
const uint8* data, int data_size,
const uint8* side_data, int side_data_size, bool is_keyframe, Type type,
TrackId track_id);
bool IsKeyframe() const { return is_keyframe_; }
// Decode timestamp. If not explicitly set, or set to kNoTimestamp(), the
// value will be taken from the normal timestamp.
base::TimeDelta GetDecodeTimestamp() const;
void SetDecodeTimestamp(base::TimeDelta timestamp);
// Gets/sets the ID of the decoder config associated with this buffer.
int GetConfigId() const;
void SetConfigId(int config_id);
// Gets the parser's media type associated with this buffer. Value is
// meaningless for EOS buffers.
Type type() const { return type_; }
// Gets the parser's track ID associated with this buffer. Value is
// meaningless for EOS buffers.
TrackId track_id() const { return track_id_; }
// Converts this buffer to a splice buffer. |pre_splice_buffers| must not
// have any EOS buffers, must not have any splice buffers, nor must have any
// buffer with preroll.
//
// |pre_splice_buffers| will be deep copied and each copy's splice_timestamp()
// will be set to this buffer's splice_timestamp(). A copy of |this|, with a
// splice_timestamp() of kNoTimestamp(), will be added to the end of
// |splice_buffers_|.
//
// See the Audio Splice Frame Algorithm in the MSE specification for details.
typedef StreamParser::BufferQueue BufferQueue;
void ConvertToSpliceBuffer(const BufferQueue& pre_splice_buffers);
const BufferQueue& splice_buffers() const { return splice_buffers_; }
// Specifies a buffer which must be decoded prior to this one to ensure this
// buffer can be accurately decoded. The given buffer must be of the same
// type, must not be a splice buffer, must not have any discard padding, and
// must not be an end of stream buffer. |preroll| is not copied.
//
// It's expected that this preroll buffer will be discarded entirely post
// decoding. As such it's discard_padding() will be set to kInfiniteDuration.
//
// All future timestamp, decode timestamp, config id, or track id changes to
// this buffer will be applied to the preroll buffer as well.
void SetPrerollBuffer(const scoped_refptr<StreamParserBuffer>& preroll);
const scoped_refptr<StreamParserBuffer>& preroll_buffer() {
return preroll_buffer_;
}
virtual void set_timestamp(base::TimeDelta timestamp) OVERRIDE;
private:
StreamParserBuffer(const uint8* data, int data_size,
const uint8* side_data, int side_data_size,
bool is_keyframe, Type type,
TrackId track_id);
virtual ~StreamParserBuffer();
bool is_keyframe_;
base::TimeDelta decode_timestamp_;
int config_id_;
Type type_;
TrackId track_id_;
BufferQueue splice_buffers_;
scoped_refptr<StreamParserBuffer> preroll_buffer_;
DISALLOW_COPY_AND_ASSIGN(StreamParserBuffer);
};
} // namespace media
#endif // MEDIA_BASE_STREAM_PARSER_BUFFER_H_