android: camera_stream: Delegate Encoder construction

Delegate the construction of the encoder to the CameraStream class
for streams that need post-processing.

Reviewed-by: Umang Jain <email@uajain.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
This commit is contained in:
Jacopo Mondi 2020-10-02 19:40:42 +02:00
parent 94c4d49ebe
commit 3c84d88193
3 changed files with 26 additions and 17 deletions

View file

@ -1273,19 +1273,7 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
StreamConfiguration &cfg = config_->at(index);
/*
* Construct a software encoder for the MJPEG streams from the
* chosen libcamera source stream.
*/
Encoder *encoder = new EncoderLibJpeg();
int ret = encoder->configure(cfg);
if (ret) {
LOG(HAL, Error) << "Failed to configure encoder";
delete encoder;
return ret;
}
streams_.emplace_back(formats::MJPEG, cfg.size, type, index, encoder);
streams_.emplace_back(formats::MJPEG, cfg.size, type, index);
jpegStream->priv = static_cast<void *>(&streams_.back());
}
@ -1306,11 +1294,20 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
return -EINVAL;
}
/*
* Configure the HAL CameraStream instances using the associated
* StreamConfiguration and set the number of required buffers in
* the Android camera3_stream_t.
*/
for (unsigned int i = 0; i < stream_list->num_streams; ++i) {
camera3_stream_t *stream = stream_list->streams[i];
CameraStream *cameraStream = static_cast<CameraStream *>(stream->priv);
StreamConfiguration &cfg = config_->at(cameraStream->index());
int ret = cameraStream->configure(cfg);
if (ret)
return ret;
/* Use the bufferCount confirmed by the validation process. */
stream->max_buffers = cfg.bufferCount;
}

View file

@ -8,11 +8,21 @@
#include "camera_stream.h"
#include "jpeg/encoder.h"
#include "jpeg/encoder_libjpeg.h"
using namespace libcamera;
CameraStream::CameraStream(PixelFormat format, Size size,
Type type, unsigned int index, Encoder *encoder)
: format_(format), size_(size), type_(type), index_(index), encoder_(encoder)
CameraStream::CameraStream(PixelFormat format, Size size, Type type, unsigned int index)
: format_(format), size_(size), type_(type), index_(index)
{
if (type_ == Type::Internal || type_ == Type::Mapped)
encoder_ = std::make_unique<EncoderLibJpeg>();
}
int CameraStream::configure(const libcamera::StreamConfiguration &cfg)
{
if (encoder_)
return encoder_->configure(cfg);
return 0;
}

View file

@ -100,7 +100,7 @@ public:
Mapped,
};
CameraStream(libcamera::PixelFormat format, libcamera::Size size,
Type type, unsigned int index, Encoder *encoder = nullptr);
Type type, unsigned int index);
const libcamera::PixelFormat &format() const { return format_; }
const libcamera::Size &size() const { return size_; }
@ -108,6 +108,8 @@ public:
unsigned int index() const { return index_; }
Encoder *encoder() const { return encoder_.get(); }
int configure(const libcamera::StreamConfiguration &cfg);
private:
libcamera::PixelFormat format_;
libcamera::Size size_;