diff mbox

[FFmpeg-devel,2/3] avformat/dashenc: opening a segment file when its first frame is ready

Message ID 1519019725-12472-1-git-send-email-vdixit@akamai.com
State Accepted
Commit ffe7cc89d0ce352fd9e67283d6a949eaa98f46a4
Headers show

Commit Message

Dixit, Vishwanath Feb. 19, 2018, 5:55 a.m. UTC
From: Vishwanath Dixit <vdixit@akamai.com>

---
 libavformat/dashenc.c | 57 ++++++++++++++++++++++++++++++++-------------------
 1 file changed, 36 insertions(+), 21 deletions(-)

Comments

Marton Balint Feb. 24, 2018, 3:19 p.m. UTC | #1
On Mon, 19 Feb 2018, vdixit@akamai.com wrote:

> From: Vishwanath Dixit <vdixit@akamai.com>
>
> ---
> libavformat/dashenc.c | 57 ++++++++++++++++++++++++++++++++-------------------
> 1 file changed, 36 insertions(+), 21 deletions(-)
>
> diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c
> index 0f6f4f2..0eb4b25 100644
> --- a/libavformat/dashenc.c
> +++ b/libavformat/dashenc.c
> @@ -81,6 +81,9 @@ typedef struct OutputStream {
>     char bandwidth_str[64];
>
>     char codec_str[100];
> +    char filename[1024];
> +    char full_path[1024];
> +    char temp_path[1024];
> } OutputStream;

I know it's late, but in the future please work toward supporting 
unlimited path lengths, that was the whole point of the deprecation of 
AVFormatContext->filename.

Thanks,
Marton
James Almer Feb. 24, 2018, 3:41 p.m. UTC | #2
On 2/24/2018 12:19 PM, Marton Balint wrote:
> 
> 
> On Mon, 19 Feb 2018, vdixit@akamai.com wrote:
> 
>> From: Vishwanath Dixit <vdixit@akamai.com>
>>
>> ---
>> libavformat/dashenc.c | 57
>> ++++++++++++++++++++++++++++++++-------------------
>> 1 file changed, 36 insertions(+), 21 deletions(-)
>>
>> diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c
>> index 0f6f4f2..0eb4b25 100644
>> --- a/libavformat/dashenc.c
>> +++ b/libavformat/dashenc.c
>> @@ -81,6 +81,9 @@ typedef struct OutputStream {
>>     char bandwidth_str[64];
>>
>>     char codec_str[100];
>> +    char filename[1024];
>> +    char full_path[1024];
>> +    char temp_path[1024];
>> } OutputStream;
> 
> I know it's late, but in the future please work toward supporting
> unlimited path lengths, that was the whole point of the deprecation of
> AVFormatContext->filename.
> 
> Thanks,
> Marton

It's not late, it can and should be changed. New code using deprecated
APIs that will require changes in the long run should have not been
added, so better change it now.
Jeyapal, Karthick Feb. 25, 2018, 4:22 a.m. UTC | #3
On 2/24/18 9:11 PM, James Almer wrote:
> On 2/24/2018 12:19 PM, Marton Balint wrote:

>>

>>

>> On Mon, 19 Feb 2018, vdixit@akamai.com wrote:

>>

>>> From: Vishwanath Dixit <vdixit@akamai.com>

>>>

>>> ---

>>> libavformat/dashenc.c | 57

>>> ++++++++++++++++++++++++++++++++-------------------

>>> 1 file changed, 36 insertions(+), 21 deletions(-)

>>>

>>> diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c

>>> index 0f6f4f2..0eb4b25 100644

>>> --- a/libavformat/dashenc.c

>>> +++ b/libavformat/dashenc.c

>>> @@ -81,6 +81,9 @@ typedef struct OutputStream {

>>>     char bandwidth_str[64];

>>>

>>>     char codec_str[100];

>>> +    char filename[1024];

>>> +    char full_path[1024];

>>> +    char temp_path[1024];

>>> } OutputStream;

>>

>> I know it's late, but in the future please work toward supporting

>> unlimited path lengths, that was the whole point of the deprecation of

>> AVFormatContext->filename.

Thanks for pointing it out. Sure, we will fix it. We had done these long back(atleast 6 months back), when filename was still in active use.
Only now we had the time to merge these changes with the latest ffmpeg.
>>

>> Thanks,

>> Marton

>

> It's not late, it can and should be changed. New code using deprecated

> APIs that will require changes in the long run should have not been

> added, so better change it now.

Just to clarify here, we are not using any deprecated API in that patch. We are still using the url parameter.
In fact, yesterday I sent out a different patch to fix deprecated API usage that was previously present. http://ffmpeg.org/pipermail/ffmpeg-devel/2018-February/225739.html 
The only issue was that the size of filename has been limited to 1024 internally. This needs to be replaced by a dynamic size buffer.  
But I agree with you that it is better to change now rather than later. 
> _______________________________________________

> ffmpeg-devel mailing list

> ffmpeg-devel@ffmpeg.org

> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
diff mbox

Patch

diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c
index 0f6f4f2..0eb4b25 100644
--- a/libavformat/dashenc.c
+++ b/libavformat/dashenc.c
@@ -81,6 +81,9 @@  typedef struct OutputStream {
     char bandwidth_str[64];
 
     char codec_str[100];
+    char filename[1024];
+    char full_path[1024];
+    char temp_path[1024];
 } OutputStream;
 
 typedef struct DASHContext {
@@ -1134,7 +1137,6 @@  static int dash_flush(AVFormatContext *s, int final, int stream)
     for (i = 0; i < s->nb_streams; i++) {
         OutputStream *os = &c->streams[i];
         AVStream *st = s->streams[i];
-        char filename[1024] = "", full_path[1024], temp_path[1024];
         int range_length, index_length = 0;
 
         if (!os->packets_written)
@@ -1152,24 +1154,11 @@  static int dash_flush(AVFormatContext *s, int final, int stream)
                 continue;
         }
 
-        if (!os->init_range_length) {
-            flush_init_segment(s, os);
-        }
-
         if (!c->single_file) {
-            AVDictionary *opts = NULL;
-            ff_dash_fill_tmpl_params(filename, sizeof(filename), c->media_seg_name, i, os->segment_index, os->bit_rate, os->start_pts);
-            snprintf(full_path, sizeof(full_path), "%s%s", c->dirname, filename);
-            snprintf(temp_path, sizeof(temp_path), use_rename ? "%s.tmp" : "%s", full_path);
-            set_http_options(&opts, c);
-            ret = dashenc_io_open(s, &os->out, temp_path, &opts);
-            if (ret < 0)
-                break;
-            av_dict_free(&opts);
             if (!strcmp(os->format_name, "mp4"))
                 write_styp(os->ctx->pb);
         } else {
-            snprintf(full_path, sizeof(full_path), "%s%s", c->dirname, os->initfile);
+            snprintf(os->full_path, sizeof(os->full_path), "%s%s", c->dirname, os->initfile);
         }
 
         ret = flush_dynbuf(os, &range_length);
@@ -1178,12 +1167,12 @@  static int dash_flush(AVFormatContext *s, int final, int stream)
         os->packets_written = 0;
 
         if (c->single_file) {
-            find_index_range(s, full_path, os->pos, &index_length);
+            find_index_range(s, os->full_path, os->pos, &index_length);
         } else {
-            dashenc_io_close(s, &os->out, temp_path);
+            dashenc_io_close(s, &os->out, os->temp_path);
 
             if (use_rename) {
-                ret = avpriv_io_move(temp_path, full_path);
+                ret = avpriv_io_move(os->temp_path, os->full_path);
                 if (ret < 0)
                     break;
             }
@@ -1200,8 +1189,8 @@  static int dash_flush(AVFormatContext *s, int final, int stream)
                      " bandwidth=\"%d\"", os->bit_rate);
             }
         }
-        add_segment(os, filename, os->start_pts, os->max_pts - os->start_pts, os->pos, range_length, index_length);
-        av_log(s, AV_LOG_VERBOSE, "Representation %d media segment %d written to: %s\n", i, os->segment_index, full_path);
+        add_segment(os, os->filename, os->start_pts, os->max_pts - os->start_pts, os->pos, range_length, index_length);
+        av_log(s, AV_LOG_VERBOSE, "Representation %d media segment %d written to: %s\n", i, os->segment_index, os->full_path);
 
         os->pos += range_length;
     }
@@ -1303,7 +1292,33 @@  static int dash_write_packet(AVFormatContext *s, AVPacket *pkt)
     else
         os->max_pts = FFMAX(os->max_pts, pkt->pts + pkt->duration);
     os->packets_written++;
-    return ff_write_chained(os->ctx, 0, pkt, s, 0);
+    if ((ret = ff_write_chained(os->ctx, 0, pkt, s, 0)) < 0)
+        return ret;
+
+    if (!os->init_range_length)
+        flush_init_segment(s, os);
+
+    //open the output context when the first frame of a segment is ready
+    if (!c->single_file && !os->out) {
+        AVDictionary *opts = NULL;
+        const char *proto = avio_find_protocol_name(s->filename);
+        int use_rename = proto && !strcmp(proto, "file");
+        os->filename[0] = os->full_path[0] = os->temp_path[0] = '\0';
+        ff_dash_fill_tmpl_params(os->filename, sizeof(os->filename),
+                                 c->media_seg_name, pkt->stream_index,
+                                 os->segment_index, os->bit_rate, os->start_pts);
+        snprintf(os->full_path, sizeof(os->full_path), "%s%s", c->dirname,
+                 os->filename);
+        snprintf(os->temp_path, sizeof(os->temp_path),
+                 use_rename ? "%s.tmp" : "%s", os->full_path);
+        set_http_options(&opts, c);
+        ret = dashenc_io_open(s, &os->out, os->temp_path, &opts);
+        if (ret < 0)
+            return ret;
+        av_dict_free(&opts);
+    }
+
+    return ret;
 }
 
 static int dash_write_trailer(AVFormatContext *s)