[libcamera-devel,RFC,4/5] libcamera: stream: Add basic stream usage hints definitions

Message ID 20190402005332.25018-5-niklas.soderlund@ragnatech.se
State Superseded
Delegated to: Niklas Söderlund
Headers show
Series
  • libcamera: camera: Add support for stream usage hint
Related show

Commit Message

Niklas Söderlund April 2, 2019, 12:53 a.m. UTC
In preparation of reworking how a default configuration is retrieved
from a camera add stream usage hints. The hints will be used by
applications to describe how it intends to use a camera and replace the
Stream IDs role when retrieving default configuration from the camera
using streamConfiguration().

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
---
 include/libcamera/stream.h | 39 ++++++++++++++++++
 src/libcamera/stream.cpp   | 84 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 123 insertions(+)

Comments

Jacopo Mondi April 2, 2019, 7:59 a.m. UTC | #1
Hi Niklas,

On Tue, Apr 02, 2019 at 02:53:31AM +0200, Niklas Söderlund wrote:
> In preparation of reworking how a default configuration is retrieved
> from a camera add stream usage hints. The hints will be used by
> applications to describe how it intends to use a camera and replace the
> Stream IDs role when retrieving default configuration from the camera
> using streamConfiguration().
>
> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
> ---
>  include/libcamera/stream.h | 39 ++++++++++++++++++
>  src/libcamera/stream.cpp   | 84 ++++++++++++++++++++++++++++++++++++++
>  2 files changed, 123 insertions(+)
>
> diff --git a/include/libcamera/stream.h b/include/libcamera/stream.h
> index 3e8e83a2ff245879..445b80de66217934 100644
> --- a/include/libcamera/stream.h
> +++ b/include/libcamera/stream.h
> @@ -35,7 +35,46 @@ private:
>  	StreamConfiguration configuration_;
>  };
>
> +class StreamHint
> +{
> +public:
> +	enum Type {
> +		Viewfinder,
> +		Video,
> +		Still,

I would use all capitals, and lengthen 'video' and 'still' as
STILL_CAPTURE and VIDEO_CAPTURE

> +	};
>
> +	Type type() const { return type_; }

const Type &

> +
> +protected:
> +	StreamHint(Type type);
> +	StreamHint(Type type, StreamConfiguration hints);

&hints

> +
> +private:
> +	Type type_;
> +	StreamConfiguration hints_;

I would call the configuration descriptor of an hint 'config_' not
'hints_'.

> +};
> +
> +class Viewfinder : public StreamHint
> +{
> +public:
> +	Viewfinder(unsigned int width, unsigned int height);
> +
> +private:
> +	static StreamConfiguration initHints(unsigned int width, unsigned int height);
> +};
> +
> +class Video : public StreamHint
> +{
> +public:
> +	Video();
> +};
> +
> +class Still : public StreamHint
> +{
> +public:
> +	Still();
> +};

I would question if these hierarchy brings any benefit or it just
makes more complex adding new use cases.

As I immagined this, use case hints might just be an enumeration with
a configuration associated, ie. I don't think only viewfinder should
have associated sizes, but it should still be possible to specify a
max sizes for the other streams to make sure the selected streams
could provide that resolution. Furthermore the base class has a
configuration field, but it is only accessible for the viewfinder use
case, why that?

