1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129

media / base / bitstream_buffer.h [blame]

// Copyright 2011 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef MEDIA_BASE_BITSTREAM_BUFFER_H_
#define MEDIA_BASE_BITSTREAM_BUFFER_H_

#include <stddef.h>
#include <stdint.h>

#include "base/memory/scoped_refptr.h"
#include "base/memory/unsafe_shared_memory_region.h"
#include "base/time/time.h"
#include "media/base/decoder_buffer.h"
#include "media/base/decrypt_config.h"
#include "media/base/media_export.h"
#include "media/base/timestamp_constants.h"

namespace IPC {
template <class P>
struct ParamTraits;
}

namespace media {

// Class for passing bitstream buffers around.  Does not take ownership of the
// data.  This is the media-namespace equivalent of PP_VideoBitstreamBuffer_Dev.
class MEDIA_EXPORT BitstreamBuffer {
 public:
  BitstreamBuffer();

  // Constructs a new BitstreamBuffer. The content of the bitstream is located
  // at |offset| bytes away from the start of the shared memory and the payload
  // is |size| bytes. When not provided, the default value for |offset| is 0.
  // |presentation_timestamp| is when the decoded frame should be displayed.
  // When not provided, |presentation_timestamp| will be
  // |media::kNoTimestamp|.
  BitstreamBuffer(int32_t id,
                  base::UnsafeSharedMemoryRegion region,
                  size_t size,
                  uint64_t offset = 0,
                  base::TimeDelta presentation_timestamp = kNoTimestamp);

  // Move operations are allowed.
  BitstreamBuffer(BitstreamBuffer&&);
  BitstreamBuffer& operator=(BitstreamBuffer&&);

  BitstreamBuffer(const BitstreamBuffer&) = delete;
  BitstreamBuffer& operator=(const BitstreamBuffer&) = delete;

  ~BitstreamBuffer();

  // Produce an equivalent DecoderBuffer. This may consume region(), even if
  // nullptr is returned.
  //
  // This method is only intended to be used by VDAs that are being converted to
  // use DecoderBuffer.
  //
  // The 2 arg variant adds |offset| to the internal offset and will then use
  // |size| bytes at that location. This is allowed to go beyond the size of the
  // buffer specified in the constructor, but it does ensure it does not go
  // beyond the size of the shared memory region.
  //
  // TODO(sandersd): Remove once all VDAs are converted.
  scoped_refptr<DecoderBuffer> ToDecoderBuffer();
  scoped_refptr<DecoderBuffer> ToDecoderBuffer(off_t offset, size_t size);

  // TODO(crbug.com/40563697): As this is only used by Android, include
  // EncryptionScheme and optional EncryptionPattern when updating for Android.
  void SetDecryptionSettings(const std::string& key_id,
                             const std::string& iv,
                             const std::vector<SubsampleEntry>& subsamples);

  // Taking the region invalidates the one in this BitstreamBuffer.
  base::UnsafeSharedMemoryRegion TakeRegion() { return std::move(region_); }

  // If a region needs to be taken from a const BitstreamBuffer, it must be
  // duplicated. This function makes that explicit.
  // TODO(crbug.com/40553989): this is probably only needed by legacy IPC, and
  // can be removed once that is converted to the new shared memory API.
  base::UnsafeSharedMemoryRegion DuplicateRegion() const {
    return region_.Duplicate();
  }

  const base::UnsafeSharedMemoryRegion& region() const { return region_; }

  int32_t id() const { return id_; }

  // The number of bytes of the actual bitstream data. It is the size of the
  // content instead of the whole shared memory.
  size_t size() const { return size_; }

  // The offset to the start of actual bitstream data in the shared memory.
  uint64_t offset() const { return offset_; }

  // The timestamp is only valid if it's not equal to |media::kNoTimestamp|.
  base::TimeDelta presentation_timestamp() const {
    return presentation_timestamp_;
  }

  // The following methods come from SetDecryptionSettings().
  const std::string& key_id() const { return key_id_; }
  const std::string& iv() const { return iv_; }
  const std::vector<SubsampleEntry>& subsamples() const { return subsamples_; }

 private:
  int32_t id_;
  base::UnsafeSharedMemoryRegion region_;
  size_t size_;
  uint64_t offset_;

  // Note: Not set by all clients.
  base::TimeDelta presentation_timestamp_;

  // Note that BitstreamBuffer uses the settings in Audio/VideoDecoderConfig
  // to determine the encryption mode and pattern (if required by the encryption
  // scheme).
  // TODO(timav): Try to DISALLOW_COPY_AND_ASSIGN and include these params as
  // std::unique_ptr<DecryptConfig> or explain why copy & assign is needed.
  std::string key_id_;                      // key ID.
  std::string iv_;                          // initialization vector
  std::vector<SubsampleEntry> subsamples_;  // clear/cypher sizes

  friend struct IPC::ParamTraits<media::BitstreamBuffer>;
};

}  // namespace media

#endif  // MEDIA_BASE_BITSTREAM_BUFFER_H_