Home | History | Annotate | Download | only in CameraHal
      1 /*
      2  * Copyright (c) 2010, Texas Instruments Incorporated
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  *
      9  * *  Redistributions of source code must retain the above copyright
     10  *    notice, this list of conditions and the following disclaimer.
     11  *
     12  * *  Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  *
     16  * *  Neither the name of Texas Instruments Incorporated nor the names of
     17  *    its contributors may be used to endorse or promote products derived
     18  *    from this software without specific prior written permission.
     19  *
     20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
     30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     31  */
     32 
     33 #include <stdlib.h>
     34 #include <unistd.h>
     35 #include <sys/types.h>
     36 #include <sys/stat.h>
     37 #include <fcntl.h>
     38 #include <time.h>
     39 #include <semaphore.h>
     40 #include <pthread.h>
     41 #include <string.h>
     42 #include <climits>
     43 
     44 #include <gui/GLConsumer.h>
     45 #include <gui/Surface.h>
     46 #include <ui/GraphicBuffer.h>
     47 #include <ui/GraphicBufferMapper.h>
     48 
     49 #include <camera/Camera.h>
     50 #include <camera/ICamera.h>
     51 #include <media/mediarecorder.h>
     52 
     53 #include <binder/IPCThreadState.h>
     54 #include <binder/ProcessState.h>
     55 #include <binder/IServiceManager.h>
     56 #include <cutils/properties.h>
     57 #include <camera/CameraParameters.h>
     58 #include <camera/ShotParameters.h>
     59 #include <camera/CameraMetadata.h>
     60 #include <system/audio.h>
     61 #include <system/camera.h>
     62 
     63 #include <cutils/memory.h>
     64 #include <utils/Log.h>
     65 
     66 #include <sys/wait.h>
     67 
     68 #include <sys/mman.h>
     69 
     70 #ifdef ANDROID_API_JB_OR_LATER
     71 #include <gui/Surface.h>
     72 #include <gui/ISurface.h>
     73 #include <gui/ISurfaceComposer.h>
     74 #include <gui/ISurfaceComposerClient.h>
     75 #include <gui/SurfaceComposerClient.h>
     76 #include <ion/ion.h>
     77 #else
     78 #include <surfaceflinger/Surface.h>
     79 #include <surfaceflinger/ISurface.h>
     80 #include <surfaceflinger/ISurfaceComposer.h>
     81 #include <surfaceflinger/ISurfaceComposerClient.h>
     82 #include <surfaceflinger/SurfaceComposerClient.h>
     83 #include "ion.h"
     84 #endif
     85 
     86 #include "camera_test.h"
     87 
     88 #define ASSERT(X) \
     89     do { \
     90        if(!(X)) { \
     91            printf("error: %s():%d", __FUNCTION__, __LINE__); \
     92            return; \
     93        } \
     94     } while(0);
     95 
     96 #define ALIGN_DOWN(x, n) ((x) & (~((n) - 1)))
     97 #define ALIGN_UP(x, n) ((((x) + (n) - 1)) & (~((n) - 1)))
     98 #define ALIGN_WIDTH 32 // Should be 32...but the calculated dimension causes an ion crash
     99 #define ALIGN_HEIGHT 2 // Should be 2...but the calculated dimension causes an ion crash
    100 
    101 //temporarily define format here
    102 #define HAL_PIXEL_FORMAT_TI_NV12 0x100
    103 #define HAL_PIXEL_FORMAT_TI_NV12_1D 0x102
    104 #define HAL_PIXEL_FORMAT_TI_Y8 0x103
    105 #define HAL_PIXEL_FORMAT_TI_Y16 0x104
    106 
    107 using namespace android;
    108 
    109 #define N_BUFFERS 15
    110 
    111 static void
    112 test_format (int format, int page_mode, int width, int height)
    113 {
    114     sp<GLConsumer> st;
    115     Surface *stc;
    116     GLint tex_id = 0;
    117     sp<ANativeWindow> anw;
    118     ANativeWindowBuffer* anb[30] = { 0 };
    119     int i;
    120     unsigned int usage;
    121     GraphicBufferMapper &mapper = GraphicBufferMapper::get();
    122 
    123     printf("testing format %x, page_mode %d\n", format, page_mode);
    124 
    125     sp<BufferQueue> bq = new BufferQueue();
    126     st = new GLConsumer (bq, tex_id, GL_TEXTURE_EXTERNAL_OES);
    127 
    128     st->setDefaultBufferSize (width, height);
    129 
    130     stc = new Surface(st);
    131     anw = stc;
    132 
    133     usage = GRALLOC_USAGE_SW_READ_RARELY |
    134             GRALLOC_USAGE_SW_WRITE_NEVER;
    135     if (page_mode) {
    136         usage |= GRALLOC_USAGE_PRIVATE_0;
    137     }
    138 
    139     native_window_set_usage(anw.get(), usage);
    140     native_window_set_buffer_count(anw.get(), N_BUFFERS);
    141     native_window_set_buffers_geometry(anw.get(),
    142             width, height, format);
    143 
    144     for(i=0;i<N_BUFFERS;i++) {
    145         void *data = NULL;
    146         Rect bounds(width, height);
    147 
    148         anb[i] = NULL;
    149         anw->dequeueBuffer(anw.get(), &anb[i]);
    150         printf("%d: %p\n", i, anb[i]);
    151         if (anb[i] == NULL) {
    152             printf ("FAILED: buffer should be non-NULL\n");
    153             break;
    154         }
    155 
    156         mapper.lock(anb[i]->handle, GRALLOC_USAGE_SW_READ_RARELY,
    157                 bounds, &data);
    158         if (data == NULL) {
    159             printf ("FAILED: mapping should be non-NULL\n");
    160             break;
    161         }
    162 
    163         mapper.unlock(anb[i]->handle);
    164     }
    165     for(i=0;i<N_BUFFERS;i++) {
    166         if (anb[i]) {
    167             anw->cancelBuffer (anw.get(), anb[i]);
    168         }
    169     }
    170 
    171     //delete stc;
    172     st.clear();
    173 }
    174 
    175 void
    176 ion_test (void)
    177 {
    178     struct ion_handle *handle;
    179     int fd;
    180     int map_fd;
    181     unsigned char *ptr;
    182     int i;
    183     int ret;
    184     int share_fd;
    185 
    186     fd = ion_open ();
    187 
    188 #define SIZE (10*1024*1024)
    189     for(i=0;i<10;i++){
    190         handle = NULL;
    191         ret = ion_alloc (fd, SIZE, 4096, (1<<0), &handle);
    192         if (ret < 0) {
    193             printf("ion_alloc returned error %d, %s\n", ret, strerror(errno));
    194             break;
    195         }
    196         printf("ion_alloc returned %d\n", ret);
    197 
    198         ret = ion_share (fd, handle, &share_fd);
    199         if (ret < 0) {
    200             printf("ion_share returned error %d, %s\n", ret, strerror(errno));
    201             break;
    202         }
    203         printf("ion_share returned %d\n", ret);
    204 
    205         ptr = (unsigned char *)mmap (NULL, SIZE, PROT_READ|PROT_WRITE,
    206                 MAP_SHARED, share_fd, 0);
    207         printf("mmap returned %p\n", ptr);
    208 
    209         ptr = (unsigned char *)mmap (NULL, SIZE, PROT_READ|PROT_WRITE,
    210                 MAP_SHARED, share_fd, 0);
    211         printf("mmap returned %p\n", ptr);
    212 
    213 #if 0
    214         ret = ion_map (fd, handle, SIZE, PROT_READ, 0, 0, &ptr, &map_fd);
    215         if (ret < 0) {
    216             printf("ion_map returned error %d, %s\n", ret, strerror(errno));
    217             break;
    218         }
    219         printf("ion_map returned %d\n", ret);
    220 #endif
    221 
    222         printf("%d: %p\n", i, ptr);
    223 
    224         ion_free (fd, handle);
    225     }
    226 
    227 }
    228 
    229 
    230 int
    231 main (int argc, char *argv[])
    232 {
    233     int width, height;
    234 
    235     width = 640;
    236     height = 480;
    237     test_format (HAL_PIXEL_FORMAT_TI_NV12, 0, width, height);
    238     test_format (HAL_PIXEL_FORMAT_TI_NV12, 1, width, height);
    239     test_format (HAL_PIXEL_FORMAT_TI_NV12_1D, 0, width, height);
    240     test_format (HAL_PIXEL_FORMAT_TI_Y8, 1, width, height);
    241     test_format (HAL_PIXEL_FORMAT_TI_Y16, 1, width, height);
    242 
    243     width = 2608;
    244     height = 1960;
    245     test_format (HAL_PIXEL_FORMAT_TI_NV12, 1, width, height);
    246     test_format (HAL_PIXEL_FORMAT_TI_NV12_1D, 0, width, height);
    247     test_format (HAL_PIXEL_FORMAT_TI_Y8, 1, width, height);
    248     test_format (HAL_PIXEL_FORMAT_TI_Y16, 1, width, height);
    249 
    250     ion_test();
    251 
    252     return 0;
    253 }
    254 
    255