diff --git a/libavdevice/avdevice.c b/libavdevice/avdevice.c index b9b18f2576..c232bbdc8f 100644 --- a/libavdevice/avdevice.c +++ b/libavdevice/avdevice.c @@ -36,3 +36,11 @@ const char * avdevice_license(void) #define LICENSE_PREFIX "libavdevice license: " return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1; } + +int avdevice_app_to_dev_control_message(struct AVFormatContext *s, enum AVAppToDevMessageType type, + void *data, size_t data_size) +{ + if (!s->oformat || !s->oformat->control_message) + return AVERROR(ENOSYS); + return s->oformat->control_message(s, type, data, data_size); +} diff --git a/libavdevice/avdevice.h b/libavdevice/avdevice.h index 93a044f270..1bc91e4d0f 100644 --- a/libavdevice/avdevice.h +++ b/libavdevice/avdevice.h @@ -66,4 +66,56 @@ const char *avdevice_license(void); */ void avdevice_register_all(void); +typedef struct AVDeviceRect { + int x; /**< x coordinate of top left corner */ + int y; /**< y coordinate of top left corner */ + int width; /**< width */ + int height; /**< height */ +} AVDeviceRect; + +/** + * Message types used by avdevice_app_to_dev_control_message(). + */ +enum AVAppToDevMessageType { + /** + * Dummy message. + */ + AV_APP_TO_DEV_NONE = MKBETAG('N','O','N','E'), + + /** + * Window size change message. + * + * Message is sent to the device every time the application changes the size + * of the window device renders to. + * Message should also be sent right after window is created. + * + * data: AVDeviceRect: new window size. + */ + AV_APP_TO_DEV_WINDOW_SIZE = MKBETAG('G','E','O','M'), + + /** + * Repaint request message. + * + * Message is sent to the device when window have to be rapainted. + * + * data: AVDeviceRect: area required to be repainted. + * NULL: whole area is required to be repainted. + */ + AV_APP_TO_DEV_WINDOW_REPAINT = MKBETAG('R','E','P','A') +}; + +/** + * Send control message from application to device. + * + * @param s device context. + * @param type message type. + * @param data message data. Exact type depends on message type. + * @param data_size size of message data. + * @return >= 0 on success, negative on error. + * AVERROR(ENOSYS) when device doesn't implement handler of the message. + */ +int avdevice_app_to_dev_control_message(struct AVFormatContext *s, + enum AVAppToDevMessageType type, + void *data, size_t data_size); + #endif /* AVDEVICE_AVDEVICE_H */ diff --git a/libavdevice/version.h b/libavdevice/version.h index d569faefc5..bfd4a7089d 100644 --- a/libavdevice/version.h +++ b/libavdevice/version.h @@ -28,8 +28,8 @@ #include "libavutil/version.h" #define LIBAVDEVICE_VERSION_MAJOR 55 -#define LIBAVDEVICE_VERSION_MINOR 5 -#define LIBAVDEVICE_VERSION_MICRO 102 +#define LIBAVDEVICE_VERSION_MINOR 6 +#define LIBAVDEVICE_VERSION_MICRO 100 #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ LIBAVDEVICE_VERSION_MINOR, \ diff --git a/libavformat/avformat.h b/libavformat/avformat.h index a495ee0b79..09eea74ad9 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -453,6 +453,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, int type, + void *data, size_t data_size); } AVOutputFormat; /** * @} diff --git a/libavformat/version.h b/libavformat/version.h index a0e5a7cee9..51f6d598d9 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -30,7 +30,7 @@ #include "libavutil/version.h" #define LIBAVFORMAT_VERSION_MAJOR 55 -#define LIBAVFORMAT_VERSION_MINOR 26 +#define LIBAVFORMAT_VERSION_MINOR 27 #define LIBAVFORMAT_VERSION_MICRO 100 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \