15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef MEDIA_BASE_STREAM_PARSER_BUFFER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEDIA_BASE_STREAM_PARSER_BUFFER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include <deque> 9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/decoder_buffer.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/base/demuxer_stream.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/media_export.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/base/stream_parser.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Simple wrapper around base::TimeDelta that represents a decode timestamp. 186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Making DecodeTimestamp a different type makes it easier to determine whether 196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// code is operating on presentation or decode timestamps and makes conversions 206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// between the two types explicit and easy to spot. 216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class DecodeTimestamp { 226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) public: 236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp() {} 246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp(const DecodeTimestamp& rhs) : ts_(rhs.ts_) { } 256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp& operator=(const DecodeTimestamp& rhs) { 266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (&rhs != this) 276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ts_ = rhs.ts_; 286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return *this; 296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Only operators that are actually used by the code have been defined. 326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Reviewers should pay close attention to the addition of new operators. 336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool operator<(const DecodeTimestamp& rhs) const { return ts_ < rhs.ts_; } 346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool operator>(const DecodeTimestamp& rhs) const { return ts_ > rhs.ts_; } 356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool operator==(const DecodeTimestamp& rhs) const { return ts_ == rhs.ts_; } 366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool operator!=(const DecodeTimestamp& rhs) const { return ts_ != rhs.ts_; } 376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool operator>=(const DecodeTimestamp& rhs) const { return ts_ >= rhs.ts_; } 386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool operator<=(const DecodeTimestamp& rhs) const { return ts_ <= rhs.ts_; } 396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::TimeDelta operator-(const DecodeTimestamp& rhs) const { 416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return ts_ - rhs.ts_; 426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp& operator+=(const base::TimeDelta& rhs) { 456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ts_ += rhs; 466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return *this; 476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp& operator-=(const base::TimeDelta& rhs) { 506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ts_ -= rhs; 516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return *this; 526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp operator+(const base::TimeDelta& rhs) const { 556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return DecodeTimestamp(ts_ + rhs); 566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp operator-(const base::TimeDelta& rhs) const { 596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return DecodeTimestamp(ts_ - rhs); 606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) int64 operator/(const base::TimeDelta& rhs) const { 636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return ts_ / rhs; 646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) static DecodeTimestamp FromSecondsD(double seconds) { 676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return DecodeTimestamp(base::TimeDelta::FromSecondsD(seconds)); 686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) static DecodeTimestamp FromMilliseconds(int64 milliseconds) { 716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return DecodeTimestamp(base::TimeDelta::FromMilliseconds(milliseconds)); 726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) static DecodeTimestamp FromMicroseconds(int64 microseconds) { 756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return DecodeTimestamp(base::TimeDelta::FromMicroseconds(microseconds)); 766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // This method is used to explicitly call out when presentation timestamps 796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // are being converted to a decode timestamp. 806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) static DecodeTimestamp FromPresentationTime(base::TimeDelta timestamp) { 816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return DecodeTimestamp(timestamp); 826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) double InSecondsF() const { return ts_.InSecondsF(); } 856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) int64 InMilliseconds() const { return ts_.InMilliseconds(); } 866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) int64 InMicroseconds() const { return ts_.InMicroseconds(); } 876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // TODO(acolwell): Remove once all the hacks are gone. This method is called 896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // by hacks where a decode time is being used as a presentation time. 906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::TimeDelta ToPresentationTime() const { return ts_; } 916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) private: 936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) explicit DecodeTimestamp(base::TimeDelta timestamp) : ts_(timestamp) { } 946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::TimeDelta ts_; 966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}; 976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)MEDIA_EXPORT extern inline DecodeTimestamp kNoDecodeTimestamp() { 996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return DecodeTimestamp::FromPresentationTime(kNoTimestamp()); 1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MEDIA_EXPORT StreamParserBuffer : public DecoderBuffer { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Value used to signal an invalid decoder config ID. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum { kInvalidConfigId = -1 }; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) typedef DemuxerStream::Type Type; 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) typedef StreamParser::TrackId TrackId; 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static scoped_refptr<StreamParserBuffer> CreateEOSBuffer(); 111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static scoped_refptr<StreamParserBuffer> CopyFrom( 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const uint8* data, int data_size, bool is_keyframe, Type type, 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TrackId track_id); 11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) static scoped_refptr<StreamParserBuffer> CopyFrom( 11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const uint8* data, int data_size, 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const uint8* side_data, int side_data_size, bool is_keyframe, Type type, 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TrackId track_id); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsKeyframe() const { return is_keyframe_; } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Decode timestamp. If not explicitly set, or set to kNoTimestamp(), the 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // value will be taken from the normal timestamp. 1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp GetDecodeTimestamp() const; 1246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) void SetDecodeTimestamp(DecodeTimestamp timestamp); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Gets/sets the ID of the decoder config associated with this buffer. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetConfigId() const; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetConfigId(int config_id); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Returns the config ID of this buffer if it has no splice buffers or 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // |index| is out of range. Otherwise returns the config ID for the 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // buffer in |splice_buffers_| at position |index|. 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int GetSpliceBufferConfigId(size_t index) const; 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Gets the parser's media type associated with this buffer. Value is 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // meaningless for EOS buffers. 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Type type() const { return type_; } 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Gets the parser's track ID associated with this buffer. Value is 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // meaningless for EOS buffers. 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TrackId track_id() const { return track_id_; } 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 143effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Converts this buffer to a splice buffer. |pre_splice_buffers| must not 14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // have any EOS buffers, must not have any splice buffers, nor must have any 14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // buffer with preroll. 146effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // 147effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // |pre_splice_buffers| will be deep copied and each copy's splice_timestamp() 1480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // will be set to this buffer's splice_timestamp(). A copy of |this|, with a 1490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // splice_timestamp() of kNoTimestamp(), will be added to the end of 1500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // |splice_buffers_|. 151effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // 152effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // See the Audio Splice Frame Algorithm in the MSE specification for details. 153effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch typedef StreamParser::BufferQueue BufferQueue; 154effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch void ConvertToSpliceBuffer(const BufferQueue& pre_splice_buffers); 155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const BufferQueue& splice_buffers() const { return splice_buffers_; } 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Specifies a buffer which must be decoded prior to this one to ensure this 15846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // buffer can be accurately decoded. The given buffer must be of the same 15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // type, must not be a splice buffer, must not have any discard padding, and 16046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // must not be an end of stream buffer. |preroll| is not copied. 16146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // 16246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // It's expected that this preroll buffer will be discarded entirely post 16346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // decoding. As such it's discard_padding() will be set to kInfiniteDuration. 16446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // 16546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // All future timestamp, decode timestamp, config id, or track id changes to 16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // this buffer will be applied to the preroll buffer as well. 16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void SetPrerollBuffer(const scoped_refptr<StreamParserBuffer>& preroll); 16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const scoped_refptr<StreamParserBuffer>& preroll_buffer() { 16946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return preroll_buffer_; 17046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 17246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual void set_timestamp(base::TimeDelta timestamp) OVERRIDE; 17346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) StreamParserBuffer(const uint8* data, int data_size, 17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const uint8* side_data, int side_data_size, 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool is_keyframe, Type type, 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TrackId track_id); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~StreamParserBuffer(); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_keyframe_; 1826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DecodeTimestamp decode_timestamp_; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int config_id_; 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Type type_; 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TrackId track_id_; 186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch BufferQueue splice_buffers_; 18746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<StreamParserBuffer> preroll_buffer_; 1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(StreamParserBuffer); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // MEDIA_BASE_STREAM_PARSER_BUFFER_H_ 195