2 * Copyright (C) 2014, Samsung Electronics Co. LTD
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 /* #define LOG_NDEBUG 0 */
18 #define LOG_TAG "ExynosCameraStreamManager"
20 #include "ExynosCameraStreamManager.h"
24 ExynosCamera3Stream::ExynosCamera3Stream(int id
, camera3_stream_t
*stream
)
31 ExynosCamera3Stream::~ExynosCamera3Stream()
36 status_t
ExynosCamera3Stream::m_init()
43 m_registerStream
= EXYNOS_STREAM::HAL_STREAM_STS_INIT
;
44 m_registerBuffer
= EXYNOS_STREAM::HAL_STREAM_STS_INIT
;
46 m_bufferManager
= NULL
;
51 status_t
ExynosCamera3Stream::m_deinit()
58 m_registerStream
= EXYNOS_STREAM::HAL_STREAM_STS_INIT
;
59 m_registerBuffer
= EXYNOS_STREAM::HAL_STREAM_STS_INIT
;
62 if (m_bufferManager
!= NULL
) {
63 delete m_bufferManager
;
64 m_bufferManager
= NULL
;
70 status_t
ExynosCamera3Stream::setStream(camera3_stream_t
*stream
)
72 status_t ret
= NO_ERROR
;
74 ALOGE("ERR(%s[%d]):setStream is NULL ", __FUNCTION__
, __LINE__
);
75 ret
= INVALID_OPERATION
;
83 status_t
ExynosCamera3Stream::getStream(camera3_stream_t
**stream
)
85 status_t ret
= NO_ERROR
;
86 if (m_stream
!= NULL
) {
89 ALOGE("ERR(%s[%d]):getStream m_stream is NULL ", __FUNCTION__
, __LINE__
);
91 ret
= INVALID_OPERATION
;
96 status_t
ExynosCamera3Stream::setID(int id
)
98 status_t ret
= NO_ERROR
;
101 ALOGE("ERR(%s[%d]):setStreamID invalid value(%d)", __FUNCTION__
, __LINE__
, id
);
102 ret
= INVALID_OPERATION
;
109 status_t
ExynosCamera3Stream::getID(int *id
)
111 status_t ret
= NO_ERROR
;
114 ALOGE("ERR(%s[%d]):getStreamID invalid value(%d)", __FUNCTION__
, __LINE__
, m_id
);
115 ret
= INVALID_OPERATION
;
123 status_t
ExynosCamera3Stream::setFormat(int format
)
125 status_t ret
= NO_ERROR
;
128 ALOGE("ERR(%s[%d]):setFormat invalid value(%d)", __FUNCTION__
, __LINE__
, format
);
129 ret
= INVALID_OPERATION
;
131 m_actualFormat
= format
;
136 status_t
ExynosCamera3Stream::getFormat(int *format
)
138 status_t ret
= NO_ERROR
;
140 if (m_actualFormat
< 0) {
141 ALOGE("ERR(%s[%d]):getFormat invalid value(%d)", __FUNCTION__
, __LINE__
, m_actualFormat
);
142 ret
= INVALID_OPERATION
;
144 *format
= m_actualFormat
;
149 status_t
ExynosCamera3Stream::setPlaneCount(int planes
)
151 status_t ret
= NO_ERROR
;
154 ALOGE("ERR(%s[%d]):setPlaneCount invalid value(%d)", __FUNCTION__
, __LINE__
, planes
);
155 ret
= INVALID_OPERATION
;
157 m_planeCount
= planes
;
162 status_t
ExynosCamera3Stream::getPlaneCount(int *planes
)
164 status_t ret
= NO_ERROR
;
166 if (m_planeCount
< 0) {
167 ALOGE("ERR(%s[%d]):getFormat invalid value(%d)", __FUNCTION__
, __LINE__
, m_planeCount
);
168 ret
= INVALID_OPERATION
;
170 *planes
= m_planeCount
;
175 status_t
ExynosCamera3Stream::setOutputPortId(int id
)
177 status_t ret
= NO_ERROR
;
180 ALOGE("ERR(%s[%d]):Invalid outputPortId %d",
181 __FUNCTION__
, __LINE__
, id
);
190 status_t
ExynosCamera3Stream::getOutputPortId(int *id
)
192 status_t ret
= NO_ERROR
;
194 if (m_outputPortId
< 0) {
195 ALOGE("ERR(%s[%d]):Invalid outputPortId %d",
196 __FUNCTION__
, __LINE__
, m_outputPortId
);
199 *id
= m_outputPortId
;
205 status_t
ExynosCamera3Stream::setRegisterStream(EXYNOS_STREAM::STATE state
)
207 status_t ret
= NO_ERROR
;
209 case EXYNOS_STREAM::HAL_STREAM_STS_INVALID
:
210 case EXYNOS_STREAM::HAL_STREAM_STS_VALID
:
211 m_registerStream
= state
;
213 case EXYNOS_STREAM::HAL_STREAM_STS_INIT
:
215 ALOGE("ERR(%s[%d]):setConfigState invalid value(%d)", __FUNCTION__
, __LINE__
, state
);
221 status_t
ExynosCamera3Stream::getRegisterStream(EXYNOS_STREAM::STATE
*state
)
223 status_t ret
= NO_ERROR
;
224 switch (m_registerStream
) {
225 case EXYNOS_STREAM::HAL_STREAM_STS_INIT
:
226 case EXYNOS_STREAM::HAL_STREAM_STS_INVALID
:
227 case EXYNOS_STREAM::HAL_STREAM_STS_VALID
:
228 *state
= m_registerStream
;
231 ALOGE("ERR(%s[%d]):setConfigState invalid value(%d)", __FUNCTION__
, __LINE__
, *state
);
237 status_t
ExynosCamera3Stream::setRegisterBuffer(EXYNOS_STREAM::STATE state
)
239 status_t ret
= NO_ERROR
;
241 case EXYNOS_STREAM::HAL_STREAM_STS_REGISTERED
:
242 case EXYNOS_STREAM::HAL_STREAM_STS_UNREGISTERED
:
243 m_registerBuffer
= state
;
245 case EXYNOS_STREAM::HAL_STREAM_STS_INIT
:
247 ALOGE("ERR(%s[%d]):setRegisterBuffer invalid value(%d)", __FUNCTION__
, __LINE__
, state
);
253 status_t
ExynosCamera3Stream::getRegisterBuffer(EXYNOS_STREAM::STATE
*state
)
255 status_t ret
= NO_ERROR
;
256 switch (m_registerBuffer
) {
257 case EXYNOS_STREAM::HAL_STREAM_STS_INIT
:
258 case EXYNOS_STREAM::HAL_STREAM_STS_REGISTERED
:
259 case EXYNOS_STREAM::HAL_STREAM_STS_UNREGISTERED
:
260 *state
= m_registerBuffer
;
263 ALOGE("ERR(%s[%d]):getRegisterBuffer invalid value(%d)", __FUNCTION__
, __LINE__
, *state
);
269 status_t
ExynosCamera3Stream::setRequestBuffer(int bufferCnt
)
271 status_t ret
= NO_ERROR
;
274 ALOGE("ERR(%s[%d]):setRequestBuffer invalid value(%d)", __FUNCTION__
, __LINE__
, bufferCnt
);
275 ret
= INVALID_OPERATION
;
277 m_requestbuffer
= bufferCnt
;
278 m_stream
->max_buffers
= m_requestbuffer
;
283 status_t
ExynosCamera3Stream::getRequestBuffer(int *bufferCnt
)
285 status_t ret
= NO_ERROR
;
287 if (m_planeCount
< 0) {
288 ALOGE("ERR(%s[%d]):getRequestBuffer invalid value(%d)", __FUNCTION__
, __LINE__
, m_requestbuffer
);
289 ret
= INVALID_OPERATION
;
291 *bufferCnt
= m_requestbuffer
;
296 status_t
ExynosCamera3Stream::setBufferManager(ExynosCameraBufferManager
*bufferManager
)
298 status_t ret
= NO_ERROR
;
300 if (m_bufferManager
!= NULL
) {
301 ALOGE("ERR(%s[%d]):m_bufferManager is not NULL", __FUNCTION__
, __LINE__
);
302 ret
= INVALID_OPERATION
;
303 bufferManager
= NULL
;
305 m_bufferManager
= bufferManager
;
306 ALOGD("DEBUG(%s[%d]):m_bufferManager(%p)", __FUNCTION__
, __LINE__
, m_bufferManager
);
312 status_t
ExynosCamera3Stream::getBufferManager(ExynosCameraBufferManager
**bufferManager
)
314 status_t ret
= NO_ERROR
;
316 if (m_bufferManager
== NULL
) {
317 ALOGE("ERR(%s[%d]):m_bufferManager is NULL", __FUNCTION__
, __LINE__
);
318 ret
= INVALID_OPERATION
;
319 *bufferManager
= NULL
;
321 *bufferManager
= m_bufferManager
;
322 ALOGV("DEBUG(%s[%d]):m_bufferManager(%p)", __FUNCTION__
, __LINE__
, m_bufferManager
);
328 ExynosCameraStreamManager::ExynosCameraStreamManager(int cameraId
)
330 ALOGD("DEBUG(%s[%d]):ID(%d)", __FUNCTION__
, __LINE__
, cameraId
);
331 m_cameraId
= cameraId
;
335 ExynosCameraStreamManager::~ExynosCameraStreamManager()
337 ALOGD("DEBUG(%s[%d]):", __FUNCTION__
, __LINE__
);
341 void ExynosCameraStreamManager::m_init()
343 ALOGD("DEBUG(%s[%d]):ID(%d)", __FUNCTION__
, __LINE__
, m_cameraId
);
344 m_exynosconfig
= NULL
;
345 m_streamInfoMap
.clear();
346 m_yuvStreamCount
= 0;
347 m_yuvStreamMaxCount
= 0;
349 for (int i
= 0; i
< MAX_YUV_STREAM_COUNT
; i
++)
350 m_yuvStreamIdMap
[i
] = -1;
353 void ExynosCameraStreamManager::m_deinit()
355 ALOGD("DEBUG(%s[%d]):ID(%d)", __FUNCTION__
, __LINE__
, m_cameraId
);
356 StreamInfoMap::iterator iter
;
358 ExynosCameraStream
*streaminfo
= NULL
;
360 m_streamInfoLock
.lock();
361 for (iter
= m_streamInfoMap
.begin() ; iter
!= m_streamInfoMap
.end() ;) {
362 streaminfo
= iter
->second
;
363 m_streamInfoMap
.erase(iter
++);
367 m_streamInfoMap
.clear();
368 m_streamInfoLock
.unlock();
371 status_t
ExynosCameraStreamManager::dumpCurrentStreamList(void)
373 ALOGD("DEBUG(%s[%d]):Stream List dump-----", __FUNCTION__
, __LINE__
);
374 status_t ret
= NO_ERROR
;
375 ExynosCameraStream
*streaminfo
= NULL
;
377 EXYNOS_STREAM::STATE registerStream
= EXYNOS_STREAM::HAL_STREAM_STS_INIT
;
378 EXYNOS_STREAM::STATE registerBuf
= EXYNOS_STREAM::HAL_STREAM_STS_INIT
;
379 camera3_stream_t
*currentStream
= NULL
;
383 if (m_streamInfoMap
.empty()) {
384 ALOGE("ERR(%s[%d]):list is empty", __FUNCTION__
, __LINE__
);
385 return NOT_ENOUGH_DATA
;
388 for (StreamInfoIterator s
= m_streamInfoMap
.begin(); s
!= m_streamInfoMap
.end();) {
389 streaminfo
= s
->second
;
390 if (streaminfo
== NULL
) {
391 ALOGE("ERR(%s[%d]):streaminfo is NULL id(%d)", __FUNCTION__
, __LINE__
, s
->first
);
396 ret
= streaminfo
->getStream(¤tStream
);
398 ALOGE("ERR(%s[%d]):m_insert failed -> delete stream, id(%d)", __FUNCTION__
, __LINE__
, s
->first
);
403 streaminfo
->getID(&id
);
404 streaminfo
->getRegisterStream(®isterStream
);
405 streaminfo
->getRegisterBuffer(®isterBuf
);
406 ALOGD("DEBUG(%s[%d]):Stream(%p), ID(%d), type(%d), usage(0x%x) format(0x%x) (%d,%d)", __FUNCTION__
,
407 __LINE__
, currentStream
, id
,
408 currentStream
->stream_type
, currentStream
->usage
, currentStream
->format
,
409 currentStream
->width
, currentStream
->height
);
410 ALOGD("DEBUG(%s[%d]):status %d / %d", __FUNCTION__
, __LINE__
, registerStream
, registerBuf
);
417 status_t
ExynosCameraStreamManager::setConfig(struct ExynosConfigInfo
*config
)
419 status_t ret
= NO_ERROR
;
420 m_exynosconfig
= config
;
422 ALOGD("DEBUG(%s[%d]):preview(%d), raw(%d), jpeg(%d), recording(%d), yuvCallback(%d)",
423 __FUNCTION__
, __LINE__
,
424 m_exynosconfig
->current
->bufInfo
.num_preview_buffers
,
425 m_exynosconfig
->current
->bufInfo
.num_bayer_buffers
,
426 m_exynosconfig
->current
->bufInfo
.num_picture_buffers
,
427 m_exynosconfig
->current
->bufInfo
.num_recording_buffers
,
428 m_exynosconfig
->current
->bufInfo
.num_preview_cb_buffers
);
433 ExynosCameraStream
* ExynosCameraStreamManager::createStream(int id
, camera3_stream_t
*stream
)
436 ExynosCameraStream
*obj
= NULL
;
437 obj
= new ExynosCamera3Stream(id
, stream
);
439 ALOGE("ERR(%s[%d]):m_insert failed stream id(%d)", __FUNCTION__
, __LINE__
, id
);
442 stream
->priv
= static_cast<void*>(obj
);
444 ret
= m_insert(id
, obj
, &m_streamInfoMap
, &m_streamInfoLock
);
447 ALOGE("ERR(%s[%d]):m_insert failed -> delete stream, id(%d)", __FUNCTION__
, __LINE__
, id
);
452 status_t
ExynosCameraStreamManager::deleteStream(int id
)
456 ret
= m_delete(id
, &m_streamInfoMap
, &m_streamInfoLock
);
458 ALOGE("ERR(%s[%d]):eraseStream failed stream id(%d)", __FUNCTION__
, __LINE__
, id
);
461 ret
= m_decreaseYuvStreamCount(id
);
462 if (ret
!= NO_ERROR
) {
463 ALOGE("ERR(%s[%d]):Failed to decreaseYuvStreamCount. streamId %d",
464 __FUNCTION__
, __LINE__
, id
);
470 status_t
ExynosCameraStreamManager::getStream(int id
, ExynosCameraStream
**stream
)
472 status_t ret
= NO_ERROR
;
475 ret
= m_get(id
, stream
, &m_streamInfoMap
, &m_streamInfoLock
);
485 bool ExynosCameraStreamManager::findStream(int id
)
487 status_t ret
= NO_ERROR
;
490 ret
= m_find(id
, &m_streamInfoMap
, &m_streamInfoLock
);
497 status_t
ExynosCameraStreamManager::getStreamKeys(List
<int> *keylist
)
499 status_t ret
= NO_ERROR
;
500 StreamInfoIterator iter
;
502 for (iter
= m_streamInfoMap
.begin(); iter
!= m_streamInfoMap
.end() ; iter
++) {
503 ALOGV("DEBUG(%s[%d]):stream key is(%d)", __FUNCTION__
, __LINE__
, iter
->first
);
505 keylist
->push_back(iter
->first
);
511 status_t
ExynosCameraStreamManager::setYuvStreamMaxCount(int32_t count
)
513 m_yuvStreamMaxCount
= count
;
518 int32_t ExynosCameraStreamManager::getYuvStreamCount(void)
520 return m_yuvStreamCount
;
523 int ExynosCameraStreamManager::getYuvStreamId(int outputPortId
)
525 if (outputPortId
< 0 || outputPortId
>= 3) {
526 ALOGE("ERR(%s[%d]):Invalid outputPortId %d",
527 __FUNCTION__
, __LINE__
, outputPortId
);
531 return m_yuvStreamIdMap
[outputPortId
];
534 int ExynosCameraStreamManager::getOutputPortId(int streamId
)
536 int outputPortId
= -1;
539 ALOGE("ERR(%s[%d]):Invalid streamId %d",
540 __FUNCTION__
, __LINE__
, streamId
);
544 for (int i
= 0; i
< 3; i
++) {
545 if (m_yuvStreamIdMap
[i
] == streamId
)
552 status_t
ExynosCameraStreamManager::m_insert(int id
, ExynosCameraStream
*item
, StreamInfoMap
*list
, Mutex
*lock
)
554 status_t ret
= NO_ERROR
;
556 pair
<StreamInfoMap::iterator
,bool> listRet
;
558 listRet
= list
->insert( pair
<int, ExynosCameraStream
*>(id
, item
));
560 while(listRet
.second
== false) {
561 id
+= HAL_STREAM_ID_MAX
;
562 listRet
= list
->insert( pair
<int, ExynosCameraStream
*>(id
, item
));
563 ALOGW("WARN(%s[%d]):insert id is re-define id + HAL_STREAM_ID_MAX = (%d)", __FUNCTION__
, __LINE__
, id
);
566 if (listRet
.second
== true) {
567 ALOGI("INFO(%s[%d]):inserted stream and id is (%d)", __FUNCTION__
, __LINE__
, id
);
571 ret
= m_increaseYuvStreamCount(id
);
572 if (ret
!= NO_ERROR
) {
573 ALOGE("ERR(%s[%d]):Failed to updateYuvStreamCount. yuvStreamCount %d streamId %d",
574 __FUNCTION__
, __LINE__
, m_yuvStreamCount
, id
);
582 status_t
ExynosCameraStreamManager::m_erase(int id
, ExynosCameraStream
**item
, StreamInfoMap
*list
, Mutex
*lock
)
584 status_t ret
= NO_ERROR
;
585 StreamInfoMap::iterator iter
;
588 iter
= list
->find(id
);
589 if (iter
!= list
->end()) {
590 *item
= iter
->second
;
594 ALOGE("ERR(%s[%d]):StreamInfoMap is not EXIST stream id(%d)", __FUNCTION__
, __LINE__
, id
);
602 status_t
ExynosCameraStreamManager::m_find(int id
, StreamInfoMap
*list
, Mutex
*lock
)
604 status_t ret
= NO_ERROR
;
605 StreamInfoMap::iterator iter
;
608 ALOGE("ERR(%s[%d]):list is NULL", __FUNCTION__
, __LINE__
);
613 ALOGE("ERR(%s[%d]):lock is NULL", __FUNCTION__
, __LINE__
);
618 iter
= list
->find(id
);
619 if (iter
== list
->end()) {
627 status_t
ExynosCameraStreamManager::m_get(int id
, ExynosCameraStream
**item
, StreamInfoMap
*list
, Mutex
*lock
)
629 status_t ret
= NO_ERROR
;
630 StreamInfoMap::iterator iter
;
633 iter
= list
->find(id
);
634 if (iter
!= list
->end()) {
635 *item
= iter
->second
;
637 ALOGE("ERR(%s[%d]):StreamInfoMap is not EXIST stream id(%d)", __FUNCTION__
, __LINE__
, id
);
645 status_t
ExynosCameraStreamManager::m_delete(int id
, StreamInfoMap
*list
, Mutex
*lock
)
647 status_t ret
= NO_ERROR
;
648 StreamInfoMap::iterator iter
;
649 ExynosCameraStream
*item
= NULL
;
652 iter
= list
->find(id
);
653 if (iter
!= list
->end()) {
659 ALOGE("ERR(%s[%d]):StreamInfoMap is not EXIST stream id(%d)", __FUNCTION__
, __LINE__
, id
);
666 status_t
ExynosCameraStreamManager::m_delete(ExynosCameraStream
*stream
)
668 status_t ret
= NO_ERROR
;
669 camera3_stream_t
*obj
= NULL
;
674 ALOGE("ERR(%s[%d]):StreamInfoMap is not EXIST stream", __FUNCTION__
, __LINE__
);
678 ret
= stream
->getStream(&obj
);
681 stream
->getID(&streamId
);
688 status_t
ExynosCameraStreamManager::m_increaseYuvStreamCount(int id
)
690 status_t ret
= NO_ERROR
;
692 switch (id
% HAL_STREAM_ID_MAX
) {
693 case HAL_STREAM_ID_PREVIEW
:
694 case HAL_STREAM_ID_VIDEO
:
695 case HAL_STREAM_ID_CALLBACK
:
696 m_yuvStreamIdMap
[m_yuvStreamCount
++] = id
;
698 case HAL_STREAM_ID_RAW
:
699 case HAL_STREAM_ID_JPEG
:
700 case HAL_STREAM_ID_ZSL_OUTPUT
:
701 case HAL_STREAM_ID_ZSL_INPUT
:
702 /* Not YUV streams */
705 ALOGE("ERR(%s[%d]):Unsupported stream id %d",
706 __FUNCTION__
, __LINE__
);
711 if (m_yuvStreamCount
> m_yuvStreamMaxCount
) {
712 ALOGE("ERR(%s[%d]):Too many YUV stream!. maxYuvStreamCount %d currentYuvStreamCount %d",
713 __FUNCTION__
, __LINE__
,
714 m_yuvStreamMaxCount
, m_yuvStreamCount
);
715 ret
= INVALID_OPERATION
;
721 status_t
ExynosCameraStreamManager::m_decreaseYuvStreamCount(int id
)
724 ALOGE("ERR(%s[%d]):Invalid streamId %d",
725 __FUNCTION__
, __LINE__
, id
);
729 for (int i
= 0; i
< 3; i
++) {
730 if (m_yuvStreamIdMap
[i
] == id
) {
731 m_yuvStreamIdMap
[i
] = -1;
739 }; /* namespace android */