• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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