>
>  } /* namespace libcamera */
>
> diff --git a/src/libcamera/stream.cpp b/src/libcamera/stream.cpp
> index c4943c91b2e6ce13..32f26a1f8e6adb2c 100644
> --- a/src/libcamera/stream.cpp
> +++ b/src/libcamera/stream.cpp
> @@ -102,4 +102,88 @@ Stream::Stream()
>   * \return The active configuration of the stream
>   */
>
> +/**
> + * \class StreamHint
> + * \brief Stream usage hint information
> + *
> + * The StreamHint class carries information about stream usage hints from the
> + * application to a specific pipeline handler implementation. The pipeline
> + * handler shall take the usage hints into account when select which stream
> + * to use for the desired operation.

I would mention Camera not pipeline handlers here, as the interface
for applications using hints will be the Camera class.


> + */
> +
> +/**
> + * \enum StreamHint::Type
> + * \brief List of types of usage hints
> + */
> +
> +/**
> + * \fn StreamHint::type()
> + * \brief Retrieve the usage hint type

Don't we usually insert a blank line between \brief and \return?

> + * \return The hint type
> + */
> +
> +/**
> + * \brief Create a stream hint
> + * \param[in] type Stream hint type
> + */
> +StreamHint::StreamHint(Type type)
> +	: type_(type), hints_()
> +{
> +}
> +
> +/**
> + * \brief Create a stream hint with parameters
> + * \param[in] type Stream hint type
> + * \param[in] hints Stream hint parameters
> + */
> +StreamHint::StreamHint(Type type, StreamConfiguration hints)
> +	: type_(type), hints_(hints)
> +{
> +}
> +
> +/**
> + * \class Viewfinder
> + * \brief Stream usage hint for viewfinder
> + */
> +
> +/**
> + * \brief Create a viewfinder stream hint
> + * \param[in] width Desired view finder width

viewfinder

> + * \param[in] height Desired view finder height
> + */
> +Viewfinder::Viewfinder(unsigned int width, unsigned int height)
> +	: StreamHint(Type::Viewfinder, initHints(width, height))
> +{
> +}
> +
> +StreamConfiguration Viewfinder::initHints(unsigned int width,
> +					  unsigned int height)
> +{
> +	StreamConfiguration hints = {};
> +
> +	hints.width = width;
> +	hints.height = height;
> +
> +	return hints;
> +}

Is this necessary? Couldn't you just pass width and height to the base
class constructor and let it assign hints_.widht and hints_.height
without going through copies? Or you think they would be elided by
RVO everywhere here?

> +
> +/**
> + * \class Video
> + * \brief Stream usage hint for video
> + */
> +Video::Video()
> +	: StreamHint(Type::Video)
> +{
> +}
> +
> +/**
> + * \class Still
> + * \brief Stream usage hint for still images
> + */
> +Still::Still()
> +	: StreamHint(Type::Still)
> +{
> +}
> +
>  } /* namespace libcamera */
> --
> 2.21.0
>
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel@lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
Niklas Söderlund April 2, 2019, 12:02 p.m. UTC | #2
Hi Jacopo,

Thanks for your feedback.

On 2019-04-02 09:59:27 +0200, Jacopo Mondi wrote:
> Hi Niklas,
> 
> On Tue, Apr 02, 2019 at 02:53:31AM +0200, Niklas Söderlund wrote:
> > In preparation of reworking how a default configuration is retrieved
> > from a camera add stream usage hints. The hints will be used by
> > applications to describe how it intends to use a camera and replace the
> > Stream IDs role when retrieving default configuration from the camera
> > using streamConfiguration().
> >
> > Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
> > ---
> >  include/libcamera/stream.h | 39 ++++++++++++++++++
> >  src/libcamera/stream.cpp   | 84 ++++++++++++++++++++++++++++++++++++++
> >  2 files changed, 123 insertions(+)
> >
> > diff --git a/include/libcamera/stream.h b/include/libcamera/stream.h
> > index 3e8e83a2ff245879..445b80de66217934 100644
> > --- a/include/libcamera/stream.h
> > +++ b/include/libcamera/stream.h
> > @@ -35,7 +35,46 @@ private:
> >  	StreamConfiguration configuration_;
> >  };
> >
> > +class StreamHint
> > +{
> > +public:
> > +	enum Type {
> > +		Viewfinder,
> > +		Video,
> > +		Still,
> 
> I would use all capitals, and lengthen 'video' and 'still' as
> STILL_CAPTURE and VIDEO_CAPTURE

I don't agree I think it's better as is :-) As this is bike shedding 
territory I will yield to popular opinion. What to the rest of you 
think?

> 
> > +	};
> >
> > +	Type type() const { return type_; }
> 
> const Type &

Thanks.

> 
> > +
> > +protected:
> > +	StreamHint(Type type);
> > +	StreamHint(Type type, StreamConfiguration hints);
> 
> &hints

Thanks, will make this a const &.

> 
> > +
> > +private:
> > +	Type type_;
> > +	StreamConfiguration hints_;
> 
> I would call the configuration descriptor of an hint 'config_' not
> 'hints_'.

