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_DATA_BUFFER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEDIA_BASE_DATA_BUFFER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/logging.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/media_export.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A simple buffer that takes ownership of the given data pointer or allocates
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// as necessary.
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Unlike DecoderBuffer, allocations are assumed to be allocated with the
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// default memory allocator (i.e., new uint8[]).
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// NOTE: It is illegal to call any method when end_of_stream() is true.
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MEDIA_EXPORT DataBuffer : public base::RefCountedThreadSafe<DataBuffer> {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Allocates buffer of size |buffer_size| >= 0.
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit DataBuffer(int buffer_size);
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Assumes valid data of size |buffer_size|.
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DataBuffer(scoped_ptr<uint8[]> buffer, int buffer_size);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create a DataBuffer whose |data_| is copied from |data|.
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |data| must not be null and |size| must be >= 0.
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static scoped_refptr<DataBuffer> CopyFrom(const uint8* data, int size);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create a DataBuffer indicating we've reached end of stream.
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Calling any method other than end_of_stream() on the resulting buffer
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // is disallowed.
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static scoped_refptr<DataBuffer> CreateEOSBuffer();
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::TimeDelta timestamp() const {
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DCHECK(!end_of_stream());
44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return timestamp_;
45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void set_timestamp(const base::TimeDelta& timestamp) {
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DCHECK(!end_of_stream());
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    timestamp_ = timestamp;
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::TimeDelta duration() const {
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DCHECK(!end_of_stream());
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return duration_;
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void set_duration(const base::TimeDelta& duration) {
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DCHECK(!end_of_stream());
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    duration_ = duration;
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const uint8* data() const {
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DCHECK(!end_of_stream());
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return data_.get();
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  uint8* writable_data() {
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DCHECK(!end_of_stream());
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return data_.get();
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The size of valid data in bytes.
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Setting this value beyond the buffer size is disallowed.
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int data_size() const {
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DCHECK(!end_of_stream());
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return data_size_;
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void set_data_size(int data_size) {
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DCHECK(!end_of_stream());
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    CHECK_LE(data_size, buffer_size_);
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    data_size_ = data_size;
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If there's no data in this buffer, it represents end of stream.
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool end_of_stream() const { return data_ == NULL; }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class base::RefCountedThreadSafe<DataBuffer>;
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Allocates buffer of size |data_size|, copies [data,data+data_size) to
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the allocated buffer and sets data size to |data_size|.
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If |data| is null an end of stream buffer is created.
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DataBuffer(const uint8* data, int data_size);
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~DataBuffer();
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeDelta timestamp_;
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeDelta duration_;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<uint8[]> data_;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int buffer_size_;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int data_size_;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DataBuffer);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // MEDIA_BASE_DATA_BUFFER_H_
114