// 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. // Defines a base class for representing timestamped media data. Every buffer // contains a timestamp in microseconds describing the relative position of // the buffer within the media stream, and the duration in microseconds for // the length of time the buffer will be rendered. // // Timestamps are derived directly from the encoded media file and are commonly // known as the presentation timestamp (PTS). Durations are a best-guess and // are usually derived from the sample/frame rate of the media file. // // Due to encoding and transmission errors, it is not guaranteed that timestamps // arrive in a monotonically increasing order nor that the next timestamp will // be equal to the previous timestamp plus the duration. // // In the ideal scenario for a 25fps movie, buffers are timestamped as followed: // // Buffer0 Buffer1 Buffer2 ... BufferN // Timestamp: 0us 40000us 80000us ... (N*40000)us // Duration*: 40000us 40000us 40000us ... 40000us // // *25fps = 0.04s per frame = 40000us per frame #ifndef MEDIA_BASE_BUFFERS_H_ #define MEDIA_BASE_BUFFERS_H_ #include "base/basictypes.h" #include "base/memory/ref_counted.h" #include "base/time.h" #include "media/base/media_export.h" namespace media { // Indicates an invalid or missing timestamp. MEDIA_EXPORT extern inline base::TimeDelta kNoTimestamp() { return base::TimeDelta::FromMicroseconds(kint64min); } // Represents an infinite stream duration. MEDIA_EXPORT extern inline base::TimeDelta kInfiniteDuration() { return base::TimeDelta::FromMicroseconds(kint64max); } class MEDIA_EXPORT Buffer : public base::RefCountedThreadSafe { public: // Returns a read only pointer to the buffer data. virtual const uint8* GetData() const = 0; // Returns the size of valid data in bytes. virtual int GetDataSize() const = 0; // If there's no data in this buffer, it represents end of stream. bool IsEndOfStream() const; base::TimeDelta GetTimestamp() const { return timestamp_; } void SetTimestamp(const base::TimeDelta& timestamp) { timestamp_ = timestamp; } base::TimeDelta GetDuration() const { return duration_; } void SetDuration(const base::TimeDelta& duration) { duration_ = duration; } protected: friend class base::RefCountedThreadSafe; Buffer(base::TimeDelta timestamp, base::TimeDelta duration); virtual ~Buffer(); private: base::TimeDelta timestamp_; base::TimeDelta duration_; DISALLOW_COPY_AND_ASSIGN(Buffer); }; } // namespace media #endif // MEDIA_BASE_BUFFERS_H_