examples/camera: Fix some issues and update license
Fix some issues and update license to apache. - Fails to open the video driver. - Change format from YUV422 to RGB565, and add captured image output to LCD. - An application cannot exit by infinite loop. - In video-only mode without capturing still images, do not allocate capture memory for still images to reduce the memory usage.
This commit is contained in:
parent
7ffa080a2a
commit
d8757a6bcf
@ -1,35 +1,20 @@
|
||||
############################################################################
|
||||
# examples/camera/Make.defs
|
||||
# apps/examples/camera/Make.defs
|
||||
#
|
||||
# Copyright 2018 Sony Semiconductor Solutions Corporation
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in
|
||||
# the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# 3. Neither the name of Sony Semiconductor Solutions Corporation nor
|
||||
# the names of its contributors may be used to endorse or promote
|
||||
# products derived from this software without specific prior written
|
||||
# permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
|
@ -1,35 +1,20 @@
|
||||
############################################################################
|
||||
# examples/camera/Makefile
|
||||
# apps/examples/camera/Makefile
|
||||
#
|
||||
# Copyright 2018, 2020 Sony Semiconductor Solutions Corporation
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership. The
|
||||
# ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance with the
|
||||
# License. You may obtain a copy of the License at
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in
|
||||
# the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# 3. Neither the name of Sony Semiconductor Solutions Corporation nor
|
||||
# the names of its contributors may be used to endorse or promote
|
||||
# products derived from this software without specific prior written
|
||||
# permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
@ -44,6 +29,10 @@ MODULE = $(CONFIG_EXAMPLES_CAMERA)
|
||||
|
||||
# camera Example
|
||||
|
||||
ifeq ($(CONFIG_EXAMPLES_CAMERA_OUTPUT_LCD),y)
|
||||
CSRCS += camera_bkgd.c
|
||||
endif
|
||||
|
||||
CSRCS += camera_fileutil.c
|
||||
MAINSRC = camera_main.c
|
||||
|
||||
|
@ -7,8 +7,8 @@ the command is as below.
|
||||
nsh> camera ([-jpg]) ([capture num])
|
||||
|
||||
-jpg : this option is set for storing JPEG file into a strage.
|
||||
: If this option isn't set capturing raw YUV422 data in a file.
|
||||
: raw YUV422 is default.
|
||||
: If this option isn't set capturing raw RGB565 data in a file.
|
||||
: raw RGB565 is default.
|
||||
|
||||
capture num : this option instructs number of taking pictures.
|
||||
: 10 is default.
|
||||
@ -22,20 +22,20 @@ Execution example:
|
||||
nsh> camera
|
||||
nximage_listener: Connected
|
||||
nximage_initialize: Screen resolution (320,240)
|
||||
Take 10 pictures as YUV file in /mnt/sd0 after 5000 mili-seconds.
|
||||
After finishing taking pictures, this app will be finished after 10000 mili-seconds.
|
||||
Take 10 pictures as RGB file in /mnt/sd0 after 5 seconds.
|
||||
After finishing taking pictures, this app will be finished after 10 seconds.
|
||||
Expier time is pasted.
|
||||
Start capturing...
|
||||
FILENAME:/mnt/sd0/VIDEO001.YUV
|
||||
FILENAME:/mnt/sd0/VIDEO002.YUV
|
||||
FILENAME:/mnt/sd0/VIDEO003.YUV
|
||||
FILENAME:/mnt/sd0/VIDEO004.YUV
|
||||
FILENAME:/mnt/sd0/VIDEO005.YUV
|
||||
FILENAME:/mnt/sd0/VIDEO006.YUV
|
||||
FILENAME:/mnt/sd0/VIDEO007.YUV
|
||||
FILENAME:/mnt/sd0/VIDEO008.YUV
|
||||
FILENAME:/mnt/sd0/VIDEO009.YUV
|
||||
FILENAME:/mnt/sd0/VIDEO010.YUV
|
||||
FILENAME:/mnt/sd0/VIDEO001.RGB
|
||||
FILENAME:/mnt/sd0/VIDEO002.RGB
|
||||
FILENAME:/mnt/sd0/VIDEO003.RGB
|
||||
FILENAME:/mnt/sd0/VIDEO004.RGB
|
||||
FILENAME:/mnt/sd0/VIDEO005.RGB
|
||||
FILENAME:/mnt/sd0/VIDEO006.RGB
|
||||
FILENAME:/mnt/sd0/VIDEO007.RGB
|
||||
FILENAME:/mnt/sd0/VIDEO008.RGB
|
||||
FILENAME:/mnt/sd0/VIDEO009.RGB
|
||||
FILENAME:/mnt/sd0/VIDEO010.RGB
|
||||
Finished capturing...
|
||||
Expier time is pasted.
|
||||
nximage_listener: Lost server connection: 117
|
||||
|
339
examples/camera/camera_bkgd.c
Normal file
339
examples/camera/camera_bkgd.c
Normal file
@ -0,0 +1,339 @@
|
||||
/****************************************************************************
|
||||
* apps/examples/camera/camera_bkgd.c
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership. The
|
||||
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <semaphore.h>
|
||||
#include <errno.h>
|
||||
#include <debug.h>
|
||||
|
||||
#include <arch/board/board.h>
|
||||
#include <nuttx/nx/nx.h>
|
||||
#include <nuttx/nx/nxglib.h>
|
||||
|
||||
#include "camera_bkgd.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
struct nximage_data_s
|
||||
{
|
||||
/* The NX handles */
|
||||
|
||||
NXHANDLE hnx;
|
||||
NXHANDLE hbkgd;
|
||||
bool connected;
|
||||
|
||||
/* The screen resolution */
|
||||
|
||||
nxgl_coord_t xres;
|
||||
nxgl_coord_t yres;
|
||||
|
||||
volatile bool havepos;
|
||||
sem_t sem;
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
static void nximage_redraw(NXWINDOW hwnd,
|
||||
FAR const struct nxgl_rect_s *rect,
|
||||
bool more,
|
||||
FAR void *arg);
|
||||
static void nximage_position(NXWINDOW hwnd,
|
||||
FAR const struct nxgl_size_s *size,
|
||||
FAR const struct nxgl_point_s *pos,
|
||||
FAR const struct nxgl_rect_s *bounds,
|
||||
FAR void *arg);
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
/* Background window call table */
|
||||
|
||||
static const struct nx_callback_s g_nximagecb =
|
||||
{
|
||||
nximage_redraw, /* redraw */
|
||||
nximage_position /* position */
|
||||
#ifdef CONFIG_NX_XYINPUT
|
||||
, NULL /* mousein */
|
||||
#endif
|
||||
#ifdef CONFIG_NX_KBD
|
||||
, NULL /* my kbdin */
|
||||
#endif
|
||||
};
|
||||
|
||||
/* To handle nx context, below variable is defined for this application. */
|
||||
|
||||
static struct nximage_data_s g_nximage =
|
||||
{
|
||||
NULL, /* hnx */
|
||||
NULL, /* hbkgd */
|
||||
false, /* connected */
|
||||
0, /* xres */
|
||||
0, /* yres */
|
||||
false, /* havpos */
|
||||
{ 0 }, /* sem */
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nximage_listener()
|
||||
*
|
||||
* Description:
|
||||
* NX event listener for an event from NX server.
|
||||
****************************************************************************/
|
||||
|
||||
FAR void *nximage_listener(FAR void *arg)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* Process events forever */
|
||||
|
||||
for (; ; )
|
||||
{
|
||||
/* Handle the next event. If we were configured blocking, then
|
||||
* we will stay right here until the next event is received. Since
|
||||
* we have dedicated a while thread to servicing events, it would
|
||||
* be most natural to also select CONFIG_NX_BLOCKING -- if not, the
|
||||
* following would be a tight infinite loop (unless we added addition
|
||||
* logic with nx_eventnotify and sigwait to pace it).
|
||||
*/
|
||||
|
||||
ret = nx_eventhandler(g_nximage.hnx);
|
||||
if (ret < 0)
|
||||
{
|
||||
/* An error occurred... assume that we have lost connection with
|
||||
* the server.
|
||||
*/
|
||||
|
||||
printf("nximage_listener: Lost server connection: %d\n", errno);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
/* If we received a message, we must be connected */
|
||||
|
||||
if (!g_nximage.connected)
|
||||
{
|
||||
g_nximage.connected = true;
|
||||
sem_post(&g_nximage.sem);
|
||||
printf("nximage_listener: Connected\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nximage_redraw
|
||||
*
|
||||
* Description:
|
||||
* NX re-draw handler
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static void nximage_redraw(NXWINDOW hwnd, FAR const struct nxgl_rect_s *rect,
|
||||
bool more, FAR void *arg)
|
||||
{
|
||||
ginfo("hwnd=%p rect={(%d,%d),(%d,%d)} more=%s\n",
|
||||
hwnd, rect->pt1.x, rect->pt1.y, rect->pt2.x, rect->pt2.y,
|
||||
more ? "true" : "false");
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nximage_position
|
||||
*
|
||||
* Description:
|
||||
* NX position change handler
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static void nximage_position(NXWINDOW hwnd,
|
||||
FAR const struct nxgl_size_s *size,
|
||||
FAR const struct nxgl_point_s *pos,
|
||||
FAR const struct nxgl_rect_s *bounds,
|
||||
FAR void *arg)
|
||||
{
|
||||
/* Report the position */
|
||||
|
||||
ginfo("hwnd=%p size=(%d,%d) pos=(%d,%d) bounds={(%d,%d),(%d,%d)}\n",
|
||||
hwnd, size->w, size->h, pos->x, pos->y,
|
||||
bounds->pt1.x, bounds->pt1.y, bounds->pt2.x, bounds->pt2.y);
|
||||
|
||||
/* Have we picked off the window bounds yet? */
|
||||
|
||||
if (!g_nximage.havepos)
|
||||
{
|
||||
/* Save the background window handle */
|
||||
|
||||
g_nximage.hbkgd = hwnd;
|
||||
|
||||
/* Save the window limits */
|
||||
|
||||
g_nximage.xres = bounds->pt2.x + 1;
|
||||
g_nximage.yres = bounds->pt2.y + 1;
|
||||
|
||||
g_nximage.havepos = true;
|
||||
sem_post(&g_nximage.sem);
|
||||
ginfo("Have xres=%d yres=%d\n", g_nximage.xres, g_nximage.yres);
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nximage_initialize
|
||||
*
|
||||
* Description:
|
||||
* Initialize NX graphics subsystem.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int nximage_initialize(void)
|
||||
{
|
||||
nxgl_mxpixel_t color;
|
||||
pthread_t thread;
|
||||
int ret;
|
||||
|
||||
/* Start the NX server kernel thread */
|
||||
|
||||
ret = boardctl(BOARDIOC_NX_START, 0);
|
||||
if (ret < 0)
|
||||
{
|
||||
printf("nximage_initialize: Failed to start the NX server: %d\n",
|
||||
errno);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/* Connect to the server */
|
||||
|
||||
g_nximage.hnx = nx_connect();
|
||||
if (!g_nximage.hnx)
|
||||
{
|
||||
printf("nximage_initialize: nx_connect failed: %d\n", errno);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/* Start a separate thread to listen for server events.
|
||||
* For simplicity, use defaul thread attribute.
|
||||
*/
|
||||
|
||||
ret = pthread_create(&thread, NULL, nximage_listener, NULL);
|
||||
if (ret != 0)
|
||||
{
|
||||
printf("nximage_initialize: pthread_create failed: %d\n", ret);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
/* Don't return until we are connected to the server */
|
||||
|
||||
while (!g_nximage.connected)
|
||||
{
|
||||
/* Wait for the listener thread to wake us up when we really
|
||||
* are connected.
|
||||
*/
|
||||
|
||||
(void)sem_wait(&g_nximage.sem);
|
||||
}
|
||||
|
||||
/* Set background color to black */
|
||||
|
||||
color = 0;
|
||||
nx_setbgcolor(g_nximage.hnx, &color);
|
||||
ret = nx_requestbkgd(g_nximage.hnx, &g_nximagecb, NULL);
|
||||
if (ret < 0)
|
||||
{
|
||||
printf("nximage_initialize: nx_requestbkgd failed: %d\n", errno);
|
||||
nx_disconnect(g_nximage.hnx);
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
while (!g_nximage.havepos)
|
||||
{
|
||||
(void) sem_wait(&g_nximage.sem);
|
||||
}
|
||||
|
||||
printf("nximage_initialize: Screen resolution (%d,%d)\n",
|
||||
g_nximage.xres, g_nximage.yres);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nximage_image
|
||||
*
|
||||
* Description:
|
||||
* Put the NuttX logo in the center of the display.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void nximage_draw(FAR void *image, int w, int h)
|
||||
{
|
||||
FAR struct nxgl_point_s origin;
|
||||
FAR struct nxgl_rect_s dest;
|
||||
FAR const void *src[CONFIG_NX_NPLANES];
|
||||
int ret;
|
||||
|
||||
origin.x = 0;
|
||||
origin.y = 0;
|
||||
|
||||
/* Set up the destination to whole LCD screen */
|
||||
|
||||
dest.pt1.x = 0;
|
||||
dest.pt1.y = 0;
|
||||
dest.pt2.x = g_nximage.xres - 1;
|
||||
dest.pt2.y = g_nximage.yres - 1;
|
||||
|
||||
src[0] = image;
|
||||
|
||||
ret = nx_bitmap((NXWINDOW)g_nximage.hbkgd, &dest, src, &origin,
|
||||
g_nximage.xres * sizeof(nxgl_mxpixel_t));
|
||||
if (ret < 0)
|
||||
{
|
||||
printf("nximage_image: nx_bitmapwindow failed: %d\n", errno);
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: nximage_finalize()
|
||||
*
|
||||
* Description:
|
||||
* Finalize NX server.
|
||||
****************************************************************************/
|
||||
|
||||
void nximage_finalize(void)
|
||||
{
|
||||
nx_disconnect(g_nximage.hnx);
|
||||
}
|
||||
|
38
examples/camera/camera_bkgd.h
Normal file
38
examples/camera/camera_bkgd.h
Normal file
@ -0,0 +1,38 @@
|
||||
/****************************************************************************
|
||||
* apps/examples/camera/camera_bkgd.h
|
||||
*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership. The
|
||||
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef __APPS_EXAMPLES_CAMERA_CAMERA_BKGD_H
|
||||
#define __APPS_EXAMPLES_CAMERA_CAMERA_BKGD_H
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Public Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
int nximage_initialize(void); /* Initialize NX graphics subsystem */
|
||||
void nximage_draw(FAR void *image, int w, int h); /* Draw image onto Background window */
|
||||
void nximage_finalize(void); /* Finalize NX graphics subsystem */
|
||||
|
||||
#endif /* __APPS_EXAMPLES_CAMERA_CAMERA_BKGD_H */
|
@ -1,35 +1,20 @@
|
||||
/****************************************************************************
|
||||
* camera/camera_fileutil.c
|
||||
* apps/examples/camera/camera_fileutil.c
|
||||
*
|
||||
* Copyright 2020 Sony Semiconductor Solutions Corporation
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership. The
|
||||
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name of Sony Semiconductor Solutions Corporation nor
|
||||
* the names of its contributors may be used to endorse or promote
|
||||
* products derived from this software without specific prior written
|
||||
* permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
|
@ -1,35 +1,20 @@
|
||||
/****************************************************************************
|
||||
* camera/camera_fileutil.h
|
||||
* apps/examples/camera/camera_fileutil.h
|
||||
*
|
||||
* Copyright 2020 Sony Semiconductor Solutions Corporation
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership. The
|
||||
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name of Sony Semiconductor Solutions Corporation nor
|
||||
* the names of its contributors may be used to endorse or promote
|
||||
* products derived from this software without specific prior written
|
||||
* permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
|
@ -1,35 +1,20 @@
|
||||
/****************************************************************************
|
||||
* camera/camera_main.c
|
||||
* apps/examples/camera/camera_main.c
|
||||
*
|
||||
* Copyright 2018, 2020 Sony Semiconductor Solutions Corporation
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership. The
|
||||
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name of Sony Semiconductor Solutions Corporation nor
|
||||
* the names of its contributors may be used to endorse or promote
|
||||
* products derived from this software without specific prior written
|
||||
* permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
@ -52,12 +37,18 @@
|
||||
|
||||
#include "camera_fileutil.h"
|
||||
|
||||
#ifdef CONFIG_EXAMPLES_CAMERA_OUTPUT_LCD
|
||||
#include <nuttx/nx/nx.h>
|
||||
#include <nuttx/nx/nxglib.h>
|
||||
#include "camera_bkgd.h"
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#define IMAGE_JPG_SIZE (512*1024) /* 512kB for FullHD Jpeg file. */
|
||||
#define IMAGE_YUV_SIZE (320*240*2) /* QVGA YUV422 */
|
||||
#define IMAGE_RGB_SIZE (320*240*2) /* QVGA RGB565 */
|
||||
|
||||
#define VIDEO_BUFNUM (3)
|
||||
#define STILL_BUFNUM (1)
|
||||
@ -65,16 +56,8 @@
|
||||
#define MAX_CAPTURE_NUM (100)
|
||||
#define DEFAULT_CAPTURE_NUM (10)
|
||||
|
||||
#define START_CAPTURE_TIME (5000) /* mili-seconds */
|
||||
#define KEEP_VIDEO_TIME (10000) /* mili-seconds */
|
||||
|
||||
#define RESET_INITIAL_TIME(t) gettimeofday(&(t), NULL)
|
||||
#define UPDATE_DIFF_TIME(d, then, now) \
|
||||
{ \
|
||||
gettimeofday(&(now), NULL); \
|
||||
(d) = ((((now).tv_sec - (then).tv_sec) * 1000) \
|
||||
+ (((now).tv_usec - (then).tv_usec) / 1000)); \
|
||||
}
|
||||
#define START_CAPTURE_TIME (5) /* seconds */
|
||||
#define KEEP_VIDEO_TIME (10) /* seconds */
|
||||
|
||||
#define APP_STATE_BEFORE_CAPTURE (0)
|
||||
#define APP_STATE_UNDER_CAPTURE (1)
|
||||
@ -463,8 +446,13 @@ int main(int argc, FAR char *argv[])
|
||||
enum v4l2_buf_type capture_type = V4L2_BUF_TYPE_STILL_CAPTURE;
|
||||
struct v4l2_buffer v4l2_buf;
|
||||
const char *save_dir;
|
||||
int is_eternal;
|
||||
int app_state;
|
||||
|
||||
struct timeval then;
|
||||
struct timeval start;
|
||||
struct timeval now;
|
||||
struct timeval delta;
|
||||
struct timeval wait;
|
||||
|
||||
struct v_buffer *buffers_video = NULL;
|
||||
struct v_buffer *buffers_still = NULL;
|
||||
@ -480,10 +468,30 @@ int main(int argc, FAR char *argv[])
|
||||
|
||||
/* ===== Initialization Code ===== */
|
||||
|
||||
/* Initialize NX graphics subsystem to use LCD */
|
||||
|
||||
#ifdef CONFIG_EXAMPLES_CAMERA_OUTPUT_LCD
|
||||
ret = nximage_initialize();
|
||||
if (ret < 0)
|
||||
{
|
||||
printf("camera_main: Failed to get NX handle: %d\n", errno);
|
||||
return ERROR;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Select storage to save image files */
|
||||
|
||||
save_dir = futil_initialize();
|
||||
|
||||
/* Initialize video driver to create a device file */
|
||||
|
||||
ret = video_initialize("/dev/video");
|
||||
if (ret != 0)
|
||||
{
|
||||
printf("ERROR: Failed to initialize video: errno = %d\n", errno);
|
||||
goto exit_without_cleaning_videodriver;
|
||||
}
|
||||
|
||||
/* Open the device file. */
|
||||
|
||||
v_fd = open("/dev/video", 0);
|
||||
@ -507,13 +515,16 @@ int main(int argc, FAR char *argv[])
|
||||
* And all allocated memorys are VIDIOC_QBUFed.
|
||||
*/
|
||||
|
||||
ret = camera_prepare(v_fd, V4L2_BUF_TYPE_STILL_CAPTURE,
|
||||
V4L2_BUF_MODE_FIFO, V4L2_PIX_FMT_JPEG,
|
||||
VIDEO_HSIZE_FULLHD, VIDEO_VSIZE_FULLHD,
|
||||
&buffers_still, STILL_BUFNUM, IMAGE_JPG_SIZE);
|
||||
if (ret != OK)
|
||||
if (capture_num != 0)
|
||||
{
|
||||
goto exit_this_app;
|
||||
ret = camera_prepare(v_fd, V4L2_BUF_TYPE_STILL_CAPTURE,
|
||||
V4L2_BUF_MODE_FIFO, V4L2_PIX_FMT_JPEG,
|
||||
VIDEO_HSIZE_FULLHD, VIDEO_VSIZE_FULLHD,
|
||||
&buffers_still, STILL_BUFNUM, IMAGE_JPG_SIZE);
|
||||
if (ret != OK)
|
||||
{
|
||||
goto exit_this_app;
|
||||
}
|
||||
}
|
||||
|
||||
/* Prepare for VIDEO_CAPTURE stream.
|
||||
@ -525,74 +536,182 @@ int main(int argc, FAR char *argv[])
|
||||
* order from the captured frame buffer and a new camera image is
|
||||
* recaptured.
|
||||
*
|
||||
* Allocate freame buffers for QVGA YUV422 size (320x240x2=150KB).
|
||||
* Allocate freame buffers for QVGA RGB565 size (320x240x2=150KB).
|
||||
* Number of frame buffers is defined as VIDEO_BUFNUM(3).
|
||||
* And all allocated memorys are VIDIOC_QBUFed.
|
||||
*/
|
||||
|
||||
ret = camera_prepare(v_fd, V4L2_BUF_TYPE_VIDEO_CAPTURE,
|
||||
V4L2_BUF_MODE_RING, V4L2_PIX_FMT_UYVY,
|
||||
V4L2_BUF_MODE_RING, V4L2_PIX_FMT_RGB565,
|
||||
VIDEO_HSIZE_QVGA, VIDEO_VSIZE_QVGA,
|
||||
&buffers_video, VIDEO_BUFNUM, IMAGE_YUV_SIZE);
|
||||
&buffers_video, VIDEO_BUFNUM, IMAGE_RGB_SIZE);
|
||||
if (ret != OK)
|
||||
{
|
||||
goto exit_this_app;
|
||||
}
|
||||
|
||||
printf("Take %d pictures as %s file in %s after %d mili-seconds.\n",
|
||||
capture_num,
|
||||
(capture_type == V4L2_BUF_TYPE_STILL_CAPTURE) ? "JPEG" : "YUV",
|
||||
save_dir, START_CAPTURE_TIME);
|
||||
printf(" After taking pictures, the app will be exit after %d ms.\n",
|
||||
KEEP_VIDEO_TIME);
|
||||
/* This application has 3 states.
|
||||
*
|
||||
* APP_STATE_BEFORE_CAPTURE:
|
||||
* This state waits 5 seconds (definded START_CAPTURE_TIME)
|
||||
* with displaying preview (VIDEO_CAPTURE stream image) on LCD.
|
||||
* After 5 seconds, state will be changed to APP_STATE_UNDER_CAPTURE.
|
||||
*
|
||||
* APP_STATE_UNDER_CAPTURE:
|
||||
* This state will start taking picture and store the image into files.
|
||||
* Number of taking pictures is set capture_num valiable.
|
||||
* It can be changed by command line argument.
|
||||
* After finishing taking pictures, the state will be changed to
|
||||
* APP_STATE_AFTER_CAPTURE.
|
||||
*
|
||||
* APP_STATE_AFTER_CAPTURE:
|
||||
* This state waits 10 seconds (definded KEEP_VIDEO_TIME)
|
||||
* with displaying preview (VIDEO_CAPTURE stream image) on LCD.
|
||||
* After 10 seconds, this application will be finished.
|
||||
*
|
||||
* Notice:
|
||||
* If capture_num is set '0', state will stay APP_STATE_BEFORE_CAPTURE.
|
||||
*/
|
||||
|
||||
RESET_INITIAL_TIME(then);
|
||||
app_state = APP_STATE_BEFORE_CAPTURE;
|
||||
|
||||
/* Show this application behavior. */
|
||||
|
||||
if (capture_num == 0)
|
||||
{
|
||||
is_eternal = 1;
|
||||
printf("Start video this mode is eternal."
|
||||
" (Non stop, non save files.)\n");
|
||||
#ifndef CONFIG_EXAMPLES_CAMERA_OUTPUT_LCD
|
||||
printf("This mode should be run with LCD display\n");
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
is_eternal = 0;
|
||||
wait.tv_sec = START_CAPTURE_TIME;
|
||||
wait.tv_usec = 0;
|
||||
printf("Take %d pictures as %s file in %s after %d seconds.\n",
|
||||
capture_num,
|
||||
(capture_type == V4L2_BUF_TYPE_STILL_CAPTURE) ? "JPEG" : "RGB",
|
||||
save_dir, START_CAPTURE_TIME);
|
||||
printf(" After finishing taking pictures,"
|
||||
" this app will be finished after %d seconds.\n",
|
||||
KEEP_VIDEO_TIME);
|
||||
}
|
||||
|
||||
gettimeofday(&start, NULL);
|
||||
|
||||
/* ===== Main Loop ===== */
|
||||
|
||||
while (1)
|
||||
{
|
||||
printf("Start capturing...\n");
|
||||
ret = start_stillcapture(v_fd, capture_type);
|
||||
if (ret != OK)
|
||||
switch (app_state)
|
||||
{
|
||||
goto exit_this_app;
|
||||
/* BEFORE_CAPTURE and AFTER_CAPTURE is waiting for expiring the
|
||||
* time.
|
||||
* In the meantime, Captureing VIDEO image to show pre-view on LCD.
|
||||
*/
|
||||
|
||||
case APP_STATE_BEFORE_CAPTURE:
|
||||
case APP_STATE_AFTER_CAPTURE:
|
||||
ret = get_camimage(v_fd, &v4l2_buf, V4L2_BUF_TYPE_VIDEO_CAPTURE);
|
||||
if (ret != OK)
|
||||
{
|
||||
goto exit_this_app;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_EXAMPLES_CAMERA_OUTPUT_LCD
|
||||
nximage_draw((void *)v4l2_buf.m.userptr,
|
||||
VIDEO_HSIZE_QVGA, VIDEO_VSIZE_QVGA);
|
||||
#endif
|
||||
|
||||
ret = release_camimage(v_fd, &v4l2_buf);
|
||||
if (ret != OK)
|
||||
{
|
||||
goto exit_this_app;
|
||||
}
|
||||
|
||||
if (!is_eternal)
|
||||
{
|
||||
gettimeofday(&now, NULL);
|
||||
timersub(&now, &start, &delta);
|
||||
if (timercmp(&delta, &wait, >))
|
||||
{
|
||||
printf("Expire time is pasted. GoTo next state.\n");
|
||||
if (app_state == APP_STATE_BEFORE_CAPTURE)
|
||||
{
|
||||
app_state = APP_STATE_UNDER_CAPTURE;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = OK;
|
||||
goto exit_this_app;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
break; /* Finish APP_STATE_BEFORE_CAPTURE or APP_STATE_AFTER_CAPTURE */
|
||||
|
||||
/* UNDER_CAPTURE is taking pictures until number of capture_num
|
||||
* value.
|
||||
* This state stays until finishing all pictures.
|
||||
*/
|
||||
|
||||
case APP_STATE_UNDER_CAPTURE:
|
||||
printf("Start captureing...\n");
|
||||
ret = start_stillcapture(v_fd, capture_type);
|
||||
if (ret != OK)
|
||||
{
|
||||
goto exit_this_app;
|
||||
}
|
||||
|
||||
while (capture_num)
|
||||
{
|
||||
ret = get_camimage(v_fd, &v4l2_buf, capture_type);
|
||||
if (ret != OK)
|
||||
{
|
||||
goto exit_this_app;
|
||||
}
|
||||
|
||||
futil_writeimage(
|
||||
(uint8_t *)v4l2_buf.m.userptr,
|
||||
(size_t)v4l2_buf.bytesused,
|
||||
(capture_type == V4L2_BUF_TYPE_VIDEO_CAPTURE) ?
|
||||
"RGB" : "JPG");
|
||||
|
||||
ret = release_camimage(v_fd, &v4l2_buf);
|
||||
if (ret != OK)
|
||||
{
|
||||
goto exit_this_app;
|
||||
}
|
||||
|
||||
capture_num--;
|
||||
}
|
||||
|
||||
ret = stop_stillcapture(v_fd, capture_type);
|
||||
if (ret != OK)
|
||||
{
|
||||
goto exit_this_app;
|
||||
}
|
||||
|
||||
app_state = APP_STATE_AFTER_CAPTURE;
|
||||
wait.tv_sec = KEEP_VIDEO_TIME;
|
||||
wait.tv_usec = 0;
|
||||
gettimeofday(&start, NULL);
|
||||
printf("Finished captureing...\n");
|
||||
break; /* Finish APP_STATE_UNDER_CAPTURE */
|
||||
|
||||
default:
|
||||
printf("Unknown error is occured.. state=%d\n", app_state);
|
||||
goto exit_this_app;
|
||||
break;
|
||||
}
|
||||
|
||||
while (capture_num)
|
||||
{
|
||||
ret = get_camimage(v_fd, &v4l2_buf, capture_type);
|
||||
if (ret != OK)
|
||||
{
|
||||
goto exit_this_app;
|
||||
}
|
||||
|
||||
futil_writeimage((uint8_t *)v4l2_buf.m.userptr,
|
||||
(size_t)v4l2_buf.bytesused,
|
||||
(capture_type == V4L2_BUF_TYPE_VIDEO_CAPTURE) ? "YUV" : "JPG");
|
||||
|
||||
ret = release_camimage(v_fd, &v4l2_buf);
|
||||
if (ret != OK)
|
||||
{
|
||||
goto exit_this_app;
|
||||
}
|
||||
|
||||
capture_num--;
|
||||
}
|
||||
|
||||
ret = stop_stillcapture(v_fd, capture_type);
|
||||
if (ret != OK)
|
||||
{
|
||||
goto exit_this_app;
|
||||
}
|
||||
|
||||
RESET_INITIAL_TIME(then);
|
||||
printf("Finished capturing...\n");
|
||||
}
|
||||
|
||||
exit_this_app:
|
||||
|
||||
/* Close video device file makes dequqe all buffers */
|
||||
/* Close video device file makes dequeue all buffers */
|
||||
|
||||
close(v_fd);
|
||||
|
||||
@ -603,5 +722,12 @@ exit_without_cleaning_buffer:
|
||||
|
||||
video_uninitialize();
|
||||
|
||||
exit_without_cleaning_videodriver:
|
||||
|
||||
#ifdef CONFIG_EXAMPLES_CAMERA_OUTPUT_LCD
|
||||
nximage_finalize();
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user