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