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

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

Issue 137023008: Add support for Tegra V4L2 VDA (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 10 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
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 <libdrm/drm_fourcc.h> 8 #include <libdrm/drm_fourcc.h>
9 #include <linux/videodev2.h> 9 #include <linux/videodev2.h>
10 #include <poll.h> 10 #include <poll.h>
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after
363 attrs[5] = DRM_FORMAT_NV12; 363 attrs[5] = DRM_FORMAT_NV12;
364 for (size_t i = 0; i < output_buffer_map_.size(); ++i) { 364 for (size_t i = 0; i < output_buffer_map_.size(); ++i) {
365 DCHECK(buffers[i].size() == frame_buffer_size_); 365 DCHECK(buffers[i].size() == frame_buffer_size_);
366 OutputRecord& output_record = output_buffer_map_[i]; 366 OutputRecord& output_record = output_buffer_map_[i];
367 attrs[7] = output_record.fds[0]; 367 attrs[7] = output_record.fds[0];
368 attrs[9] = 0; 368 attrs[9] = 0;
369 attrs[11] = frame_buffer_size_.width(); 369 attrs[11] = frame_buffer_size_.width();
370 attrs[13] = output_record.fds[1]; 370 attrs[13] = output_record.fds[1];
371 attrs[15] = 0; 371 attrs[15] = 0;
372 attrs[17] = frame_buffer_size_.width(); 372 attrs[17] = frame_buffer_size_.width();
373 EGLImageKHR egl_image = eglCreateImageKHR( 373 EGLImageKHR egl_image = device_->CreateEGLImage(
374 egl_display_, EGL_NO_CONTEXT, EGL_LINUX_DMA_BUF_EXT, NULL, attrs); 374 egl_display_, attrs, buffers[i].texture_id(), i);
375 if (egl_image == EGL_NO_IMAGE_KHR) { 375 if (egl_image == EGL_NO_IMAGE_KHR) {
376 DLOG(ERROR) << "AssignPictureBuffers(): could not create EGLImageKHR"; 376 DLOG(ERROR) << "AssignPictureBuffers(): could not create EGLImageKHR";
Ami GONE FROM CHROMIUM 2014/02/07 09:09:30 already logged in the Device method; unnecessary
377 NOTIFY_ERROR(PLATFORM_FAILURE); 377 NOTIFY_ERROR(PLATFORM_FAILURE);
378 return; 378 return;
379 } 379 }
380 380
381 glBindTexture(GL_TEXTURE_EXTERNAL_OES, buffers[i].texture_id());
382 glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, egl_image);
Pawel Osciak 2014/02/10 06:36:17 I would like to understand the big picture here pl
shivdasp 2014/02/10 13:31:17 The decoder's output buffers are created when REQB
Pawel Osciak 2014/02/12 09:15:13 By decoder do you mean V4L2VDA class?
shivdasp 2014/02/12 10:11:55 No I meant the decoder entity within the library.
Pawel Osciak 2014/02/13 10:42:54 So the YUV buffers are tied to the textures someho
shivdasp 2014/02/14 03:06:45 We send texture_id to eglCreateImageKHR and bind i
Pawel Osciak 2014/02/14 07:36:10 Wait, where do you send texture_id to eglCreateIma
shivdasp 2014/02/14 09:18:58 The texture_id is sent in eglCreateImageKHR parame
383 picture_buffers_ref->picture_buffers.push_back( 381 picture_buffers_ref->picture_buffers.push_back(
384 PictureBufferArrayRef::PictureBufferRef(egl_image, buffers[i].id())); 382 PictureBufferArrayRef::PictureBufferRef(egl_image, buffers[i].id()));
385 } 383 }
386 decoder_thread_.message_loop()->PostTask( 384 decoder_thread_.message_loop()->PostTask(
387 FROM_HERE, 385 FROM_HERE,
388 base::Bind(&V4L2VideoDecodeAccelerator::AssignPictureBuffersTask, 386 base::Bind(&V4L2VideoDecodeAccelerator::AssignPictureBuffersTask,
389 base::Unretained(this), 387 base::Unretained(this),
390 base::Passed(&picture_buffers_ref))); 388 base::Passed(&picture_buffers_ref)));
391 } 389 }
392 390
(...skipping 1240 matching lines...) Expand 10 before | Expand all | Expand 10 after
1633 } 1631 }
1634 } 1632 }
1635 1633
1636 bool V4L2VideoDecodeAccelerator::GetFormatInfo(struct v4l2_format* format, 1634 bool V4L2VideoDecodeAccelerator::GetFormatInfo(struct v4l2_format* format,
1637 bool* again) { 1635 bool* again) {
1638 DCHECK_EQ(decoder_thread_.message_loop(), base::MessageLoop::current()); 1636 DCHECK_EQ(decoder_thread_.message_loop(), base::MessageLoop::current());
1639 1637
1640 *again = false; 1638 *again = false;
1641 memset(format, 0, sizeof(*format)); 1639 memset(format, 0, sizeof(*format));
1642 format->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 1640 format->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1643 if (HANDLE_EINTR(device_->Ioctl(VIDIOC_G_FMT, format)) != 0) { 1641
1642 if (HANDLE_EINTR(device_->Ioctl(VIDIOC_G_FMT, format) != 0)) {
Ami GONE FROM CHROMIUM 2014/02/07 09:09:30 This is a bug!
1644 if (errno == EINVAL) { 1643 if (errno == EINVAL) {
1645 // EINVAL means we haven't seen sufficient stream to decode the format. 1644 // EINVAL means we haven't seen sufficient stream to decode the format.
1646 *again = true; 1645 *again = true;
1647 return true; 1646 return true;
1648 } else { 1647 } else {
1649 DPLOG(ERROR) << "DecodeBufferInitial(): ioctl() failed: VIDIOC_G_FMT"; 1648 DPLOG(ERROR) << "DecodeBufferInitial(): ioctl() failed: VIDIOC_G_FMT";
1650 NOTIFY_ERROR(PLATFORM_FAILURE); 1649 NOTIFY_ERROR(PLATFORM_FAILURE);
1651 return false; 1650 return false;
1652 } 1651 }
1653 } 1652 }
1654 1653
1654 // Since the underlying library at the moment is not updated this hack
Ami GONE FROM CHROMIUM 2014/02/07 09:09:30 This comment is opaque to me. Also, if something i
Pawel Osciak 2014/02/10 06:36:17 Could this hack be moved into the library itself t
shivdasp 2014/02/10 13:31:17 Apologies. This code was not meant to be here. Wil
1655 LOG(ERROR) << "Hardcoding the values here ";
1656 format->fmt.pix_mp.num_planes = 2;
1657 format->fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12M;
1658
1655 return true; 1659 return true;
1656 } 1660 }
1657 1661
1658 bool V4L2VideoDecodeAccelerator::CreateBuffersForFormat( 1662 bool V4L2VideoDecodeAccelerator::CreateBuffersForFormat(
1659 const struct v4l2_format& format) { 1663 const struct v4l2_format& format) {
1660 DCHECK_EQ(decoder_thread_.message_loop(), base::MessageLoop::current()); 1664 DCHECK_EQ(decoder_thread_.message_loop(), base::MessageLoop::current());
1661 CHECK_EQ(format.fmt.pix_mp.num_planes, 2); 1665 CHECK_EQ(format.fmt.pix_mp.num_planes, 2);
1662 frame_buffer_size_.SetSize( 1666 frame_buffer_size_.SetSize(
1663 format.fmt.pix_mp.width, format.fmt.pix_mp.height); 1667 format.fmt.pix_mp.width, format.fmt.pix_mp.height);
1664 output_buffer_pixelformat_ = format.fmt.pix_mp.pixelformat; 1668 output_buffer_pixelformat_ = format.fmt.pix_mp.pixelformat;
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
1778 1782
1779 DVLOG(3) << "CreateOutputBuffers(): ProvidePictureBuffers(): " 1783 DVLOG(3) << "CreateOutputBuffers(): ProvidePictureBuffers(): "
1780 << "buffer_count=" << output_buffer_map_.size() 1784 << "buffer_count=" << output_buffer_map_.size()
1781 << ", width=" << frame_buffer_size_.width() 1785 << ", width=" << frame_buffer_size_.width()
1782 << ", height=" << frame_buffer_size_.height(); 1786 << ", height=" << frame_buffer_size_.height();
1783 child_message_loop_proxy_->PostTask(FROM_HERE, 1787 child_message_loop_proxy_->PostTask(FROM_HERE,
1784 base::Bind(&Client::ProvidePictureBuffers, 1788 base::Bind(&Client::ProvidePictureBuffers,
1785 client_, 1789 client_,
1786 output_buffer_map_.size(), 1790 output_buffer_map_.size(),
1787 frame_buffer_size_, 1791 frame_buffer_size_,
1788 GL_TEXTURE_EXTERNAL_OES)); 1792 device_->GetTextureTarget()));
1789 1793
1790 return true; 1794 return true;
1791 } 1795 }
1792 1796
1793 void V4L2VideoDecodeAccelerator::DestroyInputBuffers() { 1797 void V4L2VideoDecodeAccelerator::DestroyInputBuffers() {
1794 DVLOG(3) << "DestroyInputBuffers()"; 1798 DVLOG(3) << "DestroyInputBuffers()";
1795 DCHECK(child_message_loop_proxy_->BelongsToCurrentThread()); 1799 DCHECK(child_message_loop_proxy_->BelongsToCurrentThread());
1796 DCHECK(!input_streamon_); 1800 DCHECK(!input_streamon_);
1797 1801
1798 for (size_t i = 0; i < input_buffer_map_.size(); ++i) { 1802 for (size_t i = 0; i < input_buffer_map_.size(); ++i) {
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
1918 1922
1919 void V4L2VideoDecodeAccelerator::PictureCleared() { 1923 void V4L2VideoDecodeAccelerator::PictureCleared() {
1920 DVLOG(3) << "PictureCleared(). clearing count=" << picture_clearing_count_; 1924 DVLOG(3) << "PictureCleared(). clearing count=" << picture_clearing_count_;
1921 DCHECK_EQ(decoder_thread_.message_loop(), base::MessageLoop::current()); 1925 DCHECK_EQ(decoder_thread_.message_loop(), base::MessageLoop::current());
1922 DCHECK_GT(picture_clearing_count_, 0); 1926 DCHECK_GT(picture_clearing_count_, 0);
1923 picture_clearing_count_--; 1927 picture_clearing_count_--;
1924 SendPictureReady(); 1928 SendPictureReady();
1925 } 1929 }
1926 1930
1927 } // namespace content 1931 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698