I tried that at first but it gave me a bad feeling as it's in fact not a 
configuration it's a hint of the configuration the user wish to use. I 
will keep this as hints_ for now.

I'm not even sure the type should be StreamConfiguration or if we should 
inline the variables we judge to be useful as hints. As we have no 
pipelines yet to experiment with making use of the hints I picked 
something to store the user provided hints in. Also note that there is 
currently no way for a pipeline handler to get hold of the content of 
hints_. This is by design to force me to do something here when we join 
this work with the stream properties :-)

> 
> > +};
> > +
> > +class Viewfinder : public StreamHint
> > +{
> > +public:
> > +	Viewfinder(unsigned int width, unsigned int height);
> > +
> > +private:
> > +	static StreamConfiguration initHints(unsigned int width, unsigned int height);
> > +};
> > +
> > +class Video : public StreamHint
> > +{
> > +public:
> > +	Video();
> > +};
> > +
> > +class Still : public StreamHint
> > +{
> > +public:
> > +	Still();
> > +};
> 
> I would question if these hierarchy brings any benefit or it just
> makes more complex adding new use cases.

I don't think we will add use cases all that much. The main reason I 
went with this design is to make it easier for applications to use the 
interface.

    foo->streamConfiguration({ Viewfinder(640,480), Still() });

Is quiet nice to use instead of having to create raw StreamHint objects 
and configure them. It also gives us a bit more of control, with this 
design we can force any hint for a Viewfinder to supply a hint for the 
resolution while if we allowed raw StreamHint creation pipeline handers 
would need to be prepared to handle them both with and without that 
information.

I expect his area will change a lot as we move forward, both based on 
needs from applications and implementations in pipeline handlers. In 
this RFC I have only parameterized the viewfinder hint as it's quiet 
clear dimensions would be part of its hints. I expect Video and Still to 
be parameterized in the near future.

> 
> As I immagined this, use case hints might just be an enumeration with
> a configuration associated, ie. I don't think only viewfinder should
> have associated sizes, but it should still be possible to specify a
> max sizes for the other streams to make sure the selected streams
> could provide that resolution. Furthermore the base class has a
> configuration field, but it is only accessible for the viewfinder use
> case, why that?
> 
> >
> >  } /* namespace libcamera */
> >
> > diff --git a/src/libcamera/stream.cpp b/src/libcamera/stream.cpp
> > index c4943c91b2e6ce13..32f26a1f8e6adb2c 100644
> > --- a/src/libcamera/stream.cpp
> > +++ b/src/libcamera/stream.cpp
> > @@ -102,4 +102,88 @@ Stream::Stream()
> >   * \return The active configuration of the stream
> >   */
> >
> > +/**
> > + * \class StreamHint
> > + * \brief Stream usage hint information
> > + *
> > + * The StreamHint class carries information about stream usage hints from the
> > + * application to a specific pipeline handler implementation. The pipeline
> > + * handler shall take the usage hints into account when select which stream
> > + * to use for the desired operation.
> 
> I would mention Camera not pipeline handlers here, as the interface
> for applications using hints will be the Camera class.

The Camera don't make use of the hints it only forwards them to the 
pipeline handler. I think it's correct to describe that here, that the 
expectation is that the pipeline handler is responsible to make good use 
of the hints.

> 
> 
> > + */
> > +
> > +/**
> > + * \enum StreamHint::Type
> > + * \brief List of types of usage hints
> > + */
> > +
> > +/**
> > + * \fn StreamHint::type()
> > + * \brief Retrieve the usage hint type
> 
> Don't we usually insert a blank line between \brief and \return?

We do, will fix for next version. Thanks.

> 
> > + * \return The hint type
> > + */
> > +
> > +/**
> > + * \brief Create a stream hint
> > + * \param[in] type Stream hint type
> > + */
> > +StreamHint::StreamHint(Type type)
> > +	: type_(type), hints_()
> > +{
> > +}
> > +
> > +/**
> > + * \brief Create a stream hint with parameters
> > + * \param[in] type Stream hint type
> > + * \param[in] hints Stream hint parameters
> > + */
> > +StreamHint::StreamHint(Type type, StreamConfiguration hints)
> > +	: type_(type), hints_(hints)
> > +{
> > +}
> > +
> > +/**
> > + * \class Viewfinder
> > + * \brief Stream usage hint for viewfinder
> > + */
> > +
> > +/**
> > + * \brief Create a viewfinder stream hint
> > + * \param[in] width Desired view finder width
> 
> viewfinder

Thanks.

> 
> > + * \param[in] height Desired view finder height
> > + */
> > +Viewfinder::Viewfinder(unsigned int width, unsigned int height)
> > +	: StreamHint(Type::Viewfinder, initHints(width, height))
> > +{
> > +}
> > +
> > +StreamConfiguration Viewfinder::initHints(unsigned int width,
> > +					  unsigned int height)
> > +{
> > +	StreamConfiguration hints = {};
> > +
> > +	hints.width = width;
> > +	hints.height = height;
> > +
> > +	return hints;
> > +}
> 
> Is this necessary? Couldn't you just pass width and height to the base
> class constructor and let it assign hints_.widht and hints_.height
> without going through copies? Or you think they would be elided by
> RVO everywhere here?

