---
libavformat/avformat.h | 25 +++++++++++++++++++++++++
libavformat/output.c | 43 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 68 insertions(+)
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index 134a38b..ad383b3 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -407,7 +407,22 @@ typedef struct AVOutputFormat {
*/
int priv_data_size;
+ /**
+ * Initialize the muxer context and write the header.
+ * @deprecated implement the split functions below.
+ */
int (*write_header)(struct AVFormatContext *);
+
+ /**
+ * Initialize the muxer context.
+ */
+ int (*init)(struct AVFormatContext *);
+
+ /**
+ * Write the header, requires an initialized context.
+ */
+ int (*write_header2)(struct AVFormatContext *);
+
/**
* Write a packet. If AVFMT_ALLOW_FLUSH is set in flags,
* pkt can be NULL in order to flush data buffered in the muxer.
@@ -416,7 +431,13 @@ typedef struct AVOutputFormat {
* data.
*/
int (*write_packet)(struct AVFormatContext *, AVPacket *pkt);
+
int (*write_trailer)(struct AVFormatContext *);
+
+ int (*write_trailer2)(struct AVFormatContext *);
+
+ int (*deinit)(struct AVFormatContext *);
+
/**
* Currently only used to set pixel format if not YUV420P.
*/
@@ -1426,6 +1447,10 @@ void avformat_close_input(AVFormatContext **s);
*/
int avformat_write_header(AVFormatContext *s, AVDictionary **options);
+int avformat_mux_init(AVFormatContext *s, AVDictionary **options);
+
+int avformat_mux_header(AVFormatContext *s);
+
/**
* Write a packet to an output media file.
*
diff --git a/libavformat/output.c b/libavformat/output.c
index aa8d228..5f42321 100644
--- a/libavformat/output.c
+++ b/libavformat/output.c
@@ -303,6 +303,17 @@ int avformat_write_header(AVFormatContext *s, AVDictionary
**options)
ret = s->oformat->write_header(s);
if (ret < 0)
return ret;
+ } else {
+ if (s->oformat->init) {
+ ret = s->oformat->init(s);
+ if (ret < 0)
+ return ret;
+ }
+ if (s->oformat->write_header2) {
+ ret = s->oformat->write_header2(s);
+ if (ret < 0)
+ return ret;
+ }
}
if ((ret = init_pts(s) < 0))
@@ -311,6 +322,38 @@ int avformat_write_header(AVFormatContext *s, AVDictionary
**options)
return 0;
}
+int avformat_mux_init(AVFormatContext *s, AVDictionary **options)
+{
+ int ret = 0;
+
+ if (ret = write_setup(s, options))
+ return ret;
+
+ if (s->oformat->init) {
+ ret = s->oformat->init(s);
+ if (ret < 0)
+ return ret;
+ }
+
+ if ((ret = init_pts(s) < 0))
+ return ret;
+
+ return 0;
+}
+
+int avformat_mux_header(AVFormatContext *s)
+{
+ int ret = 0;
+
+ if (s->oformat->write_header2) {
+ ret = s->oformat->write_header2(s);
+ if (ret < 0)
+ return ret;
+ }
+
+ return 0;
+}
+
//FIXME merge with compute_pkt_fields
static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt)
{
--
1.7.12
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel