#ifndef MEDIA_BASE_DATA_BUFFER_H_
#define MEDIA_BASE_DATA_BUFFER_H_
#include <stdint.h>
#include "base/check_op.h"
#include "base/containers/heap_array.h"
#include "base/containers/span.h"
#include "base/memory/ref_counted.h"
#include "base/time/time.h"
#include "base/types/pass_key.h"
#include "media/base/media_export.h"
namespace media {
class MEDIA_EXPORT DataBuffer : public base::RefCountedThreadSafe<DataBuffer> {
public:
REQUIRE_ADOPTION_FOR_REFCOUNTED_TYPE();
explicit DataBuffer(size_t capacity);
explicit DataBuffer(base::HeapArray<uint8_t> buffer);
DataBuffer(base::PassKey<DataBuffer>, base::span<const uint8_t> data);
enum class DataBufferType { kNormal, kEndOfStream };
DataBuffer(base::PassKey<DataBuffer>, DataBufferType data_buffer_type);
DataBuffer(DataBuffer&&) = delete;
DataBuffer(const DataBuffer&) = delete;
DataBuffer& operator=(DataBuffer&&) = delete;
DataBuffer& operator=(const DataBuffer&) = delete;
static scoped_refptr<DataBuffer> CopyFrom(base::span<const uint8_t> data);
static scoped_refptr<DataBuffer> CreateEOSBuffer();
void FillWithZeroes() {
CHECK(!end_of_stream());
std::fill(data_.begin(), data_.end(), 0);
}
base::TimeDelta timestamp() const {
CHECK(!end_of_stream());
return timestamp_;
}
void set_timestamp(const base::TimeDelta& timestamp) {
CHECK(!end_of_stream());
timestamp_ = timestamp;
}
base::TimeDelta duration() const {
CHECK(!end_of_stream());
return duration_;
}
void set_duration(const base::TimeDelta& duration) {
CHECK(!end_of_stream());
duration_ = duration;
}
size_t capacity() const {
CHECK(!end_of_stream());
return data_.size();
}
void Append(base::span<const uint8_t> data);
base::span<const uint8_t> data() const {
CHECK(!end_of_stream());
return data_.first(size_);
}
base::span<uint8_t> writable_data() {
CHECK(!end_of_stream());
return data_;
}
size_t size() const {
CHECK(!end_of_stream());
return size_;
}
void set_size(size_t size) {
CHECK(!end_of_stream());
CHECK_LE(size, data_.size());
size_ = size;
}
bool end_of_stream() const { return is_end_of_stream_; }
private:
friend class base::RefCountedThreadSafe<DataBuffer>;
virtual ~DataBuffer();
base::TimeDelta timestamp_;
base::TimeDelta duration_;
base::HeapArray<uint8_t> data_;
size_t size_ = 0;
const bool is_end_of_stream_ = false;
};
}
#endif