I'm not concerned about the var being copied anywhere. My rational for 
using this is as we move forward I think these static initializer 
functions to be moved to StreamHints and used by other stream usage 
hint implementations.

> 
> > +
> > +/**
> > + * \class Video
> > + * \brief Stream usage hint for video
> > + */
> > +Video::Video()
> > +	: StreamHint(Type::Video)
> > +{
> > +}
> > +
> > +/**
> > + * \class Still
> > + * \brief Stream usage hint for still images
> > + */
> > +Still::Still()
> > +	: StreamHint(Type::Still)
> > +{
> > +}
> > +
> >  } /* namespace libcamera */
> > --
> > 2.21.0
> >
> > _______________________________________________
> > libcamera-devel mailing list
> > libcamera-devel@lists.libcamera.org
> > https://lists.libcamera.org/listinfo/libcamera-devel
Laurent Pinchart April 2, 2019, 2:35 p.m. UTC | #3
Hi Niklas,

Thank you for the patch.

On Tue, Apr 02, 2019 at 02:53:31AM +0200, Niklas Söderlund wrote:
> In preparation of reworking how a default configuration is retrieved
> from a camera add stream usage hints. The hints will be used by
> applications to describe how it intends to use a camera and replace the
> Stream IDs role when retrieving default configuration from the camera
> using streamConfiguration().
> 
> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
> ---
>  include/libcamera/stream.h | 39 ++++++++++++++++++
>  src/libcamera/stream.cpp   | 84 ++++++++++++++++++++++++++++++++++++++
>  2 files changed, 123 insertions(+)
> 
> diff --git a/include/libcamera/stream.h b/include/libcamera/stream.h
> index 3e8e83a2ff245879..445b80de66217934 100644
> --- a/include/libcamera/stream.h
> +++ b/include/libcamera/stream.h
> @@ -35,7 +35,46 @@ private:
>  	StreamConfiguration configuration_;
>  };
>  
> +class StreamHint

Should we name this StreamUsage instead ? I'm not sure the word "hint"
is a really good fit for the API, as these are more than hints. In any
case it would be usage hints, so I think StreamUsage is better than
StreamHint, and StreamUsageHint seems a bit too long.

> +{
> +public:
> +	enum Type {

Maybe Role instead or Type ?

> +		Viewfinder,
> +		Video,
> +		Still,

You could go for VideoRecording and StillCapture, to be a bit more
descriptive.

> +	};
>  
> +	Type type() const { return type_; }
> +
> +protected:
> +	StreamHint(Type type);
> +	StreamHint(Type type, StreamConfiguration hints);

Doesn't this abuse the StreamConfiguration class a bit, shouldn't we use
a size (or possibly format) class ?

> +
> +private:
> +	Type type_;
> +	StreamConfiguration hints_;
> +};
> +
> +class Viewfinder : public StreamHint
> +{
> +public:
> +	Viewfinder(unsigned int width, unsigned int height);
> +
> +private:
> +	static StreamConfiguration initHints(unsigned int width, unsigned int height);

A bit overkill in my opinion, I don't think we need this helper.

> +};
> +
> +class Video : public StreamHint
> +{
> +public:
> +	Video();
> +};
> +
> +class Still : public StreamHint
> +{
> +public:
> +	Still();
> +};

