OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "media/mojo/services/mojo_video_decoder_service.h" | |
6 | |
7 #include "base/bind.h" | |
8 #include "base/bind_helpers.h" | |
9 #include "base/logging.h" | |
10 #include "media/base/decoder_buffer.h" | |
11 #include "media/base/video_decoder.h" | |
12 #include "media/base/video_decoder_config.h" | |
13 #include "media/base/video_frame.h" | |
14 #include "media/mojo/common/media_type_converters.h" | |
15 #include "media/mojo/services/mojo_media_client.h" | |
16 #include "mojo/public/c/system/types.h" | |
17 #include "mojo/public/cpp/system/buffer.h" | |
18 #include "mojo/public/cpp/system/handle.h" | |
19 | |
20 namespace media { | |
21 | |
22 MojoVideoDecoderService::MojoVideoDecoderService( | |
23 mojo::InterfaceRequest<interfaces::VideoDecoder> request, | |
24 MojoMediaClient* mojo_media_client) | |
25 : binding_(this, std::move(request)), | |
26 mojo_media_client_(mojo_media_client), | |
27 weak_factory_(this) { | |
28 weak_this_ = weak_factory_.GetWeakPtr(); | |
29 } | |
30 | |
31 MojoVideoDecoderService::~MojoVideoDecoderService() {} | |
32 | |
33 void MojoVideoDecoderService::Construct( | |
34 interfaces::VideoDecoderClientPtr client, | |
35 mojo::ScopedDataPipeConsumerHandle decoder_buffer_pipe) { | |
36 DVLOG(1) << __FUNCTION__; | |
37 CHECK(!decoder_); | |
38 | |
39 // TODO(sandersd): Provide callback for requesting a stub. | |
40 decoder_ = mojo_media_client_->CreateVideoDecoder( | |
41 base::ThreadTaskRunnerHandle::Get()); | |
42 | |
43 client_ = std::move(client); | |
44 decoder_buffer_pipe_ = std::move(decoder_buffer_pipe); | |
45 } | |
46 | |
47 void MojoVideoDecoderService::Initialize( | |
48 interfaces::VideoDecoderConfigPtr config, | |
49 bool low_delay, | |
50 const InitializeCallback& callback) { | |
51 DVLOG(1) << __FUNCTION__; | |
52 | |
53 if (!decoder_) { | |
54 callback.Run(false); | |
55 return; | |
56 } | |
57 | |
58 decoder_->Initialize( | |
59 config.To<VideoDecoderConfig>(), low_delay, nullptr, | |
60 base::Bind(&MojoVideoDecoderService::OnDecoderInitialized, weak_this_, | |
61 callback), | |
62 base::Bind(&MojoVideoDecoderService::OnDecoderOutput, weak_this_)); | |
63 } | |
64 | |
65 void MojoVideoDecoderService::OnDecoderInitialized( | |
66 const InitializeCallback& callback, | |
67 bool success) { | |
68 DVLOG(1) << __FUNCTION__; | |
69 callback.Run(success); | |
70 } | |
71 | |
72 void MojoVideoDecoderService::OnDecoderOutput( | |
73 const scoped_refptr<VideoFrame>& frame) { | |
74 DVLOG(1) << __FUNCTION__; | |
75 client_->OnVideoFrameDecoded(interfaces::VideoFrame::From(frame)); | |
76 } | |
77 | |
78 void MojoVideoDecoderService::Decode(interfaces::DecoderBufferPtr buffer, | |
79 const DecodeCallback& callback) { | |
80 DVLOG(1) << __FUNCTION__; | |
81 | |
82 if (!decoder_) { | |
83 callback.Run(interfaces::DecodeStatus::DECODE_ERROR); | |
84 return; | |
85 } | |
86 | |
87 scoped_refptr<DecoderBuffer> media_buffer( | |
88 buffer.To<scoped_refptr<DecoderBuffer>>()); | |
dcheng
2016/05/11 07:37:45
Which process is this running in? And where does t
sandersd (OOO until July 31)
2016/05/11 18:20:18
That does indeed look bad. Where can I find docume
dcheng
2016/05/11 18:26:24
https://www.chromium.org/developers/design-documen
sandersd (OOO until July 31)
2016/05/11 22:49:42
This looks large enough that it should be a separa
| |
89 if (!media_buffer->end_of_stream()) { | |
90 MojoHandleSignalsState state; | |
91 CHECK_EQ( | |
92 MojoWait(decoder_buffer_pipe_.get().value(), | |
93 MOJO_HANDLE_SIGNAL_READABLE, MOJO_DEADLINE_INDEFINITE, &state), | |
94 MOJO_RESULT_OK); | |
95 CHECK_EQ(state.satisfied_signals, MOJO_HANDLE_SIGNAL_READABLE); | |
96 uint32_t data_size = | |
97 base::checked_cast<uint32_t>(media_buffer->data_size()); | |
98 DCHECK_GT(data_size, 0u); | |
99 uint32_t bytes_read = data_size; | |
100 CHECK_EQ( | |
101 ReadDataRaw(decoder_buffer_pipe_.get(), media_buffer->writable_data(), | |
102 &bytes_read, MOJO_READ_DATA_FLAG_ALL_OR_NONE), | |
103 MOJO_RESULT_OK); | |
104 CHECK_EQ(bytes_read, data_size); | |
105 } | |
106 | |
107 decoder_->Decode(media_buffer, | |
108 base::Bind(&MojoVideoDecoderService::OnDecoderDecoded, | |
dcheng
2016/05/11 07:37:45
Why do we need a trampoline callback here?
sandersd (OOO until July 31)
2016/05/11 18:20:18
Because we can't cast |callback| from mojo::Callba
dcheng
2016/05/11 22:15:06
Blah. Going to ask the Mojo people about this toda
| |
109 weak_this_, callback)); | |
110 } | |
111 | |
112 void MojoVideoDecoderService::OnDecoderDecoded(const DecodeCallback& callback, | |
113 DecodeStatus status) { | |
114 DVLOG(1) << __FUNCTION__; | |
115 callback.Run(static_cast<interfaces::DecodeStatus>(status)); | |
116 } | |
117 | |
118 void MojoVideoDecoderService::Reset(const ResetCallback& callback) { | |
119 DVLOG(1) << __FUNCTION__; | |
120 if (!decoder_) { | |
121 callback.Run(); | |
122 return; | |
123 } | |
124 decoder_->Reset(base::Bind(&MojoVideoDecoderService::OnDecoderReset, | |
125 weak_this_, callback)); | |
126 } | |
127 | |
128 void MojoVideoDecoderService::OnDecoderReset(const ResetCallback& callback) { | |
129 DVLOG(1) << __FUNCTION__; | |
130 callback.Run(); | |
131 } | |
132 | |
133 } // namespace media | |
OLD | NEW |