blob: d14f4db515877eabc6e438ba0ad242df0342752d [file] [log] [blame]
// 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<Buffer> {
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>;
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_