| // 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_ |