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
StreamCustomer()19 StreamCustomer::StreamCustomer() {}
~StreamCustomer()20 StreamCustomer::~StreamCustomer() {}
21
CamFrame(const std::function<void (const unsigned char *,uint32_t)> callback)22 void StreamCustomer::CamFrame(const std::function<void(const unsigned char *, uint32_t)> callback)
23 {
24 CAMERA_LOGD("test:enter CamFrame thread ++ \n");
25 OHOS::Rect damage;
26 int32_t flushFence = 0;
27 int64_t timestamp = 0;
28 constexpr uint32_t delayTime = 12000;
29
30 do {
31 OHOS::sptr<OHOS::SurfaceBuffer> buff = nullptr;
32 consumer_->AcquireBuffer(buff, flushFence, timestamp, damage);
33 if (buff != nullptr) {
34 void* addr = buff->GetVirAddr();
35 int32_t size = buff->GetSize();
36 if (callback != nullptr) {
37 callback(static_cast<const unsigned char*>(addr), size);
38 }
39 consumer_->ReleaseBuffer(buff, -1);
40 }
41 usleep(delayTime);
42 } while (camFrameExit_ == 0);
43
44 CAMERA_LOGD("test:Exiting CamFrame thread -- \n");
45 }
46
CreateProducer()47 OHOS::sptr<OHOS::IBufferProducer> StreamCustomer::CreateProducer()
48 {
49 consumer_ = OHOS::Surface::CreateSurfaceAsConsumer();
50 if (consumer_ == nullptr) {
51 return nullptr;
52 }
53 OHOS::sptr<OHOS::IBufferConsumerListener> listener = new TestBuffersConsumerListener();
54 consumer_->RegisterConsumerListener(listener);
55
56 auto producer = consumer_->GetProducer();
57 if (producer == nullptr) {
58 return nullptr;
59 }
60
61 CAMERA_LOGI("test, create a buffer queue producer %{public}p", producer.GetRefPtr());
62 return producer;
63 }
64
ReceiveFrameOn(const std::function<void (const unsigned char *,uint32_t)> callback)65 OHOS::Camera::RetCode StreamCustomer::ReceiveFrameOn(
66 const std::function<void(const unsigned char *, uint32_t)> callback)
67 {
68 CAMERA_LOGD("test:ReceiveFrameOn enter");
69
70 if (camFrameExit_ == 1) {
71 camFrameExit_ = 0;
72 previewThreadId_ = new (std::nothrow) std::thread(&StreamCustomer::CamFrame, this, callback);
73 if (previewThreadId_ == nullptr) {
74 CAMERA_LOGE("test:ReceiveFrameOn failed\n");
75 return OHOS::Camera::RC_ERROR;
76 }
77 } else {
78 CAMERA_LOGD("test:ReceiveFrameOn loop thread is running\n");
79 }
80 CAMERA_LOGD("test:ReceiveFrameOn exit");
81
82 return OHOS::Camera::RC_OK;
83 }
84
ReceiveFrameOff()85 void StreamCustomer::ReceiveFrameOff()
86 {
87 CAMERA_LOGD("test:ReceiveFrameOff enter\n");
88
89 if (camFrameExit_ == 0) {
90 camFrameExit_ = 1;
91 if (previewThreadId_ != nullptr) {
92 previewThreadId_->join();
93 delete previewThreadId_;
94 previewThreadId_ = nullptr;
95 }
96 }
97
98 CAMERA_LOGD("test:ReceiveFrameOff exit\n");
99 }
100