1 /*
2 Copyright (c) 2012-2014, 2016, The Linux Foundation. All rights reserved.
3 
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions are
6 met:
7     * Redistributions of source code must retain the above copyright
8       notice, this list of conditions and the following disclaimer.
9     * Redistributions in binary form must reproduce the above
10       copyright notice, this list of conditions and the following
11       disclaimer in the documentation and/or other materials provided
12       with the distribution.
13     * Neither the name of The Linux Foundation nor the names of its
14       contributors may be used to endorse or promote products derived
15       from this software without specific prior written permission.
16 
17 THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20 ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24 BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26 OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27 IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29 
30 // Camera dependencies
31 #include "mm_qcamera_app.h"
32 #include "mm_qcamera_dbg.h"
33 
mm_app_video_notify_cb(mm_camera_super_buf_t * bufs,void * user_data)34 static void mm_app_video_notify_cb(mm_camera_super_buf_t *bufs,
35                                    void *user_data)
36 {
37     char file_name[64];
38     mm_camera_buf_def_t *frame = bufs->bufs[0];
39     mm_camera_test_obj_t *pme = (mm_camera_test_obj_t *)user_data;
40 
41     LOGD("BEGIN - length=%zu, frame idx = %d\n",
42           frame->frame_len, frame->frame_idx);
43     snprintf(file_name, sizeof(file_name), "V_C%d", pme->cam->camera_handle);
44     mm_app_dump_frame(frame, file_name, "yuv", frame->frame_idx);
45 
46     if (MM_CAMERA_OK != pme->cam->ops->qbuf(bufs->camera_handle,
47                                             bufs->ch_id,
48                                             frame)) {
49         LOGE("Failed in Preview Qbuf\n");
50     }
51     mm_app_cache_ops((mm_camera_app_meminfo_t *)frame->mem_info,
52                      ION_IOC_INV_CACHES);
53 
54     LOGD("END\n");
55 }
56 
mm_app_add_video_stream(mm_camera_test_obj_t * test_obj,mm_camera_channel_t * channel,mm_camera_buf_notify_t stream_cb,void * userdata,uint8_t num_bufs)57 mm_camera_stream_t * mm_app_add_video_stream(mm_camera_test_obj_t *test_obj,
58                                              mm_camera_channel_t *channel,
59                                              mm_camera_buf_notify_t stream_cb,
60                                              void *userdata,
61                                              uint8_t num_bufs)
62 {
63     int rc = MM_CAMERA_OK;
64     mm_camera_stream_t *stream = NULL;
65     cam_capability_t *cam_cap = (cam_capability_t *)(test_obj->cap_buf.buf.buffer);
66 
67     stream = mm_app_add_stream(test_obj, channel);
68     if (NULL == stream) {
69         LOGE("add stream failed\n");
70         return NULL;
71     }
72 
73     stream->s_config.mem_vtbl.get_bufs = mm_app_stream_initbuf;
74     stream->s_config.mem_vtbl.put_bufs = mm_app_stream_deinitbuf;
75     stream->s_config.mem_vtbl.clean_invalidate_buf =
76       mm_app_stream_clean_invalidate_buf;
77     stream->s_config.mem_vtbl.invalidate_buf = mm_app_stream_invalidate_buf;
78     stream->s_config.mem_vtbl.user_data = (void *)stream;
79     stream->s_config.stream_cb = stream_cb;
80     stream->s_config.stream_cb_sync = NULL;
81     stream->s_config.userdata = userdata;
82     stream->num_of_bufs = num_bufs;
83 
84     stream->s_config.stream_info = (cam_stream_info_t *)stream->s_info_buf.buf.buffer;
85     memset(stream->s_config.stream_info, 0, sizeof(cam_stream_info_t));
86     stream->s_config.stream_info->stream_type = CAM_STREAM_TYPE_VIDEO;
87     stream->s_config.stream_info->streaming_mode = CAM_STREAMING_MODE_CONTINUOUS;
88     stream->s_config.stream_info->fmt = DEFAULT_VIDEO_FORMAT;
89     stream->s_config.stream_info->dim.width = DEFAULT_VIDEO_WIDTH;
90     stream->s_config.stream_info->dim.height = DEFAULT_VIDEO_HEIGHT;
91     stream->s_config.padding_info = cam_cap->padding_info;
92 
93     rc = mm_app_config_stream(test_obj, channel, stream, &stream->s_config);
94     if (MM_CAMERA_OK != rc) {
95         LOGE("config preview stream err=%d\n",  rc);
96         return NULL;
97     }
98 
99     return stream;
100 }
101 
mm_app_add_video_channel(mm_camera_test_obj_t * test_obj)102 mm_camera_channel_t * mm_app_add_video_channel(mm_camera_test_obj_t *test_obj)
103 {
104     mm_camera_channel_t *channel = NULL;
105     mm_camera_stream_t *stream = NULL;
106 
107     channel = mm_app_add_channel(test_obj,
108                                  MM_CHANNEL_TYPE_VIDEO,
109                                  NULL,
110                                  NULL,
111                                  NULL);
112     if (NULL == channel) {
113         LOGE("add channel failed");
114         return NULL;
115     }
116 
117     stream = mm_app_add_video_stream(test_obj,
118                                      channel,
119                                      mm_app_video_notify_cb,
120                                      (void *)test_obj,
121                                      1);
122     if (NULL == stream) {
123         LOGE("add video stream failed\n");
124         mm_app_del_channel(test_obj, channel);
125         return NULL;
126     }
127 
128     return channel;
129 }
130 
mm_app_start_record_preview(mm_camera_test_obj_t * test_obj)131 int mm_app_start_record_preview(mm_camera_test_obj_t *test_obj)
132 {
133     int rc = MM_CAMERA_OK;
134     mm_camera_channel_t *p_ch = NULL;
135     mm_camera_channel_t *v_ch = NULL;
136     mm_camera_channel_t *s_ch = NULL;
137 
138     p_ch = mm_app_add_preview_channel(test_obj);
139     if (NULL == p_ch) {
140         LOGE("add preview channel failed");
141         return -MM_CAMERA_E_GENERAL;
142     }
143 
144     v_ch = mm_app_add_video_channel(test_obj);
145     if (NULL == v_ch) {
146         LOGE("add video channel failed");
147         mm_app_del_channel(test_obj, p_ch);
148         return -MM_CAMERA_E_GENERAL;
149     }
150 
151     s_ch = mm_app_add_snapshot_channel(test_obj);
152     if (NULL == s_ch) {
153         LOGE("add snapshot channel failed");
154         mm_app_del_channel(test_obj, p_ch);
155         mm_app_del_channel(test_obj, v_ch);
156         return -MM_CAMERA_E_GENERAL;
157     }
158 
159     rc = mm_app_start_channel(test_obj, p_ch);
160     if (MM_CAMERA_OK != rc) {
161         LOGE("start preview failed rc=%d\n", rc);
162         mm_app_del_channel(test_obj, p_ch);
163         mm_app_del_channel(test_obj, v_ch);
164         mm_app_del_channel(test_obj, s_ch);
165         return rc;
166     }
167 
168     return rc;
169 }
170 
mm_app_stop_record_preview(mm_camera_test_obj_t * test_obj)171 int mm_app_stop_record_preview(mm_camera_test_obj_t *test_obj)
172 {
173     int rc = MM_CAMERA_OK;
174     mm_camera_channel_t *p_ch = NULL;
175     mm_camera_channel_t *v_ch = NULL;
176     mm_camera_channel_t *s_ch = NULL;
177 
178     p_ch = mm_app_get_channel_by_type(test_obj, MM_CHANNEL_TYPE_PREVIEW);
179     v_ch = mm_app_get_channel_by_type(test_obj, MM_CHANNEL_TYPE_VIDEO);
180     s_ch = mm_app_get_channel_by_type(test_obj, MM_CHANNEL_TYPE_SNAPSHOT);
181 
182     rc = mm_app_stop_and_del_channel(test_obj, p_ch);
183     if (MM_CAMERA_OK != rc) {
184         LOGE("Stop Preview failed rc=%d\n", rc);
185     }
186 
187     rc = mm_app_stop_and_del_channel(test_obj, v_ch);
188     if (MM_CAMERA_OK != rc) {
189         LOGE("Stop Preview failed rc=%d\n", rc);
190     }
191 
192     rc = mm_app_stop_and_del_channel(test_obj, s_ch);
193     if (MM_CAMERA_OK != rc) {
194         LOGE("Stop Preview failed rc=%d\n", rc);
195     }
196 
197     return rc;
198 }
199 
mm_app_start_record(mm_camera_test_obj_t * test_obj)200 int mm_app_start_record(mm_camera_test_obj_t *test_obj)
201 {
202     int rc = MM_CAMERA_OK;
203     mm_camera_channel_t *v_ch = NULL;
204 
205     v_ch = mm_app_get_channel_by_type(test_obj, MM_CHANNEL_TYPE_VIDEO);
206 
207     rc = mm_app_start_channel(test_obj, v_ch);
208     if (MM_CAMERA_OK != rc) {
209         LOGE("start recording failed rc=%d\n", rc);
210     }
211 
212     return rc;
213 }
214 
mm_app_stop_record(mm_camera_test_obj_t * test_obj)215 int mm_app_stop_record(mm_camera_test_obj_t *test_obj)
216 {
217     int rc = MM_CAMERA_OK;
218     mm_camera_channel_t *v_ch = NULL;
219 
220     v_ch = mm_app_get_channel_by_type(test_obj, MM_CHANNEL_TYPE_VIDEO);
221 
222     rc = mm_app_stop_channel(test_obj, v_ch);
223     if (MM_CAMERA_OK != rc) {
224         LOGE("stop recording failed rc=%d\n", rc);
225     }
226 
227     return rc;
228 }
229 
mm_app_start_live_snapshot(mm_camera_test_obj_t * test_obj)230 int mm_app_start_live_snapshot(mm_camera_test_obj_t *test_obj)
231 {
232     int rc = MM_CAMERA_OK;
233     mm_camera_channel_t *s_ch = NULL;
234 
235     s_ch = mm_app_get_channel_by_type(test_obj, MM_CHANNEL_TYPE_SNAPSHOT);
236 
237     rc = mm_app_start_channel(test_obj, s_ch);
238     if (MM_CAMERA_OK != rc) {
239         LOGE("start recording failed rc=%d\n", rc);
240     }
241 
242     return rc;
243 }
244 
mm_app_stop_live_snapshot(mm_camera_test_obj_t * test_obj)245 int mm_app_stop_live_snapshot(mm_camera_test_obj_t *test_obj)
246 {
247     int rc = MM_CAMERA_OK;
248     mm_camera_channel_t *s_ch = NULL;
249 
250     s_ch = mm_app_get_channel_by_type(test_obj, MM_CHANNEL_TYPE_SNAPSHOT);
251 
252     rc = mm_app_stop_channel(test_obj, s_ch);
253     if (MM_CAMERA_OK != rc) {
254         LOGE("stop recording failed rc=%d\n", rc);
255     }
256 
257     return rc;
258 }
259