1afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin/* 2afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin * Copyright Samsung Electronics Co.,LTD. 3afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin * Copyright (C) 2011 The Android Open Source Project 4afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin * 5afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin * Licensed under the Apache License, Version 2.0 (the "License"); 6afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin * you may not use this file except in compliance with the License. 7afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin * You may obtain a copy of the License at 8afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin * 9afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin * http://www.apache.org/licenses/LICENSE-2.0 10afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin * 11afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin * Unless required by applicable law or agreed to in writing, software 12afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin * distributed under the License is distributed on an "AS IS" BASIS, 13afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin * See the License for the specific language governing permissions and 15afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin * limitations under the License. 16afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin */ 17afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 18afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin#include <stdio.h> 19afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin#include <stdlib.h> 20afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin#include <sys/types.h> 21afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin#include <sys/stat.h> 22afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin#include <sys/ioctl.h> 23afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin#include <fcntl.h> 24afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin#include <ctype.h> 25afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin#include <unistd.h> 26afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin#include <sys/mman.h> 27afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin#include <string.h> 28afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin#include <errno.h> 29afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin#include <signal.h> 30afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin#include <math.h> 31afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin#include <sys/poll.h> 32afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 33afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin#include <cutils/log.h> 34afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 35afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin#include <utils/Log.h> 36afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 37afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin#include "ExynosJpegApi.h" 38afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 39afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin#define JPEG_DEC_NODE "/dev/video11" 40afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin#define JPEG_ENC_NODE "/dev/video12" 41afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 42afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin#define MAX_JPG_WIDTH (8192) 43afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin#define MAX_JPG_HEIGHT (8192) 44afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 45afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin#define JPEG_ERROR_LOG(fmt,...) 46afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 47afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung ShinExynosJpegBase::ExynosJpegBase() 48afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 49afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 50afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 51afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung ShinExynosJpegBase::~ExynosJpegBase() 52afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 53afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 54afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 55afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::t_v4l2Querycap(int iFd) 56afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 57afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin struct v4l2_capability cap; 58afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin int iRet = ERROR_NONE; 59afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 60afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = ioctl(iFd, VIDIOC_QUERYCAP, &cap); 61afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 62afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d]: VIDIOC_QUERYCAP failed\n", __func__, iRet); 63afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 64afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 65afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 66afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 67afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 68afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 69afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::t_v4l2SetJpegcomp(int iFd, int iQuality) 70afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 71afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin struct v4l2_jpegcompression arg; 72afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin int iRet = ERROR_NONE; 73afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 74afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin arg.quality = iQuality; 75afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 76afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = ioctl(iFd, VIDIOC_S_JPEGCOMP, &arg); 77afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 78afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d]: VIDIOC_S_JPEGCOMP failed\n", __func__, iRet); 79afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 80afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 81afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 82afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 83afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 84afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 85afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::t_v4l2SetFmt(int iFd, enum v4l2_buf_type eType, struct CONFIG *pstConfig) 86afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 87afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin struct v4l2_format fmt; 88afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin int iRet = ERROR_NONE; 89afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 90afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin fmt.type = eType; 91afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin fmt.fmt.pix_mp.width = pstConfig->width; 92afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin fmt.fmt.pix_mp.height = pstConfig->height; 93afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin fmt.fmt.pix_mp.field = V4L2_FIELD_ANY; 94afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin fmt.fmt.pix_mp.num_planes = pstConfig->numOfPlanes; 95afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 96afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (pstConfig->mode == MODE_ENCODE) 97afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin fmt.fmt.pix_mp.colorspace = V4L2_COLORSPACE_JPEG; 98afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 99afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin switch (fmt.type) { 100afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_BUF_TYPE_VIDEO_OUTPUT: // fall through 101afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_BUF_TYPE_VIDEO_CAPTURE: 102afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 103afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE: 104afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (pstConfig->mode == MODE_ENCODE) { 105afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin fmt.fmt.pix_mp.pixelformat = pstConfig->pix.enc_fmt.in_fmt; 106afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } else { 107afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin fmt.fmt.pix_mp.pixelformat = pstConfig->pix.dec_fmt.in_fmt; 108afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin fmt.fmt.pix_mp.plane_fmt[0].sizeimage = pstConfig->sizeJpeg; 109afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 110afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 111afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE: 112afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (pstConfig->mode == MODE_ENCODE) { 113afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin fmt.fmt.pix_mp.pixelformat = pstConfig->pix.enc_fmt.out_fmt; 114afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } else { 115afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin fmt.fmt.pix_mp.pixelformat = pstConfig->pix.dec_fmt.out_fmt; 116afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin fmt.fmt.pix_mp.width = pstConfig->scaled_width; 117afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin fmt.fmt.pix_mp.height = pstConfig->scaled_height; 118afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 119afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 120afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin default: 121afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_V4l2_BUF_TYPE; 122afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 123afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 124afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 125afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = ioctl(iFd, VIDIOC_S_FMT, &fmt); 126afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 127afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d]: VIDIOC_S_FMT failed\n", __func__, iRet); 128afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 129afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 130afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 131afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 132afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 133afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 134afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::t_v4l2GetFmt(int iFd, enum v4l2_buf_type eType, struct CONFIG *pstConfig) 135afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 136afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin struct v4l2_format fmt; 137afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin int iRet = ERROR_NONE; 138afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 139afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin fmt.type = eType; 140afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = ioctl(iFd, VIDIOC_G_FMT, &fmt); 141afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 142afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d]: VIDIOC_G_FMT failed\n", __func__, iRet); 143afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 144afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 145afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 146afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin switch (fmt.type) { 147afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_BUF_TYPE_VIDEO_OUTPUT: // fall through 148afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_BUF_TYPE_VIDEO_CAPTURE: 149afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin pstConfig->width = fmt.fmt.pix.width; 150afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin pstConfig->height = fmt.fmt.pix.height; 151afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 152afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE: 153afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin pstConfig->width = fmt.fmt.pix_mp.width; 154afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin pstConfig->height = fmt.fmt.pix_mp.height; 155afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (pstConfig->mode == MODE_ENCODE) 156afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin pstConfig->pix.enc_fmt.in_fmt = fmt.fmt.pix_mp.pixelformat; 157afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin else 158afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin pstConfig->pix.dec_fmt.in_fmt = fmt.fmt.pix_mp.pixelformat; 159afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 160afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE: 161afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin pstConfig->width = fmt.fmt.pix_mp.width; 162afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin pstConfig->height = fmt.fmt.pix_mp.height; 163afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (pstConfig->mode == MODE_ENCODE) 164afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin pstConfig->pix.enc_fmt.out_fmt = fmt.fmt.pix_mp.pixelformat; 165afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin else 166afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin pstConfig->pix.dec_fmt.out_fmt = fmt.fmt.pix_mp.pixelformat; 167afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 168afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin default: 169afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_V4l2_BUF_TYPE; 170afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 171afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 172afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 173afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 174afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 175afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::t_v4l2Reqbufs(int iFd, int iBufCount, struct BUF_INFO *pstBufInfo) 176afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 177afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin struct v4l2_requestbuffers req; 178afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin int iRet = ERROR_NONE; 179afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 1801ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin memset(&req, 0, sizeof(v4l2_requestbuffers)); 181afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 182afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin req.type = pstBufInfo->buf_type; 183afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin req.memory = pstBufInfo->memory; 184afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 185afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin //if (pstBufInfo->memory == V4L2_MEMORY_MMAP) 186afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin req.count = iBufCount; 187afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 188afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = ioctl(iFd, VIDIOC_REQBUFS, &req); 189afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 190afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d]: VIDIOC_REQBUFS failed\n", __func__, iRet); 191afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 192afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 193afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 194afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 195afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 196afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 197afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::t_v4l2Qbuf(int iFd, struct BUF_INFO *pstBufInfo, struct BUFFER *pstBuf) 198afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 199afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin struct v4l2_buffer v4l2_buf; 200afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin struct v4l2_plane plane[JPEG_MAX_PLANE_CNT]; 201afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin int i; 202afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin int iRet = ERROR_NONE; 203afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 204afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin memset(&v4l2_buf, 0, sizeof(struct v4l2_buffer)); 205afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin memset(plane, 0, (int)JPEG_MAX_PLANE_CNT * sizeof(struct v4l2_plane)); 206afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 207afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin v4l2_buf.index = 0; 208afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin v4l2_buf.type = pstBufInfo->buf_type; 209afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin v4l2_buf.memory = pstBufInfo->memory; 210afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin v4l2_buf.field = V4L2_FIELD_ANY; 211afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin v4l2_buf.length = pstBufInfo->numOfPlanes; 212afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin v4l2_buf.m.planes = plane; 213afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 214ed904e28cf0b698147bc57035d3def08c32fcd60Sungjoong Kang if (pstBufInfo->memory == V4L2_MEMORY_DMABUF) { 215afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin for (i = 0; i < pstBufInfo->numOfPlanes; i++) { 216ed904e28cf0b698147bc57035d3def08c32fcd60Sungjoong Kang v4l2_buf.m.planes[i].m.fd = (unsigned long)pstBuf->addr[i]; 217afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin v4l2_buf.m.planes[i].length = pstBuf->size[i]; 218afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 219afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 220afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 221afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = ioctl(iFd, VIDIOC_QBUF, &v4l2_buf); 222afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 223afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d] VIDIOC_QBUF failed\n", __func__, iRet); 224afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin pstBuf->numOfPlanes = 0; 225afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 226afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 227afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 228afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 229afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 230afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 231afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::t_v4l2Dqbuf(int iFd, enum v4l2_buf_type eType, enum v4l2_memory eMemory, int iNumPlanes) 232afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 233afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin struct v4l2_buffer buf; 234afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin struct v4l2_plane planes[3]; 235afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin int iRet = ERROR_NONE; 236afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 237afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin memset(&buf, 0, sizeof(struct v4l2_buffer)); 238afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin memset(planes, 0, sizeof(struct v4l2_plane)*3); 239afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 240afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin buf.type = eType; 241afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin buf.memory = eMemory; 242afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin buf.length = iNumPlanes; 243afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin buf.m.planes = planes; 244afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 245afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = ioctl(iFd, VIDIOC_DQBUF, &buf); 246afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 247afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d] VIDIOC_DQBUF failed\n", __func__, iRet); 248afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 249afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 250afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 251afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin#ifdef KERNEL_33_JPEG_API 252afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if ((eType == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) && \ 253afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin (t_stJpegConfig.mode == MODE_ENCODE)) { 254afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_stJpegConfig.sizeJpeg = buf.m.planes[0].bytesused; 255afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 256afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin#endif 257afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 258afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 259afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 260afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 261afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::t_v4l2StreamOn(int iFd, enum v4l2_buf_type eType) 262afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 263afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin int iRet = ERROR_NONE; 264afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 265afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = ioctl(iFd, VIDIOC_STREAMON, &eType); 266afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 267afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d] VIDIOC_STREAMON failed\n", __func__, iRet); 268afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 269afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 270afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 271afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 272afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 273afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 274afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::t_v4l2StreamOff(int iFd, enum v4l2_buf_type eType) 275afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 276afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin int iRet = ERROR_NONE; 277afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 278afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = ioctl(iFd, VIDIOC_STREAMOFF, &eType); 279afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 280afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d] VIDIOC_STREAMOFF failed\n", __func__, iRet); 281afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 282afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 283afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 284afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 285afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 286afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 287afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::t_v4l2SetCtrl(int iFd, int iCid, int iValue) 288afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 289afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin struct v4l2_control vc; 290afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin int iRet = ERROR_NONE; 291afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 292afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin vc.id = iCid; 293afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin vc.value = iValue; 294afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 295afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = ioctl(iFd, VIDIOC_S_CTRL, &vc); 296afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 297afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s] VIDIOC_S_CTRL failed : cid(%d), value(%d)\n", __func__, iCid, iValue); 298afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 299afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 300afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 301afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 302afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 303afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 304afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::t_v4l2GetCtrl(int iFd, int iCid) 305afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 306afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin struct v4l2_control ctrl; 307afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin int iRet = ERROR_NONE; 308afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 309afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin ctrl.id = iCid; 310afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 311afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = ioctl(iFd, VIDIOC_G_CTRL, &ctrl); 312afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 313afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s] VIDIOC_G_CTRL failed : cid(%d)\n", __func__, ctrl.id); 314afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 315afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 316afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 317afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ctrl.value; 318afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 319afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 320afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::create(enum MODE eMode) 321afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 322afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_bFlagCreate == true) { 323afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_JPEG_DEVICE_ALREADY_CREATE; 324afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 325afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 326afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin int iRet = ERROR_NONE; 327afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 328afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin switch (eMode) { 329afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case MODE_ENCODE: 330afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iJpegFd = open(JPEG_ENC_NODE, O_RDWR, 0); 331afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 332afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case MODE_DECODE: 333afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iJpegFd = open(JPEG_DEC_NODE, O_RDWR, 0); 334afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 335afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin default: 336afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iJpegFd = -1; 337afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_JPEG_MODE; 338afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 339afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 340afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 341afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_iJpegFd < 0) { 342afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iJpegFd = -1; 343afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s]: JPEG_NODE open failed\n", __func__); 344afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_CANNOT_OPEN_JPEG_DEVICE; 345afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 346afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 347afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_iJpegFd <= 0) { 348afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iJpegFd = -1; 349afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("ERR(%s):JPEG device was closed\n", __func__); 350afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_JPEG_DEVICE_ALREADY_CLOSED; 351afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 352afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 353afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = t_v4l2Querycap(t_iJpegFd); 354afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 355afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s]: QUERYCAP failed\n", __func__); 356afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin close(t_iJpegFd); 357afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_CANNOT_OPEN_JPEG_DEVICE; 358afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 359afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 360afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin memset(&t_stJpegConfig, 0, sizeof(struct CONFIG)); 361afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin memset(&t_stJpegInbuf, 0, sizeof(struct BUFFER)); 362afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin memset(&t_stJpegOutbuf, 0, sizeof(struct BUFFER)); 363afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 364afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_stJpegConfig.mode = eMode; 365afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 366afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_bFlagCreate = true; 367afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_bFlagCreateInBuf = false; 368afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_bFlagCreateOutBuf = false; 369afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_bFlagExcute = false; 370afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 371afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iPlaneNum = 0; 372afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 373afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_NONE; 374afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 375afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 376afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::destroy(int iInBufs, int iOutBufs) 377afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 378afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_bFlagCreate == false) { 379afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_JPEG_DEVICE_ALREADY_DESTROY; 380afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 381afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 382afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_iJpegFd > 0) { 383afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin struct BUF_INFO stBufInfo; 384afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 385afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_bFlagExcute) { 386afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_v4l2StreamOff(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); 387afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_v4l2StreamOff(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE); 388afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 389afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 390afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_bFlagExcute) { 391afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin stBufInfo.numOfPlanes = iInBufs; 392afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin stBufInfo.memory = V4L2_MEMORY_MMAP; 393afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 394afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin stBufInfo.buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 395afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_v4l2Reqbufs(t_iJpegFd, 0, &stBufInfo); 396afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 397afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin stBufInfo.numOfPlanes = iOutBufs; 398afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin stBufInfo.buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 399afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_v4l2Reqbufs(t_iJpegFd, 0, &stBufInfo); 400afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 401afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 402afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin close(t_iJpegFd); 403afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 404afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 405afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iJpegFd = -1; 406afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_bFlagCreate = false; 407afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_NONE; 408afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 409afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 410afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::setSize(int iW, int iH) 411afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 412afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_bFlagCreate == false) { 413afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_JPEG_DEVICE_NOT_CREATE_YET; 414afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 415afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 416afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iW < 0 || MAX_JPG_WIDTH < iW) { 417afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_IMAGE_SIZE; 418afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 419afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 420afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iH < 0 || MAX_JPG_HEIGHT < iH) { 421afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_IMAGE_SIZE; 422afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 423afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 424afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_stJpegConfig.width = iW; 425afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_stJpegConfig.height = iH; 426afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 427afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_NONE; 428afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 429afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 430afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::setJpegConfig(enum MODE eMode, void *pConfig) 431afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 432afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_bFlagCreate == false) { 433afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_JPEG_DEVICE_NOT_CREATE_YET; 434afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 435afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 436afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (pConfig == NULL) { 437afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_JPEG_CONFIG_POINTER_NULL; 438afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 439afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 440afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin memcpy(&t_stJpegConfig, pConfig, sizeof(struct CONFIG)); 441afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 442afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin switch (eMode) { 443afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case MODE_ENCODE: 444afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin switch (t_stJpegConfig.pix.enc_fmt.in_fmt) { 445afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_YUV420: 446afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_NV16: 447afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_YUYV: 448afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_RGB565X: 449afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_BGR32: 450afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_RGB32: 451afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iPlaneNum = 1; 452afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 453afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin default: 454afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("%s::Invalid input color format(%d) fail\n", __func__, t_stJpegConfig.pix.enc_fmt.in_fmt); 455afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iPlaneNum = 0; 456afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_COLOR_FORMAT; 457afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 458afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 459afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case MODE_DECODE: 460afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin switch (t_stJpegConfig.pix.dec_fmt.out_fmt) { 461afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_YUV420: 462afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_NV16: 463afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_YUYV: 464afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_RGB565X: 465afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_BGR32: 466afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_RGB32: 467afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iPlaneNum = 1; 468afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 469afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin default: 470afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("%s::Invalid input color format(%d) fail\n", __func__, t_stJpegConfig.pix.dec_fmt.out_fmt); 471afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iPlaneNum = 0; 472afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_COLOR_FORMAT; 473afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 474afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 475afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin default: 476afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iPlaneNum = 0; 477afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_JPEG_MODE; 478afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 479afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 480afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 481afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_NONE; 482afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 483afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 484afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinvoid *ExynosJpegBase::getJpegConfig(void) 485afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 486afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_bFlagCreate == false) { 487afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return NULL; 488afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 489afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 490afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return &t_stJpegConfig; 491afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 492afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 493ed904e28cf0b698147bc57035d3def08c32fcd60Sungjoong Kangint ExynosJpegBase::getBuf(bool bCreateBuf, struct BUFFER *pstBuf, int *piBuf, int *iBufSize, int iSize, int iPlaneNum) 494afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 495afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_bFlagCreate == false) { 496afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_JPEG_DEVICE_NOT_CREATE_YET; 497afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 498afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 499afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (bCreateBuf == false) { 500afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_BUF_NOT_SET_YET; 501afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 502afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 503ed904e28cf0b698147bc57035d3def08c32fcd60Sungjoong Kang if ((piBuf == NULL) || (iSize == 0)) { 504afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_BUFFR_IS_NULL; 505afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 506afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 507afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iSize < iPlaneNum) { 508afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_BUFFER_TOO_SMALL; 509afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 510afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 511afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin for (int i=0;i<iPlaneNum;i++) { 512ed904e28cf0b698147bc57035d3def08c32fcd60Sungjoong Kang piBuf[i] = pstBuf->addr[i]; 513afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 514afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 515afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin for (int i=0;i<iPlaneNum;i++) { 516afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iBufSize[i] = pstBuf->size[i]; 517afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 518afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 519afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_NONE; 520afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 521afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 522ed904e28cf0b698147bc57035d3def08c32fcd60Sungjoong Kangint ExynosJpegBase::setBuf(struct BUFFER *pstBuf, int *piBuf, int *iSize, int iPlaneNum) 523afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 524afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_bFlagCreate == false) { 525afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_JPEG_DEVICE_NOT_CREATE_YET; 526afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 527afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 528afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iPlaneNum <= 0) { 529afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_BUFFER_TOO_SMALL; 530afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 531afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 532afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin for(int i=0;i<iPlaneNum;i++) { 533ed904e28cf0b698147bc57035d3def08c32fcd60Sungjoong Kang if (piBuf[i] == NULL) { 534afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin memset(pstBuf, 0, sizeof(struct BUFFER)); 535afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_BUFFR_IS_NULL; 536afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 537afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iSize[i] <= 0) { 538afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin memset(pstBuf, 0, sizeof(struct BUFFER)); 539afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_BUFFER_TOO_SMALL; 540afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 541ed904e28cf0b698147bc57035d3def08c32fcd60Sungjoong Kang pstBuf->addr[i] = piBuf[i]; 542afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin pstBuf->size[i] = iSize[i]; 543afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 544afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 545afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin pstBuf->numOfPlanes = iPlaneNum; 546afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 547afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_NONE; 548afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 549afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 550afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::setCache(int iValue) 551afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 552afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_bFlagCreate == false) { 553afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_JPEG_DEVICE_NOT_CREATE_YET; 554afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 555afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 556afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_v4l2SetCtrl(t_iJpegFd, V4L2_CID_CACHEABLE, iValue)<0) { 557afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("%s::cache setting failed\n", __func__); 558afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_CANNOT_CHANGE_CACHE_SETTING; 559afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 560afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 561afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_NONE; 562afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 563afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 564afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::setColorFormat(enum MODE eMode, int iV4l2ColorFormat) 565afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 566afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_bFlagCreate == false) { 567afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_JPEG_DEVICE_NOT_CREATE_YET; 568afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 569afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 570afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin switch(iV4l2ColorFormat) { 571afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_YUYV: 572afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_YUV420: 573afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_NV16: 574afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_RGB565X: 575afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_BGR32: 576afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_RGB32: 577afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin switch (eMode) { 578afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case MODE_ENCODE: 579afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_stJpegConfig.pix.enc_fmt.in_fmt = iV4l2ColorFormat; 580afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 581afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case MODE_DECODE: 582afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_stJpegConfig.pix.dec_fmt.out_fmt = iV4l2ColorFormat; 583afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 584afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin default: 585afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_JPEG_MODE; 586afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 587afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 588afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 589afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin default: 590afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("%s::Invalid input color format(%d) fail\n", __func__, iV4l2ColorFormat); 591afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iPlaneNum = 0; 592afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_COLOR_FORMAT; 593afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 594afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 595afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 596afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin switch (iV4l2ColorFormat) { 597afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_YUV420: 598afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_NV16: 599afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_YUYV: 600afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_RGB565X: 601afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_BGR32: 602afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_RGB32: 603afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iPlaneNum = 1; 604afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 605afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin default: 606afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("%s::Invalid input color format(%d) fail\n", __func__, iV4l2ColorFormat); 607afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iPlaneNum = 0; 608afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_COLOR_FORMAT; 609afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 610afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 611afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_NONE; 612afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 613afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 614afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::setJpegFormat(enum MODE eMode, int iV4l2JpegFormat) 615afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 616afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_bFlagCreate == false) { 617afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_JPEG_DEVICE_NOT_CREATE_YET; 618afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 619afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 620afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin switch(iV4l2JpegFormat) { 621afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_JPEG_444: 622afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_JPEG_422: 623afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_JPEG_420: 624afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_JPEG_GRAY: 625afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin switch (eMode) { 626afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case MODE_ENCODE: 627afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_stJpegConfig.pix.enc_fmt.out_fmt = iV4l2JpegFormat; 628afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 629afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case MODE_DECODE: 630afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_stJpegConfig.pix.dec_fmt.in_fmt = iV4l2JpegFormat; 631afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 632afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin default: 633afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_JPEG_MODE; 634afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 635afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 636afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 637afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin default: 638afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_JPEG_FORMAT; 639afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 640afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 641afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 642afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_NONE; 643afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 644afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 6451ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shinint ExynosJpegBase::setColorBufSize(enum MODE eMode, int *piBufSize, int iSize) 6461ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin{ 6471ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin int iFormat; 6481ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin 6491ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin switch (eMode) { 6501ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin case MODE_ENCODE: 6511ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin iFormat = t_stJpegConfig.pix.enc_fmt.in_fmt; 6521ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin break; 6531ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin case MODE_DECODE: 6541ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin iFormat = t_stJpegConfig.pix.dec_fmt.out_fmt; 6551ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin break; 6561ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin default: 6571ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin return ERROR_INVALID_JPEG_MODE; 6581ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin break; 6591ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin } 6601ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin 6611ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin return setColorBufSize(iFormat, piBufSize, iSize, t_stJpegConfig.width, t_stJpegConfig.height); 6621ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin} 6631ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin 6641ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shinint ExynosJpegBase::setColorBufSize(int iFormat, int *piBufSize, int iSize, int width, int height) 6651ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin{ 6661ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin int pBufSize[3]; 6671ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin 6681ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin if(iSize>3) { 6691ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin return ERROR_INVALID_IMAGE_SIZE; 6701ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin } 6711ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin 6721ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin switch (iFormat) { 6731ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin case V4L2_PIX_FMT_YUYV: 6741ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin case V4L2_PIX_FMT_RGB565X: 675ed904e28cf0b698147bc57035d3def08c32fcd60Sungjoong Kang case V4L2_PIX_FMT_NV16: 6761ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin pBufSize[0] = width*height*2; 6771ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin pBufSize[1] = 0; 6781ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin pBufSize[2] = 0; 6791ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin break; 6801ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin case V4L2_PIX_FMT_RGB32: 6811ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin case V4L2_PIX_FMT_BGR32: 6821ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin pBufSize[0] = width*height*4; 6831ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin pBufSize[1] = 0; 6841ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin pBufSize[2] = 0; 6851ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin break; 6861ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin case V4L2_PIX_FMT_YUV420: 687ed904e28cf0b698147bc57035d3def08c32fcd60Sungjoong Kang pBufSize[0] = (width*height*3)/2; 688ed904e28cf0b698147bc57035d3def08c32fcd60Sungjoong Kang pBufSize[1] = 0; 689ed904e28cf0b698147bc57035d3def08c32fcd60Sungjoong Kang pBufSize[2] = 0; 6901ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin break; 6911ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin default: 6921ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin pBufSize[0] = width*height*4; 6931ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin pBufSize[1] = width*height*4; 6941ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin pBufSize[2] = width*height*4; 6951ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin break; 6961ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin } 6971ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin 6981ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin memcpy(piBufSize, pBufSize, iSize*sizeof(int)); 6991ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin 7001ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin return ERROR_NONE; 7011ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin} 7021ae2a55bc404f70b7bcafb14f6b300809ae1c796Jiyoung Shin 703afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::updateConfig(enum MODE eMode, int iInBufs, int iOutBufs, int iInBufPlanes, int iOutBufPlanes) 704afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 705afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_bFlagCreate == false) { 706afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_JPEG_DEVICE_NOT_CREATE_YET; 707afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 708afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 709afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin int iRet = ERROR_NONE; 710afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 711afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (eMode == MODE_ENCODE) { 712afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = t_v4l2SetJpegcomp(t_iJpegFd, t_stJpegConfig.enc_qual); 713afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 714afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s,%d]: S_JPEGCOMP failed\n", __func__,iRet); 715afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_JPEG_CONFIG; 716afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 717afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 718afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 719afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_stJpegConfig.numOfPlanes = iInBufPlanes; 720afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_stJpegConfig.mode = eMode; 721afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 722afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = t_v4l2SetFmt(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, &t_stJpegConfig); 723afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 724afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s,%d]: jpeg input S_FMT failed\n", __func__,iRet); 725afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_JPEG_CONFIG; 726afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 727afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 728afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin struct BUF_INFO stBufInfo; 729afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 730afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin stBufInfo.numOfPlanes = iInBufs; 731afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin stBufInfo.buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 732ed904e28cf0b698147bc57035d3def08c32fcd60Sungjoong Kang stBufInfo.memory = V4L2_MEMORY_DMABUF; 733afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 734afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = t_v4l2Reqbufs(t_iJpegFd, iInBufs, &stBufInfo); 735afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 736afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d]: Input REQBUFS failed\n", __func__, iRet); 737afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_EXCUTE_FAIL; 738afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 739afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 740afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_stJpegConfig.numOfPlanes = iOutBufPlanes; 741afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = t_v4l2SetFmt(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, &t_stJpegConfig); 742afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 743afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s,%d]: jpeg output S_FMT failed\n", __func__,iRet); 744afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_JPEG_CONFIG; 745afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 746afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 747afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin stBufInfo.numOfPlanes = iOutBufs; 748afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin stBufInfo.buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 749afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 750afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = t_v4l2Reqbufs(t_iJpegFd, iOutBufs, &stBufInfo); 751afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 752afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d]: Output REQBUFS failed\n", __func__, iRet); 753afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_REQBUF_FAIL; 754afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 755afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 756afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_NONE; 757afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 758afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 759afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::execute(int iInBufPlanes, int iOutBufPlanes) 760afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 761afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_bFlagCreate == false) { 762afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_JPEG_DEVICE_NOT_CREATE_YET; 763afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 764afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 765afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin struct BUF_INFO stBufInfo; 766afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin int iRet = ERROR_NONE; 767afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 768afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_bFlagExcute = true; 769afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 770afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin stBufInfo.numOfPlanes = iInBufPlanes; 771afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin stBufInfo.buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 772afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 773ed904e28cf0b698147bc57035d3def08c32fcd60Sungjoong Kang stBufInfo.memory = V4L2_MEMORY_DMABUF; 774afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 775afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = t_v4l2Qbuf(t_iJpegFd, &stBufInfo, &t_stJpegInbuf); 776afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 777afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d]: Input QBUF failed\n", __func__, iRet); 778afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_EXCUTE_FAIL; 779afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 780afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 781afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin stBufInfo.numOfPlanes = iOutBufPlanes; 782afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin stBufInfo.buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 783afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 784afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = t_v4l2Qbuf(t_iJpegFd, &stBufInfo, &t_stJpegOutbuf); 785afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 786afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d]: Output QBUF failed\n", __func__, iRet); 787afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_EXCUTE_FAIL; 788afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 789afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 790afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = t_v4l2StreamOn(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); 791afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 792afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d]: input stream on failed\n", __func__, iRet); 793afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_EXCUTE_FAIL; 794afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 795afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = t_v4l2StreamOn(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE); 796afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 797afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d]: output stream on failed\n", __func__, iRet); 798afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_EXCUTE_FAIL; 799afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 800afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 801afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = t_v4l2Dqbuf(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, V4L2_MEMORY_MMAP, iInBufPlanes); 802afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 803afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d]: Intput DQBUF failed\n", __func__, iRet); 804afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_EXCUTE_FAIL; 805afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 806afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = t_v4l2Dqbuf(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, V4L2_MEMORY_MMAP, iOutBufPlanes); 807afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 808afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d]: Output DQBUF failed\n", __func__, iRet); 809afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_EXCUTE_FAIL; 810afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 811afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 812afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_NONE; 813afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 814afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 815