Those are very generic names, and may lead to namespace clashes. You
could isolate them in a separate namespace (possibly moving them to the
Stream class), or rename them to StreamUsageViewfinder,
StreamUsageVideoRecording and StreamUsageStillCapture.

I like this overall, but I wonder if it's really worth subclassing
StreamHint.

>  
>  } /* namespace libcamera */
>  
> diff --git a/src/libcamera/stream.cpp b/src/libcamera/stream.cpp
> index c4943c91b2e6ce13..32f26a1f8e6adb2c 100644
> --- a/src/libcamera/stream.cpp
> +++ b/src/libcamera/stream.cpp
> @@ -102,4 +102,88 @@ Stream::Stream()
>   * \return The active configuration of the stream
>   */
>  
> +/**
> + * \class StreamHint
> + * \brief Stream usage hint information
> + *
> + * The StreamHint class carries information about stream usage hints from the
> + * application to a specific pipeline handler implementation. The pipeline
> + * handler shall take the usage hints into account when select which stream
> + * to use for the desired operation.
> + */
> +
> +/**
> + * \enum StreamHint::Type
> + * \brief List of types of usage hints
> + */
> +
> +/**
> + * \fn StreamHint::type()
> + * \brief Retrieve the usage hint type
> + * \return The hint type
> + */
> +
> +/**
> + * \brief Create a stream hint
> + * \param[in] type Stream hint type
> + */
> +StreamHint::StreamHint(Type type)
> +	: type_(type), hints_()
> +{
> +}
> +
> +/**
> + * \brief Create a stream hint with parameters
> + * \param[in] type Stream hint type
> + * \param[in] hints Stream hint parameters
> + */
> +StreamHint::StreamHint(Type type, StreamConfiguration hints)
> +	: type_(type), hints_(hints)
> +{
> +}
> +
> +/**
> + * \class Viewfinder
> + * \brief Stream usage hint for viewfinder
> + */
> +
> +/**
> + * \brief Create a viewfinder stream hint
> + * \param[in] width Desired view finder width
> + * \param[in] height Desired view finder height
> + */
> +Viewfinder::Viewfinder(unsigned int width, unsigned int height)
> +	: StreamHint(Type::Viewfinder, initHints(width, height))
> +{
> +}
> +
> +StreamConfiguration Viewfinder::initHints(unsigned int width,
> +					  unsigned int height)
> +{
> +	StreamConfiguration hints = {};
> +
> +	hints.width = width;
> +	hints.height = height;
> +
> +	return hints;
> +}
> +
> +/**
> + * \class Video
> + * \brief Stream usage hint for video
> + */
> +Video::Video()
> +	: StreamHint(Type::Video)
> +{
> +}
> +
> +/**
> + * \class Still
> + * \brief Stream usage hint for still images
> + */
> +Still::Still()
> +	: StreamHint(Type::Still)
> +{
> +}
> +
>  } /* namespace libcamera */
Laurent Pinchart April 2, 2019, 2:42 p.m. UTC | #4
Hello,

On Tue, Apr 02, 2019 at 02:02:14PM +0200, Niklas Söderlund wrote:
> On 2019-04-02 09:59:27 +0200, Jacopo Mondi wrote:
> > On Tue, Apr 02, 2019 at 02:53:31AM +0200, Niklas Söderlund wrote:
> >> In preparation of reworking how a default configuration is retrieved
> >> from a camera add stream usage hints. The hints will be used by
> >> applications to describe how it intends to use a camera and replace the
> >> Stream IDs role when retrieving default configuration from the camera
> >> using streamConfiguration().
> >>
> >> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
> >> ---
> >>  include/libcamera/stream.h | 39 ++++++++++++++++++
> >>  src/libcamera/stream.cpp   | 84 ++++++++++++++++++++++++++++++++++++++
> >>  2 files changed, 123 insertions(+)
> >>
> >> diff --git a/include/libcamera/stream.h b/include/libcamera/stream.h
> >> index 3e8e83a2ff245879..445b80de66217934 100644
> >> --- a/include/libcamera/stream.h
> >> +++ b/include/libcamera/stream.h
> >> @@ -35,7 +35,46 @@ private:
> >>  	StreamConfiguration configuration_;
> >>  };
> >>
> >> +class StreamHint
> >> +{
> >> +public:
> >> +	enum Type {
> >> +		Viewfinder,
> >> +		Video,
> >> +		Still,
> > 
> > I would use all capitals, and lengthen 'video' and 'still' as
> > STILL_CAPTURE and VIDEO_CAPTURE
> 
> I don't agree I think it's better as is :-) As this is bike shedding 
> territory I will yield to popular opinion. What to the rest of you 
> think?

All our enums use CamelCase.

> > 
> >> +	};
> >>
> >> +	Type type() const { return type_; }
> > 
> > const Type &
> 
> Thanks.

