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 19namespace OHOS::Camera { 20StreamCustomer::StreamCustomer() {} 21StreamCustomer::~StreamCustomer() {} 22 23void StreamCustomer::CamFrame(const std::function<void(void*, uint32_t)> callback) 24{ 25 CAMERA_LOGD("demo test:enter CamFrame thread ++ "); 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 if (callback != nullptr) { 51 int32_t gotSize = 0; 52 int32_t frameNum = 0; 53 int isKey = 0; 54 timestamp = 0; 55 buff->GetExtraData()->ExtraGet(OHOS::Camera::dataSize, gotSize); 56 buff->GetExtraData()->ExtraGet(OHOS::Camera::isKeyFrame, isKey); 57 buff->GetExtraData()->ExtraGet(OHOS::Camera::timeStamp, timestamp); 58 CAMERA_LOGE("demo test:CamFrame callback +++++++ Size == %d frameNum = %d timestamp == %lld\n", 59 gotSize, frameNum, timestamp); 60 callback(addr, gotSize); 61 } 62 consumer_->ReleaseBuffer(buff, -1); 63 } 64 usleep(delayTime); 65 } while (camFrameExit_ == 0); 66#endif 67 68 CAMERA_LOGD("demo test:Exiting CamFrame thread -- "); 69} 70 71#ifdef CAMERA_BUILT_ON_OHOS_LITE 72std::shared_ptr<OHOS::Surface> StreamCustomer::CreateProducer() 73#else 74sptr<OHOS::IBufferProducer> StreamCustomer::CreateProducer() 75#endif 76{ 77#ifdef CAMERA_BUILT_ON_OHOS_LITE 78 consumer_ = std::shared_ptr<OHOS::Surface>(OHOS::Surface::CreateSurface()); 79 if (consumer_ == nullptr) { 80 return nullptr; 81 } 82 return consumer_; 83#else 84 consumer_ = OHOS::IConsumerSurface::Create(); 85 if (consumer_ == nullptr) { 86 return nullptr; 87 } 88 sptr<IBufferConsumerListener> listener = new(std::nothrow) TestBuffersConsumerListener(); 89 consumer_->RegisterConsumerListener(listener); 90 91 auto producer = consumer_->GetProducer(); 92 if (producer == nullptr) { 93 return nullptr; 94 } 95 96 CAMERA_LOGI("demo test, create a buffer queue producer"); 97 return producer; 98#endif 99} 100 101RetCode StreamCustomer::ReceiveFrameOn(const std::function<void(void*, uint32_t)> callback) 102{ 103 CAMERA_LOGD("demo test:ReceiveFrameOn enter"); 104 105 if (camFrameExit_ == 1) { 106 camFrameExit_ = 0; 107 previewThreadId_ = new (std::nothrow) std::thread(&StreamCustomer::CamFrame, this, callback); 108 if (previewThreadId_ == nullptr) { 109 CAMERA_LOGE("demo test:ReceiveFrameOn failed"); 110 return OHOS::Camera::RC_ERROR; 111 } 112 } else { 113 CAMERA_LOGD("demo test:ReceiveFrameOn loop thread is running"); 114 } 115 CAMERA_LOGD("demo test:ReceiveFrameOn exit"); 116 117 return RC_OK; 118} 119 120void StreamCustomer::ReceiveFrameOff() 121{ 122 CAMERA_LOGD("demo test:ReceiveFrameOff enter"); 123 124 if (camFrameExit_ == 0) { 125 camFrameExit_ = 1; 126 if (previewThreadId_ != nullptr) { 127 previewThreadId_->join(); 128 delete previewThreadId_; 129 previewThreadId_ = nullptr; 130 } 131 } 132 133 CAMERA_LOGD("demo test:ReceiveFrameOff exit"); 134} 135} 136