Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(11)

Side by Side Diff: content/common/gpu/media/gpu_video_encode_accelerator.cc

Issue 20632002: Add media::VideoEncodeAccelerator with WebRTC integration (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@git-svn
Patch Set: 7fd9dbd5 More debugging statements, some fixes Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2013 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 "content/common/gpu/media/gpu_video_encode_accelerator.h"
6
7 #include "base/logging.h"
8 #include "content/common/gpu/gpu_channel.h"
9 #include "content/common/gpu/gpu_messages.h"
10 #include "ipc/ipc_message_macros.h"
11
12 namespace content {
13
14 GpuVideoEncodeAccelerator::GpuVideoEncodeAccelerator(GpuChannel* gpu_channel,
15 int32 route_id)
16 : channel_(gpu_channel), route_id_(route_id) {}
17
18 GpuVideoEncodeAccelerator::~GpuVideoEncodeAccelerator() {
19 encoder_.release()->Destroy();
Ami GONE FROM CHROMIUM 2013/07/31 23:01:12 will crash if CreateEncoder() didn't succeed.
sheu 2013/08/02 01:27:49 Done.
20 }
21
22 bool GpuVideoEncodeAccelerator::OnMessageReceived(const IPC::Message& message) {
23 bool handled = true;
24 IPC_BEGIN_MESSAGE_MAP(GpuVideoEncodeAccelerator, message)
25 IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderMsg_Initialize, OnInitialize)
26 IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderMsg_Encode, OnEncode)
27 IPC_MESSAGE_HANDLER(AcceleratedVideoEncoderMsg_UseOutputBitstreamBuffer,
28 OnUseOutputBitstreamBuffer)
29 IPC_MESSAGE_HANDLER(
30 AcceleratedVideoEncoderMsg_RequestEncodingParameterChange,
31 OnRequestEncodingParameterChange)
32 IPC_MESSAGE_UNHANDLED(handled = false)
33 IPC_END_MESSAGE_MAP()
34 return handled;
35 }
36
37 void GpuVideoEncodeAccelerator::OnChannelError() {
38 NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError);
39 if (channel_)
40 channel_ = NULL;
41 }
42
43 void GpuVideoEncodeAccelerator::NotifyInitializeDone() {
44 if (!Send(
45 new AcceleratedVideoEncoderHostMsg_NotifyInitializeDone(route_id_))) {
46 DLOG(ERROR) << "GpuVideoEncodeAccelerator::NotifyInitializeDone(): "
Ami GONE FROM CHROMIUM 2013/07/31 23:01:12 Here and (lots of) elsewhere, Send() does its own
sheu 2013/08/02 01:27:49 Sounds good.
47 "Send() failed";
48 }
49 }
50
51 void GpuVideoEncodeAccelerator::RequireBitstreamBuffers(
52 int input_count,
53 const gfx::Size& input_dimensions,
54 size_t output_size) {
55 if (!Send(new AcceleratedVideoEncoderHostMsg_RequireBitstreamBuffers(
56 route_id_, input_count, input_dimensions, output_size))) {
57 DLOG(ERROR) << "GpuVideoEncodeAccelerator::RequireBitstreamBuffers(): "
58 "Send() failed";
59 }
60 }
61
62 void GpuVideoEncodeAccelerator::NotifyInputDone(int32 bitstream_buffer_id) {
63 if (!Send(new AcceleratedVideoEncoderHostMsg_NotifyInputDone(
64 route_id_, bitstream_buffer_id))) {
65 DLOG(ERROR) << "GpuVideoEncodeAccelerator::NotifyInputDone(): "
66 "Send() failed: bitstream_buffer_id=" << bitstream_buffer_id;
67 }
68 }
69
70 void GpuVideoEncodeAccelerator::BitstreamBufferReady(int32 bitstream_buffer_id,
71 size_t payload_size,
72 bool key_frame) {
73 if (!Send(new AcceleratedVideoEncoderHostMsg_BitstreamBufferReady(
74 route_id_, bitstream_buffer_id, payload_size, key_frame))) {
75 DLOG(ERROR) << "GpuVideoEncodeAccelerator::BitstreamBufferReady(): "
76 "Send() failed: bitstream_buffer_id=" << bitstream_buffer_id;
77 }
78 }
79
80 void GpuVideoEncodeAccelerator::NotifyError(
81 media::VideoEncodeAccelerator::Error error) {
82 if (!Send(new AcceleratedVideoEncoderHostMsg_NotifyError(route_id_, error))) {
83 DLOG(ERROR) << "GpuVideoEncodeAccelerator::NotifyError(): Send() failed: "
84 "error=" << error;
85 }
86 }
87
88 // static
89 std::vector<media::VideoEncodeAccelerator::SupportedProfile>
90 GpuVideoEncodeAccelerator::GetSupportedProfiles() {
91 std::vector<media::VideoEncodeAccelerator::SupportedProfile> profiles;
92
93 // TODO(sheu): return platform-specific profiles.
94 return profiles;
95 }
96
97 scoped_ptr<media::VideoEncodeAccelerator>
98 GpuVideoEncodeAccelerator::CreateEncoder() {
99 scoped_ptr<media::VideoEncodeAccelerator> encoder;
100
101 // TODO(sheu): return platform-specific encoder.
102 return encoder.Pass();
103 }
104
105 bool GpuVideoEncodeAccelerator::Send(IPC::Message* message) {
106 if (!channel_) {
107 DLOG(ERROR) << "GpuVideoEncodeAccelerator::Send(): no channel";
108 delete message;
Ami GONE FROM CHROMIUM 2013/07/31 23:01:12 NotifyError?
sheu 2013/08/02 01:27:49 <zen> what is the sound of a NULL IPC channel send
109 return false;
110 } else if (!channel_->Send(message)) {
111 DLOG(ERROR) << "GpuVideoEncodeAccelerator::Send(): sending failed";
112 NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError);
113 return false;
114 }
115 return true;
116 }
117
118 void GpuVideoEncodeAccelerator::OnInitialize(
119 media::VideoFrame::Format input_format,
120 const gfx::Size& input_resolution,
121 media::VideoCodecProfile output_profile,
122 int32 initial_bitrate) {
123 DVLOG(2) << "GpuVideoEncodeAccelerator::OnInitialize(): "
124 "input_format=" << input_format
125 << ", input_resolution=" << input_resolution.width()
126 << "x" << input_resolution.height()
Ami GONE FROM CHROMIUM 2013/07/31 23:01:12 here and elsewhere you could use gfx::Size::ToStri
sheu 2013/08/02 01:27:49 Did not know that existed. Sweet!
127 << ", output_profile=" << output_profile
128 << ", initial_bitrate=" << initial_bitrate;
129 DCHECK(!encoder_);
130 encoder_ = CreateEncoder().Pass();
131 if (!encoder_) {
132 DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnInitialize(): VEA creation "
133 "failed";
134 NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError);
135 return;
136 }
137
138 encoder_->Initialize(
139 input_format, input_resolution, output_profile, initial_bitrate);
140 }
141
142 void GpuVideoEncodeAccelerator::OnEncode(int32 buffer_id,
143 base::SharedMemoryHandle buffer_handle,
144 uint32 buffer_size,
145 bool force_keyframe) {
146 DVLOG(3) << "GpuVideoEncodeAccelerator::OnEncode(): buffer_id=" << buffer_id
147 << ", buffer_size=" << buffer_size
148 << ", force_keyframe=" << force_keyframe;
149 if (!encoder_)
150 return;
151 if (buffer_id < 0) {
152 DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnEncode(): invalid buffer_id="
153 << buffer_id;
154 NotifyError(media::VideoEncodeAccelerator::kInvalidArgumentError);
155 return;
156 }
157 encoder_->Encode(
158 media::BitstreamBuffer(buffer_id, buffer_handle, buffer_size),
159 force_keyframe);
160 }
161
162 void GpuVideoEncodeAccelerator::OnUseOutputBitstreamBuffer(
163 int32 buffer_id,
164 base::SharedMemoryHandle buffer_handle,
165 uint32 buffer_size) {
166 DVLOG(3) << "GpuVideoEncodeAccelerator::OnUseOutputBitstreamBuffer(): "
167 "buffer_id=" << buffer_id
168 << ", buffer_size=" << buffer_size;
169 if (!encoder_)
170 return;
171 if (buffer_id < 0) {
172 DLOG(ERROR) << "GpuVideoEncodeAccelerator::OnEncode(): invalid buffer_id="
173 << buffer_id;
174 NotifyError(media::VideoEncodeAccelerator::kInvalidArgumentError);
175 return;
176 }
177 encoder_->UseOutputBitstreamBuffer(
178 media::BitstreamBuffer(buffer_id, buffer_handle, buffer_size));
179 }
180
181 void GpuVideoEncodeAccelerator::OnRequestEncodingParameterChange(
182 int32 bitrate) {
183 DVLOG(2) << "GpuVideoEncodeAccelerator::OnRequestEncodingParametersChange(): "
184 "bitrate=" << bitrate;
185 if (!encoder_)
186 return;
187 encoder_->RequestEncodingParameterChange(bitrate);
188 }
189
190 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698