diff mbox

[FFmpeg-devel] libavformat/webm_chunk: Option to specify HTTP header

Message ID 1473974964-18953-1-git-send-email-vigneshv@google.com
State Accepted
Commit 7238c53048e494d4914e6f8692ca844086f3ae65
Headers show

Commit Message

Vignesh Venkatasubramanian Sept. 15, 2016, 9:29 p.m. UTC
Add an option to specify HTTP header in the WebM Chunk Muxer (this
works the same way as the 'method' parameter in the HLS muxer).

Signed-off-by: Vignesh Venkatasubramanian <vigneshv@google.com>
---
 libavformat/webm_chunk.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

Comments

Michael Niedermayer Sept. 16, 2016, 1:16 a.m. UTC | #1
On Thu, Sep 15, 2016 at 02:29:24PM -0700, Vignesh Venkatasubramanian wrote:
> Add an option to specify HTTP header in the WebM Chunk Muxer (this
> works the same way as the 'method' parameter in the HLS muxer).
> 
> Signed-off-by: Vignesh Venkatasubramanian <vigneshv@google.com>
> ---
>  libavformat/webm_chunk.c | 14 ++++++++++++--
>  1 file changed, 12 insertions(+), 2 deletions(-)

applied

do you think this could be extended to support all http options ?
possibly through AVClass.child_next ?
(thugh this would be the first muxer to do this i think  ...)

thanks

[...]
diff mbox

Patch

diff --git a/libavformat/webm_chunk.c b/libavformat/webm_chunk.c
index bfcde78..f8dbaa3 100644
--- a/libavformat/webm_chunk.c
+++ b/libavformat/webm_chunk.c
@@ -50,6 +50,7 @@  typedef struct WebMChunkContext {
     char *header_filename;
     int chunk_duration;
     int chunk_index;
+    char *http_method;
     uint64_t duration_written;
     int prev_pts;
     AVOutputFormat *oformat;
@@ -112,6 +113,7 @@  static int webm_chunk_write_header(AVFormatContext *s)
     AVFormatContext *oc = NULL;
     int ret;
     int i;
+    AVDictionary *options = NULL;
 
     // DASH Streams can only have either one track per file.
     if (s->nb_streams != 1) { return AVERROR_INVALIDDATA; }
@@ -128,7 +130,10 @@  static int webm_chunk_write_header(AVFormatContext *s)
     ret = get_chunk_filename(s, 1, oc->filename);
     if (ret < 0)
         return ret;
-    ret = s->io_open(s, &oc->pb, oc->filename, AVIO_FLAG_WRITE, NULL);
+    if (wc->http_method)
+        av_dict_set(&options, "method", wc->http_method, 0);
+    ret = s->io_open(s, &oc->pb, oc->filename, AVIO_FLAG_WRITE, &options);
+    av_dict_free(&options);
     if (ret < 0)
         return ret;
 
@@ -166,6 +171,7 @@  static int chunk_end(AVFormatContext *s)
     uint8_t *buffer;
     AVIOContext *pb;
     char filename[MAX_FILENAME_SIZE];
+    AVDictionary *options = NULL;
 
     if (wc->chunk_start_index == wc->chunk_index)
         return 0;
@@ -175,13 +181,16 @@  static int chunk_end(AVFormatContext *s)
     ret = get_chunk_filename(s, 0, filename);
     if (ret < 0)
         goto fail;
-    ret = s->io_open(s, &pb, filename, AVIO_FLAG_WRITE, NULL);
+    if (wc->http_method)
+        av_dict_set(&options, "method", wc->http_method, 0);
+    ret = s->io_open(s, &pb, filename, AVIO_FLAG_WRITE, &options);
     if (ret < 0)
         goto fail;
     avio_write(pb, buffer, buffer_size);
     ff_format_io_close(s, &pb);
     oc->pb = NULL;
 fail:
+    av_dict_free(&options);
     av_free(buffer);
     return (ret < 0) ? ret : 0;
 }
@@ -243,6 +252,7 @@  static const AVOption options[] = {
     { "chunk_start_index",  "start index of the chunk", OFFSET(chunk_start_index), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
     { "header", "filename of the header where the initialization data will be written", OFFSET(header_filename), AV_OPT_TYPE_STRING, { 0 }, 0, 0, AV_OPT_FLAG_ENCODING_PARAM },
     { "audio_chunk_duration", "duration of each chunk in milliseconds", OFFSET(chunk_duration), AV_OPT_TYPE_INT, {.i64 = 5000}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
+    { "method", "set the HTTP method", OFFSET(http_method), AV_OPT_TYPE_STRING, {.str = NULL},  0, 0, AV_OPT_FLAG_ENCODING_PARAM },
     { NULL },
 };