1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "camera_manager.h"
17
18 using namespace std;
19 using namespace OHOS;
20 using namespace OHOS::Media;
21
22 namespace IC {
23 const int QFACTOR = 90;
24 std::mutex g_mutex;
25 std::condition_variable g_cv;
26
SampleSaveCapture(const char * p,uint32_t size)27 static void SampleSaveCapture(const char *p, uint32_t size)
28 {
29 printf("Start saving picture.\n");
30 ofstream pic(CAMERA_SAVE_PATH, ofstream::out | ofstream::trunc);
31 if (pic.is_open()) {
32 printf("Write %d bytes.\n", size);
33 pic.write(p, size);
34 pic.close();
35 printf("Saving picture end.\n");
36 }
37 }
38
SetSurface(Surface * surface)39 void SampleSurfaceListener::SetSurface(Surface *surface)
40 {
41 surface_ = surface;
42 }
43
OnFrameFinished(Camera & camera,FrameConfig & fc,FrameResult & result)44 void SampleFrameStateCallback::OnFrameFinished(Camera &camera, FrameConfig &fc, FrameResult &result)
45 {
46 std::unique_lock<std::mutex> lock(g_mutex);
47 printf("Receive frame complete inform.\n");
48 if (fc.GetFrameConfigType() == FRAME_CONFIG_CAPTURE) {
49 printf("Capture frame received.\n");
50 list<Surface *> surfaceList = fc.GetSurfaces();
51 for (Surface *surface : surfaceList) {
52 SurfaceBuffer *buffer = surface->AcquireBuffer();
53 if (buffer != nullptr) {
54 char *virtAddr = static_cast<char *>(buffer->GetVirAddr());
55 if (virtAddr != nullptr) {
56 SampleSaveCapture(virtAddr, buffer->GetSize());
57 }
58 surface->ReleaseBuffer(buffer);
59 }
60 delete surface;
61 }
62 } else if (fc.GetFrameConfigType() == FRAME_CONFIG_PREVIEW) {
63 printf("Preview frame received.\n");
64 list<Surface *> surfaceList = fc.GetSurfaces();
65 for (Surface *surface : surfaceList) {
66 printf("surface release.\n");
67 delete surface;
68 }
69 }
70 delete &fc;
71 g_cv.notify_all();
72 }
73
OnBufferAvailable()74 void SampleSurfaceListener::OnBufferAvailable()
75 {
76 if (surface_ == nullptr) {
77 return;
78 }
79 SurfaceBuffer *buffer = surface_->AcquireBuffer();
80 if (buffer != nullptr) {
81 surface_->ReleaseBuffer(buffer);
82 }
83 }
84
SampleCameraStateMng(EventHandler & eventHdlr)85 SampleCameraStateMng::SampleCameraStateMng(EventHandler &eventHdlr) : eventHdlr_(eventHdlr)
86 {
87 }
88
~SampleCameraStateMng()89 SampleCameraStateMng::~SampleCameraStateMng()
90 {
91 }
92
OnCreated(Camera & c)93 void SampleCameraStateMng::OnCreated(Camera &c)
94 {
95 std::unique_lock<std::mutex> lock(g_mutex);
96 printf("Sample recv OnCreate camera.\n");
97 auto config = CameraConfig::CreateCameraConfig();
98 if (config == nullptr) {
99 cout << "New object failed." << endl;
100 return;
101 }
102 config->SetFrameStateCallback(&fsCb_, &eventHdlr_);
103 c.Configure(*config);
104 cam_ = &c;
105 g_cv.notify_all();
106 }
107
OnCreateFailed(const string cameraId,int32_t errorCode)108 void SampleCameraStateMng::OnCreateFailed(const string cameraId, int32_t errorCode)
109 {
110 printf("Sample camera create failed. Error code: %d.\n", errorCode);
111 }
112
OnReleased(Camera & c)113 void SampleCameraStateMng::OnReleased(Camera &c)
114 {
115 printf("Sample camera OnReleased.\n");
116 }
117
Capture()118 void SampleCameraStateMng::Capture()
119 {
120 if (cam_ == nullptr) {
121 printf("Camera is not ready.\n");
122 return;
123 }
124 FrameConfig *fc = new (std::nothrow) FrameConfig(FRAME_CONFIG_CAPTURE);
125 if (fc == nullptr) {
126 printf("Create FrameConfig failed.\n");
127 return;
128 }
129 Surface *surface = Surface::CreateSurface();
130 if (surface == nullptr) {
131 delete fc;
132 printf("CreateSurface failed.\n");
133 return;
134 }
135 surface->SetWidthAndHeight(CAMERA_PIC_WIDTH, CAMERA_PIC_HEIGHT);
136 surface->SetUsage(BUFFER_CONSUMER_USAGE_HARDWARE);
137 fc->AddSurface(*surface);
138 fc->SetParameter(PARAM_KEY_IMAGE_ENCODE_QFACTOR, QFACTOR);
139 cam_->TriggerSingleCapture(*fc);
140 }
141 } // namespace IC