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