1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License. 5094332d3Sopenharmony_ci * You may obtain a copy of the License at 6094332d3Sopenharmony_ci * 7094332d3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8094332d3Sopenharmony_ci * 9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and 13094332d3Sopenharmony_ci * limitations under the License. 14094332d3Sopenharmony_ci */ 15094332d3Sopenharmony_ci 16094332d3Sopenharmony_ci#include "ohos_camera_demo.h" 17094332d3Sopenharmony_ci#include <cstdio> 18094332d3Sopenharmony_ci#include <getopt.h> 19094332d3Sopenharmony_ci 20094332d3Sopenharmony_cinamespace OHOS::Camera { 21094332d3Sopenharmony_cistatic void Usage(FILE* fp) 22094332d3Sopenharmony_ci{ 23094332d3Sopenharmony_ci fprintf(fp, 24094332d3Sopenharmony_ci "Options:\n" 25094332d3Sopenharmony_ci "-h | --help Print this message\n" 26094332d3Sopenharmony_ci "-o | --offline stream offline test\n" 27094332d3Sopenharmony_ci "-c | --capture capture one picture\n" 28094332d3Sopenharmony_ci "-w | --set WB Set white balance Cloudy\n" 29094332d3Sopenharmony_ci "-v | --video capture Video of 10s\n" 30094332d3Sopenharmony_ci "-a | --Set AE Set Auto exposure\n" 31094332d3Sopenharmony_ci "-e | --Set Metadeta Set Metadata\n" 32094332d3Sopenharmony_ci "-f | --Set Flashlight Set flashlight ON 5s OFF\n" 33094332d3Sopenharmony_ci "-q | --quit stop preview and quit this app\n"); 34094332d3Sopenharmony_ci} 35094332d3Sopenharmony_ci 36094332d3Sopenharmony_ciconst static struct option LONG_OPTIONS[] = { 37094332d3Sopenharmony_ci {"help", no_argument, nullptr, 'h'}, {"capture", no_argument, nullptr, 'c'}, 38094332d3Sopenharmony_ci {"WB", no_argument, nullptr, 'w'}, {"video", no_argument, nullptr, 'v'}, 39094332d3Sopenharmony_ci {"quit", no_argument, nullptr, 'q'}, {"AE", no_argument, nullptr, 'a'}, 40094332d3Sopenharmony_ci {"OL", no_argument, nullptr, 'o'}, {"flashlight", no_argument, nullptr, 'f'}, 41094332d3Sopenharmony_ci {0, 0, 0, 0} 42094332d3Sopenharmony_ci}; 43094332d3Sopenharmony_ci 44094332d3Sopenharmony_cistatic int PutMenuAndGetChr(void) 45094332d3Sopenharmony_ci{ 46094332d3Sopenharmony_ci constexpr uint32_t inputCount = 50; 47094332d3Sopenharmony_ci int c = 0; 48094332d3Sopenharmony_ci char strs[inputCount]; 49094332d3Sopenharmony_ci 50094332d3Sopenharmony_ci Usage(stdout); 51094332d3Sopenharmony_ci CAMERA_LOGD("pls input command(input -q exit this app)\n"); 52094332d3Sopenharmony_ci fgets(strs, inputCount, stdin); 53094332d3Sopenharmony_ci 54094332d3Sopenharmony_ci for (int i = 0; i < inputCount; i++) { 55094332d3Sopenharmony_ci if (strs[i] != '-') { 56094332d3Sopenharmony_ci c = strs[i]; 57094332d3Sopenharmony_ci break; 58094332d3Sopenharmony_ci } 59094332d3Sopenharmony_ci } 60094332d3Sopenharmony_ci 61094332d3Sopenharmony_ci return c; 62094332d3Sopenharmony_ci} 63094332d3Sopenharmony_ci 64094332d3Sopenharmony_cistatic RetCode PreviewOn(int mode, const std::shared_ptr<OhosCameraDemo>& mainDemo) 65094332d3Sopenharmony_ci{ 66094332d3Sopenharmony_ci RetCode rc = RC_OK; 67094332d3Sopenharmony_ci CAMERA_LOGD("main test: PreviewOn enter"); 68094332d3Sopenharmony_ci 69094332d3Sopenharmony_ci rc = mainDemo->StartPreviewStream(); 70094332d3Sopenharmony_ci if (rc != RC_OK) { 71094332d3Sopenharmony_ci CAMERA_LOGE("main test: PreviewOn StartPreviewStream error"); 72094332d3Sopenharmony_ci return RC_ERROR; 73094332d3Sopenharmony_ci } 74094332d3Sopenharmony_ci 75094332d3Sopenharmony_ci if (mode == 0) { 76094332d3Sopenharmony_ci rc = mainDemo->StartCaptureStream(); 77094332d3Sopenharmony_ci if (rc != RC_OK) { 78094332d3Sopenharmony_ci CAMERA_LOGE("main test: PreviewOn StartCaptureStream error"); 79094332d3Sopenharmony_ci return RC_ERROR; 80094332d3Sopenharmony_ci } 81094332d3Sopenharmony_ci } else { 82094332d3Sopenharmony_ci rc = mainDemo->StartVideoStream(); 83094332d3Sopenharmony_ci if (rc != RC_OK) { 84094332d3Sopenharmony_ci CAMERA_LOGE("main test: PreviewOn StartVideoStream error"); 85094332d3Sopenharmony_ci return RC_ERROR; 86094332d3Sopenharmony_ci } 87094332d3Sopenharmony_ci } 88094332d3Sopenharmony_ci 89094332d3Sopenharmony_ci rc = mainDemo->CaptureON(STREAM_ID_PREVIEW, CAPTURE_ID_PREVIEW, CAPTURE_PREVIEW); 90094332d3Sopenharmony_ci if (rc != RC_OK) { 91094332d3Sopenharmony_ci CAMERA_LOGE("main test: PreviewOn mainDemo->CaptureON() preview error"); 92094332d3Sopenharmony_ci return RC_ERROR; 93094332d3Sopenharmony_ci } 94094332d3Sopenharmony_ci 95094332d3Sopenharmony_ci CAMERA_LOGD("main test: PreviewOn exit"); 96094332d3Sopenharmony_ci return RC_OK; 97094332d3Sopenharmony_ci} 98094332d3Sopenharmony_ci 99094332d3Sopenharmony_cistatic void PreviewOff(const std::shared_ptr<OhosCameraDemo>& mainDemo) 100094332d3Sopenharmony_ci{ 101094332d3Sopenharmony_ci CAMERA_LOGD("main test: PreviewOff enter"); 102094332d3Sopenharmony_ci 103094332d3Sopenharmony_ci mainDemo->CaptureOff(CAPTURE_ID_PREVIEW, CAPTURE_PREVIEW); 104094332d3Sopenharmony_ci mainDemo->ReleaseAllStream(); 105094332d3Sopenharmony_ci 106094332d3Sopenharmony_ci CAMERA_LOGD("main test: PreviewOff exit"); 107094332d3Sopenharmony_ci} 108094332d3Sopenharmony_ci 109094332d3Sopenharmony_cistatic void FlashLightTest(const std::shared_ptr<OhosCameraDemo>& mainDemo) 110094332d3Sopenharmony_ci{ 111094332d3Sopenharmony_ci constexpr size_t delayTime = 5; 112094332d3Sopenharmony_ci 113094332d3Sopenharmony_ci PreviewOff(mainDemo); 114094332d3Sopenharmony_ci mainDemo->ReleaseCameraDevice(); 115094332d3Sopenharmony_ci sleep(1); 116094332d3Sopenharmony_ci mainDemo->FlashlightOnOff(true); 117094332d3Sopenharmony_ci sleep(delayTime); 118094332d3Sopenharmony_ci mainDemo->FlashlightOnOff(false); 119094332d3Sopenharmony_ci mainDemo->InitCameraDevice(); 120094332d3Sopenharmony_ci PreviewOn(0, mainDemo); 121094332d3Sopenharmony_ci} 122094332d3Sopenharmony_ci 123094332d3Sopenharmony_cistatic void OfflineTest(const std::shared_ptr<OhosCameraDemo>& mainDemo) 124094332d3Sopenharmony_ci{ 125094332d3Sopenharmony_ci RetCode rc = RC_OK; 126094332d3Sopenharmony_ci 127094332d3Sopenharmony_ci PreviewOff(mainDemo); 128094332d3Sopenharmony_ci 129094332d3Sopenharmony_ci mainDemo->StartDualStreams(STREAM_ID_CAPTURE); 130094332d3Sopenharmony_ci mainDemo->CaptureOnDualStreams(STREAM_ID_CAPTURE); 131094332d3Sopenharmony_ci sleep(1); 132094332d3Sopenharmony_ci 133094332d3Sopenharmony_ci rc = mainDemo->StreamOffline(STREAM_ID_CAPTURE); 134094332d3Sopenharmony_ci if (rc != RC_OK) { 135094332d3Sopenharmony_ci CAMERA_LOGE("main test: mainDemo->StreamOffline error"); 136094332d3Sopenharmony_ci } else { 137094332d3Sopenharmony_ci sleep(1); 138094332d3Sopenharmony_ci mainDemo->InitCameraDevice(); 139094332d3Sopenharmony_ci rc = PreviewOn(0, mainDemo); 140094332d3Sopenharmony_ci if (rc != RC_OK) { 141094332d3Sopenharmony_ci CAMERA_LOGE("main test: PreviewOn() error"); 142094332d3Sopenharmony_ci } 143094332d3Sopenharmony_ci } 144094332d3Sopenharmony_ci} 145094332d3Sopenharmony_ci 146094332d3Sopenharmony_cistatic void CaptureTest(const std::shared_ptr<OhosCameraDemo>& mainDemo) 147094332d3Sopenharmony_ci{ 148094332d3Sopenharmony_ci RetCode rc = RC_OK; 149094332d3Sopenharmony_ci constexpr size_t delayTime = 5; 150094332d3Sopenharmony_ci 151094332d3Sopenharmony_ci rc = mainDemo->CaptureON(STREAM_ID_CAPTURE, CAPTURE_ID_CAPTURE, CAPTURE_SNAPSHOT); 152094332d3Sopenharmony_ci if (rc != RC_OK) { 153094332d3Sopenharmony_ci CAMERA_LOGE("main test: mainDemo->CaptureON() capture error"); 154094332d3Sopenharmony_ci return; 155094332d3Sopenharmony_ci } 156094332d3Sopenharmony_ci 157094332d3Sopenharmony_ci sleep(delayTime); 158094332d3Sopenharmony_ci rc = mainDemo->CaptureOff(CAPTURE_ID_CAPTURE, CAPTURE_SNAPSHOT); 159094332d3Sopenharmony_ci if (rc != RC_OK) { 160094332d3Sopenharmony_ci CAMERA_LOGE("main test: mainDemo->CaptureOff() capture error"); 161094332d3Sopenharmony_ci return; 162094332d3Sopenharmony_ci } 163094332d3Sopenharmony_ci} 164094332d3Sopenharmony_ci 165094332d3Sopenharmony_cistatic void VideoTest(const std::shared_ptr<OhosCameraDemo>& mainDemo) 166094332d3Sopenharmony_ci{ 167094332d3Sopenharmony_ci RetCode rc = RC_OK; 168094332d3Sopenharmony_ci constexpr size_t delayTime = 5; 169094332d3Sopenharmony_ci 170094332d3Sopenharmony_ci PreviewOff(mainDemo); 171094332d3Sopenharmony_ci mainDemo->StartDualStreams(STREAM_ID_VIDEO); 172094332d3Sopenharmony_ci mainDemo->CaptureOnDualStreams(STREAM_ID_VIDEO); 173094332d3Sopenharmony_ci 174094332d3Sopenharmony_ci sleep(delayTime); 175094332d3Sopenharmony_ci mainDemo->CaptureOff(CAPTURE_ID_PREVIEW, CAPTURE_PREVIEW); 176094332d3Sopenharmony_ci mainDemo->CaptureOff(CAPTURE_ID_VIDEO, CAPTURE_VIDEO); 177094332d3Sopenharmony_ci mainDemo->ReleaseAllStream(); 178094332d3Sopenharmony_ci 179094332d3Sopenharmony_ci rc = PreviewOn(0, mainDemo); 180094332d3Sopenharmony_ci if (rc != RC_OK) { 181094332d3Sopenharmony_ci CAMERA_LOGE("main test: video PreviewOn() error please -q exit demo"); 182094332d3Sopenharmony_ci } 183094332d3Sopenharmony_ci} 184094332d3Sopenharmony_ci 185094332d3Sopenharmony_cistatic void ManuList(const std::shared_ptr<OhosCameraDemo>& mainDemo, 186094332d3Sopenharmony_ci const int argc, char** argv) 187094332d3Sopenharmony_ci{ 188094332d3Sopenharmony_ci int idx, c; 189094332d3Sopenharmony_ci bool isAwb = true; 190094332d3Sopenharmony_ci const char *shortOptions = "h:cwvaeqof:"; 191094332d3Sopenharmony_ci c = getopt_long(argc, argv, shortOptions, LONG_OPTIONS, &idx); 192094332d3Sopenharmony_ci while (1) { 193094332d3Sopenharmony_ci switch (c) { 194094332d3Sopenharmony_ci case 'h': 195094332d3Sopenharmony_ci c = PutMenuAndGetChr(); 196094332d3Sopenharmony_ci break; 197094332d3Sopenharmony_ci case 'f': 198094332d3Sopenharmony_ci FlashLightTest(mainDemo); 199094332d3Sopenharmony_ci c = PutMenuAndGetChr(); 200094332d3Sopenharmony_ci break; 201094332d3Sopenharmony_ci case 'o': 202094332d3Sopenharmony_ci OfflineTest(mainDemo); 203094332d3Sopenharmony_ci c = PutMenuAndGetChr(); 204094332d3Sopenharmony_ci break; 205094332d3Sopenharmony_ci case 'c': 206094332d3Sopenharmony_ci CaptureTest(mainDemo); 207094332d3Sopenharmony_ci c = PutMenuAndGetChr(); 208094332d3Sopenharmony_ci break; 209094332d3Sopenharmony_ci case 'w': 210094332d3Sopenharmony_ci if (isAwb) { 211094332d3Sopenharmony_ci mainDemo->SetAwbMode(OHOS_CAMERA_AWB_MODE_INCANDESCENT); 212094332d3Sopenharmony_ci } else { 213094332d3Sopenharmony_ci mainDemo->SetAwbMode(OHOS_CAMERA_AWB_MODE_OFF); 214094332d3Sopenharmony_ci } 215094332d3Sopenharmony_ci isAwb = !isAwb; 216094332d3Sopenharmony_ci c = PutMenuAndGetChr(); 217094332d3Sopenharmony_ci break; 218094332d3Sopenharmony_ci case 'a': 219094332d3Sopenharmony_ci mainDemo->SetAeExpo(); 220094332d3Sopenharmony_ci c = PutMenuAndGetChr(); 221094332d3Sopenharmony_ci break; 222094332d3Sopenharmony_ci case 'e': 223094332d3Sopenharmony_ci mainDemo->SetMetadata(); 224094332d3Sopenharmony_ci c = PutMenuAndGetChr(); 225094332d3Sopenharmony_ci break; 226094332d3Sopenharmony_ci case 'v': 227094332d3Sopenharmony_ci VideoTest(mainDemo); 228094332d3Sopenharmony_ci c = PutMenuAndGetChr(); 229094332d3Sopenharmony_ci break; 230094332d3Sopenharmony_ci case 'q': 231094332d3Sopenharmony_ci PreviewOff(mainDemo); 232094332d3Sopenharmony_ci mainDemo->QuitDemo(); 233094332d3Sopenharmony_ci return; 234094332d3Sopenharmony_ci default: 235094332d3Sopenharmony_ci CAMERA_LOGE("main test: command error please retry input command"); 236094332d3Sopenharmony_ci c = PutMenuAndGetChr(); 237094332d3Sopenharmony_ci break; 238094332d3Sopenharmony_ci } 239094332d3Sopenharmony_ci } 240094332d3Sopenharmony_ci} 241094332d3Sopenharmony_ci 242094332d3Sopenharmony_ciint main(int argc, char** argv) 243094332d3Sopenharmony_ci{ 244094332d3Sopenharmony_ci RetCode rc = RC_OK; 245094332d3Sopenharmony_ci 246094332d3Sopenharmony_ci auto mainDemo = std::make_shared<OhosCameraDemo>(); 247094332d3Sopenharmony_ci rc = mainDemo->InitSensors(); 248094332d3Sopenharmony_ci if (rc == RC_ERROR) { 249094332d3Sopenharmony_ci CAMERA_LOGE("main test: mainDemo->InitSensors() error"); 250094332d3Sopenharmony_ci return -1; 251094332d3Sopenharmony_ci } 252094332d3Sopenharmony_ci rc = mainDemo->InitCameraDevice(); 253094332d3Sopenharmony_ci if (rc == RC_ERROR) { 254094332d3Sopenharmony_ci CAMERA_LOGE("main test: mainDemo->InitCameraDevice() error"); 255094332d3Sopenharmony_ci return -1; 256094332d3Sopenharmony_ci } 257094332d3Sopenharmony_ci mainDemo->SetEnableResult(); 258094332d3Sopenharmony_ci 259094332d3Sopenharmony_ci rc = PreviewOn(0, mainDemo); 260094332d3Sopenharmony_ci if (rc != RC_OK) { 261094332d3Sopenharmony_ci CAMERA_LOGE("main test: PreviewOn() error demo exit"); 262094332d3Sopenharmony_ci return -1; 263094332d3Sopenharmony_ci } 264094332d3Sopenharmony_ci 265094332d3Sopenharmony_ci ManuList(mainDemo, argc, argv); 266094332d3Sopenharmony_ci 267094332d3Sopenharmony_ci return RC_OK; 268094332d3Sopenharmony_ci} 269094332d3Sopenharmony_ci} // namespace Camera 270094332d3Sopenharmony_ci 271094332d3Sopenharmony_ciint main(int argc, char** argv) 272094332d3Sopenharmony_ci{ 273094332d3Sopenharmony_ci OHOS::Camera::main(argc, argv); 274094332d3Sopenharmony_ci 275094332d3Sopenharmony_ci return 0; 276094332d3Sopenharmony_ci} 277