diff mbox

[FFmpeg-devel,1/2] avformat/matroskaenc: postpone writing the Tracks master

Message ID 20161102195857.1664-1-jamrial@gmail.com
State Accepted
Headers show

Commit Message

James Almer Nov. 2, 2016, 7:58 p.m. UTC
This will allow us to write updated stream information not available
during write_header().

Signed-off-by: James Almer <jamrial@gmail.com>
---
 libavformat/matroskaenc.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

Comments

James Almer Nov. 17, 2016, 6:52 p.m. UTC | #1
On 11/2/2016 4:58 PM, James Almer wrote:
> This will allow us to write updated stream information not available
> during write_header().
> 
> Signed-off-by: James Almer <jamrial@gmail.com>
> ---
>  libavformat/matroskaenc.c | 20 +++++++++++++++-----
>  1 file changed, 15 insertions(+), 5 deletions(-)
> 

Ping for patchset. Will be pushing it soon otherwise.
James Almer Nov. 20, 2016, 10:32 p.m. UTC | #2
On 11/17/2016 3:52 PM, James Almer wrote:
> On 11/2/2016 4:58 PM, James Almer wrote:
>> This will allow us to write updated stream information not available
>> during write_header().
>>
>> Signed-off-by: James Almer <jamrial@gmail.com>
>> ---
>>  libavformat/matroskaenc.c | 20 +++++++++++++++-----
>>  1 file changed, 15 insertions(+), 5 deletions(-)
>>
> 
> Ping for patchset. Will be pushing it soon otherwise.

Pushed.
Muhammad Faiz Dec. 26, 2016, 4:55 a.m. UTC | #3
On 11/21/16, James Almer <jamrial@gmail.com> wrote:
> On 11/17/2016 3:52 PM, James Almer wrote:
>> On 11/2/2016 4:58 PM, James Almer wrote:
>>> This will allow us to write updated stream information not available
>>> during write_header().
>>>
>>> Signed-off-by: James Almer <jamrial@gmail.com>
>>> ---
>>>  libavformat/matroskaenc.c | 20 +++++++++++++++-----
>>>  1 file changed, 15 insertions(+), 5 deletions(-)
>>>
>>
>> Ping for patchset. Will be pushing it soon otherwise.
>
> Pushed.

This made regression, ticket #5977.

Thank's
diff mbox

Patch

diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index 78540fb..f41aabe 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -121,6 +121,8 @@  typedef struct MatroskaMuxContext {
     ebml_master     tags;
     AVIOContext     *info_bc;
     ebml_master     info;
+    AVIOContext     *tracks_bc;
+    ebml_master     tracks_master;
     ebml_master     segment;
     int64_t         segment_offset;
     ebml_master     cluster;
@@ -1264,15 +1266,14 @@  static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv,
 static int mkv_write_tracks(AVFormatContext *s)
 {
     MatroskaMuxContext *mkv = s->priv_data;
-    AVIOContext *dyn_cp, *pb = s->pb;
-    ebml_master tracks;
+    AVIOContext *pb = s->pb;
     int i, ret, default_stream_exists = 0;
 
     ret = mkv_add_seekhead_entry(mkv->main_seekhead, MATROSKA_ID_TRACKS, avio_tell(pb));
     if (ret < 0)
         return ret;
 
-    ret = start_ebml_master_crc32(pb, &dyn_cp, mkv, &tracks, MATROSKA_ID_TRACKS, 0);
+    ret = start_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, &mkv->tracks_master, MATROSKA_ID_TRACKS, 0);
     if (ret < 0)
         return ret;
 
@@ -1281,11 +1282,16 @@  static int mkv_write_tracks(AVFormatContext *s)
         default_stream_exists |= st->disposition & AV_DISPOSITION_DEFAULT;
     }
     for (i = 0; i < s->nb_streams; i++) {
-        ret = mkv_write_track(s, mkv, i, dyn_cp, default_stream_exists);
+        ret = mkv_write_track(s, mkv, i, mkv->tracks_bc, default_stream_exists);
         if (ret < 0)
             return ret;
     }
-    end_ebml_master_crc32(pb, &dyn_cp, mkv, tracks);
+
+    if (pb->seekable && !mkv->is_live)
+        put_ebml_void(pb, avio_tell(mkv->tracks_bc));
+    else
+        end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, mkv->tracks_master);
+
     return 0;
 }
 
@@ -2317,6 +2323,10 @@  static int mkv_write_trailer(AVFormatContext *s)
         avio_seek(pb, mkv->info.pos, SEEK_SET);
         end_ebml_master_crc32(pb, &mkv->info_bc, mkv, mkv->info);
 
+        // dump tracks master
+        avio_seek(pb, mkv->tracks_master.pos, SEEK_SET);
+        end_ebml_master_crc32(pb, &mkv->tracks_bc, mkv, mkv->tracks_master);
+
         // update stream durations
         if (!mkv->is_live && mkv->stream_durations) {
             int i;