15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// 5e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <fcntl.h> 7e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include <libdrm/drm_fourcc.h> 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <linux/videodev2.h> 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <poll.h> 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <sys/eventfd.h> 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <sys/ioctl.h> 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <sys/mman.h> 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/debug/trace_event.h" 15e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "base/files/scoped_file.h" 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/posix/eintr_wrapper.h" 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/common/gpu/media/exynos_v4l2_video_device.h" 18e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "ui/gl/gl_bindings.h" 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace content { 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kDecoderDevice[] = "/dev/mfc-dec"; 24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kEncoderDevice[] = "/dev/mfc-enc"; 25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kImageProcessorDevice[] = "/dev/gsc1"; 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)ExynosV4L2Device::ExynosV4L2Device(Type type) 29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) : type_(type), 30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device_fd_(-1), 31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device_poll_interrupt_fd_(-1) {} 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ExynosV4L2Device::~ExynosV4L2Device() { 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (device_poll_interrupt_fd_ != -1) { 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) close(device_poll_interrupt_fd_); 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) device_poll_interrupt_fd_ = -1; 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (device_fd_ != -1) { 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) close(device_fd_); 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) device_fd_ = -1; 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int ExynosV4L2Device::Ioctl(int request, void* arg) { 45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return HANDLE_EINTR(ioctl(device_fd_, request, arg)); 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ExynosV4L2Device::Poll(bool poll_device, bool* event_pending) { 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) struct pollfd pollfds[2]; 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nfds_t nfds; 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int pollfd = -1; 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pollfds[0].fd = device_poll_interrupt_fd_; 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pollfds[0].events = POLLIN | POLLERR; 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nfds = 1; 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (poll_device) { 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DVLOG(3) << "Poll(): adding device fd to poll() set"; 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pollfds[nfds].fd = device_fd_; 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pollfds[nfds].events = POLLIN | POLLOUT | POLLERR | POLLPRI; 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pollfd = nfds; 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) nfds++; 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HANDLE_EINTR(poll(pollfds, nfds, -1)) == -1) { 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DPLOG(ERROR) << "poll() failed"; 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *event_pending = (pollfd != -1 && pollfds[pollfd].revents & POLLPRI); 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void* ExynosV4L2Device::Mmap(void* addr, 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unsigned int len, 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int prot, 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int flags, 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unsigned int offset) { 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return mmap(addr, len, prot, flags, device_fd_, offset); 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ExynosV4L2Device::Munmap(void* addr, unsigned int len) { 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) munmap(addr, len); 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ExynosV4L2Device::SetDevicePollInterrupt() { 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DVLOG(3) << "SetDevicePollInterrupt()"; 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const uint64 buf = 1; 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HANDLE_EINTR(write(device_poll_interrupt_fd_, &buf, sizeof(buf))) == -1) { 90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DPLOG(ERROR) << "SetDevicePollInterrupt(): write() failed"; 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ExynosV4L2Device::ClearDevicePollInterrupt() { 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DVLOG(3) << "ClearDevicePollInterrupt()"; 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) uint64 buf; 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HANDLE_EINTR(read(device_poll_interrupt_fd_, &buf, sizeof(buf))) == -1) { 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (errno == EAGAIN) { 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // No interrupt flag set, and we're reading nonblocking. Not an error. 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DPLOG(ERROR) << "ClearDevicePollInterrupt(): read() failed"; 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool ExynosV4L2Device::Initialize() { 113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const char* device_path = NULL; 114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) switch (type_) { 115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) case kDecoder: 116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device_path = kDecoderDevice; 117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) break; 118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) case kEncoder: 119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device_path = kEncoderDevice; 120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) break; 121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) case kImageProcessor: 122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device_path = kImageProcessorDevice; 123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) break; 124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DVLOG(2) << "Initialize(): opening device: " << device_path; 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Open the video device. 128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) device_fd_ = HANDLE_EINTR(open(device_path, O_RDWR | O_NONBLOCK | O_CLOEXEC)); 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (device_fd_ == -1) { 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) device_poll_interrupt_fd_ = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (device_poll_interrupt_fd_ == -1) { 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 139e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 140e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochEGLImageKHR ExynosV4L2Device::CreateEGLImage(EGLDisplay egl_display, 141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) EGLContext /* egl_context */, 142e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch GLuint texture_id, 143e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch gfx::Size frame_buffer_size, 144e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch unsigned int buffer_index, 145e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch size_t planes_count) { 146e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DVLOG(3) << "CreateEGLImage()"; 147e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 148e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch scoped_ptr<base::ScopedFD[]> dmabuf_fds(new base::ScopedFD[planes_count]); 149e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch for (size_t i = 0; i < planes_count; ++i) { 150e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Export the DMABUF fd so we can export it as a texture. 151e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch struct v4l2_exportbuffer expbuf; 152e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch memset(&expbuf, 0, sizeof(expbuf)); 153e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch expbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 154e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch expbuf.index = buffer_index; 155e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch expbuf.plane = i; 156e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch expbuf.flags = O_CLOEXEC; 157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (Ioctl(VIDIOC_EXPBUF, &expbuf) != 0) { 158e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return EGL_NO_IMAGE_KHR; 159e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 160e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch dmabuf_fds[i].reset(expbuf.fd); 161e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK_EQ(planes_count, 2u); 163e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EGLint attrs[] = { 164e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EGL_WIDTH, 0, EGL_HEIGHT, 0, 165e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EGL_LINUX_DRM_FOURCC_EXT, 0, EGL_DMA_BUF_PLANE0_FD_EXT, 0, 166e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EGL_DMA_BUF_PLANE0_OFFSET_EXT, 0, EGL_DMA_BUF_PLANE0_PITCH_EXT, 0, 167e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EGL_DMA_BUF_PLANE1_FD_EXT, 0, EGL_DMA_BUF_PLANE1_OFFSET_EXT, 0, 168e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EGL_DMA_BUF_PLANE1_PITCH_EXT, 0, EGL_NONE, }; 169e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch attrs[1] = frame_buffer_size.width(); 170e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch attrs[3] = frame_buffer_size.height(); 171e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch attrs[5] = DRM_FORMAT_NV12; 172e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch attrs[7] = dmabuf_fds[0].get(); 173e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch attrs[9] = 0; 174e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch attrs[11] = frame_buffer_size.width(); 175e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch attrs[13] = dmabuf_fds[1].get(); 176e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch attrs[15] = 0; 177e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch attrs[17] = frame_buffer_size.width(); 178e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 179e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EGLImageKHR egl_image = eglCreateImageKHR( 180e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch egl_display, EGL_NO_CONTEXT, EGL_LINUX_DMA_BUF_EXT, NULL, attrs); 181e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (egl_image == EGL_NO_IMAGE_KHR) { 182e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return egl_image; 183e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 184e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch glBindTexture(GL_TEXTURE_EXTERNAL_OES, texture_id); 185e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, egl_image); 186e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 187e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return egl_image; 188e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 189e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 190e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochEGLBoolean ExynosV4L2Device::DestroyEGLImage(EGLDisplay egl_display, 191e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch EGLImageKHR egl_image) { 192e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return eglDestroyImageKHR(egl_display, egl_image); 193e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 194e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 195e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochGLenum ExynosV4L2Device::GetTextureTarget() { return GL_TEXTURE_EXTERNAL_OES; } 196e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)uint32 ExynosV4L2Device::PreferredInputFormat() { 198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // TODO(posciak): We should support "dontcare" returns here once we 199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // implement proper handling (fallback, negotiation) for this in users. 200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CHECK_EQ(type_, kEncoder); 201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return V4L2_PIX_FMT_NV12M; 202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)uint32 ExynosV4L2Device::PreferredOutputFormat() { 205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // TODO(posciak): We should support "dontcare" returns here once we 206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // implement proper handling (fallback, negotiation) for this in users. 207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CHECK_EQ(type_, kDecoder); 208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return V4L2_PIX_FMT_NV12M; 209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 210e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace content 212