A bit overkill as Type is just an integer...

> >> +
> >> +protected:
> >> +	StreamHint(Type type);
> >> +	StreamHint(Type type, StreamConfiguration hints);
> > 
> > &hints
> 
> Thanks, will make this a const &.

Not overkill at all :-)

> >> +
> >> +private:
> >> +	Type type_;
> >> +	StreamConfiguration hints_;
> > 
> > I would call the configuration descriptor of an hint 'config_' not
> > 'hints_'.
> 
> I tried that at first but it gave me a bad feeling as it's in fact not a 
> configuration it's a hint of the configuration the user wish to use. I 
> will keep this as hints_ for now.
> 
> I'm not even sure the type should be StreamConfiguration or if we should 
> inline the variables we judge to be useful as hints. As we have no 
> pipelines yet to experiment with making use of the hints I picked 
> something to store the user provided hints in. Also note that there is 
> currently no way for a pipeline handler to get hold of the content of 
> hints_. This is by design to force me to do something here when we join 
> this work with the stream properties :-)
> 
> >> +};
> >> +
> >> +class Viewfinder : public StreamHint
> >> +{
> >> +public:
> >> +	Viewfinder(unsigned int width, unsigned int height);
> >> +
> >> +private:
> >> +	static StreamConfiguration initHints(unsigned int width, unsigned int height);
> >> +};
> >> +
> >> +class Video : public StreamHint
> >> +{
> >> +public:
> >> +	Video();
> >> +};
> >> +
> >> +class Still : public StreamHint
> >> +{
> >> +public:
> >> +	Still();
> >> +};
> > 
> > I would question if these hierarchy brings any benefit or it just
> > makes more complex adding new use cases.
> 
> I don't think we will add use cases all that much. The main reason I 
> went with this design is to make it easier for applications to use the 
> interface.
> 
>     foo->streamConfiguration({ Viewfinder(640,480), Still() });

I pondered the same as Jacopo, but reading this feels quite nice...

> Is quiet nice to use instead of having to create raw StreamHint objects 
> and configure them. It also gives us a bit more of control, with this 
> design we can force any hint for a Viewfinder to supply a hint for the 
> resolution while if we allowed raw StreamHint creation pipeline handers 
> would need to be prepared to handle them both with and without that 
> information.

You're right, in the end the API is less error-prone. We may end up
reconsidering this though, if the stream usages require more flexibility
than what could easily be handled through parameters to the
constructors.

