Take advantage of MojoGetBufferInformation
Now that we can ask a shared buffer what size it is before we map it, stop
explicitly passing the size across the media subsystem's MediaConsumer
interface.
BUG=
R=dalesat@chromium.org, viettrungluu@chromium.org
Review URL: https://codereview.chromium.org/1823833003 .
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/media/media_transport.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/media/media_transport.mojom.dart
index c8ffc41..14b2d3a 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/media/media_transport.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/media/media_transport.mojom.dart
@@ -769,10 +769,9 @@
class _MediaConsumerSetBufferParams extends bindings.Struct {
static const List<bindings.StructDataHeader> kVersions = const [
- const bindings.StructDataHeader(24, 0)
+ const bindings.StructDataHeader(16, 0)
];
core.MojoSharedBuffer buffer = null;
- int size = 0;
_MediaConsumerSetBufferParams() : super(kVersions.last.size);
@@ -813,10 +812,6 @@
result.buffer = decoder0.decodeSharedBufferHandle(8, false);
}
- if (mainDataHeader.version >= 0) {
-
- result.size = decoder0.decodeUint64(16);
- }
return result;
}
@@ -829,19 +824,11 @@
"buffer of struct _MediaConsumerSetBufferParams: $e";
rethrow;
}
- try {
- encoder0.encodeUint64(size, 16);
- } on bindings.MojoCodecError catch(e) {
- e.message = "Error encountered while encoding field "
- "size of struct _MediaConsumerSetBufferParams: $e";
- rethrow;
- }
}
String toString() {
return "_MediaConsumerSetBufferParams("
- "buffer: $buffer" ", "
- "size: $size" ")";
+ "buffer: $buffer" ")";
}
Map toJson() {
@@ -1906,7 +1893,7 @@
abstract class MediaConsumer {
static const String serviceName = null;
- dynamic setBuffer(core.MojoSharedBuffer buffer,int size,[Function responseFactory = null]);
+ dynamic setBuffer(core.MojoSharedBuffer buffer,[Function responseFactory = null]);
dynamic sendPacket(MediaPacket packet,[Function responseFactory = null]);
dynamic prime([Function responseFactory = null]);
dynamic flush([Function responseFactory = null]);
@@ -2032,10 +2019,9 @@
_MediaConsumerProxyImpl _proxyImpl;
_MediaConsumerProxyCalls(this._proxyImpl);
- dynamic setBuffer(core.MojoSharedBuffer buffer,int size,[Function responseFactory = null]) {
+ dynamic setBuffer(core.MojoSharedBuffer buffer,[Function responseFactory = null]) {
var params = new _MediaConsumerSetBufferParams();
params.buffer = buffer;
- params.size = size;
return _proxyImpl.sendMessageWithRequestId(
params,
_mediaConsumerMethodSetBufferName,
@@ -2177,7 +2163,7 @@
case _mediaConsumerMethodSetBufferName:
var params = _MediaConsumerSetBufferParams.deserialize(
message.payload);
- var response = _impl.setBuffer(params.buffer,params.size,_mediaConsumerSetBufferResponseParamsFactory);
+ var response = _impl.setBuffer(params.buffer,_mediaConsumerSetBufferResponseParamsFactory);
if (response is Future) {
return response.then((response) {
if (response != null) {
diff --git a/mojo/services/media/common/cpp/circular_buffer_media_pipe_adapter.cc b/mojo/services/media/common/cpp/circular_buffer_media_pipe_adapter.cc
index 180577c..abf23f4 100644
--- a/mojo/services/media/common/cpp/circular_buffer_media_pipe_adapter.cc
+++ b/mojo/services/media/common/cpp/circular_buffer_media_pipe_adapter.cc
@@ -115,9 +115,7 @@
return;
}
- // TODO(johngro) : We should not have to send the buffer size, it should be an
- // intrinsic property of the buffer itself and be query-able via the handle.
- pipe_->SetBuffer(duplicated_handle.Pass(), buffer_size_, []() {});
+ pipe_->SetBuffer(duplicated_handle.Pass(), []() {});
}
void CircularBufferMediaPipeAdapter::SetSignalCallback(SignalCbk cbk) {
diff --git a/mojo/services/media/common/cpp/mapped_shared_buffer.cc b/mojo/services/media/common/cpp/mapped_shared_buffer.cc
index 5d0cb4b..976858a 100644
--- a/mojo/services/media/common/cpp/mapped_shared_buffer.cc
+++ b/mojo/services/media/common/cpp/mapped_shared_buffer.cc
@@ -18,25 +18,30 @@
buffer_.reset(new SharedBuffer(size));
handle_.reset();
- InitInternal(buffer_->handle, size);
+ InitInternal(buffer_->handle);
}
-void MappedSharedBuffer::InitFromHandle(
- ScopedSharedBufferHandle handle,
- uint64_t size) {
+void MappedSharedBuffer::InitFromHandle(ScopedSharedBufferHandle handle) {
MOJO_DCHECK(handle.is_valid());
- MOJO_DCHECK(size > 0);
buffer_.reset();
handle_ = handle.Pass();
- InitInternal(handle_, size);
+ InitInternal(handle_);
}
-void MappedSharedBuffer::InitInternal(
- ScopedSharedBufferHandle& handle,
- uint64_t size) {
+void MappedSharedBuffer::InitInternal(const ScopedSharedBufferHandle& handle) {
MOJO_DCHECK(handle.is_valid());
+
+ // Query the buffer for its size.
+ // TODO(johngro) : It would be nice if we could do something other than
+ // DCHECK if things don't go exactly our way.
+ MojoBufferInformation info;
+ MojoResult res = MojoGetBufferInformation(handle.get().value(),
+ &info,
+ sizeof(info));
+ uint64_t size = info.num_bytes;
+ MOJO_DCHECK(res == MOJO_RESULT_OK);
MOJO_DCHECK(size > 0);
size_ = size;
@@ -45,7 +50,7 @@
void* ptr;
auto result = MapBuffer(
handle.get(),
- 0, // offset
+ 0, // offset
size,
&ptr,
MOJO_MAP_BUFFER_FLAG_NONE);
@@ -100,5 +105,5 @@
void MappedSharedBuffer::OnInit() {}
-} // namespace media
-} // namespace mojo
+} // namespace media
+} // namespace mojo
diff --git a/mojo/services/media/common/cpp/mapped_shared_buffer.h b/mojo/services/media/common/cpp/mapped_shared_buffer.h
index 5fd7e8a..9002393 100644
--- a/mojo/services/media/common/cpp/mapped_shared_buffer.h
+++ b/mojo/services/media/common/cpp/mapped_shared_buffer.h
@@ -31,7 +31,7 @@
void InitNew(uint64_t size);
// Initializes from a handle to an existing shared buffer.
- void InitFromHandle(ScopedSharedBufferHandle handle, uint64_t size);
+ void InitFromHandle(ScopedSharedBufferHandle handle);
// Indicates whether the buffer is initialized.
bool initialized() const;
@@ -49,7 +49,7 @@
uint64_t OffsetFromPtr(void *payload_ptr) const;
protected:
- void InitInternal(ScopedSharedBufferHandle& handle, uint64_t size);
+ void InitInternal(const ScopedSharedBufferHandle& handle);
// Does nothing. Called when initialization is complete. Subclasses may
// override.
@@ -78,4 +78,4 @@
} // namespace media
} // namespace mojo
-#endif // MOJO_SERVICES_MEDIA_COMMON_CPP_MAPPED_SHARED_BUFFER_H_
+#endif // MOJO_SERVICES_MEDIA_COMMON_CPP_MAPPED_SHARED_BUFFER_H_
diff --git a/mojo/services/media/common/interfaces/media_transport.mojom b/mojo/services/media/common/interfaces/media_transport.mojom
index da31dfd..736a8ce 100644
--- a/mojo/services/media/common/interfaces/media_transport.mojom
+++ b/mojo/services/media/common/interfaces/media_transport.mojom
@@ -119,7 +119,7 @@
};
// Sets the shared buffer in which packet payload will be located.
- SetBuffer(handle<shared_buffer> buffer, uint64 size) => ();
+ SetBuffer(handle<shared_buffer> buffer) => ();
// Sends a packet to the consumer. The callback signals that the consumer
// is done with the packet buffer region.
diff --git a/services/media/common/media_pipe_base.cc b/services/media/common/media_pipe_base.cc
index 069283c..6c8e2c5 100644
--- a/services/media/common/media_pipe_base.cc
+++ b/services/media/common/media_pipe_base.cc
@@ -40,27 +40,38 @@
}
void MediaPipeBase::SetBuffer(ScopedSharedBufferHandle handle,
- uint64_t size,
const SetBufferCallback& cbk) {
+ DCHECK(handle.is_valid());
+
// Double init? Close the connection.
if (buffer_) {
- LOG(ERROR) << "Attempting to set a new buffer (size = "
- << size
- << ") on a MediaConsumer which already has a buffer (size = "
+ LOG(ERROR) << "Attempting to set a new buffer on a MediaConsumer which "
+ "already has a buffer assigned. (size = "
<< buffer_->size()
<< ")";
Reset();
return;
}
+ // Query the buffer for its size. If we fail to query the info, close the
+ // connection.
+ MojoResult res;
+ MojoBufferInformation info;
+ res = MojoGetBufferInformation(handle.get().value(), &info, sizeof(info));
+ if (res != MOJO_RESULT_OK) {
+ LOG(ERROR) << "Failed to query shared buffer info (res = " << res << ")";
+ Reset();
+ return;
+ }
+
// Invalid size? Close the connection.
+ uint64_t size = info.num_bytes;
if (!size || (size > MediaConsumer::kMaxBufferLen)) {
LOG(ERROR) << "Invalid shared buffer size (size = " << size << ")";
Reset();
return;
}
-
// Failed to map the buffer? Close the connection.
buffer_ = MappedSharedBuffer::Create(handle.Pass(), size);
if (!buffer_) {
@@ -183,7 +194,7 @@
MediaPipeBase::MappedSharedBuffer::MappedSharedBuffer(
ScopedSharedBufferHandle handle,
- size_t size)
+ uint64_t size)
: handle_(handle.Pass()),
size_(size) {
MojoResult res = MapBuffer(handle_.get(),
diff --git a/services/media/common/media_pipe_base.h b/services/media/common/media_pipe_base.h
index e5d3284..96c8afc 100644
--- a/services/media/common/media_pipe_base.h
+++ b/services/media/common/media_pipe_base.h
@@ -67,10 +67,10 @@
void* base() const { return base_; }
private:
- MappedSharedBuffer(ScopedSharedBufferHandle handle, size_t size);
+ MappedSharedBuffer(ScopedSharedBufferHandle handle, uint64_t size);
ScopedSharedBufferHandle handle_;
- size_t size_;
+ uint64_t size_;
void* base_ = nullptr;
};
@@ -85,7 +85,6 @@
// MediaConsumer.mojom implementation.
void SetBuffer(ScopedSharedBufferHandle handle,
- uint64_t size,
const SetBufferCallback& cbk) final;
void SendPacket(MediaPacketPtr packet,
const SendPacketCallback& cbk) final;
diff --git a/services/media/framework_mojo/mojo_consumer.cc b/services/media/framework_mojo/mojo_consumer.cc
index 2efb5e3..37f3032 100644
--- a/services/media/framework_mojo/mojo_consumer.cc
+++ b/services/media/framework_mojo/mojo_consumer.cc
@@ -37,9 +37,8 @@
void MojoConsumer::SetBuffer(
ScopedSharedBufferHandle buffer,
- uint64_t size,
const SetBufferCallback& callback) {
- buffer_.InitFromHandle(buffer.Pass(), size);
+ buffer_.InitFromHandle(buffer.Pass());
callback.Run();
}
@@ -116,5 +115,5 @@
delete this;
}
-} // namespace media
-} // namespace mojo
+} // namespace media
+} // namespace mojo
diff --git a/services/media/framework_mojo/mojo_consumer.h b/services/media/framework_mojo/mojo_consumer.h
index 076623e..c464373 100644
--- a/services/media/framework_mojo/mojo_consumer.h
+++ b/services/media/framework_mojo/mojo_consumer.h
@@ -52,7 +52,6 @@
// MediaConsumer implementation.
void SetBuffer(
ScopedSharedBufferHandle buffer,
- uint64_t size,
const SetBufferCallback& callback) override;
void SendPacket(MediaPacketPtr packet, const SendPacketCallback& callback)
diff --git a/services/media/framework_mojo/mojo_producer.cc b/services/media/framework_mojo/mojo_producer.cc
index 744feed..a876395 100644
--- a/services/media/framework_mojo/mojo_producer.cc
+++ b/services/media/framework_mojo/mojo_producer.cc
@@ -29,7 +29,7 @@
{
base::AutoLock lock(lock_);
- max_pushes_outstanding_ = 10; // TODO(dalesat): Made up!
+ max_pushes_outstanding_ = 10; // TODO(dalesat): Made up!
demand = current_pushes_outstanding_ < max_pushes_outstanding_ ?
Demand::kPositive :
Demand::kNegative;
@@ -57,7 +57,7 @@
DCHECK(consumer_.is_bound());
consumer_->Flush(callback);
first_pts_since_flush_ = Packet::kUnknownPts;
- end_of_stream_= false;
+ end_of_stream_ = false;
}
void MojoProducer::SetStatusCallback(
@@ -129,12 +129,11 @@
consumer_ = MediaConsumerPtr::Create(std::move(consumer));
if (!mojo_allocator_.initialized()) {
- mojo_allocator_.InitNew(256 * 1024); // TODO(dalesat): Made up!
+ mojo_allocator_.InitNew(256 * 1024); // TODO(dalesat): Made up!
}
consumer_->SetBuffer(
mojo_allocator_.GetDuplicateHandle(),
- mojo_allocator_.size(),
[callback]() {
callback.Run();
});
@@ -198,5 +197,5 @@
return media_packet.Pass();
}
-} // namespace media
-} // namespace mojo
+} // namespace media
+} // namespace mojo