[FFmpeg-devel] [PATCH 1/2] lavf: add control message API
Lukasz M
lukasz.m.luki at gmail.com
Sun Jan 19 17:33:26 CET 2014
On 19 January 2014 12:21, Nicolas George <george at nsup.org> wrote:
> Le decadi 30 nivôse, an CCXXII, Lukasz Marek a écrit :
> > New API allows communication between application and devices.
> >
> > Signed-off-by: Lukasz Marek <lukasz.m.luki at gmail.com>
> > ---
> > libavdevice/avdevice.c | 10 +++++++
> > libavdevice/avdevice.h | 13 +++++++++
> > libavdevice/version.h | 2 +-
> > libavformat/avformat.h | 71
> ++++++++++++++++++++++++++++++++++++++++++++++++++
> > libavformat/mux.c | 10 +++++++
> > libavformat/utils.c | 2 ++
> > libavformat/version.h | 2 +-
> > 7 files changed, 108 insertions(+), 2 deletions(-)
> >
> > diff --git a/libavdevice/avdevice.c b/libavdevice/avdevice.c
> > index b9b18f2..2773653 100644
> > --- a/libavdevice/avdevice.c
> > +++ b/libavdevice/avdevice.c
> > @@ -36,3 +36,13 @@ const char * avdevice_license(void)
> > #define LICENSE_PREFIX "libavdevice license: "
> > return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
> > }
> > +
> > +int avdevice_control_message(struct AVFormatContext *s, enum
> AVDeviceMessageType type,
> > + void *data, size_t data_size)
> > +{
> > + if (!s->control_message_cb)
> > + return AVERROR(ENOSYS);
> > + if (type < AV_CTL_FIRST)
> > + return AVERROR(EINVAL);
> > + return s->control_message_cb(s, type, data, data_size);
> > +}
> > diff --git a/libavdevice/avdevice.h b/libavdevice/avdevice.h
> > index 93a044f..cdf26fd 100644
> > --- a/libavdevice/avdevice.h
> > +++ b/libavdevice/avdevice.h
> > @@ -66,4 +66,17 @@ const char *avdevice_license(void);
> > */
> > void avdevice_register_all(void);
> >
> > +/**
> > + * Send control message to application.
> > + *
> > + * @param s device context
> > + * @param type message type.
> > + * @param data message data. Can be NULL.
> > + * @param data_size size of message data.
> > + * @return 0 on success, negative on error.
> > + * AVERROR(EBADMSG) when application doesn't implement handler
> of the message.
> > + */
> > +int avdevice_control_message(struct AVFormatContext *s, enum
> AVDeviceMessageType type,
> > + void *data, size_t data_size);
> > +
> > #endif /* AVDEVICE_AVDEVICE_H */
> > diff --git a/libavdevice/version.h b/libavdevice/version.h
> > index d569fae..84f013d 100644
> > --- a/libavdevice/version.h
> > +++ b/libavdevice/version.h
> > @@ -29,7 +29,7 @@
> >
>
> > #define LIBAVDEVICE_VERSION_MAJOR 55
> > #define LIBAVDEVICE_VERSION_MINOR 5
> > -#define LIBAVDEVICE_VERSION_MICRO 102
> > +#define LIBAVDEVICE_VERSION_MICRO 103
>
> Unless I am mistaken, it should be a minor bump.
>
> >
> > #define LIBAVDEVICE_VERSION_INT
> AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \
> >
> LIBAVDEVICE_VERSION_MINOR, \
> > diff --git a/libavformat/avformat.h b/libavformat/avformat.h
> > index 6d719d7..0cf3d22 100644
> > --- a/libavformat/avformat.h
> > +++ b/libavformat/avformat.h
> > @@ -380,6 +380,37 @@ typedef struct AVProbeData {
> > #define AVFMT_SEEK_TO_PTS 0x4000000 /**< Seeking is based on PTS */
> >
>
> > /**
> > + * Structure with data for AV_DEVICE_WINDOW_CREATED message.
> > + */
> > +typedef struct AVDeviceWindowCreated {
> > + int width; //< window width
> > + int height; //< window height
> > +} AVDeviceWindowCreated;
> > +
> > +/**
> > + * Structure with data for AV_DEVICE_WINDOW_RESIZED message.
> > + */
> > +typedef struct AVDeviceWindowResized {
> > + int width; //< new width
> > + int height; //< new height
> > +} AVDeviceWindowResized;
>
> Looks redudant: a simple AVDeviceWindowGeometry structure would work for
> both.
>
> > +
> > +/**
> > + * Message types used by avformat_control_message and
> avdevice_control_message.
> > + */
> > +enum AVDeviceMessageType {
>
> It looks that this structure mixes several distinct APIs:
>
> > + AV_DEVICE_NONE,
> > + AV_DEVICE_WINDOW_CREATED, //< Window
> created message
> > + AV_DEVICE_WINDOW_RESIZED, //< Window
> resized message
> > + AV_DEVICE_WINDOW_REPAINT, //< Repaint
> request
>
> These are messages from the application to the library, meant for
> AVOutputFormat.control_message().
>
> > + AV_CTL_FIRST = 10000, //< Messages
> sent to application
> > + AV_CTL_MESSAGE_PREPARE_WINDOW_BUFFER = 10000, //<
> Application is asked to prepare buffer for rendering
> > + AV_CTL_MESSAGE_DISPLAY_WINDOW_BUFFER, //<
> Application is asked to present buffer to the user
> > + AV_CTL_MESSAGE_CREATE_WINDOW_BUFFER, //<
> Application is asked to create buffer
> > + AV_CTL_MESSAGE_DESTROY_WINDOW_BUFFER //<
> Application is asked to release buffer
> > +};
>
> These are messages from the library to the application, meant for
> AVFormatContext.control_message_cb().
>
> IMHO, a different enum type should be used for the different kind of
> messages.
>
> In fact, I would suggest to split this patch in two parts along that line.
>
> Also, maybe using fourccs for the enum values would be a bit more
> future-proof: AV_DEVICE_WINDOW_GEOMETRY = MKBETAG('G','E','O','M').
>
> > +
> > +/**
> > * @addtogroup lavf_encoding
> > * @{
> > */
> > @@ -453,6 +484,11 @@ typedef struct AVOutputFormat {
> >
> > void (*get_output_timestamp)(struct AVFormatContext *s, int stream,
> > int64_t *dts, int64_t *wall);
> > + /**
> > + * Allows sending messages from application to device.
> > + */
> > + int (*control_message)(struct AVFormatContext *s, enum
> AVDeviceMessageType type,
> > + void *data, size_t data_size);
> > } AVOutputFormat;
> > /**
> > * @}
> > @@ -948,6 +984,13 @@ typedef struct AVChapter {
> >
> >
> > /**
> > + * Callback used by devices to communicate with application.
> > + */
> > +typedef int (*av_format_control_message)(struct AVFormatContext *s,
> enum AVDeviceMessageType type,
> > + void *data, size_t data_size);
> > +
> > +
> > +/**
> > * The duration of a video can be estimated through various ways, and
> this enum can be used
> > * to know how the duration was estimated.
> > */
> > @@ -1348,6 +1391,17 @@ typedef struct AVFormatContext {
> > * Demuxing: Set by user via av_format_set_subtitle_codec (NO
> direct access).
> > */
> > AVCodec *subtitle_codec;
> > +
> > + /**
> > + * User data.
> > + */
> > + void *opaque;
> > +
> > + /**
> > + * Callback used by devices to communicate with application.
> > + */
> > + av_format_control_message control_message_cb;
> > +
> > } AVFormatContext;
> >
> > int av_format_get_probe_score(const AVFormatContext *s);
> > @@ -1357,6 +1411,10 @@ AVCodec * av_format_get_audio_codec(const
> AVFormatContext *s);
> > void av_format_set_audio_codec(AVFormatContext *s, AVCodec *c);
> > AVCodec * av_format_get_subtitle_codec(const AVFormatContext *s);
> > void av_format_set_subtitle_codec(AVFormatContext *s, AVCodec *c);
> > +void * av_format_get_opaque(const AVFormatContext *s);
> > +void av_format_set_opaque(AVFormatContext *s, void *opaque);
> > +av_format_control_message av_format_get_control_message_cb(const
> AVFormatContext *s);
> > +void av_format_set_control_message_cb(AVFormatContext *s,
> av_format_control_message callback);
> >
> > /**
> > * Returns the method used to set ctx->duration.
> > @@ -1959,6 +2017,19 @@ enum AVCodecID av_guess_codec(AVOutputFormat
> *fmt, const char *short_name,
> > int av_get_output_timestamp(struct AVFormatContext *s, int stream,
> > int64_t *dts, int64_t *wall);
> >
> > +/**
> > + * Send control message to device.
> > + *
> > + * @param s device context
> > + * @param type message type.
> > + * @param data message data. Can be NULL.
> > + * @param data_size size of message data.
> > + * @return 0 on success, negative on error.
> > + * AVERROR(EBADMSG) when device doesn't implement handler of
> the message.
> > + */
>
> > +int avformat_control_message(struct AVFormatContext *s, enum
> AVDeviceMessageType type,
> > + void *data, size_t data_size);
>
> Some of the functions live in the avformat namespace, and some in the
> avdevice namespace, this is a bit confusing.
>
> > +
> >
> > /**
> > * @}
> > diff --git a/libavformat/mux.c b/libavformat/mux.c
> > index bd50191..46796d1 100644
> > --- a/libavformat/mux.c
> > +++ b/libavformat/mux.c
> > @@ -850,6 +850,16 @@ int av_get_output_timestamp(struct AVFormatContext
> *s, int stream,
> > return 0;
> > }
> >
> > +int avformat_control_message(struct AVFormatContext *s, enum
> AVDeviceMessageType type,
> > + void *data, size_t data_size)
> > +{
> > + if (!s->oformat || !s->oformat->control_message)
> > + return AVERROR(ENOSYS);
> > + if (type >= AV_CTL_FIRST)
> > + return AVERROR(EINVAL);
> > + return s->oformat->control_message(s, type, data, data_size);
> > +}
> > +
> > int ff_write_chained(AVFormatContext *dst, int dst_stream, AVPacket
> *pkt,
> > AVFormatContext *src)
> > {
> > diff --git a/libavformat/utils.c b/libavformat/utils.c
> > index c530511..f552cee 100644
> > --- a/libavformat/utils.c
> > +++ b/libavformat/utils.c
> > @@ -103,6 +103,8 @@ MAKE_ACCESSORS(AVStream, stream, AVRational,
> r_frame_rate)
> > MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, video_codec)
> > MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, audio_codec)
> > MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, subtitle_codec)
> > +MAKE_ACCESSORS(AVFormatContext, format, void *, opaque)
> > +MAKE_ACCESSORS(AVFormatContext, format, av_format_control_message,
> control_message_cb)
> >
> > static AVCodec *find_decoder(AVFormatContext *s, AVStream *st, enum
> AVCodecID codec_id)
> > {
> > diff --git a/libavformat/version.h b/libavformat/version.h
> > index 40c56c9..84d1546 100644
> > --- a/libavformat/version.h
> > +++ b/libavformat/version.h
> > @@ -31,7 +31,7 @@
> >
>
> > #define LIBAVFORMAT_VERSION_MAJOR 55
> > #define LIBAVFORMAT_VERSION_MINOR 24
> > -#define LIBAVFORMAT_VERSION_MICRO 100
> > +#define LIBAVFORMAT_VERSION_MICRO 101
>
> Same as above: I believe it should be minor.
>
Updated patch attached
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-lavf-add-avformat_dev_control_message-API.patch
Type: text/x-patch
Size: 3723 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20140119/352bc12d/attachment.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0002-lavf-add-avformat_app_control_message-API.patch
Type: text/x-patch
Size: 5631 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20140119/352bc12d/attachment-0001.bin>
More information about the ffmpeg-devel
mailing list