• 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 "stream_customer.h"
17 #include "video_key_info.h"
18 
19 namespace OHOS::Camera {
StreamCustomer()20 StreamCustomer::StreamCustomer() {}
~StreamCustomer()21 StreamCustomer::~StreamCustomer() {}
22 
CamFrame(const std::function<void (void *,uint32_t)> callback)23 void StreamCustomer::CamFrame(const std::function<void(void*, uint32_t)> callback)
24 {
25     CAMERA_LOGD("demo test:enter CamFrame thread ++ \n");
26 #ifdef CAMERA_BUILT_ON_OHOS_LITE
27     do {
28         OHOS::SurfaceBuffer* buffer = consumer_->AcquireBuffer();
29         if (buffer != nullptr) {
30             if (callback != nullptr) {
31                 void* addr = buffer->GetVirAddr();
32                 int32_t size = 0;
33                 buffer->GetInt32(VIDEO_KEY_INFO_DATA_SIZE, size);
34                 callback(addr, size);
35             }
36             consumer_->ReleaseBuffer(buffer);
37         }
38     } while (camFrameExit_ == 0);
39 #else
40     OHOS::Rect damage;
41     int32_t flushFence = 0;
42     int64_t timestamp = 0;
43     constexpr uint32_t delayTime = 12000;
44 
45     do {
46         OHOS::sptr<OHOS::SurfaceBuffer> buff = nullptr;
47         consumer_->AcquireBuffer(buff, flushFence, timestamp, damage);
48         if (buff != nullptr) {
49             void* addr = buff->GetVirAddr();
50             int32_t size = buff->GetSize();
51             if (callback != nullptr) {
52                 int32_t gotSize = 0;
53                 int32_t frameNum = 0;
54                 int isKey = 0;
55                 int64_t timestamp;
56                 buff->ExtraGet(OHOS::Camera::dataSize, gotSize);
57                 buff->ExtraGet(OHOS::Camera::isKeyFrame, isKey);
58                 buff->ExtraGet(OHOS::Camera::timeStamp, timestamp);
59                 CAMERA_LOGE("demo test:CamFrame callback +++++++ Size == %d frameNum = %d timestamp == %lld\n",
60                     gotSize, frameNum, timestamp);
61                 callback(addr, gotSize);
62             }
63             consumer_->ReleaseBuffer(buff, -1);
64         }
65         usleep(delayTime);
66     } while (camFrameExit_ == 0);
67 #endif
68 
69     CAMERA_LOGD("demo test:Exiting CamFrame thread -- \n");
70 }
71 
72 #ifdef CAMERA_BUILT_ON_OHOS_LITE
CreateProducer()73 std::shared_ptr<OHOS::Surface> StreamCustomer::CreateProducer()
74 #else
75 sptr<OHOS::IBufferProducer> StreamCustomer::CreateProducer()
76 #endif
77 {
78 #ifdef CAMERA_BUILT_ON_OHOS_LITE
79     consumer_ = std::shared_ptr<OHOS::Surface>(OHOS::Surface::CreateSurface());
80     if (consumer_ == nullptr) {
81         return nullptr;
82     }
83     return consumer_;
84 #else
85     consumer_ = OHOS::Surface::CreateSurfaceAsConsumer();
86     if (consumer_ == nullptr) {
87         return nullptr;
88     }
89     sptr<IBufferConsumerListener> listener = new TestBuffersConsumerListener();
90     consumer_->RegisterConsumerListener(listener);
91 
92     auto producer = consumer_->GetProducer();
93     if (producer == nullptr) {
94         return nullptr;
95     }
96 
97     CAMERA_LOGI("demo test, create a buffer queue producer %{public}p", producer.GetRefPtr());
98     return producer;
99 #endif
100 }
101 
ReceiveFrameOn(const std::function<void (void *,uint32_t)> callback)102 RetCode StreamCustomer::ReceiveFrameOn(const std::function<void(void*, uint32_t)> callback)
103 {
104     CAMERA_LOGD("demo test:ReceiveFrameOn enter");
105 
106     if (camFrameExit_ == 1) {
107         camFrameExit_ = 0;
108         previewThreadId_ = new (std::nothrow) std::thread(&StreamCustomer::CamFrame, this, callback);
109         if (previewThreadId_ == nullptr) {
110             CAMERA_LOGE("demo test:ReceiveFrameOn failed\n");
111             return OHOS::Camera::RC_ERROR;
112         }
113     } else {
114         CAMERA_LOGD("demo test:ReceiveFrameOn loop thread is running\n");
115     }
116     CAMERA_LOGD("demo test:ReceiveFrameOn exit");
117 
118     return RC_OK;
119 }
120 
ReceiveFrameOff()121 void StreamCustomer::ReceiveFrameOff()
122 {
123     CAMERA_LOGD("demo test:ReceiveFrameOff enter\n");
124 
125     if (camFrameExit_ == 0) {
126         camFrameExit_ = 1;
127         if (previewThreadId_ != nullptr) {
128             previewThreadId_->join();
129             delete previewThreadId_;
130             previewThreadId_ = nullptr;
131         }
132     }
133 
134     CAMERA_LOGD("demo test:ReceiveFrameOff exit\n");
135 }
136 }
137