1 /* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
2 *
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions are
5 * met:
6 * * Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 * * Redistributions in binary form must reproduce the above
9 * copyright notice, this list of conditions and the following
10 * disclaimer in the documentation and/or other materials provided
11 * with the distribution.
12 * * Neither the name of The Linux Foundation nor the names of its
13 * contributors may be used to endorse or promote products derived
14 * from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 */
29
30 #include <stdlib.h>
31 #include <unistd.h>
32 #include <fcntl.h>
33 #include <time.h>
34 #include <semaphore.h>
35 #include <pthread.h>
36
37 #include <sys/types.h>
38 #include <sys/stat.h>
39 #include <sys/wait.h>
40
41 #include <ui/DisplayInfo.h>
42 #include <gui/Surface.h>
43 #include <gui/SurfaceComposerClient.h>
44 #include <gui/ISurfaceComposer.h>
45
46 #include <system/camera.h>
47
48 #include <camera/Camera.h>
49 #include <camera/ICamera.h>
50 #include <camera/CameraParameters.h>
51 #include <media/mediarecorder.h>
52
53 #include <utils/RefBase.h>
54 #include <utils/Mutex.h>
55 #include <utils/Condition.h>
56 #include <binder/IPCThreadState.h>
57 #include <binder/ProcessState.h>
58 #include <binder/IServiceManager.h>
59 #include <cutils/properties.h>
60 #include <cutils/memory.h>
61 #include <SkImageDecoder.h>
62 #include <SkImageEncoder.h>
63 #include <MediaCodec.h>
64 #include <OMX_IVCommon.h>
65 #include <foundation/AMessage.h>
66 #include <media/ICrypto.h>
67 #include <MediaMuxer.h>
68 #include <foundation/ABuffer.h>
69 #include <MediaErrors.h>
70 #include <gralloc_priv.h>
71 #include <math.h>
72
73 #include "qcamera_test.h"
74 #include "cam_types.h"
75 #include "mm_camera_dbg.h"
76
77 #define VIDEO_BUF_ALLIGN(size, allign) \
78 (((size) + (allign-1)) & (typeof(size))(~(allign-1)))
79
80 namespace qcamera {
81
82 using namespace android;
83
84 int CameraContext::JpegIdx = 0;
85 int CameraContext::mPiPIdx = 0;
86 const char CameraContext::KEY_ZSL[] = "zsl";
87
88 /*===========================================================================
89 * FUNCTION : previewCallback
90 *
91 * DESCRIPTION: preview callback preview mesages are enabled
92 *
93 * PARAMETERS :
94 * @mem : preview buffer
95 *
96 * RETURN : None
97 *==========================================================================*/
previewCallback(const sp<IMemory> & mem)98 void CameraContext::previewCallback(const sp<IMemory>& mem)
99 {
100 printf("PREVIEW Callback %p", mem->pointer());
101 uint8_t *ptr = (uint8_t*) mem->pointer();
102 if (NULL != ptr) {
103 printf("PRV_CB: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x",
104 ptr[0],
105 ptr[1],
106 ptr[2],
107 ptr[3],
108 ptr[4],
109 ptr[5],
110 ptr[6],
111 ptr[7],
112 ptr[8],
113 ptr[9]);
114 } else {
115 ALOGE(" no preview for NULL CB\n");
116 }
117 }
118
119 /*===========================================================================
120 * FUNCTION : useLock
121 *
122 * DESCRIPTION: Mutex lock for CameraContext
123 *
124 * PARAMETERS : none
125 *
126 * RETURN : none
127 *==========================================================================*/
useLock()128 void CameraContext::useLock()
129 {
130 Mutex::Autolock l(mLock);
131 while (mInUse) {
132 mCond.wait(mLock);
133 }
134 mInUse = true;
135 }
136
137 /*===========================================================================
138 * FUNCTION : signalFinished
139 *
140 * DESCRIPTION: Mutex unlock CameraContext
141 *
142 * PARAMETERS : none
143 *
144 * RETURN : none
145 *==========================================================================*/
signalFinished()146 void CameraContext::signalFinished()
147 {
148 Mutex::Autolock l(mLock);
149 mInUse = false;
150 mCond.signal();
151 }
152
153 /*===========================================================================
154 * FUNCTION : saveFile
155 *
156 * DESCRIPTION: helper function for saving buffers on filesystem
157 *
158 * PARAMETERS :
159 * @mem : buffer to save to filesystem
160 * @path: File path
161 *
162 * RETURN : status_t type of status
163 * NO_ERROR -- success
164 * none-zero failure code
165 *==========================================================================*/
saveFile(const sp<IMemory> & mem,String8 path)166 status_t CameraContext::saveFile(const sp<IMemory>& mem, String8 path)
167 {
168 unsigned char *buff = NULL;
169 ssize_t size;
170 int fd = -1;
171
172 if (mem == NULL) {
173 return BAD_VALUE;
174 }
175
176 fd = open(path, O_CREAT | O_WRONLY | O_TRUNC, 0655);
177 if(fd < 0) {
178 printf("Unable to open file %s %s\n", path.string(), strerror(fd));
179 return -errno;
180 }
181
182 size = (ssize_t)mem->size();
183 if (size <= 0) {
184 printf("IMemory object is of zero size\n");
185 close(fd);
186 return BAD_VALUE;
187 }
188
189 buff = (unsigned char *)mem->pointer();
190 if (!buff) {
191 printf("Buffer pointer is invalid\n");
192 close(fd);
193 return BAD_VALUE;
194 }
195
196 if (size != write(fd, buff, (size_t)size)) {
197 printf("Bad Write error (%d)%s\n", errno, strerror(errno));
198 close(fd);
199 return INVALID_OPERATION;
200 }
201
202 printf("%s: buffer=%p, size=%lld stored at %s\n",
203 __FUNCTION__, buff, (long long int) size, path.string());
204
205 if (fd >= 0)
206 close(fd);
207
208 return NO_ERROR;
209 }
210
211 /*===========================================================================
212 * FUNCTION : PiPCopyToOneFile
213 *
214 * DESCRIPTION: Copy the smaller picture to the bigger one
215 *
216 * PARAMETERS :
217 * @bitmap0 : Decoded image buffer 0
218 * @bitmap1 : Decoded image buffer 1
219 *
220 * RETURN : decoded picture in picture in SkBitmap
221 *==========================================================================*/
PiPCopyToOneFile(SkBitmap * bitmap0,SkBitmap * bitmap1)222 SkBitmap * CameraContext::PiPCopyToOneFile(
223 SkBitmap *bitmap0, SkBitmap *bitmap1)
224 {
225 size_t size0;
226 size_t size1;
227 SkBitmap *src;
228 SkBitmap *dst;
229 unsigned int dstOffset;
230 unsigned int srcOffset;
231
232 if (bitmap0 == NULL || bitmap1 == NULL) {
233 ALOGE(" bitmap0 : %p, bitmap1 : %p\n", bitmap0, bitmap1);
234 return NULL;
235 }
236
237 size0 = bitmap0->getSize();
238 if (size0 <= 0) {
239 printf("Decoded image 0 is of zero size\n");
240 return NULL;
241 }
242
243 size1 = bitmap1->getSize();
244 if (size1 <= 0) {
245 printf("Decoded image 1 is of zero size\n");
246 return NULL;
247 }
248
249 if (size0 > size1) {
250 dst = bitmap0;
251 src = bitmap1;
252 } else if (size1 > size0){
253 dst = bitmap1;
254 src = bitmap0;
255 } else {
256 printf("Picture size should be with different size!\n");
257 return NULL;
258 }
259
260 for (unsigned int i = 0; i < (unsigned int)src->height(); i++) {
261 dstOffset = i * (unsigned int)dst->width() * mfmtMultiplier;
262 srcOffset = i * (unsigned int)src->width() * mfmtMultiplier;
263 memcpy(((unsigned char *)dst->getPixels()) + dstOffset,
264 ((unsigned char *)src->getPixels()) + srcOffset,
265 (unsigned int)src->width() * mfmtMultiplier);
266 }
267
268 return dst;
269 }
270
271 /*===========================================================================
272 * FUNCTION : decodeJPEG
273 *
274 * DESCRIPTION: decode jpeg input buffer.
275 *
276 * PARAMETERS :
277 * @mem : buffer to decode
278 * @skBM : decoded buffer
279 *
280 * RETURN : status_t type of status
281 * NO_ERROR -- success
282 * none-zero failure code
283
284 *==========================================================================*/
decodeJPEG(const sp<IMemory> & mem,SkBitmap * skBM)285 status_t CameraContext::decodeJPEG(const sp<IMemory>& mem, SkBitmap *skBM)
286 {
287 #ifndef USE_SDK_20_OR_HIGHER
288 SkBitmap::Config prefConfig = SkBitmap::kARGB_8888_Config;
289 const void *buff = NULL;
290 size_t size;
291
292 buff = (const void *)mem->pointer();
293 size= mem->size();
294
295 switch(prefConfig) {
296 case SkBitmap::kARGB_8888_Config:
297 {
298 mfmtMultiplier = 4;
299 }
300 break;
301
302 case SkBitmap::kARGB_4444_Config:
303 {
304 mfmtMultiplier = 2;
305 }
306 break;
307
308 case SkBitmap::kRGB_565_Config:
309 {
310 mfmtMultiplier = 2;
311 }
312 break;
313
314 case SkBitmap::kIndex8_Config:
315 {
316 mfmtMultiplier = 4;
317 }
318 break;
319
320 case SkBitmap::kA8_Config:
321 {
322 mfmtMultiplier = 4;
323 }
324 break;
325
326 default:
327 {
328 mfmtMultiplier = 0;
329 printf("Decode format is not correct!\n");
330 }
331 break;
332 }
333
334 if (SkImageDecoder::DecodeMemory(buff, size, skBM, prefConfig,
335 SkImageDecoder::kDecodePixels_Mode) == false) {
336 printf("%s():%d:: Failed during jpeg decode\n",__FUNCTION__,__LINE__);
337 return BAD_VALUE;
338 }
339 #else
340 SkColorType prefConfig = kRGBA_8888_SkColorType;
341 const void *buff = NULL;
342 size_t size;
343
344 buff = (const void *)mem->pointer();
345 size= mem->size();
346
347 switch(prefConfig) {
348 case kRGBA_8888_SkColorType:
349 {
350 mfmtMultiplier = 4;
351 }
352 break;
353
354 case kBGRA_8888_SkColorType:
355 {
356 mfmtMultiplier = 4;
357 }
358 break;
359
360 case kARGB_4444_SkColorType:
361 {
362 mfmtMultiplier = 2;
363 }
364 break;
365
366 case kRGB_565_SkColorType:
367 {
368 mfmtMultiplier = 2;
369 }
370 break;
371
372 case kIndex_8_SkColorType:
373 {
374 mfmtMultiplier = 4;
375 }
376 break;
377
378 case kAlpha_8_SkColorType:
379 {
380 mfmtMultiplier = 4;
381 }
382 break;
383
384 default:
385 {
386 mfmtMultiplier = 0;
387 printf("Decode format is not correct!\n");
388 }
389 break;
390 }
391
392 if (SkImageDecoder::DecodeMemory(buff, size, skBM, prefConfig,
393 SkImageDecoder::kDecodePixels_Mode) == false) {
394 printf("%s():%d:: Failed during jpeg decode\n",__FUNCTION__,__LINE__);
395 return BAD_VALUE;
396 }
397
398 #endif
399 return NO_ERROR;
400 }
401
402 /*===========================================================================
403 * FUNCTION : encodeJPEG
404 *
405 * DESCRIPTION: encode the decoded input buffer.
406 *
407 * PARAMETERS :
408 * @stream : SkWStream
409 * @bitmap : SkBitmap decoded image to encode
410 * @path : File path
411 *
412 * RETURN : status_t type of status
413 * NO_ERROR -- success
414 * none-zero failure code
415
416 *==========================================================================*/
encodeJPEG(SkWStream * stream,const SkBitmap * bitmap,String8 path)417 status_t CameraContext::encodeJPEG(SkWStream * stream,
418 const SkBitmap *bitmap, String8 path)
419 {
420 int qFactor = 100;
421
422 skJpegEnc = SkImageEncoder::Create(SkImageEncoder::kJPEG_Type);
423 if (!skJpegEnc) {
424 ALOGE(" skJpegEnc is NULL\n");
425 return BAD_VALUE;
426 }
427
428 if (skJpegEnc->encodeStream(stream, *bitmap, qFactor) == false) {
429 return BAD_VALUE;
430 }
431
432 FILE *fh = fopen(path.string(), "r+");
433 if ( !fh ) {
434 printf("Could not open file %s\n", path.string());
435 return BAD_VALUE;
436 }
437
438 fseek(fh, 0, SEEK_END);
439 size_t len = (size_t)ftell(fh);
440 rewind(fh);
441
442 if( !len ) {
443 printf("File %s is empty !\n", path.string());
444 fclose(fh);
445 return BAD_VALUE;
446 }
447
448 unsigned char *buff = (unsigned char*)malloc(len);
449 if (!buff) {
450 printf("Cannot allocate memory for buffer reading!\n");
451 return BAD_VALUE;
452 }
453
454 size_t readSize = fread(buff, 1, len, fh);
455 if (readSize != len) {
456 printf("Reading error\n");
457 return BAD_VALUE;
458 }
459
460 status_t ret = ReadSectionsFromBuffer(buff, len, READ_ALL);
461 if (ret != NO_ERROR) {
462 printf("Cannot read sections from buffer\n");
463 DiscardData();
464 DiscardSections();
465 return BAD_VALUE;
466 }
467 free(buff);
468 rewind(fh);
469
470 unsigned char temp = 0xff;
471 size_t writeSize = fwrite(&temp, sizeof(unsigned char), 1, fh);
472 if (1 != writeSize) {
473 printf("Writing error\n");
474 }
475 temp = 0xd8;
476 fwrite(&temp, sizeof(unsigned char), 1, fh);
477
478 for (size_t i = 0; i < mSectionsRead; i++) {
479 switch((mSections[i].Type)) {
480
481 case 0x123:
482 fwrite(mSections[i].Data, sizeof(unsigned char),
483 mSections[i].Size, fh);
484 break;
485
486 case 0xe0:
487 temp = 0xff;
488 fwrite(&temp, sizeof(unsigned char), 1, fh);
489 temp = 0xe1;
490 fwrite(&temp, sizeof(unsigned char), 1, fh);
491 fwrite(mJEXIFSection.Data, sizeof(unsigned char),
492 mJEXIFSection.Size, fh);
493 break;
494
495 default:
496 temp = 0xff;
497 fwrite(&temp, sizeof(unsigned char), 1, fh);
498 fwrite(&mSections[i].Type, sizeof(unsigned char), 1, fh);
499 fwrite(mSections[i].Data, sizeof(unsigned char),
500 mSections[i].Size, fh);
501 break;
502 }
503 }
504 fseek(fh, 0, SEEK_END);
505 len = (size_t)ftell(fh);
506 rewind(fh);
507 printf("%s: buffer=%p, size=%zu stored at %s\n",
508 __FUNCTION__, bitmap->getPixels(), len, path.string());
509
510 free(mJEXIFSection.Data);
511 DiscardData();
512 DiscardSections();
513 fclose(fh);
514 ret = NO_ERROR;
515
516 return ret;
517 }
518
519 /*===========================================================================
520 * FUNCTION : readSectionsFromBuffer
521 *
522 * DESCRIPTION: read all jpeg sections of input buffer.
523 *
524 * PARAMETERS :
525 * @mem : buffer to read from Metadata Sections
526 * @buffer_size: buffer size
527 * @ReadMode: Read mode - all, jpeg or exif
528 *
529 * RETURN : status_t type of status
530 * NO_ERROR -- success
531 * none-zero failure code
532 *==========================================================================*/
ReadSectionsFromBuffer(unsigned char * buffer,size_t buffer_size,ReadMode_t ReadMode)533 status_t CameraContext::ReadSectionsFromBuffer (unsigned char *buffer,
534 size_t buffer_size, ReadMode_t ReadMode)
535 {
536 int a;
537 size_t pos = 0;
538 int HaveCom = 0;
539 mSectionsAllocated = 10;
540
541 mSections = (Sections_t *)malloc(sizeof(Sections_t) * mSectionsAllocated);
542 if (!mSections) {
543 printf(" not enough memory\n");
544 return BAD_VALUE;
545 }
546
547 if (!buffer) {
548 printf("Input buffer is null\n");
549 return BAD_VALUE;
550 }
551
552 if (buffer_size < 1) {
553 printf("Input size is 0\n");
554 return BAD_VALUE;
555 }
556
557 a = (int) buffer[pos++];
558
559 if (a != 0xff || buffer[pos++] != M_SOI){
560 printf("No valid image\n");
561 return BAD_VALUE;
562 }
563
564 for(;;){
565 size_t itemlen;
566 int marker = 0;
567 size_t ll,lh;
568 unsigned char * Data;
569
570 CheckSectionsAllocated();
571
572 // The call to CheckSectionsAllocated() may reallocate mSections
573 // so need to check for NULL again.
574 if (mSections == NULL) {
575 printf(" not enough memory\n");
576 return BAD_VALUE;
577 }
578
579 for (a = 0; a <= 16; a++){
580 marker = buffer[pos++];
581 if (marker != 0xff) break;
582
583 if (a >= 16){
584 fprintf(stderr,"too many padding bytes\n");
585 return BAD_VALUE;
586 }
587 }
588
589 mSections[mSectionsRead].Type = marker;
590
591 // Read the length of the section.
592 lh = buffer[pos++];
593 ll = buffer[pos++];
594
595 itemlen = (lh << 8) | ll;
596
597 if (itemlen < 2) {
598 ALOGE("invalid marker");
599 return BAD_VALUE;
600 }
601
602 mSections[mSectionsRead].Size = itemlen;
603
604 Data = (unsigned char *)malloc(itemlen);
605 if (Data == NULL) {
606 ALOGE("Could not allocate memory");
607 return NO_MEMORY;
608 }
609 mSections[mSectionsRead].Data = Data;
610
611 // Store first two pre-read bytes.
612 Data[0] = (unsigned char)lh;
613 Data[1] = (unsigned char)ll;
614
615 if (pos+itemlen-2 > buffer_size) {
616 ALOGE("Premature end of file?");
617 return BAD_VALUE;
618 }
619
620 memcpy(Data+2, buffer+pos, itemlen-2); // Read the whole section.
621 pos += itemlen-2;
622
623 mSectionsRead += 1;
624
625 switch(marker){
626
627 case M_SOS: // stop before hitting compressed data
628 // If reading entire image is requested, read the rest of the
629 // data.
630 if (ReadMode & READ_IMAGE){
631 size_t size;
632 // Determine how much file is left.
633 size = buffer_size - pos;
634
635 if (size < 1) {
636 ALOGE("could not read the rest of the image");
637 return BAD_VALUE;
638 }
639 Data = (unsigned char *)malloc(size);
640 if (Data == NULL) {
641 ALOGE("%d: could not allocate data for entire "
642 "image size: %d", __LINE__, size);
643 return BAD_VALUE;
644 }
645
646 memcpy(Data, buffer+pos, size);
647
648 CheckSectionsAllocated();
649
650 // The call to CheckSectionsAllocated()
651 // may reallocate mSections
652 // so need to check for NULL again.
653 if (mSections == NULL) {
654 printf(" not enough memory\n");
655 return BAD_VALUE;
656 }
657
658 mSections[mSectionsRead].Data = Data;
659 mSections[mSectionsRead].Size = size;
660 mSections[mSectionsRead].Type = PSEUDO_IMAGE_MARKER;
661 mSectionsRead ++;
662 mHaveAll = 1;
663 }
664 return NO_ERROR;
665
666 case M_EOI: // in case it's a tables-only JPEG stream
667 ALOGE("No image in jpeg!\n");
668 return BAD_VALUE;
669
670 case M_COM: // Comment section
671 if (HaveCom || ((ReadMode & READ_METADATA) == 0)){
672 // Discard this section.
673 free(mSections[--mSectionsRead].Data);
674 }
675 break;
676
677 case M_JFIF:
678 // Regular jpegs always have this tag, exif images have the
679 // exif marker instead, althogh ACDsee will write images
680 // with both markers.
681 // this program will re-create this marker on absence of exif
682 // marker.
683 // hence no need to keep the copy from the file.
684 if (ReadMode & READ_METADATA){
685 if (memcmp(Data+2, "JFIF", 4) == 0) {
686 break;
687 }
688 free(mSections[--mSectionsRead].Data);
689 }
690 break;
691
692 case M_EXIF:
693 // There can be different section using the same marker.
694 if (ReadMode & READ_METADATA){
695 if (memcmp(Data+2, "Exif", 4) == 0){
696 break;
697 }else if (memcmp(Data+2, "http:", 5) == 0){
698 // Change tag for internal purposes.
699 mSections[mSectionsRead-1].Type = M_XMP;
700 break;
701 }
702 }
703 // Oterwise, discard this section.
704 free(mSections[--mSectionsRead].Data);
705 break;
706
707 case M_IPTC:
708 if (ReadMode & READ_METADATA){
709 // Note: We just store the IPTC section.
710 // Its relatively straightforward
711 // and we don't act on any part of it,
712 // so just display it at parse time.
713 }else{
714 free(mSections[--mSectionsRead].Data);
715 }
716 break;
717
718 case M_SOF0:
719 case M_SOF1:
720 case M_SOF2:
721 case M_SOF3:
722 case M_SOF5:
723 case M_SOF6:
724 case M_SOF7:
725 case M_SOF9:
726 case M_SOF10:
727 case M_SOF11:
728 case M_SOF13:
729 case M_SOF14:
730 case M_SOF15:
731 break;
732 default:
733 // Skip any other sections.
734 break;
735 }
736 }
737 return NO_ERROR;
738 }
739
740 /*===========================================================================
741 * FUNCTION : CheckSectionsAllocated
742 *
743 * DESCRIPTION: Check allocated jpeg sections.
744 *
745 * PARAMETERS : none
746 *
747 * RETURN : none
748
749 *==========================================================================*/
CheckSectionsAllocated(void)750 void CameraContext::CheckSectionsAllocated(void)
751 {
752 if (mSectionsRead > mSectionsAllocated){
753 ALOGE("allocation screw up");
754 }
755 if (mSectionsRead >= mSectionsAllocated){
756 mSectionsAllocated += mSectionsAllocated +1;
757 mSections = (Sections_t *)realloc(mSections,
758 sizeof(Sections_t) * mSectionsAllocated);
759 if (mSections == NULL){
760 ALOGE("could not allocate data for entire image");
761 }
762 }
763 }
764
765 /*===========================================================================
766 * FUNCTION : findSection
767 *
768 * DESCRIPTION: find the desired Section of the JPEG buffer.
769 *
770 * PARAMETERS :
771 * @SectionType: Section type
772 *
773 * RETURN : return the found section
774
775 *==========================================================================*/
FindSection(int SectionType)776 CameraContext::Sections_t *CameraContext::FindSection(int SectionType)
777 {
778 for (unsigned int a = 0; a < mSectionsRead; a++) {
779 if (mSections[a].Type == SectionType){
780 return &mSections[a];
781 }
782 }
783 // Could not be found.
784 return NULL;
785 }
786
787
788 /*===========================================================================
789 * FUNCTION : DiscardData
790 *
791 * DESCRIPTION: DiscardData
792 *
793 * PARAMETERS : none
794 *
795 * RETURN : none
796
797 *==========================================================================*/
DiscardData()798 void CameraContext::DiscardData()
799 {
800 for (unsigned int a = 0; a < mSectionsRead; a++) {
801 free(mSections[a].Data);
802 }
803
804 mSectionsRead = 0;
805 mHaveAll = 0;
806 }
807
808 /*===========================================================================
809 * FUNCTION : DiscardSections
810 *
811 * DESCRIPTION: Discard allocated sections
812 *
813 * PARAMETERS : none
814 *
815 * RETURN : none
816
817 *==========================================================================*/
DiscardSections()818 void CameraContext::DiscardSections()
819 {
820 free(mSections);
821 mSectionsAllocated = 0;
822 mHaveAll = 0;
823 }
824
825 /*===========================================================================
826 * FUNCTION : notify
827 *
828 * DESCRIPTION: notify callback
829 *
830 * PARAMETERS :
831 * @msgType : type of callback
832 * @ext1: extended parameters
833 * @ext2: extended parameters
834 *
835 * RETURN : None
836 *==========================================================================*/
notify(int32_t msgType,int32_t ext1,int32_t ext2)837 void CameraContext::notify(int32_t msgType, int32_t ext1, int32_t ext2)
838 {
839 printf("Notify cb: %d %d %d\n", msgType, ext1, ext2);
840
841 if (( msgType & CAMERA_MSG_PREVIEW_FRAME)
842 #ifndef VANILLA_HAL
843 && (ext1 == CAMERA_FRAME_DATA_FD)
844 #endif
845 )
846 {
847 int fd = dup(ext2);
848 printf("notify Preview Frame fd: %d dup fd: %d\n", ext2, fd);
849 close(fd);
850 }
851
852 if ( msgType & CAMERA_MSG_FOCUS ) {
853 printf("AutoFocus %s \n",
854 (ext1) ? "OK" : "FAIL");
855 }
856
857 if ( msgType & CAMERA_MSG_SHUTTER ) {
858 printf("Shutter done \n");
859 }
860
861 if ( msgType & CAMERA_MSG_ERROR) {
862 printf("Camera Test CAMERA_MSG_ERROR\n");
863 stopPreview();
864 closeCamera();
865 }
866 }
867
868 /*===========================================================================
869 * FUNCTION : postData
870 *
871 * DESCRIPTION: handles data callbacks
872 *
873 * PARAMETERS :
874 * @msgType : type of callback
875 * @dataPtr: buffer data
876 * @metadata: additional metadata where available
877 *
878 * RETURN : None
879 *==========================================================================*/
postData(int32_t msgType,const sp<IMemory> & dataPtr,camera_frame_metadata_t * metadata)880 void CameraContext::postData(int32_t msgType,
881 const sp<IMemory>& dataPtr,
882 camera_frame_metadata_t *metadata)
883 {
884 mInterpr->PiPLock();
885 Size currentPictureSize = mSupportedPictureSizes.itemAt(
886 mCurrentPictureSizeIdx);
887 unsigned char *buff = NULL;
888 size_t size;
889 status_t ret = 0;
890
891 memset(&mJEXIFSection, 0, sizeof(mJEXIFSection)),
892
893 printf("Data cb: %d\n", msgType);
894
895 if ( msgType & CAMERA_MSG_PREVIEW_FRAME ) {
896 previewCallback(dataPtr);
897 }
898
899 if ( msgType & CAMERA_MSG_RAW_IMAGE ) {
900 printf("RAW done \n");
901 }
902
903 if (msgType & CAMERA_MSG_POSTVIEW_FRAME) {
904 printf("Postview frame \n");
905 }
906
907 if (msgType & CAMERA_MSG_COMPRESSED_IMAGE ) {
908 String8 jpegPath;
909 jpegPath = jpegPath.format(QCAMERA_DUMP_FRM_LOCATION"img_%d.jpg",
910 JpegIdx);
911 if (!mPiPCapture) {
912 // Normal capture case
913 printf("JPEG done\n");
914 saveFile(dataPtr, jpegPath);
915 JpegIdx++;
916 } else {
917 // PiP capture case
918 SkFILEWStream *wStream;
919 ret = decodeJPEG(dataPtr, &skBMtmp);
920 if (NO_ERROR != ret) {
921 printf("Error in decoding JPEG!\n");
922 mInterpr->PiPUnlock();
923 return;
924 }
925
926 mWidthTmp = currentPictureSize.width;
927 mHeightTmp = currentPictureSize.height;
928 PiPPtrTmp = dataPtr;
929 // If there are two jpeg buffers
930 if (mPiPIdx == 1) {
931 printf("PiP done\n");
932
933 // Find the the capture with higher width and height and read
934 // its jpeg sections
935 if ((mInterpr->camera[0]->mWidthTmp * mInterpr->camera[0]->mHeightTmp) >
936 (mInterpr->camera[1]->mWidthTmp * mInterpr->camera[1]->mHeightTmp)) {
937 buff = (unsigned char *)PiPPtrTmp->pointer();
938 size= PiPPtrTmp->size();
939 } else if ((mInterpr->camera[0]->mWidthTmp * mInterpr->camera[0]->mHeightTmp) <
940 (mInterpr->camera[1]->mWidthTmp * mInterpr->camera[1]->mHeightTmp)) {
941 buff = (unsigned char *)PiPPtrTmp->pointer();
942 size= PiPPtrTmp->size();
943 } else {
944 printf("Cannot take PiP. Images are with the same width"
945 " and height size!!!\n");
946 mInterpr->PiPUnlock();
947 return;
948 }
949
950 if (buff != NULL && size != 0) {
951 ret = ReadSectionsFromBuffer(buff, size, READ_ALL);
952 if (ret != NO_ERROR) {
953 printf("Cannot read sections from buffer\n");
954 DiscardData();
955 DiscardSections();
956 mInterpr->PiPUnlock();
957 return;
958 }
959
960 mJEXIFTmp = FindSection(M_EXIF);
961 if (!mJEXIFTmp) {
962 ALOGE("skBMDec is null\n");
963 DiscardData();
964 DiscardSections();
965 return;
966 }
967 mJEXIFSection = *mJEXIFTmp;
968 mJEXIFSection.Data = (unsigned char*)malloc(mJEXIFTmp->Size);
969 if (!mJEXIFSection.Data) {
970 ALOGE(" Not enough memory\n");
971 DiscardData();
972 DiscardSections();
973 return;
974 }
975 memcpy(mJEXIFSection.Data,
976 mJEXIFTmp->Data, mJEXIFTmp->Size);
977 DiscardData();
978 DiscardSections();
979
980 wStream = new SkFILEWStream(jpegPath.string());
981 skBMDec = PiPCopyToOneFile(&mInterpr->camera[0]->skBMtmp,
982 &mInterpr->camera[1]->skBMtmp);
983 if (!skBMDec) {
984 ALOGE("skBMDec is null\n");
985 delete wStream;
986 return;
987 }
988
989 if (encodeJPEG(wStream, skBMDec, jpegPath) != false) {
990 printf("%s():%d:: Failed during jpeg encode\n",
991 __FUNCTION__,__LINE__);
992 mInterpr->PiPUnlock();
993 return;
994 }
995 mPiPIdx = 0;
996 JpegIdx++;
997 delete wStream;
998 }
999 } else {
1000 mPiPIdx++;
1001 }
1002 disablePiPCapture();
1003 }
1004 }
1005
1006 if ((msgType & CAMERA_MSG_PREVIEW_METADATA) && (NULL != metadata)) {
1007 printf("Face detected %d \n", metadata->number_of_faces);
1008 }
1009 mInterpr->PiPUnlock();
1010
1011 }
1012
1013 /*===========================================================================
1014 * FUNCTION : postDataTimestamp
1015 *
1016 * DESCRIPTION: handles recording callbacks
1017 *
1018 * PARAMETERS :
1019 * @timestamp : timestamp of buffer
1020 * @msgType : type of buffer
1021 * @dataPtr : buffer data
1022 *
1023 * RETURN : None
1024 *==========================================================================*/
postDataTimestamp(nsecs_t timestamp,int32_t msgType,const sp<IMemory> & dataPtr)1025 void CameraContext::postDataTimestamp(nsecs_t timestamp,
1026 int32_t msgType,
1027 const sp<IMemory>& dataPtr)
1028 {
1029 printf("Recording cb: %d %lld %p\n",
1030 msgType, (long long int)timestamp, dataPtr.get());
1031 }
1032
1033 /*===========================================================================
1034 * FUNCTION : dataCallbackTimestamp
1035 *
1036 * DESCRIPTION: handles recording callbacks. Used for ViV recording
1037 *
1038 * PARAMETERS :
1039 * @timestamp : timestamp of buffer
1040 * @msgType : type of buffer
1041 * @dataPtr : buffer data
1042 *
1043 * RETURN : None
1044 *==========================================================================*/
dataCallbackTimestamp(nsecs_t timestamp,int32_t msgType,const sp<IMemory> & dataPtr)1045 void CameraContext::dataCallbackTimestamp(nsecs_t timestamp,
1046 int32_t msgType,
1047 const sp<IMemory>& dataPtr)
1048 {
1049 mInterpr->ViVLock();
1050 // Not needed check. Just avoiding warnings of not used variables.
1051 if (timestamp > 0)
1052 timestamp = 0;
1053 // Not needed check. Just avoiding warnings of not used variables.
1054 if (msgType > 0)
1055 msgType = 0;
1056 size_t i = 0;
1057 void * srcBuff = NULL;
1058 void * dstBuff = NULL;
1059
1060 size_t srcYStride = 0, dstYStride = 0;
1061 size_t srcUVStride = 0, dstUVStride = 0;
1062 size_t srcYScanLines = 0, dstYScanLines = 0;
1063 size_t srcUVScanLines = 0, dstUVScanLines = 0;
1064 size_t srcOffset = 0, dstOffset = 0;
1065 size_t srcBaseOffset = 0;
1066 size_t dstBaseOffset = 0;
1067 Size currentVideoSize = mSupportedVideoSizes.itemAt(mCurrentVideoSizeIdx);
1068 status_t err = NO_ERROR;
1069 ANativeWindowBuffer* anb = NULL;
1070
1071 dstBuff = (void *) dataPtr->pointer();
1072 if (NULL == dstBuff) {
1073 printf("Cannot access destination buffer!!!\n");
1074 mInterpr->ViVUnlock();
1075 return;
1076 }
1077
1078 if (mCameraIndex == mInterpr->mViVVid.sourceCameraID) {
1079 srcYStride = calcStride(currentVideoSize.width);
1080 srcUVStride = calcStride(currentVideoSize.width);
1081 srcYScanLines = calcYScanLines(currentVideoSize.height);
1082 srcUVScanLines = calcUVScanLines(currentVideoSize.height);
1083 mInterpr->mViVBuff.srcWidth = (size_t)currentVideoSize.width;
1084 mInterpr->mViVBuff.srcHeight = (size_t)currentVideoSize.height;
1085
1086
1087 mInterpr->mViVBuff.YStride = srcYStride;
1088 mInterpr->mViVBuff.UVStride = srcUVStride;
1089 mInterpr->mViVBuff.YScanLines = srcYScanLines;
1090 mInterpr->mViVBuff.UVScanLines = srcUVScanLines;
1091
1092 memcpy( mInterpr->mViVBuff.buff, dstBuff,
1093 mInterpr->mViVBuff.buffSize);
1094
1095 mInterpr->mViVVid.isBuffValid = true;
1096 } else if (mCameraIndex == mInterpr->mViVVid.destinationCameraID) {
1097 if(mInterpr->mViVVid.isBuffValid == true) {
1098 dstYStride = calcStride(currentVideoSize.width);
1099 dstUVStride = calcStride(currentVideoSize.width);
1100 dstYScanLines = calcYScanLines(currentVideoSize.height);
1101 dstUVScanLines = calcUVScanLines(currentVideoSize.height);
1102
1103 srcYStride = mInterpr->mViVBuff.YStride;
1104 srcUVStride = mInterpr->mViVBuff.UVStride;
1105 srcYScanLines = mInterpr->mViVBuff.YScanLines;
1106 srcUVScanLines = mInterpr->mViVBuff.UVScanLines;
1107
1108
1109 for (i = 0; i < mInterpr->mViVBuff.srcHeight; i++) {
1110 srcOffset = i*srcYStride;
1111 dstOffset = i*dstYStride;
1112 memcpy((unsigned char *) dstBuff + dstOffset,
1113 (unsigned char *) mInterpr->mViVBuff.buff +
1114 srcOffset, mInterpr->mViVBuff.srcWidth);
1115 }
1116 srcBaseOffset = srcYStride * srcYScanLines;
1117 dstBaseOffset = dstYStride * dstYScanLines;
1118 for (i = 0; i < mInterpr->mViVBuff.srcHeight / 2; i++) {
1119 srcOffset = i*srcUVStride + srcBaseOffset;
1120 dstOffset = i*dstUVStride + dstBaseOffset;
1121 memcpy((unsigned char *) dstBuff + dstOffset,
1122 (unsigned char *) mInterpr->mViVBuff.buff +
1123 srcOffset, mInterpr->mViVBuff.srcWidth);
1124 }
1125
1126 err = native_window_dequeue_buffer_and_wait(
1127 mInterpr->mViVVid.ANW.get(),&anb);
1128 if (err != NO_ERROR) {
1129 printf("Cannot dequeue anb for sensor %d!!!\n", mCameraIndex);
1130 mInterpr->ViVUnlock();
1131 return;
1132 }
1133 mInterpr->mViVVid.graphBuf = new GraphicBuffer(anb, false);
1134 if(NULL == mInterpr->mViVVid.graphBuf.get()) {
1135 printf("Invalid Graphic buffer\n");
1136 mInterpr->ViVUnlock();
1137 return;
1138 }
1139 err = mInterpr->mViVVid.graphBuf->lock(
1140 GRALLOC_USAGE_SW_WRITE_OFTEN,
1141 (void**)(&mInterpr->mViVVid.mappedBuff));
1142 if (err != NO_ERROR) {
1143 printf("Graphic buffer could not be locked %d!!!\n", err);
1144 mInterpr->ViVUnlock();
1145 return;
1146 }
1147
1148 srcYStride = dstYStride;
1149 srcUVStride = dstUVStride;
1150 srcYScanLines = dstYScanLines;
1151 srcUVScanLines = dstUVScanLines;
1152 srcBuff = dstBuff;
1153
1154 for (i = 0; i < (size_t)currentVideoSize.height; i++) {
1155 srcOffset = i*srcYStride;
1156 dstOffset = i*dstYStride;
1157 memcpy((unsigned char *) mInterpr->mViVVid.mappedBuff +
1158 dstOffset, (unsigned char *) srcBuff +
1159 srcOffset, (size_t)currentVideoSize.width);
1160 }
1161
1162 srcBaseOffset = srcYStride * srcYScanLines;
1163 dstBaseOffset = dstUVStride * (size_t)currentVideoSize.height;
1164
1165 for (i = 0; i < (size_t)currentVideoSize.height / 2; i++) {
1166 srcOffset = i*srcUVStride + srcBaseOffset;
1167 dstOffset = i*dstUVStride + dstBaseOffset;
1168 memcpy((unsigned char *) mInterpr->mViVVid.mappedBuff +
1169 dstOffset, (unsigned char *) srcBuff +
1170 srcOffset, (size_t)currentVideoSize.width);
1171 }
1172
1173
1174 mInterpr->mViVVid.graphBuf->unlock();
1175
1176 err = mInterpr->mViVVid.ANW->queueBuffer(
1177 mInterpr->mViVVid.ANW.get(), anb, -1);
1178 if(err)
1179 printf("Failed to enqueue buffer to recorder!!!\n");
1180 }
1181 }
1182 mCamera->releaseRecordingFrame(dataPtr);
1183
1184 mInterpr->ViVUnlock();
1185 }
1186
1187 /*===========================================================================
1188 * FUNCTION : ViVEncoderThread
1189 *
1190 * DESCRIPTION: Creates a separate thread for ViV recording
1191 *
1192 * PARAMETERS : None
1193 *
1194 * RETURN : None
1195 *==========================================================================*/
ViVEncoderThread()1196 status_t Interpreter::ViVEncoderThread()
1197 {
1198 int ret = NO_ERROR;
1199 pthread_attr_t attr;
1200 pthread_attr_init(&attr);
1201
1202 ret = pthread_create(&mViVEncThread, &attr, ThreadWrapper, this);
1203 ret = pthread_attr_destroy(&attr);
1204
1205 return ret;
1206 }
1207
1208 /*===========================================================================
1209 * FUNCTION : ThreadWrapper
1210 *
1211 * DESCRIPTION: Helper function for for ViV recording thread
1212 *
1213 * PARAMETERS : Interpreter context
1214 *
1215 * RETURN : None
1216 *==========================================================================*/
ThreadWrapper(void * context)1217 void *Interpreter::ThreadWrapper(void *context) {
1218 Interpreter *writer = static_cast<Interpreter *>(context);
1219 writer->ViVEncode();
1220 return NULL;
1221 }
1222
1223 /*===========================================================================
1224 * FUNCTION : ViVEncode
1225 *
1226 * DESCRIPTION: Thread for ViV encode. Buffers from video codec are sent to
1227 * muxer and saved in a file.
1228 *
1229 * PARAMETERS : Interpreter context
1230 *
1231 * RETURN : None
1232 *==========================================================================*/
ViVEncode()1233 void Interpreter::ViVEncode()
1234 {
1235 status_t err = NO_ERROR;
1236 ssize_t trackIdx = -1;
1237 uint32_t debugNumFrames = 0;
1238
1239 size_t bufIndex, offset, size;
1240 int64_t ptsUsec;
1241 uint32_t flags;
1242 bool DoRecording = true;
1243
1244
1245 err = mTestContext->mViVVid.codec->getOutputBuffers(
1246 &mTestContext->mViVVid.buffers);
1247 if (err != NO_ERROR) {
1248 printf("Unable to get output buffers (err=%d)\n", err);
1249 }
1250
1251 while (DoRecording) {
1252 err = mTestContext->mViVVid.codec->dequeueOutputBuffer(
1253 &bufIndex,
1254 &offset,
1255 &size,
1256 &ptsUsec,
1257 &flags, -1);
1258
1259 switch (err) {
1260
1261 case NO_ERROR:
1262 // got a buffer
1263 if ((flags & MediaCodec::BUFFER_FLAG_CODECCONFIG) != 0) {
1264 // ignore this -- we passed the CSD into MediaMuxer when
1265 // we got the format change notification
1266 size = 0;
1267 }
1268 if (size != 0) {
1269 // If the virtual display isn't providing us with timestamps,
1270 // use the current time.
1271 if (ptsUsec == 0) {
1272 ptsUsec = systemTime(SYSTEM_TIME_MONOTONIC) / 1000;
1273 }
1274
1275 // The MediaMuxer docs are unclear, but it appears that we
1276 // need to pass either the full set of BufferInfo flags, or
1277 // (flags & BUFFER_FLAG_SYNCFRAME).
1278 err = mTestContext->mViVVid.muxer->writeSampleData(
1279 mTestContext->mViVVid.buffers[bufIndex],
1280 (size_t)trackIdx,
1281 ptsUsec,
1282 flags);
1283 if (err != NO_ERROR) {
1284 fprintf(stderr, "Failed writing data to muxer (err=%d)\n",
1285 err);
1286 }
1287 debugNumFrames++;
1288 }
1289 err = mTestContext->mViVVid.codec->releaseOutputBuffer(bufIndex);
1290 if (err != NO_ERROR) {
1291 fprintf(stderr, "Unable to release output buffer (err=%d)\n",
1292 err);
1293 }
1294 if ((flags & MediaCodec::BUFFER_FLAG_EOS) != 0) {
1295 // Not expecting EOS from SurfaceFlinger. Go with it.
1296 printf("Received end-of-stream\n");
1297 //DoRecording = false;
1298 }
1299 break;
1300 case -EAGAIN: // INFO_TRY_AGAIN_LATER
1301 ALOGV("Got -EAGAIN, looping");
1302 break;
1303 case INFO_FORMAT_CHANGED: // INFO_OUTPUT_FORMAT_CHANGED
1304 {
1305 // format includes CSD, which we must provide to muxer
1306 sp<AMessage> newFormat;
1307 mTestContext->mViVVid.codec->getOutputFormat(&newFormat);
1308 trackIdx = mTestContext->mViVVid.muxer->addTrack(newFormat);
1309 err = mTestContext->mViVVid.muxer->start();
1310 if (err != NO_ERROR) {
1311 printf("Unable to start muxer (err=%d)\n", err);
1312 }
1313 }
1314 break;
1315 case INFO_OUTPUT_BUFFERS_CHANGED: // INFO_OUTPUT_BUFFERS_CHANGED
1316 // not expected for an encoder; handle it anyway
1317 ALOGV("Encoder buffers changed");
1318 err = mTestContext->mViVVid.codec->getOutputBuffers(
1319 &mTestContext->mViVVid.buffers);
1320 if (err != NO_ERROR) {
1321 printf("Unable to get new output buffers (err=%d)\n", err);
1322 }
1323 break;
1324 case INVALID_OPERATION:
1325 DoRecording = false;
1326 break;
1327 default:
1328 printf("Got weird result %d from dequeueOutputBuffer\n", err);
1329 break;
1330 }
1331 }
1332
1333 return;
1334 }
1335
1336 /*===========================================================================
1337 * FUNCTION : calcBufferSize
1338 *
1339 * DESCRIPTION: Temp buffer size calculation. Temp buffer is used to store
1340 * the buffer from the camera with smaller resolution. It is
1341 * copied to the buffer from camera with higher resolution.
1342 *
1343 * PARAMETERS :
1344 * @width : video size width
1345 * @height : video size height
1346 *
1347 * RETURN : size_t
1348 *==========================================================================*/
calcBufferSize(int width,int height)1349 size_t CameraContext::calcBufferSize(int width, int height)
1350 {
1351 size_t size = 0;
1352 size_t UVAlignment;
1353 size_t YPlane, UVPlane, YStride, UVStride, YScanlines, UVScanlines;
1354 if (!width || !height) {
1355 return size;
1356 }
1357 UVAlignment = 4096;
1358 YStride = calcStride(width);
1359 UVStride = calcStride(width);
1360 YScanlines = calcYScanLines(height);
1361 UVScanlines = calcUVScanLines(height);
1362 YPlane = YStride * YScanlines;
1363 UVPlane = UVStride * UVScanlines + UVAlignment;
1364 size = YPlane + UVPlane;
1365 size = VIDEO_BUF_ALLIGN(size, 4096);
1366
1367 return size;
1368 }
1369
1370 /*===========================================================================
1371 * FUNCTION : calcStride
1372 *
1373 * DESCRIPTION: Temp buffer stride calculation.
1374 *
1375 * PARAMETERS :
1376 * @width : video size width
1377 *
1378 * RETURN : size_t
1379 *==========================================================================*/
calcStride(int width)1380 size_t CameraContext::calcStride(int width)
1381 {
1382 size_t alignment, stride = 0;
1383 if (!width) {
1384 return stride;
1385 }
1386 alignment = 128;
1387 stride = VIDEO_BUF_ALLIGN((size_t)width, alignment);
1388
1389 return stride;
1390 }
1391
1392 /*===========================================================================
1393 * FUNCTION : calcYScanLines
1394 *
1395 * DESCRIPTION: Temp buffer scanlines calculation for Y plane.
1396 *
1397 * PARAMETERS :
1398 * @width : video size height
1399 *
1400 * RETURN : size_t
1401 *==========================================================================*/
calcYScanLines(int height)1402 size_t CameraContext::calcYScanLines(int height)
1403 {
1404 size_t alignment, scanlines = 0;
1405 if (!height) {
1406 return scanlines;
1407 }
1408 alignment = 32;
1409 scanlines = VIDEO_BUF_ALLIGN((size_t)height, alignment);
1410
1411 return scanlines;
1412 }
1413
1414 /*===========================================================================
1415 * FUNCTION : calcUVScanLines
1416 *
1417 * DESCRIPTION: Temp buffer scanlines calculation for UV plane.
1418 *
1419 * PARAMETERS :
1420 * @width : video size height
1421 *
1422 * RETURN : size_t
1423 *==========================================================================*/
calcUVScanLines(int height)1424 size_t CameraContext::calcUVScanLines(int height)
1425 {
1426 size_t alignment, scanlines = 0;
1427 if (!height) {
1428 return scanlines;
1429 }
1430 alignment = 16;
1431 scanlines = VIDEO_BUF_ALLIGN((size_t)((height + 1) >> 1), alignment);
1432
1433 return scanlines;
1434 }
1435
1436 /*===========================================================================
1437 * FUNCTION : printSupportedParams
1438 *
1439 * DESCRIPTION: dump common supported parameters
1440 *
1441 * PARAMETERS : None
1442 *
1443 * RETURN : None
1444 *==========================================================================*/
printSupportedParams()1445 void CameraContext::printSupportedParams()
1446 {
1447 const char *camera_ids = mParams.get("camera-indexes");
1448 const char *pic_sizes = mParams.get(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES);
1449 const char *pic_formats = mParams.get(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS);
1450 const char *preview_sizes = mParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES);
1451 const char *video_sizes = mParams.get(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES);
1452 const char *preview_formats = mParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS);
1453 const char *frame_rates = mParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES);
1454 const char *thumb_sizes = mParams.get(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES);
1455 const char *wb_modes = mParams.get(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE);
1456 const char *effects = mParams.get(CameraParameters::KEY_SUPPORTED_EFFECTS);
1457 const char *scene_modes = mParams.get(CameraParameters::KEY_SUPPORTED_SCENE_MODES);
1458 const char *focus_modes = mParams.get(CameraParameters::KEY_SUPPORTED_FOCUS_MODES);
1459 const char *antibanding_modes = mParams.get(CameraParameters::KEY_SUPPORTED_ANTIBANDING);
1460 const char *flash_modes = mParams.get(CameraParameters::KEY_SUPPORTED_FLASH_MODES);
1461 int focus_areas = mParams.getInt(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS);
1462 const char *fps_ranges = mParams.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE);
1463 const char *focus_distances = mParams.get(CameraParameters::KEY_FOCUS_DISTANCES);
1464
1465 printf("\n\r\tSupported Cameras: %s",
1466 (camera_ids != NULL)? camera_ids : "NULL");
1467 printf("\n\r\tSupported Picture Sizes: %s",
1468 (pic_sizes != NULL)? pic_sizes : "NULL");
1469 printf("\n\r\tSupported Picture Formats: %s",
1470 (pic_formats != NULL)? pic_formats : "NULL");
1471 printf("\n\r\tSupported Preview Sizes: %s",
1472 (preview_sizes != NULL)? preview_sizes : "NULL");
1473 printf("\n\r\tSupported Video Sizes: %s",
1474 (video_sizes != NULL)? video_sizes : "NULL");
1475 printf("\n\r\tSupported Preview Formats: %s",
1476 (preview_formats != NULL)? preview_formats : "NULL");
1477 printf("\n\r\tSupported Preview Frame Rates: %s",
1478 (frame_rates != NULL)? frame_rates : "NULL");
1479 printf("\n\r\tSupported Thumbnail Sizes: %s",
1480 (thumb_sizes != NULL)? thumb_sizes : "NULL");
1481 printf("\n\r\tSupported Whitebalance Modes: %s",
1482 (wb_modes != NULL)? wb_modes : "NULL");
1483 printf("\n\r\tSupported Effects: %s",
1484 (effects != NULL)? effects : "NULL");
1485 printf("\n\r\tSupported Scene Modes: %s",
1486 (scene_modes != NULL)? scene_modes : "NULL");
1487 printf("\n\r\tSupported Focus Modes: %s",
1488 (focus_modes != NULL)? focus_modes : "NULL");
1489 printf("\n\r\tSupported Antibanding Options: %s",
1490 (antibanding_modes != NULL)? antibanding_modes : "NULL");
1491 printf("\n\r\tSupported Flash Modes: %s",
1492 (flash_modes != NULL)? flash_modes : "NULL");
1493 printf("\n\r\tSupported Focus Areas: %d", focus_areas);
1494 printf("\n\r\tSupported FPS ranges : %s",
1495 (fps_ranges != NULL)? fps_ranges : "NULL");
1496 printf("\n\r\tFocus Distances: %s \n",
1497 (focus_distances != NULL)? focus_distances : "NULL");
1498 }
1499
1500 /*===========================================================================
1501 * FUNCTION : createPreviewSurface
1502 *
1503 * DESCRIPTION: helper function for creating preview surfaces
1504 *
1505 * PARAMETERS :
1506 * @width : preview width
1507 * @height: preview height
1508 * @pixFormat : surface pixelformat
1509 *
1510 * RETURN : status_t type of status
1511 * NO_ERROR -- success
1512 * none-zero failure code
1513 *==========================================================================*/
createPreviewSurface(int width,int height,int32_t pixFormat)1514 status_t CameraContext::createPreviewSurface(int width, int height, int32_t pixFormat)
1515 {
1516 int ret = NO_ERROR;
1517 DisplayInfo dinfo;
1518 sp<IBinder> display(SurfaceComposerClient::getBuiltInDisplay(
1519 ISurfaceComposer::eDisplayIdMain));
1520 SurfaceComposerClient::getDisplayInfo(display, &dinfo);
1521 uint32_t previewWidth, previewHeight;
1522
1523 if ((0 >= width) || (0 >= height)) {
1524 printf("Bad preview surface size %dx%d\n", width, height);
1525 return BAD_VALUE;
1526 }
1527
1528 if ((int)dinfo.w < width) {
1529 previewWidth = dinfo.w;
1530 } else {
1531 previewWidth = (unsigned int)width;
1532 }
1533
1534 if ((int)dinfo.h < height) {
1535 previewHeight = dinfo.h;
1536 } else {
1537 previewHeight = (unsigned int)height;
1538 }
1539
1540 mClient = new SurfaceComposerClient();
1541
1542 if ( NULL == mClient.get() ) {
1543 printf("Unable to establish connection to Surface Composer \n");
1544 return NO_INIT;
1545 }
1546
1547 mSurfaceControl = mClient->createSurface(String8("QCamera_Test"),
1548 previewWidth,
1549 previewHeight,
1550 pixFormat,
1551 0);
1552 if ( NULL == mSurfaceControl.get() ) {
1553 printf("Unable to create preview surface \n");
1554 return NO_INIT;
1555 }
1556
1557 mPreviewSurface = mSurfaceControl->getSurface();
1558 if ( NULL != mPreviewSurface.get() ) {
1559 mClient->openGlobalTransaction();
1560 ret |= mSurfaceControl->setLayer(0x7fffffff);
1561 if ( mCameraIndex == 0 )
1562 ret |= mSurfaceControl->setPosition(0, 0);
1563 else
1564 ret |= mSurfaceControl->setPosition((float)(dinfo.w - previewWidth),
1565 (float)(dinfo.h - previewHeight));
1566
1567 ret |= mSurfaceControl->setSize(previewWidth, previewHeight);
1568 ret |= mSurfaceControl->show();
1569 mClient->closeGlobalTransaction();
1570
1571 if ( NO_ERROR != ret ) {
1572 printf("Preview surface configuration failed! \n");
1573 }
1574 } else {
1575 ret = NO_INIT;
1576 }
1577
1578 return ret;
1579 }
1580
1581 /*===========================================================================
1582 * FUNCTION : destroyPreviewSurface
1583 *
1584 * DESCRIPTION: closes previously open preview surface
1585 *
1586 * PARAMETERS : None
1587 *
1588 * RETURN : status_t type of status
1589 * NO_ERROR -- success
1590 * none-zero failure code
1591 *==========================================================================*/
destroyPreviewSurface()1592 status_t CameraContext::destroyPreviewSurface()
1593 {
1594 if ( NULL != mPreviewSurface.get() ) {
1595 mPreviewSurface.clear();
1596 }
1597
1598 if ( NULL != mSurfaceControl.get() ) {
1599 mSurfaceControl->clear();
1600 mSurfaceControl.clear();
1601 }
1602
1603 if ( NULL != mClient.get() ) {
1604 mClient->dispose();
1605 mClient.clear();
1606 }
1607
1608 return NO_ERROR;
1609 }
1610
1611 /*===========================================================================
1612 * FUNCTION : CameraContext
1613 *
1614 * DESCRIPTION: camera context constructor
1615 *
1616 * PARAMETERS : None
1617 *
1618 * RETURN : None
1619 *==========================================================================*/
CameraContext(int cameraIndex)1620 CameraContext::CameraContext(int cameraIndex) :
1621 mCameraIndex(cameraIndex),
1622 mResizePreview(true),
1623 mHardwareActive(false),
1624 mPreviewRunning(false),
1625 mRecordRunning(false),
1626 mVideoFd(-1),
1627 mVideoIdx(0),
1628 mRecordingHint(false),
1629 mDoPrintMenu(true),
1630 mPiPCapture(false),
1631 mfmtMultiplier(1),
1632 mSectionsRead(false),
1633 mSectionsAllocated(0),
1634 mSections(NULL),
1635 mJEXIFTmp(NULL),
1636 mHaveAll(false),
1637 mCamera(NULL),
1638 mClient(NULL),
1639 mSurfaceControl(NULL),
1640 mPreviewSurface(NULL),
1641 mInUse(false)
1642 {
1643 mRecorder = new MediaRecorder(String16("camera"));
1644 }
1645
1646 /*===========================================================================
1647 * FUNCTION : setTestCtxInstance
1648 *
1649 * DESCRIPTION : Sends TestContext instance to CameraContext
1650 *
1651 * PARAMETERS :
1652 * @instance : TestContext instance
1653 *
1654 * RETURN : None
1655 *==========================================================================*/
setTestCtxInstance(TestContext * instance)1656 void CameraContext::setTestCtxInstance(TestContext *instance)
1657 {
1658 mInterpr = instance;
1659 }
1660
1661 /*===========================================================================
1662 * FUNCTION : setTestCtxInst
1663 *
1664 * DESCRIPTION : Sends TestContext instance to Interpreter
1665 *
1666 * PARAMETERS :
1667 * @instance : TestContext instance
1668 *
1669 * RETURN : None
1670 *==========================================================================*/
setTestCtxInst(TestContext * instance)1671 void Interpreter::setTestCtxInst(TestContext *instance)
1672 {
1673 mTestContext = instance;
1674 }
1675
1676 /*===========================================================================
1677 * FUNCTION : ~CameraContext
1678 *
1679 * DESCRIPTION: camera context destructor
1680 *
1681 * PARAMETERS : None
1682 *
1683 * RETURN : None
1684 *==========================================================================*/
~CameraContext()1685 CameraContext::~CameraContext()
1686 {
1687 stopPreview();
1688 closeCamera();
1689 }
1690
1691 /*===========================================================================
1692 * FUNCTION : openCamera
1693 *
1694 * DESCRIPTION: connects to and initializes camera
1695 *
1696 * PARAMETERS : None
1697 *
1698 * RETURN : status_t type of status
1699 * NO_ERROR -- success
1700 * none-zero failure code
1701 *==========================================================================*/
openCamera()1702 status_t CameraContext::openCamera()
1703 {
1704 useLock();
1705 const char *ZSLStr = NULL;
1706 size_t ZSLStrSize = 0;
1707
1708 if ( NULL != mCamera.get() ) {
1709 printf("Camera already open! \n");
1710 signalFinished();
1711 return NO_ERROR;
1712 }
1713
1714 printf("openCamera(camera_index=%d)\n", mCameraIndex);
1715
1716 #ifndef USE_JB_MR1
1717
1718 String16 packageName("CameraTest");
1719
1720 mCamera = Camera::connect(mCameraIndex,
1721 packageName,
1722 Camera::USE_CALLING_UID);
1723
1724 #else
1725
1726 mCamera = Camera::connect(mCameraIndex);
1727
1728 #endif
1729
1730 if ( NULL == mCamera.get() ) {
1731 printf("Unable to connect to CameraService\n");
1732 signalFinished();
1733 return NO_INIT;
1734 }
1735
1736 mParams = mCamera->getParameters();
1737 mParams.getSupportedPreviewSizes(mSupportedPreviewSizes);
1738 mParams.getSupportedPictureSizes(mSupportedPictureSizes);
1739 mParams.getSupportedVideoSizes(mSupportedVideoSizes);
1740
1741 mCurrentPictureSizeIdx = mSupportedPictureSizes.size() / 2;
1742 mCurrentPreviewSizeIdx = mSupportedPreviewSizes.size() / 2;
1743 mCurrentVideoSizeIdx = mSupportedVideoSizes.size() / 2;
1744
1745 mCamera->setListener(this);
1746 mHardwareActive = true;
1747
1748 mInterpr->setViVSize((Size) mSupportedVideoSizes.itemAt(
1749 mCurrentVideoSizeIdx),
1750 mCameraIndex);
1751
1752 ZSLStr = mParams.get(CameraContext::KEY_ZSL);
1753 if (NULL != ZSLStr) {
1754 ZSLStrSize = strlen(ZSLStr);
1755 if (!strncmp(ZSLStr, "on", ZSLStrSize)) {
1756 mInterpr->mIsZSLOn = true;
1757 } else if (!strncmp(ZSLStr, "off", ZSLStrSize)) {
1758 mInterpr->mIsZSLOn = false;
1759 } else {
1760 printf("zsl value is not valid!\n");
1761 }
1762 } else {
1763 printf("zsl is NULL\n");
1764 }
1765
1766 signalFinished();
1767
1768 return NO_ERROR;
1769 }
1770
1771 /*===========================================================================
1772 * FUNCTION : onAsBinder
1773 *
1774 * DESCRIPTION: onAsBinder
1775 *
1776 * PARAMETERS : None
1777 *
1778 * RETURN : Pointer to IBinder
1779 *==========================================================================*/
onAsBinder()1780 IBinder* CameraContext::onAsBinder() {
1781 return NULL;
1782 }
1783
1784 /*===========================================================================
1785 * FUNCTION : getNumberOfCameras
1786 *
1787 * DESCRIPTION: returns the number of supported camera by the system
1788 *
1789 * PARAMETERS : None
1790 *
1791 * RETURN : supported camera count
1792 *==========================================================================*/
getNumberOfCameras()1793 int CameraContext::getNumberOfCameras()
1794 {
1795 int ret = -1;
1796
1797 if ( NULL != mCamera.get() ) {
1798 ret = mCamera->getNumberOfCameras();
1799 }
1800
1801 return ret;
1802 }
1803
1804 /*===========================================================================
1805 * FUNCTION : closeCamera
1806 *
1807 * DESCRIPTION: closes a previously the initialized camera reference
1808 *
1809 * PARAMETERS : None
1810 *
1811 * RETURN : status_t type of status
1812 * NO_ERROR -- success
1813 * none-zero failure code
1814 *==========================================================================*/
closeCamera()1815 status_t CameraContext::closeCamera()
1816 {
1817 useLock();
1818 if ( NULL == mCamera.get() ) {
1819 return NO_INIT;
1820 }
1821
1822 mCamera->disconnect();
1823 mCamera.clear();
1824
1825 mRecorder->init();
1826 mRecorder->close();
1827 mRecorder->release();
1828 mRecorder.clear();
1829
1830 mHardwareActive = false;
1831 mPreviewRunning = false;
1832 mRecordRunning = false;
1833
1834 signalFinished();
1835 return NO_ERROR;
1836 }
1837
1838 /*===========================================================================
1839 * FUNCTION : startPreview
1840 *
1841 * DESCRIPTION: starts camera preview
1842 *
1843 * PARAMETERS : None
1844 *
1845 * RETURN : status_t type of status
1846 * NO_ERROR -- success
1847 * none-zero failure code
1848 *==========================================================================*/
startPreview()1849 status_t CameraContext::startPreview()
1850 {
1851 useLock();
1852
1853 int ret = NO_ERROR;
1854 int previewWidth, previewHeight;
1855 Size calculatedPreviewSize;
1856 Size currentPreviewSize = mSupportedPreviewSizes.itemAt(
1857 mCurrentPreviewSizeIdx);
1858 Size currentPictureSize = mSupportedPictureSizes.itemAt(
1859 mCurrentPictureSizeIdx);
1860 Size currentVideoSize = mSupportedVideoSizes.itemAt(
1861 mCurrentVideoSizeIdx);
1862
1863 #ifndef USE_JB_MR1
1864
1865 sp<IGraphicBufferProducer> gbp;
1866
1867 #endif
1868
1869 if (!mHardwareActive ) {
1870 printf("Camera not active! \n");
1871 return NO_INIT;
1872 }
1873
1874 if (mPreviewRunning) {
1875 printf("Preview is already running! \n");
1876 signalFinished();
1877 return NO_ERROR;
1878 }
1879
1880 if (mResizePreview) {
1881 mPreviewRunning = false;
1882
1883 if ( mRecordingHint ) {
1884 calculatedPreviewSize =
1885 getPreviewSizeFromVideoSizes(currentVideoSize);
1886 previewWidth = calculatedPreviewSize.width;
1887 previewHeight = calculatedPreviewSize.height;
1888 } else {
1889 previewWidth = currentPreviewSize.width;
1890 previewHeight = currentPreviewSize.height;
1891 }
1892
1893 ret = createPreviewSurface(previewWidth,
1894 previewHeight,
1895 HAL_PIXEL_FORMAT_YCrCb_420_SP);
1896 if ( NO_ERROR != ret ) {
1897 printf("Error while creating preview surface\n");
1898 return ret;
1899 }
1900
1901 // set rdi mode if system prop is set for front camera
1902 if (mCameraIndex == 1) {
1903 char value[32];
1904 property_get("persist.camera.rdimode", value, "0");
1905 int rdimode = atoi(value);
1906 printf("rdi mode = %d\n", rdimode);
1907 if (rdimode == 1) {
1908 mParams.set("rdi-mode", "enable");
1909 } else {
1910 mParams.set("rdi-mode", "disable");
1911 }
1912 } else {
1913 mParams.set("rdi-mode", "disable");
1914 }
1915
1916 //mParams.set("rdi-mode", "enable");
1917 mParams.set("recording-hint", "true");
1918 mParams.setPreviewSize(previewWidth, previewHeight);
1919 mParams.setPictureSize(currentPictureSize.width,
1920 currentPictureSize.height);
1921 mParams.setVideoSize(
1922 currentVideoSize.width, currentVideoSize.height);
1923
1924 ret |= mCamera->setParameters(mParams.flatten());
1925
1926 #ifndef USE_JB_MR1
1927
1928 gbp = mPreviewSurface->getIGraphicBufferProducer();
1929 ret |= mCamera->setPreviewTarget(gbp);
1930
1931 #else
1932
1933 ret |= mCamera->setPreviewDisplay(mPreviewSurface);
1934
1935 #endif
1936 mResizePreview = false;
1937 }
1938
1939 if ( !mPreviewRunning ) {
1940 ret |= mCamera->startPreview();
1941 if ( NO_ERROR != ret ) {
1942 printf("Preview start failed! \n");
1943 return ret;
1944 }
1945
1946 mPreviewRunning = true;
1947 }
1948
1949 signalFinished();
1950
1951 return ret;
1952 }
1953
1954 /*===========================================================================
1955 * FUNCTION : getPreviewSizeFromVideoSizes
1956 *
1957 * DESCRIPTION: Get the preview size from video size. Find all resolutions with
1958 * the same aspect ratio and choose the same or the closest
1959 * from them.
1960 *
1961 * PARAMETERS :
1962 * @currentVideoSize: current video size
1963
1964 *
1965 * RETURN : PreviewSize
1966 *==========================================================================*/
getPreviewSizeFromVideoSizes(Size currentVideoSize)1967 Size CameraContext::getPreviewSizeFromVideoSizes(Size currentVideoSize)
1968 {
1969
1970 Size tmpPreviewSize;
1971 Size PreviewSize;
1972 Size PreviewSizes[mSupportedPreviewSizes.size()];
1973 double tolerance = 0.00001;
1974 double videoRatio;
1975 double previewRatio;
1976 size_t i = 0;
1977 size_t j = 0;
1978 int delta;
1979
1980 // Find all the resolutions with the same aspect ratio and choose the
1981 // same or the closest resolution from them. Choose the closest resolution
1982 // in case same aspect ratio is not found
1983 if (currentVideoSize.width * currentVideoSize.height > 0 &&
1984 mSupportedPreviewSizes.size() > 0) {
1985 videoRatio = (float)currentVideoSize.width /
1986 (float)currentVideoSize.height;
1987 for (i=0; i<mSupportedPreviewSizes.size(); i++) {
1988 tmpPreviewSize = mSupportedPreviewSizes.itemAt(i);
1989 previewRatio = (float)tmpPreviewSize.width /
1990 (float)tmpPreviewSize.height;
1991 if (fabs(videoRatio - previewRatio) < tolerance) {
1992 PreviewSizes[j] = tmpPreviewSize;
1993 j++;
1994 }
1995 }
1996
1997 if ( j > 0 ) {
1998 delta = abs((currentVideoSize.width *currentVideoSize.height)-
1999 (PreviewSizes[0].width * PreviewSizes[0].height));
2000 PreviewSize = PreviewSizes[0];
2001 for (i=0; i<j; i++) {
2002 if(abs(currentVideoSize.width * currentVideoSize.height) -
2003 (PreviewSizes[i].width * PreviewSizes[i].height) <
2004 delta) {
2005 PreviewSize = PreviewSizes[i];
2006 delta = abs((currentVideoSize.width *
2007 currentVideoSize.height) -
2008 (PreviewSizes[i].width * PreviewSizes[i].height));
2009 }
2010 }
2011 } else {
2012 // Choose the closest resolution in case same aspect ratio is
2013 // not found
2014 tmpPreviewSize = mSupportedPreviewSizes.itemAt(j);
2015 PreviewSize = tmpPreviewSize;
2016 delta = abs(
2017 (currentVideoSize.width * currentVideoSize.height)-
2018 (tmpPreviewSize.width * tmpPreviewSize.height));
2019 for (i=0; i<mSupportedPreviewSizes.size(); i++) {
2020 tmpPreviewSize = mSupportedPreviewSizes.itemAt(i);
2021 if(abs(
2022 (currentVideoSize.width * currentVideoSize.height)-
2023 (tmpPreviewSize.width * tmpPreviewSize.height)) <
2024 delta) {
2025 PreviewSize = tmpPreviewSize;
2026 delta = abs(
2027 (currentVideoSize.width * currentVideoSize.height)-
2028 (tmpPreviewSize.width * tmpPreviewSize.height));
2029 }
2030 }
2031 }
2032 } else {
2033 memset(&PreviewSize, 0, sizeof(PreviewSize));
2034 }
2035 return PreviewSize;
2036 }
2037
2038 /*===========================================================================
2039 * FUNCTION : autoFocus
2040 *
2041 * DESCRIPTION: Triggers autofocus
2042 *
2043 * PARAMETERS : None
2044 *
2045 * RETURN : status_t type of status
2046 * NO_ERROR -- success
2047 * none-zero failure code
2048 *==========================================================================*/
autoFocus()2049 status_t CameraContext::autoFocus()
2050 {
2051 useLock();
2052 status_t ret = NO_ERROR;
2053
2054 if ( mPreviewRunning ) {
2055 ret = mCamera->autoFocus();
2056 }
2057
2058 signalFinished();
2059 return ret;
2060 }
2061
2062 /*===========================================================================
2063 * FUNCTION : enablePreviewCallbacks
2064 *
2065 * DESCRIPTION: Enables preview callback messages
2066 *
2067 * PARAMETERS : None
2068 *
2069 * RETURN : status_t type of status
2070 * NO_ERROR -- success
2071 * none-zero failure code
2072 *==========================================================================*/
enablePreviewCallbacks()2073 status_t CameraContext::enablePreviewCallbacks()
2074 {
2075 useLock();
2076 if ( mHardwareActive ) {
2077 mCamera->setPreviewCallbackFlags(
2078 CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK);
2079 }
2080
2081 signalFinished();
2082 return NO_ERROR;
2083 }
2084
2085 /*===========================================================================
2086 * FUNCTION : takePicture
2087 *
2088 * DESCRIPTION: triggers image capture
2089 *
2090 * PARAMETERS : None
2091 *
2092 * RETURN : status_t type of status
2093 * NO_ERROR -- success
2094 * none-zero failure code
2095 *==========================================================================*/
takePicture()2096 status_t CameraContext::takePicture()
2097 {
2098 status_t ret = NO_ERROR;
2099 useLock();
2100 if ( mPreviewRunning ) {
2101 ret = mCamera->takePicture(
2102 CAMERA_MSG_COMPRESSED_IMAGE|
2103 CAMERA_MSG_RAW_IMAGE);
2104 if (!mRecordingHint && !mInterpr->mIsZSLOn) {
2105 mPreviewRunning = false;
2106 }
2107 } else {
2108 printf("Please resume/start the preview before taking a picture!\n");
2109 }
2110 signalFinished();
2111 return ret;
2112 }
2113
2114 /*===========================================================================
2115 * FUNCTION : configureRecorder
2116 *
2117 * DESCRIPTION: Configure video recorder
2118 *
2119 * PARAMETERS : None
2120 *
2121 * RETURN : status_t type of status
2122 * NO_ERROR -- success
2123 * none-zero failure code
2124 *==========================================================================*/
configureRecorder()2125 status_t CameraContext::configureRecorder()
2126 {
2127 useLock();
2128 status_t ret = NO_ERROR;
2129
2130 mResizePreview = true;
2131 mParams.set("recording-hint", "true");
2132 mRecordingHint = true;
2133 mCamera->setParameters(mParams.flatten());
2134
2135 Size videoSize = mSupportedVideoSizes.itemAt(mCurrentVideoSizeIdx);
2136 ret = mRecorder->setParameters(
2137 String8("video-param-encoding-bitrate=64000"));
2138 if ( ret != NO_ERROR ) {
2139 LOGE("Could not configure recorder (%d)", ret);
2140 return ret;
2141 }
2142
2143 ret = mRecorder->setCamera(
2144 mCamera->remote(), mCamera->getRecordingProxy());
2145 if ( ret != NO_ERROR ) {
2146 LOGE("Could not set camera (%d)", ret);
2147 return ret;
2148 }
2149 ret = mRecorder->setVideoSource(VIDEO_SOURCE_CAMERA);
2150 if ( ret != NO_ERROR ) {
2151 LOGE("Could not set video soruce (%d)", ret);
2152 return ret;
2153 }
2154 ret = mRecorder->setAudioSource(AUDIO_SOURCE_DEFAULT);
2155 if ( ret != NO_ERROR ) {
2156 LOGE("Could not set audio source (%d)", ret);
2157 return ret;
2158 }
2159 ret = mRecorder->setOutputFormat(OUTPUT_FORMAT_DEFAULT);
2160 if ( ret != NO_ERROR ) {
2161 LOGE("Could not set output format (%d)", ret);
2162 return ret;
2163 }
2164
2165 ret = mRecorder->setVideoEncoder(VIDEO_ENCODER_DEFAULT);
2166 if ( ret != NO_ERROR ) {
2167 LOGE("Could not set video encoder (%d)", ret);
2168 return ret;
2169 }
2170
2171 char fileName[100];
2172
2173 snprintf(fileName, sizeof(fileName) / sizeof(char),
2174 "/sdcard/vid_cam%d_%dx%d_%d.mpeg", mCameraIndex,
2175 videoSize.width, videoSize.height, mVideoIdx++);
2176
2177 if ( mVideoFd < 0 ) {
2178 mVideoFd = open(fileName, O_CREAT | O_RDWR );
2179 }
2180
2181 if ( mVideoFd < 0 ) {
2182 LOGE("Could not open video file for writing %s!", fileName);
2183 return UNKNOWN_ERROR;
2184 }
2185
2186 ret = mRecorder->setOutputFile(mVideoFd, 0, 0);
2187 if ( ret != NO_ERROR ) {
2188 LOGE("Could not set output file (%d)", ret);
2189 return ret;
2190 }
2191
2192 ret = mRecorder->setVideoSize(videoSize.width, videoSize.height);
2193 if ( ret != NO_ERROR ) {
2194 LOGE("Could not set video size %dx%d", videoSize.width,
2195 videoSize.height);
2196 return ret;
2197 }
2198
2199 ret = mRecorder->setVideoFrameRate(30);
2200 if ( ret != NO_ERROR ) {
2201 LOGE("Could not set video frame rate (%d)", ret);
2202 return ret;
2203 }
2204
2205 ret = mRecorder->setAudioEncoder(AUDIO_ENCODER_DEFAULT);
2206 if ( ret != NO_ERROR ) {
2207 LOGE("Could not set audio encoder (%d)", ret);
2208 return ret;
2209 }
2210
2211 signalFinished();
2212 return ret;
2213 }
2214
2215 /*===========================================================================
2216 * FUNCTION : unconfigureViVRecording
2217 *
2218 * DESCRIPTION: Unconfigures video in video recording
2219 *
2220 * PARAMETERS : None
2221 *
2222 * RETURN : status_t type of status
2223 * NO_ERROR -- success
2224 * none-zero failure code
2225 *==========================================================================*/
unconfigureRecorder()2226 status_t CameraContext::unconfigureRecorder()
2227 {
2228 useLock();
2229
2230 if ( !mRecordRunning ) {
2231 mResizePreview = true;
2232 mParams.set("recording-hint", "false");
2233 mRecordingHint = false;
2234 mCamera->setParameters(mParams.flatten());
2235 }
2236
2237 signalFinished();
2238 return NO_ERROR;
2239 }
2240
2241 /*===========================================================================
2242 * FUNCTION : configureViVRecording
2243 *
2244 * DESCRIPTION: Configures video in video recording
2245 *
2246 * PARAMETERS : None
2247 *
2248 * RETURN : status_t type of status
2249 * NO_ERROR -- success
2250 * none-zero failure code
2251 *==========================================================================*/
configureViVRecording()2252 status_t CameraContext::configureViVRecording()
2253 {
2254 status_t ret = NO_ERROR;
2255
2256 mResizePreview = true;
2257 mParams.set("recording-hint", "true");
2258 mRecordingHint = true;
2259 mCamera->setParameters(mParams.flatten());
2260 mCamera->setRecordingProxyListener(this);
2261
2262 signalFinished();
2263 return ret;
2264 }
2265
2266 /*===========================================================================
2267 * FUNCTION : startRecording
2268 *
2269 * DESCRIPTION: triggers start recording
2270 *
2271 * PARAMETERS : None
2272 *
2273 * RETURN : status_t type of status
2274 * NO_ERROR -- success
2275 * none-zero failure code
2276 *==========================================================================*/
startRecording()2277 status_t CameraContext::startRecording()
2278 {
2279 useLock();
2280 status_t ret = NO_ERROR;
2281
2282
2283 if ( mPreviewRunning ) {
2284
2285 mCamera->unlock();
2286
2287 ret = mRecorder->prepare();
2288 if ( ret != NO_ERROR ) {
2289 LOGE("Could not prepare recorder");
2290 return ret;
2291 }
2292
2293 ret = mRecorder->start();
2294 if ( ret != NO_ERROR ) {
2295 LOGE("Could not start recorder");
2296 return ret;
2297 }
2298
2299 mRecordRunning = true;
2300 }
2301 signalFinished();
2302 return ret;
2303 }
2304
2305 /*===========================================================================
2306 * FUNCTION : stopRecording
2307 *
2308 * DESCRIPTION: triggers start recording
2309 *
2310 * PARAMETERS : None
2311 *
2312 * RETURN : status_t type of status
2313 * NO_ERROR -- success
2314 * none-zero failure code
2315 *==========================================================================*/
stopRecording()2316 status_t CameraContext::stopRecording()
2317 {
2318 useLock();
2319 status_t ret = NO_ERROR;
2320
2321 if ( mRecordRunning ) {
2322 mRecorder->stop();
2323 close(mVideoFd);
2324 mVideoFd = -1;
2325
2326 mRecordRunning = false;
2327 }
2328
2329 signalFinished();
2330
2331 return ret;
2332 }
2333
2334 /*===========================================================================
2335 * FUNCTION : startViVRecording
2336 *
2337 * DESCRIPTION: Starts video in video recording
2338 *
2339 * PARAMETERS : None
2340 *
2341 * RETURN : status_t type of status
2342 * NO_ERROR -- success
2343 * none-zero failure code
2344 *==========================================================================*/
startViVRecording()2345 status_t CameraContext::startViVRecording()
2346 {
2347 useLock();
2348 status_t ret;
2349
2350 if (mInterpr->mViVVid.VideoSizes[0].width *
2351 mInterpr->mViVVid.VideoSizes[0].height >=
2352 mInterpr->mViVVid.VideoSizes[1].width *
2353 mInterpr->mViVVid.VideoSizes[1].height) {
2354 mInterpr->mViVBuff.buffSize = calcBufferSize(
2355 mInterpr->mViVVid.VideoSizes[1].width,
2356 mInterpr->mViVVid.VideoSizes[1].height);
2357 if (mInterpr->mViVBuff.buff == NULL) {
2358 mInterpr->mViVBuff.buff =
2359 (void *)malloc(mInterpr->mViVBuff.buffSize);
2360 }
2361 mInterpr->mViVVid.sourceCameraID = 1;
2362 mInterpr->mViVVid.destinationCameraID = 0;
2363
2364 } else {
2365 mInterpr->mViVBuff.buffSize = calcBufferSize(
2366 mInterpr->mViVVid.VideoSizes[0].width,
2367 mInterpr->mViVVid.VideoSizes[0].height);
2368 if (mInterpr->mViVBuff.buff == NULL) {
2369 mInterpr->mViVBuff.buff =
2370 (void *)malloc(mInterpr->mViVBuff.buffSize);
2371 }
2372 mInterpr->mViVVid.sourceCameraID = 0;
2373 mInterpr->mViVVid.destinationCameraID = 1;
2374 }
2375
2376 ret = mCamera->startRecording();
2377
2378 signalFinished();
2379 return ret;
2380 }
2381
2382 /*===========================================================================
2383 * FUNCTION : stopViVRecording
2384 *
2385 * DESCRIPTION: Stops video in video recording
2386 *
2387 * PARAMETERS : None
2388 *
2389 * RETURN : status_t type of status
2390 * NO_ERROR -- success
2391 * none-zero failure code
2392 *==========================================================================*/
stopViVRecording()2393 status_t CameraContext::stopViVRecording()
2394 {
2395 useLock();
2396 status_t ret = NO_ERROR;
2397
2398 mCamera->stopRecording();
2399
2400 signalFinished();
2401 return ret;
2402 }
2403
2404 /*===========================================================================
2405 * FUNCTION : stopPreview
2406 *
2407 * DESCRIPTION: stops camera preview
2408 *
2409 * PARAMETERS : None
2410 *
2411 * RETURN : status_t type of status
2412 * NO_ERROR -- success
2413 * none-zero failure code
2414 *==========================================================================*/
stopPreview()2415 status_t CameraContext::stopPreview()
2416 {
2417 useLock();
2418 status_t ret = NO_ERROR;
2419
2420 if ( mHardwareActive ) {
2421 mCamera->stopPreview();
2422 ret = destroyPreviewSurface();
2423 }
2424
2425 mPreviewRunning = false;
2426 mResizePreview = true;
2427
2428 signalFinished();
2429
2430 return ret;
2431 }
2432
2433 /*===========================================================================
2434 * FUNCTION : resumePreview
2435 *
2436 * DESCRIPTION: resumes camera preview after image capture
2437 *
2438 * PARAMETERS : None
2439 *
2440 * RETURN : status_t type of status
2441 * NO_ERROR -- success
2442 * none-zero failure code
2443 *==========================================================================*/
resumePreview()2444 status_t CameraContext::resumePreview()
2445 {
2446 useLock();
2447 status_t ret = NO_ERROR;
2448
2449 if ( mHardwareActive ) {
2450 ret = mCamera->startPreview();
2451 mPreviewRunning = true;
2452 } else {
2453 ret = NO_INIT;
2454 }
2455
2456 signalFinished();
2457 return ret;
2458 }
2459
2460 /*===========================================================================
2461 * FUNCTION : nextPreviewSize
2462 *
2463 * DESCRIPTION: Iterates through all supported preview sizes.
2464 *
2465 * PARAMETERS : None
2466 *
2467 * RETURN : status_t type of status
2468 * NO_ERROR -- success
2469 * none-zero failure code
2470 *==========================================================================*/
nextPreviewSize()2471 status_t CameraContext::nextPreviewSize()
2472 {
2473 useLock();
2474 if ( mHardwareActive ) {
2475 mCurrentPreviewSizeIdx += 1;
2476 mCurrentPreviewSizeIdx %= mSupportedPreviewSizes.size();
2477 Size previewSize = mSupportedPreviewSizes.itemAt(
2478 mCurrentPreviewSizeIdx);
2479 mParams.setPreviewSize(previewSize.width,
2480 previewSize.height);
2481 mResizePreview = true;
2482
2483 if ( mPreviewRunning ) {
2484 mCamera->stopPreview();
2485 mCamera->setParameters(mParams.flatten());
2486 mCamera->startPreview();
2487 } else {
2488 mCamera->setParameters(mParams.flatten());
2489 }
2490 }
2491
2492 signalFinished();
2493 return NO_ERROR;
2494 }
2495
2496
2497 /*===========================================================================
2498 * FUNCTION : setPreviewSize
2499 *
2500 * DESCRIPTION: Sets exact preview size if supported
2501 *
2502 * PARAMETERS : format size in the form of WIDTHxHEIGHT
2503 *
2504 * RETURN : status_t type of status
2505 * NO_ERROR -- success
2506 * none-zero failure code
2507 *==========================================================================*/
setPreviewSize(const char * format)2508 status_t CameraContext::setPreviewSize(const char *format)
2509 {
2510 useLock();
2511 if ( mHardwareActive ) {
2512 int newHeight;
2513 int newWidth;
2514 sscanf(format, "%dx%d", &newWidth, &newHeight);
2515
2516 unsigned int i;
2517 for (i = 0; i < mSupportedPreviewSizes.size(); ++i) {
2518 Size previewSize = mSupportedPreviewSizes.itemAt(i);
2519 if ( newWidth == previewSize.width &&
2520 newHeight == previewSize.height )
2521 {
2522 break;
2523 }
2524
2525 }
2526 if ( i == mSupportedPreviewSizes.size())
2527 {
2528 printf("Preview size %dx%d not supported !\n",
2529 newWidth, newHeight);
2530 return INVALID_OPERATION;
2531 }
2532
2533 mParams.setPreviewSize(newWidth,
2534 newHeight);
2535 mResizePreview = true;
2536
2537 if ( mPreviewRunning ) {
2538 mCamera->stopPreview();
2539 mCamera->setParameters(mParams.flatten());
2540 mCamera->startPreview();
2541 } else {
2542 mCamera->setParameters(mParams.flatten());
2543 }
2544 }
2545
2546 signalFinished();
2547 return NO_ERROR;
2548 }
2549
2550 /*===========================================================================
2551 * FUNCTION : getCurrentPreviewSize
2552 *
2553 * DESCRIPTION: queries the currently configured preview size
2554 *
2555 * PARAMETERS :
2556 * @previewSize : preview size currently configured
2557 *
2558 * RETURN : status_t type of status
2559 * NO_ERROR -- success
2560 * none-zero failure code
2561 *==========================================================================*/
getCurrentPreviewSize(Size & previewSize)2562 status_t CameraContext::getCurrentPreviewSize(Size &previewSize)
2563 {
2564 useLock();
2565 if ( mHardwareActive ) {
2566 previewSize = mSupportedPreviewSizes.itemAt(mCurrentPreviewSizeIdx);
2567 }
2568 signalFinished();
2569 return NO_ERROR;
2570 }
2571
2572 /*===========================================================================
2573 * FUNCTION : nextPictureSize
2574 *
2575 * DESCRIPTION: Iterates through all supported picture sizes.
2576 *
2577 * PARAMETERS : None
2578 *
2579 * RETURN : status_t type of status
2580 * NO_ERROR -- success
2581 * none-zero failure code
2582 *==========================================================================*/
nextPictureSize()2583 status_t CameraContext::nextPictureSize()
2584 {
2585 useLock();
2586 if ( mHardwareActive ) {
2587 mCurrentPictureSizeIdx += 1;
2588 mCurrentPictureSizeIdx %= mSupportedPictureSizes.size();
2589 Size pictureSize = mSupportedPictureSizes.itemAt(
2590 mCurrentPictureSizeIdx);
2591 mParams.setPictureSize(pictureSize.width,
2592 pictureSize.height);
2593 mCamera->setParameters(mParams.flatten());
2594 }
2595 signalFinished();
2596 return NO_ERROR;
2597 }
2598
2599 /*===========================================================================
2600 * FUNCTION : setPictureSize
2601 *
2602 * DESCRIPTION: Sets exact preview size if supported
2603 *
2604 * PARAMETERS : format size in the form of WIDTHxHEIGHT
2605 *
2606 * RETURN : status_t type of status
2607 * NO_ERROR -- success
2608 * none-zero failure code
2609 *==========================================================================*/
setPictureSize(const char * format)2610 status_t CameraContext::setPictureSize(const char *format)
2611 {
2612 useLock();
2613 if ( mHardwareActive ) {
2614 int newHeight;
2615 int newWidth;
2616 sscanf(format, "%dx%d", &newWidth, &newHeight);
2617
2618 unsigned int i;
2619 for (i = 0; i < mSupportedPictureSizes.size(); ++i) {
2620 Size PictureSize = mSupportedPictureSizes.itemAt(i);
2621 if ( newWidth == PictureSize.width &&
2622 newHeight == PictureSize.height )
2623 {
2624 break;
2625 }
2626
2627 }
2628 if ( i == mSupportedPictureSizes.size())
2629 {
2630 printf("Preview size %dx%d not supported !\n",
2631 newWidth, newHeight);
2632 return INVALID_OPERATION;
2633 }
2634
2635 mParams.setPictureSize(newWidth,
2636 newHeight);
2637 mCamera->setParameters(mParams.flatten());
2638 }
2639
2640 signalFinished();
2641 return NO_ERROR;
2642 }
2643
2644 /*===========================================================================
2645 * FUNCTION : nextVideoSize
2646 *
2647 * DESCRIPTION: Select the next available video size
2648 *
2649 * PARAMETERS : none
2650 *
2651 * RETURN : status_t type of status
2652 * NO_ERROR -- success
2653 * none-zero failure code
2654 *==========================================================================*/
nextVideoSize()2655 status_t CameraContext::nextVideoSize()
2656 {
2657 useLock();
2658 if ( mHardwareActive ) {
2659 mCurrentVideoSizeIdx += 1;
2660 mCurrentVideoSizeIdx %= mSupportedVideoSizes.size();
2661 Size videoSize = mSupportedVideoSizes.itemAt(mCurrentVideoSizeIdx);
2662 mParams.setVideoSize(videoSize.width,
2663 videoSize.height);
2664 mCamera->setParameters(mParams.flatten());
2665 mInterpr->setViVSize((Size) mSupportedVideoSizes.itemAt(
2666 mCurrentVideoSizeIdx), mCameraIndex);
2667 }
2668 signalFinished();
2669 return NO_ERROR;
2670 }
2671
2672 /*===========================================================================
2673 * FUNCTION : setVideoSize
2674 *
2675 * DESCRIPTION: Set video size
2676 *
2677 * PARAMETERS :
2678 * @format : format
2679 *
2680 * RETURN : status_t type of status
2681 * NO_ERROR -- success
2682 * none-zero failure code
2683 *==========================================================================*/
setVideoSize(const char * format)2684 status_t CameraContext::setVideoSize(const char *format)
2685 {
2686 useLock();
2687 if ( mHardwareActive ) {
2688 int newHeight;
2689 int newWidth;
2690 sscanf(format, "%dx%d", &newWidth, &newHeight);
2691
2692 unsigned int i;
2693 for (i = 0; i < mSupportedVideoSizes.size(); ++i) {
2694 Size PictureSize = mSupportedVideoSizes.itemAt(i);
2695 if ( newWidth == PictureSize.width &&
2696 newHeight == PictureSize.height )
2697 {
2698 break;
2699 }
2700
2701 }
2702 if ( i == mSupportedVideoSizes.size())
2703 {
2704 printf("Preview size %dx%d not supported !\n",
2705 newWidth, newHeight);
2706 return INVALID_OPERATION;
2707 }
2708
2709 mParams.setVideoSize(newWidth,
2710 newHeight);
2711 mCamera->setParameters(mParams.flatten());
2712 }
2713
2714 signalFinished();
2715 return NO_ERROR;
2716 }
2717
2718 /*===========================================================================
2719 * FUNCTION : getCurrentVideoSize
2720 *
2721 * DESCRIPTION : Get current video size
2722 *
2723 * PARAMETERS :
2724 * @videoSize: video Size
2725 *
2726 * RETURN : status_t type of status
2727 * NO_ERROR -- success
2728 * none-zero failure code
2729 *==========================================================================*/
getCurrentVideoSize(Size & videoSize)2730 status_t CameraContext::getCurrentVideoSize(Size &videoSize)
2731 {
2732 useLock();
2733 if ( mHardwareActive ) {
2734 videoSize = mSupportedVideoSizes.itemAt(mCurrentVideoSizeIdx);
2735 }
2736 signalFinished();
2737 return NO_ERROR;
2738 }
2739
2740 /*===========================================================================
2741 * FUNCTION : getCurrentPictureSize
2742 *
2743 * DESCRIPTION: queries the currently configured picture size
2744 *
2745 * PARAMETERS :
2746 * @pictureSize : picture size currently configured
2747 *
2748 * RETURN : status_t type of status
2749 * NO_ERROR -- success
2750 * none-zero failure code
2751 *==========================================================================*/
getCurrentPictureSize(Size & pictureSize)2752 status_t CameraContext::getCurrentPictureSize(Size &pictureSize)
2753 {
2754 useLock();
2755 if ( mHardwareActive ) {
2756 pictureSize = mSupportedPictureSizes.itemAt(mCurrentPictureSizeIdx);
2757 }
2758 signalFinished();
2759 return NO_ERROR;
2760 }
2761
2762 }; //namespace qcamera ends here
2763
2764 using namespace qcamera;
2765
2766 /*===========================================================================
2767 * FUNCTION : printMenu
2768 *
2769 * DESCRIPTION: prints the available camera options
2770 *
2771 * PARAMETERS :
2772 * @currentCamera : camera context currently being used
2773 *
2774 * RETURN : None
2775 *==========================================================================*/
printMenu(sp<CameraContext> currentCamera)2776 void CameraContext::printMenu(sp<CameraContext> currentCamera)
2777 {
2778 if ( !mDoPrintMenu ) return;
2779 Size currentPictureSize, currentPreviewSize, currentVideoSize;
2780 const char *zsl_mode = mParams.get(CameraContext::KEY_ZSL);
2781
2782 assert(currentCamera.get());
2783
2784 currentCamera->getCurrentPictureSize(currentPictureSize);
2785 currentCamera->getCurrentPreviewSize(currentPreviewSize);
2786 currentCamera->getCurrentVideoSize(currentVideoSize);
2787
2788 printf("\n\n=========== FUNCTIONAL TEST MENU ===================\n\n");
2789
2790 printf(" \n\nSTART / STOP / GENERAL SERVICES \n");
2791 printf(" -----------------------------\n");
2792 printf(" %c. Switch camera - Current Index: %d\n",
2793 Interpreter::SWITCH_CAMERA_CMD,
2794 currentCamera->getCameraIndex());
2795 printf(" %c. Resume Preview after capture \n",
2796 Interpreter::RESUME_PREVIEW_CMD);
2797 printf(" %c. Quit \n",
2798 Interpreter::EXIT_CMD);
2799 printf(" %c. Camera Capability Dump",
2800 Interpreter::DUMP_CAPS_CMD);
2801
2802 printf(" \n\n PREVIEW SUB MENU \n");
2803 printf(" -----------------------------\n");
2804 printf(" %c. Start Preview\n",
2805 Interpreter::START_PREVIEW_CMD);
2806 printf(" %c. Stop Preview\n",
2807 Interpreter::STOP_PREVIEW_CMD);
2808 printf(" %c. Preview size: %dx%d\n",
2809 Interpreter::CHANGE_PREVIEW_SIZE_CMD,
2810 currentPreviewSize.width,
2811 currentPreviewSize.height);
2812 printf(" %c. Video size: %dx%d\n",
2813 Interpreter::CHANGE_VIDEO_SIZE_CMD,
2814 currentVideoSize.width,
2815 currentVideoSize.height);
2816 printf(" %c. Start Recording\n",
2817 Interpreter::START_RECORD_CMD);
2818 printf(" %c. Stop Recording\n",
2819 Interpreter::STOP_RECORD_CMD);
2820 printf(" %c. Start ViV Recording\n",
2821 Interpreter::START_VIV_RECORD_CMD);
2822 printf(" %c. Stop ViV Recording\n",
2823 Interpreter::STOP_VIV_RECORD_CMD);
2824 printf(" %c. Enable preview frames\n",
2825 Interpreter::ENABLE_PRV_CALLBACKS_CMD);
2826 printf(" %c. Trigger autofocus \n",
2827 Interpreter::AUTOFOCUS_CMD);
2828
2829 printf(" \n\n IMAGE CAPTURE SUB MENU \n");
2830 printf(" -----------------------------\n");
2831 printf(" %c. Take picture/Full Press\n",
2832 Interpreter::TAKEPICTURE_CMD);
2833 printf(" %c. Take picture in picture\n",
2834 Interpreter::TAKEPICTURE_IN_PICTURE_CMD);
2835 printf(" %c. Picture size: %dx%d\n",
2836 Interpreter::CHANGE_PICTURE_SIZE_CMD,
2837 currentPictureSize.width,
2838 currentPictureSize.height);
2839 printf(" %c. zsl: %s\n", Interpreter::ZSL_CMD,
2840 (zsl_mode != NULL) ? zsl_mode : "NULL");
2841
2842 printf("\n Choice: ");
2843 }
2844
2845 /*===========================================================================
2846 * FUNCTION : enablePrintPreview
2847 *
2848 * DESCRIPTION: Enables printing the preview
2849 *
2850 * PARAMETERS : None
2851 *
2852 * RETURN : None
2853 *==========================================================================*/
enablePrintPreview()2854 void CameraContext::enablePrintPreview()
2855 {
2856 mDoPrintMenu = true;
2857 }
2858
2859 /*===========================================================================
2860 * FUNCTION : disablePrintPreview
2861 *
2862 * DESCRIPTION: Disables printing the preview
2863 *
2864 * PARAMETERS : None
2865 *
2866 * RETURN : None
2867 *==========================================================================*/
disablePrintPreview()2868 void CameraContext::disablePrintPreview()
2869 {
2870 mDoPrintMenu = false;
2871 }
2872
2873 /*===========================================================================
2874 * FUNCTION : enablePiPCapture
2875 *
2876 * DESCRIPTION: Enables picture in picture capture
2877 *
2878 * PARAMETERS : None
2879 *
2880 * RETURN : None
2881 *==========================================================================*/
enablePiPCapture()2882 void CameraContext::enablePiPCapture()
2883 {
2884 mPiPCapture = true;
2885 }
2886
2887 /*===========================================================================
2888 * FUNCTION : disablePiPCapture
2889 *
2890 * DESCRIPTION: Disables picture in picture capture
2891 *
2892 * PARAMETERS : None
2893 *
2894 * RETURN : None
2895 *==========================================================================*/
disablePiPCapture()2896 void CameraContext::disablePiPCapture()
2897 {
2898 mPiPCapture = false;
2899 }
2900
2901 /*===========================================================================
2902 * FUNCTION : getZSL
2903 *
2904 * DESCRIPTION: get ZSL value of current camera
2905 *
2906 * PARAMETERS : None
2907 *
2908 * RETURN : current zsl value
2909 *==========================================================================*/
getZSL()2910 const char *CameraContext::getZSL()
2911 {
2912 return mParams.get(CameraContext::KEY_ZSL);
2913 }
2914
2915 /*===========================================================================
2916 * FUNCTION : setZSL
2917 *
2918 * DESCRIPTION: set ZSL value of current camera
2919 *
2920 * PARAMETERS : zsl value to be set
2921 *
2922 * RETURN : None
2923 *==========================================================================*/
setZSL(const char * value)2924 void CameraContext::setZSL(const char *value)
2925 {
2926 mParams.set(CameraContext::KEY_ZSL, value);
2927 mCamera->setParameters(mParams.flatten());
2928 }
2929
2930 /*===========================================================================
2931 * FUNCTION : configureViVCodec
2932 *
2933 * DESCRIPTION: Configures video in video codec
2934 *
2935 * PARAMETERS : none
2936 *
2937 * RETURN : status_t type of status
2938 * NO_ERROR -- success
2939 * none-zero failure code
2940 *==========================================================================*/
configureViVCodec()2941 status_t Interpreter::configureViVCodec()
2942 {
2943 status_t ret = NO_ERROR;
2944 char fileName[100];
2945 sp<AMessage> format = new AMessage;
2946 sp<ALooper> looper = new ALooper;
2947
2948 if (mTestContext->mViVVid.VideoSizes[0].width *
2949 mTestContext->mViVVid.VideoSizes[0].height >=
2950 mTestContext->mViVVid.VideoSizes[1].width *
2951 mTestContext->mViVVid.VideoSizes[1].height) {
2952 snprintf(fileName, sizeof(fileName) / sizeof(char), "/sdcard/ViV_vid_%dx%d_%d.mp4",
2953 mTestContext->mViVVid.VideoSizes[0].width,
2954 mTestContext->mViVVid.VideoSizes[0].height,
2955 mTestContext->mViVVid.ViVIdx++);
2956 format->setInt32("width", mTestContext->mViVVid.VideoSizes[0].width);
2957 format->setInt32("height", mTestContext->mViVVid.VideoSizes[0].height);
2958 } else {
2959 snprintf(fileName, sizeof(fileName) / sizeof(char), "/sdcard/ViV_vid_%dx%d_%d.mp4",
2960 mTestContext->mViVVid.VideoSizes[1].width,
2961 mTestContext->mViVVid.VideoSizes[1].height,
2962 mTestContext->mViVVid.ViVIdx++);
2963 format->setInt32("width", mTestContext->mViVVid.VideoSizes[1].width);
2964 format->setInt32("height", mTestContext->mViVVid.VideoSizes[1].height);
2965 }
2966 int fd = open(fileName, O_CREAT | O_RDWR );
2967 if (fd < 0) {
2968 LOGE("Error opening file");
2969 return UNKNOWN_ERROR;
2970 }
2971 mTestContext->mViVVid.muxer = new MediaMuxer(
2972 fd, MediaMuxer::OUTPUT_FORMAT_MPEG_4);
2973
2974 format->setString("mime", "video/avc");
2975 format->setInt32("color-format", OMX_COLOR_FormatAndroidOpaque);
2976
2977 format->setInt32("bitrate", 1000000);
2978 format->setFloat("frame-rate", 30);
2979 format->setInt32("i-frame-interval", 10);
2980
2981 looper->setName("ViV_recording_looper");
2982 looper->start();
2983 ALOGV("Creating codec");
2984 mTestContext->mViVVid.codec = MediaCodec::CreateByType(
2985 looper, "video/avc", true);
2986 if (mTestContext->mViVVid.codec == NULL) {
2987 fprintf(stderr, "ERROR: unable to create video/avc codec instance\n");
2988 return UNKNOWN_ERROR;
2989 }
2990 ret = mTestContext->mViVVid.codec->configure(format, NULL, NULL,
2991 MediaCodec::CONFIGURE_FLAG_ENCODE);
2992 if (ret != NO_ERROR) {
2993 mTestContext->mViVVid.codec->release();
2994 mTestContext->mViVVid.codec.clear();
2995
2996 fprintf(stderr, "ERROR: unable to configure codec (err=%d)\n", ret);
2997 return ret;
2998 }
2999
3000 ALOGV("Creating buffer producer");
3001 ret = mTestContext->mViVVid.codec->createInputSurface(
3002 &mTestContext->mViVVid.bufferProducer);
3003 if (ret != NO_ERROR) {
3004 mTestContext->mViVVid.codec->release();
3005 mTestContext->mViVVid.codec.clear();
3006
3007 fprintf(stderr,
3008 "ERROR: unable to create encoder input surface (err=%d)\n", ret);
3009 return ret;
3010 }
3011
3012 ret = mTestContext->mViVVid.codec->start();
3013 if (ret != NO_ERROR) {
3014 mTestContext->mViVVid.codec->release();
3015 mTestContext->mViVVid.codec.clear();
3016
3017 fprintf(stderr, "ERROR: unable to start codec (err=%d)\n", ret);
3018 return ret;
3019 }
3020 ALOGV("Codec prepared");
3021
3022 mTestContext->mViVVid.surface = new Surface(
3023 mTestContext->mViVVid.bufferProducer);
3024 mTestContext->mViVVid.ANW = mTestContext->mViVVid.surface;
3025 ret = native_window_api_connect(mTestContext->mViVVid.ANW.get(),
3026 NATIVE_WINDOW_API_CPU);
3027 if (mTestContext->mViVVid.VideoSizes[0].width *
3028 mTestContext->mViVVid.VideoSizes[0].height >=
3029 mTestContext->mViVVid.VideoSizes[1].width *
3030 mTestContext->mViVVid.VideoSizes[1].height) {
3031 native_window_set_buffers_format(mTestContext->mViVVid.ANW.get(),
3032 HAL_PIXEL_FORMAT_NV12_ENCODEABLE);
3033 native_window_set_buffers_dimensions(mTestContext->mViVVid.ANW.get(),
3034 mTestContext->mViVVid.VideoSizes[0].width,
3035 mTestContext->mViVVid.VideoSizes[0].height);
3036 } else {
3037 native_window_set_buffers_format(mTestContext->mViVVid.ANW.get(),
3038 HAL_PIXEL_FORMAT_NV12_ENCODEABLE);
3039 native_window_set_buffers_dimensions(mTestContext->mViVVid.ANW.get(),
3040 mTestContext->mViVVid.VideoSizes[1].width,
3041 mTestContext->mViVVid.VideoSizes[1].height);
3042 }
3043 native_window_set_usage(mTestContext->mViVVid.ANW.get(),
3044 GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN);
3045 native_window_set_buffer_count(mTestContext->mViVVid.ANW.get(),
3046 mTestContext->mViVVid.buff_cnt);
3047
3048 ViVEncoderThread();
3049
3050 return ret;
3051 }
3052
3053 /*===========================================================================
3054 * FUNCTION : unconfigureViVCodec
3055 *
3056 * DESCRIPTION: Unconfigures video in video codec
3057 *
3058 * PARAMETERS : none
3059 *
3060 * RETURN : status_t type of status
3061 * NO_ERROR -- success
3062 * none-zero failure code
3063 *==========================================================================*/
unconfigureViVCodec()3064 status_t Interpreter::unconfigureViVCodec()
3065 {
3066 status_t ret = NO_ERROR;
3067
3068 ret = native_window_api_disconnect(mTestContext->mViVVid.ANW.get(),
3069 NATIVE_WINDOW_API_CPU);
3070 mTestContext->mViVVid.bufferProducer = NULL;
3071 mTestContext->mViVVid.codec->stop();
3072 pthread_join(mViVEncThread, NULL);
3073 mTestContext->mViVVid.muxer->stop();
3074 mTestContext->mViVVid.codec->release();
3075 mTestContext->mViVVid.codec.clear();
3076 mTestContext->mViVVid.muxer.clear();
3077 mTestContext->mViVVid.surface.clear();
3078 return ret;
3079 }
3080
3081 /*===========================================================================
3082 * FUNCTION : Interpreter
3083 *
3084 * DESCRIPTION: Interpreter constructor
3085 *
3086 * PARAMETERS : none
3087 *
3088 * RETURN : none
3089 *==========================================================================*/
Interpreter(const char * file)3090 Interpreter::Interpreter(const char *file)
3091 : mCmdIndex(0)
3092 , mScript(NULL)
3093 {
3094 if (!file){
3095 printf("no File Given\n");
3096 mUseScript = false;
3097 return;
3098 }
3099
3100 FILE *fh = fopen(file, "r");
3101 if ( !fh ) {
3102 printf("Could not open file %s\n", file);
3103 mUseScript = false;
3104 return;
3105 }
3106
3107 fseek(fh, 0, SEEK_END);
3108 size_t len = (size_t)ftell(fh);
3109 rewind(fh);
3110
3111 if( !len ) {
3112 printf("Script file %s is empty !\n", file);
3113 fclose(fh);
3114 return;
3115 }
3116
3117 mScript = new char[len + 1];
3118 if ( !mScript ) {
3119 fclose(fh);
3120 return;
3121 }
3122
3123 fread(mScript, sizeof(char), len, fh);
3124 mScript[len] = '\0'; // ensure null terminated;
3125 fclose(fh);
3126
3127
3128 char *p1;
3129 char *p2;
3130 p1 = p2 = mScript;
3131
3132 do {
3133 switch (*p1) {
3134 case '\0':
3135 case '|':
3136 p1++;
3137 break;
3138 case SWITCH_CAMERA_CMD:
3139 case RESUME_PREVIEW_CMD:
3140 case START_PREVIEW_CMD:
3141 case STOP_PREVIEW_CMD:
3142 case CHANGE_PREVIEW_SIZE_CMD:
3143 case CHANGE_PICTURE_SIZE_CMD:
3144 case START_RECORD_CMD:
3145 case STOP_RECORD_CMD:
3146 case START_VIV_RECORD_CMD:
3147 case STOP_VIV_RECORD_CMD:
3148 case DUMP_CAPS_CMD:
3149 case AUTOFOCUS_CMD:
3150 case TAKEPICTURE_CMD:
3151 case TAKEPICTURE_IN_PICTURE_CMD:
3152 case ENABLE_PRV_CALLBACKS_CMD:
3153 case EXIT_CMD:
3154 case ZSL_CMD:
3155 case DELAY:
3156 p2 = p1;
3157 while( (p2 != (mScript + len)) && (*p2 != '|')) {
3158 p2++;
3159 }
3160 *p2 = '\0';
3161 if (p2 == (p1 + 1))
3162 mCommands.push_back(Command(
3163 static_cast<Interpreter::Commands_e>(*p1)));
3164 else
3165 mCommands.push_back(Command(
3166 static_cast<Interpreter::Commands_e>(*p1), (p1 + 1)));
3167 p1 = p2;
3168 break;
3169 default:
3170 printf("Invalid cmd %c \n", *p1);
3171 do {
3172 p1++;
3173
3174 } while(*p1 != '|' && p1 != (mScript + len));
3175
3176 }
3177 } while(p1 != (mScript + len));
3178 mUseScript = true;
3179 }
3180
3181 /*===========================================================================
3182 * FUNCTION : ~Interpreter
3183 *
3184 * DESCRIPTION: Interpreter destructor
3185 *
3186 * PARAMETERS : none
3187 *
3188 * RETURN : none
3189 *==========================================================================*/
~Interpreter()3190 Interpreter::~Interpreter()
3191 {
3192 if ( mScript )
3193 delete[] mScript;
3194
3195 mCommands.clear();
3196 }
3197
3198 /*===========================================================================
3199 * FUNCTION : getCommand
3200 *
3201 * DESCRIPTION : Get a command from interpreter
3202 *
3203 * PARAMETERS :
3204 * @currentCamera: Current camera context
3205 *
3206 * RETURN : command
3207 *==========================================================================*/
getCommand(sp<CameraContext> currentCamera)3208 Interpreter::Command Interpreter::getCommand(
3209 sp<CameraContext> currentCamera)
3210 {
3211 if( mUseScript ) {
3212 return mCommands[mCmdIndex++];
3213 } else {
3214 currentCamera->printMenu(currentCamera);
3215 return Interpreter::Command(
3216 static_cast<Interpreter::Commands_e>(getchar()));
3217 }
3218 }
3219
3220 /*===========================================================================
3221 * FUNCTION : TestContext
3222 *
3223 * DESCRIPTION : TestContext constructor
3224 *
3225 * PARAMETERS : None
3226 *
3227 * RETURN : None
3228 *==========================================================================*/
TestContext()3229 TestContext::TestContext()
3230 {
3231 int i = 0;
3232 mTestRunning = false;
3233 mInterpreter = NULL;
3234 mViVVid.ViVIdx = 0;
3235 mViVVid.buff_cnt = 9;
3236 mViVVid.graphBuf = 0;
3237 mViVVid.mappedBuff = NULL;
3238 mViVVid.isBuffValid = false;
3239 mViVVid.sourceCameraID = -1;
3240 mViVVid.destinationCameraID = -1;
3241 mPiPinUse = false;
3242 mViVinUse = false;
3243 mIsZSLOn = false;
3244 memset(&mViVBuff, 0, sizeof(ViVBuff_t));
3245
3246 ProcessState::self()->startThreadPool();
3247
3248 do {
3249 camera[i] = new CameraContext(i);
3250 if ( NULL == camera[i].get() ) {
3251 break;
3252 }
3253 camera[i]->setTestCtxInstance(this);
3254
3255 //by default open only back camera
3256 if (i==0) {
3257 status_t stat = camera[i]->openCamera();
3258 if ( NO_ERROR != stat ) {
3259 printf("Error encountered Openging camera id : %d\n", i);
3260 break;
3261 }
3262 }
3263 mAvailableCameras.add(camera[i]);
3264 i++;
3265 } while ( i < camera[0]->getNumberOfCameras() ) ;
3266
3267 if (i < camera[0]->getNumberOfCameras() ) {
3268 for (size_t j = 0; j < mAvailableCameras.size(); j++) {
3269 camera[j] = mAvailableCameras.itemAt(j);
3270 camera[j]->closeCamera();
3271 camera[j].clear();
3272 }
3273
3274 mAvailableCameras.clear();
3275 }
3276 }
3277
3278 /*===========================================================================
3279 * FUNCTION : ~TestContext
3280 *
3281 * DESCRIPTION : TestContext destructor
3282 *
3283 * PARAMETERS : None
3284 *
3285 * RETURN : None
3286 *==========================================================================*/
~TestContext()3287 TestContext::~TestContext()
3288 {
3289 delete mInterpreter;
3290
3291 for (size_t j = 0; j < mAvailableCameras.size(); j++) {
3292 camera[j] = mAvailableCameras.itemAt(j);
3293 camera[j]->closeCamera();
3294 camera[j].clear();
3295 }
3296
3297 mAvailableCameras.clear();
3298 }
3299
3300 /*===========================================================================
3301 * FUNCTION : GetCamerasNum
3302 *
3303 * DESCRIPTION : Get the number of available cameras
3304 *
3305 * PARAMETERS : None
3306 *
3307 * RETURN : Number of cameras
3308 *==========================================================================*/
GetCamerasNum()3309 size_t TestContext::GetCamerasNum()
3310 {
3311 return mAvailableCameras.size();
3312 }
3313
3314 /*===========================================================================
3315 * FUNCTION : AddScriptFromFile
3316 *
3317 * DESCRIPTION : Add script from file
3318 *
3319 * PARAMETERS :
3320 * @scriptFile : Script file
3321 *
3322 * RETURN : status_t type of status
3323 * NO_ERROR -- success
3324 * none-zero failure code
3325 *==========================================================================*/
AddScriptFromFile(const char * scriptFile)3326 status_t TestContext::AddScriptFromFile(const char *scriptFile)
3327 {
3328 mInterpreter = new Interpreter(scriptFile);
3329 mInterpreter->setTestCtxInst(this);
3330
3331 return NO_ERROR;
3332 }
3333
3334 /*===========================================================================
3335 * FUNCTION : releasePiPBuff
3336 *
3337 * DESCRIPTION : Release video in video temp buffer
3338 *
3339 * PARAMETERS : None
3340 *
3341 * RETURN : None
3342 *==========================================================================*/
releasePiPBuff()3343 void Interpreter::releasePiPBuff() {
3344 free(mTestContext->mViVBuff.buff);
3345 mTestContext->mViVBuff.buff = NULL;
3346 }
3347
3348 /*===========================================================================
3349 * FUNCTION : functionalTest
3350 *
3351 * DESCRIPTION: queries and executes client supplied commands for testing a
3352 * particular camera.
3353 *
3354 * PARAMETERS :
3355 * @availableCameras : List with all cameras supported
3356 *
3357 * RETURN : status_t type of status
3358 * NO_ERROR -- continue testing
3359 * none-zero -- quit test
3360 *==========================================================================*/
FunctionalTest()3361 status_t TestContext::FunctionalTest()
3362 {
3363 status_t stat = NO_ERROR;
3364 const char *ZSLStr = NULL;
3365 size_t ZSLStrSize = 0;
3366
3367 assert(mAvailableCameras.size());
3368
3369 if ( !mInterpreter ) {
3370 mInterpreter = new Interpreter();
3371 mInterpreter->setTestCtxInst(this);
3372 }
3373
3374 if (mAvailableCameras.size() == 0) {
3375 printf("no cameras supported... exiting test app\n");
3376 } else {
3377 mTestRunning = true;
3378 }
3379
3380 while (mTestRunning) {
3381 sp<CameraContext> currentCamera =
3382 mAvailableCameras.itemAt(mCurrentCameraIndex);
3383 Interpreter::Command command =
3384 mInterpreter->getCommand(currentCamera);
3385 currentCamera->enablePrintPreview();
3386
3387 switch (command.cmd) {
3388 case Interpreter::SWITCH_CAMERA_CMD:
3389 {
3390 mCurrentCameraIndex++;
3391 mCurrentCameraIndex %= mAvailableCameras.size();
3392 currentCamera = mAvailableCameras.itemAt(mCurrentCameraIndex);
3393 stat = currentCamera->openCamera();
3394 }
3395 break;
3396
3397 case Interpreter::RESUME_PREVIEW_CMD:
3398 {
3399 stat = currentCamera->resumePreview();
3400 }
3401 break;
3402
3403 case Interpreter::START_PREVIEW_CMD:
3404 {
3405 stat = currentCamera->startPreview();
3406 }
3407 break;
3408
3409 case Interpreter::STOP_PREVIEW_CMD:
3410 {
3411 stat = currentCamera->stopPreview();
3412 }
3413 break;
3414
3415 case Interpreter::CHANGE_VIDEO_SIZE_CMD:
3416 {
3417 if ( command.arg )
3418 stat = currentCamera->setVideoSize(command.arg);
3419 else
3420 stat = currentCamera->nextVideoSize();
3421 }
3422 break;
3423
3424 case Interpreter::CHANGE_PREVIEW_SIZE_CMD:
3425 {
3426 if ( command.arg )
3427 stat = currentCamera->setPreviewSize(command.arg);
3428 else
3429 stat = currentCamera->nextPreviewSize();
3430 }
3431 break;
3432
3433 case Interpreter::CHANGE_PICTURE_SIZE_CMD:
3434 {
3435 if ( command.arg )
3436 stat = currentCamera->setPictureSize(command.arg);
3437 else
3438 stat = currentCamera->nextPictureSize();
3439 }
3440 break;
3441
3442 case Interpreter::DUMP_CAPS_CMD:
3443 {
3444 currentCamera->printSupportedParams();
3445 }
3446 break;
3447
3448 case Interpreter::AUTOFOCUS_CMD:
3449 {
3450 stat = currentCamera->autoFocus();
3451 }
3452 break;
3453
3454 case Interpreter::TAKEPICTURE_CMD:
3455 {
3456 stat = currentCamera->takePicture();
3457 }
3458 break;
3459
3460 case Interpreter::TAKEPICTURE_IN_PICTURE_CMD:
3461 {
3462 if (mAvailableCameras.size() == 2) {
3463 mSaveCurrentCameraIndex = mCurrentCameraIndex;
3464 for (size_t i = 0; i < mAvailableCameras.size(); i++) {
3465 mCurrentCameraIndex = i;
3466 currentCamera = mAvailableCameras.itemAt(mCurrentCameraIndex);
3467 currentCamera->enablePiPCapture();
3468 stat = currentCamera->takePicture();
3469 }
3470 mCurrentCameraIndex = mSaveCurrentCameraIndex;
3471 } else {
3472 printf("Number of available sensors should be 2\n");
3473 }
3474 }
3475 break;
3476
3477 case Interpreter::ENABLE_PRV_CALLBACKS_CMD:
3478 {
3479 stat = currentCamera->enablePreviewCallbacks();
3480 }
3481 break;
3482
3483 case Interpreter::START_RECORD_CMD:
3484 {
3485 stat = currentCamera->stopPreview();
3486 stat = currentCamera->configureRecorder();
3487 stat = currentCamera->startPreview();
3488 stat = currentCamera->startRecording();
3489 }
3490 break;
3491
3492 case Interpreter::STOP_RECORD_CMD:
3493 {
3494 stat = currentCamera->stopRecording();
3495
3496 stat = currentCamera->stopPreview();
3497 stat = currentCamera->unconfigureRecorder();
3498 stat = currentCamera->startPreview();
3499 }
3500 break;
3501
3502 case Interpreter::START_VIV_RECORD_CMD:
3503 {
3504
3505 if (mAvailableCameras.size() == 2) {
3506 mSaveCurrentCameraIndex = mCurrentCameraIndex;
3507 stat = mInterpreter->configureViVCodec();
3508 for ( size_t i = 0; i < mAvailableCameras.size(); i++ ) {
3509 mCurrentCameraIndex = i;
3510 currentCamera = mAvailableCameras.itemAt(
3511 mCurrentCameraIndex);
3512 stat = currentCamera->stopPreview();
3513 stat = currentCamera->configureViVRecording();
3514 stat = currentCamera->startPreview();
3515 stat = currentCamera->startViVRecording();
3516 }
3517 mCurrentCameraIndex = mSaveCurrentCameraIndex;
3518 } else {
3519 printf("Number of available sensors should be 2\n");
3520 }
3521
3522 }
3523 break;
3524
3525 case Interpreter::STOP_VIV_RECORD_CMD:
3526 {
3527 if (mAvailableCameras.size() == 2) {
3528 mSaveCurrentCameraIndex = mCurrentCameraIndex;
3529 for ( size_t i = 0; i < mAvailableCameras.size(); i++ ) {
3530 mCurrentCameraIndex = i;
3531 currentCamera = mAvailableCameras.itemAt(
3532 mCurrentCameraIndex);
3533 stat = currentCamera->stopViVRecording();
3534 stat = currentCamera->stopPreview();
3535 stat = currentCamera->unconfigureRecorder();
3536 stat = currentCamera->startPreview();
3537 }
3538 stat = mInterpreter->unconfigureViVCodec();
3539 mCurrentCameraIndex = mSaveCurrentCameraIndex;
3540
3541 mInterpreter->releasePiPBuff();
3542 } else {
3543 printf("Number of available sensors should be 2\n");
3544 }
3545 }
3546 break;
3547
3548 case Interpreter::EXIT_CMD:
3549 {
3550 currentCamera->stopPreview();
3551 mTestRunning = false;
3552 }
3553 break;
3554
3555 case Interpreter::DELAY:
3556 {
3557 if ( command.arg ) {
3558 int delay = atoi(command.arg);
3559 if (0 < delay) {
3560 usleep(1000U * (unsigned int)delay);
3561 }
3562 }
3563 }
3564 break;
3565
3566 case Interpreter::ZSL_CMD:
3567 {
3568 currentCamera = mAvailableCameras.itemAt(
3569 mCurrentCameraIndex);
3570 ZSLStr = currentCamera->getZSL();
3571
3572 if (NULL != ZSLStr) {
3573 ZSLStrSize = strlen(ZSLStr);
3574 if (!strncmp(ZSLStr, "off", ZSLStrSize)) {
3575 currentCamera->setZSL("on");
3576 mIsZSLOn = true;
3577 } else if (!strncmp(ZSLStr, "on", ZSLStrSize)) {
3578 currentCamera->setZSL("off");
3579 mIsZSLOn = false;
3580 } else {
3581 printf("Set zsl failed!\n");
3582 }
3583 } else {
3584 printf("zsl is NULL\n");
3585 }
3586 }
3587 break;
3588
3589 default:
3590 {
3591 currentCamera->disablePrintPreview();
3592 }
3593 break;
3594 }
3595 printf("Command status 0x%x \n", stat);
3596 }
3597
3598 return NO_ERROR;
3599 }
3600
3601 /*===========================================================================
3602 * FUNCTION : PiPLock
3603 *
3604 * DESCRIPTION: Mutex lock for PiP capture
3605 *
3606 * PARAMETERS : none
3607 *
3608 * RETURN : none
3609 *==========================================================================*/
PiPLock()3610 void TestContext::PiPLock()
3611 {
3612 Mutex::Autolock l(mPiPLock);
3613 while (mPiPinUse) {
3614 mPiPCond.wait(mPiPLock);
3615 }
3616 mPiPinUse = true;
3617 }
3618
3619 /*===========================================================================
3620 * FUNCTION : PiPUnLock
3621 *
3622 * DESCRIPTION: Mutex unlock for PiP capture
3623 *
3624 * PARAMETERS : none
3625 *
3626 * RETURN : none
3627 *==========================================================================*/
PiPUnlock()3628 void TestContext::PiPUnlock()
3629 {
3630 Mutex::Autolock l(mPiPLock);
3631 mPiPinUse = false;
3632 mPiPCond.signal();
3633 }
3634
3635 /*===========================================================================
3636 * FUNCTION : ViVLock
3637 *
3638 * DESCRIPTION: Mutex lock for ViV Video
3639 *
3640 * PARAMETERS : none
3641 *
3642 * RETURN : none
3643 *==========================================================================*/
ViVLock()3644 void TestContext::ViVLock()
3645 {
3646 Mutex::Autolock l(mViVLock);
3647 while (mViVinUse) {
3648 mViVCond.wait(mViVLock);
3649 }
3650 mViVinUse = true;
3651 }
3652
3653 /*===========================================================================
3654 * FUNCTION : ViVUnlock
3655 *
3656 * DESCRIPTION: Mutex unlock for ViV Video
3657 *
3658 * PARAMETERS : none
3659 *
3660 * RETURN : none
3661 *==========================================================================*/
ViVUnlock()3662 void TestContext::ViVUnlock()
3663 {
3664 Mutex::Autolock l(mViVLock);
3665 mViVinUse = false;
3666 mViVCond.signal();
3667 }
3668
3669 /*===========================================================================
3670 * FUNCTION : setViVSize
3671 *
3672 * DESCRIPTION : Set video in video size
3673 *
3674 * PARAMETERS :
3675 * @VideoSize : video size
3676 * @camIndex : camera index
3677 *
3678 * RETURN : none
3679 *==========================================================================*/
setViVSize(Size VideoSize,int camIndex)3680 void TestContext::setViVSize(Size VideoSize, int camIndex)
3681 {
3682 mViVVid.VideoSizes[camIndex] = VideoSize;
3683 }
3684
3685 /*===========================================================================
3686 * FUNCTION : main
3687 *
3688 * DESCRIPTION : main function
3689 *
3690 * PARAMETERS :
3691 * @argc : argc
3692 * @argv : argv
3693 *
3694 * RETURN : int status
3695 *==========================================================================*/
main(int argc,char * argv[])3696 int main(int argc, char *argv[])
3697 {
3698 TestContext ctx;
3699
3700 if (argc > 1) {
3701 if ( ctx.AddScriptFromFile((const char *)argv[1]) ) {
3702 printf("Could not add script file... "
3703 "continuing in normal menu mode! \n");
3704 }
3705 }
3706
3707 ctx.FunctionalTest();
3708
3709 return 0;
3710 }
3711