blob: 5ac9472d4254405726350d1ad55a25bee1721e89 [file] [log] [blame]
/*
* Copyright (C) 2015-2020 Intel Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include "Parameters.h"
#include "CameraBuffer.h"
#include "BufferQueue.h"
#include "iutils/Thread.h"
namespace icamera {
/**
* CameraStream: The HAL represent of the application stream.
* CameraStream implement the BufferConsumer interface.
*
* CameraStream provide the buffer interface to application.
* It gets buffers from producers and returns to the app
*
* Application used the DQ buffer to get the buffers from Camera
* and Q buffer to return the buffers to camera.
*/
class CameraStream: public BufferConsumer, public EventSource {
public:
CameraStream(int cameraId, int streamId, const stream_t& stream);
virtual ~CameraStream();
/**
* \brief Set which port this stream is linked to.
*/
void setPort(Port port) { mPort = port; }
/**
* \brief get the port which the stream is linked to.
*/
Port getPort() { return mPort; }
/**
* \brief Set the StreamActive state
*/
int start();
/**
* \brief Clear streamActive state and clear up
* the buffer queue
*/
int stop();
/**
* \brief Push one CameraBuffer to bufferProducer
*/
int qbuf(camera_buffer_t *ubuffer, long sequence);
/**
* \brief Calling mBufferProducer to allocate memory
*
* \return OK if succeed and BAD_VALUE if failed
*/
int allocateMemory(camera_buffer_t *buffer);
std::shared_ptr<CameraBuffer> userBufferToCameraBuffer(camera_buffer_t *ubuffer);
/**
* \brief Wait all user buffers to be returned to user
*/
void waitToReturnAllUserBufffers();
/**
* \brief Register the mBufferProducer
*/
virtual void setBufferProducer(BufferProducer *producer);
/**
* \brief The notify when polled or processed one frame buffer
*/
virtual int onFrameAvailable(Port port, const std::shared_ptr<CameraBuffer> &camBuffer);
private:
static const nsecs_t kWaitDuration = 10000000000; //10000ms
int mCameraId;
int mStreamId;
Port mPort;
BufferProducer *mBufferProducer;
CameraBufVector mUserBuffersPool;
// Guard for member mUserBuffersPool, used in the qbuf which is critical for FPS
// Prevent qbuf and dqbuf to share the same lock
Mutex mBufferPoolLock;
// Siginal for the situation that all buffers returned to user
Condition mAllBuffersReturnedSignal;
// How many user buffers are currently processing underhood.
int mNumHoldingUserBuffers;
// Flag to indicate that currently waiting for all user buffers to be returned
bool mIsWaitingBufferReturn;
};
} //namespace icamera