> I expect his area will change a lot as we move forward, both based on 
> needs from applications and implementations in pipeline handlers. In 
> this RFC I have only parameterized the viewfinder hint as it's quiet 
> clear dimensions would be part of its hints. I expect Video and Still to 
> be parameterized in the near future.
> 
> > As I immagined this, use case hints might just be an enumeration with
> > a configuration associated, ie. I don't think only viewfinder should
> > have associated sizes, but it should still be possible to specify a
> > max sizes for the other streams to make sure the selected streams
> > could provide that resolution. Furthermore the base class has a
> > configuration field, but it is only accessible for the viewfinder use
> > case, why that?
> > 
> >>
> >>  } /* namespace libcamera */
> >>
> >> diff --git a/src/libcamera/stream.cpp b/src/libcamera/stream.cpp
> >> index c4943c91b2e6ce13..32f26a1f8e6adb2c 100644
> >> --- a/src/libcamera/stream.cpp
> >> +++ b/src/libcamera/stream.cpp
> >> @@ -102,4 +102,88 @@ Stream::Stream()
> >>   * \return The active configuration of the stream
> >>   */
> >>
> >> +/**
> >> + * \class StreamHint
> >> + * \brief Stream usage hint information
> >> + *
> >> + * The StreamHint class carries information about stream usage hints from the
> >> + * application to a specific pipeline handler implementation. The pipeline
> >> + * handler shall take the usage hints into account when select which stream
> >> + * to use for the desired operation.
> > 
> > I would mention Camera not pipeline handlers here, as the interface
> > for applications using hints will be the Camera class.
> 
> The Camera don't make use of the hints it only forwards them to the 
> pipeline handler. I think it's correct to describe that here, that the 
> expectation is that the pipeline handler is responsible to make good use 
> of the hints.

Note that usage hints are public API, while pipeline handlers are purely
internal. I'm with Jacopo on this one, I wouldn't mention pipeline
handlers in the documentation of public classes.

> >> + */
> >> +
> >> +/**
> >> + * \enum StreamHint::Type
> >> + * \brief List of types of usage hints
> >> + */
> >> +
> >> +/**
> >> + * \fn StreamHint::type()
> >> + * \brief Retrieve the usage hint type
> > 
> > Don't we usually insert a blank line between \brief and \return?
> 
> We do, will fix for next version. Thanks.
> 
> >> + * \return The hint type
> >> + */
> >> +
> >> +/**
> >> + * \brief Create a stream hint
> >> + * \param[in] type Stream hint type
> >> + */
> >> +StreamHint::StreamHint(Type type)
> >> +	: type_(type), hints_()
> >> +{
> >> +}
> >> +
> >> +/**
> >> + * \brief Create a stream hint with parameters
> >> + * \param[in] type Stream hint type
> >> + * \param[in] hints Stream hint parameters
> >> + */
> >> +StreamHint::StreamHint(Type type, StreamConfiguration hints)
> >> +	: type_(type), hints_(hints)
> >> +{
> >> +}
> >> +
> >> +/**
> >> + * \class Viewfinder
> >> + * \brief Stream usage hint for viewfinder
> >> + */
> >> +
> >> +/**
> >> + * \brief Create a viewfinder stream hint
> >> + * \param[in] width Desired view finder width
> > 
> > viewfinder
> 
> Thanks.
> 
> >> + * \param[in] height Desired view finder height
> >> + */
> >> +Viewfinder::Viewfinder(unsigned int width, unsigned int height)
> >> +	: StreamHint(Type::Viewfinder, initHints(width, height))
> >> +{
> >> +}
> >> +
> >> +StreamConfiguration Viewfinder::initHints(unsigned int width,
> >> +					  unsigned int height)
> >> +{
> >> +	StreamConfiguration hints = {};
> >> +
> >> +	hints.width = width;
> >> +	hints.height = height;
> >> +
> >> +	return hints;
> >> +}
> > 
> > Is this necessary? Couldn't you just pass width and height to the base
> > class constructor and let it assign hints_.widht and hints_.height
> > without going through copies? Or you think they would be elided by
> > RVO everywhere here?
> 
> I'm not concerned about the var being copied anywhere. My rational for 
> using this is as we move forward I think these static initializer 
> functions to be moved to StreamHints and used by other stream usage 
> hint implementations.
> 
> >> +
> >> +/**
> >> + * \class Video
> >> + * \brief Stream usage hint for video
> >> + */
> >> +Video::Video()
> >> +	: StreamHint(Type::Video)
> >> +{
> >> +}
> >> +
> >> +/**
> >> + * \class Still
> >> + * \brief Stream usage hint for still images
> >> + */
> >> +Still::Still()
> >> +	: StreamHint(Type::Still)
> >> +{
> >> +}
> >> +
> >>  } /* namespace libcamera */
Niklas Söderlund April 2, 2019, 11:40 p.m. UTC | #5
Hi Laurent,

Thanks for your feedback.

