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

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

Issue 14328033: EVDA: Modify V4L APIs for 3.8 kernel (Closed) Base URL: https://chromium.googlesource.com/chromium/src@git-svn
Patch Set: 3.4/3.8 compatibility Created 7 years, 7 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <dlfcn.h> 5 #include <dlfcn.h>
6 #include <errno.h> 6 #include <errno.h>
7 #include <fcntl.h> 7 #include <fcntl.h>
8 #include <linux/videodev2.h> 8 #include <linux/videodev2.h>
9 #include <poll.h> 9 #include <poll.h>
10 #include <sys/eventfd.h> 10 #include <sys/eventfd.h>
(...skipping 1176 matching lines...) Expand 10 before | Expand all | Expand 10 after
1187 DCHECK_NE(decoder_state_, kUninitialized); 1187 DCHECK_NE(decoder_state_, kUninitialized);
1188 TRACE_EVENT0("Video Decoder", "EVDA::DequeueMfc"); 1188 TRACE_EVENT0("Video Decoder", "EVDA::DequeueMfc");
1189 1189
1190 // Dequeue completed MFC input (VIDEO_OUTPUT) buffers, and recycle to the free 1190 // Dequeue completed MFC input (VIDEO_OUTPUT) buffers, and recycle to the free
1191 // list. 1191 // list.
1192 struct v4l2_buffer dqbuf; 1192 struct v4l2_buffer dqbuf;
1193 struct v4l2_plane planes[2]; 1193 struct v4l2_plane planes[2];
1194 while (mfc_input_buffer_queued_count_ > 0) { 1194 while (mfc_input_buffer_queued_count_ > 0) {
1195 DCHECK(mfc_input_streamon_); 1195 DCHECK(mfc_input_streamon_);
1196 memset(&dqbuf, 0, sizeof(dqbuf)); 1196 memset(&dqbuf, 0, sizeof(dqbuf));
1197 memset(planes, 0, sizeof(planes));
1197 dqbuf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 1198 dqbuf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1198 dqbuf.memory = V4L2_MEMORY_MMAP; 1199 dqbuf.memory = V4L2_MEMORY_MMAP;
1200 dqbuf.m.planes = planes;
1201 dqbuf.length = 1;
1199 if (ioctl(mfc_fd_, VIDIOC_DQBUF, &dqbuf) != 0) { 1202 if (ioctl(mfc_fd_, VIDIOC_DQBUF, &dqbuf) != 0) {
1200 if (errno == EAGAIN) { 1203 if (errno == EAGAIN) {
1201 // EAGAIN if we're just out of buffers to dequeue. 1204 // EAGAIN if we're just out of buffers to dequeue.
1202 break; 1205 break;
1203 } 1206 }
1204 DPLOG(ERROR) << "DequeueMfc(): ioctl() failed: VIDIOC_DQBUF"; 1207 DPLOG(ERROR) << "DequeueMfc(): ioctl() failed: VIDIOC_DQBUF";
1205 NOTIFY_ERROR(PLATFORM_FAILURE); 1208 NOTIFY_ERROR(PLATFORM_FAILURE);
1206 return; 1209 return;
1207 } 1210 }
1208 MfcInputRecord& input_record = mfc_input_buffer_map_[dqbuf.index]; 1211 MfcInputRecord& input_record = mfc_input_buffer_map_[dqbuf.index];
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
1320 DVLOG(3) << "DequeueGsc()"; 1323 DVLOG(3) << "DequeueGsc()";
1321 DCHECK_EQ(decoder_thread_.message_loop(), base::MessageLoop::current()); 1324 DCHECK_EQ(decoder_thread_.message_loop(), base::MessageLoop::current());
1322 DCHECK_NE(decoder_state_, kUninitialized); 1325 DCHECK_NE(decoder_state_, kUninitialized);
1323 DCHECK_NE(decoder_state_, kInitialized); 1326 DCHECK_NE(decoder_state_, kInitialized);
1324 DCHECK_NE(decoder_state_, kAfterReset); 1327 DCHECK_NE(decoder_state_, kAfterReset);
1325 TRACE_EVENT0("Video Decoder", "EVDA::DequeueGsc"); 1328 TRACE_EVENT0("Video Decoder", "EVDA::DequeueGsc");
1326 1329
1327 // Dequeue completed GSC input (VIDEO_OUTPUT) buffers, and recycle to the free 1330 // Dequeue completed GSC input (VIDEO_OUTPUT) buffers, and recycle to the free
1328 // list. Also recycle the corresponding MFC output buffers at this time. 1331 // list. Also recycle the corresponding MFC output buffers at this time.
1329 struct v4l2_buffer dqbuf; 1332 struct v4l2_buffer dqbuf;
1333 struct v4l2_plane planes[2];
1330 while (gsc_input_buffer_queued_count_ > 0) { 1334 while (gsc_input_buffer_queued_count_ > 0) {
1331 DCHECK(gsc_input_streamon_); 1335 DCHECK(gsc_input_streamon_);
1332 memset(&dqbuf, 0, sizeof(dqbuf)); 1336 memset(&dqbuf, 0, sizeof(dqbuf));
1337 memset(planes, 0, sizeof(planes));
1333 dqbuf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 1338 dqbuf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1334 dqbuf.memory = V4L2_MEMORY_DMABUF; 1339 dqbuf.memory = V4L2_MEMORY_DMABUF;
1340 dqbuf.m.planes = planes;
1341 dqbuf.length = 2;
1335 if (ioctl(gsc_fd_, VIDIOC_DQBUF, &dqbuf) != 0) { 1342 if (ioctl(gsc_fd_, VIDIOC_DQBUF, &dqbuf) != 0) {
1336 if (errno == EAGAIN) { 1343 if (errno == EAGAIN) {
1337 // EAGAIN if we're just out of buffers to dequeue. 1344 // EAGAIN if we're just out of buffers to dequeue.
1338 break; 1345 break;
1339 } 1346 }
1340 DPLOG(ERROR) << "DequeueGsc(): ioctl() failed: VIDIOC_DQBUF"; 1347 DPLOG(ERROR) << "DequeueGsc(): ioctl() failed: VIDIOC_DQBUF";
1341 NOTIFY_ERROR(PLATFORM_FAILURE); 1348 NOTIFY_ERROR(PLATFORM_FAILURE);
1342 return; 1349 return;
1343 } 1350 }
1344 GscInputRecord& input_record = gsc_input_buffer_map_[dqbuf.index]; 1351 GscInputRecord& input_record = gsc_input_buffer_map_[dqbuf.index];
1345 MfcOutputRecord& output_record = 1352 MfcOutputRecord& output_record =
1346 mfc_output_buffer_map_[input_record.mfc_output]; 1353 mfc_output_buffer_map_[input_record.mfc_output];
1347 DCHECK(input_record.at_device); 1354 DCHECK(input_record.at_device);
1348 gsc_free_input_buffers_.push_back(dqbuf.index); 1355 gsc_free_input_buffers_.push_back(dqbuf.index);
1349 mfc_free_output_buffers_.push_back(input_record.mfc_output); 1356 mfc_free_output_buffers_.push_back(input_record.mfc_output);
1350 input_record.at_device = false; 1357 input_record.at_device = false;
1351 input_record.mfc_output = -1; 1358 input_record.mfc_output = -1;
1352 output_record.input_id = -1; 1359 output_record.input_id = -1;
1353 gsc_input_buffer_queued_count_--; 1360 gsc_input_buffer_queued_count_--;
1354 } 1361 }
1355 1362
1356 // Dequeue completed GSC output (VIDEO_CAPTURE) buffers, and send them off to 1363 // Dequeue completed GSC output (VIDEO_CAPTURE) buffers, and send them off to
1357 // the client. Don't recycle to its free list yet -- we can't do that until 1364 // the client. Don't recycle to its free list yet -- we can't do that until
1358 // ReusePictureBuffer() returns it to us. 1365 // ReusePictureBuffer() returns it to us.
1359 while (gsc_output_buffer_queued_count_ > 0) { 1366 while (gsc_output_buffer_queued_count_ > 0) {
1360 DCHECK(gsc_output_streamon_); 1367 DCHECK(gsc_output_streamon_);
1361 memset(&dqbuf, 0, sizeof(dqbuf)); 1368 memset(&dqbuf, 0, sizeof(dqbuf));
1369 memset(planes, 0, sizeof(planes));
1362 dqbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 1370 dqbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1363 dqbuf.memory = V4L2_MEMORY_DMABUF; 1371 dqbuf.memory = V4L2_MEMORY_DMABUF;
1372 dqbuf.m.planes = planes;
1373 dqbuf.length = 1;
1364 if (ioctl(gsc_fd_, VIDIOC_DQBUF, &dqbuf) != 0) { 1374 if (ioctl(gsc_fd_, VIDIOC_DQBUF, &dqbuf) != 0) {
1365 if (errno == EAGAIN) { 1375 if (errno == EAGAIN) {
1366 // EAGAIN if we're just out of buffers to dequeue. 1376 // EAGAIN if we're just out of buffers to dequeue.
1367 break; 1377 break;
1368 } 1378 }
1369 DPLOG(ERROR) << "DequeueGsc(): ioctl() failed: VIDIOC_DQBUF"; 1379 DPLOG(ERROR) << "DequeueGsc(): ioctl() failed: VIDIOC_DQBUF";
1370 NOTIFY_ERROR(PLATFORM_FAILURE); 1380 NOTIFY_ERROR(PLATFORM_FAILURE);
1371 return; 1381 return;
1372 } 1382 }
1373 GscOutputRecord& output_record = gsc_output_buffer_map_[dqbuf.index]; 1383 GscOutputRecord& output_record = gsc_output_buffer_map_[dqbuf.index];
(...skipping 679 matching lines...) Expand 10 before | Expand all | Expand 10 after
2053 IOCTL_OR_ERROR_RETURN_FALSE(gsc_fd_, VIDIOC_S_CTRL, &control); 2063 IOCTL_OR_ERROR_RETURN_FALSE(gsc_fd_, VIDIOC_S_CTRL, &control);
2054 2064
2055 memset(&control, 0, sizeof(control)); 2065 memset(&control, 0, sizeof(control));
2056 control.id = V4L2_CID_VFLIP; 2066 control.id = V4L2_CID_VFLIP;
2057 control.value = 0; 2067 control.value = 0;
2058 IOCTL_OR_ERROR_RETURN_FALSE(gsc_fd_, VIDIOC_S_CTRL, &control); 2068 IOCTL_OR_ERROR_RETURN_FALSE(gsc_fd_, VIDIOC_S_CTRL, &control);
2059 2069
2060 memset(&control, 0, sizeof(control)); 2070 memset(&control, 0, sizeof(control));
2061 control.id = V4L2_CID_GLOBAL_ALPHA; 2071 control.id = V4L2_CID_GLOBAL_ALPHA;
2062 control.value = 255; 2072 control.value = 255;
2063 IOCTL_OR_ERROR_RETURN_FALSE(gsc_fd_, VIDIOC_S_CTRL, &control); 2073 if (HANDLE_EINTR(ioctl(gsc_fd_, VIDIOC_S_CTRL, &control)) != 0) {
sheu 2013/05/23 23:03:04 This is the 3.4/3.8 compatibility bit.
2074 memset(&control, 0, sizeof(control));
2075 control.id = V4L2_CID_ALPHA_COMPONENT;
2076 control.value = 255;
2077 IOCTL_OR_ERROR_RETURN_FALSE(gsc_fd_, VIDIOC_S_CTRL, &control);
2078 }
2064 2079
2065 struct v4l2_requestbuffers reqbufs; 2080 struct v4l2_requestbuffers reqbufs;
2066 memset(&reqbufs, 0, sizeof(reqbufs)); 2081 memset(&reqbufs, 0, sizeof(reqbufs));
2067 reqbufs.count = kGscInputBufferCount; 2082 reqbufs.count = kGscInputBufferCount;
2068 reqbufs.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 2083 reqbufs.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
2069 reqbufs.memory = V4L2_MEMORY_USERPTR; 2084 reqbufs.memory = V4L2_MEMORY_USERPTR;
2070 IOCTL_OR_ERROR_RETURN_FALSE(gsc_fd_, VIDIOC_REQBUFS, &reqbufs); 2085 IOCTL_OR_ERROR_RETURN_FALSE(gsc_fd_, VIDIOC_REQBUFS, &reqbufs);
2071 2086
2072 gsc_input_buffer_map_.resize(reqbufs.count); 2087 gsc_input_buffer_map_.resize(reqbufs.count);
2073 for (size_t i = 0; i < gsc_input_buffer_map_.size(); ++i) { 2088 for (size_t i = 0; i < gsc_input_buffer_map_.size(); ++i) {
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
2219 reqbufs.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 2234 reqbufs.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
2220 reqbufs.memory = V4L2_MEMORY_DMABUF; 2235 reqbufs.memory = V4L2_MEMORY_DMABUF;
2221 if (ioctl(gsc_fd_, VIDIOC_REQBUFS, &reqbufs) != 0) 2236 if (ioctl(gsc_fd_, VIDIOC_REQBUFS, &reqbufs) != 0)
2222 DPLOG(ERROR) << "DestroyGscOutputBuffers(): ioctl() failed: VIDIOC_REQBUFS"; 2237 DPLOG(ERROR) << "DestroyGscOutputBuffers(): ioctl() failed: VIDIOC_REQBUFS";
2223 2238
2224 gsc_output_buffer_map_.clear(); 2239 gsc_output_buffer_map_.clear();
2225 gsc_free_output_buffers_.clear(); 2240 gsc_free_output_buffers_.clear();
2226 } 2241 }
2227 2242
2228 } // namespace content 2243 } // namespace content
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698