forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbitstream_buffer.h
139 lines (111 loc) · 4.94 KB
/
bitstream_buffer.h
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
130
131
132
133
134
135
136
137
138
139
// Copyright (c) 2011 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.
#ifndef MEDIA_BASE_BITSTREAM_BUFFER_H_
#define MEDIA_BASE_BITSTREAM_BUFFER_H_
#include <stddef.h>
#include <stdint.h>
#include "base/macros.h"
#include "base/memory/platform_shared_memory_region.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::subtle::PlatformSharedMemoryRegion region,
size_t size,
off_t offset = 0,
base::TimeDelta presentation_timestamp = kNoTimestamp);
// As above, creating by unwrapping a base::UnsafeSharedMemoryRegion.
BitstreamBuffer(int32_t id,
base::UnsafeSharedMemoryRegion region,
size_t size,
off_t offset = 0,
base::TimeDelta presentation_timestamp = kNoTimestamp);
// Move operations are allowed.
BitstreamBuffer(BitstreamBuffer&&);
BitstreamBuffer& operator=(BitstreamBuffer&&);
~BitstreamBuffer();
// Produce an equivalent DecoderBuffer. This consumes region(), even if
// nullptr is returned.
//
// This method is only intended to be used by VDAs that are being converted to
// use DecoderBuffer.
//
// TODO(sandersd): Remove once all VDAs are converted.
scoped_refptr<DecoderBuffer> ToDecoderBuffer();
// TODO(crbug.com/813845): 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 invalides the one in this BitstreamBuffer.
base::subtle::PlatformSharedMemoryRegion 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/793446): this is probably only needed by legacy IPC, and can
// be removed once that is converted to the new shared memory API.
base::subtle::PlatformSharedMemoryRegion DuplicateRegion() const {
return region_.Duplicate();
}
const base::subtle::PlatformSharedMemoryRegion& 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.
off_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_;
}
void set_region(base::subtle::PlatformSharedMemoryRegion region) {
region_ = std::move(region);
}
// 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::subtle::PlatformSharedMemoryRegion region_;
size_t size_;
off_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>;
DISALLOW_COPY_AND_ASSIGN(BitstreamBuffer);
};
} // namespace media
#endif // MEDIA_BASE_BITSTREAM_BUFFER_H_