ExynosJpegBase.cpp revision afd46e5b53dc3c82f99105b7e7fd7908971f103b
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 180afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin memset(&req, 0, sizeof(req)); 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_v4l2Querybuf(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 iRet = ERROR_NONE; 202afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin int i; 203afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 204afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin memset(plane, 0, (int)JPEG_MAX_PLANE_CNT * sizeof(struct v4l2_plane)); 205afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 206afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin v4l2_buf.index = 0; 207afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin v4l2_buf.type = pstBufInfo->buf_type; 208afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin v4l2_buf.memory = pstBufInfo->memory; 209afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin v4l2_buf.length = pstBufInfo->numOfPlanes; 210afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin v4l2_buf.m.planes = plane; 211afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 212afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = ioctl(iFd, VIDIOC_QUERYBUF, &v4l2_buf); 213afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 214afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d]: VIDIOC_QUERYBUF failed\n", __func__, iRet); 215afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 216afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 217afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 218afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin for (i= 0; i < v4l2_buf.length; i++) { 219afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin pstBuf->size[i] = v4l2_buf.m.planes[i].length; 220afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin pstBuf->addr[i] = (char *) mmap(0, 221afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin pstBuf->size[i], 222afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin PROT_READ | PROT_WRITE, MAP_SHARED, iFd, 223afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin v4l2_buf.m.planes[i].m.mem_offset); 224afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 225afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (pstBuf->addr[i] == MAP_FAILED) { 226afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s]: mmap failed\n", __func__); 227afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_MMAP_FAILED; 228afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 229afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 230afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 231afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 232afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 233afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 234afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::t_v4l2Qbuf(int iFd, struct BUF_INFO *pstBufInfo, struct BUFFER *pstBuf) 235afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 236afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin struct v4l2_buffer v4l2_buf; 237afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin struct v4l2_plane plane[JPEG_MAX_PLANE_CNT]; 238afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin int i; 239afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin int iRet = ERROR_NONE; 240afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 241afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin memset(&v4l2_buf, 0, sizeof(struct v4l2_buffer)); 242afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin memset(plane, 0, (int)JPEG_MAX_PLANE_CNT * sizeof(struct v4l2_plane)); 243afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 244afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin v4l2_buf.index = 0; 245afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin v4l2_buf.type = pstBufInfo->buf_type; 246afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin v4l2_buf.memory = pstBufInfo->memory; 247afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin v4l2_buf.field = V4L2_FIELD_ANY; 248afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin v4l2_buf.length = pstBufInfo->numOfPlanes; 249afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin v4l2_buf.m.planes = plane; 250afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 251afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (pstBufInfo->memory == V4L2_MEMORY_USERPTR) { 252afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin for (i = 0; i < pstBufInfo->numOfPlanes; i++) { 253afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin v4l2_buf.m.planes[i].m.userptr = (unsigned long)pstBuf->addr[i]; 254afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin v4l2_buf.m.planes[i].length = pstBuf->size[i]; 255afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 256afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 257afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 258afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = ioctl(iFd, VIDIOC_QBUF, &v4l2_buf); 259afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 260afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d] VIDIOC_QBUF failed\n", __func__, iRet); 261afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin pstBuf->numOfPlanes = 0; 262afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 263afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 264afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 265afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 266afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 267afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 268afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::t_v4l2Dqbuf(int iFd, enum v4l2_buf_type eType, enum v4l2_memory eMemory, int iNumPlanes) 269afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 270afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin struct v4l2_buffer buf; 271afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin struct v4l2_plane planes[3]; 272afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin int iRet = ERROR_NONE; 273afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 274afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin memset(&buf, 0, sizeof(struct v4l2_buffer)); 275afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin memset(planes, 0, sizeof(struct v4l2_plane)*3); 276afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 277afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin buf.type = eType; 278afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin buf.memory = eMemory; 279afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin buf.length = iNumPlanes; 280afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin buf.m.planes = planes; 281afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 282afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = ioctl(iFd, VIDIOC_DQBUF, &buf); 283afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 284afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d] VIDIOC_DQBUF failed\n", __func__, iRet); 285afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 286afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 287afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 288afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin#ifdef KERNEL_33_JPEG_API 289afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if ((eType == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) && \ 290afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin (t_stJpegConfig.mode == MODE_ENCODE)) { 291afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_stJpegConfig.sizeJpeg = buf.m.planes[0].bytesused; 292afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 293afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin#endif 294afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 295afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 296afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 297afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 298afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::t_v4l2StreamOn(int iFd, enum v4l2_buf_type eType) 299afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 300afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin int iRet = ERROR_NONE; 301afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 302afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = ioctl(iFd, VIDIOC_STREAMON, &eType); 303afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 304afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d] VIDIOC_STREAMON failed\n", __func__, iRet); 305afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 306afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 307afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 308afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 309afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 310afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 311afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::t_v4l2StreamOff(int iFd, enum v4l2_buf_type eType) 312afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 313afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin int iRet = ERROR_NONE; 314afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 315afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = ioctl(iFd, VIDIOC_STREAMOFF, &eType); 316afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 317afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d] VIDIOC_STREAMOFF failed\n", __func__, iRet); 318afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 319afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 320afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 321afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 322afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 323afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 324afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::t_v4l2SetCtrl(int iFd, int iCid, int iValue) 325afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 326afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin struct v4l2_control vc; 327afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin int iRet = ERROR_NONE; 328afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 329afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin vc.id = iCid; 330afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin vc.value = iValue; 331afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 332afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = ioctl(iFd, VIDIOC_S_CTRL, &vc); 333afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 334afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s] VIDIOC_S_CTRL failed : cid(%d), value(%d)\n", __func__, iCid, iValue); 335afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 336afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 337afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 338afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 339afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 340afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 341afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::t_v4l2GetCtrl(int iFd, int iCid) 342afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 343afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin struct v4l2_control ctrl; 344afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin int iRet = ERROR_NONE; 345afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 346afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin ctrl.id = iCid; 347afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 348afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = ioctl(iFd, VIDIOC_G_CTRL, &ctrl); 349afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 350afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s] VIDIOC_G_CTRL failed : cid(%d)\n", __func__, ctrl.id); 351afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return iRet; 352afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 353afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 354afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ctrl.value; 355afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 356afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 357afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::create(enum MODE eMode) 358afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 359afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_bFlagCreate == true) { 360afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_JPEG_DEVICE_ALREADY_CREATE; 361afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 362afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 363afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin int iRet = ERROR_NONE; 364afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 365afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin switch (eMode) { 366afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case MODE_ENCODE: 367afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iJpegFd = open(JPEG_ENC_NODE, O_RDWR, 0); 368afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 369afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case MODE_DECODE: 370afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iJpegFd = open(JPEG_DEC_NODE, O_RDWR, 0); 371afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 372afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin default: 373afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iJpegFd = -1; 374afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_JPEG_MODE; 375afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 376afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 377afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 378afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_iJpegFd < 0) { 379afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iJpegFd = -1; 380afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s]: JPEG_NODE open failed\n", __func__); 381afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_CANNOT_OPEN_JPEG_DEVICE; 382afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 383afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 384afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_iJpegFd <= 0) { 385afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iJpegFd = -1; 386afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("ERR(%s):JPEG device was closed\n", __func__); 387afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_JPEG_DEVICE_ALREADY_CLOSED; 388afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 389afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 390afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = t_v4l2Querycap(t_iJpegFd); 391afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 392afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s]: QUERYCAP failed\n", __func__); 393afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin close(t_iJpegFd); 394afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_CANNOT_OPEN_JPEG_DEVICE; 395afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 396afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 397afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin memset(&t_stJpegConfig, 0, sizeof(struct CONFIG)); 398afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin memset(&t_stJpegInbuf, 0, sizeof(struct BUFFER)); 399afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin memset(&t_stJpegOutbuf, 0, sizeof(struct BUFFER)); 400afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 401afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_stJpegConfig.mode = eMode; 402afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 403afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_bFlagCreate = true; 404afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_bFlagCreateInBuf = false; 405afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_bFlagCreateOutBuf = false; 406afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_bFlagExcute = false; 407afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 408afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iPlaneNum = 0; 409afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 410afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_NONE; 411afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 412afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 413afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::destroy(int iInBufs, int iOutBufs) 414afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 415afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_bFlagCreate == false) { 416afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_JPEG_DEVICE_ALREADY_DESTROY; 417afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 418afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 419afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_iJpegFd > 0) { 420afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin struct BUF_INFO stBufInfo; 421afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 422afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_bFlagExcute) { 423afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_v4l2StreamOff(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); 424afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_v4l2StreamOff(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE); 425afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 426afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 427afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_bFlagExcute) { 428afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin stBufInfo.numOfPlanes = iInBufs; 429afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin stBufInfo.memory = V4L2_MEMORY_MMAP; 430afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 431afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin stBufInfo.buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 432afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_v4l2Reqbufs(t_iJpegFd, 0, &stBufInfo); 433afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 434afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin stBufInfo.numOfPlanes = iOutBufs; 435afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin stBufInfo.buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 436afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_v4l2Reqbufs(t_iJpegFd, 0, &stBufInfo); 437afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 438afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 439afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin close(t_iJpegFd); 440afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 441afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 442afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iJpegFd = -1; 443afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_bFlagCreate = false; 444afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_NONE; 445afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 446afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 447afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::setSize(int iW, int iH) 448afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 449afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_bFlagCreate == false) { 450afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_JPEG_DEVICE_NOT_CREATE_YET; 451afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 452afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 453afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iW < 0 || MAX_JPG_WIDTH < iW) { 454afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_IMAGE_SIZE; 455afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 456afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 457afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iH < 0 || MAX_JPG_HEIGHT < iH) { 458afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_IMAGE_SIZE; 459afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 460afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 461afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_stJpegConfig.width = iW; 462afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_stJpegConfig.height = iH; 463afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 464afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_NONE; 465afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 466afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 467afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::setJpegConfig(enum MODE eMode, void *pConfig) 468afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 469afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_bFlagCreate == false) { 470afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_JPEG_DEVICE_NOT_CREATE_YET; 471afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 472afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 473afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (pConfig == NULL) { 474afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_JPEG_CONFIG_POINTER_NULL; 475afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 476afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 477afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin memcpy(&t_stJpegConfig, pConfig, sizeof(struct CONFIG)); 478afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 479afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin switch (eMode) { 480afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case MODE_ENCODE: 481afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin switch (t_stJpegConfig.pix.enc_fmt.in_fmt) { 482afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_YUV420: 483afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iPlaneNum = 3; 484afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 485afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_NV16: 486afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iPlaneNum = 2; 487afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 488afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_YUYV: 489afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_RGB565X: 490afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_BGR32: 491afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_RGB32: 492afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iPlaneNum = 1; 493afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 494afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin default: 495afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("%s::Invalid input color format(%d) fail\n", __func__, t_stJpegConfig.pix.enc_fmt.in_fmt); 496afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iPlaneNum = 0; 497afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_COLOR_FORMAT; 498afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 499afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 500afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case MODE_DECODE: 501afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin switch (t_stJpegConfig.pix.dec_fmt.out_fmt) { 502afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_YUV420: 503afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iPlaneNum = 3; 504afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 505afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_NV16: 506afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iPlaneNum = 2; 507afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 508afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_YUYV: 509afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_RGB565X: 510afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_BGR32: 511afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_RGB32: 512afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iPlaneNum = 1; 513afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 514afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin default: 515afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("%s::Invalid input color format(%d) fail\n", __func__, t_stJpegConfig.pix.dec_fmt.out_fmt); 516afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iPlaneNum = 0; 517afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_COLOR_FORMAT; 518afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 519afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 520afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin default: 521afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iPlaneNum = 0; 522afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_JPEG_MODE; 523afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 524afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 525afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 526afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_NONE; 527afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 528afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 529afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinvoid *ExynosJpegBase::getJpegConfig(void) 530afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 531afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_bFlagCreate == false) { 532afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return NULL; 533afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 534afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 535afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return &t_stJpegConfig; 536afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 537afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 538afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::getBuf(bool bCreateBuf, struct BUFFER *pstBuf, char **pcBuf, int *iBufSize, int iSize, int iPlaneNum) 539afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 540afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_bFlagCreate == false) { 541afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_JPEG_DEVICE_NOT_CREATE_YET; 542afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 543afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 544afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (bCreateBuf == false) { 545afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_BUF_NOT_SET_YET; 546afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 547afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 548afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if ((pcBuf == NULL) || (iSize == NULL)) { 549afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_BUFFR_IS_NULL; 550afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 551afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 552afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iSize < iPlaneNum) { 553afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_BUFFER_TOO_SMALL; 554afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 555afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 556afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin for (int i=0;i<iPlaneNum;i++) { 557afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin pcBuf[i] = pstBuf->addr[i]; 558afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 559afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 560afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin for (int i=0;i<iPlaneNum;i++) { 561afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iBufSize[i] = pstBuf->size[i]; 562afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 563afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 564afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_NONE; 565afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 566afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 567afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::setBuf(struct BUFFER *pstBuf, char **pcBuf, int *iSize, int iPlaneNum) 568afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 569afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_bFlagCreate == false) { 570afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_JPEG_DEVICE_NOT_CREATE_YET; 571afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 572afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 573afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iPlaneNum <= 0) { 574afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_BUFFER_TOO_SMALL; 575afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 576afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 577afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin for(int i=0;i<iPlaneNum;i++) { 578afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (pcBuf[i] == NULL) { 579afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin memset(pstBuf, 0, sizeof(struct BUFFER)); 580afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_BUFFR_IS_NULL; 581afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 582afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iSize[i] <= 0) { 583afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin memset(pstBuf, 0, sizeof(struct BUFFER)); 584afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_BUFFER_TOO_SMALL; 585afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 586afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin pstBuf->addr[i] = pcBuf[i]; 587afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin pstBuf->size[i] = iSize[i]; 588afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 589afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 590afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin pstBuf->numOfPlanes = iPlaneNum; 591afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 592afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_NONE; 593afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 594afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 595afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::setCache(int iValue) 596afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 597afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_bFlagCreate == false) { 598afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_JPEG_DEVICE_NOT_CREATE_YET; 599afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 600afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 601afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_v4l2SetCtrl(t_iJpegFd, V4L2_CID_CACHEABLE, iValue)<0) { 602afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("%s::cache setting failed\n", __func__); 603afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_CANNOT_CHANGE_CACHE_SETTING; 604afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 605afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 606afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_NONE; 607afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 608afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 609afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::setColorFormat(enum MODE eMode, int iV4l2ColorFormat) 610afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 611afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_bFlagCreate == false) { 612afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_JPEG_DEVICE_NOT_CREATE_YET; 613afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 614afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 615afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin switch(iV4l2ColorFormat) { 616afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_YUYV: 617afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_YUV420: 618afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_NV16: 619afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_RGB565X: 620afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_BGR32: 621afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_RGB32: 622afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin switch (eMode) { 623afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case MODE_ENCODE: 624afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_stJpegConfig.pix.enc_fmt.in_fmt = iV4l2ColorFormat; 625afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 626afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case MODE_DECODE: 627afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_stJpegConfig.pix.dec_fmt.out_fmt = iV4l2ColorFormat; 628afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 629afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin default: 630afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_JPEG_MODE; 631afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 632afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 633afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 634afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin default: 635afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("%s::Invalid input color format(%d) fail\n", __func__, iV4l2ColorFormat); 636afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iPlaneNum = 0; 637afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_COLOR_FORMAT; 638afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 639afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 640afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 641afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin switch (iV4l2ColorFormat) { 642afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_YUV420: 643afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iPlaneNum = 3; 644afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 645afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_NV16: 646afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iPlaneNum = 2; 647afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 648afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_YUYV: 649afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_RGB565X: 650afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_BGR32: 651afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_RGB32: 652afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iPlaneNum = 1; 653afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 654afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin default: 655afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("%s::Invalid input color format(%d) fail\n", __func__, iV4l2ColorFormat); 656afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_iPlaneNum = 0; 657afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_COLOR_FORMAT; 658afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 659afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 660afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_NONE; 661afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 662afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 663afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::setJpegFormat(enum MODE eMode, int iV4l2JpegFormat) 664afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 665afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_bFlagCreate == false) { 666afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_JPEG_DEVICE_NOT_CREATE_YET; 667afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 668afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 669afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin switch(iV4l2JpegFormat) { 670afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_JPEG_444: 671afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_JPEG_422: 672afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_JPEG_420: 673afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case V4L2_PIX_FMT_JPEG_GRAY: 674afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin switch (eMode) { 675afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case MODE_ENCODE: 676afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_stJpegConfig.pix.enc_fmt.out_fmt = iV4l2JpegFormat; 677afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 678afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin case MODE_DECODE: 679afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_stJpegConfig.pix.dec_fmt.in_fmt = iV4l2JpegFormat; 680afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 681afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin default: 682afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_JPEG_MODE; 683afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 684afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 685afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 686afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin default: 687afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_JPEG_FORMAT; 688afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin break; 689afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 690afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 691afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_NONE; 692afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 693afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 694afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::updateConfig(enum MODE eMode, int iInBufs, int iOutBufs, int iInBufPlanes, int iOutBufPlanes) 695afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 696afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_bFlagCreate == false) { 697afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_JPEG_DEVICE_NOT_CREATE_YET; 698afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 699afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 700afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin int iRet = ERROR_NONE; 701afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 702afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (eMode == MODE_ENCODE) { 703afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = t_v4l2SetJpegcomp(t_iJpegFd, t_stJpegConfig.enc_qual); 704afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 705afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s,%d]: S_JPEGCOMP failed\n", __func__,iRet); 706afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_JPEG_CONFIG; 707afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 708afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 709afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 710afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_stJpegConfig.numOfPlanes = iInBufPlanes; 711afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_stJpegConfig.mode = eMode; 712afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 713afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = t_v4l2SetFmt(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, &t_stJpegConfig); 714afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 715afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s,%d]: jpeg input S_FMT failed\n", __func__,iRet); 716afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_JPEG_CONFIG; 717afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 718afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 719afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin struct BUF_INFO stBufInfo; 720afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 721afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin stBufInfo.numOfPlanes = iInBufs; 722afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin stBufInfo.buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 723afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin stBufInfo.memory = V4L2_MEMORY_USERPTR; 724afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 725afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = t_v4l2Reqbufs(t_iJpegFd, iInBufs, &stBufInfo); 726afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 727afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d]: Input REQBUFS failed\n", __func__, iRet); 728afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_EXCUTE_FAIL; 729afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 730afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 731afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_stJpegConfig.numOfPlanes = iOutBufPlanes; 732afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = t_v4l2SetFmt(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, &t_stJpegConfig); 733afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 734afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s,%d]: jpeg output S_FMT failed\n", __func__,iRet); 735afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_INVALID_JPEG_CONFIG; 736afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 737afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 738afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin stBufInfo.numOfPlanes = iOutBufs; 739afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin stBufInfo.buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 740afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 741afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = t_v4l2Reqbufs(t_iJpegFd, iOutBufs, &stBufInfo); 742afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 743afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d]: Output REQBUFS failed\n", __func__, iRet); 744afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_REQBUF_FAIL; 745afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 746afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 747afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_NONE; 748afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 749afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 750afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shinint ExynosJpegBase::execute(int iInBufPlanes, int iOutBufPlanes) 751afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin{ 752afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (t_bFlagCreate == false) { 753afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_JPEG_DEVICE_NOT_CREATE_YET; 754afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 755afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 756afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin struct BUF_INFO stBufInfo; 757afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin int iRet = ERROR_NONE; 758afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 759afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin t_bFlagExcute = true; 760afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 761afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin stBufInfo.numOfPlanes = iInBufPlanes; 762afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin stBufInfo.buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; 763afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 764afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin stBufInfo.memory = V4L2_MEMORY_USERPTR; 765afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 766afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = t_v4l2Qbuf(t_iJpegFd, &stBufInfo, &t_stJpegInbuf); 767afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 768afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d]: Input QBUF failed\n", __func__, iRet); 769afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_EXCUTE_FAIL; 770afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 771afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 772afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin stBufInfo.numOfPlanes = iOutBufPlanes; 773afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin stBufInfo.buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; 774afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 775afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = t_v4l2Qbuf(t_iJpegFd, &stBufInfo, &t_stJpegOutbuf); 776afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 777afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d]: Output QBUF failed\n", __func__, iRet); 778afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_EXCUTE_FAIL; 779afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 780afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 781afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = t_v4l2StreamOn(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); 782afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 783afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d]: input stream on failed\n", __func__, iRet); 784afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_EXCUTE_FAIL; 785afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 786afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = t_v4l2StreamOn(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE); 787afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 788afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d]: output stream on failed\n", __func__, iRet); 789afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_EXCUTE_FAIL; 790afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 791afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 792afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = t_v4l2Dqbuf(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE, V4L2_MEMORY_MMAP, iInBufPlanes); 793afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 794afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d]: Intput DQBUF failed\n", __func__, iRet); 795afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_EXCUTE_FAIL; 796afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 797afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin iRet = t_v4l2Dqbuf(t_iJpegFd, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, V4L2_MEMORY_MMAP, iOutBufPlanes); 798afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin if (iRet < 0) { 799afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin JPEG_ERROR_LOG("[%s:%d]: Output DQBUF failed\n", __func__, iRet); 800afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_EXCUTE_FAIL; 801afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin } 802afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 803afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin return ERROR_NONE; 804afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin} 805afd46e5b53dc3c82f99105b7e7fd7908971f103bJiyoung Shin 806