On 2019-04-02 17:35:47 +0300, Laurent Pinchart wrote:
> > +};
> > +
> > +class Video : public StreamHint
> > +{
> > +public:
> > +	Video();
> > +};
> > +
> > +class Still : public StreamHint
> > +{
> > +public:
> > +	Still();
> > +};
> 
> Those are very generic names, and may lead to namespace clashes. You
> could isolate them in a separate namespace (possibly moving them to the
> Stream class), or rename them to StreamUsageViewfinder,
> StreamUsageVideoRecording and StreamUsageStillCapture.

I wrestled a lot with how to best handle this, for next version I went 
with moving the subclasses inside Stream class as it seems create then 
nicest interface for applications to use. Lets see how it works out.

Patch

diff --git a/include/libcamera/stream.h b/include/libcamera/stream.h
index 3e8e83a2ff245879..445b80de66217934 100644
--- a/include/libcamera/stream.h
+++ b/include/libcamera/stream.h
@@ -35,7 +35,46 @@  private:
 	StreamConfiguration configuration_;
 };
 
+class StreamHint
+{
+public:
+	enum Type {
+		Viewfinder,
+		Video,
+		Still,
+	};
 
+	Type type() const { return type_; }
+
+protected:
+	StreamHint(Type type);
+	StreamHint(Type type, StreamConfiguration hints);
+
+private:
+	Type type_;
+	StreamConfiguration hints_;
+};
+
+class Viewfinder : public StreamHint
+{
+public:
+	Viewfinder(unsigned int width, unsigned int height);
+
+private:
+	static StreamConfiguration initHints(unsigned int width, unsigned int height);
+};
+
+class Video : public StreamHint
+{
+public:
+	Video();
+};
+
+class Still : public StreamHint
+{
+public:
+	Still();
+};
 
 } /* namespace libcamera */
 
diff --git a/src/libcamera/stream.cpp b/src/libcamera/stream.cpp
index c4943c91b2e6ce13..32f26a1f8e6adb2c 100644
--- a/src/libcamera/stream.cpp
+++ b/src/libcamera/stream.cpp
@@ -102,4 +102,88 @@  Stream::Stream()
  * \return The active configuration of the stream
  */
 
+/**
+ * \class StreamHint
+ * \brief Stream usage hint information
+ *
+ * The StreamHint class carries information about stream usage hints from the
+ * application to a specific pipeline handler implementation. The pipeline
+ * handler shall take the usage hints into account when select which stream
+ * to use for the desired operation.
+ */
+
+/**
+ * \enum StreamHint::Type
+ * \brief List of types of usage hints
+ */
+
+/**
+ * \fn StreamHint::type()
+ * \brief Retrieve the usage hint type
+ * \return The hint type
+ */
+
+/**
+ * \brief Create a stream hint
+ * \param[in] type Stream hint type
+ */
+StreamHint::StreamHint(Type type)
+	: type_(type), hints_()
+{
+}
+
+/**
+ * \brief Create a stream hint with parameters
+ * \param[in] type Stream hint type
+ * \param[in] hints Stream hint parameters
+ */
+StreamHint::StreamHint(Type type, StreamConfiguration hints)
+	: type_(type), hints_(hints)
+{
+}
+
+/**
+ * \class Viewfinder
+ * \brief Stream usage hint for viewfinder
+ */
+
+/**
+ * \brief Create a viewfinder stream hint
+ * \param[in] width Desired view finder width
+ * \param[in] height Desired view finder height
+ */
+Viewfinder::Viewfinder(unsigned int width, unsigned int height)
+	: StreamHint(Type::Viewfinder, initHints(width, height))
+{
+}
+
+StreamConfiguration Viewfinder::initHints(unsigned int width,
+					  unsigned int height)
+{
+	StreamConfiguration hints = {};
+
+	hints.width = width;
+	hints.height = height;
+
+	return hints;
+}
+
+/**
+ * \class Video
+ * \brief Stream usage hint for video
+ */
+Video::Video()
+	: StreamHint(Type::Video)
+{
+}
+
+/**
+ * \class Still
+ * \brief Stream usage hint for still images
+ */
+Still::Still()
+	: StreamHint(Type::Still)
+{
+}
+
 } /* namespace libcamera */